[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30073] branches/render25/source/blender/ render/intern: Render Branch: code to check if ao/env/ indirect should be computed

Brecht Van Lommel brecht at blender.org
Wed Jul 7 13:13:35 CEST 2010


Revision: 30073
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30073
Author:   blendix
Date:     2010-07-07 13:13:34 +0200 (Wed, 07 Jul 2010)

Log Message:
-----------
Render Branch: code to check if ao/env/indirect should be computed
was confusing and wrong in a few cases, with shadeless, ambient,
passes, etc, now added a single function for it.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/include/material.h
    branches/render25/source/blender/render/intern/include/shading.h
    branches/render25/source/blender/render/intern/source/bake.c
    branches/render25/source/blender/render/intern/source/cache.c
    branches/render25/source/blender/render/intern/source/material.c
    branches/render25/source/blender/render/intern/source/shadeoutput.c

Modified: branches/render25/source/blender/render/intern/include/material.h
===================================================================
--- branches/render25/source/blender/render/intern/include/material.h	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/include/material.h	2010-07-07 11:13:34 UTC (rev 30073)
@@ -80,5 +80,9 @@
 
 void mat_displacement(struct Render *re, struct ShadeInput *shi, float displacement[3]);
 
+/* Queries */
+
+int mat_need_ao_env_indirect(struct Render *re, struct ShadeInput *shi);
+
 #endif /* __RENDER_MATERIAL_H__ */
 

Modified: branches/render25/source/blender/render/intern/include/shading.h
===================================================================
--- branches/render25/source/blender/render/intern/include/shading.h	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/include/shading.h	2010-07-07 11:13:34 UTC (rev 30073)
@@ -103,7 +103,7 @@
 /* Utilities */
 void environment_lighting_apply(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr);
 
-void ambient_occlusion(struct Render *re, struct ShadeInput *shi);
+void shade_ao_env_indirect(struct Render *re, struct ShadeInput *shi);
 float fresnel_fac(float *view, float *vn, float fresnel, float fac);
 void shade_ray(struct Render *re, struct Isect *is, struct ShadeInput *shi, struct ShadeResult *shr);
 

Modified: branches/render25/source/blender/render/intern/source/bake.c
===================================================================
--- branches/render25/source/blender/render/intern/source/bake.c	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/source/bake.c	2010-07-07 11:13:34 UTC (rev 30073)
@@ -196,7 +196,7 @@
 	VlakRen *vlr= shi->primitive.vlr;
 	
 	if(bs->type==RE_BAKE_AO) {
-		ambient_occlusion(re, shi);
+		shade_ao_env_indirect(re, shi);
 
 		if(re->params.r.bake_flag & R_BAKE_NORMALIZE) {
 			copy_v3_v3(shr.combined, shi->shading.ao);

Modified: branches/render25/source/blender/render/intern/source/cache.c
===================================================================
--- branches/render25/source/blender/render/intern/source/cache.c	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/source/cache.c	2010-07-07 11:13:34 UTC (rev 30073)
@@ -51,14 +51,12 @@
 
 /******************************** Utilities **********************************/
 
-static int mat_need_cache(Render *re, Material *ma)
+static int mat_need_cache(Render *re, ShadeInput *shi)
 {
-	if(ma->mode & MA_SHLESS)
+	if(!mat_need_ao_env_indirect(re, shi))
 		return 0;
-	else if(ma->amb == 0.0f && !(ma->mapto & MAP_AMB))
+	else if(!re->db.sss_pass && mat_has_only_sss(shi->material.mat))
 		return 0;
-	else if(!re->db.sss_pass && mat_has_only_sss(ma))
-		return 0;
 	
 	return 1;
 }
@@ -227,7 +225,7 @@
 			shade_samples_from_pixel(re, ssamp, &row[0], x, y);
 
 			shi= ssamp->shi;
-			if(shi->primitive.vlr && mat_need_cache(re, shi->material.mat)) {
+			if(shi->primitive.vlr && mat_need_cache(re, shi)) {
 				disk_occlusion_sample_direct(re, shi);
 
 				copy_v3_v3(sample->co, shi->geometry.co);
@@ -1117,7 +1115,7 @@
 						float *indirect= (re->db.wrld.mode & WO_INDIRECT_LIGHT)? shi->shading.indirect: NULL;
 						int added;
 
-						if(!mat_need_cache(re, shi->material.mat))
+						if(!mat_need_cache(re, shi))
 							continue;
 
 						if(shi->primitive.strand) {

Modified: branches/render25/source/blender/render/intern/source/material.c
===================================================================
--- branches/render25/source/blender/render/intern/source/material.c	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/source/material.c	2010-07-07 11:13:34 UTC (rev 30073)
@@ -653,3 +653,36 @@
 	}
 }
 
+/* Queries */
+
+int mat_need_ao_env_indirect(Render *re, ShadeInput *shi)
+{
+	Material *ma= shi->material.mat;
+
+	/* do we have it enabled at all? */
+	if(!(re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)))
+		return 0;
+	if(!((re->params.r.mode & R_RAYTRACE) || re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX))
+		return 0;
+	
+	/* if requested for passes, always render it */
+	if(shi->shading.passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))
+		return 1;
+
+	if(shi->shading.passflag & SCE_PASS_COMBINED) {
+		/* rendering combined but no included, so can skip */
+		if(!(shi->shading.combinedflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT)))
+			return 0;
+
+		/* some materials don't need it */
+		if(ma->mode & MA_SHLESS)
+			return 0;
+		else if(ma->amb == 0.0f && !(ma->mapto & MAP_AMB))
+			return 0;
+
+		return 1;
+	}
+
+	return 0;
+}
+

Modified: branches/render25/source/blender/render/intern/source/shadeoutput.c
===================================================================
--- branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-07-07 09:29:11 UTC (rev 30072)
+++ branches/render25/source/blender/render/intern/source/shadeoutput.c	2010-07-07 11:13:34 UTC (rev 30073)
@@ -113,15 +113,14 @@
 	}
 }
 
-/***************************** Ambient Occlusion *****************************/
+/***************************** AO / Env / Indirect *****************************/
 
-/* pure AO, check for raytrace and world should have been done */
-/* preprocess, textures were not done, don't use shi->material.amb for that reason */
-void ambient_occlusion(Render *re, ShadeInput *shi)
+void shade_ao_env_indirect(Render *re, ShadeInput *shi)
 {
-	if((re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX) && shi->material.mat->amb!=0.0f)
+	if(re->db.wrld.ao_gather_method == WO_LIGHT_GATHER_APPROX) {
 		disk_occlusion_sample(re, shi);
-	else if((re->params.r.mode & R_RAYTRACE) && shi->material.mat->amb!=0.0f) {
+	}
+	else if(re->params.r.mode & R_RAYTRACE) {
 		int thread= shi->shading.thread;
 		float *ao= (re->db.wrld.mode & WO_AMB_OCC)? shi->shading.ao: NULL;
 		float *env= (re->db.wrld.mode & WO_ENV_LIGHT)? shi->shading.env: NULL;
@@ -170,31 +169,32 @@
 
 	copy_v3_v3(shr->ao, shi->shading.ao);
 
-	if(!(shi->shading.combinedflag & SCE_PASS_AO))
-		return;
+	if(shi->shading.combinedflag & SCE_PASS_AO) {
+		if(f == 0.0f)
+			return;
 
-	if(f == 0.0f)
-		return;
+		if(re->db.wrld.aomix==WO_AO_ADD) {
+			/* additive */
+			mat_color(color, &shi->material);
 
-	if(re->db.wrld.aomix==WO_AO_ADD) {
-		mat_color(color, &shi->material);
+			shr->diff[0] += shi->shading.ao[0]*color[0]*f;
+			shr->diff[1] += shi->shading.ao[1]*color[1]*f;
+			shr->diff[2] += shi->shading.ao[2]*color[2]*f;
+		}
+		else if(re->db.wrld.aomix==WO_AO_MUL) {
+			/* multiply to darken */
+			mul_v3_v3v3(tmp, shr->diff, shi->shading.ao);
+			mul_v3_v3v3(tmpspec, shr->spec, shi->shading.ao);
 
-		shr->diff[0] += shi->shading.ao[0]*color[0]*f;
-		shr->diff[1] += shi->shading.ao[1]*color[1]*f;
-		shr->diff[2] += shi->shading.ao[2]*color[2]*f;
-	}
-	else if(re->db.wrld.aomix==WO_AO_MUL) {
-		mul_v3_v3v3(tmp, shr->diff, shi->shading.ao);
-		mul_v3_v3v3(tmpspec, shr->spec, shi->shading.ao);
-
-		if(f == 1.0f) {
-			copy_v3_v3(shr->diff, tmp);
-			copy_v3_v3(shr->spec, tmpspec);
+			if(f == 1.0f) {
+				copy_v3_v3(shr->diff, tmp);
+				copy_v3_v3(shr->spec, tmpspec);
+			}
+			else {
+				interp_v3_v3v3(shr->diff, shr->diff, tmp, f);
+				interp_v3_v3v3(shr->spec, shr->spec, tmpspec, f);
+			}
 		}
-		else {
-			interp_v3_v3v3(shr->diff, shr->diff, tmp, f);
-			interp_v3_v3v3(shr->spec, shr->spec, tmpspec, f);
-		}
 	}
 }
 
@@ -218,19 +218,6 @@
 		add_v3_v3(shr->diff, shr->indirect);
 }
 
-static void shade_compute_ao(Render *re, ShadeInput *shi, ShadeResult *shr)
-{
-	int passflag= shi->shading.passflag;
-
-	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);
-		}
-	}
-}
-
 /********************************* Shading ***********************************/
 
 static float shade_phong_correction(Render *re, LampRen *lar, ShadeInput *shi, float *lv)
@@ -301,10 +288,10 @@
 	}
 	
 	/* quite disputable this...  also note it doesn't mirror-raytrace */	
-	if((re->db.wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT)) && shi->material.amb!=0.0f) {
+	if(mat_need_ao_env_indirect(re, shi)) {
 		float f;
 
-		ambient_occlusion(re, shi);
+		shade_ao_env_indirect(re, shi);
 		
 		if(re->db.wrld.mode & WO_AMB_OCC) {
 			f= re->db.wrld.aoenergy*shi->material.amb;
@@ -702,20 +689,17 @@
 	int post_sss= ((ma->sss_flag & MA_DIFF_SSS) && sss_pass_done(re, ma));
 
 	if(!post_sss || (passflag & (SCE_PASS_AO|SCE_PASS_ENVIRONMENT|SCE_PASS_INDIRECT))) {
-		shade_compute_ao(re, shi, shr); /* .ao */
+		if(mat_need_ao_env_indirect(re, shi)) {
+			shade_ao_env_indirect(re, shi);
 
-		/* 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(re->db.wrld.mode & WO_ENV_LIGHT)
-					environment_lighting_apply(re, shi, shr);
+			if(re->db.wrld.mode & WO_ENV_LIGHT)
+				environment_lighting_apply(re, shi, shr);
 
-				if(re->db.wrld.mode & WO_INDIRECT_LIGHT)
-					indirect_lighting_apply(re, shi, shr);
+			if(re->db.wrld.mode & WO_INDIRECT_LIGHT)
+				indirect_lighting_apply(re, shi, shr);
 
-				if(re->db.wrld.mode & WO_AMB_OCC)
-					ambient_occlusion_apply(re, shi, shr);
-			}
+			if(re->db.wrld.mode & WO_AMB_OCC)
+				ambient_occlusion_apply(re, shi, shr);
 		}
 			
 		/* ambient light */





More information about the Bf-blender-cvs mailing list