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