[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28092] branches/render25/source/blender/ render/intern: Render Branch: Fix displacement mapped surfaces not supporting speed vectors yet,

Brecht Van Lommel brecht at blender.org
Thu Apr 8 14:21:31 CEST 2010


Revision: 28092
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28092
Author:   blendix
Date:     2010-04-08 14:21:31 +0200 (Thu, 08 Apr 2010)

Log Message:
-----------
Render Branch: Fix displacement mapped surfaces not supporting speed vectors yet,
and optimization so displacement does not evaluate e.g. color or bump textures.

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

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h	2010-04-08 12:21:31 UTC (rev 28092)
@@ -43,7 +43,7 @@
 struct VertRen *render_object_vert_copy(struct ObjectRen *obrn, struct ObjectRen *obr, struct VertRen *ver);
 struct VlakRen *render_object_vlak_copy(struct ObjectRen *obrn, struct ObjectRen *obr, struct VlakRen *vlr);
 
-struct VertRen *render_object_vert_interp(struct ObjectRen *obrn, struct ObjectRen *obr, struct VertRen **v, float *w, int totv);
+struct VertRen *render_object_vert_interp(struct ObjectInstanceRen *obin, struct ObjectInstanceRen *obi, struct VertRen **v, float *w, int totv);
 struct VlakRen *render_object_vlak_interp(struct ObjectRen *obrn, struct ObjectRen *obr, struct VlakRen *vlr, float w[4][4]);
 
 /* Vertex Texture Coordinates */

Modified: branches/render25/source/blender/render/intern/include/texture_stack.h
===================================================================
--- branches/render25/source/blender/render/intern/include/texture_stack.h	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/include/texture_stack.h	2010-04-08 12:21:31 UTC (rev 28092)
@@ -39,7 +39,8 @@
 
 /* Texture Stacks */
 
-void do_material_tex(struct Render *re, struct ShadeInput *shi);
+void do_material_tex(struct Render *re, struct ShadeInput *shi,
+	int mapto_flag);
 void do_lamp_tex(struct Render *re, struct LampRen *la, float *lavec,
 	struct ShadeInput *shi, float *colf, int effect);
 void do_sky_tex(struct Render *re, float *rco, float *lo, float *dxyview,

Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/material.c	2010-04-08 12:21:31 UTC (rev 28092)
@@ -560,7 +560,7 @@
 void mat_displacement(Render *re, ShadeInput *shi, float displacement[3])
 {
 	zero_v3(shi->texture.displace);
-	do_material_tex(re, shi);
+	do_material_tex(re, shi, MAP_DISPLACE);
 	copy_v3_v3(displacement, shi->texture.displace);
 }
 
@@ -580,7 +580,7 @@
 	}
 
 	if(do_textures && ma->texco)
-		do_material_tex(re, shi);
+		do_material_tex(re, shi, 0);
 
 	if(!(ma->mode & MA_SHLESS)) {
 		if(ma->fresnel_tra!=0.0f) 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c	2010-04-08 12:21:31 UTC (rev 28092)
@@ -204,19 +204,36 @@
 /* also winspeed is exception, it is stored per instance */
 float *render_vert_get_winspeed(ObjectInstanceRen *obi, VertRen *ver, int verify)
 {
+	ObjectRen *obr= obi->obr;
 	float *winspeed;
-	int totvector;
-	
-	winspeed= obi->vectors;
-	if(winspeed==NULL) {
-		if(verify) {
-			totvector= obi->obr->totvert + obi->obr->totstrand;
-			winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+
+	if(obr->flag & R_TEMP_COPY) {
+		int nr= ver->index>>8;
+		
+		winspeed= obr->vertnodes[nr].winspeed;
+		if(winspeed==NULL) {
+			if(verify) 
+				winspeed= obr->vertnodes[nr].winspeed= MEM_callocN(256*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+			else
+				return NULL;
 		}
-		else
-			return NULL;
+		return winspeed + (ver->index & 255)*RE_WINSPEED_ELEMS;
 	}
-	return winspeed + ver->index*RE_WINSPEED_ELEMS;
+	else {
+		int totvector;
+
+		winspeed= obi->vectors;
+		if(winspeed==NULL) {
+			if(verify) {
+				totvector= obi->obr->totvert + obi->obr->totstrand;
+				winspeed= obi->vectors= MEM_callocN(totvector*RE_WINSPEED_ELEMS*sizeof(float), "winspeed table");
+			}
+			else
+				return NULL;
+		}
+
+		return winspeed + ver->index*RE_WINSPEED_ELEMS;
+	}
 }
 
 float *render_vert_get_basenor(ObjectRen *obr, VertRen *ver, int verify)
@@ -297,8 +314,10 @@
 	return vern;
 }
 
-VertRen *render_object_vert_interp(ObjectRen *obrn, ObjectRen *obr, VertRen **varray, float *warray, int totv)
+VertRen *render_object_vert_interp(ObjectInstanceRen *obin, ObjectInstanceRen *obi, VertRen **varray, float *warray, int totv)
 {
+	ObjectRen *obrn= obin->obr;
+	ObjectRen *obr= obi->obr;
 	VertRen *ver= render_object_vert_get(obrn, obrn->totvert++);
 	int a;
 
@@ -341,6 +360,11 @@
 			madd_v3_v3fl(ver->n, from, w);
 		else
 			madd_v3_v3fl(ver->n, v->n, w);
+
+		if((from=render_vert_get_winspeed(obi, v, 0))) {
+			to= render_vert_get_winspeed(obin, ver, 1);
+			madd_v4_v4fl(to, from, w);
+		}
 	}
 
 	normalize_v3(ver->n);

Modified: branches/render25/source/blender/render/intern/source/object_subdivide.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_subdivide.c	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/object_subdivide.c	2010-04-08 12:21:31 UTC (rev 28092)
@@ -68,8 +68,8 @@
 	obin= MEM_callocN(sizeof(ObjectInstanceRen), "ObjectInstanceRen");
 	memcpy(obin, obi, sizeof(ObjectInstanceRen));
 	obin->next= obin->prev= NULL;
-	obin->vectors= NULL; // ...
-	obin->raytree= NULL; // ...
+	obin->vectors= NULL;
+	obin->raytree= NULL;
 
 	return obin;
 }
@@ -211,8 +211,10 @@
 	vertex_weight(w, M, u, v, vi);
 }
 
-static void render_face_subdivide(Render *re, RenderCamera *cam, float winmat[4][4], float bounds[4], ObjectRen *obrn, ObjectRen *obr, VlakRen *vlr, int quad, int depth, float M[4][4], float displacebound, float subdivision_rate)
+static void render_face_subdivide(Render *re, RenderCamera *cam, float winmat[4][4], float bounds[4], ObjectInstanceRen *obin, ObjectInstanceRen *obi, VlakRen *vlr, int quad, int depth, float M[4][4], float displacebound, float subdivision_rate)
 {
+	ObjectRen *obrn= obin->obr;
+	ObjectRen *obr= obi->obr;
 	VertRen *s1, *s2, *s3;
 	float w[4], pM[4][4], fw[4][4];
 	int i, j, vi[4], offset, res, split;
@@ -259,7 +261,7 @@
 			}
 
 			if(!render_vlak_clip(obr, vlr, sM, winmat, bounds, displacebound, quad))
-				render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
+				render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, quad, depth+1, sM, displacebound, subdivision_rate);
 		}
 	}
 	else {
@@ -267,7 +269,7 @@
 			for(i=0; i<=j; i++) {
 				face_vertex_weight(w, pM, i, j, res, vi);
 
-				render_object_vert_interp(obrn, obr, &vlr->v1, w, (vlr->v4)? 4: 3);
+				render_object_vert_interp(obin, obi, &vlr->v1, w, (vlr->v4)? 4: 3);
 
 				if(i > 0 && j > 0) {
 					s1= render_object_vert_get(obrn, offset-j-1);
@@ -299,25 +301,25 @@
 	}
 }
 
-static ObjectRen *render_object_tile_subdivide(Render *re, ObjectRen *obr, RenderCamera *cam, float winmat[4][4], float bounds[4])
+static ObjectRen *render_object_tile_subdivide(Render *re, ObjectInstanceRen *obin, ObjectInstanceRen *obi, RenderCamera *cam, float winmat[4][4], float bounds[4])
 {
-	ObjectRen *obrn;
+	ObjectRen *obrn, *obr= obi->obr;
 	VlakRen *vlr;
 	int a;
 	float displacebound= obr->ob->displacebound;
 	float subdivision_rate= re->params.r.subdivision_rate*obr->ob->subdivision_rate;
 
-	obrn= render_object_temp_copy(obr);
+	obin->obr= obrn= render_object_temp_copy(obr);
 
 	/* copy subdivided faces */
 	for(a=0; a<obr->totvlak; a++) {
 		vlr= render_object_vlak_get(obr, a);
 
 		if(!render_vlak_clip(obr, vlr, NULL, winmat, bounds, displacebound, 0))
-			render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, 0, 0, NULL, displacebound, subdivision_rate);
+			render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, 0, 0, NULL, displacebound, subdivision_rate);
 
 		if(vlr->v4 && !render_vlak_clip(obr, vlr, NULL, winmat, bounds, displacebound, 1))
-			render_face_subdivide(re, cam, winmat, bounds, obrn, obr, vlr, 1, 0, NULL, displacebound, subdivision_rate);
+			render_face_subdivide(re, cam, winmat, bounds, obin, obi, vlr, 1, 0, NULL, displacebound, subdivision_rate);
 
 		if(re->cb.test_break(re->cb.tbh))
 			break;
@@ -326,11 +328,11 @@
 	return obrn;
 }
 
-static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen *obi, float winmat[4][4], float bounds[4], int thread)
+static ObjectRen *render_instance_tile_subdivide(Render *re, ObjectInstanceRen *obin, ObjectInstanceRen *obi, float winmat[4][4], float bounds[4], int thread)
 {
 	ObjectRen *obrn;
 
-	obrn= render_object_tile_subdivide(re, obi->obr, &re->cam, winmat, bounds);
+	obrn= render_object_tile_subdivide(re, obin, obi, &re->cam, winmat, bounds);
 	if(!re->cb.test_break(re->cb.tbh))
 		finalize_render_object(re, obrn, 0, thread);
 
@@ -371,8 +373,7 @@
 
 		obin= render_instance_temp_copy(obi);
 
-		obrn= render_instance_tile_subdivide(re, obi, winmat, bounds, pa->thread);
-		obin->obr= obrn;
+		obrn= render_instance_tile_subdivide(re, obin, obi, winmat, bounds, pa->thread);
 
 		BLI_ghash_insert(pa->subdivhash, obi, obin);
 	}

Modified: branches/render25/source/blender/render/intern/source/texture_stack.c
===================================================================
--- branches/render25/source/blender/render/intern/source/texture_stack.c	2010-04-08 11:57:23 UTC (rev 28091)
+++ branches/render25/source/blender/render/intern/source/texture_stack.c	2010-04-08 12:21:31 UTC (rev 28092)
@@ -766,7 +766,7 @@
 	}
 }
 
-void do_material_tex(Render *re, ShadeInput *shi)
+void do_material_tex(Render *re, ShadeInput *shi, int mapto_flag)
 {
 	MTex *mtex;
 	Tex *tex;
@@ -776,7 +776,7 @@
 	float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
 	int tex_nr, rgbnor= 0, warpdone=0;
 	float nu[3] = {0,0,0}, nv[3] = {0,0,0}, nn[3] = {0,0,0}, dudnu = 1.f, dudnv = 0.f, dvdnu = 0.f, dvdnv = 1.f; // bump mapping
-	int nunvdone= 0;
+	int nunvdone= 0, mapto;
 
 	if (re->params.r.scemode & R_NO_TEX) return;
 	/* here: test flag if there's a tex (todo) */
@@ -792,6 +792,11 @@
 			tex= mtex->tex;
 			if(tex==0) continue;
 
+			/* only process if this texture is mapped 
+			 * to one that we're interested in */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list