make new rna variables more consistant with existing names.
[blender.git] / source / blender / makesrna / intern / rna_armature.c
index d42cf62589864117acec8472551f2b629b0292f4..a834fcf820b34f593dcf48f0066446c2850b7ef8 100644 (file)
@@ -1,6 +1,4 @@
-/**
- * $Id$
- *
+/*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * ***** END GPL LICENSE BLOCK *****
  */
 
+/** \file blender/makesrna/intern/rna_armature.c
+ *  \ingroup RNA
+ */
+
+
 #include <stdlib.h>
 
 #include "BLI_math.h"
 #include "ED_armature.h"
 #include "BKE_armature.h"
 
-static void rna_Armature_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Armature_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
        ID *id= ptr->id.data;
 
-       DAG_id_flush_update(id, OB_RECALC_DATA);
+       DAG_id_tag_update(id, 0);
        WM_main_add_notifier(NC_GEOM|ND_DATA, id);
        //WM_main_add_notifier(NC_OBJECT|ND_POSE, NULL);
 }
@@ -66,12 +69,16 @@ static void rna_Armature_act_bone_set(PointerRNA *ptr, PointerRNA value)
        }
        else {
                if(value.id.data != arm) {
-                       /* raise an error! */
-               }
-               else {
-                       arm->act_bone= value.data;
-                       arm->act_bone->flag |= BONE_SELECTED;
+                       Object *ob = (Object *)value.id.data;
+                       
+                       if(GS(ob->id.name)!=ID_OB || (ob->data != arm)) {
+                               printf("ERROR: armature set active bone - new active doesn't come from this armature\n");
+                               return;
+                       }
                }
+               
+               arm->act_bone= value.data;
+               arm->act_bone->flag |= BONE_SELECTED;
        }
 }
 
@@ -93,10 +100,10 @@ static void rna_Armature_act_edit_bone_set(PointerRNA *ptr, PointerRNA value)
        }
 }
 
-EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, char *name)
+EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, const char *name)
 {
        if(arm->edbo==NULL) {
-               BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant add an editbone.", arm->id.name+2);
+               BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant add an editbone", arm->id.name+2);
                return NULL;
        }
        return ED_armature_edit_bone_add(arm, name);
@@ -105,19 +112,33 @@ EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports, char *
 void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone *ebone)
 {
        if(arm->edbo==NULL) {
-               BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant remove an editbone.", arm->id.name+2);
+               BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in editmode, cant remove an editbone", arm->id.name+2);
                return;
        }
 
        if(BLI_findindex(arm->edbo, ebone) == -1) {
-               BKE_reportf(reports, RPT_ERROR, "Armature '%s' doesn't contain bone '%s'.", arm->id.name+2, ebone->name);
+               BKE_reportf(reports, RPT_ERROR, "Armature '%s' doesn't contain bone '%s'", arm->id.name+2, ebone->name);
                return;
        }
 
        ED_armature_edit_bone_remove(arm, ebone);
 }
 
-static void rna_Armature_redraw_data(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Armature_update_layers(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
+{
+       bArmature *arm= ptr->id.data;
+       Object *ob;
+
+       /* proxy lib exception, store it here so we can restore layers on file
+          load, since it would otherwise get lost due to being linked data */
+       for(ob = bmain->object.first; ob; ob=ob->id.next)
+               if(ob->data == arm && ob->pose)
+                       ob->pose->proxy_layer = arm->layer;
+
+       WM_main_add_notifier(NC_GEOM|ND_DATA, arm);
+}
+
+static void rna_Armature_redraw_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
        ID *id= ptr->id.data;
 
@@ -126,7 +147,20 @@ static void rna_Armature_redraw_data(Main *bmain, Scene *scene, PointerRNA *ptr)
 
 static char *rna_Bone_path(PointerRNA *ptr)
 {
-       return BLI_sprintfN("bones[\"%s\"]", ((Bone*)ptr->data)->name);
+       Bone *bone = (Bone*)ptr->data;
+       
+       /* special exception for trying to get the path where ID-block is Object
+        *      - this will be assumed to be from a Pose Bone...
+        */
+       if (ptr->id.data) {
+               ID *id = (ID *)ptr->id.data;
+               
+               if (GS(id->name) == ID_OB)
+                       return BLI_sprintfN("pose.bones[\"%s\"].bone", bone->name);
+       }
+       
+       /* from armature... */
+       return BLI_sprintfN("bones[\"%s\"]", bone->name);
 }
 
 static IDProperty *rna_Bone_idprops(PointerRNA *ptr, int create)
@@ -219,7 +253,7 @@ static void rna_EditBone_name_set(PointerRNA *ptr, const char *value)
        char oldname[sizeof(ebone->name)], newname[sizeof(ebone->name)];
        
        /* need to be on the stack */
-       BLI_strncpy(newname, value, sizeof(ebone->name));
+       BLI_strncpy_utf8(newname, value, sizeof(ebone->name));
        BLI_strncpy(oldname, ebone->name, sizeof(ebone->name));
        
        ED_armature_bone_rename(arm, oldname, newname);
@@ -232,7 +266,7 @@ static void rna_Bone_name_set(PointerRNA *ptr, const char *value)
        char oldname[sizeof(bone->name)], newname[sizeof(bone->name)];
        
        /* need to be on the stack */
-       BLI_strncpy(newname, value, sizeof(bone->name));
+       BLI_strncpy_utf8(newname, value, sizeof(bone->name));
        BLI_strncpy(oldname, bone->name, sizeof(bone->name));
 
        ED_armature_bone_rename(arm, oldname, newname);
@@ -385,6 +419,9 @@ static void rna_Armature_bones_next(CollectionPropertyIterator *iter)
 
 #else
 
+static int rna_matrix_dimsize_4x4[]= {4, 4};
+static int rna_matrix_dimsize_3x3[]= {3, 3};
+
 static void rna_def_bone_common(StructRNA *srna, int editbone)
 {
        PropertyRNA *prop;
@@ -414,7 +451,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
        RNA_def_property_ui_text(prop, "Connected", "When bone has a parent, bone's head is struck to the parent's tail");
        RNA_def_property_update(prop, 0, "rna_Armature_update_data");
        
-       prop= RNA_def_property(srna, "use_hinge", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_inherit_rotation", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", BONE_HINGE);
        RNA_def_property_ui_text(prop, "Inherit Rotation", "Bone inherits rotation or scale from parent bone");
        RNA_def_property_update(prop, 0, "rna_Armature_update_data");
@@ -470,6 +507,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
        
        prop= RNA_def_property(srna, "head_radius", PROP_FLOAT, PROP_UNSIGNED);
        if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
+       else RNA_def_property_update(prop, 0, "rna_Armature_update_data");
        RNA_def_property_float_sdna(prop, NULL, "rad_head");
        //RNA_def_property_range(prop, 0, 1000);  // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
        RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
@@ -477,6 +515,7 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
        
        prop= RNA_def_property(srna, "tail_radius", PROP_FLOAT, PROP_UNSIGNED);
        if(editbone) RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
+       else RNA_def_property_update(prop, 0, "rna_Armature_update_data");
        RNA_def_property_float_sdna(prop, NULL, "rad_tail");
        //RNA_def_property_range(prop, 0, 1000);  // XXX range is 0 to lim, where lim= 10000.0f*MAX2(1.0, view3d->grid);
        RNA_def_property_ui_range(prop, 0.01, 100, 0.1, 3);
@@ -500,6 +539,18 @@ static void rna_def_bone_common(StructRNA *srna, int editbone)
        RNA_def_property_range(prop, 0.0f, 2.0f);
        RNA_def_property_ui_text(prop, "B-Bone Ease Out", "Length of second Bezier Handle (for B-Bones only)");
        RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+
+       prop= RNA_def_property(srna, "bbone_x", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "xwidth");
+       RNA_def_property_range(prop, 0.0f, 1000.0f);
+       RNA_def_property_ui_text(prop, "B-Bone Display X Width", "B-Bone X size");
+       RNA_def_property_update(prop, 0, "rna_Armature_update_data");
+       
+       prop= RNA_def_property(srna, "bbone_z", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "zwidth");
+       RNA_def_property_range(prop, 0.0f, 1000.0f);
+       RNA_def_property_ui_text(prop, "B-Bone Display Z Width", "B-Bone Z size");
+       RNA_def_property_update(prop, 0, "rna_Armature_update_data");
 }
 
 // err... bones should not be directly edited (only editbones should be...)
@@ -539,47 +590,56 @@ static void rna_def_bone(BlenderRNA *brna)
        prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Select", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
        RNA_def_property_ui_text(prop, "Select Head", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
        RNA_def_property_ui_text(prop, "Select Tail", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        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_multi_array(prop, 2, rna_matrix_dimsize_3x3);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix");
 
        prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
        RNA_def_property_float_sdna(prop, NULL, "arm_mat");
-       RNA_def_property_array(prop, 16);
+       RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        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_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone");
 
        prop= RNA_def_property(srna, "tail_local", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "arm_tail");
        RNA_def_property_array(prop, 3);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        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_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone relative to its parent");
 
        prop= RNA_def_property(srna, "head_local", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "arm_head");
        RNA_def_property_array(prop, 3);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature");
 
        RNA_api_bone(srna);
@@ -609,18 +669,21 @@ static void rna_def_edit_bone(BlenderRNA *brna)
        RNA_def_property_float_sdna(prop, NULL, "roll");
        RNA_def_property_ui_range(prop, -M_PI * 2, M_PI * 2, 0.1, 2);
        RNA_def_property_ui_text(prop, "Roll", "Bone rotation around head-tail axis");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
 
        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");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
 
        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");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_editbone_transform_update");
 
        rna_def_bone_common(srna, 1);
@@ -628,32 +691,37 @@ static void rna_def_edit_bone(BlenderRNA *brna)
        prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_A);
        RNA_def_property_ui_text(prop, "Hide", "Bone is not visible when in Edit Mode");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 
        prop= RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_EDITMODE_LOCKED);
        RNA_def_property_ui_text(prop, "Lock", "Bone is not able to be transformed when in Edit Mode");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 
        prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Select", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 
        prop= RNA_def_property(srna, "select_head", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_ROOTSEL);
        RNA_def_property_ui_text(prop, "Head Select", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        
        prop= RNA_def_property(srna, "select_tail", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_TIPSEL);
        RNA_def_property_ui_text(prop, "Tail Select", "");
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 
        /* calculated and read only, not actual data access */
        prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
        //RNA_def_property_float_sdna(prop, NULL, ""); // doesnt access any real data
-       RNA_def_property_array(prop, 16);
+       RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
        RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space)");
@@ -719,7 +787,7 @@ static void rna_def_armature_edit_bones(BlenderRNA *brna, PropertyRNA *cprop)
        /* add target */
        func= RNA_def_function(srna, "new", "rna_Armature_edit_bone_new");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
-       RNA_def_function_ui_description(func, "Add a new bone.");
+       RNA_def_function_ui_description(func, "Add a new bone");
        parm= RNA_def_string(func, "name", "Object", 0, "", "New name for the bone");
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
@@ -745,7 +813,12 @@ static void rna_def_armature(BlenderRNA *brna)
                {ARM_OCTA, "OCTAHEDRAL", 0, "Octahedral", "Display bones as octahedral shape (default)"},
                {ARM_LINE, "STICK", 0, "Stick", "Display bones as simple 2D lines with dots"},
                {ARM_B_BONE, "BBONE", 0, "B-Bone", "Display bones as boxes, showing subdivision and B-Splines"},
-               {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing defomation influence volume"},
+               {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing deformation influence volume"},
+               {ARM_WIRE, "WIRE", 0, "Wire", "Display bones as thin wires, showing subdivision and B-Splines"},
+               {0, NULL, 0, NULL, NULL}};
+       static EnumPropertyItem prop_vdeformer[] = {
+               {ARM_VDEF_BLENDER, "BLENDER", 0, "Blender", "Uses Blender's armature vertex deformation"},
+               {ARM_VDEF_BGE_CPU, "BGE_CPU", 0, "BGE", "Uses vertex deformation code optimized for the BGE"},
                {0, NULL, 0, NULL, NULL}};
        static EnumPropertyItem prop_ghost_type_items[] = {
                {ARM_GHOST_CUR, "CURRENT_FRAME", 0, "Around Frame", "Display Ghosts of poses within a fixed number of frames around the current frame"},
@@ -785,6 +858,7 @@ static void rna_def_armature(BlenderRNA *brna)
        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_update_data");
+       RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
        
        prop= RNA_def_property(srna, "draw_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "drawtype");
@@ -792,6 +866,13 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Draw Type", "");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
        RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
+
+       prop= RNA_def_property(srna, "deform_method", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "gevertdeformer");
+       RNA_def_property_enum_items(prop, prop_vdeformer);
+       RNA_def_property_ui_text(prop, "Vertex Deformer", "");
+       RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
+       RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
        
 // XXX depreceated ....... old animviz for armatures only
        prop= RNA_def_property(srna, "ghost_type", PROP_ENUM, PROP_NONE);
@@ -809,7 +890,7 @@ static void rna_def_armature(BlenderRNA *brna)
        RNA_def_property_array(prop, 32);
        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, "rna_Armature_redraw_data");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Armature_update_layers");
        RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
        
                /* layer protection */