Added support for custom RNA properties on Bones, only worked for
[blender.git] / source / blender / makesrna / intern / rna_armature.c
index a1bcbe57bd53dd0116ea7d1cfcbc3b504a13d17c..889f23e0d391eaf5250cf363f2370c84c00f54ab 100644 (file)
@@ -42,6 +42,7 @@
 
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
+#include "BKE_idprop.h"
 #include "BKE_main.h"
 
 #include "ED_armature.h"
@@ -52,6 +53,7 @@ static void rna_Armature_update_data(bContext *C, PointerRNA *ptr)
 
        DAG_id_flush_update(id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+       //WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL);
 }
 
 static void rna_Armature_redraw_data(bContext *C, PointerRNA *ptr)
@@ -61,6 +63,35 @@ static void rna_Armature_redraw_data(bContext *C, PointerRNA *ptr)
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
 }
 
+static char *rna_Bone_path(PointerRNA *ptr)
+{
+       return BLI_sprintfN("bones[\"%s\"]", ((Bone*)ptr->data)->name);
+}
+
+static IDProperty *rna_Bone_idproperties(PointerRNA *ptr, int create)
+{
+       Bone *bone= ptr->data;
+
+       if(create && !bone->prop) {
+               IDPropertyTemplate val = {0};
+               bone->prop= IDP_New(IDP_GROUP, val, "RNA_Bone ID properties");
+       }
+
+       return bone->prop;
+}
+
+static IDProperty *rna_EditBone_idproperties(PointerRNA *ptr, int create)
+{
+       EditBone *ebone= ptr->data;
+
+       if(create && !ebone->prop) {
+               IDPropertyTemplate val = {0};
+               ebone->prop= IDP_New(IDP_GROUP, val, "RNA_EditBone ID properties");
+       }
+
+       return ebone->prop;
+}
+
 static void rna_bone_layer_set(short *layer, const int *values)
 {
        int i, tot= 0;
@@ -374,6 +405,11 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_NO_CYCLICOFFSET);
        RNA_def_property_ui_text(prop, "Cyclic Offset", "When bone doesn't have a parent, it receives cyclic offset effects.");
        RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+       
+       prop= RNA_def_property(srna, "selectable", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_UNSELECTABLE);
+       RNA_def_property_ui_text(prop, "Selectable", "Bone is able to be selected");
+       RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 
        /* Number values */
                /* envelope deform settings */
@@ -430,6 +466,8 @@ static void rna_def_bone(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "Bone", NULL);
        RNA_def_struct_ui_text(srna, "Bone", "Bone in an Armature datablock.");
        RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
+       RNA_def_struct_path_func(srna, "rna_Bone_path");
+       RNA_def_struct_idproperties_func(srna, "rna_Bone_idproperties");
        
        /* pointers/collections */
                /* parent (pointer) */
@@ -457,6 +495,37 @@ static void rna_def_bone(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Selected", "");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+
+       /* XXX better matrix descriptions possible (Arystan) */
+       prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
+       RNA_def_property_float_sdna(prop, NULL, "bone_mat");
+       RNA_def_property_array(prop, 9);
+       RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix.");
+
+       prop= RNA_def_property(srna, "armature_matrix", PROP_FLOAT, PROP_MATRIX);
+       RNA_def_property_float_sdna(prop, NULL, "arm_mat");
+       RNA_def_property_array(prop, 16);
+       RNA_def_property_ui_text(prop, "Bone Armature-Relative Matrix", "4x4 bone matrix relative to armature.");
+
+       prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
+       RNA_def_property_float_sdna(prop, NULL, "tail");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone.");
+
+       prop= RNA_def_property(srna, "armature_tail", PROP_FLOAT, PROP_TRANSLATION);
+       RNA_def_property_float_sdna(prop, NULL, "arm_tail");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Armature-Relative Tail", "Location of tail end of the bone relative to armature.");
+
+       prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
+       RNA_def_property_float_sdna(prop, NULL, "head");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone.");
+
+       prop= RNA_def_property(srna, "armature_head", PROP_FLOAT, PROP_TRANSLATION);
+       RNA_def_property_float_sdna(prop, NULL, "arm_head");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature.");
 }
 
 static void rna_def_edit_bone(BlenderRNA *brna)
@@ -466,6 +535,7 @@ static void rna_def_edit_bone(BlenderRNA *brna)
        
        srna= RNA_def_struct(brna, "EditBone", NULL);
        RNA_def_struct_sdna(srna, "EditBone");
+       RNA_def_struct_idproperties_func(srna, "rna_Bone_idproperties");
        RNA_def_struct_ui_text(srna, "Edit Bone", "Editmode bone in an Armature datablock.");
        RNA_def_struct_ui_icon(srna, ICON_BONE_DATA);
        
@@ -552,9 +622,11 @@ static void rna_def_armature(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "Armature", "ID");
        RNA_def_struct_ui_text(srna, "Armature", "Armature datablock containing a hierarchy of bones, usually used for rigging characters.");
        RNA_def_struct_ui_icon(srna, ICON_ARMATURE_DATA);
-       
        RNA_def_struct_sdna(srna, "bArmature");
        
+       /* Animation Data */
+       rna_def_animdata_common(srna);
+       
        /* Collections */
        prop= RNA_def_property(srna, "bones", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "bonebase", NULL);
@@ -577,7 +649,7 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
        RNA_def_property_enum_items(prop, prop_pose_position_items);
        RNA_def_property_ui_text(prop, "Pose Position", "Show armature in binding pose or final posed state.");
-       RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+       RNA_def_property_update(prop, 0, "rna_Armature_update_data");
        
        prop= RNA_def_property(srna, "drawtype", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, prop_drawtype_items);
@@ -593,7 +665,7 @@ static void rna_def_armature(BlenderRNA *brna)
        prop= RNA_def_property(srna, "paths_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "pathflag");
        RNA_def_property_enum_items(prop, prop_paths_type_items);
-       RNA_def_property_ui_text(prop, "Paths Type", "Mapping type to use for this image in the game engine.");
+       RNA_def_property_ui_text(prop, "Paths Type", "Type of range to show for Bone Paths");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        prop= RNA_def_property(srna, "paths_location", PROP_ENUM, PROP_NONE);
@@ -609,7 +681,7 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_array(prop, 16);
        RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility.");
        RNA_def_property_boolean_funcs(prop, NULL, "rna_Armature_layer_set");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_redraw_data");
        RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
        
                /* layer protection */
@@ -658,8 +730,8 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        prop= RNA_def_property(srna, "ghost_only_selected", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
-       RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Keyframes Only", "");
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_GHOST_ONLYSEL);
+       RNA_def_property_ui_text(prop, "Draw Ghosts on Selected Bones Only", "");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
                /* deformflag */
@@ -705,7 +777,6 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        
-       
        /* Number fields */
                /* ghost/onionskining settings */
        prop= RNA_def_property(srna, "ghost_step", PROP_INT, PROP_NONE);