[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