[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12543] trunk/blender/source/blender/src/ transform_conversions.c: CopyRot Constraint and Transforms:

Joshua Leung aligorith at gmail.com
Sat Nov 10 03:53:19 CET 2007


Revision: 12543
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12543
Author:   aligorith
Date:     2007-11-10 03:53:19 +0100 (Sat, 10 Nov 2007)

Log Message:
-----------
CopyRot Constraint and Transforms:

Now, when rotating along local axes of an object/bone with a copy-rot constraint that has offset on, the results are more predicatable. However, doing so with global axes is still in CrazySpace (TM).

Modified Paths:
--------------
    trunk/blender/source/blender/src/transform_conversions.c

Modified: trunk/blender/source/blender/src/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/src/transform_conversions.c	2007-11-09 23:06:31 UTC (rev 12542)
+++ trunk/blender/source/blender/src/transform_conversions.c	2007-11-10 02:53:19 UTC (rev 12543)
@@ -138,7 +138,7 @@
 #include "transform.h"
 
 /* local function prototype - for Object/Bone Constraints */
-static short constraints_list_needinv(ListBase *list);
+static short constraints_list_needinv(TransInfo *t, ListBase *list);
 
 /* ************************** Functions *************************** */
 
@@ -553,7 +553,7 @@
 		else 	 
 			Mat3CpyMat4(pmat, pchan->parent->pose_mat);
 		
-		if (constraints_list_needinv(&pchan->constraints)) {
+		if (constraints_list_needinv(t, &pchan->constraints)) {
 			Mat3CpyMat4(tmat, pchan->constinv);
 			Mat3Inv(cmat, tmat);
 			Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, cmat, omat, 0,0,0,0);    // dang mulserie swaps args
@@ -562,7 +562,7 @@
 			Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, omat, 0,0,0,0,0);    // dang mulserie swaps args
 	}
 	else {
-		if (constraints_list_needinv(&pchan->constraints)) {
+		if (constraints_list_needinv(t, &pchan->constraints)) {
 			Mat3CpyMat4(tmat, pchan->constinv);
 			Mat3Inv(cmat, tmat);
 			Mat3MulSerie(td->mtx, pchan->bone->bone_mat, cmat, omat, 0, 0,0,0,0);    // dang mulserie swaps args
@@ -2500,7 +2500,7 @@
  * These particular constraints benefit from this, but others don't, hence
  * this semi-hack ;-)    - Aligorith
  */
-static short constraints_list_needinv(ListBase *list)
+static short constraints_list_needinv(TransInfo *t, ListBase *list)
 {
 	bConstraint *con;
 	
@@ -2512,9 +2512,19 @@
 			/* only consider constraint if it is enabled, and has influence on result */
 			if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
 				/* (affirmative) returns for specific constraints here... */
+					/* constraints that require this regardless  */
 				if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
 				if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
 				if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
+				
+					/* constraints that require this only under special conditions */
+				if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
+					/* CopyRot constraint only does this when rotating, and offset is on */
+					bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
+					
+					if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
+						return 1;
+				}
 			}
 		}
 	}
@@ -2524,7 +2534,7 @@
 }
 
 /* transcribe given object into TransData for Transforming */
-static void ObjectToTransData(TransData *td, Object *ob) 
+static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob) 
 {
 	Object *track;
 	ListBase fakecons = {NULL, NULL};
@@ -2540,7 +2550,7 @@
 	 * 		inverse correction to stop it from screwing up space conversion
 	 *		matrix later
 	 */
-	constinv= constraints_list_needinv(&ob->constraints);
+	constinv= constraints_list_needinv(t, &ob->constraints);
 	if (ob->track || constinv==0) {
 		track= ob->track;
 		ob->track= NULL;
@@ -3090,7 +3100,7 @@
 						CFRA= (int)(ik->val/G.scene->r.framelen);
 						
 						do_ob_ipo(ob);
-						ObjectToTransData(td, ob);	// does where_is_object()
+						ObjectToTransData(t, td, ob);	// does where_is_object()
 						
 						td->flag= TD_SELECTED;
 						
@@ -3113,7 +3123,7 @@
 					where_is_object(ob);	// restore 
 				}
 				else {
-					ObjectToTransData(td, ob);
+					ObjectToTransData(t, td, ob);
 					td->tdi = NULL;
 					td->val = NULL;
 					td++;
@@ -3121,7 +3131,7 @@
 				}
 			}
 			else {
-				ObjectToTransData(td, ob);
+				ObjectToTransData(t, td, ob);
 				td->tdi = NULL;
 				td->val = NULL;
 				td++;





More information about the Bf-blender-cvs mailing list