[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