[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23151] trunk/blender/source/blender: new struct PathPoint for each path element (replaces float[4]), Paths now store radius and quaternion

Campbell Barton ideasman42 at gmail.com
Sat Sep 12 16:12:37 CEST 2009


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




More information about the Bf-blender-cvs mailing list