svn merge ^/trunk/blender -r40720:40872
[blender.git] / source / blender / makesrna / intern / rna_pose.c
index d05a3d341ba4c5be23dd177ce3e2b1a4080fe614..b61495edc941b26d06ca8b3384a21a1ef6cd28aa 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_pose.c
+ *  \ingroup RNA
+ */
+
+
 #include <stdlib.h>
 #include <string.h>
 
 #include "DNA_scene_types.h"
 
 #include "BLI_math.h"
-#include "BLI_ghash.h"
 
 #include "WM_types.h"
 
+
+
+// XXX: this RNA enum define is currently duplicated for objects, since there is some text here which is not applicable
+EnumPropertyItem posebone_rotmode_items[] = {
+       {ROT_MODE_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock (default)"},
+       {ROT_MODE_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order. Prone to Gimbal Lock"},
+       {ROT_MODE_AXISANGLE, "AXIS_ANGLE", 0, "Axis Angle", "Axis Angle (W+XYZ). Defines a rotation around some axis defined by 3D-Vector"},
+       {0, NULL, 0, NULL, NULL}};
+
 #ifdef RNA_RUNTIME
 
 #include "BIK_api.h"
 
 #include "DNA_userdef_types.h"
 
+#include "MEM_guardedalloc.h"
+
+#include "BLI_ghash.h"
+
 #include "BKE_context.h"
 #include "BKE_constraint.h"
 #include "BKE_depsgraph.h"
 
 #include "MEM_guardedalloc.h"
 
+#include "WM_api.h"
+
 #include "RNA_access.h"
 
-static void rna_Pose_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Pose_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
        // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
 
-       DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+       DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
 }
 
-static void rna_Pose_IK_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Pose_IK_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
        // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
        Object *ob= ptr->id.data;
 
-       DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
        BIK_clear_data(ob->pose);
 }
 
@@ -86,13 +108,13 @@ static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value)
 {
        bActionGroup *grp= ptr->data;
        
-       /* if valid value, set the new enum value, then copy the relevant colours? */
+       /* if valid value, set the new enum value, then copy the relevant colors? */
        if ((value >= -1) && (value < 21))
                grp->customCol= value;
        else
                return;
        
-       /* only do color copying if using a custom color (i.e. not default colour)  */
+       /* only do color copying if using a custom color (i.e. not default color)  */
        if (grp->customCol) {
                if (grp->customCol > 0) {
                        /* copy theme colors on-to group's custom color in case user tries to edit color */
@@ -117,7 +139,7 @@ static void rna_BoneGroup_color_set_set(PointerRNA *ptr, int value)
        }
 }
 
-static IDProperty *rna_PoseBone_idproperties(PointerRNA *ptr, int create)
+static IDProperty *rna_PoseBone_idprops(PointerRNA *ptr, int create)
 {
        bPoseChannel *pchan= ptr->data;
 
@@ -157,7 +179,7 @@ static void rna_Pose_ik_solver_update(Main *bmain, Scene *scene, PointerRNA *ptr
        
        object_test_constraints(ob);
 
-       DAG_id_flush_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
+       DAG_id_tag_update(&ob->id, OB_RECALC_DATA|OB_RECALC_OB);
 }
 
 /* rotation - axis-angle */
@@ -200,7 +222,7 @@ static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
        char oldname[sizeof(pchan->name)], newname[sizeof(pchan->name)];
 
        /* need to be on the stack */
-       BLI_strncpy(newname, value, sizeof(pchan->name));
+       BLI_strncpy_utf8(newname, value, sizeof(pchan->name));
        BLI_strncpy(oldname, pchan->name, sizeof(pchan->name));
 
        ED_armature_bone_rename(ob->data, oldname, newname);
@@ -244,7 +266,7 @@ static StructRNA *rna_Pose_ikparam_typef(PointerRNA *ptr)
        }
 }
 
-static void rna_Itasc_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Itasc_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
        Object *ob = ptr->id.data;
        bItasc *itasc = ptr->data;
@@ -266,7 +288,7 @@ static void rna_Itasc_update(Main *bmain, Scene *scene, PointerRNA *ptr)
                itasc->maxvel = 100.f;
        BIK_update_param(ob->pose);
 
-       DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+       DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
 }
 
 static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -278,6 +300,21 @@ static void rna_Itasc_update_rebuild(Main *bmain, Scene *scene, PointerRNA *ptr)
        rna_Itasc_update(bmain, scene, ptr);
 }
 
+static void rna_PoseChannel_bone_custom_set(PointerRNA *ptr, PointerRNA value)
+{
+       bPoseChannel *pchan = (bPoseChannel*)ptr->data;
+
+
+       if (pchan->custom) {
+               id_us_min(&pchan->custom->id);
+               pchan->custom = NULL;
+       }
+
+       pchan->custom = value.data;
+
+       id_us_plus(&pchan->custom->id);
+}
+
 static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
 {
        Object *ob= (Object*)ptr->id.data;
@@ -374,7 +411,7 @@ static void rna_pose_bgroup_name_index_get(PointerRNA *ptr, char *value, int ind
        grp= BLI_findlink(&pose->agroups, index-1);
 
        if(grp) BLI_strncpy(value, grp->name, sizeof(grp->name));
-       else BLI_strncpy(value, "", sizeof(grp->name)); // XXX if invalid pointer, won't this crash?
+       else value[0]= '\0';
 }
 
 static int rna_pose_bgroup_name_index_length(PointerRNA *ptr, int index)
@@ -414,7 +451,7 @@ static void rna_pose_pgroup_name_set(PointerRNA *ptr, const char *value, char *r
                }
        }
        
-       BLI_strncpy(result, "", maxlen);
+       result[0]= '\0';
 }
 #endif
 
@@ -439,12 +476,25 @@ static bConstraint *rna_PoseChannel_constraints_new(bPoseChannel *pchan, int typ
        return add_pose_constraint(NULL, pchan, NULL, type);
 }
 
-static int rna_PoseChannel_constraints_remove(bPoseChannel *pchan, int index)
+static void rna_PoseChannel_constraints_remove(ID *id, bPoseChannel *pchan, ReportList *reports, bConstraint *con)
 {
-       // TODO
-       //ED_object_constraint_set_active(object, NULL);
-       //WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT, object);
-       return remove_constraint_index(&pchan->constraints, index);
+       if(BLI_findindex(&pchan->constraints, con) == -1) {
+               BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in pose bone '%s'", con->name, pchan->name);
+               return;
+       }
+       else {
+               Object *ob= (Object *)id;
+               const short is_ik= ELEM(con->type, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_SPLINEIK);
+
+               remove_constraint(&pchan->constraints, con);
+               ED_object_constraint_update(ob);
+               constraints_set_active(&pchan->constraints, NULL);
+               WM_main_add_notifier(NC_OBJECT|ND_CONSTRAINT|NA_REMOVED, id);
+
+               if (is_ik) {
+                       BIK_clear_data(ob->pose);
+               }
+       }
 }
 
 static int rna_PoseChannel_proxy_editable(PointerRNA *ptr)
@@ -522,25 +572,48 @@ static int rna_PoseChannel_rotation_4d_editable(PointerRNA *ptr, int index)
 }
 
 /* not essential, but much faster then the default lookup function */
-PointerRNA rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key)
+int rna_PoseBones_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
 {
-       PointerRNA rptr;
        bPose *pose= (bPose*)ptr->data;
        bPoseChannel *pchan= get_pose_channel(pose, key);
-       RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, &rptr);
-       return rptr;
+       if(pchan) {
+               RNA_pointer_create(ptr->id.data, &RNA_PoseBone, pchan, r_ptr);
+               return TRUE;
+       }
+       else {
+               return FALSE;
+       }
 }
 
-static void rna_PoseChannel_matrix_local_get(PointerRNA *ptr, float *values)
+static void rna_PoseChannel_matrix_basis_get(PointerRNA *ptr, float *values)
 {
        bPoseChannel *pchan= (bPoseChannel*)ptr->data;
        pchan_to_mat4(pchan, (float (*)[4])values);
 }
 
-static void rna_PoseChannel_matrix_local_set(PointerRNA *ptr, const float *values)
+static void rna_PoseChannel_matrix_basis_set(PointerRNA *ptr, const float *values)
 {
        bPoseChannel *pchan= (bPoseChannel*)ptr->data;
-       pchan_apply_mat4(pchan, (float (*)[4])values);
+       pchan_apply_mat4(pchan, (float (*)[4])values, FALSE); /* no compat for predictable result */
+}
+
+static void rna_PoseChannel_matrix_set(PointerRNA *ptr, const float *values)
+{
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       Object *ob= (Object*)ptr->id.data;
+       float umat[4][4]= MAT4_UNITY;
+       float tmat[4][4];
+
+       /* recalculate pose matrix with only parent transformations,
+        * bone loc/sca/rot is ignored, scene and frame are not used. */
+       where_is_pose_bone(NULL, ob, pchan, 0.0f, FALSE);
+
+       /* find the matrix, need to remove the bone transforms first so this is
+        * calculated as a matrix to set rather then a difference ontop of whats
+        * already there. */
+       pchan_apply_mat4(pchan, umat, FALSE);
+       armature_mat_pose_to_bone(pchan, (float (*)[4])values, tmat);
+       pchan_apply_mat4(pchan, tmat, FALSE); /* no compat for predictable result */
 }
 
 #else
@@ -632,7 +705,7 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro
        /* Collection active property */
        prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "Constraint");
-       RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_active_constraint_get", "rna_PoseChannel_active_constraint_set", NULL);
+       RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_active_constraint_get", "rna_PoseChannel_active_constraint_set", NULL, NULL);
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Active Constraint", "Active PoseChannel constraint");
 
@@ -641,40 +714,28 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro
        func= RNA_def_function(srna, "new", "rna_PoseChannel_constraints_new");
        RNA_def_function_ui_description(func, "Add a constraint to this object");
        /* return type */
-       parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint.");
+       parm= RNA_def_pointer(func, "constraint", "Constraint", "", "New constraint");
        RNA_def_function_return(func, parm);
        /* constraint to add */
-       parm= RNA_def_enum(func, "type", constraint_type_items, 1, "", "Constraint type to add.");
+       parm= RNA_def_enum(func, "type", constraint_type_items, 1, "", "Constraint type to add");
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
        func= RNA_def_function(srna, "remove", "rna_PoseChannel_constraints_remove");
-       RNA_def_function_ui_description(func, "Remove a constraint from this object.");
-       /* return type */
-       parm= RNA_def_boolean(func, "success", 0, "Success", "Removed the constraint successfully.");
-       RNA_def_function_return(func, parm);
-       /* object to add */
-       parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "", 0, INT_MAX);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_function_ui_description(func, "Remove a constraint from this object");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS|FUNC_USE_SELF_ID); /* ID needed for refresh */
+       /* constraint to remove */
+       parm= RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
 }
 
 static void rna_def_pose_channel(BlenderRNA *brna)
-{
-       // XXX: this RNA enum define is currently duplicated for objects, since there is some text here which is not applicable
-       static EnumPropertyItem prop_rotmode_items[] = {
-               {ROT_MODE_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock (default)"},
-               {ROT_MODE_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order. Prone to Gimbal Lock"},
-               {ROT_MODE_AXISANGLE, "AXIS_ANGLE", 0, "Axis Angle", "Axis Angle (W+XYZ). Defines a rotation around some axis defined by 3D-Vector"},
-               {0, NULL, 0, NULL, NULL}};
-               
+{      
        static float default_quat[4] = {1,0,0,0};       /* default quaternion values */
        static float default_axisAngle[4] = {0,0,1,0};  /* default axis-angle rotation values */
        static float default_scale[3] = {1,1,1}; /* default scale values */
        
+       const int matrix_dimsize[]= {4, 4};
+       
        StructRNA *srna;
        PropertyRNA *prop;
 
@@ -682,7 +743,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "bPoseChannel");
        RNA_def_struct_ui_text(srna, "Pose Bone", "Channel defining pose data for a bone in a Pose");
        RNA_def_struct_path_func(srna, "rna_PoseBone_path");
-       RNA_def_struct_idproperties_func(srna, "rna_PoseBone_idproperties");
+       RNA_def_struct_idprops_func(srna, "rna_PoseBone_idprops");
        
        /* Bone Constraints */
        prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
@@ -698,10 +759,6 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_struct_name_property(srna, prop);
 
-       prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
-       RNA_def_property_ui_text(prop, "Select", "");
-
        /* Baked Bone Path cache data */
        rna_def_motionpath_common(srna);
        
@@ -750,7 +807,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
                 * having a single one is better for Keyframing and other property-management situations...
                 */
        prop= RNA_def_property(srna, "rotation_axis_angle", PROP_FLOAT, PROP_AXISANGLE);
-       RNA_def_property_array(prop, 4); // TODO: maybe we'll need to define the 'default value' getter too...
+       RNA_def_property_array(prop, 4);
        RNA_def_property_float_funcs(prop, "rna_PoseChannel_rotation_axis_angle_get", "rna_PoseChannel_rotation_axis_angle_set", NULL);
        RNA_def_property_editable_array_func(prop, "rna_PoseChannel_rotation_4d_editable");
        RNA_def_property_float_array_default(prop, default_axisAngle);
@@ -767,7 +824,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        
        prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "rotmode");
-       RNA_def_property_enum_items(prop, prop_rotmode_items); // XXX move to using a single define of this someday
+       RNA_def_property_enum_items(prop, posebone_rotmode_items); // XXX move to using a single define of this someday
        RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable"); // XXX... disabled, since proxy-locked layers are currently used for ensuring proxy-syncing too
        RNA_def_property_ui_text(prop, "Rotation Mode", "");
@@ -776,20 +833,26 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        /* transform matrices - should be read-only since these are set directly by AnimSys evaluation */
        prop= RNA_def_property(srna, "matrix_channel", PROP_FLOAT, PROP_MATRIX);
        RNA_def_property_float_sdna(prop, NULL, "chan_mat");
-       RNA_def_property_array(prop, 16);
+       RNA_def_property_multi_array(prop, 2, matrix_dimsize);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints");
 
-       prop= RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
-       RNA_def_property_array(prop, 16);
-       RNA_def_property_ui_text(prop, "Local Matrix", "Matrix representing the parent relative location, scale and rotation. Provides an alternative access to these properties.");
-       RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_local_get", "rna_PoseChannel_matrix_local_set", NULL);
+       /* writable because it touches loc/scale/rot directly */
+       prop= RNA_def_property(srna, "matrix_basis", PROP_FLOAT, PROP_MATRIX);
+       RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+       RNA_def_property_ui_text(prop, "Basis Matrix",
+                                "Provides an alternative access to loc/scale/rotation relative to the parent and own rest bone");
+       RNA_def_property_float_funcs(prop, "rna_PoseChannel_matrix_basis_get", "rna_PoseChannel_matrix_basis_set", NULL);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
+       /* final matrix */
        prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
        RNA_def_property_float_sdna(prop, NULL, "pose_mat");
-       RNA_def_property_array(prop, 16);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE); 
-       RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel");
+       RNA_def_property_multi_array(prop, 2, matrix_dimsize);
+       RNA_def_property_float_funcs(prop, NULL, "rna_PoseChannel_matrix_set", NULL);
+       RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix after constraints and drivers are applied (object space)");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
        prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
@@ -803,55 +866,55 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Pose Tail Position", "Location of tail of the channel's bone");
        
        /* IK Settings */
-       prop= RNA_def_property(srna, "has_ik", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "is_in_ik_chain", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop,  "rna_PoseChannel_has_ik_get", NULL);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
-       RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis");
+       prop= RNA_def_property(srna, "lock_ik_x", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
+       RNA_def_property_ui_text(prop, "IK X Lock", "Disallow movement around the X axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
-       RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis");
+       prop= RNA_def_property(srna, "lock_ik_y", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
+       RNA_def_property_ui_text(prop, "IK Y Lock", "Disallow movement around the Y axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
-       RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis");
+       prop= RNA_def_property(srna, "lock_ik_z", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
+       RNA_def_property_ui_text(prop, "IK Z Lock", "Disallow movement around the Z axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_ik_limit_x", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
        RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_ik_limit_y", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
        RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
 
-       prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_ik_limit_z", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
        RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
-       prop= RNA_def_property(srna, "ik_rot_control", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_ik_rotation_control", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ROTCTL);
        RNA_def_property_ui_text(prop, "IK rot control", "Apply channel rotation as IK constraint");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
-       prop= RNA_def_property(srna, "ik_lin_control", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_ik_linear_control", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_LINCTL);
        RNA_def_property_ui_text(prop, "IK rot control", "Apply channel size as IK constraint if stretching is enabled");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
@@ -927,14 +990,14 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_IK_update");
        
-       prop= RNA_def_property(srna, "ik_rot_weight", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "ik_rotation_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ikrotweight");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Rot Weight", "Weight of rotation constraint for IK");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
        
-       prop= RNA_def_property(srna, "ik_lin_weight", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "ik_linear_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "iklinweight");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Lin Weight", "Weight of scale constraint for IK");
@@ -946,6 +1009,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_pointer_sdna(prop, NULL, "custom");
        RNA_def_property_struct_type(prop, "Object");
        RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_pointer_funcs(prop, NULL, "rna_PoseChannel_bone_custom_set", NULL, NULL);
        RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
@@ -962,6 +1026,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "agrp_index");
        RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set", "rna_PoseChannel_bone_group_index_range");
        RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group)");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
@@ -970,7 +1035,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        prop= RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "BoneGroup");
        RNA_def_property_flag(prop, PROP_EDITABLE);
-       RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL);
+       RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL, NULL);
        RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
        RNA_def_property_editable_func(prop, "rna_PoseChannel_proxy_editable");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
@@ -1043,13 +1108,13 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Precision", "Precision of convergence in case of reiteration");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "num_iter", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "iterations", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "numiter");
        RNA_def_property_range(prop, 1.f,1000.f);
        RNA_def_property_ui_text(prop, "Iterations", "Maximum number of iterations for convergence in case of reiteration");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "num_step", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "step_count", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "numstep");
        RNA_def_property_range(prop, 1.f, 50.f);
        RNA_def_property_ui_text(prop, "Num steps", "Divides the frame interval into this many steps");
@@ -1061,24 +1126,24 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Mode", NULL);
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
 
-       prop= RNA_def_property(srna, "reiteration", PROP_ENUM, PROP_NONE);
+       prop= RNA_def_property(srna, "reiteration_method", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
        RNA_def_property_enum_items(prop, prop_itasc_reiteration_items);
        RNA_def_property_ui_text(prop, "Reiteration", "Defines if the solver is allowed to reiterate (converges until precision is met) on none, first or all frames");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "auto_step", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_auto_step", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ITASC_AUTO_STEP);
        RNA_def_property_ui_text(prop, "Auto step", "Automatically determine the optimal number of steps for best performance/accuracy trade off");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "min_step", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "step_min", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "minstep");
        RNA_def_property_range(prop, 0.0f,0.1f);
        RNA_def_property_ui_text(prop, "Min step", "Lower bound for timestep in second in case of automatic substeps");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "max_step", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "step_max", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "maxstep");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "Max step", "Higher bound for timestep in second in case of automatic substeps");
@@ -1090,7 +1155,7 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Feedback", "Feedback coefficient for error correction. Average response time=1/feedback. Default=20");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "max_velocity", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "velocity_max", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "maxvel");
        RNA_def_property_range(prop, 0.0f,100.0f);
        RNA_def_property_ui_text(prop, "Max Velocity", "Maximum joint velocity in rad/s. Default=50");
@@ -1102,13 +1167,13 @@ static void rna_def_pose_itasc(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Solver", "Solving method selection: Automatic damping or manual damping");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update_rebuild");
 
-       prop= RNA_def_property(srna, "dampmax", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "damping_max", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "dampmax");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "Damp", "Maximum damping coefficient when singular value is nearly 0. Higher values=more stability, less reactivity. Default=0.5");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Itasc_update");
 
-       prop= RNA_def_property(srna, "dampeps", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "damping_epsilon", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "dampeps");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "Epsilon", "Singular value under which damping is progressively applied. Higher values=more stability, less reactivity. Default=0.1");
@@ -1132,6 +1197,34 @@ static void rna_def_pose_ikparam(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "IK Solver", "IK solver for which these parameters are defined, 0 for Legacy, 1 for iTaSC");
 }
 
+/* pose.bone_groups */
+static void rna_def_bone_groups(BlenderRNA *brna, PropertyRNA *cprop)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+//     FunctionRNA *func;
+//     PropertyRNA *parm;
+
+       RNA_def_property_srna(cprop, "BoneGroups");
+       srna= RNA_def_struct(brna, "BoneGroups", NULL);
+       RNA_def_struct_sdna(srna, "bPose");
+       RNA_def_struct_ui_text(srna, "Bone Groups", "Collection of bone groups");
+
+       prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "BoneGroup");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL, NULL);
+       RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "active_group");
+       RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set", "rna_Pose_active_bone_group_index_range");
+       RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+}
+
 static void rna_def_pose(BlenderRNA *brna)
 {
        StructRNA *srna;
@@ -1147,25 +1240,13 @@ static void rna_def_pose(BlenderRNA *brna)
        RNA_def_property_collection_sdna(prop, NULL, "chanbase", NULL);
        RNA_def_property_struct_type(prop, "PoseBone");
        RNA_def_property_ui_text(prop, "Pose Bones", "Individual pose bones for the armature");
-       RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, "rna_PoseBones_lookup_string"); /* can be removed, only for fast lookup */
+       RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, NULL, NULL, NULL, "rna_PoseBones_lookup_string", NULL); /* can be removed, only for fast lookup */
        /* bone groups */
        prop= RNA_def_property(srna, "bone_groups", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
        RNA_def_property_struct_type(prop, "BoneGroup");
        RNA_def_property_ui_text(prop, "Bone Groups", "Groups of the bones");
-
-       prop= RNA_def_property(srna, "active_bone_group", PROP_POINTER, PROP_NONE);
-       RNA_def_property_struct_type(prop, "BoneGroup");
-       RNA_def_property_flag(prop, PROP_EDITABLE);
-       RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL);
-       RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
-
-       prop= RNA_def_property(srna, "active_bone_group_index", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "active_group");
-       RNA_def_property_int_funcs(prop, "rna_Pose_active_bone_group_index_get", "rna_Pose_active_bone_group_index_set", "rna_Pose_active_bone_group_index_range");
-       RNA_def_property_ui_text(prop, "Active Bone Group Index", "Active index in bone groups array");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       rna_def_bone_groups(brna, prop);
        
        /* ik solvers */
        prop= RNA_def_property(srna, "ik_solver", PROP_ENUM, PROP_NONE);
@@ -1177,7 +1258,7 @@ static void rna_def_pose(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "ik_param", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "IKParam");
-       RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef");
+       RNA_def_property_pointer_funcs(prop, "rna_Pose_ikparam_get", NULL, "rna_Pose_ikparam_typef", NULL);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "IK Param", "Parameters for IK solver");