[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [61008] trunk/blender/intern/cycles: Fix #37194, OSL script crashes blender.

Lukas Toenne lukas.toenne at googlemail.com
Wed Oct 30 12:21:31 CET 2013


Revision: 61008
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=61008
Author:   lukastoenne
Date:     2013-10-30 11:21:31 +0000 (Wed, 30 Oct 2013)
Log Message:
-----------
Fix #37194, OSL script crashes blender. The lookup functions for finding Cycles shader inputs/outputs based on socket names are using a few modifications on the Blender socket names. But these only apply
to standard nodes where the Blender socket names can differ from associated Cycles names and may require additional indices to make them unique. Script node sockets are already unique and exact due to
being generated from the script function parameters.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/render/graph.h
    trunk/blender/intern/cycles/render/nodes.cpp

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-10-30 09:44:29 UTC (rev 61007)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-10-30 11:21:31 UTC (rev 61008)
@@ -673,59 +673,73 @@
 	return node;
 }
 
+static bool node_use_modified_socket_name(ShaderNode *node)
+{
+	if (node->special_type == SHADER_SPECIAL_TYPE_SCRIPT)
+		return false;
+	
+	return true;
+}
+
 static ShaderInput *node_find_input_by_name(ShaderNode *node, BL::Node b_node, BL::NodeSocket b_socket)
 {
-	BL::Node::inputs_iterator b_input;
 	string name = b_socket.name();
-	bool found = false;
-	int counter = 0, total = 0;
 	
-	for (b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
-		if (b_input->name() == name) {
-			if (!found)
-				counter++;
-			total++;
+	if (node_use_modified_socket_name(node)) {
+		BL::Node::inputs_iterator b_input;
+		bool found = false;
+		int counter = 0, total = 0;
+		
+		for (b_node.inputs.begin(b_input); b_input != b_node.inputs.end(); ++b_input) {
+			if (b_input->name() == name) {
+				if (!found)
+					counter++;
+				total++;
+			}
+			
+			if(b_input->ptr.data == b_socket.ptr.data)
+				found = true;
 		}
-
-		if(b_input->ptr.data == b_socket.ptr.data)
-			found = true;
+		
+		/* rename if needed */
+		if (name == "Shader")
+			name = "Closure";
+		
+		if (total > 1)
+			name = string_printf("%s%d", name.c_str(), counter);
 	}
 	
-	/* rename if needed */
-	if (name == "Shader")
-		name = "Closure";
-	
-	if (total > 1)
-		name = string_printf("%s%d", name.c_str(), counter);
-	
 	return node->input(name.c_str());
 }
 
 static ShaderOutput *node_find_output_by_name(ShaderNode *node, BL::Node b_node, BL::NodeSocket b_socket)
 {
-	BL::Node::outputs_iterator b_output;
 	string name = b_socket.name();
-	bool found = false;
-	int counter = 0, total = 0;
 	
-	for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
-		if (b_output->name() == name) {
-			if (!found)
-				counter++;
-			total++;
+	if (node_use_modified_socket_name(node)) {
+		BL::Node::outputs_iterator b_output;
+		bool found = false;
+		int counter = 0, total = 0;
+		
+		for (b_node.outputs.begin(b_output); b_output != b_node.outputs.end(); ++b_output) {
+			if (b_output->name() == name) {
+				if (!found)
+					counter++;
+				total++;
+			}
+			
+			if(b_output->ptr.data == b_socket.ptr.data)
+				found = true;
 		}
-
-		if(b_output->ptr.data == b_socket.ptr.data)
-			found = true;
+		
+		/* rename if needed */
+		if (name == "Shader")
+			name = "Closure";
+		
+		if (total > 1)
+			name = string_printf("%s%d", name.c_str(), counter);
 	}
 	
-	/* rename if needed */
-	if (name == "Shader")
-		name = "Closure";
-	
-	if (total > 1)
-		name = string_printf("%s%d", name.c_str(), counter);
-	
 	return node->output(name.c_str());
 }
 

Modified: trunk/blender/intern/cycles/render/graph.h
===================================================================
--- trunk/blender/intern/cycles/render/graph.h	2013-10-30 09:44:29 UTC (rev 61007)
+++ trunk/blender/intern/cycles/render/graph.h	2013-10-30 11:21:31 UTC (rev 61008)
@@ -75,7 +75,8 @@
 	SHADER_SPECIAL_TYPE_PROXY,
 	SHADER_SPECIAL_TYPE_MIX_CLOSURE,
 	SHADER_SPECIAL_TYPE_AUTOCONVERT,
-	SHADER_SPECIAL_TYPE_GEOMETRY
+	SHADER_SPECIAL_TYPE_GEOMETRY,
+	SHADER_SPECIAL_TYPE_SCRIPT
 };
 
 /* Enum

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2013-10-30 09:44:29 UTC (rev 61007)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2013-10-30 11:21:31 UTC (rev 61008)
@@ -3719,6 +3719,7 @@
 OSLScriptNode::OSLScriptNode()
 : ShaderNode("osl_script")
 {
+	special_type = SHADER_SPECIAL_TYPE_SCRIPT;
 }
 
 void OSLScriptNode::compile(SVMCompiler& compiler)




More information about the Bf-blender-cvs mailing list