[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26638] trunk/blender/source/blender/ blenloader/intern/readfile.c: Constraints Loading:

Joshua Leung aligorith at gmail.com
Sat Feb 6 12:50:39 CET 2010


Revision: 26638
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26638
Author:   aligorith
Date:     2010-02-06 12:50:39 +0100 (Sat, 06 Feb 2010)

Log Message:
-----------
Constraints Loading:

Refactored the constraints reading code to take advantage of the new ID loopers. Now, adding a new constraint type will not require much effort with the file loading code, unless the constraint uses any special direct data which needs to be handled differently.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-02-06 11:28:22 UTC (rev 26637)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-02-06 11:50:39 UTC (rev 26638)
@@ -2137,10 +2137,24 @@
 
 /* ************ READ ARMATURE ***************** */
 
+/* temp struct used to transport needed info to lib_link_constraint_cb() */
+typedef struct tConstraintLinkData {
+	FileData *fd;
+	ID *id;
+} tConstraintLinkData;
+/* callback function used to relink constraint ID-links */
+static void lib_link_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+{
+	tConstraintLinkData *cld= (tConstraintLinkData *)userdata;
+	*idpoin = newlibadr(cld->fd, cld->id->lib, *idpoin);
+}
+
 static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
 {
+	tConstraintLinkData cld;
 	bConstraint *con;
-
+	
+	/* legacy fixes */
 	for (con = conlist->first; con; con=con->next) {
 		/* patch for error introduced by changing constraints (dunno how) */
 		/* if con->data type changes, dna cannot resolve the pointer! (ton) */
@@ -2149,188 +2163,52 @@
 		}
 		/* own ipo, all constraints have it */
 		con->ipo= newlibadr_us(fd, id->lib, con->ipo); // XXX depreceated - old animation system
+	}
+	
+	/* relink all ID-blocks used by the constraints */
+	cld.fd= fd;
+	cld.id= id;
+	
+	id_loop_constraints(conlist, lib_link_constraint_cb, &cld);
+}
+
+static void direct_link_constraints(FileData *fd, ListBase *lb)
+{
+	bConstraint *con;
+
+	link_list(fd, lb);
+	for (con=lb->first; con; con=con->next) {
+		con->data = newdataadr(fd, con->data);
 		
 		switch (con->type) {
-		case CONSTRAINT_TYPE_PYTHON:
+			case CONSTRAINT_TYPE_PYTHON:
 			{
-				bPythonConstraint *data= (bPythonConstraint*)con->data;
-				bConstraintTarget *ct;
+				bPythonConstraint *data= con->data;
 				
-				for (ct= data->targets.first; ct; ct= ct->next)
-					ct->tar = newlibadr(fd, id->lib, ct->tar);
-					
-				data->text = newlibadr(fd, id->lib, data->text);
-				//IDP_LibLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+				link_list(fd, &data->targets);
+				
+				data->prop = newdataadr(fd, data->prop);
+				if (data->prop)
+					IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
 			}
-			break;
-		case CONSTRAINT_TYPE_ACTION:
+				break;
+			case CONSTRAINT_TYPE_SPLINEIK:
 			{
-				bActionConstraint *data;
-				data= ((bActionConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-				data->act = newlibadr(fd, id->lib, data->act);
+				bSplineIKConstraint *data= con->data;
+				
+				data->points= newdataadr(fd, data->points);
 			}
-			break;
-		case CONSTRAINT_TYPE_LOCLIKE:
+				break;
+			case CONSTRAINT_TYPE_KINEMATIC:
 			{
-				bLocateLikeConstraint *data;
-				data= ((bLocateLikeConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_ROTLIKE:
-			{
-				bRotateLikeConstraint *data;
-				data= ((bRotateLikeConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_SIZELIKE:
-			{
-				bSizeLikeConstraint *data;
-				data= ((bSizeLikeConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_KINEMATIC:
-			{
-				bKinematicConstraint *data;
-				data = ((bKinematicConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-				data->poletar = newlibadr(fd, id->lib, data->poletar);
 				con->lin_error = 0.f;
 				con->rot_error = 0.f;
 			}
-			break;
-		case CONSTRAINT_TYPE_TRACKTO:
-			{
-				bTrackToConstraint *data;
-				data = ((bTrackToConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_MINMAX:
-			{
-				bMinMaxConstraint *data;
-				data = ((bMinMaxConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_LOCKTRACK:
-			{
-				bLockTrackConstraint *data;
-				data= ((bLockTrackConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_FOLLOWPATH:
-			{
-				bFollowPathConstraint *data;
-				data= ((bFollowPathConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_STRETCHTO:
-			{
-				bStretchToConstraint *data;
-				data= ((bStretchToConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_RIGIDBODYJOINT:
-			{
-				bRigidBodyJointConstraint *data;
-				data= ((bRigidBodyJointConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_CLAMPTO:
-			{
-				bClampToConstraint *data;
-				data= ((bClampToConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_CHILDOF:
-			{
-				bChildOfConstraint *data;
-				data= ((bChildOfConstraint*)con->data);
-				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_DISTLIMIT:
-			{
-				bDistLimitConstraint *data;
-				data= ((bDistLimitConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_SHRINKWRAP:
-			{
-				bShrinkwrapConstraint *data;
-				data= ((bShrinkwrapConstraint*)con->data);
-				data->target = newlibadr(fd, id->lib, data->target);
-			}
-			break;
-		case CONSTRAINT_TYPE_DAMPTRACK:
-			{
-				bDampTrackConstraint *data;
-				data= ((bDampTrackConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_SPLINEIK:
-			{
-				bSplineIKConstraint *data;
-				data= ((bSplineIKConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_TRANSLIKE:
-			{
-				bTransLikeConstraint *data;
-				data= ((bTransLikeConstraint*)con->data);
-				data->tar = newlibadr(fd, id->lib, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_NULL:
-			break;
+				break;
 		}
 	}
 }
 
-static void direct_link_constraints(FileData *fd, ListBase *lb)
-{
-	bConstraint *cons;
-
-	link_list(fd, lb);
-	for (cons=lb->first; cons; cons=cons->next) {
-		cons->data = newdataadr(fd, cons->data);
-		
-		if (cons->type == CONSTRAINT_TYPE_PYTHON) {
-			bPythonConstraint *data= cons->data;
-			
-			link_list(fd, &data->targets);
-			
-			data->prop = newdataadr(fd, data->prop);
-			if (data->prop)
-				IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
-		}
-		else if (cons->type == CONSTRAINT_TYPE_SPLINEIK) {
-			bSplineIKConstraint *data= cons->data;
-			
-			data->points= newdataadr(fd, data->points);
-		}
-	}
-}
-
 static void lib_link_pose(FileData *fd, Object *ob, bPose *pose)
 {
 	bPoseChannel *pchan;
@@ -11317,148 +11195,33 @@
 	}
 }
 
+/* temp struct used to transport needed info to expand_constraint_cb() */
+typedef struct tConstraintExpandData {
+	FileData *fd;
+	Main *mainvar;
+} tConstraintExpandData;
+/* callback function used to expand constraint ID-links */
+static void expand_constraint_cb(bConstraint *con, ID **idpoin, void *userdata)
+{
+	tConstraintExpandData *ced= (tConstraintExpandData *)userdata;
+	expand_doit(ced->fd, ced->mainvar, *idpoin);
+}
+
 static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
 {
+	tConstraintExpandData ced;
 	bConstraint *curcon;
-
+	
+	/* relink all ID-blocks used by the constraints */
+	ced.fd= fd;
+	ced.mainvar= mainvar;
+	
+	id_loop_constraints(lb, expand_constraint_cb, &ced);
+	
+	/* depreceated manual expansion stuff */
 	for (curcon=lb->first; curcon; curcon=curcon->next) {
-		
 		if (curcon->ipo)
 			expand_doit(fd, mainvar, curcon->ipo); // XXX depreceated - old animation system
-		
-		switch (curcon->type) {
-		case CONSTRAINT_TYPE_NULL:
-			break;
-		case CONSTRAINT_TYPE_PYTHON:
-			{
-				bPythonConstraint *data = (bPythonConstraint*)curcon->data;
-				bConstraintTarget *ct;
-				
-				for (ct= data->targets.first; ct; ct= ct->next)
-					expand_doit(fd, mainvar, ct->tar);
-				
-				expand_doit(fd, mainvar, data->text);
-			}
-			break;
-		case CONSTRAINT_TYPE_ACTION:
-			{
-				bActionConstraint *data = (bActionConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-				expand_doit(fd, mainvar, data->act);
-			}
-			break;
-		case CONSTRAINT_TYPE_LOCLIKE:
-			{
-				bLocateLikeConstraint *data = (bLocateLikeConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_ROTLIKE:
-			{
-				bRotateLikeConstraint *data = (bRotateLikeConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_SIZELIKE:
-			{
-				bSizeLikeConstraint *data = (bSizeLikeConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_KINEMATIC:
-			{
-				bKinematicConstraint *data = (bKinematicConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-				expand_doit(fd, mainvar, data->poletar);
-			}
-			break;
-		case CONSTRAINT_TYPE_TRACKTO:
-			{
-				bTrackToConstraint *data = (bTrackToConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_MINMAX:
-			{
-				bMinMaxConstraint *data = (bMinMaxConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_LOCKTRACK:
-			{
-				bLockTrackConstraint *data = (bLockTrackConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_FOLLOWPATH:
-			{
-				bFollowPathConstraint *data = (bFollowPathConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_STRETCHTO:
-			{
-				bStretchToConstraint *data = (bStretchToConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_RIGIDBODYJOINT:
-			{
-				bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint*)curcon->data;
-				expand_doit(fd, mainvar, data->tar);
-			}
-			break;
-		case CONSTRAINT_TYPE_CLAMPTO:
-			{
-				bClampToConstraint *data = (bClampToConstraint*)curcon->data;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list