[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27385] branches/render25/source/blender/ render/intern: Render Branch: move particle conversion into own file.

Brecht Van Lommel brecht at blender.org
Wed Mar 10 15:02:32 CET 2010


Revision: 27385
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27385
Author:   blendix
Date:     2010-03-10 15:02:31 +0100 (Wed, 10 Mar 2010)

Log Message:
-----------
Render Branch: move particle conversion into own file.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/object_mesh.h
    branches/render25/source/blender/render/intern/source/object_mesh.c

Added Paths:
-----------
    branches/render25/source/blender/render/intern/source/object_particle.c

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-10 13:35:07 UTC (rev 27384)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-10 14:02:31 UTC (rev 27385)
@@ -31,6 +31,7 @@
 struct Material;
 struct ObjectInstanceRen;
 struct ObjectRen;
+struct ParticleSystem;
 struct VertRen;
 struct VlakRen;
 
@@ -62,7 +63,10 @@
 /* Conversion */
 
 void init_render_object_data(struct Render *re, struct ObjectRen *obr, int timeoffset);
+void init_render_particle_system(struct Render *re, struct ObjectRen *obr, struct ParticleSystem *psys, int timeoffset);
 void finalize_render_object(struct Render *re, struct ObjectRen *obr, int timeoffset);
+void render_object_calc_vnormals(struct Render *re, struct ObjectRen *obr, int do_tangent, int do_nmap_tangent);
+void set_object_orco(struct Render *re, void *ob, float *orco);
 
 /* Structs */
 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-10 13:35:07 UTC (rev 27384)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-10 14:02:31 UTC (rev 27385)
@@ -511,7 +511,7 @@
 	return orco;
 }
 
-static void set_object_orco(Render *re, void *ob, float *orco)
+void set_object_orco(Render *re, void *ob, float *orco)
 {
 	if (!re->db.orco_hash)
 		re->db.orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
@@ -723,7 +723,7 @@
 }
 
 
-static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
+void render_object_calc_vnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent)
 {
 	MemArena *arena= NULL;
 	VertexTangent **vtangents= NULL;
@@ -1064,1109 +1064,6 @@
 
 
 /* ------------------------------------------------------------------------- */
-/* 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, ParticleStrandData *sd, float *vec, float *vec1)
-{
-	static VertRen *v1= NULL, *v2= NULL;
-	VlakRen *vlr= NULL;
-	float nor[3], cross[3], crosslen, w, dx, dy, width;
-	static float anor[3], avec[3];
-	int flag, i;
-	static int second=0;
-	
-	sub_v3_v3v3(nor, vec, vec1);
-	normalize_v3(nor);		// nor needed as tangent 
-	cross_v3_v3v3(cross, vec, nor);
-
-	/* turn cross in pixelsize */
-	w= vec[2]*re->cam.winmat[2][3] + re->cam.winmat[3][3];
-	dx= re->cam.winx*cross[0]*re->cam.winmat[0][0];
-	dy= re->cam.winy*cross[1]*re->cam.winmat[1][1];
-	w= sqrt(dx*dx + dy*dy)/w;
-	
-	if(w!=0.0f) {
-		float fac;
-		if(ma->strand_ease!=0.0f) {
-			if(ma->strand_ease<0.0f)
-				fac= pow(sd->time, 1.0+ma->strand_ease);
-			else
-				fac= pow(sd->time, 1.0/(1.0f-ma->strand_ease));
-		}
-		else fac= sd->time;
-
-		width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
-
-		/* use actual Blender units for strand width and fall back to minimum width */
-		if(ma->mode & MA_STR_B_UNITS){
-            crosslen= len_v3(cross);
-            w= 2.0f*crosslen*ma->strand_min/w;
-
-			if(width < w)
-				width= w;
-
-			/*cross is the radius of the strand so we want it to be half of full width */
-			mul_v3_fl(cross,0.5/crosslen);
-		}
-		else
-			width/=w;
-
-		mul_v3_fl(cross, width);
-	}
-	else width= 1.0f;
-	
-	if(ma->mode & MA_TANGENT_STR)
-		flag= R_SMOOTH|R_NOPUNOFLIP|R_TANGENT;
-	else
-		flag= R_SMOOTH;
-	
-	/* only 1 pixel wide strands filled in as quads now, otherwise zbuf errors */
-	if(ma->strand_sta==1.0f)
-		flag |= R_STRAND;
-	
-	/* single face line */
-	if(sd->line) {
-		vlr= render_object_vlak_get(obr, obr->totvlak++);
-		vlr->flag= flag;
-		vlr->v1= render_object_vert_get(obr, obr->totvert++);
-		vlr->v2= render_object_vert_get(obr, obr->totvert++);
-		vlr->v3= render_object_vert_get(obr, obr->totvert++);
-		vlr->v4= render_object_vert_get(obr, obr->totvert++);
-		
-		copy_v3_v3(vlr->v1->co, vec);
-		add_v3_v3v3(vlr->v1->co, vlr->v1->co, cross);
-		copy_v3_v3(vlr->v1->n, nor);
-		vlr->v1->orco= sd->orco;
-		vlr->v1->accum= -1.0f;	// accum abuse for strand texco
-		
-		copy_v3_v3(vlr->v2->co, vec);
-		sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross);
-		copy_v3_v3(vlr->v2->n, nor);
-		vlr->v2->orco= sd->orco;
-		vlr->v2->accum= vlr->v1->accum;
-
-		copy_v3_v3(vlr->v4->co, vec1);
-		add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
-		copy_v3_v3(vlr->v4->n, nor);
-		vlr->v4->orco= sd->orco;
-		vlr->v4->accum= 1.0f;	// accum abuse for strand texco
-		
-		copy_v3_v3(vlr->v3->co, vec1);
-		sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
-		copy_v3_v3(vlr->v3->n, nor);
-		vlr->v3->orco= sd->orco;
-		vlr->v3->accum= vlr->v4->accum;
-
-		normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-		
-		vlr->mat= ma;
-		vlr->ec= ME_V2V3;
-
-		if(sd->surfnor) {
-			float *snor= render_vlak_get_surfnor(obr, vlr, 1);
-			copy_v3_v3(snor, sd->surfnor);
-		}
-
-		if(sd->uvco){
-			for(i=0; i<sd->totuv; i++){
-				MTFace *mtf;
-				mtf=render_vlak_get_tface(obr,vlr,i,NULL,1);
-				mtf->uv[0][0]=mtf->uv[1][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]=(sd->uvco+2*i)[1];
-			}
-			if(sd->override_uv>=0){
-				MTFace *mtf;
-				mtf=render_vlak_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;
-
-				mtf->uv[0][1]=mtf->uv[1][1]=0.0f;
-				mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
-			}
-		}
-		if(sd->mcol){
-			for(i=0; i<sd->totcol; i++){
-				MCol *mc;
-				mc=render_vlak_get_mcol(obr,vlr,i,NULL,1);
-				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(sd->first) {
-		if(sd->adapt){
-			copy_v3_v3(anor, nor);
-			copy_v3_v3(avec, vec);
-			second=1;
-		}
-
-		v1= render_object_vert_get(obr, obr->totvert++);
-		v2= render_object_vert_get(obr, obr->totvert++);
-		
-		copy_v3_v3(v1->co, vec);
-		add_v3_v3v3(v1->co, v1->co, cross);
-		copy_v3_v3(v1->n, nor);
-		v1->orco= sd->orco;
-		v1->accum= -1.0f;	// accum abuse for strand texco
-		
-		copy_v3_v3(v2->co, vec);
-		sub_v3_v3v3(v2->co, v2->co, cross);
-		copy_v3_v3(v2->n, nor);
-		v2->orco= sd->orco;
-		v2->accum= v1->accum;
-	}
-	/* more vertices & faces to strand */
-	else {
-		if(sd->adapt==0 || second){
-			vlr= render_object_vlak_get(obr, obr->totvlak++);
-			vlr->flag= flag;
-			vlr->v1= v1;
-			vlr->v2= v2;
-			vlr->v3= render_object_vert_get(obr, obr->totvert++);
-			vlr->v4= render_object_vert_get(obr, obr->totvert++);
-			
-			v1= vlr->v4; // cycle
-			v2= vlr->v3; // cycle
-
-			
-			if(sd->adapt){
-				second=0;
-				copy_v3_v3(anor,nor);
-				copy_v3_v3(avec,vec);
-			}
-
-		}
-		else if(sd->adapt){
-			float dvec[3],pvec[3];
-			sub_v3_v3v3(dvec,avec,vec);
-			project_v3_v3v3(pvec,dvec,vec);
-			sub_v3_v3v3(dvec,dvec,pvec);
-
-			w= vec[2]*re->cam.winmat[2][3] + re->cam.winmat[3][3];
-			dx= re->cam.winx*dvec[0]*re->cam.winmat[0][0]/w;
-			dy= re->cam.winy*dvec[1]*re->cam.winmat[1][1]/w;
-			w= sqrt(dx*dx + dy*dy);
-			if(dot_v3v3(anor,nor)<sd->adapt_angle && w>sd->adapt_pix){
-				vlr= render_object_vlak_get(obr, obr->totvlak++);
-				vlr->flag= flag;
-				vlr->v1= v1;
-				vlr->v2= v2;
-				vlr->v3= render_object_vert_get(obr, obr->totvert++);
-				vlr->v4= render_object_vert_get(obr, obr->totvert++);
-				
-				v1= vlr->v4; // cycle
-				v2= vlr->v3; // cycle
-
-				copy_v3_v3(anor,nor);
-				copy_v3_v3(avec,vec);
-			}
-			else{
-				vlr= render_object_vlak_get(obr, obr->totvlak-1);
-			}
-		}
-	
-		copy_v3_v3(vlr->v4->co, vec);
-		add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
-		copy_v3_v3(vlr->v4->n, nor);
-		vlr->v4->orco= sd->orco;
-		vlr->v4->accum= -1.0f + 2.0f*sd->time;	// accum abuse for strand texco
-		
-		copy_v3_v3(vlr->v3->co, vec);
-		sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
-		copy_v3_v3(vlr->v3->n, nor);
-		vlr->v3->orco= sd->orco;
-		vlr->v3->accum= vlr->v4->accum;
-		
-		normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-		
-		vlr->mat= ma;
-		vlr->ec= ME_V2V3;
-
-		if(sd->surfnor) {
-			float *snor= render_vlak_get_surfnor(obr, vlr, 1);
-			copy_v3_v3(snor, sd->surfnor);
-		}
-
-		if(sd->uvco){
-			for(i=0; i<sd->totuv; i++){
-				MTFace *mtf;
-				mtf=render_vlak_get_tface(obr,vlr,i,NULL,1);
-				mtf->uv[0][0]=mtf->uv[1][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]=(sd->uvco+2*i)[1];
-			}
-			if(sd->override_uv>=0){
-				MTFace *mtf;
-				mtf=render_vlak_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;
-
-				mtf->uv[0][1]=mtf->uv[1][1]=(vlr->v1->accum+1.0f)/2.0f;
-				mtf->uv[2][1]=mtf->uv[3][1]=(vlr->v3->accum+1.0f)/2.0f;
-			}
-		}
-		if(sd->mcol){
-			for(i=0; i<sd->totcol; i++){
-				MCol *mc;
-				mc=render_vlak_get_mcol(obr,vlr,i,NULL,1);
-				mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
-				mc[0]=mc[1]=mc[2]=mc[3]=sd->mcol[i];
-			}
-		}
-	}
-}
-
-static void static_particle_wire(ObjectRen *obr, Material *ma, float *vec, float *vec1, int first, int line)
-{
-	VlakRen *vlr;
-	static VertRen *v1;
-
-	if(line) {
-		vlr= render_object_vlak_get(obr, obr->totvlak++);
-		vlr->v1= render_object_vert_get(obr, obr->totvert++);
-		vlr->v2= render_object_vert_get(obr, obr->totvert++);
-		vlr->v3= vlr->v2;
-		vlr->v4= NULL;
-		
-		copy_v3_v3(vlr->v1->co, vec);
-		copy_v3_v3(vlr->v2->co, vec1);
-		
-		sub_v3_v3v3(vlr->n, vec, vec1);
-		normalize_v3(vlr->n);
-		copy_v3_v3(vlr->v1->n, vlr->n);
-		copy_v3_v3(vlr->v2->n, vlr->n);
-		
-		vlr->mat= ma;
-		vlr->ec= ME_V1V2;
-
-	}
-	else if(first) {
-		v1= render_object_vert_get(obr, obr->totvert++);
-		copy_v3_v3(v1->co, vec);
-	}
-	else {
-		vlr= render_object_vlak_get(obr, obr->totvlak++);
-		vlr->v1= v1;
-		vlr->v2= render_object_vert_get(obr, obr->totvert++);
-		vlr->v3= vlr->v2;
-		vlr->v4= NULL;
-		
-		v1= vlr->v2; // cycle
-		copy_v3_v3(v1->co, vec);
-		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list