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