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.
This commit is contained in:
		| @@ -387,7 +387,7 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n | |||||||
| { | { | ||||||
| 	DupliObject *dob; | 	DupliObject *dob; | ||||||
| 	struct vertexDupliData *vdd= userData; | 	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); | 	VECCOPY(vec, co); | ||||||
| 	Mat4MulVecfl(vdd->pmat, vec); | 	Mat4MulVecfl(vdd->pmat, vec); | ||||||
| @@ -405,7 +405,7 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n | |||||||
| 			vec[0]= -no_s[0]; vec[1]= -no_s[1]; vec[2]= -no_s[2]; | 			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); | 		QuatToMat3(q2, mat); | ||||||
| 		Mat4CpyMat4(tmat, obmat); | 		Mat4CpyMat4(tmat, obmat); | ||||||
| @@ -737,7 +737,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Object *par, float par_ | |||||||
| 	float ctime, pa_time, scale = 1.0f; | 	float ctime, pa_time, scale = 1.0f; | ||||||
| 	float tmat[4][4], mat[4][4], obrotmat[4][4], pamat[4][4], size=0.0; | 	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 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 lay, a, b, k, step_nbr = 0, counter, hair = 0; | ||||||
| 	int totpart, totchild, totgroup=0, pa_num; | 	int totpart, totchild, totgroup=0, pa_num; | ||||||
|  |  | ||||||
| @@ -891,7 +891,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Object *par, float par_ | |||||||
| 					where_is_object_time(ob, ctime-pa_time); | 					where_is_object_time(ob, ctime-pa_time); | ||||||
| 					 | 					 | ||||||
| 					if(!hair) { | 					if(!hair) { | ||||||
| 						q = vectoquat(xvec, ob->trackflag, ob->upflag); | 						vectoquat(xvec, ob->trackflag, ob->upflag, q); | ||||||
| 						QuatToMat4(q, obrotmat); | 						QuatToMat4(q, obrotmat); | ||||||
| 						obrotmat[3][3]= 1.0f; | 						obrotmat[3][3]= 1.0f; | ||||||
| 						Mat4MulMat4(mat, obrotmat, pamat); | 						Mat4MulMat4(mat, obrotmat, pamat); | ||||||
|   | |||||||
| @@ -1259,7 +1259,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr | |||||||
| 	 | 	 | ||||||
| 	if (VALID_CONS_TARGET(ct)) { | 	if (VALID_CONS_TARGET(ct)) { | ||||||
| 		Curve *cu= ct->tar->data; | 		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 totmat[4][4]; | ||||||
| 		float curvetime; | 		float curvetime; | ||||||
| 		 | 		 | ||||||
| @@ -1284,7 +1284,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr | |||||||
| 			 | 			 | ||||||
| 			if ( where_on_path(ct->tar, curvetime, vec, dir) ) { | 			if ( where_on_path(ct->tar, curvetime, vec, dir) ) { | ||||||
| 				if (data->followflag) { | 				if (data->followflag) { | ||||||
| 					quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag); | 					vectoquat(dir, (short) data->trackflag, (short) data->upflag, quat); | ||||||
| 					 | 					 | ||||||
| 					Normalize(dir); | 					Normalize(dir); | ||||||
| 					q[0]= (float)cos(0.5*vec[3]); | 					q[0]= (float)cos(0.5*vec[3]); | ||||||
|   | |||||||
| @@ -1788,13 +1788,13 @@ void makeBevelList(Object *ob) | |||||||
| 			bevp2->cosa= bevp1->cosa; | 			bevp2->cosa= bevp1->cosa; | ||||||
|  |  | ||||||
| 			if(cu->flag & CU_3D) {	/* 3D */ | 			if(cu->flag & CU_3D) {	/* 3D */ | ||||||
| 				float *quat, q[4]; | 				float quat[4], q[4]; | ||||||
| 			 | 			 | ||||||
| 				vec[0]= bevp1->x - bevp2->x; | 				vec[0]= bevp1->x - bevp2->x; | ||||||
| 				vec[1]= bevp1->y - bevp2->y; | 				vec[1]= bevp1->y - bevp2->y; | ||||||
| 				vec[2]= bevp1->z - bevp2->z; | 				vec[2]= bevp1->z - bevp2->z; | ||||||
| 				 | 				 | ||||||
| 				quat= vectoquat(vec, 5, 1); | 				vectoquat(vec, 5, 1, quat); | ||||||
| 				 | 				 | ||||||
| 				Normalize(vec); | 				Normalize(vec); | ||||||
| 				q[0]= (float)cos(0.5*bevp1->alfa); | 				q[0]= (float)cos(0.5*bevp1->alfa); | ||||||
| @@ -1820,7 +1820,7 @@ void makeBevelList(Object *ob) | |||||||
| 			while(nr--) { | 			while(nr--) { | ||||||
| 	 | 	 | ||||||
| 				if(cu->flag & CU_3D) {	/* 3D */ | 				if(cu->flag & CU_3D) {	/* 3D */ | ||||||
| 					float *quat, q[4]; | 					float quat[4], q[4]; | ||||||
| 				 | 				 | ||||||
| 					vec[0]= bevp2->x - bevp0->x; | 					vec[0]= bevp2->x - bevp0->x; | ||||||
| 					vec[1]= bevp2->y - bevp0->y; | 					vec[1]= bevp2->y - bevp0->y; | ||||||
| @@ -1828,7 +1828,7 @@ void makeBevelList(Object *ob) | |||||||
| 					 | 					 | ||||||
| 					Normalize(vec); | 					Normalize(vec); | ||||||
|  |  | ||||||
| 					quat= vectoquat(vec, 5, 1); | 					vectoquat(vec, 5, 1, quat); | ||||||
| 					 | 					 | ||||||
| 					q[0]= (float)cos(0.5*bevp1->alfa); | 					q[0]= (float)cos(0.5*bevp1->alfa); | ||||||
| 					x1= (float)sin(0.5*bevp1->alfa); | 					x1= (float)sin(0.5*bevp1->alfa); | ||||||
|   | |||||||
| @@ -878,7 +878,7 @@ static void read_videoscape_lamp(char *str) | |||||||
| 	Object *ob; | 	Object *ob; | ||||||
| 	Lamp *la; | 	Lamp *la; | ||||||
| 	FILE *fp; | 	FILE *fp; | ||||||
| 	float vec[3], *q1; | 	float vec[3], q1[4]; | ||||||
| 	int tot, val; | 	int tot, val; | ||||||
| 	char s[50]; | 	char s[50]; | ||||||
| 	 | 	 | ||||||
| @@ -906,7 +906,7 @@ static void read_videoscape_lamp(char *str) | |||||||
| 		 | 		 | ||||||
| 		fscanf(fp, "%f %f %f\n", ob->loc, ob->loc+1, ob->loc+2); | 		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); | 		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); | 		QuatToEul(q1, ob->rot); | ||||||
| 		 | 		 | ||||||
| 		if(val<=0) break; | 		if(val<=0) break; | ||||||
|   | |||||||
| @@ -575,14 +575,13 @@ static float *calc_curve_deform(Object *par, float *co, short axis, CurveDeform | |||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	if( where_on_path_deform(par, fac, loc, dir)) {	/* returns OK */ | 	if( where_on_path_deform(par, fac, loc, dir)) {	/* returns OK */ | ||||||
| 		float q[4], mat[3][3]; | 		float q[4], mat[3][3], quat[4]; | ||||||
| 		float *quat; |  | ||||||
| 		 | 		 | ||||||
| 		if(cd->no_rot_axis)	/* set by caller */ | 		if(cd->no_rot_axis)	/* set by caller */ | ||||||
| 			dir[cd->no_rot_axis-1]= 0.0f; | 			dir[cd->no_rot_axis-1]= 0.0f; | ||||||
| 		 | 		 | ||||||
| 		/* -1 for compatibility with old track defines */ | 		/* -1 for compatibility with old track defines */ | ||||||
| 		quat= vectoquat(dir, axis-1, upflag);	/* gives static quat */ | 		vectoquat(dir, axis-1, upflag, quat); | ||||||
| 		 | 		 | ||||||
| 		/* the tilt */ | 		/* the tilt */ | ||||||
| 		if(loc[3]!=0.0) { | 		if(loc[3]!=0.0) { | ||||||
|   | |||||||
| @@ -1438,7 +1438,7 @@ int enable_cu_speed= 1; | |||||||
| static void ob_parcurve(Object *ob, Object *par, float mat[][4]) | static void ob_parcurve(Object *ob, Object *par, float mat[][4]) | ||||||
| { | { | ||||||
| 	Curve *cu; | 	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; | 	float timeoffs = 0.0, sf_orig = 0.0; | ||||||
| 	 | 	 | ||||||
| 	Mat4One(mat); | 	Mat4One(mat); | ||||||
| @@ -1487,7 +1487,7 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4]) | |||||||
|  	if( where_on_path(par, ctime, vec, dir) ) { |  	if( where_on_path(par, ctime, vec, dir) ) { | ||||||
|  |  | ||||||
| 		if(cu->flag & CU_FOLLOW) { | 		if(cu->flag & CU_FOLLOW) { | ||||||
| 			quat= vectoquat(dir, ob->trackflag, ob->upflag); | 			vectoquat(dir, ob->trackflag, ob->upflag, quat); | ||||||
| 			 | 			 | ||||||
| 			/* the tilt */ | 			/* the tilt */ | ||||||
| 			Normalize(dir); | 			Normalize(dir); | ||||||
| @@ -1887,13 +1887,13 @@ static void solve_parenting (Object *ob, Object *par, float obmat[][4], float sl | |||||||
| } | } | ||||||
| void solve_tracking (Object *ob, float targetmat[][4]) | void solve_tracking (Object *ob, float targetmat[][4]) | ||||||
| { | { | ||||||
| 	float *quat; | 	float quat[4]; | ||||||
| 	float vec[3]; | 	float vec[3]; | ||||||
| 	float totmat[3][3]; | 	float totmat[3][3]; | ||||||
| 	float tmat[4][4]; | 	float tmat[4][4]; | ||||||
| 	 | 	 | ||||||
| 	VecSubf(vec, ob->obmat[3], targetmat[3]); | 	VecSubf(vec, ob->obmat[3], targetmat[3]); | ||||||
| 	quat= vectoquat(vec, ob->trackflag, ob->upflag); | 	vectoquat(vec, ob->trackflag, ob->upflag, quat); | ||||||
| 	QuatToMat3(quat, totmat); | 	QuatToMat3(quat, totmat); | ||||||
| 	 | 	 | ||||||
| 	if(ob->parent && (ob->transflag & OB_POWERTRACK)) { | 	if(ob->parent && (ob->transflag & OB_POWERTRACK)) { | ||||||
|   | |||||||
| @@ -1369,7 +1369,7 @@ static float vert_weight(MDeformVert *dvert, int group) | |||||||
| } | } | ||||||
| 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]) | 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; | 	float t; | ||||||
|  |  | ||||||
| 	CLAMP(time,0.0,1.0); | 	CLAMP(time,0.0,1.0); | ||||||
| @@ -1391,10 +1391,9 @@ static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, flo | |||||||
| 		case PART_KINK_CURL: | 		case PART_KINK_CURL: | ||||||
| 			vec[axis]=1.0; | 			vec[axis]=1.0; | ||||||
| 			if(par_rot) | 			if(par_rot) | ||||||
| 				q2=par_rot; | 				QUATCOPY(q2,par_rot) | ||||||
| 			else{ | 			else | ||||||
| 				q2=vectoquat(par->vel,axis,(axis+1)%3); | 				vectoquat(par->vel,axis,(axis+1)%3, q2); | ||||||
| 			} |  | ||||||
| 			QuatMulVecf(q2,vec); | 			QuatMulVecf(q2,vec); | ||||||
| 			VecMulf(vec,amplitude); | 			VecMulf(vec,amplitude); | ||||||
| 			VECADD(state->co,state->co,vec); | 			VECADD(state->co,state->co,vec); | ||||||
| @@ -1441,9 +1440,9 @@ static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, flo | |||||||
| 				float inp_y,inp_z,length; | 				float inp_y,inp_z,length; | ||||||
| 				 | 				 | ||||||
| 				if(par_rot) | 				if(par_rot) | ||||||
| 					q2=par_rot; | 					QUATCOPY(q2,par_rot) | ||||||
| 				else | 				else | ||||||
| 					q2=vectoquat(par->vel,axis,(axis+1)%3); | 					vectoquat(par->vel,axis,(axis+1)%3,q2); | ||||||
| 				QuatMulVecf(q2,y_vec); | 				QuatMulVecf(q2,y_vec); | ||||||
| 				QuatMulVecf(q2,z_vec); | 				QuatMulVecf(q2,z_vec); | ||||||
| 				 | 				 | ||||||
| @@ -1592,7 +1591,7 @@ int do_guide(ParticleKey *state, int pa_num, float time, ListBase *lb) | |||||||
| 						VecRotToQuat(guidedir,guidevec[3]-ec->firstloc[3],rot2); | 						VecRotToQuat(guidedir,guidevec[3]-ec->firstloc[3],rot2); | ||||||
| 						QuatMulVecf(rot2,pa_loc); | 						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); | 						//QuatMul(par.rot,rot2,q); | ||||||
| 					} | 					} | ||||||
| 					//else{ | 					//else{ | ||||||
| @@ -2536,16 +2535,12 @@ void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupda | |||||||
| 			/* figure out rotation */ | 			/* figure out rotation */ | ||||||
| 			 | 			 | ||||||
| 			if(k) { | 			if(k) { | ||||||
| 				float angle, tangent[3], normal[3], q[4]; | 				float cosangle, angle, tangent[3], normal[3], q[4]; | ||||||
|  |  | ||||||
| 				if(k == 1) { | 				if(k == 1) { | ||||||
| 					float *q2; |  | ||||||
|  |  | ||||||
| 					VECSUB(tangent, ca->co, (ca - 1)->co); | 					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); | 					VECCOPY(prev_tangent, tangent); | ||||||
| 					Normalize(prev_tangent); | 					Normalize(prev_tangent); | ||||||
| @@ -2553,12 +2548,17 @@ void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupda | |||||||
| 				else { | 				else { | ||||||
| 					VECSUB(tangent, ca->co, (ca - 1)->co); | 					VECSUB(tangent, ca->co, (ca - 1)->co); | ||||||
| 					Normalize(tangent); | 					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); | 						QUATCOPY((ca - 1)->rot, (ca - 2)->rot); | ||||||
| 					} | 					} | ||||||
| 					else{ | 					else { | ||||||
|  | 						angle= saacos(cosangle); | ||||||
| 						Crossf(normal, prev_tangent, tangent); | 						Crossf(normal, prev_tangent, tangent); | ||||||
| 						VecRotToQuat(normal, angle, q); | 						VecRotToQuat(normal, angle, q); | ||||||
| 						QuatMul((ca - 1)->rot, q, (ca - 2)->rot); | 						QuatMul((ca - 1)->rot, q, (ca - 2)->rot); | ||||||
| @@ -2567,9 +2567,8 @@ void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupda | |||||||
| 					VECCOPY(prev_tangent, tangent); | 					VECCOPY(prev_tangent, tangent); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				if(k == steps) { | 				if(k == steps) | ||||||
| 					QUATCOPY(ca->rot, (ca - 1)->rot); | 					QUATCOPY(ca->rot, (ca - 1)->rot); | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			 | 			 | ||||||
| @@ -3412,11 +3411,9 @@ void psys_get_particle_on_path(Object *ob, ParticleSystem *psys, int p, Particle | |||||||
| 		//else{ | 		//else{ | ||||||
| 		//	/* TODO: different rotations */ | 		//	/* TODO: different rotations */ | ||||||
| 		//	float nvel[3]; | 		//	float nvel[3]; | ||||||
| 		//	float *q2; |  | ||||||
| 		//	VECCOPY(nvel,state->vel); | 		//	VECCOPY(nvel,state->vel); | ||||||
| 		//	VecMulf(nvel,-1.0f); | 		//	VecMulf(nvel,-1.0f); | ||||||
| 		//	q2=vectoquat(nvel, OB_POSX, OB_POSZ); | 		//	vectoquat(nvel, OB_POSX, OB_POSZ, state->rot); | ||||||
| 		//	QUATCOPY(state->rot,q2); |  | ||||||
| 		//} | 		//} | ||||||
|  |  | ||||||
| 		dfra = keys[2].time - keys[1].time; | 		dfra = keys[2].time - keys[1].time; | ||||||
| @@ -3740,7 +3737,7 @@ void psys_get_dupli_texture(Object *ob, ParticleSettings *part, ParticleSystemMo | |||||||
| void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale) | 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 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); | 	VecSubf(vec, (cache+cache->steps-1)->co, cache->co); | ||||||
| 	len= Normalize(vec); | 	len= Normalize(vec); | ||||||
| @@ -3756,7 +3753,7 @@ void psys_get_dupli_path_transform(Object *ob, ParticleSystem *psys, ParticleSys | |||||||
| 		if(!pa) | 		if(!pa) | ||||||
| 			pa= psys->particles+cpa->pa[0]; | 			pa= psys->particles+cpa->pa[0]; | ||||||
|  |  | ||||||
| 		q = vectoquat(xvec, ob->trackflag, ob->upflag); | 		vectoquat(xvec, ob->trackflag, ob->upflag, q); | ||||||
| 		QuatToMat4(q, obrotmat); | 		QuatToMat4(q, obrotmat); | ||||||
| 		obrotmat[3][3]= 1.0f; | 		obrotmat[3][3]= 1.0f; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1573,7 +1573,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi | |||||||
| 	ParticleTexture ptex; | 	ParticleTexture ptex; | ||||||
| 	ParticleKey state; | 	ParticleKey state; | ||||||
| 	IpoCurve *icu=0; | 	IpoCurve *icu=0; | ||||||
| 	float fac, phasefac, nor[3]={0,0,0},loc[3],tloc[3],vel[3]={0.0,0.0,0.0},rot[4],*q2=0; | 	float fac, phasefac, nor[3]={0,0,0},loc[3],tloc[3],vel[3]={0.0,0.0,0.0},rot[4],q2[4]; | ||||||
| 	float r_vel[3],r_ave[3],r_rot[4],p_vel[3]={0.0,0.0,0.0}; | 	float r_vel[3],r_ave[3],r_rot[4],p_vel[3]={0.0,0.0,0.0}; | ||||||
| 	float x_vec[3]={1.0,0.0,0.0}, utan[3]={0.0,1.0,0.0}, vtan[3]={0.0,0.0,1.0}, rot_vec[3]={0.0,0.0,0.0}; | 	float x_vec[3]={1.0,0.0,0.0}, utan[3]={0.0,1.0,0.0}, vtan[3]={0.0,0.0,1.0}, rot_vec[3]={0.0,0.0,0.0}; | ||||||
| 	float q_phase[4]; | 	float q_phase[4]; | ||||||
| @@ -1749,7 +1749,7 @@ void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifi | |||||||
| 		 | 		 | ||||||
| 		/* create rotation quat */ | 		/* create rotation quat */ | ||||||
| 		VecMulf(rot_vec,-1.0); | 		VecMulf(rot_vec,-1.0); | ||||||
| 		q2= vectoquat(rot_vec, OB_POSX, OB_POSZ); | 		vectoquat(rot_vec, OB_POSX, OB_POSZ, q2); | ||||||
|  |  | ||||||
| 		/* randomize rotation quat */ | 		/* randomize rotation quat */ | ||||||
| 		if(part->randrotfac!=0.0f) | 		if(part->randrotfac!=0.0f) | ||||||
| @@ -3085,7 +3085,7 @@ static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, Part | |||||||
| 	ParticleKey cstate; | 	ParticleKey cstate; | ||||||
| 	float imat[4][4]; | 	float imat[4][4]; | ||||||
| 	float co1[3],co2[3],def_loc[3],def_nor[3],unit_nor[3],def_tan[3],dvec[3],def_vel[3],dave[3],dvel[3]; | 	float co1[3],co2[3],def_loc[3],def_nor[3],unit_nor[3],def_tan[3],dvec[3],def_vel[3],dave[3],dvel[3]; | ||||||
| 	float t_co1[3],t_co2[3]; | 	float t_co1[3]={0.0,0.0,0.0},t_co2[3]={0.0,0.0,0.0}; | ||||||
| 	float pa_minmax[6]; | 	float pa_minmax[6]; | ||||||
| 	float min_w[4], zerovec[3]={0.0,0.0,0.0}, ipoint[3]; | 	float min_w[4], zerovec[3]={0.0,0.0,0.0}, ipoint[3]; | ||||||
| 	float min_d,dotprod,damp,frict,o_len,d_len,radius=-1.0f; | 	float min_d,dotprod,damp,frict,o_len,d_len,radius=-1.0f; | ||||||
| @@ -3811,7 +3811,7 @@ static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Object *ob, ParticleS | |||||||
| static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys, ParticleSettings *part, float timestep, float *acc, ParticleKey *state) | static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys, ParticleSettings *part, float timestep, float *acc, ParticleKey *state) | ||||||
| { | { | ||||||
| 	float dvec[3], bvec[3], length, max_vel=part->max_vel; | 	float dvec[3], bvec[3], length, max_vel=part->max_vel; | ||||||
| 	float *q2, q[4]; | 	float q2[4], q[4]; | ||||||
| 	float g=9.81f, pa_mass=part->mass; | 	float g=9.81f, pa_mass=part->mass; | ||||||
| 	float yvec[3]={0.0,1.0,0.0}, zvec[3]={0.0,0.0,-1.0}, bank; | 	float yvec[3]={0.0,1.0,0.0}, zvec[3]={0.0,0.0,-1.0}, bank; | ||||||
|  |  | ||||||
| @@ -3893,7 +3893,7 @@ static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys, | |||||||
|  |  | ||||||
| 	VECCOPY(dvec,state->vel); | 	VECCOPY(dvec,state->vel); | ||||||
| 	VecMulf(dvec,-1.0f); | 	VecMulf(dvec,-1.0f); | ||||||
| 	q2= vectoquat(dvec, OB_POSX, OB_POSZ); | 	vectoquat(dvec, OB_POSX, OB_POSZ, q2); | ||||||
|  |  | ||||||
| 	QuatMul(state->rot,q,q2); | 	QuatMul(state->rot,q,q2); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -261,7 +261,7 @@ void Vec2Addf(float *v, float *v1, float *v2); | |||||||
| void Vec2Subf(float *v, float *v1, float *v2); | void Vec2Subf(float *v, float *v1, float *v2); | ||||||
| void Vec2Copyf(float *v1, float *v2); | void Vec2Copyf(float *v1, float *v2); | ||||||
|  |  | ||||||
| float *vectoquat(float *vec, short axis, short upflag); | void vectoquat(float *vec, short axis, short upflag, float *q); | ||||||
|  |  | ||||||
| float VecAngle2(float *v1, float *v2); | float VecAngle2(float *v1, float *v2); | ||||||
| float VecAngle3(float *v1, float *v2, float *v3); | float VecAngle3(float *v1, float *v2, float *v3); | ||||||
|   | |||||||
| @@ -1337,9 +1337,8 @@ void NormalQuat(float *q) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| float *vectoquat( float *vec, short axis, short upflag) | void vectoquat(float *vec, short axis, short upflag, float *q) | ||||||
| { | { | ||||||
| 	static float q1[4]; |  | ||||||
| 	float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1; | 	float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1; | ||||||
| 	 | 	 | ||||||
| 	/* first rotate to axis */ | 	/* first rotate to axis */ | ||||||
| @@ -1351,11 +1350,11 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 		x2= -vec[0] ; y2= -vec[1] ; z2= -vec[2]; | 		x2= -vec[0] ; y2= -vec[1] ; z2= -vec[2]; | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	q1[0]=1.0;  | 	q[0]=1.0;  | ||||||
| 	q1[1]=q1[2]=q1[3]= 0.0; | 	q[1]=q[2]=q[3]= 0.0; | ||||||
|  |  | ||||||
| 	len1= (float)sqrt(x2*x2+y2*y2+z2*z2); | 	len1= (float)sqrt(x2*x2+y2*y2+z2*z2); | ||||||
| 	if(len1 == 0.0) return(q1); | 	if(len1 == 0.0) return; | ||||||
|  |  | ||||||
| 	/* nasty! I need a good routine for this... | 	/* nasty! I need a good routine for this... | ||||||
| 	 * problem is a rotation of an Y axis to the negative Y-axis for example. | 	 * problem is a rotation of an Y axis to the negative Y-axis for example. | ||||||
| @@ -1366,9 +1365,8 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 		nor[1]= -z2; | 		nor[1]= -z2; | ||||||
| 		nor[2]= y2; | 		nor[2]= y2; | ||||||
|  |  | ||||||
| 		if( fabs(y2)+fabs(z2)<0.0001 ) { | 		if(fabs(y2)+fabs(z2)<0.0001) | ||||||
| 			nor[1]= 1.0; | 			nor[1]= 1.0; | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		co= x2; | 		co= x2; | ||||||
| 	} | 	} | ||||||
| @@ -1377,9 +1375,8 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 		nor[1]= 0.0; | 		nor[1]= 0.0; | ||||||
| 		nor[2]= -x2; | 		nor[2]= -x2; | ||||||
| 		 | 		 | ||||||
| 		if( fabs(x2)+fabs(z2)<0.0001 ) { | 		if(fabs(x2)+fabs(z2)<0.0001) | ||||||
| 			nor[2]= 1.0; | 			nor[2]= 1.0; | ||||||
| 		} |  | ||||||
| 		 | 		 | ||||||
| 		co= y2; | 		co= y2; | ||||||
| 	} | 	} | ||||||
| @@ -1388,9 +1385,8 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 		nor[1]= x2; | 		nor[1]= x2; | ||||||
| 		nor[2]= 0.0; | 		nor[2]= 0.0; | ||||||
|  |  | ||||||
| 		if( fabs(x2)+fabs(y2)<0.0001 ) { | 		if(fabs(x2)+fabs(y2)<0.0001) | ||||||
| 			nor[0]= 1.0; | 			nor[0]= 1.0; | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		co= z2; | 		co= z2; | ||||||
| 	} | 	} | ||||||
| @@ -1400,13 +1396,13 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 	 | 	 | ||||||
| 	angle= 0.5f*saacos(co); | 	angle= 0.5f*saacos(co); | ||||||
| 	si= (float)sin(angle); | 	si= (float)sin(angle); | ||||||
| 	q1[0]= (float)cos(angle); | 	q[0]= (float)cos(angle); | ||||||
| 	q1[1]= nor[0]*si; | 	q[1]= nor[0]*si; | ||||||
| 	q1[2]= nor[1]*si; | 	q[2]= nor[1]*si; | ||||||
| 	q1[3]= nor[2]*si; | 	q[3]= nor[2]*si; | ||||||
| 	 | 	 | ||||||
| 	if(axis!=upflag) { | 	if(axis!=upflag) { | ||||||
| 		QuatToMat3(q1, mat); | 		QuatToMat3(q, mat); | ||||||
|  |  | ||||||
| 		fp= mat[2]; | 		fp= mat[2]; | ||||||
| 		if(axis==0) { | 		if(axis==0) { | ||||||
| @@ -1429,10 +1425,8 @@ float *vectoquat( float *vec, short axis, short upflag) | |||||||
| 		q2[2]= y2*si; | 		q2[2]= y2*si; | ||||||
| 		q2[3]= z2*si; | 		q2[3]= z2*si; | ||||||
| 			 | 			 | ||||||
| 		QuatMul(q1,q2,q1); | 		QuatMul(q,q2,q); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return(q1); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void VecUpMat3old( float *vec, float mat[][3], short axis) | void VecUpMat3old( float *vec, float mat[][3], short axis) | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: vector.c 12314 2007-10-20 20:24:09Z campbellbarton $ |  * $Id$ | ||||||
|  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** |  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or |  * This program is free software; you can redistribute it and/or | ||||||
| @@ -168,7 +168,7 @@ PyObject *Vector_Resize4D(VectorObject * self) | |||||||
|   extract a quaternion from the vector and the track and up axis */ |   extract a quaternion from the vector and the track and up axis */ | ||||||
| PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args ) | PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args ) | ||||||
| { | { | ||||||
| 	float vec[3]; | 	float vec[3], quat[4]; | ||||||
| 	char *strack, *sup; | 	char *strack, *sup; | ||||||
| 	short track = 2, up = 1; | 	short track = 2, up = 1; | ||||||
|  |  | ||||||
| @@ -271,7 +271,9 @@ PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args ) | |||||||
| 	vec[1] = -self->vec[1]; | 	vec[1] = -self->vec[1]; | ||||||
| 	vec[2] = -self->vec[2]; | 	vec[2] = -self->vec[2]; | ||||||
|  |  | ||||||
| 	return newQuaternionObject(vectoquat(vec, track, up), Py_NEW); | 	vectoquat(vec, track, up, quat); | ||||||
|  |  | ||||||
|  | 	return newQuaternionObject(quat, Py_NEW); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user