[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19518] trunk/blender/source/blender: Major cleanup of particle render & drawing code.

Janne Karhu jhkarh at utu.fi
Fri Apr 3 16:50:54 CEST 2009


Revision: 19518
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19518
Author:   jhk
Date:     2009-04-03 16:50:54 +0200 (Fri, 03 Apr 2009)

Log Message:
-----------
Major cleanup of particle render & drawing code. No new features and hopefully no new bugs.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_particle.h
    trunk/blender/source/blender/blenkernel/intern/particle.c
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/src/drawobject.c

Modified: trunk/blender/source/blender/blenkernel/BKE_particle.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_particle.h	2009-04-03 14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/blenkernel/BKE_particle.h	2009-04-03 14:50:54 UTC (rev 19518)
@@ -188,6 +188,19 @@
 	int num, tot;
 } ParticleThread;
 
+typedef struct ParticleBillboardData
+{
+	struct Object *ob;
+	float vec[3], vel[3];
+	float offset[2];
+	float size, tilt, random, time;
+	int uv[3];
+	int lock, num;
+	int totnum;
+	short align, uv_split, anim, split_offset;
+}
+ParticleBillboardData;
+
 /* ----------- functions needed outside particlesystem ---------------- */
 /* particle.c */
 int count_particles(struct ParticleSystem *psys);
@@ -260,6 +273,8 @@
 void psys_thread_distribute_particle(ParticleThread *thread, struct ParticleData *pa, struct ChildParticle *cpa, int p);
 void psys_thread_create_path(ParticleThread *thread, struct ChildParticle *cpa, ParticleCacheKey *keys, int i);
 
+void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3]);
+
 /* particle_system.c */
 int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
 void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, struct Object **target_ob, struct ParticleSystem **target_psys);

Modified: trunk/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle.c	2009-04-03 14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/blenkernel/intern/particle.c	2009-04-03 14:50:54 UTC (rev 19518)
@@ -3868,3 +3868,76 @@
 
 	*scale= len;
 }
+
+void psys_make_billboard(ParticleBillboardData *bb, float xvec[3], float yvec[3], float zvec[3], float center[3])
+{
+	float onevec[3] = {0.0f,0.0f,0.0f}, tvec[3], tvec2[3];
+
+	xvec[0] = 1.0f; xvec[1] = 0.0f; xvec[2] = 0.0f;
+	yvec[0] = 0.0f; yvec[1] = 1.0f; yvec[2] = 0.0f;
+
+	if(bb->align < PART_BB_VIEW)
+		onevec[bb->align]=1.0f;
+
+	if(bb->lock && (bb->align == PART_BB_VIEW)) {
+		VECCOPY(xvec, bb->ob->obmat[0]);
+		Normalize(xvec);
+
+		VECCOPY(yvec, bb->ob->obmat[1]);
+		Normalize(yvec);
+
+		VECCOPY(zvec, bb->ob->obmat[2]);
+		Normalize(zvec);
+	}
+	else if(bb->align == PART_BB_VEL) {
+		float temp[3];
+
+		VECCOPY(temp, bb->vel);
+		Normalize(temp);
+
+		VECSUB(zvec, bb->ob->obmat[3], bb->vec);
+
+		if(bb->lock) {
+			float fac = -Inpf(zvec, temp);
+
+			VECADDFAC(zvec, zvec, temp, fac);
+		}
+		Normalize(zvec);
+
+		Crossf(xvec,temp,zvec);
+		Normalize(xvec);
+
+		Crossf(yvec,zvec,xvec);
+	}
+	else {
+		VECSUB(zvec, bb->ob->obmat[3], bb->vec);
+		if(bb->lock)
+			zvec[bb->align] = 0.0f;
+		Normalize(zvec);
+
+		if(bb->align < PART_BB_VIEW)
+			Crossf(xvec, onevec, zvec);
+		else
+			Crossf(xvec, bb->ob->obmat[1], zvec);
+		Normalize(xvec);
+
+		Crossf(yvec,zvec,xvec);
+	}
+
+	VECCOPY(tvec, xvec);
+	VECCOPY(tvec2, yvec);
+
+	VecMulf(xvec, cos(bb->tilt * (float)M_PI));
+	VecMulf(tvec2, sin(bb->tilt * (float)M_PI));
+	VECADD(xvec, xvec, tvec2);
+
+	VecMulf(yvec, cos(bb->tilt * (float)M_PI));
+	VecMulf(tvec, -sin(bb->tilt * (float)M_PI));
+	VECADD(yvec, yvec, tvec);
+
+	VecMulf(xvec, bb->size);
+	VecMulf(yvec, bb->size);
+
+	VECADDFAC(center, bb->vec, xvec, bb->offset[0]);
+	VECADDFAC(center, center, yvec, bb->offset[1]);
+}
\ No newline at end of file

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2009-04-03 14:41:31 UTC (rev 19517)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2009-04-03 14:50:54 UTC (rev 19518)
@@ -947,11 +947,17 @@
 /* ------------------------------------------------------------------------- */
 /* Particles                                                                 */
 /* ------------------------------------------------------------------------- */
-
+typedef struct ParticleStrandData
+{
+	struct MCol *mcol;
+	float *orco, *uvco, *surfnor;
+	float time, adapt_angle, adapt_pix, size;
+	int totuv, totcol;
+	int first, line, adapt, override_uv;
+}
+ParticleStrandData;
 /* future thread problem... */
-static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, float *orco, float *surfnor,
-								   float *uvco, int totuv, MCol *mcol, int totcol, float *vec, float *vec1, float ctime,
-								   int first, int line, int adapt, float adapt_angle, float adapt_pix, int override_uv)
+static void static_particle_strand(Render *re, ObjectRen *obr, Material *ma, ParticleStrandData *sd, float *vec, float *vec1)
 {
 	static VertRen *v1= NULL, *v2= NULL;
 	VlakRen *vlr;
@@ -974,11 +980,11 @@
 		float fac;
 		if(ma->strand_ease!=0.0f) {
 			if(ma->strand_ease<0.0f)
-				fac= pow(ctime, 1.0+ma->strand_ease);
+				fac= pow(sd->time, 1.0+ma->strand_ease);
 			else
-				fac= pow(ctime, 1.0/(1.0f-ma->strand_ease));
+				fac= pow(sd->time, 1.0/(1.0f-ma->strand_ease));
 		}
-		else fac= ctime;
+		else fac= sd->time;
 
 		width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
 
@@ -1010,7 +1016,7 @@
 		flag |= R_STRAND;
 	
 	/* single face line */
-	if(line) {
+	if(sd->line) {
 		vlr= RE_findOrAddVlak(obr, obr->totvlak++);
 		vlr->flag= flag;
 		vlr->v1= RE_findOrAddVert(obr, obr->totvert++);
@@ -1021,25 +1027,25 @@
 		VECCOPY(vlr->v1->co, vec);
 		VecAddf(vlr->v1->co, vlr->v1->co, cross);
 		VECCOPY(vlr->v1->n, nor);
-		vlr->v1->orco= orco;
+		vlr->v1->orco= sd->orco;
 		vlr->v1->accum= -1.0f;	// accum abuse for strand texco
 		
 		VECCOPY(vlr->v2->co, vec);
 		VecSubf(vlr->v2->co, vlr->v2->co, cross);
 		VECCOPY(vlr->v2->n, nor);
-		vlr->v2->orco= orco;
+		vlr->v2->orco= sd->orco;
 		vlr->v2->accum= vlr->v1->accum;
 
 		VECCOPY(vlr->v4->co, vec1);
 		VecAddf(vlr->v4->co, vlr->v4->co, cross);
 		VECCOPY(vlr->v4->n, nor);
-		vlr->v4->orco= orco;
+		vlr->v4->orco= sd->orco;
 		vlr->v4->accum= 1.0f;	// accum abuse for strand texco
 		
 		VECCOPY(vlr->v3->co, vec1);
 		VecSubf(vlr->v3->co, vlr->v3->co, cross);
 		VECCOPY(vlr->v3->n, nor);
-		vlr->v3->orco= orco;
+		vlr->v3->orco= sd->orco;
 		vlr->v3->accum= vlr->v4->accum;
 
 		CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
@@ -1047,23 +1053,23 @@
 		vlr->mat= ma;
 		vlr->ec= ME_V2V3;
 
-		if(surfnor) {
+		if(sd->surfnor) {
 			float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
-			VECCOPY(snor, surfnor);
+			VECCOPY(snor, sd->surfnor);
 		}
 
-		if(uvco){
-			for(i=0; i<totuv; i++){
+		if(sd->uvco){
+			for(i=0; i<sd->totuv; i++){
 				MTFace *mtf;
 				mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
 				mtf->uv[0][0]=mtf->uv[1][0]=
-				mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+				mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
 				mtf->uv[0][1]=mtf->uv[1][1]=
-				mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+				mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
 			}
-			if(override_uv>=0){
+			if(sd->override_uv>=0){
 				MTFace *mtf;
-				mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+				mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
 				
 				mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
 				mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
@@ -1072,18 +1078,18 @@
 				mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
 			}
 		}
-		if(mcol){
-			for(i=0; i<totcol; i++){
+		if(sd->mcol){
+			for(i=0; i<sd->totcol; i++){
 				MCol *mc;
 				mc=RE_vlakren_get_mcol(obr,vlr,i,NULL,1);
-				mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
-				mc[0]=mc[1]=mc[2]=mc[3]=mcol[i];
+				mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
+				mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
 			}
 		}
 	}
 	/* first two vertices of a strand */
-	else if(first) {
-		if(adapt){
+	else if(sd->first) {
+		if(sd->adapt){
 			VECCOPY(anor, nor);
 			VECCOPY(avec, vec);
 			second=1;
@@ -1095,18 +1101,18 @@
 		VECCOPY(v1->co, vec);
 		VecAddf(v1->co, v1->co, cross);
 		VECCOPY(v1->n, nor);
-		v1->orco= orco;
+		v1->orco= sd->orco;
 		v1->accum= -1.0f;	// accum abuse for strand texco
 		
 		VECCOPY(v2->co, vec);
 		VecSubf(v2->co, v2->co, cross);
 		VECCOPY(v2->n, nor);
-		v2->orco= orco;
+		v2->orco= sd->orco;
 		v2->accum= v1->accum;
 	}
 	/* more vertices & faces to strand */
 	else {
-		if(adapt==0 || second){
+		if(sd->adapt==0 || second){
 			vlr= RE_findOrAddVlak(obr, obr->totvlak++);
 			vlr->flag= flag;
 			vlr->v1= v1;
@@ -1118,14 +1124,14 @@
 			v2= vlr->v3; // cycle
 
 			
-			if(adapt){
+			if(sd->adapt){
 				second=0;
 				VECCOPY(anor,nor);
 				VECCOPY(avec,vec);
 			}
 
 		}
-		else if(adapt){
+		else if(sd->adapt){
 			float dvec[3],pvec[3];
 			VecSubf(dvec,avec,vec);
 			Projf(pvec,dvec,vec);
@@ -1135,7 +1141,7 @@
 			dx= re->winx*dvec[0]*re->winmat[0][0]/w;
 			dy= re->winy*dvec[1]*re->winmat[1][1]/w;
 			w= sqrt(dx*dx + dy*dy);
-			if(Inpf(anor,nor)<adapt_angle && w>adapt_pix){
+			if(Inpf(anor,nor)<sd->adapt_angle && w>sd->adapt_pix){
 				vlr= RE_findOrAddVlak(obr, obr->totvlak++);
 				vlr->flag= flag;
 				vlr->v1= v1;
@@ -1157,13 +1163,13 @@
 		VECCOPY(vlr->v4->co, vec);
 		VecAddf(vlr->v4->co, vlr->v4->co, cross);
 		VECCOPY(vlr->v4->n, nor);
-		vlr->v4->orco= orco;
-		vlr->v4->accum= -1.0f + 2.0f*ctime;	// accum abuse for strand texco
+		vlr->v4->orco= sd->orco;
+		vlr->v4->accum= -1.0f + 2.0f*sd->time;	// accum abuse for strand texco
 		
 		VECCOPY(vlr->v3->co, vec);
 		VecSubf(vlr->v3->co, vlr->v3->co, cross);
 		VECCOPY(vlr->v3->n, nor);
-		vlr->v3->orco= orco;
+		vlr->v3->orco= sd->orco;
 		vlr->v3->accum= vlr->v4->accum;
 		
 		CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
@@ -1171,23 +1177,23 @@
 		vlr->mat= ma;
 		vlr->ec= ME_V2V3;
 
-		if(surfnor) {
+		if(sd->surfnor) {
 			float *snor= RE_vlakren_get_surfnor(obr, vlr, 1);
-			VECCOPY(snor, surfnor);
+			VECCOPY(snor, sd->surfnor);
 		}
 
-		if(uvco){
-			for(i=0; i<totuv; i++){
+		if(sd->uvco){
+			for(i=0; i<sd->totuv; i++){
 				MTFace *mtf;
 				mtf=RE_vlakren_get_tface(obr,vlr,i,NULL,1);
 				mtf->uv[0][0]=mtf->uv[1][0]=
-				mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+				mtf->uv[2][0]=mtf->uv[3][0]=(sd->uvco+2*i)[0];
 				mtf->uv[0][1]=mtf->uv[1][1]=
-				mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+				mtf->uv[2][1]=mtf->uv[3][1]=(sd->uvco+2*i)[1];
 			}
-			if(override_uv>=0){
+			if(sd->override_uv>=0){
 				MTFace *mtf;
-				mtf=RE_vlakren_get_tface(obr,vlr,override_uv,NULL,0);
+				mtf=RE_vlakren_get_tface(obr,vlr,sd->override_uv,NULL,0);
 				
 				mtf->uv[0][0]=mtf->uv[3][0]=0.0f;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list