[Bf-blender-cvs] [42aec3b] master: Cycles: nodify shader nodes

Brecht Van Lommel noreply at git.blender.org
Sat Jun 11 20:47:06 CEST 2016


Commit: 42aec3b355b7692f60369c0d5333f54b029bfcad
Author: Brecht Van Lommel
Date:   Sat May 7 19:48:28 2016 +0200
Branches: master
https://developer.blender.org/rB42aec3b355b7692f60369c0d5333f54b029bfcad

Cycles: nodify shader nodes

Differential Revision: https://developer.blender.org/D2038

===================================================================

M	intern/cycles/app/cycles_xml.cpp
M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/render/graph.cpp
M	intern/cycles/render/graph.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/render/osl.cpp
M	intern/cycles/render/osl.h
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/svm.cpp

===================================================================

diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp
index 9f967a4..48a2b12 100644
--- a/intern/cycles/app/cycles_xml.cpp
+++ b/intern/cycles/app/cycles_xml.cpp
@@ -73,18 +73,6 @@ struct XMLReadState : public XMLReader {
 
 /* Attribute Reading */
 
-static bool xml_read_bool(bool *value, pugi::xml_node node, const char *name)
-{
-	pugi::xml_attribute attr = node.attribute(name);
-
-	if(attr) {
-		*value = (string_iequals(attr.value(), "true")) || (atoi(attr.value()) != 0);
-		return true;
-	}
-
-	return false;
-}
-
 static bool xml_read_int(int *value, pugi::xml_node node, const char *name)
 {
 	pugi::xml_attribute attr = node.attribute(name);
@@ -193,18 +181,6 @@ static bool xml_read_string(string *str, pugi::xml_node node, const char *name)
 	return false;
 }
 
-static bool xml_read_ustring(ustring *str, pugi::xml_node node, const char *name)
-{
-	pugi::xml_attribute attr = node.attribute(name);
-
-	if(attr) {
-		*str = ustring(attr.value());
-		return true;
-	}
-
-	return false;
-}
-
 static bool xml_equal_string(pugi::xml_node node, const char *name, const char *value)
 {
 	pugi::xml_attribute attr = node.attribute(name);
@@ -215,24 +191,6 @@ static bool xml_equal_string(pugi::xml_node node, const char *name, const char *
 	return false;
 }
 
-static bool xml_read_enum_value(int *value, NodeEnum& enm, pugi::xml_node node, const char *name)
-{
-	pugi::xml_attribute attr = node.attribute(name);
-
-	if(attr) {
-		ustring ustr(attr.value());
-
-		if(enm.exists(ustr)) {
-			*value = enm[ustr];
-			return true;
-		}
-		else
-			fprintf(stderr, "Unknown value \"%s\" for attribute \"%s\".\n", ustr.c_str(), name);
-	}
-
-	return false;
-}
-
 /* Camera */
 
 static void xml_read_camera(XMLReadState& state, pugi::xml_node node)
@@ -267,47 +225,74 @@ static void xml_read_shader_graph(XMLReadState& state, Shader *shader, pugi::xml
 {
 	xml_read_node(state, shader, graph_node);
 
-	ShaderManager *manager = state.scene->shader_manager;
 	ShaderGraph *graph = new ShaderGraph();
 
-	map<string, ShaderNode*> nodemap;
-
-	nodemap["output"] = graph->output();
+	/* local state, shader nodes can't link to nodes outside the shader graph */
+	XMLReader graph_reader;
+	graph_reader.node_map[ustring("output")] = graph->output();
 
 	for(pugi::xml_node node = graph_node.first_child(); node; node = node.next_sibling()) {
-		ShaderNode *snode = NULL;
+		ustring node_name(node.name());
 
-		/* ToDo: Add missing nodes
-		 * RGBCurvesNode, VectorCurvesNode, RGBRampNode and ConvertNode (RGB -> BW).
-		 */
+		if(node_name == "connect") {
+			/* connect nodes */
+			vector<string> from_tokens, to_tokens;
 
-		if(string_iequals(node.name(), "image_texture")) {
-			ImageTextureNode *img = new ImageTextureNode();
+			string_split(from_tokens, node.attribute("from").value());
+			string_split(to_tokens, node.attribute("to").value());
 
-			xml_read_string(&img->filename, node, "src");
-			img->filename = path_join(state.base, img->filename);
-			
-			xml_read_enum_value((int*)&img->color_space, ImageTextureNode::color_space_enum, node, "color_space");
-			xml_read_enum_value((int*)&img->projection, ImageTextureNode::projection_enum, node, "projection");
-			xml_read_float(&img->projection_blend, node, "projection_blend");
+			if(from_tokens.size() == 2 && to_tokens.size() == 2) {
+				ustring from_node_name(from_tokens[0]);
+				ustring from_socket_name(from_tokens[1]);
+				ustring to_node_name(to_tokens[0]);
+				ustring to_socket_name(to_tokens[1]);
 
-			/* ToDo: Interpolation */
+				/* find nodes and sockets */
+				ShaderOutput *output = NULL;
+				ShaderInput *input = NULL;
 
-			snode = img;
-		}
-		else if(string_iequals(node.name(), "environment_texture")) {
-			EnvironmentTextureNode *env = new EnvironmentTextureNode();
+				if(graph_reader.node_map.find(from_node_name) != graph_reader.node_map.end()) {
+					ShaderNode *fromnode = (ShaderNode*)graph_reader.node_map[from_node_name];
 
-			xml_read_string(&env->filename, node, "src");
-			env->filename = path_join(state.base, env->filename);
-			
-			xml_read_enum_value((int*)&env->color_space, EnvironmentTextureNode::color_space_enum, node, "color_space");
-			xml_read_enum_value((int*)&env->projection, EnvironmentTextureNode::projection_enum, node, "projection");
+					foreach(ShaderOutput *out, fromnode->outputs)
+						if(string_iequals(xml_socket_name(out->name().c_str()), from_socket_name.c_str()))
+							output = out;
+
+					if(!output)
+						fprintf(stderr, "Unknown output socket name \"%s\" on \"%s\".\n", from_node_name.c_str(), from_socket_name.c_str());
+				}
+				else
+					fprintf(stderr, "Unknown shader node name \"%s\".\n", from_node_name.c_str());
+
+				if(graph_reader.node_map.find(to_node_name) != graph_reader.node_map.end()) {
+					ShaderNode *tonode = (ShaderNode*)graph_reader.node_map[to_node_name];
+
+					foreach(ShaderInput *in, tonode->inputs)
+						if(string_iequals(xml_socket_name(in->name().c_str()), to_socket_name.c_str()))
+							input = in;
+
+					if(!input)
+						fprintf(stderr, "Unknown input socket name \"%s\" on \"%s\".\n", to_socket_name.c_str(), to_node_name.c_str());
+				}
+				else
+					fprintf(stderr, "Unknown shader node name \"%s\".\n", to_node_name.c_str());
+
+				/* connect */
+				if(output && input)
+					graph->connect(output, input);
+			}
+			else
+				fprintf(stderr, "Invalid from or to value for connect node.\n");
 
-			snode = env;
+			continue;
 		}
+
+		ShaderNode *snode = NULL;
+
 #ifdef WITH_OSL
-		else if(string_iequals(node.name(), "osl_shader")) {
+		if(node_name == "osl_shader") {
+			ShaderManager *manager = state.scene->shader_manager;
+
 			if(manager->use_osl()) {
 				std::string filepath;
 
@@ -320,390 +305,54 @@ static void xml_read_shader_graph(XMLReadState& state, Shader *shader, pugi::xml
 
 					if(!snode) {
 						fprintf(stderr, "Failed to create OSL node from \"%s\".\n", filepath.c_str());
+						continue;
 					}
 				}
 				else {
 					fprintf(stderr, "OSL node missing \"src\" attribute.\n");
+					continue;
 				}
 			}
 			else {
 				fprintf(stderr, "OSL node without using --shadingsys osl.\n");
+				continue;
 			}
 		}
+		else
 #endif
-		else if(string_iequals(node.name(), "sky_texture")) {
-			SkyTextureNode *sky = new SkyTextureNode();
-			
-			xml_read_enum_value((int*)&sky->type, SkyTextureNode::type_enum, node, "type");
-			xml_read_float3(&sky->sun_direction, node, "sun_direction");
-			xml_read_float(&sky->turbidity, node, "turbidity");
-			xml_read_float(&sky->ground_albedo, node, "ground_albedo");
-			
-			snode = sky;
-		}
-		else if(string_iequals(node.name(), "noise_texture")) {
-			snode = new NoiseTextureNode();
-		}
-		else if(string_iequals(node.name(), "checker_texture")) {
-			snode = new CheckerTextureNode();
-		}
-		else if(string_iequals(node.name(), "brick_texture")) {
-			BrickTextureNode *brick = new BrickTextureNode();
+		{
+			/* exception for name collision */
+			if(node_name == "background")
+				node_name = "background_shader";
 
-			xml_read_float(&brick->offset, node, "offset");
-			xml_read_int(&brick->offset_frequency, node, "offset_frequency");
-			xml_read_float(&brick->squash, node, "squash");
-			xml_read_int(&brick->squash_frequency, node, "squash_frequency");
+			const NodeType *node_type = NodeType::find(node_name);
 
-			snode = brick;
-		}
-		else if(string_iequals(node.name(), "gradient_texture")) {
-			GradientTextureNode *blend = new GradientTextureNode();
-			xml_read_enum_value((int*)&blend->type, GradientTextureNode::type_enum, node, "type");
-			snode = blend;
-		}
-		else if(string_iequals(node.name(), "voronoi_texture")) {
-			VoronoiTextureNode *voronoi = new VoronoiTextureNode();
-			xml_read_enum_value((int*)&voronoi->coloring, VoronoiTextureNode::coloring_enum, node, "coloring");
-			snode = voronoi;
-		}
-		else if(string_iequals(node.name(), "musgrave_texture")) {
-			MusgraveTextureNode *musgrave = new MusgraveTextureNode();
-			xml_read_enum_value((int*)&musgrave->type, MusgraveTextureNode::type_enum, node, "type");
-			snode = musgrave;
-		}
-		else if(string_iequals(node.name(), "magic_texture")) {
-			MagicTextureNode *magic = new MagicTextureNode();
-			xml_read_int(&magic->depth, node, "depth");
-			snode = magic;
-		}
-		else if(string_iequals(node.name(), "wave_texture")) {
-			WaveTextureNode *wave = new WaveTextureNode();
-			xml_read_enum_value((int*)&wave->type, WaveTextureNode::type_enum, node, "type");
-			xml_read_enum_value((int*)&wave->profile, WaveTextureNode::profile_enum, node, "profile");
-			snode = wave;
-		}
-		else if(string_iequals(node.name(), "normal")) {
-			NormalNode *normal = new NormalNode();
-			xml_read_float3(&normal->direction, node, "direction");
-			snode = normal;
-		}
-		else if(string_iequals(node.name(), "bump")) {
-			BumpNode *bump = new BumpNode();
-			xml_read_bool(&bump->invert, node, "invert");
-			snode = bump;
-		}
-		else if(string_iequals(node.name(), "mapping")) {
-			MappingNode *map = new MappingNode();
-
-			TextureMapping *texmap = &map->tex_mapping;
-			xml_read_enum_value((int*) &texmap->type, TextureMapping::type_enum, node, "type");
-			xml_read_enum_value((int*) &texmap->projection, TextureMapping::projection_enum, node, "projection");
-			xml_read_enum_value((int*) &texmap->x_mapping, TextureMapping::mapping_enum, node, "x_mapping");
-			xml_read_enum_value((int*) &texmap->y_mapping, TextureMapping::mapping_enum, node, "y_mapping");
-			xml_read_enum_value((int*) &texmap->z_mapping, TextureMapping::mapping_enum, node, "z_mapping");
-			xml_read_bool(&texmap->use_minmax, node, "use_minmax");
-			if(texmap->use_minmax) {
-				xml_read_float3(&texmap->min, node, "min");
-				xml_read_float3(&texmap->max, node, "max");
+			if(!node_type) {
+				fprintf(stderr, "Unknown shader node \"%s\".\n", node.name());
+				continue;
+			}
+			else if(node_type->type != NodeType::SHADER) {
+				fprintf(stderr, "Node type \"%s\" is not a shader node.\n", node_type->name.c_str());
+				continue;
 			}
-			xml_read_float3(&texmap->translation, node, "translation");
-			xml_read_float3(&texmap->rotation, node, "rotation");
-			xml_read_float3(&texmap->scale, node, "scale");
 
-			snode = map;
-		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list