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