[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52642] trunk/blender/intern/cycles/render : Fix #33335: cycles SVM closure issue in recent bugfix, incorrectly tagging

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Nov 28 20:13:35 CET 2012


Revision: 52642
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52642
Author:   blendix
Date:     2012-11-28 19:13:34 +0000 (Wed, 28 Nov 2012)
Log Message:
-----------
Fix #33335: cycles SVM closure issue in recent bugfix, incorrectly tagging
node as done.

Modified Paths:
--------------
    trunk/blender/intern/cycles/render/svm.cpp
    trunk/blender/intern/cycles/render/svm.h

Modified: trunk/blender/intern/cycles/render/svm.cpp
===================================================================
--- trunk/blender/intern/cycles/render/svm.cpp	2012-11-28 16:42:39 UTC (rev 52641)
+++ trunk/blender/intern/cycles/render/svm.cpp	2012-11-28 19:13:34 UTC (rev 52642)
@@ -487,7 +487,7 @@
 	}
 }
 
-void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done)
+void SVMCompiler::generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done)
 {
 	/* todo: the weaks point here is that unlike the single closure sampling 
 	 * we will evaluate all nodes even if they are used as input for closures
@@ -495,10 +495,10 @@
 	 * nodes at runtime, especially if they are tangled up  */
 	
 	/* only generate once */
-	if(done.find(node) != done.end())
+	if(closure_done.find(node) != closure_done.end())
 		return;
 
-	done.insert(node);
+	closure_done.insert(node);
 
 	if(node->name == ustring("mix_closure") || node->name == ustring("add_closure")) {
 		/* weighting is already taken care of in ShaderGraph::transform_multi_closure */
@@ -506,9 +506,9 @@
 		ShaderInput *cl2in = node->input("Closure2");
 
 		if(cl1in->link)
-			generate_multi_closure(cl1in->link->parent, done);
+			generate_multi_closure(cl1in->link->parent, done, closure_done);
 		if(cl2in->link)
-			generate_multi_closure(cl2in->link->parent, done);
+			generate_multi_closure(cl2in->link->parent, done, closure_done);
 	}
 	else {
 		/* execute dependencies for closure */
@@ -543,6 +543,8 @@
 		if(node->name == ustring("transparent"))
 			current_shader->has_surface_transparent = true;
 	}
+
+	done.insert(node);
 }
 
 
@@ -613,8 +615,10 @@
 			if(generate) {
 				set<ShaderNode*> done;
 
-				if(use_multi_closure)
-					generate_multi_closure(clin->link->parent, done);
+				if(use_multi_closure) {
+					set<ShaderNode*> closure_done;
+					generate_multi_closure(clin->link->parent, done, closure_done);
+				}
 				else
 					generate_closure(clin->link->parent, done);
 			}

Modified: trunk/blender/intern/cycles/render/svm.h
===================================================================
--- trunk/blender/intern/cycles/render/svm.h	2012-11-28 16:42:39 UTC (rev 52641)
+++ trunk/blender/intern/cycles/render/svm.h	2012-11-28 19:13:34 UTC (rev 52642)
@@ -130,7 +130,7 @@
 	void generate_closure(ShaderNode *node, set<ShaderNode*>& done);
 
 	/* multi closure */
-	void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done);
+	void generate_multi_closure(ShaderNode *node, set<ShaderNode*>& done, set<ShaderNode*>& closure_done);
 
 	/* compile */
 	void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);




More information about the Bf-blender-cvs mailing list