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