[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11414] trunk/blender/source/blender: More Constraints Bugfixes:
Joshua Leung
aligorith at gmail.com
Sun Jul 29 13:15:37 CEST 2007
Revision: 11414
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11414
Author: aligorith
Date: 2007-07-29 13:15:37 +0200 (Sun, 29 Jul 2007)
Log Message:
-----------
More Constraints Bugfixes:
* Transform Constraint should now work in more cases. Somehow the old code (for location case) wasn't working correctly.
* ChildOf Constraint applied on objects, should now get the right 'inverse'/'offset' matrix set. It now uses the same code that is used by Blender's parenting method to do so.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/constraint.c
trunk/blender/source/blender/include/BIF_editconstraint.h
trunk/blender/source/blender/src/buttons_object.c
trunk/blender/source/blender/src/editconstraint.c
Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c 2007-07-29 08:36:58 UTC (rev 11413)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c 2007-07-29 11:15:37 UTC (rev 11414)
@@ -2623,8 +2623,12 @@
}
break;
default: /* location */
+ /* get new location */
for (i=0; i<3; i++)
- loc[i] += (data->to_min[i] + (sval[data->map[i]] * (data->to_max[i] - data->to_min[i])));
+ loc[i]= (data->to_min[i] + (sval[data->map[i]] * (data->to_max[i] - data->to_min[i])));
+
+ /* add original location back on (so that it can still be moved) */
+ VecAddf(loc, ownermat[3], loc);
break;
}
Modified: trunk/blender/source/blender/include/BIF_editconstraint.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editconstraint.h 2007-07-29 08:36:58 UTC (rev 11413)
+++ trunk/blender/source/blender/include/BIF_editconstraint.h 2007-07-29 11:15:37 UTC (rev 11414)
@@ -65,5 +65,9 @@
char *buildmenu_pyconstraints(struct Text *con_text, int *pyconindex);
void validate_pyconstraint_cb(void *arg1, void *arg2);
+/* two special functions for ChildOf Constriant */
+void childof_const_setinv (void *conv, void *unused);
+void childof_const_clearinv(void *conv, void *unused);
+
#endif
Modified: trunk/blender/source/blender/src/buttons_object.c
===================================================================
--- trunk/blender/source/blender/src/buttons_object.c 2007-07-29 08:36:58 UTC (rev 11413)
+++ trunk/blender/source/blender/src/buttons_object.c 2007-07-29 11:15:37 UTC (rev 11414)
@@ -478,33 +478,6 @@
}
}
-/* ChildOf Constraint - set inverse */
-static void childof_const_setinv (void *conv, void *unused)
-{
- bChildOfConstraint *data= (bChildOfConstraint *)conv;
- Object *ob= OBACT;
- bPoseChannel *pchan= NULL;
-
- if (ob && ob->pose)
- pchan= get_active_posechannel(ob);
-
- // for now, try using constinv if available
- if (pchan)
- Mat4CpyMat4(data->invmat, pchan->constinv);
- else if (ob)
- Mat4CpyMat4(data->invmat, ob->constinv);
- else
- Mat4One(data->invmat);
-}
-
-/* ChildOf Constraint - clear inverse */
-static void childof_const_clearinv (void *conv, void *unused)
-{
- bChildOfConstraint *data= (bChildOfConstraint *)conv;
-
- Mat4One(data->invmat);
-}
-
/* Helper function for draw constraint - draws constraint space stuff
* This function should not be called if no menus are required
* owner/target: -1 = don't draw menu; 0= not posemode, 1 = posemode
Modified: trunk/blender/source/blender/src/editconstraint.c
===================================================================
--- trunk/blender/source/blender/src/editconstraint.c 2007-07-29 08:36:58 UTC (rev 11413)
+++ trunk/blender/source/blender/src/editconstraint.c 2007-07-29 11:15:37 UTC (rev 11414)
@@ -1010,3 +1010,43 @@
return menustr;
}
+
+/* ------------- Child-Of Constraint ------------------ */
+
+/* ChildOf Constraint - set inverse callback */
+void childof_const_setinv (void *conv, void *unused)
+{
+ bChildOfConstraint *data= (bChildOfConstraint *)conv;
+ Object *ob= OBACT;
+ bPoseChannel *pchan= NULL;
+
+ /* try to find a pose channel */
+ if (ob && ob->pose)
+ pchan= get_active_posechannel(ob);
+
+ /* calculate/set inverse matrix */
+ if (pchan) {
+ /* for now, just use pchan->constinv.
+ * NOTE: bad hack... doesn't work in many cases
+ */
+ Mat4CpyMat4(data->invmat, pchan->constinv);
+ }
+ else if (ob) {
+ /* use what_does_parent to find inverse - just like for normal parenting.
+ * NOTE: what_does_parent uses a static workob defined in object.c
+ */
+ what_does_parent(ob);
+ Mat4Invert(data->invmat, workob.obmat);
+ }
+ else
+ Mat4One(data->invmat);
+}
+
+/* ChildOf Constraint - clear inverse callback */
+void childof_const_clearinv (void *conv, void *unused)
+{
+ bChildOfConstraint *data= (bChildOfConstraint *)conv;
+
+ /* simply clear the matrix */
+ Mat4One(data->invmat);
+}
More information about the Bf-blender-cvs
mailing list