Merge with -r 22620:23107.
[blender.git] / source / blender / makesrna / intern / rna_pose.c
index 9e4af51..0ee5f7e 100644 (file)
@@ -55,7 +55,7 @@ static void rna_Pose_update(bContext *C, PointerRNA *ptr)
 {
        // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
 
-       DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+       DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
 }
 
 static char *rna_PoseChannel_path(PointerRNA *ptr)
@@ -124,12 +124,73 @@ static void rna_PoseChannel_euler_rotation_set(PointerRNA *ptr, const float *val
 {
        bPoseChannel *pchan= ptr->data;
 
-       if(pchan->rotmode == PCHAN_ROT_QUAT)
+       if(pchan->rotmode == PCHAN_ROT_QUAT) /* default XYZ eulers when using quats... */
                EulToQuat((float*)value, pchan->quat);
        else
                VECCOPY(pchan->eul, value);
 }
 
+static void rna_PoseChannel_rotation_mode_set(PointerRNA *ptr, int value)
+{
+       bPoseChannel *pchan= ptr->data;
+       
+       /* check if any change - if so, need to convert data */
+       // TODO: this needs to be generalised at some point to work for objects too...
+       if (value > 0) { /* to euler */
+               if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+                       /* axis-angle to euler */
+                       float m[3][3];
+                       
+                       /* convert to 3x3 matrix, then to euler 
+                        *      - axis angle is stored in quats
+                        */
+                       VecRotToMat3(&pchan->quat[1], pchan->quat[0], m);
+                       Mat3ToEulO(m, pchan->eul, value);
+               }
+               else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+                       /* quat to euler */
+                       QuatToEulO(pchan->quat, pchan->eul, value);
+               }
+               /* else { no conversion needed } */
+       }
+       else if (value == PCHAN_ROT_QUAT) { /* to quat */
+               if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+                       /* axis angle to quat */
+                       float q[4];
+                       
+                       /* copy to temp var first, since quats and axis-angle are stored in same place */
+                       QuatCopy(q, pchan->quat);
+                       AxisAngleToQuat(q, &pchan->quat[1], pchan->quat[0]);
+               }
+               else if (pchan->rotmode > 0) {
+                       /* euler to quat */
+                       EulOToQuat(pchan->eul, pchan->rotmode, pchan->quat);
+               }
+               /* else { no conversion needed } */
+       }
+       else { /* to axis-angle */
+               if (pchan->rotmode > 0) {
+                       /* euler to axis angle */
+                       float q[4];
+                       
+                       /* convert to temp quat, then to axis angle (since stored in same var) */
+                       EulOToQuat(pchan->eul, pchan->rotmode, q);
+                       QuatToAxisAngle(q, &pchan->quat[1], &pchan->quat[0]);
+               }
+               else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+                       /* quat to axis angle */
+                       float q[4];
+                       
+                       /* copy to temp var first, since quats and axis-angle are stored in same place */
+                       QuatCopy(q, pchan->quat);
+                       QuatToAxisAngle(q, &pchan->quat[1], &pchan->quat[0]);
+               }
+       }
+       
+       /* finally, set the new rotation type */
+       pchan->rotmode= value;
+}
+
 static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
 {
        Object *ob= (Object*)ptr->id.data;
@@ -151,12 +212,72 @@ static int rna_PoseChannel_has_ik_get(PointerRNA *ptr)
        return ED_pose_channel_in_IK_chain(ob, pchan);
 }
 
+static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
+{
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       bActionGroup *grp;
+       
+       if (pose)
+               grp= BLI_findlink(&pose->agroups, pchan->agrp_index-1);
+       else
+               grp= NULL;
+       
+       return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, grp);
+}
+
+static void rna_PoseChannel_bone_group_set(PointerRNA *ptr, PointerRNA value)
+{
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       
+       if (pose)
+               pchan->agrp_index= BLI_findindex(&pose->agroups, value.data) + 1;
+       else
+               pchan->agrp_index= 0;
+}
+
+static int rna_PoseChannel_bone_group_index_get(PointerRNA *ptr)
+{
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       return MAX2(pchan->agrp_index-1, 0);
+}
+
+static void rna_PoseChannel_bone_group_index_set(PointerRNA *ptr, int value)
+{
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       pchan->agrp_index= value+1;
+}
+
+static void rna_PoseChannel_bone_group_index_range(PointerRNA *ptr, int *min, int *max)
+{
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       
+       *min= 0;
+       
+       if (pose) {
+               *max= BLI_countlist(&pose->agroups)-1;
+               *max= MAX2(0, *max);
+       }
+       else
+               *max= 0;
+}
+
 static PointerRNA rna_Pose_active_bone_group_get(PointerRNA *ptr)
 {
        bPose *pose= (bPose*)ptr->data;
        return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, BLI_findlink(&pose->agroups, pose->active_group-1));
 }
 
+static void rna_Pose_active_bone_group_set(PointerRNA *ptr, PointerRNA value)
+{
+       bPose *pose= (bPose*)ptr->data;
+       pose->active_group= BLI_findindex(&pose->agroups, value.data) + 1;
+}
+
 static int rna_Pose_active_bone_group_index_get(PointerRNA *ptr)
 {
        bPose *pose= (bPose*)ptr->data;
@@ -265,6 +386,7 @@ static void rna_def_bone_group(BlenderRNA *brna)
        srna= RNA_def_struct(brna, "BoneGroup", NULL);
        RNA_def_struct_sdna(srna, "bActionGroup");
        RNA_def_struct_ui_text(srna, "Bone Group", "Groups of Pose Channels (Bones).");
+       RNA_def_struct_ui_icon(srna, ICON_GROUP_BONE);
        
        /* name */
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
@@ -293,7 +415,13 @@ static void rna_def_pose_channel(BlenderRNA *brna)
 {
        static EnumPropertyItem prop_rotmode_items[] = {
                {PCHAN_ROT_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock (default)"},
-               {PCHAN_ROT_EUL, "EULER", 0, "Euler (XYZ)", "Prone to Gimbal Lock"},
+               {PCHAN_ROT_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order. Prone to Gimbal Lock"},
+               //{PCHAN_ROT_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}};
        
        StructRNA *srna;
@@ -304,60 +432,23 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Pose Channel", "Channel defining pose data for a bone in a Pose.");
        RNA_def_struct_path_func(srna, "rna_PoseChannel_path");
        RNA_def_struct_idproperties_func(srna, "rna_PoseChannel_idproperties");
-
+       
+       /* Bone Constraints */
        prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "Constraint");
        RNA_def_property_ui_text(prop, "Constraints", "Constraints that act on this PoseChannel."); 
 
+       /* Name + Selection Status */
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_PoseChannel_name_set");
        RNA_def_property_ui_text(prop, "Name", "");
        RNA_def_struct_name_property(srna, prop);
-
-       prop= RNA_def_property(srna, "has_ik", 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|ND_TRANSFORM, "rna_Pose_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.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_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.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_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.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
-       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
-       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
-       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Selected", "");
-       
-       prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "agrp_index");
-       RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group).");
 
+       /* Baked Bone Path cache data s*/
        prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "pathsf");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -369,7 +460,8 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Bone Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
+       
+       /* Relationships to other bones */
        prop= RNA_def_property(srna, "bone", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_struct_type(prop, "Bone");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -384,33 +476,35 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "PoseChannel");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Child", "Child of this pose channel.");
-
+       
+       /* Transformation settings */
        prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_ui_text(prop, "Location", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
        RNA_def_property_ui_text(prop, "Scale", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
        RNA_def_property_float_sdna(prop, NULL, "quat");
        RNA_def_property_ui_text(prop, "Rotation", "Rotation in Quaternions.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "euler_rotation", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float_sdna(prop, NULL, "eul");
        RNA_def_property_float_funcs(prop, "rna_PoseChannel_euler_rotation_get", "rna_PoseChannel_euler_rotation_set", NULL);
        RNA_def_property_ui_text(prop, "Rotation (Euler)", "Rotation in Eulers.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
        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);
+       RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
        RNA_def_property_ui_text(prop, "Rotation Mode", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        /* These three matrix properties await an implementation of the PROP_MATRIX subtype, which currently doesn't exist. */
        prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);
@@ -433,6 +527,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Constraint Inverse Matrix", "4x4 matrix, defines transform from final position to unconstrained position.");
        */
        
+       /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
        prop= RNA_def_property(srna, "pose_head", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Pose Head Position", "Location of head of the channel's bone.");
@@ -440,85 +535,145 @@ static void rna_def_pose_channel(BlenderRNA *brna)
        prop= RNA_def_property(srna, "pose_tail", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        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);
+       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_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.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_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.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_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.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+
+       prop= RNA_def_property(srna, "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_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
        prop= RNA_def_property(srna, "ik_min_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[0]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK X Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_max_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[0]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK X Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_min_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[1]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Y Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_max_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[1]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Y Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_min_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[2]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Z Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_max_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[2]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Z Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[0]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK X Stiffness", "IK stiffness around the X axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[1]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Y Stiffness", "IK stiffness around the Y axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_stiffness_z", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[2]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Z Stiffness", "IK stiffness around the Z axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "ik_stretch", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ikstretch");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Stretch", "Allow scaling of the bone for IK.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
-       prop= RNA_def_property(srna, "custom", PROP_POINTER, PROP_NONE);
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* custom bone shapes */
+       prop= RNA_def_property(srna, "custom_shape", PROP_POINTER, PROP_NONE);
+       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_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* bone groups */
+       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_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_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       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_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* transform locks */
        prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 
        prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
 }
 
 static void rna_def_pose(BlenderRNA *brna)
@@ -545,8 +700,9 @@ static void rna_def_pose(BlenderRNA *brna)
 
        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", "Bone groups of the pose.");
+       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);