[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13890] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Feb 27 15:17:32 CET 2008


Revision: 13890
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13890
Author:   blendix
Date:     2008-02-27 15:17:32 +0100 (Wed, 27 Feb 2008)

Log Message:
-----------

Fix for bug: cross platform strand render differences with kink/branch.
This time is was due to different accuracy of floating point computation,
now it uses does a comparison a bit different to avoid this.

Also changed the vectoquat function to be threadsafe.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/anim.c
    trunk/blender/source/blender/blenkernel/intern/constraint.c
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/exotic.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/blenlib/BLI_arithb.h
    trunk/blender/source/blender/blenlib/intern/arithb.c
    trunk/blender/source/blender/python/api2_2x/vector.c

Modified: trunk/blender/source/blender/blenkernel/intern/anim.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/anim.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/anim.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -387,7 +387,7 @@
 {
 	DupliObject *dob;
 	struct vertexDupliData *vdd= userData;
-	float vec[3], *q2, mat[3][3], tmat[4][4], obmat[4][4];
+	float vec[3], q2[4], mat[3][3], tmat[4][4], obmat[4][4];
 	
 	VECCOPY(vec, co);
 	Mat4MulVecfl(vdd->pmat, vec);
@@ -405,7 +405,7 @@
 			vec[0]= -no_s[0]; vec[1]= -no_s[1]; vec[2]= -no_s[2];
 		}
 		
-		q2= vectoquat(vec, vdd->ob->trackflag, vdd->ob->upflag);
+		vectoquat(vec, vdd->ob->trackflag, vdd->ob->upflag, q2);
 		
 		QuatToMat3(q2, mat);
 		Mat4CpyMat4(tmat, obmat);
@@ -737,7 +737,7 @@
 	float ctime, pa_time, scale = 1.0f;
 	float tmat[4][4], mat[4][4], obrotmat[4][4], pamat[4][4], size=0.0;
 	float obmat[4][4], (*obmatlist)[4][4]=0;
-	float xvec[3] = {-1.0, 0.0, 0.0}, *q;
+	float xvec[3] = {-1.0, 0.0, 0.0}, q[4];
 	int lay, a, b, k, step_nbr = 0, counter, hair = 0;
 	int totpart, totchild, totgroup=0, pa_num;
 
@@ -891,7 +891,7 @@
 					where_is_object_time(ob, ctime-pa_time);
 					
 					if(!hair) {
-						q = vectoquat(xvec, ob->trackflag, ob->upflag);
+						vectoquat(xvec, ob->trackflag, ob->upflag, q);
 						QuatToMat4(q, obrotmat);
 						obrotmat[3][3]= 1.0f;
 						Mat4MulMat4(mat, obrotmat, pamat);

Modified: trunk/blender/source/blender/blenkernel/intern/constraint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/constraint.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/constraint.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -1259,7 +1259,7 @@
 	
 	if (VALID_CONS_TARGET(ct)) {
 		Curve *cu= ct->tar->data;
-		float q[4], vec[4], dir[3], *quat, x1;
+		float q[4], vec[4], dir[3], quat[4], x1;
 		float totmat[4][4];
 		float curvetime;
 		
@@ -1284,7 +1284,7 @@
 			
 			if ( where_on_path(ct->tar, curvetime, vec, dir) ) {
 				if (data->followflag) {
-					quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag);
+					vectoquat(dir, (short) data->trackflag, (short) data->upflag, quat);
 					
 					Normalize(dir);
 					q[0]= (float)cos(0.5*vec[3]);

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -1788,13 +1788,13 @@
 			bevp2->cosa= bevp1->cosa;
 
 			if(cu->flag & CU_3D) {	/* 3D */
-				float *quat, q[4];
+				float quat[4], q[4];
 			
 				vec[0]= bevp1->x - bevp2->x;
 				vec[1]= bevp1->y - bevp2->y;
 				vec[2]= bevp1->z - bevp2->z;
 				
-				quat= vectoquat(vec, 5, 1);
+				vectoquat(vec, 5, 1, quat);
 				
 				Normalize(vec);
 				q[0]= (float)cos(0.5*bevp1->alfa);
@@ -1820,7 +1820,7 @@
 			while(nr--) {
 	
 				if(cu->flag & CU_3D) {	/* 3D */
-					float *quat, q[4];
+					float quat[4], q[4];
 				
 					vec[0]= bevp2->x - bevp0->x;
 					vec[1]= bevp2->y - bevp0->y;
@@ -1828,7 +1828,7 @@
 					
 					Normalize(vec);
 
-					quat= vectoquat(vec, 5, 1);
+					vectoquat(vec, 5, 1, quat);
 					
 					q[0]= (float)cos(0.5*bevp1->alfa);
 					x1= (float)sin(0.5*bevp1->alfa);

Modified: trunk/blender/source/blender/blenkernel/intern/exotic.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/exotic.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/exotic.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -878,7 +878,7 @@
 	Object *ob;
 	Lamp *la;
 	FILE *fp;
-	float vec[3], *q1;
+	float vec[3], q1[4];
 	int tot, val;
 	char s[50];
 	
@@ -906,7 +906,7 @@
 		
 		fscanf(fp, "%f %f %f\n", ob->loc, ob->loc+1, ob->loc+2);
 		val= fscanf(fp, "%f %f %f\n", vec, vec+1, vec+2);
-		q1= vectoquat(vec, 5, 2);
+		vectoquat(vec, 5, 2, q1);
 		QuatToEul(q1, ob->rot);
 		
 		if(val<=0) break;

Modified: trunk/blender/source/blender/blenkernel/intern/lattice.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/lattice.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/lattice.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -575,14 +575,13 @@
 	}
 	
 	if( where_on_path_deform(par, fac, loc, dir)) {	/* returns OK */
-		float q[4], mat[3][3];
-		float *quat;
+		float q[4], mat[3][3], quat[4];
 		
 		if(cd->no_rot_axis)	/* set by caller */
 			dir[cd->no_rot_axis-1]= 0.0f;
 		
 		/* -1 for compatibility with old track defines */
-		quat= vectoquat(dir, axis-1, upflag);	/* gives static quat */
+		vectoquat(dir, axis-1, upflag, quat);
 		
 		/* the tilt */
 		if(loc[3]!=0.0) {

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -1438,7 +1438,7 @@
 static void ob_parcurve(Object *ob, Object *par, float mat[][4])
 {
 	Curve *cu;
-	float q[4], vec[4], dir[3], *quat, x1, ctime;
+	float q[4], vec[4], dir[3], quat[4], x1, ctime;
 	float timeoffs = 0.0, sf_orig = 0.0;
 	
 	Mat4One(mat);
@@ -1487,7 +1487,7 @@
  	if( where_on_path(par, ctime, vec, dir) ) {
 
 		if(cu->flag & CU_FOLLOW) {
-			quat= vectoquat(dir, ob->trackflag, ob->upflag);
+			vectoquat(dir, ob->trackflag, ob->upflag, quat);
 			
 			/* the tilt */
 			Normalize(dir);
@@ -1887,13 +1887,13 @@
 }
 void solve_tracking (Object *ob, float targetmat[][4])
 {
-	float *quat;
+	float quat[4];
 	float vec[3];
 	float totmat[3][3];
 	float tmat[4][4];
 	
 	VecSubf(vec, ob->obmat[3], targetmat[3]);
-	quat= vectoquat(vec, ob->trackflag, ob->upflag);
+	vectoquat(vec, ob->trackflag, ob->upflag, quat);
 	QuatToMat3(quat, totmat);
 	
 	if(ob->parent && (ob->transflag & OB_POWERTRACK)) {

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-27 14:15:14 UTC (rev 13889)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2008-02-27 14:17:32 UTC (rev 13890)
@@ -1369,7 +1369,7 @@
 }
 static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, short type, short axis, float obmat[][4])
 {
-	float vec[3]={0.0,0.0,0.0}, q1[4]={1,0,0,0},*q2;
+	float vec[3]={0.0,0.0,0.0}, q1[4]={1,0,0,0},q2[4];
 	float t;
 
 	CLAMP(time,0.0,1.0);
@@ -1391,10 +1391,9 @@
 		case PART_KINK_CURL:
 			vec[axis]=1.0;
 			if(par_rot)
-				q2=par_rot;
-			else{
-				q2=vectoquat(par->vel,axis,(axis+1)%3);
-			}
+				QUATCOPY(q2,par_rot)
+			else
+				vectoquat(par->vel,axis,(axis+1)%3, q2);
 			QuatMulVecf(q2,vec);
 			VecMulf(vec,amplitude);
 			VECADD(state->co,state->co,vec);
@@ -1441,9 +1440,9 @@
 				float inp_y,inp_z,length;
 				
 				if(par_rot)
-					q2=par_rot;
+					QUATCOPY(q2,par_rot)
 				else
-					q2=vectoquat(par->vel,axis,(axis+1)%3);
+					vectoquat(par->vel,axis,(axis+1)%3,q2);
 				QuatMulVecf(q2,y_vec);
 				QuatMulVecf(q2,z_vec);
 				
@@ -1592,7 +1591,7 @@
 						VecRotToQuat(guidedir,guidevec[3]-ec->firstloc[3],rot2);
 						QuatMulVecf(rot2,pa_loc);
 
-						//q=vectoquat(guidedir, pd->kink_axis, (pd->kink_axis+1)%3);
+						//vectoquat(guidedir, pd->kink_axis, (pd->kink_axis+1)%3, q);
 						//QuatMul(par.rot,rot2,q);
 					}
 					//else{
@@ -2536,29 +2535,30 @@
 			/* figure out rotation */
 			
 			if(k) {
-				float angle, tangent[3], normal[3], q[4];
+				float cosangle, angle, tangent[3], normal[3], q[4];
 
 				if(k == 1) {
-					float *q2;
-
 					VECSUB(tangent, ca->co, (ca - 1)->co);
 
-					q2 = vectoquat(tangent, OB_POSX, OB_POSZ);
+					vectoquat(tangent, OB_POSX, OB_POSZ, (ca-1)->rot);
 
-					QUATCOPY((ca - 1)->rot, q2);
-
 					VECCOPY(prev_tangent, tangent);
 					Normalize(prev_tangent);
 				}
 				else {
 					VECSUB(tangent, ca->co, (ca - 1)->co);
 					Normalize(tangent);
-					angle = saacos(Inpf(tangent, prev_tangent));
 
-					if((angle > -0.000001) && (angle < 0.000001)){
+					cosangle= Inpf(tangent, prev_tangent);
+
+					/* note we do the comparison on cosangle instead of
+					 * angle, since floating point accuracy makes it give
+					 * different results across platforms */
+					if(cosangle > 0.999999f) {
 						QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
 					}
-					else{
+					else {
+						angle= saacos(cosangle);
 						Crossf(normal, prev_tangent, tangent);
 						VecRotToQuat(normal, angle, q);
 						QuatMul((ca - 1)->rot, q, (ca - 2)->rot);
@@ -2567,9 +2567,8 @@
 					VECCOPY(prev_tangent, tangent);
 				}
 
-				if(k == steps) {
+				if(k == steps)
 					QUATCOPY(ca->rot, (ca - 1)->rot);
-				}
 			}
 
 			
@@ -3412,11 +3411,9 @@
 		//else{
 		//	/* TODO: different rotations */
 		//	float nvel[3];
-		//	float *q2;
 		//	VECCOPY(nvel,state->vel);
 		//	VecMulf(nvel,-1.0f);
-		//	q2=vectoquat(nvel, OB_POSX, OB_POSZ);
-		//	QUATCOPY(state->rot,q2);
+		//	vectoquat(nvel, OB_POSX, OB_POSZ, state->rot);
 		//}
 
 		dfra = keys[2].time - keys[1].time;
@@ -3740,7 +3737,7 @@
 void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
 {
 	float loc[3], nor[3], vec[3], side[3], len, obrotmat[4][4], qmat[4][4];
-	float xvec[3] = {-1.0, 0.0, 0.0}, *q;
+	float xvec[3] = {-1.0, 0.0, 0.0}, q[4];
 
 	VecSubf(vec, (cache+cache->steps-1)->co, cache->co);
 	len= Normalize(vec);
@@ -3756,7 +3753,7 @@
 		if(!pa)
 			pa= psys->particles+cpa->pa[0];
 
-		q = vectoquat(xvec, ob->trackflag, ob->upflag);
+		vectoquat(xvec, ob->trackflag, ob->upflag, q);
 		QuatToMat4(q, obrotmat);
 		obrotmat[3][3]= 1.0f;
 

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2008-02-27 14:15:14 UTC (rev 13889)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list