[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22672] branches/blender2.5/blender: Hook Modifier - Bone Targets

Joshua Leung aligorith at gmail.com
Fri Aug 21 12:47:27 CEST 2009


Revision: 22672
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22672
Author:   aligorith
Date:     2009-08-21 12:47:27 +0200 (Fri, 21 Aug 2009)

Log Message:
-----------
Hook Modifier - Bone Targets

Made Hook Modifier be able to use bone targets. However, I haven't been able to verify that everything will work perfectly, since just creating a new Hook Modifier and assigning targets doesn't set hmd->indexar correctly.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_data_modifier.py
    branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/editors/object/object_edit.c
    branches/blender2.5/blender/source/blender/editors/object/object_modifier.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c

Modified: branches/blender2.5/blender/release/ui/buttons_data_modifier.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_data_modifier.py	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/release/ui/buttons_data_modifier.py	2009-08-21 10:47:27 UTC (rev 22672)
@@ -200,7 +200,11 @@
 		layout.itemL(text="See Fluid panel.")
 		
 	def HOOK(self, layout, ob, md):
-		layout.itemR(md, "object")
+		col = layout.column()
+		col.itemR(md, "object")
+		if md.object and md.object.type == "ARMATURE":
+			layout.item_pointerR(md, "subtarget", md.object.data, "bones", text="Bone")
+		
 		layout.item_pointerR(md, "vertex_group", ob, "vertex_groups")
 
 		split = layout.split()

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/action.c	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/action.c	2009-08-21 10:47:27 UTC (rev 22672)
@@ -410,9 +410,10 @@
 bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
 {
 	bPoseChannel *chan;
-
-	if (pose==NULL) return NULL;
 	
+	if (ELEM(NULL, pose, name) || (name[0] == 0))
+		return NULL;
+	
 	for (chan=pose->chanbase.first; chan; chan=chan->next) {
 		if (chan->name[0] == name[0]) {
 			if (!strcmp (chan->name, name))

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c	2009-08-21 10:47:27 UTC (rev 22672)
@@ -5598,6 +5598,7 @@
 	thmd->indexar = MEM_dupallocN(hmd->indexar);
 	memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
 	strncpy(thmd->name, hmd->name, 32);
+	strncpy(thmd->subtarget, hmd->subtarget, 32);
 }
 
 CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
@@ -5642,9 +5643,11 @@
 
 	if (hmd->object) {
 		DagNode *curNode = dag_get_node(forest, hmd->object);
-
-		dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA,
-			"Hook Modifier");
+		
+		if (hmd->subtarget[0])
+			dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA|DAG_RL_DATA_DATA, "Hook Modifier");
+		else
+			dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA, "Hook Modifier");
 	}
 }
 
@@ -5653,12 +5656,22 @@
 	 float (*vertexCos)[3], int numVerts, int useRenderParams, int isFinalCalc)
 {
 	HookModifierData *hmd = (HookModifierData*) md;
-	float vec[3], mat[4][4];
+	bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
+	float vec[3], mat[4][4], dmat[4][4], imat[4][4];
 	int i;
 	DerivedMesh *dm = derivedData;
-
-	Mat4Invert(ob->imat, ob->obmat);
-	Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv,
+	
+	/* get world-space matrix of target, corrected for the space the verts are in */
+	if (hmd->subtarget[0] && pchan) {
+		/* bone target if there's a matching pose-channel */
+		Mat4MulMat4(dmat, pchan->pose_mat, hmd->object->obmat);
+	}
+	else {
+		/* just object target */
+		Mat4CpyMat4(dmat, hmd->object->obmat);
+	}
+	Mat4Invert(imat, dmat);
+	Mat4MulSerie(mat, imat, dmat, hmd->parentinv,
 		     NULL, NULL, NULL, NULL, NULL);
 
 	/* vertex indices? */

Modified: branches/blender2.5/blender/source/blender/editors/object/object_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_edit.c	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/editors/object/object_edit.c	2009-08-21 10:47:27 UTC (rev 22672)
@@ -979,6 +979,9 @@
 	EditVert *eve;
 	int index=0, nr=0;
 	
+	if (hmd->indexar == NULL)
+		return;
+	
 	for(eve= em->verts.first; eve; eve= eve->next, nr++) {
 		if(nr==hmd->indexar[index]) {
 			eve->f |= SELECT;
@@ -1361,6 +1364,7 @@
 			hmd->totindex= tot;
 			BLI_strncpy(hmd->name, name, 32);
 			
+			// TODO: need to take into account bone targets here too now...
 			if(mode==1 || mode==2) {
 				/* matrix calculus */
 				/* vert x (obmat x hook->imat) x hook->obmat x ob->imat */

Modified: branches/blender2.5/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_modifier.c	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/editors/object/object_modifier.c	2009-08-21 10:47:27 UTC (rev 22672)
@@ -31,6 +31,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_action_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
@@ -42,6 +43,7 @@
 #include "BLI_arithb.h"
 #include "BLI_listbase.h"
 
+#include "BKE_action.h"
 #include "BKE_curve.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
@@ -853,8 +855,21 @@
 	HookModifierData *hmd= ptr.data;
 
 	if(hmd->object) {
-		Mat4Invert(hmd->object->imat, hmd->object->obmat);
-		Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+		bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
+		
+		if(hmd->subtarget[0] && pchan) {
+			float imat[4][4], mat[4][4];
+			
+			/* calculate the world-space matrix for the pose-channel target first, then carry on as usual */
+			Mat4MulMat4(mat, pchan->pose_mat, hmd->object->obmat);
+			
+			Mat4Invert(imat, mat);
+			Mat4MulSerie(hmd->parentinv, imat, mat, NULL, NULL, NULL, NULL, NULL, NULL);
+		}
+		else {
+			Mat4Invert(hmd->object->imat, hmd->object->obmat);
+			Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+		}
 	}
 
 	DAG_object_flush_update(scene, ob, OB_RECALC_DATA);

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h	2009-08-21 10:47:27 UTC (rev 22672)
@@ -426,6 +426,8 @@
 	ModifierData modifier;
 
 	struct Object *object;
+	char subtarget[32];		/* optional name of bone target */
+	
 	float parentinv[4][4];	/* matrix making current transform unmodified */
 	float cent[3];			/* visualization of hook */
 	float falloff;			/* if not zero, falloff is distance where influence zero */

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c	2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c	2009-08-21 10:47:27 UTC (rev 22672)
@@ -912,6 +912,11 @@
 	RNA_def_property_ui_text(prop, "Object", "Parent Object for hook, also recalculates and clears offset");
 	RNA_def_property_flag(prop, PROP_EDITABLE);
 	RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
+	
+	prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "subtarget");
+	RNA_def_property_ui_text(prop, "Sub-Target", "Name of Parent Bone for hook (if applicable), also recalculates and clears offset");
+	RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_Modifier_dependency_update");
 
 	prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
 	RNA_def_property_string_sdna(prop, NULL, "name");





More information about the Bf-blender-cvs mailing list