[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11327] trunk/blender/source/blender: == Transformation Constraint ==

Joshua Leung aligorith at gmail.com
Sat Jul 21 09:26:16 CEST 2007


Revision: 11327
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11327
Author:   aligorith
Date:     2007-07-21 09:26:15 +0200 (Sat, 21 Jul 2007)

Log Message:
-----------
== Transformation Constraint ==

This commit adds a new constraint to Blender: the Transformation Constraint. This constraint gives you more freedom to choose how transforms are copied from one object/bone to another object/bone. 

You can assign the Loc/Rot/Scale channels of a source to the Loc/Rot/Scale channels of a destination, specifying the range of motion (per axis) from the source to consider, and the range of motion (per axis) that will be applied to the destination. Also, for each destination axis, you can choose which of the source axes to copy from. 

A similar constraint was coded by Jason Blary (snark), as Patch #4991. This constraint is basically rewritten from scratch, although there are some elements of the original patch which may be borrowed in future.

Various notes:
* PyAPI access has been coded. 
* Space conversion is also enabled for this constraint.
* Also the useless get_constraint_col function has been removed
* Doing a rotation copy with a ratio that is not 1:1 doesn't always work correctly yet (like for the Copy Rotation constraint).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/include/butspace.h
    trunk/blender/source/blender/makesdna/DNA_constraint_types.h
    trunk/blender/source/blender/python/api2_2x/Constraint.c
    trunk/blender/source/blender/python/api2_2x/doc/Constraint.py
    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-21 03:54:20 UTC (rev 11326)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2007-07-21 07:26:15 UTC (rev 11327)
@@ -267,6 +267,12 @@
 			if (data->tar) return 1;
 		}
 		break;
+	case CONSTRAINT_TYPE_TRANSFORM:
+		{
+			bTransformConstraint *data = con->data;
+			if (data->tar) return 1;
+		}
+		break;
 	}
 	
 	/* Unknown types or CONSTRAINT_TYPE_NULL or no target */
@@ -377,6 +383,13 @@
 			return data->tar;
 		}
 		break;
+	case CONSTRAINT_TYPE_TRANSFORM:	
+		{
+			bTransformConstraint *data = con->data;
+			*subtarget= data->subtarget;
+			return data->tar;
+		}
+		break;
 	default:
 		*subtarget= NULL;
 		break;
@@ -484,6 +497,13 @@
 			if (subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
 		}
 			break;
+		case CONSTRAINT_TYPE_TRANSFORM:
+		{
+			bTransformConstraint *data = con->data;
+			data->tar= ob;
+			if (subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
+		}
+			break;
 	}
 }
 
@@ -714,6 +734,18 @@
 			result = data;
 		}
 		break;
+	case CONSTRAINT_TYPE_TRANSFORM:
+		{
+			bTransformConstraint *data;
+			data = MEM_callocN(sizeof(bTransformConstraint), "TransformationConstraint");
+			
+			data->map[0]= 0;
+			data->map[1]= 1;
+			data->map[2]= 2;
+			
+			result = data;
+		}
+		break;
   
    	default:
 		result = NULL;
@@ -1504,6 +1536,19 @@
 				Mat4One(mat);
 		}
 		break;
+	case CONSTRAINT_TYPE_TRANSFORM:
+		{
+			bTransformConstraint *data;
+			data= (bTransformConstraint *)con->data;
+			
+			if (data->tar) {
+				constraint_target_to_mat4(data->tar, data->subtarget, mat, CONSTRAINT_SPACE_WORLD, con->tarspace);
+				valid = 1;
+			}
+			else
+				Mat4One(mat);
+		}
+		break;
 
 	default:
 		Mat4One(mat);
@@ -2466,8 +2511,114 @@
 			}
 		}
 		break;
+	case CONSTRAINT_TYPE_TRANSFORM:
+		{
+			bTransformConstraint *data;
+			
+			data = constraint->data;
+			
+			/* only work if there is a target */
+			if (data->tar) {
+				float loc[3], eul[3], size[3];
+				float dvec[3], sval[3];
+				short i;
+				
+				/* obtain target effect */
+				switch (data->from) {
+					case 2:	/* scale */
+					{
+						Mat4ToSize(targetmat, dvec);
+					}
+						break;
+					case 1: /* rotation */
+					{
+						/* copy, and reduce to smallest rotation distance */
+						Mat4ToEul(targetmat, dvec);
+						
+						/* reduce rotation */
+						for (i=0; i<3; i++)
+							dvec[i]= fmod(dvec[i], M_PI*2);
+					}
+						break;
+					default: /* location */
+					{
+						VECCOPY(dvec, targetmat[3]);
+					}
+						break;
+				}
+				
+				/* extract components of owner's matrix */
+				VECCOPY(loc, ownermat[3]);
+				Mat4ToEul(ownermat, eul);
+				Mat4ToSize(ownermat, size);
+				
+				/* determine where in range current transforms lie */
+				if (data->expo) {
+					for (i=0; i<3; i++) {
+						if (data->from_max[i] - data->from_min[i])
+							sval[i]= (dvec[i] - data->from_min[i]) / (data->from_max[i] - data->from_min[i]);
+						else
+							sval[i]= 0.0f;
+					}
+				}
+				else {
+					/* clamp transforms out of range */
+					for (i=0; i<3; i++) {
+						CLAMP(dvec[i], data->from_min[i], data->from_max[i]);
+						if (data->from_max[i] - data->from_min[i])
+							sval[i]= (dvec[i] - data->from_min[i]) / (data->from_max[i] - data->from_min[i]);
+						else
+							sval[i]= 0.0f;
+					}
+				}
+				
+				/* convert radian<->degree */
+				if (data->from==1 && data->to==0) {
+					/* from radians to degrees */
+					for (i=0; i<3; i++) 
+						sval[i] = sval[i] / M_PI * 180;
+				}
+				else if (data->from==0 && data->to==1) {
+					/* from degrees to radians */
+					for (i=0; i<3; i++) 
+						sval[i] = sval[i] / 180 * M_PI;
+				}
+				else if (data->from == data->to == 1) {
+					/* degrees to radians */
+					for (i=0; i<3; i++) 
+						sval[i] = sval[i] / 180 * M_PI;
+				}
+				
+				/* apply transforms */
+				switch (data->to) {
+					case 2: /* scaling */
+						for (i=0; i<3; i++)
+							size[i]= data->to_min[i] + (sval[data->map[i]] * (data->to_max[i] - data->to_min[i])); 
+						break;
+					case 1: /* rotation */
+						for (i=0; i<3; i++) {
+							float tmin, tmax;
+							
+							/* convert destination min/max ranges from degrees to radians */
+							tmin= data->to_min[i] / M_PI * 180;
+							tmax= data->to_max[i] / M_PI * 180;
+							
+							eul[i]= tmin + (sval[data->map[i]] * (tmax - tmin)); 
+						}
+						break;
+					default: /* 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]))); 
+						break;
+				}
+				
+				/* apply to matrix */
+				LocEulSizeToMat4(ownermat, loc, eul, size);
+			}
+		}
+		break;
 	default:
-		printf ("Error: Unknown constraint type\n");
+		printf("Error: Unknown constraint type\n");
 		break;
 	}
 }

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2007-07-21 03:54:20 UTC (rev 11326)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2007-07-21 07:26:15 UTC (rev 11327)
@@ -1712,6 +1712,13 @@
 				data->tar = newlibadr(fd, id->lib, data->tar);
 			}
 			break;
+		case CONSTRAINT_TYPE_TRANSFORM:
+			{
+				bTransformConstraint *data;
+				data= ((bTransformConstraint*)con->data);
+				data->tar = newlibadr(fd, id->lib, data->tar);
+			}
+			break;
 		case CONSTRAINT_TYPE_NULL:
 			break;
 		}
@@ -7095,6 +7102,12 @@
 				expand_doit(fd, mainvar, data->tar);
 			}
 			break;
+		case CONSTRAINT_TYPE_TRANSFORM:
+			{
+				bTransformConstraint *data = (bTransformConstraint*)curcon->data;
+				expand_doit(fd, mainvar, data->tar);
+			}
+			break;
 		default:
 			break;
 		}

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2007-07-21 03:54:20 UTC (rev 11326)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2007-07-21 07:26:15 UTC (rev 11327)
@@ -760,6 +760,9 @@
 		case CONSTRAINT_TYPE_CLAMPTO:
 			writestruct(wd, DATA, "bClampToConstraint", 1, con->data);
 			break;
+		case CONSTRAINT_TYPE_TRANSFORM:
+			writestruct(wd, DATA, "bTransformConstraint", 1, con->data);
+			break;
 		default:
 			break;
 		}

Modified: trunk/blender/source/blender/include/butspace.h
===================================================================
--- trunk/blender/source/blender/include/butspace.h	2007-07-21 03:54:20 UTC (rev 11326)
+++ trunk/blender/source/blender/include/butspace.h	2007-07-21 07:26:15 UTC (rev 11327)
@@ -649,6 +649,7 @@
 	B_CONSTRAINT_ADD_CHILDOF,
 	B_CONSTRAINT_ADD_PYTHON,
 	B_CONSTRAINT_ADD_CLAMPTO,
+	B_CONSTRAINT_ADD_TRANSFORM,
 	B_CONSTRAINT_INF
 };
 

Modified: trunk/blender/source/blender/makesdna/DNA_constraint_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2007-07-21 03:54:20 UTC (rev 11326)
+++ trunk/blender/source/blender/makesdna/DNA_constraint_types.h	2007-07-21 07:26:15 UTC (rev 11327)
@@ -210,13 +210,29 @@
 
 /* Child Of Constraint */
 typedef struct bChildOfConstraint {
-	Object 		*tar;			/* object which may/may not be the parent */
+	Object 		*tar;			/* object which will act as parent (or target comes from) */
 	int 		flag;			/* settings */
 	int			pad;
 	float		invmat[4][4];	/* parent-inverse matrix to use */
 	char 		subtarget[32];	/* string to specify a subobject target */
 } bChildOfConstraint;
 
+/* Generic Transform->Transform Constraint */
+typedef struct bTransformConstraint {
+	Object 		*tar;			/* target (i.e. 'driver' object/bone) */
+	char 		subtarget[32];	
+	
+	short		from, to;		/* can be loc(0) , rot(1),  or size(2) */
+	char		map[3];			/* defines which target-axis deform is copied by each owner-axis */
+	char		expo;			/* extrapolate motion? if 0, confine to ranges */
+	
+	float		from_min[3];	/* from_min/max defines range of target transform 	*/
+	float		from_max[3];	/* 	to map on to to_min/max range. 			*/
+	
+	float		to_min[3];		/* range of motion on owner caused by target  */
+	float		to_max[3];	
+} bTransformConstraint;
+
 /* transform limiting constraints - zero target ----------------------------  */
 /* Limit Location Constraint */
 typedef struct bLocLimitConstraint {
@@ -247,26 +263,27 @@
 
 /* bConstraint.type */
 #define CONSTRAINT_TYPE_NULL		0
-#define CONSTRAINT_TYPE_CHILDOF		1	/* Unimplemented non longer :) - during constraints recode, Aligorith */
+#define CONSTRAINT_TYPE_CHILDOF		1		/* Unimplemented non longer :) - during constraints recode, Aligorith */
 #define CONSTRAINT_TYPE_TRACKTO		2	
 #define CONSTRAINT_TYPE_KINEMATIC	3	
 #define CONSTRAINT_TYPE_FOLLOWPATH	4
-#define CONSTRAINT_TYPE_ROTLIMIT	5	/* Unimplemented no longer :) - Aligorith */
-#define CONSTRAINT_TYPE_LOCLIMIT	6	/* Unimplemented no longer :) - Aligorith */
-#define CONSTRAINT_TYPE_SIZELIMIT	7	/* Unimplemented no longer :) - Aligorith */
+#define CONSTRAINT_TYPE_ROTLIMIT	5		/* Unimplemented no longer :) - Aligorith */
+#define CONSTRAINT_TYPE_LOCLIMIT	6		/* Unimplemented no longer :) - Aligorith */
+#define CONSTRAINT_TYPE_SIZELIMIT	7		/* Unimplemented no longer :) - Aligorith */
 #define CONSTRAINT_TYPE_ROTLIKE		8	
 #define CONSTRAINT_TYPE_LOCLIKE		9	
 #define CONSTRAINT_TYPE_SIZELIKE	10
-#define CONSTRAINT_TYPE_PYTHON		11	/* Unimplemented no longer :) - Aligorith. Scripts */
+#define CONSTRAINT_TYPE_PYTHON		11		/* Unimplemented no longer :) - Aligorith. Scripts */
 #define CONSTRAINT_TYPE_ACTION		12
-#define CONSTRAINT_TYPE_LOCKTRACK	13	/* New Tracking constraint that locks an axis in place - theeth */
-#define CONSTRAINT_TYPE_DISTANCELIMIT	14 /* was never properly coded - removed! */
-#define CONSTRAINT_TYPE_STRETCHTO	15  /* claiming this to be mine :) is in tuhopuu bjornmose */ 
-#define CONSTRAINT_TYPE_MINMAX      16  /* floor constraint */
-#define CONSTRAINT_TYPE_RIGIDBODYJOINT 17 /* rigidbody constraint */
-#define CONSTRAINT_TYPE_CLAMPTO		18  /* clampto constraint */		
+#define CONSTRAINT_TYPE_LOCKTRACK	13		/* New Tracking constraint that locks an axis in place - theeth */
+#define CONSTRAINT_TYPE_DISTANCELIMIT 14 	/* was never properly coded - removed! */
+#define CONSTRAINT_TYPE_STRETCHTO	15  	/* claiming this to be mine :) is in tuhopuu bjornmose */ 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list