Commit: a75a5d3987d2bc4d75697781132ed669eb4a4aec
Author: Kévin Dietrich
Date:   Mon May 11 01:24:37 2015 +0200
Branches: openvdb
https://developer.blender.org/rBa75a5d3987d2bc4d75697781132ed669eb4a4aec

Cycles OpenVDB node: add output sockets based on Blender's node outputs.

In a later commit, the Blender ones will be dynamically added based on
the grids contained in the file so any grid can be accessible for
shading purposes.

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

M       intern/cycles/blender/blender_shader.cpp
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/nodes.h

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

diff --git a/intern/cycles/blender/blender_shader.cpp 
b/intern/cycles/blender/blender_shader.cpp
index 8cfcd38..8096f46 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -741,6 +741,15 @@ static ShaderNode *add_node(Scene *scene,
                OpenVDBNode *vdb_node = new OpenVDBNode();
                vdb_node->filename = b_vdb_node.filename();
                vdb_node->sampling = b_vdb_node.sampling();
+
+               BL::Node::outputs_iterator b_output;
+
+               for(b_vdb_node.outputs.begin(b_output); b_output != 
b_vdb_node.outputs.end(); ++b_output) {
+                       
vdb_node->output_names.push_back(ustring(b_output->name()));
+                       
vdb_node->add_output(vdb_node->output_names.back().c_str(),
+                                            convert_socket_type(*b_output));
+               }
+
                node = vdb_node;
        }
 
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 8279a96..190b8f3 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -4370,12 +4370,6 @@ OpenVDBNode::OpenVDBNode()
        filename = "";
        vdb_manager = NULL;
        sampling = OPENVDB_SAMPLE_POINT;
-
-       add_output("density", SHADER_SOCKET_FLOAT);
-       add_output("heat", SHADER_SOCKET_FLOAT);
-       add_output("flame", SHADER_SOCKET_FLOAT);
-       add_output("fuel", SHADER_SOCKET_FLOAT);
-       add_output("velocity", SHADER_SOCKET_VECTOR);
 }
 
 void OpenVDBNode::attributes(Shader *shader, AttributeRequestSet *attributes)
@@ -4385,47 +4379,27 @@ void OpenVDBNode::attributes(Shader *shader, 
AttributeRequestSet *attributes)
 
 void OpenVDBNode::compile(SVMCompiler &compiler)
 {
-       ShaderOutput *dens_out = output("density");
-       ShaderOutput *heat_out = output("heat");
-       ShaderOutput *flame_out = output("flame");
-       ShaderOutput *temp_out = output("fuel");
-       ShaderOutput *vel_out = output("velocity");
-
        vdb_manager = compiler.vdb_manager;
 
-       if(!dens_out->links.empty()) {
-               grid_slot = vdb_manager->add_volume(filename.string(), 
dens_out->name, sampling, NODE_VDB_FLOAT);
-               compiler.stack_assign(dens_out);
-               compiler.add_node(NODE_OPENVDB,
-                                 compiler.encode_uchar4(grid_slot, 
NODE_VDB_FLOAT, dens_out->stack_offset, sampling));
-       }
+       for(size_t i = 0; i < outputs.size(); ++i) {
+               ShaderOutput *out = outputs[i];
 
-       if(!heat_out->links.empty()) {
-               grid_slot = vdb_manager->add_volume(filename.string(), 
heat_out->name, sampling, NODE_VDB_FLOAT);
-               compiler.stack_assign(heat_out);
-               compiler.add_node(NODE_OPENVDB,
-                                 compiler.encode_uchar4(grid_slot, 
NODE_VDB_FLOAT, heat_out->stack_offset, sampling));
-       }
+               if(out->links.empty()) {
+                       continue;
+               }
 
-       if(!flame_out->links.empty()) {
-               grid_slot = vdb_manager->add_volume(filename.string(), 
flame_out->name, sampling, NODE_VDB_FLOAT);
-               compiler.stack_assign(flame_out);
-               compiler.add_node(NODE_OPENVDB,
-                                 compiler.encode_uchar4(grid_slot, 
NODE_VDB_FLOAT, flame_out->stack_offset, sampling));
-       }
+               int type = NODE_VDB_FLOAT;
 
-       if(!temp_out->links.empty()) {
-               grid_slot = vdb_manager->add_volume(filename.string(), 
temp_out->name, sampling, NODE_VDB_FLOAT);
-               compiler.stack_assign(temp_out);
-               compiler.add_node(NODE_OPENVDB,
-                                 compiler.encode_uchar4(grid_slot, 
NODE_VDB_FLOAT, temp_out->stack_offset, sampling));
-       }
+               if(out->type == SHADER_SOCKET_VECTOR) {
+                       type = NODE_VDB_VEC3S;
+               }
+
+               grid_slot = vdb_manager->add_volume(filename.string(), 
output_names[i].string(), sampling, type);
+
+               compiler.stack_assign(out);
 
-       if(!vel_out->links.empty()) {
-               grid_slot = vdb_manager->add_volume(filename.string(), 
vel_out->name, sampling, NODE_VDB_VEC3S);
-               compiler.stack_assign(vel_out);
                compiler.add_node(NODE_OPENVDB,
-                                 compiler.encode_uchar4(grid_slot, 
NODE_VDB_VEC3S, vel_out->stack_offset, sampling));
+                                 compiler.encode_uchar4(grid_slot, type, 
out->stack_offset, sampling));
        }
 }
 
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index a257cd8..250ade9 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -676,6 +676,7 @@ public:
 
        int grid_slot;
        int sampling;
+       vector<ustring> output_names;
 };
 
 CCL_NAMESPACE_END

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

Reply via email to