[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