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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to