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