[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27024] trunk/blender: apply visual transform to pose

Campbell Barton ideasman42 at gmail.com
Fri Feb 19 16:34:26 CET 2010


Revision: 27024
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27024
Author:   campbellbarton
Date:     2010-02-19 16:34:26 +0100 (Fri, 19 Feb 2010)

Log Message:
-----------
apply visual transform to pose
So constrainted bones can have their transform applied to their loc/scale/rot, then remove the constraints

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/blenkernel/BKE_armature.h
    trunk/blender/source/blender/blenkernel/intern/armature.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/collada/DocumentExporter.cpp
    trunk/blender/source/blender/editors/armature/armature_intern.h
    trunk/blender/source/blender/editors/armature/armature_ops.c
    trunk/blender/source/blender/editors/armature/editarmature.c
    trunk/blender/source/blender/ikplugin/intern/iksolver_plugin.c
    trunk/blender/source/blender/ikplugin/intern/itasc_plugin.cpp

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2010-02-19 15:34:26 UTC (rev 27024)
@@ -990,8 +990,7 @@
 
         layout.separator()
 
-        layout.operator("pose.apply")
-        layout.operator("pose.relax")
+        layout.menu("VIEW3D_MT_pose_apply")
 
         layout.separator()
 
@@ -1110,6 +1109,17 @@
 class VIEW3D_MT_pose_showhide(VIEW3D_MT_showhide):
     _operator_name = "pose"
 
+
+class VIEW3D_MT_pose_apply(bpy.types.Menu):
+    bl_label = "Apply"
+
+    def draw(self, context):
+        layout = self.layout
+
+        layout.operator("pose.armature_apply")
+        layout.operator("pose.visual_transform_apply")
+
+
 # ********** Edit Menus, suffix from ob.type **********
 
 
@@ -2160,6 +2170,7 @@
     VIEW3D_MT_pose_ik,
     VIEW3D_MT_pose_constraints,
     VIEW3D_MT_pose_showhide,
+    VIEW3D_MT_pose_apply,
 
     VIEW3D_MT_edit_mesh,
     VIEW3D_MT_edit_mesh_specials, # Only as a menu for keybindings

Modified: trunk/blender/source/blender/blenkernel/BKE_armature.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_armature.h	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/blenkernel/BKE_armature.h	2010-02-19 15:34:26 UTC (rev 27024)
@@ -91,7 +91,7 @@
 void where_is_armature_bone(struct Bone *bone, struct Bone *prevbone);
 void armature_rebuild_pose(struct Object *ob, struct bArmature *arm);
 void where_is_pose (struct Scene *scene, struct Object *ob);
-void where_is_pose_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime);
+void where_is_pose_bone(struct Scene *scene, struct Object *ob, struct bPoseChannel *pchan, float ctime, int do_extra);
 
 /* get_objectspace_bone_matrix has to be removed still */
 void get_objectspace_bone_matrix (struct Bone* bone, float M_accumulatedMatrix[][4], int root, int posed);
@@ -105,6 +105,8 @@
 void armature_loc_pose_to_bone(struct bPoseChannel *pchan, float *inloc, float *outloc);
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4]);
 
+void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4]);
+
 /* Rotation Mode Conversions - Used for PoseChannels + Objects... */
 void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode);
 

Modified: trunk/blender/source/blender/blenkernel/intern/armature.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/armature.c	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/blenkernel/intern/armature.c	2010-02-19 15:34:26 UTC (rev 27024)
@@ -1266,8 +1266,36 @@
 	VECCOPY(outloc, nLocMat[3]);
 }
 
+
+/* Apply a 4x4 matrix to the pose bone,
+ * similar to object_apply_mat4()
+ */
+void pchan_apply_mat4(bPoseChannel *pchan, float mat[][4])
+{
+	/* location */
+	copy_v3_v3(pchan->loc, mat[3]);
+
+	/* scale */
+	mat4_to_size(pchan->size, mat);
+
+	/* rotation */
+	if (pchan->rotmode == ROT_MODE_AXISANGLE) {
+		float tmp_quat[4];
+
+		/* need to convert to quat first (in temp var)... */
+		mat4_to_quat(tmp_quat, mat);
+		quat_to_axis_angle(pchan->rotAxis, &pchan->rotAngle, tmp_quat);
+	}
+	else if (pchan->rotmode == ROT_MODE_QUAT) {
+		mat4_to_quat(pchan->quat, mat);
+	}
+	else {
+		mat4_to_eulO(pchan->eul, pchan->rotmode, mat);
+	}
+}
+
 /* Remove rest-position effects from pose-transform for obtaining
- * 'visual' transformation of pose-channel. 
+ * 'visual' transformation of pose-channel.
  * (used by the Visual-Keyframing stuff)
  */
 void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float arm_mat[][4])
@@ -1895,7 +1923,7 @@
 	float splineVec[3], scaleFac, radius=1.0f;
 	
 	/* firstly, calculate the bone matrix the standard way, since this is needed for roll control */
-	where_is_pose_bone(scene, ob, pchan, ctime);
+	where_is_pose_bone(scene, ob, pchan, ctime, 1);
 	
 	VECCOPY(poseHead, pchan->pose_head);
 	VECCOPY(poseTail, pchan->pose_tail);
@@ -2263,8 +2291,10 @@
 
 
 /* The main armature solver, does all constraints excluding IK */
-/* pchan is validated, as having bone and parent pointer */
-void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float ctime)
+/* pchan is validated, as having bone and parent pointer
+ * 'do_extra': when zero skips loc/size/rot, constraints and strip modifiers.
+ */
+void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float ctime, int do_extra)
 {
 	Bone *bone, *parbone;
 	bPoseChannel *parchan;
@@ -2276,8 +2306,9 @@
 	parchan= pchan->parent;
 	
 	/* this gives a chan_mat with actions (ipos) results */
-	chan_calc_mat(pchan);
-	
+	if(do_extra)	chan_calc_mat(pchan);
+	else			unit_m4(pchan->chan_mat);
+
 	/* construct the posemat based on PoseChannels, that we do before applying constraints */
 	/* pose_mat(b)= pose_mat(b-1) * yoffs(b-1) * d_root(b) * bone_mat(b) * chan_mat(b) */
 	
@@ -2342,32 +2373,34 @@
 			add_v3_v3v3(pchan->pose_mat[3], pchan->pose_mat[3], ob->pose->cyclic_offset);
 	}
 	
-	/* do NLA strip modifiers - i.e. curve follow */
-	do_strip_modifiers(scene, ob, bone, pchan);
-	
-	/* Do constraints */
-	if (pchan->constraints.first) {
-		bConstraintOb *cob;
+	if(do_extra) {
+		/* do NLA strip modifiers - i.e. curve follow */
+		do_strip_modifiers(scene, ob, bone, pchan);
 		
-		/* make a copy of location of PoseChannel for later */
-		VECCOPY(vec, pchan->pose_mat[3]);
-		
-		/* prepare PoseChannel for Constraint solving 
-		 * - makes a copy of matrix, and creates temporary struct to use 
-		 */
-		cob= constraints_make_evalob(scene, ob, pchan, CONSTRAINT_OBTYPE_BONE);
-		
-		/* Solve PoseChannel's Constraints */
-		solve_constraints(&pchan->constraints, cob, ctime);	// ctime doesnt alter objects
-		
-		/* cleanup after Constraint Solving 
-		 * - applies matrix back to pchan, and frees temporary struct used
-		 */
-		constraints_clear_evalob(cob);
-		
-		/* prevent constraints breaking a chain */
-		if(pchan->bone->flag & BONE_CONNECTED) {
-			VECCOPY(pchan->pose_mat[3], vec);
+		/* Do constraints */
+		if (pchan->constraints.first) {
+			bConstraintOb *cob;
+
+			/* make a copy of location of PoseChannel for later */
+			VECCOPY(vec, pchan->pose_mat[3]);
+
+			/* prepare PoseChannel for Constraint solving
+			 * - makes a copy of matrix, and creates temporary struct to use
+			 */
+			cob= constraints_make_evalob(scene, ob, pchan, CONSTRAINT_OBTYPE_BONE);
+
+			/* Solve PoseChannel's Constraints */
+			solve_constraints(&pchan->constraints, cob, ctime);	// ctime doesnt alter objects
+
+			/* cleanup after Constraint Solving
+			 * - applies matrix back to pchan, and frees temporary struct used
+			 */
+			constraints_clear_evalob(cob);
+
+			/* prevent constraints breaking a chain */
+			if(pchan->bone->flag & BONE_CONNECTED) {
+				VECCOPY(pchan->pose_mat[3], vec);
+			}
 		}
 	}
 	
@@ -2439,7 +2472,7 @@
 			}
 			/* 5. otherwise just call the normal solver */
 			else if(!(pchan->flag & POSE_DONE)) {
-				where_is_pose_bone(scene, ob, pchan, ctime);
+				where_is_pose_bone(scene, ob, pchan, ctime, 1);
 			}
 		}
 		/* 6. release the IK tree */

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2010-02-19 15:34:26 UTC (rev 27024)
@@ -1682,6 +1682,7 @@
 	}
 }
 
+/* see pchan_apply_mat4() for the equivalent 'pchan' function */
 void object_apply_mat4(Object *ob, float mat[][4])
 {
 	float mat3[3][3];

Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-02-19 15:34:26 UTC (rev 27024)
@@ -2003,7 +2003,7 @@
 			float ctime = bsystem_time(scene, ob_arm, *it, 0.0f);
 
 			BKE_animsys_evaluate_animdata(&ob_arm->id, ob_arm->adt, *it, ADT_RECALC_ANIM);
-			where_is_pose_bone(scene, ob_arm, pchan, ctime);
+			where_is_pose_bone(scene, ob_arm, pchan, ctime, 1);
 
 			// compute bone local mat
 			if (bone->parent) {

Modified: trunk/blender/source/blender/editors/armature/armature_intern.h
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_intern.h	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/editors/armature/armature_intern.h	2010-02-19 15:34:26 UTC (rev 27024)
@@ -84,7 +84,8 @@
 void POSE_OT_hide(struct wmOperatorType *ot);
 void POSE_OT_reveal(struct wmOperatorType *ot);
 
-void POSE_OT_apply(struct wmOperatorType *ot);
+void POSE_OT_armature_apply(struct wmOperatorType *ot);
+void POSE_OT_visual_transform_apply(struct wmOperatorType *ot);
 
 void POSE_OT_rot_clear(struct wmOperatorType *ot);
 void POSE_OT_loc_clear(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/armature/armature_ops.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_ops.c	2010-02-19 14:08:41 UTC (rev 27023)
+++ trunk/blender/source/blender/editors/armature/armature_ops.c	2010-02-19 15:34:26 UTC (rev 27024)
@@ -111,7 +111,8 @@
 	WM_operatortype_append(POSE_OT_hide);
 	WM_operatortype_append(POSE_OT_reveal);
 	
-	WM_operatortype_append(POSE_OT_apply);
+	WM_operatortype_append(POSE_OT_armature_apply);
+	WM_operatortype_append(POSE_OT_visual_transform_apply);
 	
 	WM_operatortype_append(POSE_OT_rot_clear);
 	WM_operatortype_append(POSE_OT_loc_clear);
@@ -285,9 +286,9 @@
 	kmi= WM_keymap_add_item(keymap, "POSE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0);
 		RNA_boolean_set(kmi->ptr, "unselected", 1);
 	WM_keymap_add_item(keymap, "POSE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
-	
-	WM_keymap_add_item(keymap, "POSE_OT_apply", AKEY, KM_PRESS, KM_CTRL, 0);
-	
+
+	WM_keymap_add_menu(keymap, "VIEW3D_MT_pose_apply", AKEY, KM_PRESS, KM_CTRL, 0);
+
 	// TODO: clear pose
 	WM_keymap_add_item(keymap, "POSE_OT_rot_clear", RKEY, KM_PRESS, KM_ALT, 0);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list