[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