[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28231] branches/render25/source/blender/ render/intern: Render Branch: SSS now works together with irradiance caching.

Brecht Van Lommel brecht at blender.org
Fri Apr 16 16:09:25 CEST 2010


Revision: 28231
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28231
Author:   blendix
Date:     2010-04-16 16:09:25 +0200 (Fri, 16 Apr 2010)

Log Message:
-----------
Render Branch: SSS now works together with irradiance caching.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/zbuf.h
    branches/render25/source/blender/render/intern/source/cache.c
    branches/render25/source/blender/render/intern/source/rendercore.c
    branches/render25/source/blender/render/intern/source/shadeoutput.c
    branches/render25/source/blender/render/intern/source/zbuf.c

Modified: branches/render25/source/blender/render/intern/include/zbuf.h
===================================================================
--- branches/render25/source/blender/render/intern/include/zbuf.h	2010-04-16 12:00:56 UTC (rev 28230)
+++ branches/render25/source/blender/render/intern/include/zbuf.h	2010-04-16 14:09:25 UTC (rev 28231)
@@ -60,7 +60,7 @@
 /* SSS Rasterization */
 
 void zbuffer_sss(struct Render *re, struct RenderPart *pa, unsigned int lay,
-	void *handle, void (*func)(void*, int, int, int, int, int));
+	void *handle, void (*func)(void*, int, int, int, int, int), struct ListBase *psmlist);
 
 /* Pixel Struct Utilities */
 

Modified: branches/render25/source/blender/render/intern/source/cache.c
===================================================================
--- branches/render25/source/blender/render/intern/source/cache.c	2010-04-16 12:00:56 UTC (rev 28230)
+++ branches/render25/source/blender/render/intern/source/cache.c	2010-04-16 14:09:25 UTC (rev 28231)
@@ -47,15 +47,18 @@
 #include "rendercore.h"
 #include "render_types.h"
 #include "shading.h"
+#include "sss.h"
 
 /******************************** Utilities **********************************/
 
-static int mat_need_cache(Material *ma)
+static int mat_need_cache(Render *re, Material *ma)
 {
 	if(ma->mode & MA_SHLESS)
 		return 0;
 	else if(ma->amb == 0.0f && !(ma->mapto & MAP_AMB))
 		return 0;
+	else if((ma->sss_flag & MA_DIFF_SSS) && sss_pass_done(re, ma))
+		return 0;
 	
 	return 1;
 }
@@ -220,12 +223,11 @@
 			if(!(((y - pa->disprect.ymin + step) % step) == 0 || y == pa->disprect.ymax-1))
 				continue;
 
-			/* XXX test */
 			totrow= pixel_row_fill(row, re, pa, offs);
 			shade_samples_from_pixel(re, ssamp, &row[0], x, y);
 
 			shi= ssamp->shi;
-			if(shi->primitive.vlr && mat_need_cache(shi->material.mat)) {
+			if(shi->primitive.vlr && mat_need_cache(re, shi->material.mat)) {
 				disk_occlusion_sample_direct(re, shi);
 
 				copy_v3_v3(sample->co, shi->geometry.co);
@@ -1077,7 +1079,7 @@
 						float *indirect= (re->db.wrld.mode & WO_INDIRECT_LIGHT)? shi->shading.indirect: NULL;
 						int added;
 
-						if(!mat_need_cache(shi->material.mat))
+						if(!mat_need_cache(re, shi->material.mat))
 							continue;
 
 						if(shi->primitive.strand) {

Modified: branches/render25/source/blender/render/intern/source/rendercore.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rendercore.c	2010-04-16 12:00:56 UTC (rev 28230)
+++ branches/render25/source/blender/render/intern/source/rendercore.c	2010-04-16 14:09:25 UTC (rev 28231)
@@ -1027,19 +1027,17 @@
 	*area *= alpha;
 }
 
-static void zbufshade_sss_free(RenderPart *pa)
+static void zbufshade_sss_free(RenderPart *pa, ListBase *psmlist)
 {
-#if 0
-	MEM_freeN(pa->rectall); pa->rectall= NULL;
-	free_pixel_structs(&handle.psmlist);
-#else
 	MEM_freeN(pa->rectz); pa->rectz= NULL;
 	MEM_freeN(pa->rectp); pa->rectp= NULL;
 	MEM_freeN(pa->recto); pa->recto= NULL;
 	MEM_freeN(pa->rectbackz); pa->rectbackz= NULL;
 	MEM_freeN(pa->rectbackp); pa->rectbackp= NULL;
 	MEM_freeN(pa->rectbacko); pa->rectbacko= NULL;
-#endif
+	MEM_freeN(pa->rectdaps); pa->rectdaps= NULL;
+
+	free_pixel_structs(psmlist);
 }
 
 static void render_sss_layer(Render *re, RenderResult *rr, Material *ma, ShadeInput *shi)
@@ -1086,30 +1084,20 @@
 	Material *mat= re->db.sss_mat;
 	float (*co)[3], (*color)[3], *area, *fcol;
 	int x, y, seed, quad, totpoint, display = !(re->params.r.scemode & R_PREVIEWBUTS);
-	int *ro, *rz, *rp, *rbo, *rbz, *rbp, lay;
-#if 0
-	PixStr *ps;
-	void **rs;
-	int z;
-#endif
+	int lay, offs, a;
+	ListBase psmlist= {NULL, NULL};
 
 	/* setup pixelstr list and buffer for zbuffering */
 	handle.pa= pa;
 	handle.totps= 0;
 
-#if 0
-	handle.psmlist.first= handle.psmlist.last= NULL;
-	addpsmain(&handle.psmlist);
-
-	pa->rectall= MEM_callocN(sizeof(void*)*pa->rectx*pa->recty+4, "rectall");
-#else
 	pa->recto= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "recto");
 	pa->rectp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectp");
 	pa->rectz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectz");
 	pa->rectbacko= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbacko");
 	pa->rectbackp= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackp");
 	pa->rectbackz= MEM_mallocN(sizeof(int)*pa->rectx*pa->recty, "rectbackz");
-#endif
+	pa->rectdaps= MEM_callocN(sizeof(void*)*pa->rectx*pa->recty+4, "zbufDArectd");
 
 	/* setup shade sample with correct passes */
 	memset(&ssamp, 0, sizeof(ssamp));
@@ -1126,13 +1114,13 @@
 	ssamp.shi[0].material.light_override= NULL;
 
 	/* create the pixelstrs to be used later */
-	zbuffer_sss(re, pa, lay, &handle, addps_sss);
+	zbuffer_sss(re, pa, lay, &handle, addps_sss, &psmlist);
 
 	if(handle.totps==0) {
-		zbufshade_sss_free(pa);
+		zbufshade_sss_free(pa, &psmlist);
 		return;
 	}
-	
+
 	fcol= rl->rectf;
 
 	co= MEM_mallocN(sizeof(float)*3*handle.totps, "SSSCo");
@@ -1145,6 +1133,11 @@
 		irregular_shadowbuf_create(re, pa, NULL);
 #endif
 
+	if(re->db.occlusiontree)
+		disk_occlusion_cache_create(re, pa, &ssamp);
+	else
+		irr_cache_create(re, pa, rl, &ssamp);
+	
 	if(display) {
 		/* initialize scanline updates for main thread */
 		rr->renrect.ymin= 0;
@@ -1152,94 +1145,49 @@
 	}
 	
 	seed= pa->rectx*pa->disprect.ymin;
-#if 0
-	rs= pa->rectall;
-#else
-	rz= pa->rectz;
-	rp= pa->rectp;
-	ro= pa->recto;
-	rbz= pa->rectbackz;
-	rbp= pa->rectbackp;
-	rbo= pa->rectbacko;
-#endif
 	totpoint= 0;
+	offs= 0;
 
 	for(y=pa->disprect.ymin; y<pa->disprect.ymax; y++, rr->renrect.ymax++) {
-		for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, fcol+=4) {
+		for(x=pa->disprect.xmin; x<pa->disprect.xmax; x++, fcol+=4, offs++) {
+			PixelRow *row= pa->pixelrow;
+			int totrow;
+
 			/* per pixel fixed seed */
 			BLI_thread_srandom(pa->thread, seed++);
 			
-#if 0
-			if(rs) {
-				/* for each sample in this pixel, shade it */
-				for(ps=(PixStr*)*rs; ps; ps=ps->next) {
-					ObjectInstanceRen *obi= &re->db.objectinstance[ps->obi];
-					ObjectRen *obr= obi->obr;
-					vlr= render_object_vlak_get(obr, (ps->facenr-1) & RE_QUAD_MASK);
-					quad= (ps->facenr & RE_QUAD_OFFS);
-					z= ps->z;
+			totrow= pixel_row_fill(row, re, pa, offs);
 
-					shade_sample_sss(re, &ssamp, mat, obi, vlr, quad, x, y, z,
-						co[totpoint], color[totpoint], &area[totpoint]);
+			for(a=0; a<totrow; a++) {
+				ObjectInstanceRen *obi= &re->db.objectinstance[row[a].obi];
 
-					totpoint++;
+				/* shade front */
+				vlr= render_object_vlak_get(obi->obr, (row[a].p-1) & RE_QUAD_MASK);
+				quad= ((row[a].p) & RE_QUAD_OFFS);
 
-					add_v3_v3v3(fcol, fcol, color);
-					fcol[3]= 1.0f;
-				}
-
-				rs++;
-			}
-#else
-			if(rp) {
-				if(*rp != 0) {
-					ObjectInstanceRen *obi= &re->db.objectinstance[*ro];
-					ObjectRen *obr= obi->obr;
-
-					/* shade front */
-					vlr= render_object_vlak_get(obr, (*rp-1) & RE_QUAD_MASK);
-					quad= ((*rp) & RE_QUAD_OFFS);
-
-					shade_sample_sss(re, &ssamp, mat, obi, vlr, quad, x, y, *rz,
-						co[totpoint], color[totpoint], &area[totpoint]);
-					
-					add_v3_v3v3(fcol, fcol, color[totpoint]);
-					fcol[3]= 1.0f;
-					totpoint++;
-				}
-
-				rp++; rz++; ro++;
-			}
-
-			if(rbp) {
-				if(*rbp != 0 && !(*rbp == *(rp-1) && *rbo == *(ro-1))) {
-					ObjectInstanceRen *obi= &re->db.objectinstance[*rbo];
-					ObjectRen *obr= obi->obr;
-
-					/* shade back */
-					vlr= render_object_vlak_get(obr, (*rbp-1) & RE_QUAD_MASK);
-					quad= ((*rbp) & RE_QUAD_OFFS);
-
-					shade_sample_sss(re, &ssamp, mat, obi, vlr, quad, x, y, *rbz,
-						co[totpoint], color[totpoint], &area[totpoint]);
-					
-					/* to indicate this is a back sample */
+				shade_sample_sss(re, &ssamp, mat, obi, vlr, quad, x, y, row[a].z,
+					co[totpoint], color[totpoint], &area[totpoint]);
+				
+				/* to indicate this is a back sample */
+				if(a > 0)
 					area[totpoint]= -area[totpoint];
 
-					add_v3_v3v3(fcol, fcol, color[totpoint]);
-					fcol[3]= 1.0f;
-					totpoint++;
-				}
-
-				rbz++; rbp++; rbo++;
+				add_v3_v3v3(fcol, fcol, color[totpoint]);
+				fcol[3]= 1.0f;
+				totpoint++;
 			}
-#endif
 		}
 
 		if(y&1)
 			if(re->cb.test_break(re->cb.tbh)) break; 
 	}
 
+	/* free tile precomputed data */
+	if(re->db.occlusiontree)
+		disk_occlusion_cache_free(re, pa);
+	else
+		irr_cache_free(re, pa);
+
 	/* note: after adding we do not free these arrays, sss keeps them */
 	if(totpoint > 0) {
 		sss_add_points(re, co, color, area, totpoint);
@@ -1261,6 +1209,6 @@
 		rr->renlay= render_get_active_layer(re, rr);
 	}
 	
-	zbufshade_sss_free(pa);
+	zbufshade_sss_free(pa, &psmlist);
 }
 

Modified: branches/render25/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-04-16 12:00:56 UTC (rev 28230)
+++ branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-04-16 14:09:25 UTC (rev 28231)
@@ -381,11 +381,12 @@
 	if(!shi->primitive.strand && shi->shading.depth == 0 && count > 1 && count <= max) {
 		float xs, ys, zs, view[3];
 		int samp, ordsamp, tot= 0;
+		int osa= (re->params.osa)? re->params.osa: 1;
 
-		for(samp=0; samp<re->params.osa; samp++) {
-			if(re->params.osa == 8) ordsamp = order8[samp];
-			else if(re->params.osa == 11) ordsamp = order11[samp];
-			else if(re->params.osa == 16) ordsamp = order16[samp];
+		for(samp=0; samp<osa; samp++) {
+			if(osa == 8) ordsamp = order8[samp];
+			else if(osa == 11) ordsamp = order11[samp];
+			else if(osa == 16) ordsamp = order16[samp];
 			else ordsamp = samp;
 
 			if(shi->shading.mask & (1<<ordsamp)) {
@@ -692,30 +693,34 @@
 
 static void shade_surface_indirect(Render *re, ShadeInput *shi, ShadeResult *shr, int backside)
 {
+	Material *ma= shi->material.mat;
 	int passflag= shi->shading.passflag;
+	int post_sss= ((ma->sss_flag & MA_DIFF_SSS) && sss_pass_done(re, ma));
 
-	shade_compute_ao(re, shi, shr); /* .ao */
+	if(!post_sss) {
+		shade_compute_ao(re, shi, shr); /* .ao */
 
-	/* add AO in combined? */
-	if((re->params.r.mode & R_RAYTRACE) || re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX) {
-		if(re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) {
-			if(((passflag & SCE_PASS_COMBINED) && (shi->shading.combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
-				|| (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
-				ambient_occlusion(re, shi);
+		/* add AO in combined? */

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list