[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27389] branches/render25/source/blender/ render/intern: Render Branch: strand coords now use same storage system as others tex coords.

Brecht Van Lommel brecht at blender.org
Wed Mar 10 16:12:56 CET 2010


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

Log Message:
-----------
Render Branch: strand coords now use same storage system as others tex coords.

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

Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h	2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/include/object.h	2010-03-10 15:12:56 UTC (rev 27389)
@@ -166,6 +166,7 @@
 #define RE_SIMPLIFY_ELEMS	2
 #define RE_FACE_ELEMS		1
 #define RE_NMAP_TANGENT_ELEMS	12
+#define RE_STRANDCO_ELEMS	1
 
 #endif /* __RENDER_OBJECT_H__ */
 

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h	2010-03-10 15:12:56 UTC (rev 27389)
@@ -51,6 +51,7 @@
 float *render_vert_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
 float *render_vert_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
 float *render_vert_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int verify);
+float *render_vert_get_strandco(struct ObjectRen *obr, struct VertRen *ver, int verify);
 float *render_vert_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen *ver, int verify);
 
 /* Face Texture Coordinates */
@@ -78,6 +79,7 @@
 	float *tangent;
 	float *stress;
 	float *winspeed;
+	float *strandco;
 } VertTableNode;
 
 typedef struct VlakTableNode {
@@ -93,7 +95,6 @@
 	float co[3];
 	float n[3];
 	unsigned short flag;	/* in use for temp setting stuff in object_mesh.c */
-	float accum;			/* for strand texco static particles */
 	int index;				/* index allows extending vertren with any property */
 } VertRen;
 

Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c	2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object.c	2010-03-10 15:12:56 UTC (rev 27389)
@@ -204,6 +204,8 @@
 			MEM_freeN(vertnodes[a].stress);
 		if(vertnodes[a].winspeed)
 			MEM_freeN(vertnodes[a].winspeed);
+		if(vertnodes[a].strandco)
+			MEM_freeN(vertnodes[a].strandco);
 	}
 	
 	MEM_freeN(vertnodes);

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c	2010-03-10 15:12:56 UTC (rev 27389)
@@ -200,6 +200,21 @@
 	return tangent + (ver->index & 255)*RE_TANGENT_ELEMS;
 }
 
+float *render_vert_get_strandco(ObjectRen *obr, VertRen *ver, int verify)
+{
+	float *strandco;
+	int nr= ver->index>>8;
+	
+	strandco= obr->vertnodes[nr].strandco;
+	if(strandco==NULL) {
+		if(verify) 
+			strandco= obr->vertnodes[nr].strandco= MEM_callocN(256*RE_STRANDCO_ELEMS*sizeof(float), "strandco table");
+		else
+			return NULL;
+	}
+	return strandco + (ver->index & 255)*RE_STRANDCO_ELEMS;
+}
+
 /* needs calloc! not all renderverts have them */
 /* also winspeed is exception, it is stored per instance */
 float *render_vert_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
@@ -228,6 +243,11 @@
 	*v1= *ver;
 	v1->index= index;
 	
+	fp1= render_vert_get_orco(obr, ver, 0);
+	if(fp1) {
+		fp2= render_vert_get_orco(obr, v1, 1);
+		memcpy(fp2, fp1, RE_ORCO_ELEMS*sizeof(float));
+	}
 	fp1= render_vert_get_sticky(obr, ver, 0);
 	if(fp1) {
 		fp2= render_vert_get_sticky(obr, v1, 1);
@@ -248,6 +268,11 @@
 		fp2= render_vert_get_tangent(obr, v1, 1);
 		memcpy(fp2, fp1, RE_TANGENT_ELEMS*sizeof(float));
 	}
+	fp1= render_vert_get_strandco(obr, ver, 0);
+	if(fp1) {
+		fp2= render_vert_get_strandco(obr, v1, 1);
+		memcpy(fp2, fp1, RE_STRANDCO_ELEMS*sizeof(float));
+	}
 	return v1;
 }
 
@@ -1102,11 +1127,11 @@
 	return 0;
 }
 
-static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3])
+static void displace_render_vert(Render *re, ObjectRen *obr, ShadeInput *shi, VertRen *vr, int vindex, float *scale, float mat[][4], float imat[][3], float *sample)
 {
 	MTFace *tface;
 	short texco= shi->material.mat->texco;
-	float sample=0, displace[3], *orco;
+	float displace[3], *orco;
 	char *name;
 	int i;
 
@@ -1187,18 +1212,17 @@
 	vr->flag |= 1;
 	
 	/* Pass sample back so displace_face can decide which way to split the quad */
-	sample  = shi->texture.displace[0]*shi->texture.displace[0];
-	sample += shi->texture.displace[1]*shi->texture.displace[1];
-	sample += shi->texture.displace[2]*shi->texture.displace[2];
-	
-	vr->accum=sample; 
 	/* Should be sqrt(sample), but I'm only looking for "bigger".  Save the cycles. */
-	return;
+	sample[vr->index]= dot_v3v3(shi->texture.displace, shi->texture.displace);
 }
 
-static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale, float mat[][4], float imat[][3])
+static void displace_render_face(Render *re, ObjectRen *obr, VlakRen *vlr, float *scale, float mat[][4], float imat[][3], float *sample)
 {
 	ShadeInput shi;
+	VertRen *v1= vlr->v1;
+	VertRen *v2= vlr->v2;
+	VertRen *v3= vlr->v3;
+	VertRen *v4= vlr->v4;
 
 	/* Warning, This is not that nice, and possibly a bit slow,
 	however some variables were not initialized properly in, unless using shade_input_initialize(...), we need to do a memset */
@@ -1218,48 +1242,47 @@
 	/* TODO, assign these, displacement with new bumpmap is skipped without - campbell */
 #if 0
 	/* order is not known ? */
-	shi.primitive.v1= vlr->v1;
-	shi.primitive.v2= vlr->v2;
-	shi.primitive.v3= vlr->v3;
+	shi.primitive.v1= v1;
+	shi.primitive.v2= v2;
+	shi.primitive.v3= v3;
 #endif
 	
 	/* Displace the verts, flag is set when done */
-	if (!vlr->v1->flag)
-		displace_render_vert(re, obr, &shi, vlr->v1,0,  scale, mat, imat);
+	if(!v1->flag)
+		displace_render_vert(re, obr, &shi, v1,0,  scale, mat, imat, sample);
 	
-	if (!vlr->v2->flag)
-		displace_render_vert(re, obr, &shi, vlr->v2, 1, scale, mat, imat);
+	if(!v2->flag)
+		displace_render_vert(re, obr, &shi, v2, 1, scale, mat, imat, sample);
 
-	if (!vlr->v3->flag)
-		displace_render_vert(re, obr, &shi, vlr->v3, 2, scale, mat, imat);
+	if(!v3->flag)
+		displace_render_vert(re, obr, &shi, v3, 2, scale, mat, imat, sample);
 
-	if (vlr->v4) {
-		if (!vlr->v4->flag)
-			displace_render_vert(re, obr, &shi, vlr->v4, 3, scale, mat, imat);
+	if(v4) {
+		if(!v4->flag)
+			displace_render_vert(re, obr, &shi, v4, 3, scale, mat, imat, sample);
 
 		/*	closest in displace value.  This will help smooth edges.   */ 
-		if ( fabs(vlr->v1->accum - vlr->v3->accum) > fabs(vlr->v2->accum - vlr->v4->accum)) 
+		if(fabs(sample[v1->index] - sample[v3->index]) > fabs(sample[v2->index] - sample[v4->index]))
 			vlr->flag |= R_DIVIDE_24;
 		else vlr->flag &= ~R_DIVIDE_24;
 	}
 	
 	/* Recalculate the face normal  - if flipped before, flip now */
-	if(vlr->v4) {
-		normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
-	}	
-	else {
-		normal_tri_v3( vlr->n,vlr->v3->co, vlr->v2->co, vlr->v1->co);
-	}
+	if(v4)
+		normal_quad_v3(vlr->n, v4->co, v3->co, v2->co, v1->co);
+	else
+		normal_tri_v3(vlr->n, v3->co, v2->co, v1->co);
 }
 
 static void do_displacement(Render *re, ObjectRen *obr, float mat[][4], float imat[][3])
 {
+	Object *obt;
+	VlakRen *vlr;
 	VertRen *vr;
-	VlakRen *vlr;
-//	float min[3]={1e30, 1e30, 1e30}, max[3]={-1e30, -1e30, -1e30};
-	float scale[3]={1.0f, 1.0f, 1.0f}, temp[3];//, xn
-	int i; //, texflag=0;
-	Object *obt;
+	float scale[3]={1.0f, 1.0f, 1.0f}, temp[3], *sample;
+	int i;
+
+	sample= MEM_callocN(sizeof(float)*obr->totvert, "do_displacement sample");
 		
 	/* Object Size with parenting */
 	obt=obr->ob;
@@ -1277,8 +1300,10 @@
 
 	for(i=0; i<obr->totvlak; i++){
 		vlr=render_object_vlak_get(obr, i);
-		displace_render_face(re, obr, vlr, scale, mat, imat);
+		displace_render_face(re, obr, vlr, scale, mat, imat, sample);
 	}
+
+	MEM_freeN(sample);
 	
 	/* Recalc vertex normals */
 	render_object_calc_vnormals(re, obr, 0, 0);

Modified: branches/render25/source/blender/render/intern/source/object_particle.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_particle.c	2010-03-10 15:11:24 UTC (rev 27388)
+++ branches/render25/source/blender/render/intern/source/object_particle.c	2010-03-10 15:12:56 UTC (rev 27389)
@@ -134,25 +134,25 @@
 		add_v3_v3v3(vlr->v1->co, vlr->v1->co, cross);
 		copy_v3_v3(vlr->v1->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, vlr->v1, 1), sd->orco);
-		vlr->v1->accum= -1.0f;	// accum abuse for strand texco
+		*render_vert_get_strandco(obr, vlr->v1, 1)= -1.0f;
 		
 		copy_v3_v3(vlr->v2->co, vec);
 		sub_v3_v3v3(vlr->v2->co, vlr->v2->co, cross);
 		copy_v3_v3(vlr->v2->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, vlr->v2, 1), sd->orco);
-		vlr->v2->accum= vlr->v1->accum;
+		*render_vert_get_strandco(obr, vlr->v2, 1)= -1.0f;
 
 		copy_v3_v3(vlr->v4->co, vec1);
 		add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
 		copy_v3_v3(vlr->v4->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, vlr->v4, 1), sd->orco);
-		vlr->v4->accum= 1.0f;	// accum abuse for strand texco
+		*render_vert_get_strandco(obr, vlr->v4, 1)= 1.0f;
 		
 		copy_v3_v3(vlr->v3->co, vec1);
 		sub_v3_v3v3(vlr->v3->co, vlr->v3->co, cross);
 		copy_v3_v3(vlr->v3->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, vlr->v3, 1), sd->orco);
-		vlr->v3->accum= vlr->v4->accum;
+		*render_vert_get_strandco(obr, vlr->v3, 1)= 1.0f;
 
 		normal_quad_v3( vlr->n,vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co);
 		
@@ -208,13 +208,13 @@
 		add_v3_v3v3(v1->co, v1->co, cross);
 		copy_v3_v3(v1->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, v1, 1), sd->orco);
-		v1->accum= -1.0f;	// accum abuse for strand texco
+		*render_vert_get_strandco(obr, v1, 1)= -1.0f;
 		
 		copy_v3_v3(v2->co, vec);
 		sub_v3_v3v3(v2->co, v2->co, cross);
 		copy_v3_v3(v2->n, nor);
 		copy_v3_v3(render_vert_get_orco(obr, v2, 1), sd->orco);
-		v2->accum= v1->accum;
+		*render_vert_get_strandco(obr, v2, 1)= -1.0f;
 	}
 	/* more vertices & faces to strand */
 	else {
@@ -270,13 +270,13 @@
 		add_v3_v3v3(vlr->v4->co, vlr->v4->co, cross);
 		copy_v3_v3(vlr->v4->n, nor);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list