[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13512] trunk/blender/source/blender/ render/intern/source/occlusion.c:

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Feb 1 13:18:46 CET 2008


Revision: 13512
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13512
Author:   blendix
Date:     2008-02-01 13:18:45 +0100 (Fri, 01 Feb 2008)

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

- Small approximate AO optimization for falloff, saves some percentages
  render time.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/source/occlusion.c

Modified: trunk/blender/source/blender/render/intern/source/occlusion.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/occlusion.c	2008-02-01 12:14:15 UTC (rev 13511)
+++ trunk/blender/source/blender/render/intern/source/occlusion.c	2008-02-01 12:18:45 UTC (rev 13512)
@@ -1134,7 +1134,7 @@
 	OccNode *node, **stack;
 	OccFace *face;
 	float resultocc, v[3], p[3], n[3], co[3];
-	float distfac, error, d2, weight, emitarea;
+	float distfac, fac, error, d2, weight, emitarea;
 	int b, totstack;
 
 	/* init variables */
@@ -1164,6 +1164,14 @@
 		emitarea= MAX2(node->area, node->dco);
 
 		if(d2*error > emitarea) {
+			if(distfac != 0.0f) {
+				fac= 1.0f/(1.0f + distfac*d2);
+				if(fac < 0.01f)
+					continue;
+			}
+			else
+				fac= 1.0f;
+
 			/* accumulate occlusion from spherical harmonics */
 			weight= occ_solid_angle(node, v, d2, n);
 			weight *= node->occlusion;
@@ -1175,10 +1183,7 @@
 				bentn[2] -= weight*v[2];
 			}
 
-			if(distfac != 0.0f)
-				weight /= (1.0 + distfac*d2);
-
-			resultocc += weight;
+			resultocc += weight*fac;
 		}
 		else {
 			/* traverse into children */
@@ -1188,28 +1193,29 @@
 
 					/* accumulate occlusion with face form factor */
 					if(!exclude || !(face->obi == exclude->obi && face->facenr == exclude->facenr)) {
-						weight= occ_form_factor(face, p, n);
-						weight *= tree->occlusion[node->child[b].face];
-
 						if(bentn || distfac != 0.0f) {
 							occ_face(face, co, NULL, NULL); 
 							VECSUB(v, co, p);
+							d2= INPR(v, v) + 1e-16f;
 
-							if(bentn) {
-								Normalize(v);
-								bentn[0] -= weight*v[0];
-								bentn[1] -= weight*v[1];
-								bentn[2] -= weight*v[2];
-							}
+							fac= (distfac == 0.0f)? 1.0f: 1.0f/(1.0f + distfac*d2);
+							if(fac < 0.01f)
+								continue;
+						}
+						else
+							fac= 1.0f;
 
-							if(distfac != 0.0f) {
-								d2= INPR(v, v) + 1e-16f;
-								weight /= (1.0 + distfac*d2);
-							}
+						weight= occ_form_factor(face, p, n);
+						weight *= tree->occlusion[node->child[b].face];
+
+						if(bentn) {
+							Normalize(v);
+							bentn[0] -= weight*v[0];
+							bentn[1] -= weight*v[1];
+							bentn[2] -= weight*v[2];
 						}
 
-						resultocc += weight;
-
+						resultocc += weight*fac;
 					}
 				}
 				else if(node->child[b].node) {




More information about the Bf-blender-cvs mailing list