split BKE_utildefines.h, now it only has blender specific defines like GS() MAKE_ID...
[blender.git] / source / blender / makesrna / intern / rna_armature.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Contributor(s): Blender Foundation (2008), Joshua Leung
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26
27 #include "BLI_math.h"
28
29 #include "RNA_define.h"
30
31 #include "rna_internal.h"
32
33 #include "DNA_armature_types.h"
34 #include "DNA_object_types.h"
35 #include "DNA_scene_types.h"
36
37 #include "WM_api.h"
38 #include "WM_types.h"
39
40 #ifdef RNA_RUNTIME
41
42 #include "BLI_utildefines.h"
43
44 #include "BKE_context.h"
45 #include "BKE_depsgraph.h"
46 #include "BKE_idprop.h"
47 #include "BKE_main.h"
48
49 #include "ED_armature.h"
50 #include "BKE_armature.h"
51
52 static void rna_Armature_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
53 {
54         ID *id= ptr->id.data;
55
56         DAG_id_tag_update(id, 0);
57         WM_main_add_notifier(NC_GEOM|ND_DATA, id);
58         //WM_main_add_notifier(NC_OBJECT|ND_POSE, NULL);
59 }
60
61
62 static void rna_Armature_act_bone_set(PointerRNA *ptr, PointerRNA value)
63 {
64         bArmature *arm= (bArmature*)ptr->data;
65
66         if(value.id.data==NULL && value.data==NULL) {
67                 arm->act_bone= NULL;
68         }
69         else {
70                 if(value.id.data != arm) {
71                         /* raise an error! */
72                 }
73                 else {
74                         arm->act_bone= value.data;
75                         arm->act_bone->flag |= BONE_SELECTED;
76                 }
77         }
78 }
79
80 static void rna_Armature_act_edit_bone_set(PointerRNA *ptr, PointerRNA value)
81 {
82         bArmature *arm= (bArmature*)ptr->data;
83
84         if(value.id.data==NULL && value.data==NULL) {
85                 arm->act_edbone= NULL;
86         }
87         else {
88                 if(value.id.data != arm) {
89                         /* raise an error! */
90                 }
91                 else {
92                         arm->act_edbone= value.data;
93                         ((EditBone *)arm->act_edbone)->flag |= BONE_SELECTED;
94                 }
95         }
96 }
97
98 EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, const char *name)
99 {
100         if(arm->edbo==NULL) {
101                 BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant add an editbone.", arm->id.name+2);
102                 return NULL;
103         }
104         return ED_armature_edit_bone_add(arm, name);
105 }
106
107 void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone *ebone)
108 {
109         if(arm->edbo==NULL) {
110                 BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant remove an editbone.", arm->id.name+2);
111                 return;
112         }
113
114         if(BLI_findindex(arm->edbo, ebone) == -1) {
115                 BKE_reportf(reports, RPT_ERROR, "Armature '%s' doesn't contain bone '%s'.", arm->id.name+2, ebone->name);
116                 return;
117         }
118
119         ED_armature_edit_bone_remove(arm, ebone);
120 }
121
122 static void rna_Armature_update_layers(Main *bmain, Scene *scene, PointerRNA *ptr)
123 {
124         bArmature *arm= ptr->id.data;
125         Object *ob;
126
127         /* proxy lib exception, store it here so we can restore layers on file
128            load, since it would otherwise get lost due to being linked data */
129         for(ob = bmain->object.first; ob; ob=ob->id.next)
130                 if(ob->data == arm && ob->pose)
131                         ob->pose->proxy_layer = arm->layer;
132
133         WM_main_add_notifier(NC_GEOM|ND_DATA, arm);
134 }
135
136 static void rna_Armature_redraw_data(Main *bmain, Scene *scene, PointerRNA *ptr)
137 {
138         ID *id= ptr->id.data;
139
140         WM_main_add_notifier(NC_GEOM|ND_DATA, id);
141 }
142
143 static char *rna_Bone_path(PointerRNA *ptr)
144 {
145         return BLI_sprintfN("bones[\"%s\"]", ((Bone*)ptr->data)->name);
146 }
147
148 static IDProperty *rna_Bone_idprops(PointerRNA *ptr, int create)
149 {
150         Bone *bone= ptr->data;
151
152         if(create && !bone->prop) {
153                 IDPropertyTemplate val = {0};
154                 bone->prop= IDP_New(IDP_GROUP, val, "RNA_Bone ID properties");
155         }
156
157         return bone->prop;
158 }
159
160 static IDProperty *rna_EditBone_idprops(PointerRNA *ptr, int create)
161 {
162         EditBone *ebone= ptr->data;
163
164         if(create && !ebone->prop) {
165                 IDPropertyTemplate val = {0};
166                 ebone->prop= IDP_New(IDP_GROUP, val, "RNA_EditBone ID properties");
167         }
168
169         return ebone->prop;
170 }
171
172 static void rna_bone_layer_set(int *layer, const int *values)
173 {
174         int i, tot= 0;
175
176         /* ensure we always have some layer selected */
177         for(i=0; i<32; i++)
178                 if(values[i])
179                         tot++;
180         
181         if(tot==0)
182                 return;
183
184         for(i=0; i<32; i++) {
185                 if(values[i]) *layer |= (1<<i);
186                 else *layer &= ~(1<<i);
187         }
188 }
189
190 static void rna_Bone_layer_set(PointerRNA *ptr, const int *values)
191 {
192         Bone *bone= (Bone*)ptr->data;
193         rna_bone_layer_set(&bone->layer, values);
194 }
195
196 static void rna_Armature_layer_set(PointerRNA *ptr, const int *values)
197 {
198         bArmature *arm= (bArmature*)ptr->data;
199         int i, tot= 0;
200
201         /* ensure we always have some layer selected */
202         for(i=0; i<32; i++)
203                 if(values[i])
204                         tot++;
205         
206         if(tot==0)
207                 return;
208
209         for(i=0; i<32; i++) {
210                 if(values[i]) arm->layer |= (1<<i);
211                 else arm->layer &= ~(1<<i);
212         }
213 }
214
215 // XXX depreceated.... old armature only animviz
216 static void rna_Armature_ghost_start_frame_set(PointerRNA *ptr, int value)
217 {
218         bArmature *data= (bArmature*)ptr->data;
219         CLAMP(value, 1, data->ghostef);
220         data->ghostsf= value;
221 }
222
223 static void rna_Armature_ghost_end_frame_set(PointerRNA *ptr, int value)
224 {
225         bArmature *data= (bArmature*)ptr->data;
226         CLAMP(value, data->ghostsf, (int)(MAXFRAMEF/2));
227         data->ghostef= value;
228 }
229 // XXX depreceated... old armature only animviz
230
231 static void rna_EditBone_name_set(PointerRNA *ptr, const char *value)
232 {
233         bArmature *arm= (bArmature*)ptr->id.data;
234         EditBone *ebone= (EditBone*)ptr->data;
235         char oldname[sizeof(ebone->name)], newname[sizeof(ebone->name)];
236         
237         /* need to be on the stack */
238         BLI_strncpy(newname, value, sizeof(ebone->name));
239         BLI_strncpy(oldname, ebone->name, sizeof(ebone->name));
240         
241         ED_armature_bone_rename(arm, oldname, newname);
242 }
243
244 static void rna_Bone_name_set(PointerRNA *ptr, const char *value)
245 {
246         bArmature *arm= (bArmature*)ptr->id.data;
247         Bone *bone= (Bone*)ptr->data;
248         char oldname[sizeof(bone->name)], newname[sizeof(bone->name)];
249         
250         /* need to be on the stack */
251         BLI_strncpy(newname, value, sizeof(bone->name));
252         BLI_strncpy(oldname, bone->name, sizeof(bone->name));
253
254         ED_armature_bone_rename(arm, oldname, newname);
255 }
256
257 static void rna_EditBone_layer_set(PointerRNA *ptr, const int values[])
258 {
259         EditBone *data= (EditBone*)(ptr->data);
260         rna_bone_layer_set(&data->layer, values);
261 }
262
263 static void rna_EditBone_connected_check(EditBone *ebone)
264 {
265         if(ebone->parent) {
266                 if(ebone->flag & BONE_CONNECTED) {
267                         /* Attach this bone to its parent */
268                         VECCOPY(ebone->head, ebone->parent->tail);
269
270                         if(ebone->flag & BONE_ROOTSEL)
271                                 ebone->parent->flag |= BONE_TIPSEL;
272                 }
273                 else if(!(ebone->parent->flag & BONE_ROOTSEL)) {
274                         ebone->parent->flag &= ~BONE_TIPSEL;
275                 }
276         }
277 }
278
279 static void rna_EditBone_connected_set(PointerRNA *ptr, int value)
280 {
281         EditBone *ebone= (EditBone*)(ptr->data);
282
283         if(value) ebone->flag |= BONE_CONNECTED;
284         else ebone->flag &= ~BONE_CONNECTED;
285
286         rna_EditBone_connected_check(ebone);
287 }
288
289 static PointerRNA rna_EditBone_parent_get(PointerRNA *ptr)
290 {
291         EditBone *data= (EditBone*)(ptr->data);
292         return rna_pointer_inherit_refine(ptr, &RNA_EditBone, data->parent);
293 }
294
295 static void rna_EditBone_parent_set(PointerRNA *ptr, PointerRNA value)
296 {
297         EditBone *ebone= (EditBone*)(ptr->data);
298         EditBone *pbone, *parbone= (EditBone*)value.data;
299
300         if(parbone == NULL) {
301                 if(ebone->parent && !(ebone->parent->flag & BONE_ROOTSEL))
302                         ebone->parent->flag &= ~BONE_TIPSEL;
303
304                 ebone->parent = NULL;
305                 ebone->flag &= ~BONE_CONNECTED;
306         }
307         else {
308                 /* within same armature */
309                 if(value.id.data != ptr->id.data)
310                         return;
311
312                 /* make sure this is a valid child */
313                 if(parbone == ebone)
314                         return;
315                         
316                 for(pbone= parbone->parent; pbone; pbone=pbone->parent)
317                         if(pbone == ebone)
318                                 return;
319
320                 ebone->parent = parbone;
321                 rna_EditBone_connected_check(ebone);
322         }
323 }
324
325 static void rna_EditBone_matrix_get(PointerRNA *ptr, float *values)
326 {
327         EditBone *ebone= (EditBone*)(ptr->data);
328
329         float   delta[3], tmat[3][3], mat[4][4];
330
331         /* Find the current bone matrix */
332         sub_v3_v3v3(delta, ebone->tail, ebone->head);
333         vec_roll_to_mat3(delta, ebone->roll, tmat);
334         copy_m4_m3(mat, tmat);
335         VECCOPY(mat[3], ebone->head);
336
337         memcpy(values, mat, 16 * sizeof(float));
338 }
339
340 static void rna_Armature_editbone_transform_update(Main *bmain, Scene *scene, PointerRNA *ptr)
341 {
342         bArmature *arm= (bArmature*)ptr->id.data;
343         EditBone *ebone= (EditBone*)ptr->data;
344         EditBone *child, *eboflip;
345         
346         /* update our parent */
347         if(ebone->parent && ebone->flag & BONE_CONNECTED)
348                 VECCOPY(ebone->parent->tail, ebone->head)
349
350         /* update our children if necessary */
351         for(child = arm->edbo->first; child; child=child->next)
352                 if(child->parent == ebone && (child->flag & BONE_CONNECTED))
353                         VECCOPY(child->head, ebone->tail);
354
355         if(arm->flag & ARM_MIRROR_EDIT) {
356                 eboflip= ED_armature_bone_get_mirrored(arm->edbo, ebone);
357
358                 if(eboflip) {
359                         eboflip->roll= -ebone->roll;
360
361                         eboflip->head[0]= -ebone->head[0];
362                         eboflip->tail[0]= -ebone->tail[0];
363                         
364                         /* update our parent */
365                         if(eboflip->parent && eboflip->flag & BONE_CONNECTED)
366                                 VECCOPY(eboflip->parent->tail, eboflip->head);
367                         
368                         /* update our children if necessary */
369                         for(child = arm->edbo->first; child; child=child->next)
370                                 if(child->parent == eboflip && (child->flag & BONE_CONNECTED))
371                                         VECCOPY (child->head, eboflip->tail);
372                 }
373         }
374
375         rna_Armature_update_data(bmain, scene, ptr);
376 }
377
378 static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
379 {
380         ListBaseIterator *internal= iter->internal;
381         Bone *bone= (Bone*)internal->link;
382
383         if(bone->childbase.first)
384                 internal->link= (Link*)bone->childbase.first;
385         else if(bone->next)
386                 internal->link= (Link*)bone->next;
387         else {
388                 internal->link= NULL;
389
390                 do {
391                         bone= bone->parent;
392                         if(bone && bone->next) {
393                                 internal->link= (Link*)bone->next;
394                                 break;
395                         }
396                 } while(bone);
397         }
398
399         iter->valid= (internal->link != NULL);
400 }
401
402 #else
403
404 static int rna_matrix_dimsize_4x4[]= {4, 4};
405 static int rna_matrix_dimsize_3x3[]= {3, 3};
406
407 static void rna_def_bone_common(StructRNA *srna, int editbone)
408 {
409         PropertyRNA *prop;
410
411         /* strings */
412         prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
413         RNA_def_property_string_sdna(prop, NULL, "name");
414         RNA_def_property_ui_text(prop, "Name", "");
415         RNA_def_struct_name_property(srna, prop);
416         if(editbone) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_EditBone_name_set");
417         else RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Bone_name_set");
418         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
419
420         /* flags */
421         prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
422         RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
423         RNA_def_property_array(prop, 32);
424         if(editbone) RNA_def_property_boolean_funcs(prop, NULL, "rna_EditBone_layer_set");
425         else RNA_def_property_boolean_funcs(prop, NULL, "rna_Bone_layer_set");
426         RNA_def_property_ui_text(prop, "Layers", "Layers bone exists in");
427         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
428
429         prop= RNA_def_property(srna, "use_connect", PROP_BOOLEAN, PROP_NONE);
430         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_CONNECTED);
431         if(editbone) RNA_def_property_boolean_funcs(prop, NULL, "rna_EditBone_connected_set");
432         else RNA_def_property_clear_flag(prop, PROP_EDITABLE);
433         RNA_def_property_ui_text(prop, "Connected", "When bone has a parent, bone's head is struck to the parent's tail");
434         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
435         
436         prop= RNA_def_property(srna, "use_inherit_rotation", PROP_BOOLEAN, PROP_NONE);
437         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
438         RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone inherits rotation or scale from parent bone");
439         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
440         
441         prop= RNA_def_property(srna, "use_envelope_multiply", PROP_BOOLEAN, PROP_NONE);
442         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_MULT_VG_ENV);
443         RNA_def_property_ui_text(prop, "Multiply Vertex Group with Envelope", "When deforming bone, multiply effects of Vertex Group weights with Envelope influence");
444         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
445         
446         prop= RNA_def_property(srna, "use_deform", PROP_BOOLEAN, PROP_NONE);
447         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_DEFORM);
448         RNA_def_property_ui_text(prop, "Deform", "Bone does not deform any geometry");
449         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
450         
451         prop= RNA_def_property(srna, "use_inherit_scale", PROP_BOOLEAN, PROP_NONE);
452         RNA_def_property_ui_text(prop, "Inherit Scale", "Bone inherits scaling from parent bone");
453         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_SCALE);
454         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
455
456         prop= RNA_def_property(srna, "use_local_location", PROP_BOOLEAN, PROP_NONE);
457         RNA_def_property_ui_text(prop, "Local Location", "Bone location is set in local space");
458         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_LOCAL_LOCATION);
459         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
460         
461         prop= RNA_def_property(srna, "show_wire", PROP_BOOLEAN, PROP_NONE);
462         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_DRAWWIRE);
463         RNA_def_property_ui_text(prop, "Draw Wire", "Bone is always drawn as Wireframe regardless of viewport draw mode. Useful for non-obstructive custom bone shapes");
464         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
465         
466         prop= RNA_def_property(srna, "use_cyclic_offset", PROP_BOOLEAN, PROP_NONE);
467         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_CYCLICOFFSET);
468         RNA_def_property_ui_text(prop, "Cyclic Offset", "When bone doesn't have a parent, it receives cyclic offset effects");
469         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
470         
471         prop= RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
472         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_UNSELECTABLE);
473         RNA_def_property_ui_text(prop, "Selectable", "Bone is able to be selected");
474         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
475
476         /* Number values */
477                 /* envelope deform settings */
478         prop= RNA_def_property(srna, "envelope_distance", PROP_FLOAT, PROP_NONE);
479         RNA_def_property_float_sdna(prop, NULL, "dist");
480         RNA_def_property_range(prop, 0.0f, 1000.0f);
481         RNA_def_property_ui_text(prop, "Envelope Deform Distance", "Bone deformation distance (for Envelope deform only)");
482         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
483         
484         prop= RNA_def_property(srna, "envelope_weight", PROP_FLOAT, PROP_NONE);
485         RNA_def_property_float_sdna(prop, NULL, "weight");
486         RNA_def_property_range(prop, 0.0f, 1000.0f);
487         RNA_def_property_ui_text(prop, "Envelope Deform Weight", "Bone deformation weight (for Envelope deform only)");
488         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
489         
490         prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_UNSIGNED);
491         if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
492         RNA_def_property_float_sdna(prop, NULL, "rad_head");
493         //RNA_def_property_range(prop, 0, 1000);  // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
494         RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
495         RNA_def_property_ui_text(prop, "Envelope Head Radius", "Radius of head of bone (for Envelope deform only)");
496         
497         prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_UNSIGNED);
498         if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
499         RNA_def_property_float_sdna(prop, NULL, "rad_tail");
500         //RNA_def_property_range(prop, 0, 1000);  // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
501         RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
502         RNA_def_property_ui_text(prop, "Envelope Tail Radius", "Radius of tail of bone (for Envelope deform only)");
503         
504                 /* b-bones deform settings */
505         prop= RNA_def_property(srna, "bbone_segments", PROP_INT, PROP_NONE);
506         RNA_def_property_int_sdna(prop, NULL, "segments");
507         RNA_def_property_range(prop, 1, 32);
508         RNA_def_property_ui_text(prop, "B-Bone Segments", "Number of subdivisions of bone (for B-Bones only)");
509         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
510         
511         prop= RNA_def_property(srna, "bbone_in", PROP_FLOAT, PROP_NONE);
512         RNA_def_property_float_sdna(prop, NULL, "ease1");
513         RNA_def_property_range(prop, 0.0f, 2.0f);
514         RNA_def_property_ui_text(prop, "B-Bone Ease In", "Length of first Bezier Handle (for B-Bones only)");
515         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
516         
517         prop= RNA_def_property(srna, "bbone_out", PROP_FLOAT, PROP_NONE);
518         RNA_def_property_float_sdna(prop, NULL, "ease2");
519         RNA_def_property_range(prop, 0.0f, 2.0f);
520         RNA_def_property_ui_text(prop, "B-Bone Ease Out", "Length of second Bezier Handle (for B-Bones only)");
521         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
522 }
523
524 // err... bones should not be directly edited (only editbones should be...)
525 static void rna_def_bone(BlenderRNA *brna)
526 {
527         StructRNA *srna;
528         PropertyRNA *prop;
529         
530         srna= RNA_def_struct(brna, "Bone", NULL);
531         RNA_def_struct_ui_text(srna, "Bone", "Bone in an Armature datablock");
532         RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
533         RNA_def_struct_path_func(srna, "rna_Bone_path");
534         RNA_def_struct_idprops_func(srna, "rna_Bone_idprops");
535         
536         /* pointers/collections */
537                 /* parent (pointer) */
538         prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
539         RNA_def_property_struct_type(prop, "Bone");
540         RNA_def_property_pointer_sdna(prop, NULL, "parent");
541         RNA_def_property_ui_text(prop, "Parent", "Parent bone (in same Armature)");
542         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
543         
544                 /* children (collection) */
545         prop= RNA_def_property(srna, "children", PROP_COLLECTION, PROP_NONE);
546         RNA_def_property_collection_sdna(prop, NULL, "childbase", NULL);
547         RNA_def_property_struct_type(prop, "Bone");
548         RNA_def_property_ui_text(prop, "Children", "Bones which are children of this bone");
549
550         rna_def_bone_common(srna, 0);
551
552                 // XXX should we define this in PoseChannel wrapping code instead? but PoseChannels directly get some of their flags from here...
553         prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
554         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_P);
555         RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes)");
556         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
557
558         prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
559         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
560         RNA_def_property_ui_text(prop, "Select", "");
561         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
562         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
563         
564         prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
565         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
566         RNA_def_property_ui_text(prop, "Select Head", "");
567         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
568         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
569         
570         prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
571         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
572         RNA_def_property_ui_text(prop, "Select Tail", "");
573         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
574         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
575
576         /* XXX better matrix descriptions possible (Arystan) */
577         prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
578         RNA_def_property_float_sdna(prop, NULL, "bone_mat");
579         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_3x3);
580         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
581         RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix");
582
583         prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
584         RNA_def_property_float_sdna(prop, NULL, "arm_mat");
585         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
586         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
587         RNA_def_property_ui_text(prop, "Bone Armature-Relative Matrix", "4x4 bone matrix relative to armature");
588
589         prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
590         RNA_def_property_float_sdna(prop, NULL, "tail");
591         RNA_def_property_array(prop, 3);
592         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
593         RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
594
595         prop= RNA_def_property(srna, "tail_local", PROP_FLOAT, PROP_TRANSLATION);
596         RNA_def_property_float_sdna(prop, NULL, "arm_tail");
597         RNA_def_property_array(prop, 3);
598         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
599         RNA_def_property_ui_text(prop, "Armature-Relative Tail", "Location of tail end of the bone relative to armature");
600
601         prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
602         RNA_def_property_float_sdna(prop, NULL, "head");
603         RNA_def_property_array(prop, 3);
604         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
605         RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone relative to its parent");
606
607         prop= RNA_def_property(srna, "head_local", PROP_FLOAT, PROP_TRANSLATION);
608         RNA_def_property_float_sdna(prop, NULL, "arm_head");
609         RNA_def_property_array(prop, 3);
610         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
611         RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature");
612
613         RNA_api_bone(srna);
614 }
615
616 static void rna_def_edit_bone(BlenderRNA *brna)
617 {
618         StructRNA *srna;
619         PropertyRNA *prop;
620         
621         srna= RNA_def_struct(brna, "EditBone", NULL);
622         RNA_def_struct_sdna(srna, "EditBone");
623         RNA_def_struct_idprops_func(srna, "rna_EditBone_idprops");
624         RNA_def_struct_ui_text(srna, "Edit Bone", "Editmode bone in an Armature datablock");
625         RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
626         
627         RNA_define_verify_sdna(0); // not in sdna
628
629         prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
630         RNA_def_property_struct_type(prop, "EditBone");
631         RNA_def_property_pointer_funcs(prop, "rna_EditBone_parent_get", "rna_EditBone_parent_set", NULL, NULL);
632         RNA_def_property_flag(prop, PROP_EDITABLE);
633         RNA_def_property_ui_text(prop, "Parent", "Parent edit bone (in same Armature)");
634         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
635         
636         prop= RNA_def_property(srna, "roll", PROP_FLOAT, PROP_ANGLE);
637         RNA_def_property_float_sdna(prop, NULL, "roll");
638         RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 0.1, 2);
639         RNA_def_property_ui_text(prop, "Roll", "Bone rotation around head-tail axis");
640         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
641         RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
642
643         prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
644         RNA_def_property_float_sdna(prop, NULL, "head");
645         RNA_def_property_array(prop, 3);
646         RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone");
647         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
648         RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
649
650         prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
651         RNA_def_property_float_sdna(prop, NULL, "tail");
652         RNA_def_property_array(prop, 3);
653         RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
654         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
655         RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
656
657         rna_def_bone_common(srna, 1);
658
659         prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
660         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
661         RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when in Edit Mode");
662         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
663         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
664
665         prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
666         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
667         RNA_def_property_ui_text(prop, "Lock", "Bone is not able to be transformed when in Edit Mode");
668         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
669         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
670
671         prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
672         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
673         RNA_def_property_ui_text(prop, "Select", "");
674         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
675         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
676
677         prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
678         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
679         RNA_def_property_ui_text(prop, "Head Select", "");
680         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
681         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
682         
683         prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
684         RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
685         RNA_def_property_ui_text(prop, "Tail Select", "");
686         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
687         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
688
689         /* calculated and read only, not actual data access */
690         prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
691         //RNA_def_property_float_sdna(prop, NULL, ""); // doesnt access any real data
692         RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
693         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
694         RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
695         RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space)");
696         RNA_def_property_float_funcs(prop, "rna_EditBone_matrix_get", NULL, NULL); // TODO - this could be made writable also
697
698         RNA_api_armature_edit_bone(srna);
699
700         RNA_define_verify_sdna(1);
701 }
702
703
704 /* armature.bones.* */
705 static void rna_def_armature_bones(BlenderRNA *brna, PropertyRNA *cprop)
706 {
707         StructRNA *srna;
708         PropertyRNA *prop;
709
710 //      FunctionRNA *func;
711 //      PropertyRNA *parm;
712
713         RNA_def_property_srna(cprop, "ArmatureBones");
714         srna= RNA_def_struct(brna, "ArmatureBones", NULL);
715         RNA_def_struct_sdna(srna, "bArmature");
716         RNA_def_struct_ui_text(srna, "Armature Bones", "Collection of armature bones");
717
718
719         prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
720         RNA_def_property_struct_type(prop, "Bone");
721         RNA_def_property_pointer_sdna(prop, NULL, "act_bone");
722         RNA_def_property_flag(prop, PROP_EDITABLE);
723         RNA_def_property_ui_text(prop, "Active Bone", "Armatures active bone");
724         RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_bone_set", NULL, NULL);
725
726         /* todo, redraw */
727 //              RNA_def_property_collection_active(prop, prop_act);
728 }
729
730 /* armature.bones.* */
731 static void rna_def_armature_edit_bones(BlenderRNA *brna, PropertyRNA *cprop)
732 {
733         StructRNA *srna;
734         PropertyRNA *prop;
735
736         FunctionRNA *func;
737         PropertyRNA *parm;
738
739         RNA_def_property_srna(cprop, "ArmatureEditBones");
740         srna= RNA_def_struct(brna, "ArmatureEditBones", NULL);
741         RNA_def_struct_sdna(srna, "bArmature");
742         RNA_def_struct_ui_text(srna, "Armature EditBones", "Collection of armature edit bones");
743
744         prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
745         RNA_def_property_struct_type(prop, "EditBone");
746         RNA_def_property_pointer_sdna(prop, NULL, "act_edbone");
747         RNA_def_property_flag(prop, PROP_EDITABLE);
748         RNA_def_property_ui_text(prop, "Active EditBone", "Armatures active edit bone");
749         //RNA_def_property_update(prop, 0, "rna_Armature_act_editbone_update");
750         RNA_def_property_pointer_funcs(prop, NULL, "rna_Armature_act_edit_bone_set", NULL, NULL);
751
752         /* todo, redraw */
753 //              RNA_def_property_collection_active(prop, prop_act);
754
755         /* add target */
756         func= RNA_def_function(srna, "new", "rna_Armature_edit_bone_new");
757         RNA_def_function_flag(func, FUNC_USE_REPORTS);
758         RNA_def_function_ui_description(func, "Add a new bone.");
759         parm= RNA_def_string(func, "name", "Object", 0, "", "New name for the bone");
760         RNA_def_property_flag(parm, PROP_REQUIRED);
761
762         /* return type */
763         parm= RNA_def_pointer(func, "bone", "EditBone", "", "Newly created edit bone");
764         RNA_def_function_return(func, parm);
765
766         /* remove target */
767         func= RNA_def_function(srna, "remove", "rna_Armature_edit_bone_remove");
768         RNA_def_function_flag(func, FUNC_USE_REPORTS);
769         RNA_def_function_ui_description(func, "Remove an existing bone from the armature");
770         /* target to remove*/
771         parm= RNA_def_pointer(func, "bone", "EditBone", "", "EditBone to remove");
772         RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
773 }
774
775 static void rna_def_armature(BlenderRNA *brna)
776 {
777         StructRNA *srna;
778         PropertyRNA *prop;
779         
780         static EnumPropertyItem prop_drawtype_items[] = {
781                 {ARM_OCTA, "OCTAHEDRAL", 0, "Octahedral", "Display bones as octahedral shape (default)"},
782                 {ARM_LINE, "STICK", 0, "Stick", "Display bones as simple 2D lines with dots"},
783                 {ARM_B_BONE, "BBONE", 0, "B-Bone", "Display bones as boxes, showing subdivision and B-Splines"},
784                 {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing defomation influence volume"},
785                 {0, NULL, 0, NULL, NULL}};
786         static EnumPropertyItem prop_ghost_type_items[] = {
787                 {ARM_GHOST_CUR, "CURRENT_FRAME", 0, "Around Frame", "Display Ghosts of poses within a fixed number of frames around the current frame"},
788                 {ARM_GHOST_RANGE, "RANGE", 0, "In Range", "Display Ghosts of poses within specified range"},
789                 {ARM_GHOST_KEYS, "KEYS", 0, "On Keyframes", "Display Ghosts of poses on Keyframes"},
790                 {0, NULL, 0, NULL, NULL}};
791         static const EnumPropertyItem prop_pose_position_items[]= {
792                 {0, "POSE", 0, "Pose Position", "Show armature in posed state"},
793                 {ARM_RESTPOS, "REST", 0, "Rest Position", "Show Armature in binding pose state. No posing possible"},
794                 {0, NULL, 0, NULL, NULL}};
795         
796         srna= RNA_def_struct(brna, "Armature", "ID");
797         RNA_def_struct_ui_text(srna, "Armature", "Armature datablock containing a hierarchy of bones, usually used for rigging characters");
798         RNA_def_struct_ui_icon(srna, ICON_ARMATURE_DATA);
799         RNA_def_struct_sdna(srna, "bArmature");
800         
801         /* Animation Data */
802         rna_def_animdata_common(srna);
803         
804         /* Collections */
805         prop= RNA_def_property(srna, "bones", PROP_COLLECTION, PROP_NONE);
806         RNA_def_property_collection_sdna(prop, NULL, "bonebase", NULL);
807         RNA_def_property_collection_funcs(prop, 0, "rna_Armature_bones_next", 0, 0, 0, 0, 0);
808         RNA_def_property_struct_type(prop, "Bone");
809         RNA_def_property_ui_text(prop, "Bones", "");
810         rna_def_armature_bones(brna, prop);
811
812         prop= RNA_def_property(srna, "edit_bones", PROP_COLLECTION, PROP_NONE);
813         RNA_def_property_collection_sdna(prop, NULL, "edbo", NULL);
814         RNA_def_property_struct_type(prop, "EditBone");
815         RNA_def_property_ui_text(prop, "Edit Bones", "");
816         rna_def_armature_edit_bones(brna, prop);
817
818         /* Enum values */
819         prop= RNA_def_property(srna, "pose_position", PROP_ENUM, PROP_NONE);
820         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
821         RNA_def_property_enum_items(prop, prop_pose_position_items);
822         RNA_def_property_ui_text(prop, "Pose Position", "Show armature in binding pose or final posed state");
823         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
824         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
825         
826         prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
827         RNA_def_property_enum_sdna(prop, NULL, "drawtype");
828         RNA_def_property_enum_items(prop, prop_drawtype_items);
829         RNA_def_property_ui_text(prop, "Draw Type", "");
830         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
831         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
832         
833 // XXX depreceated ....... old animviz for armatures only
834         prop= RNA_def_property(srna, "ghost_type", PROP_ENUM, PROP_NONE);
835         RNA_def_property_enum_sdna(prop, NULL, "ghosttype");
836         RNA_def_property_enum_items(prop, prop_ghost_type_items);
837         RNA_def_property_ui_text(prop, "Ghost Type", "Method of Onion-skinning for active Action");
838         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
839         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
840 // XXX depreceated ....... old animviz for armatures only       
841
842         /* Boolean values */
843                 /* layer */
844         prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
845         RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
846         RNA_def_property_array(prop, 32);
847         RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility");
848         RNA_def_property_boolean_funcs(prop, NULL, "rna_Armature_layer_set");
849         RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_update_layers");
850         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
851         
852                 /* layer protection */
853         prop= RNA_def_property(srna, "layers_protected", PROP_BOOLEAN, PROP_LAYER);
854         RNA_def_property_boolean_sdna(prop, NULL, "layer_protected", 1);
855         RNA_def_property_array(prop, 32);
856         RNA_def_property_ui_text(prop, "Layer Proxy Protection", "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo"); 
857         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
858                 
859                 /* flag */
860         prop= RNA_def_property(srna, "show_axes", PROP_BOOLEAN, PROP_NONE);
861         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWAXES);
862         RNA_def_property_ui_text(prop, "Draw Axes", "Draw bone axes");
863         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
864         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
865         
866         prop= RNA_def_property(srna, "show_names", PROP_BOOLEAN, PROP_NONE);
867         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DRAWNAMES);
868         RNA_def_property_ui_text(prop, "Draw Names", "Draw bone names");
869         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
870         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
871         
872         prop= RNA_def_property(srna, "use_deform_delay", PROP_BOOLEAN, PROP_NONE);
873         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_DELAYDEFORM);
874         RNA_def_property_ui_text(prop, "Delay Deform", "Don't deform children when manipulating bones in Pose Mode");
875         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
876         
877         prop= RNA_def_property(srna, "use_mirror_x", PROP_BOOLEAN, PROP_NONE);
878         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_MIRROR_EDIT);
879         RNA_def_property_ui_text(prop, "X-Axis Mirror", "Apply changes to matching bone on opposite side of X-Axis");
880         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
881         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
882         
883         prop= RNA_def_property(srna, "use_auto_ik", PROP_BOOLEAN, PROP_NONE);
884         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_AUTO_IK);
885         RNA_def_property_ui_text(prop, "Auto IK", "Add temporaral IK constraints while grabbing bones in Pose Mode");
886         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
887         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
888         
889         prop= RNA_def_property(srna, "show_bone_custom_shapes", PROP_BOOLEAN, PROP_NONE);
890         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_NO_CUSTOM);
891         RNA_def_property_ui_text(prop, "Draw Custom Bone Shapes", "Draw bones with their custom shapes");
892         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
893         
894         prop= RNA_def_property(srna, "show_group_colors", PROP_BOOLEAN, PROP_NONE);
895         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_COL_CUSTOM);
896         RNA_def_property_ui_text(prop, "Draw Bone Group Colors", "Draw bone group colors");
897         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
898         
899 // XXX depreceated ....... old animviz for armatures only
900         prop= RNA_def_property(srna, "show_only_ghost_selected", PROP_BOOLEAN, PROP_NONE);
901         RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
902         RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Bones Only", "");
903         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
904         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
905 // XXX depreceated ....... old animviz for armatures only
906         
907                 /* deformflag */
908         prop= RNA_def_property(srna, "use_deform_vertex_groups", PROP_BOOLEAN, PROP_NONE);
909         RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_VGROUP);
910         RNA_def_property_ui_text(prop, "Deform Vertex Groups", "Enable Vertex Groups when defining deform");
911         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
912         
913         prop= RNA_def_property(srna, "use_deform_envelopes", PROP_BOOLEAN, PROP_NONE);
914         RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_ENVELOPE);
915         RNA_def_property_ui_text(prop, "Deform Envelopes", "Enable Bone Envelopes when defining deform");
916         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
917         
918         prop= RNA_def_property(srna, "use_deform_preserve_volume", PROP_BOOLEAN, PROP_NONE);
919         RNA_def_property_boolean_sdna(prop, NULL, "deformflag", ARM_DEF_QUATERNION);
920         RNA_def_property_ui_text(prop, "Use Dual Quaternion Deformation", "Enable deform rotation with Quaternions");
921         RNA_def_property_update(prop, 0, "rna_Armature_update_data");
922         
923         //prop= RNA_def_property(srna, "deform_invert_vertexgroups", PROP_BOOLEAN, PROP_NONE);
924         //RNA_def_property_boolean_negative_sdna(prop, NULL, "deformflag", ARM_DEF_INVERT_VGROUP);
925         //RNA_def_property_ui_text(prop, "Invert Vertex Group Influence", "Invert Vertex Group influence (only for Modifiers)");
926         //RNA_def_property_update(prop, 0, "rna_Armature_update_data");
927         
928         /* Number fields */
929 // XXX depreceated ....... old animviz for armatures only
930                 /* ghost/onionskining settings */
931         prop= RNA_def_property(srna, "ghost_step", PROP_INT, PROP_NONE);
932         RNA_def_property_int_sdna(prop, NULL, "ghostep");
933         RNA_def_property_range(prop, 0, 30);
934         RNA_def_property_ui_text(prop, "Ghosting Step", "Number of frame steps on either side of current frame to show as ghosts (only for 'Around Current Frame' Onion-skinning method)");
935         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
936         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
937         
938         prop= RNA_def_property(srna, "ghost_size", PROP_INT, PROP_NONE);
939         RNA_def_property_int_sdna(prop, NULL, "ghostsize");
940         RNA_def_property_range(prop, 1, 20);
941         RNA_def_property_ui_text(prop, "Ghosting Frame Step", "Frame step for Ghosts (not for 'On Keyframes' Onion-skinning method)");
942         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
943         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
944         
945         prop= RNA_def_property(srna, "ghost_frame_start", PROP_INT, PROP_TIME);
946         RNA_def_property_int_sdna(prop, NULL, "ghostsf");
947         RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_start_frame_set", NULL);
948         RNA_def_property_ui_text(prop, "Ghosting Start Frame", "Starting frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)");
949         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
950         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
951         
952         prop= RNA_def_property(srna, "ghost_frame_end", PROP_INT, PROP_TIME);
953         RNA_def_property_int_sdna(prop, NULL, "ghostef");
954         RNA_def_property_int_funcs(prop, NULL, "rna_Armature_ghost_end_frame_set", NULL);
955         RNA_def_property_ui_text(prop, "Ghosting End Frame", "End frame of range of Ghosts to display (not for 'Around Current Frame' Onion-skinning method)");
956         RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
957         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
958 // XXX depreceated ....... old animviz for armatures only       
959 }
960
961 void RNA_def_armature(BlenderRNA *brna)
962 {
963         rna_def_armature(brna);
964         rna_def_bone(brna);
965         rna_def_edit_bone(brna);
966 }
967
968 #endif