Revision: 23151
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23151
Author:   campbellbarton
Date:     2009-09-12 16:12:37 +0200 (Sat, 12 Sep 2009)

Log Message:
-----------
new struct PathPoint for each path element (replaces float[4]), Paths now store 
radius and quaternion
Added optional quat and radius args to anim.c's where_on_path(...), currently 
unused.

also cleanup some warnings.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_anim.h
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/font.c
    trunk/blender/source/blender/blenkernel/intern/lattice.c
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/blenkernel/intern/particle_system.c
    trunk/blender/source/blender/blenkernel/intern/smoke.c
    trunk/blender/source/blender/blenlib/BLI_arithb.h
    trunk/blender/source/blender/blenlib/intern/arithb.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/makesdna/DNA_curve_types.h

Modified: trunk/blender/source/blender/blenkernel/BKE_anim.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_anim.h  2009-09-12 13:27:26 UTC 
(rev 23150)
+++ trunk/blender/source/blender/blenkernel/BKE_anim.h  2009-09-12 14:12:37 UTC 
(rev 23151)
@@ -51,7 +51,7 @@
 void free_path(struct Path *path);
 void calc_curvepath(struct Object *ob);
 int interval_test(int min, int max, int p1, int cycl);
-int where_on_path(struct Object *ob, float ctime, float *vec, float *dir);
+int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, 
float *quat, float *radius);
 
 struct ListBase *object_duplilist(struct Scene *sce, struct Object *ob);
 void free_object_duplilist(struct ListBase *lb);

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c       2009-09-12 
13:27:26 UTC (rev 23150)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c       2009-09-12 
14:12:37 UTC (rev 23151)
@@ -87,15 +87,16 @@
 void calc_curvepath(Object *ob)
 {
        BevList *bl;
-       BevPoint *bevp, *bevpn, *bevpfirst, *bevplast, *tempbevp;
+       BevPoint *bevp, *bevpn, *bevpfirst, *bevplast;
+       PathPoint *pp;
        Curve *cu;
        Nurb *nu;
        Path *path;
        float *fp, *dist, *maxdist, xyz[3];
        float fac, d=0, fac1, fac2;
        int a, tot, cycl=0;
-       float *ft;
        
+
        /* in a path vertices are with equal differences: path->len = number of 
verts */
        /* NOW WITH BEVELCURVE!!! */
        
@@ -145,7 +146,7 @@
 
                /* the path verts  in path->data */
                /* now also with TILT value */
-       ft= path->data = (float *)MEM_callocN(16*path->len, "pathdata");
+       pp= path->data = (PathPoint 
*)MEM_callocN(sizeof(PathPoint)*4*path->len, "pathdata"); // XXX - why *4? - in 
2.4x each element was 4 and the size was 16, so better leave for now - Campbell
        
        bevp= bevpfirst;
        bevpn= bevp+1;
@@ -175,10 +176,13 @@
                fac1= fac2/fac1;
                fac2= 1.0f-fac1;
 
-               VecLerpf(ft, bevp->vec, bevpn->vec, fac2);
-               ft[3]= fac1*bevp->alfa+ fac2*(bevpn)->alfa;
+               VecLerpf(pp->vec, bevp->vec, bevpn->vec, fac2);
+               pp->vec[3]= fac1*bevp->alfa + fac2*bevpn->alfa;
+               pp->radius= fac1*bevp->radius + fac2*bevpn->radius;
+               QuatInterpol(pp->quat, bevp->quat, bevpn->quat, fac2);
+               NormalQuat(pp->quat);
                
-               ft+= 4;
+               pp++;
        }
        
        MEM_freeN(dist);
@@ -202,13 +206,14 @@
 
 /* warning, *vec needs FOUR items! */
 /* ctime is normalized range <0-1> */
-int where_on_path(Object *ob, float ctime, float *vec, float *dir)     /* 
returns OK */
+int where_on_path(Object *ob, float ctime, float *vec, float *dir, float 
*quat, float *radius) /* returns OK */
 {
        Curve *cu;
        Nurb *nu;
        BevList *bl;
        Path *path;
-       float *fp, *p0, *p1, *p2, *p3, fac;
+       PathPoint *pp, *p0, *p1, *p2, *p3;
+       float fac;
        float data[4];
        int cycl=0, s0, s1, s2, s3;
 
@@ -219,7 +224,7 @@
                return 0;
        }
        path= cu->path;
-       fp= path->data;
+       pp= path->data;
        
        /* test for cyclic */
        bl= cu->bev.first;
@@ -238,19 +243,19 @@
        s2= interval_test(0, path->len-1-cycl, s1+1, cycl);
        s3= interval_test(0, path->len-1-cycl, s1+2, cycl);
 
-       p0= fp + 4*s0;
-       p1= fp + 4*s1;
-       p2= fp + 4*s2;
-       p3= fp + 4*s3;
+       p0= pp + s0;
+       p1= pp + s1;
+       p2= pp + s2;
+       p3= pp + s3;
 
        /* note, commented out for follow constraint */
        //if(cu->flag & CU_FOLLOW) {
                
                key_curve_tangent_weights(1.0f-fac, data, KEY_BSPLINE);
                
-               dir[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + 
data[3]*p3[0] ;
-               dir[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + 
data[3]*p3[1] ;
-               dir[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + 
data[3]*p3[2] ;
+               dir[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + 
data[2]*p2->vec[0] + data[3]*p3->vec[0] ;
+               dir[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + 
data[2]*p2->vec[1] + data[3]*p3->vec[1] ;
+               dir[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + 
data[2]*p2->vec[2] + data[3]*p3->vec[2] ;
                
                /* make compatible with vectoquat */
                dir[0]= -dir[0];
@@ -266,12 +271,31 @@
        else if(s0==s1 || p2==p3) key_curve_position_weights(1.0f-fac, data, 
KEY_CARDINAL);
        else key_curve_position_weights(1.0f-fac, data, KEY_BSPLINE);
 
-       vec[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ;
-       vec[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ;
-       vec[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + data[3]*p3[2] ;
+       vec[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + data[2]*p2->vec[0] + 
data[3]*p3->vec[0] ; /* X */
+       vec[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + 
data[3]*p3->vec[1] ; /* Y */
+       vec[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + 
data[3]*p3->vec[2] ; /* Z */
+       vec[3]= data[0]*p0->vec[3] + data[1]*p1->vec[3] + data[2]*p2->vec[3] + 
data[3]*p3->vec[3] ; /* Tilt, should not be needed since we have quat still 
used */
+       /* Need to verify the quat interpolation is correct - XXX */
 
-       vec[3]= data[0]*p0[3] + data[1]*p1[3] + data[2]*p2[3] + data[3]*p3[3] ;
+       if (quat) {
+               float totfac, q1[4], q2[4];
 
+               totfac= data[0]+data[1];
+               QuatInterpol(q1, p0->quat, p1->quat, data[0] / totfac);
+               NormalQuat(q1);
+
+               totfac= data[2]+data[3];
+               QuatInterpol(q2, p2->quat, p3->quat, data[2] / totfac);
+               NormalQuat(q2);
+
+               totfac = data[0]+data[1]+data[2]+data[3];
+               QuatInterpol(quat, q1, q2, (data[0]+data[1]) / totfac);
+               NormalQuat(quat);
+       }
+
+       if(radius)
+               *radius= data[0]*p0->radius + data[1]*p1->radius + 
data[2]*p2->radius + data[3]*p3->radius;
+
        return 1;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c 2009-09-12 
13:27:26 UTC (rev 23150)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c 2009-09-12 
14:12:37 UTC (rev 23151)
@@ -1174,7 +1174,7 @@
                 */
                
                /* only happens on reload file, but violates depsgraph still... 
fix! */
-               if (cu->path==NULL || cu->path->data==NULL) 
+               if (cu->path==NULL || cu->path->data==NULL)
                        makeDispListCurveTypes(cob->scene, ct->tar, 0);
                
                if (cu->path && cu->path->data) {
@@ -1196,7 +1196,7 @@
                                curvetime= data->offset; // XXX might need a 
more sensible value
                        }
                        
-                       if ( where_on_path(ct->tar, curvetime, vec, dir) ) {
+                       if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, 
NULL) ) {
                                if (data->followflag & FOLLOWPATH_FOLLOW) {
                                        vectoquat(dir, (short) data->trackflag, 
(short) data->upflag, quat);
                                        
@@ -2864,7 +2864,7 @@
                 */
                
                /* only happens on reload file, but violates depsgraph still... 
fix! */
-               if (cu->path==NULL || cu->path->data==NULL) 
+               if (cu->path==NULL || cu->path->data==NULL)
                        makeDispListCurveTypes(cob->scene, ct->tar, 0);
        }
        
@@ -2975,7 +2975,7 @@
                        }
                        
                        /* 3. position on curve */
-                       if (where_on_path(ct->tar, curvetime, vec, dir) ) {
+                       if (where_on_path(ct->tar, curvetime, vec, dir, NULL, 
NULL) ) {
                                Mat4One(totmat);
                                VECCOPY(totmat[3], vec);
                                

Modified: trunk/blender/source/blender/blenkernel/intern/font.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/font.c       2009-09-12 
13:27:26 UTC (rev 23150)
+++ trunk/blender/source/blender/blenkernel/intern/font.c       2009-09-12 
14:12:37 UTC (rev 23151)
@@ -1039,8 +1039,8 @@
 
                                /* calc the right loc AND the right rot 
separately */
                                /* vec, tvec need 4 items */
-                               where_on_path(cu->textoncurve, ctime, vec, 
tvec);
-                               where_on_path(cu->textoncurve, ctime+dtime, 
tvec, rotvec);
+                               where_on_path(cu->textoncurve, ctime, vec, 
tvec, NULL, NULL);
+                               where_on_path(cu->textoncurve, ctime+dtime, 
tvec, rotvec, NULL, NULL);
                                
                                VecMulf(vec, sizefac);
                                

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c    2009-09-12 
13:27:26 UTC (rev 23150)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c    2009-09-12 
14:12:37 UTC (rev 23151)
@@ -472,7 +472,7 @@
 }
 
 /* this makes sure we can extend for non-cyclic. *vec needs 4 items! */
-static int where_on_path_deform(Object *ob, float ctime, float *vec, float 
*dir)       /* returns OK */
+static int where_on_path_deform(Object *ob, float ctime, float *vec, float 
*dir, float *quat, float *radius)   /* returns OK */
 {
        Curve *cu= ob->data;
        BevList *bl;
@@ -490,21 +490,25 @@
        else ctime1= ctime;
        
        /* vec needs 4 items */
-       if(where_on_path(ob, ctime1, vec, dir)) {
+       if(where_on_path(ob, ctime1, vec, dir, quat, radius)) {
                
                if(cycl==0) {
                        Path *path= cu->path;
                        float dvec[3];
                        
                        if(ctime < 0.0) {
-                               VecSubf(dvec, path->data+4, path->data);
+                               VecSubf(dvec, path->data[1].vec, 
path->data[0].vec);
                                VecMulf(dvec, ctime*(float)path->len);
                                VECADD(vec, vec, dvec);
+                               if(quat) QUATCOPY(quat, path->data[0].quat);
+                               if(radius) *radius= path->data[0].radius;
                        }
                        else if(ctime > 1.0) {
-                               VecSubf(dvec, path->data+4*path->len-4, 
path->data+4*path->len-8);
+                               VecSubf(dvec, path->data[path->len-1].vec, 
path->data[path->len-2].vec);
                                VecMulf(dvec, (ctime-1.0)*(float)path->len);
                                VECADD(vec, vec, dvec);
+                               if(quat) QUATCOPY(quat, 
path->data[path->len-1].quat);
+                               if(radius) *radius= 
path->data[path->len-1].radius;
                        }
                }
                return 1;
@@ -575,7 +579,7 @@
        }
 #endif // XXX old animation system
        
-       if( where_on_path_deform(par, fac, loc, dir)) { /* returns OK */
+       if( where_on_path_deform(par, fac, loc, dir, NULL, NULL)) {     /* 
returns OK */
                float q[4], mat[3][3], quat[4];
                
                if(cd->no_rot_axis)     /* set by caller */

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c     2009-09-12 
13:27:26 UTC (rev 23150)
+++ trunk/blender/source/blender/blenkernel/intern/object.c     2009-09-12 
14:12:37 UTC (rev 23151)
@@ -1114,7 +1114,7 @@
        }
 
        if(psys->clmd) {
-               ClothModifierData *nclmd = modifier_new(eModifierType_Cloth);
+               ClothModifierData *nclmd = (ClothModifierData 
*)modifier_new(eModifierType_Cloth);
                modifier_copyData((ModifierData*)psys->clmd, 
(ModifierData*)nclmd);
                psys->hair_in_dm = psys->hair_out_dm = NULL;
        }
@@ -1694,7 +1694,7 @@
        
        
        /* vec: 4 items! */
-       if( where_on_path(par, ctime, vec, dir) ) {
+       if( where_on_path(par, ctime, vec, dir, NULL, NULL) ) {
 

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