[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29304] branches/render25/source/blender/ render/intern/source/cache.c: Render Branch: optimization to skip irradiance cache with node sss

Brecht Van Lommel brecht at blender.org
Mon Jun 7 14:11:57 CEST 2010


Revision: 29304
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29304
Author:   blendix
Date:     2010-06-07 14:11:57 +0200 (Mon, 07 Jun 2010)

Log Message:
-----------
Render Branch: optimization to skip irradiance cache with node sss
materials in some cases, should save about 25% rendertime on the
baby dragon.

Modified Paths:
--------------
    branches/render25/source/blender/render/intern/source/cache.c

Modified: branches/render25/source/blender/render/intern/source/cache.c
===================================================================
--- branches/render25/source/blender/render/intern/source/cache.c	2010-06-07 12:02:40 UTC (rev 29303)
+++ branches/render25/source/blender/render/intern/source/cache.c	2010-06-07 12:11:57 UTC (rev 29304)
@@ -28,6 +28,7 @@
 
 #include "DNA_material_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
 
 #include "BLI_listbase.h"
 #include "BLI_math.h"
@@ -37,6 +38,7 @@
 
 #include "BKE_DerivedMesh.h"
 #include "BKE_global.h"
+#include "BKE_node.h"
 
 #include "cache.h"
 #include "diskocclusion.h"
@@ -51,13 +53,43 @@
 
 /******************************** Utilities **********************************/
 
+static int mat_sss_need_cache(Render *re, Material *ma);
+
+static int mat_sss_nodes_need_cache(Render *re, bNodeTree *ntree)
+{
+	bNode *node;
+
+	for(node=ntree->nodes.first; node; node= node->next) {
+		if(node->id && GS(node->id->name)==ID_MA) {
+			Material *ma= (Material*)node->id;
+			if(ma && mat_sss_need_cache(re, ma))
+				return 1;
+		}
+		else if(node->type==NODE_GROUP)
+			if(mat_sss_nodes_need_cache(re, (bNodeTree*)node->id))
+				return 1;
+	}
+
+	return 0;
+}
+
+static int mat_sss_need_cache(Render *re, Material *ma)
+{
+	/* if this material only has sss materials that are already done,
+	   we can skip the cache, and only do it in preprocess */
+	if(ma->nodetree && ma->use_nodes)
+		return mat_sss_nodes_need_cache(re, ma->nodetree);
+
+	return !((ma->sss_flag & MA_DIFF_SSS) && sss_pass_done(re, 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))
+	else if(!mat_sss_need_cache(re, ma))
 		return 0;
 	
 	return 1;





More information about the Bf-blender-cvs mailing list