[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13368] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jan 23 14:35:52 CET 2008


Revision: 13368
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13368
Author:   blendix
Date:     2008-01-23 14:35:51 +0100 (Wed, 23 Jan 2008)

Log Message:
-----------

Minor render memory usage optimization, removed layer and
radface from VlakRen, saves about 100mb for 10 million faces.

Modified Paths:
--------------
    trunk/blender/source/blender/radiosity/intern/source/radrender.c
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/include/renderdatabase.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/rayshade.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c
    trunk/blender/source/blender/render/intern/source/shadbuf.c
    trunk/blender/source/blender/render/intern/source/shadeoutput.c
    trunk/blender/source/blender/render/intern/source/strand.c
    trunk/blender/source/blender/render/intern/source/zbuf.c

Modified: trunk/blender/source/blender/radiosity/intern/source/radrender.c
===================================================================
--- trunk/blender/source/blender/radiosity/intern/source/radrender.c	2008-01-23 13:24:44 UTC (rev 13367)
+++ trunk/blender/source/blender/radiosity/intern/source/radrender.c	2008-01-23 13:35:51 UTC (rev 13368)
@@ -84,22 +84,23 @@
 
 /* find the face with maximum energy to become shooter */
 /* nb: _rr means rad-render version of existing radio call */
-static VlakRen *findshoot_rr(Render *re)
+static void findshoot_rr(Render *re, VlakRen **shoot_p, RadFace **shootrf_p)
 {
-	RadFace *rf;
+	RadFace *rf, *shootrf, **radface;
 	ObjectRen *obr;
 	VlakRen *vlr=NULL, *shoot;
 	float energy;
 	int a;
 	
 	shoot= NULL;
+	shootrf= NULL;
 	maxenergy= 0.0;
 	
 	for(obr=re->objecttable.first; obr; obr=obr->next) {
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
-			if(vlr->radface) {
-				rf= vlr->radface;
+			if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
 				rf->flag &= ~RAD_SHOOT;
 				
 				energy= rf->unshot[0]*rf->area;
@@ -108,26 +109,31 @@
 
 				if(energy>maxenergy) {
 					shoot= vlr;
+					shootrf= rf;
 					maxenergy= energy;
 				}
 			}
 		}
 	}
 
-	if(shoot) {
+	if(shootrf) {
 		maxenergy/= RG.totenergy;
-		if(maxenergy<RG.convergence) return NULL;
-		shoot->radface->flag |= RAD_SHOOT;
+		if(maxenergy<RG.convergence) {
+			*shoot_p= NULL;
+			*shootrf_p= NULL;
+		}
+		shootrf->flag |= RAD_SHOOT;
 	}
 
-	return shoot;
+	*shoot_p= shoot;
+	*shootrf_p= shootrf;
 }
 
-static void backface_test_rr(Render *re, VlakRen *shoot)
+static void backface_test_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
 {
 	ObjectRen *obr;
 	VlakRen *vlr=NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	float tvec[3];
 	int a;
 	
@@ -135,9 +141,9 @@
 	for(obr=re->objecttable.first; obr; obr=obr->next) {
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
-			if(vlr->radface && vlr!=shoot) {
-				rf= vlr->radface;
-				VecSubf(tvec, shoot->radface->cent, rf->cent);
+			if(vlr != shoot && (radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
+				VecSubf(tvec, shootrf->cent, rf->cent);
 				
 				if(tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0)
 					rf->flag |= RAD_BACKFACE;
@@ -150,7 +156,7 @@
 {
 	ObjectRen *obr;
 	VlakRen *vlr=NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	int a;
 	
 	/* backface flag clear */
@@ -158,8 +164,8 @@
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
 			
-			if(vlr->radface) {
-				rf= vlr->radface;
+			if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
 				rf->flag &= ~RAD_BACKFACE;
 			}
 		}
@@ -169,11 +175,11 @@
 extern RadView hemitop, hemiside; // radfactors.c
 
 /* hemi-zbuffering, delivers formfactors array */
-static void makeformfactors_rr(Render *re, VlakRen *shoot)
+static void makeformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
 {
 	ObjectRen *obr;
 	VlakRen *vlr=NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	float len, vec[3], up[3], side[3], tar[5][3], *fp;
 	int a;
 
@@ -182,25 +188,25 @@
 	/* set up hemiview */
 	/* first: upvector for hemitop, we use diagonal hemicubes to prevent aliasing */
 	
-	VecSubf(vec, shoot->v1->co, shoot->radface->cent);
-	Crossf(up, shoot->radface->norm, vec);
+	VecSubf(vec, shoot->v1->co, shootrf->cent);
+	Crossf(up, shootrf->norm, vec);
 	len= Normalize(up);
 	
 	VECCOPY(hemitop.up, up);
-	VECCOPY(hemiside.up, shoot->radface->norm);
+	VECCOPY(hemiside.up, shootrf->norm);
 
-	Crossf(side, shoot->radface->norm, up);
+	Crossf(side, shootrf->norm, up);
 
 	/* five targets */
-	VecAddf(tar[0], shoot->radface->cent, shoot->radface->norm);
-	VecAddf(tar[1], shoot->radface->cent, up);
-	VecSubf(tar[2], shoot->radface->cent, up);
-	VecAddf(tar[3], shoot->radface->cent, side);
-	VecSubf(tar[4], shoot->radface->cent, side);
+	VecAddf(tar[0], shootrf->cent, shootrf->norm);
+	VecAddf(tar[1], shootrf->cent, up);
+	VecSubf(tar[2], shootrf->cent, up);
+	VecAddf(tar[3], shootrf->cent, side);
+	VecSubf(tar[4], shootrf->cent, side);
 
 	/* camera */
-	VECCOPY(hemiside.cam, shoot->radface->cent);
-	VECCOPY(hemitop.cam, shoot->radface->cent);
+	VECCOPY(hemiside.cam, shootrf->cent);
+	VECCOPY(hemitop.cam, shootrf->cent);
 
 	/* do it! */
 	VECCOPY(hemitop.tar, tar[0]);
@@ -218,10 +224,10 @@
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
 			
-			if(vlr->radface) {
-				rf= vlr->radface;
+			if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
 				if(*fp!=0.0 && rf->area!=0.0) {
-					*fp *= shoot->radface->area/rf->area;
+					*fp *= shootrf->area/rf->area;
 					if(*fp>1.0) *fp= 1.0001;
 				}
 				fp++;
@@ -231,17 +237,17 @@
 }
 
 /* based at RG.formfactors array, distribute shoot energy over other faces */
-static void applyformfactors_rr(Render *re, VlakRen *shoot)
+static void applyformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf)
 {
 	ObjectRen *obr;
 	VlakRen *vlr=NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	float *fp, *ref, unr, ung, unb, r, g, b;
 	int a;
 
-	unr= shoot->radface->unshot[0];
-	ung= shoot->radface->unshot[1];
-	unb= shoot->radface->unshot[2];
+	unr= shootrf->unshot[0];
+	ung= shootrf->unshot[1];
+	unb= shootrf->unshot[2];
 
 	fp= RG.formfactors;
 	
@@ -249,8 +255,8 @@
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
 			
-			if(vlr->radface) {
-				rf= vlr->radface;
+			if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
 				if(*fp!= 0.0) {
 					
 					ref= &(vlr->mat->r);
@@ -274,7 +280,7 @@
 		}
 	}
 	/* shoot energy has been shot */
-	shoot->radface->unshot[0]= shoot->radface->unshot[1]= shoot->radface->unshot[2]= 0.0;
+	shootrf->unshot[0]= shootrf->unshot[1]= shootrf->unshot[2]= 0.0;
 }
 
 
@@ -282,29 +288,30 @@
 static void progressiverad_rr(Render *re)
 {
 	VlakRen *shoot;
+	RadFace *shootrf;
 	float unshot[3];
 	int it= 0;
 	
-	shoot= findshoot_rr(re);
+	findshoot_rr(re, &shoot, &shootrf);
 	while( shoot ) {
 		
 		/* backfaces receive no energy, but are zbuffered... */
-		backface_test_rr(re, shoot);
+		backface_test_rr(re, shoot, shootrf);
 		
 		/* ...unless it's two sided */
-		if(shoot->radface->flag & RAD_TWOSIDED) {
-			VECCOPY(unshot, shoot->radface->unshot);
-			VecMulf(shoot->radface->norm, -1.0);
-			makeformfactors_rr(re, shoot);
-			applyformfactors_rr(re, shoot);
-			VecMulf(shoot->radface->norm, -1.0);
-			VECCOPY(shoot->radface->unshot, unshot);
+		if(shootrf->flag & RAD_TWOSIDED) {
+			VECCOPY(unshot, shootrf->unshot);
+			VecMulf(shootrf->norm, -1.0);
+			makeformfactors_rr(re, shoot, shootrf);
+			applyformfactors_rr(re, shoot, shootrf);
+			VecMulf(shootrf->norm, -1.0);
+			VECCOPY(shootrf->unshot, unshot);
 		}
 
 		/* hemi-zbuffers */
-		makeformfactors_rr(re, shoot);
+		makeformfactors_rr(re, shoot, shootrf);
 		/* based at RG.formfactors array, distribute shoot energy over other faces */
-		applyformfactors_rr(re, shoot);
+		applyformfactors_rr(re, shoot, shootrf);
 		
 		it++;
 		re->timecursor(it);
@@ -314,7 +321,7 @@
 		if(re->test_break()) break;
 		if(RG.maxiter && RG.maxiter<=it) break;
 		
-		shoot= findshoot_rr(re);
+		findshoot_rr(re, &shoot, &shootrf);
 	}
 	printf(" Unshot energy:%f\n", 1000.0*maxenergy);
 	
@@ -327,7 +334,7 @@
 {
 	ObjectRen *obr;
 	VlakRen *vlr= NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	int a, b;
 	
 	/* globals */
@@ -393,7 +400,8 @@
 	// uncommented; this isnt satisfying, but i leave it in the code for now (ton)			
 	//			if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED;
 				
-				vlr->radface= rf++;
+				radface=RE_vlakren_get_radface(obr, vlr, 1);
+				*radface= rf++;
 			}
 		}
 	}
@@ -428,7 +436,7 @@
 	ObjectRen *obr;
 	VertRen *v1=NULL;
 	VlakRen *vlr=NULL;
-	RadFace *rf;
+	RadFace *rf, **radface;
 	float *col;
 	int a;
 
@@ -440,8 +448,8 @@
 		for(a=0; a<obr->totvlak; a++) {
 			if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++;
 			
-			if(vlr->radface) {
-				rf= vlr->radface;
+			if((radface=RE_vlakren_get_radface(obr, vlr, 0))) {
+				rf= *radface;
 				
 				/* apply correction */
 				rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma);

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-23 13:24:44 UTC (rev 13367)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2008-01-23 13:35:51 UTC (rev 13368)
@@ -244,7 +244,7 @@
 	struct ObjectRen *next, *prev;
 	struct Object *ob, *par;
 	struct Scene *sce;
-	int index, psysindex, flag;
+	int index, psysindex, flag, lay;
 
 	int totvert, totvlak, totstrand, tothalo;
 	int vertnodeslen, vlaknodeslen, strandnodeslen, blohalen;
@@ -309,12 +309,10 @@
 
 typedef struct VlakRen {
 	struct VertRen *v1, *v2, *v3, *v4;	/* keep in order for ** addressing */
-	unsigned int lay;
 	float n[3];
 	struct Material *mat;
 	char puno;
 	char flag, ec;
-	RadFace *radface;
 	int index;
 } VlakRen;
 

Modified: trunk/blender/source/blender/render/intern/include/renderdatabase.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/renderdatabase.h	2008-01-23 13:24:44 UTC (rev 13367)
+++ trunk/blender/source/blender/render/intern/include/renderdatabase.h	2008-01-23 13:35:51 UTC (rev 13368)
@@ -42,6 +42,7 @@
 struct StrandBuffer;
 struct StrandRen;
 struct ObjectInstanceRen;
+struct RadFace;
 
 #define RE_QUAD_MASK	0x7FFFFFF
 #define RE_QUAD_OFFS	0x8000000
@@ -63,6 +64,7 @@
 	struct MCol *mcol;
 	int totmtface, totmcol;
 	float *surfnor;
+	struct RadFace **radface;
 } VlakTableNode;
 
 typedef struct StrandTableNode {
@@ -94,7 +96,7 @@
 struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma,   float *vec,   float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
 struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
 
-struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex);
+struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list