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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to