[Bf-blender-cvs] [9fe8f6e] openvdb: Dynamically add sockets to the node based on the grids available in the file.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:06:13 CEST 2015
Commit: 9fe8f6e2913bfe498cdedd5472995953f12e3d13
Author: Kévin Dietrich
Date: Mon May 11 14:28:13 2015 +0200
Branches: openvdb
https://developer.blender.org/rB9fe8f6e2913bfe498cdedd5472995953f12e3d13
Dynamically add sockets to the node based on the grids available in the
file.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/CMakeLists.txt
M source/blender/nodes/shader/nodes/node_shader_openvdb.c
M source/blender/openvdb/CMakeLists.txt
M source/blender/openvdb/openvdb_capi.cpp
M source/blender/openvdb/openvdb_capi.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index b5c2e58..3d2a770 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -811,6 +811,8 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInp
void ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct GPUMaterial *mat, short compatibility);
+void ntreeUpdateOpenVDBNode(struct bNodeTree *ntree, struct bNode *node);
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 4bfa151..5afb143 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -2969,6 +2969,15 @@ static void rna_CompositorNodeScale_update(Main *bmain, Scene *scene, PointerRNA
rna_Node_update(bmain, scene, ptr);
}
+static void rna_ShaderNodeOpenVDB_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ bNodeTree *ntree = (bNodeTree *)ptr->id.data;
+ bNode *node = (bNode *)ptr->data;
+
+ ntreeUpdateOpenVDBNode(ntree, node);
+ rna_Node_update(bmain, scene, ptr);
+}
+
#else
static EnumPropertyItem prop_image_layer_items[] = {
@@ -3888,7 +3897,7 @@ static void def_sh_openvdb(StructRNA *srna)
prop = RNA_def_property(srna, "filename", PROP_STRING, PROP_FILEPATH);
RNA_def_property_ui_text(prop, "File Path", "Path to the file to use");
- RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_ShaderNodeOpenVDB_update");
prop = RNA_def_property(srna, "sampling", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_openvdb_sampling);
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index fc8f4ab..b49501a 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -36,6 +36,7 @@ set(INC
../imbuf
../makesdna
../makesrna
+ ../openvdb
../render/extern/include
../../../intern/guardedalloc
../../../intern/glew-mx
diff --git a/source/blender/nodes/shader/nodes/node_shader_openvdb.c b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
index 8552825..a5d368a 100644
--- a/source/blender/nodes/shader/nodes/node_shader_openvdb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
@@ -27,14 +27,7 @@
#include "../node_shader_util.h"
-static bNodeSocketTemplate sh_node_openvdb_out[] = {
- { SOCK_FLOAT, 0, N_("density"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_FLOAT, 0, N_("heat"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_FLOAT, 0, N_("flame"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_FLOAT, 0, N_("fuel"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 0, N_("velocity"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
- { -1, 0, "" }
-};
+#include "openvdb_capi.h"
static void node_shader_init_openvdb(bNodeTree *UNUSED(ntree), bNode *node)
{
@@ -42,13 +35,22 @@ static void node_shader_init_openvdb(bNodeTree *UNUSED(ntree), bNode *node)
node->storage = vdb;
}
+void ntreeUpdateOpenVDBNode(bNodeTree *ntree, bNode *node)
+{
+ NodeShaderOpenVDB *vdb = node->storage;
+
+ if (vdb) {
+ BLI_listbase_clear(&node->outputs);
+ OpenVDB_getNodeSockets(vdb->filename, ntree, node);
+ }
+}
+
void register_node_type_sh_openvdb(void)
{
static bNodeType ntype;
sh_node_type_base(&ntype, SH_NODE_OPENVDB, "OpenVDB Volume", NODE_CLASS_INPUT, 0);
node_type_compatibility(&ntype, NODE_NEW_SHADING);
- node_type_socket_templates(&ntype, NULL, sh_node_openvdb_out);
node_type_init(&ntype, node_shader_init_openvdb);
node_type_storage(&ntype, "NodeShaderOpenVDB", node_free_standard_storage, node_copy_standard_storage);
diff --git a/source/blender/openvdb/CMakeLists.txt b/source/blender/openvdb/CMakeLists.txt
index eb50baa..ca28294 100644
--- a/source/blender/openvdb/CMakeLists.txt
+++ b/source/blender/openvdb/CMakeLists.txt
@@ -29,6 +29,8 @@ set(INC
../blenkernel
../blenlib
../makesdna
+ ../makesrna
+ ../../../intern/guardedalloc
../../../intern/smoke/intern
)
diff --git a/source/blender/openvdb/openvdb_capi.cpp b/source/blender/openvdb/openvdb_capi.cpp
index be474de..96c827d 100644
--- a/source/blender/openvdb/openvdb_capi.cpp
+++ b/source/blender/openvdb/openvdb_capi.cpp
@@ -25,6 +25,16 @@
#include <openvdb/openvdb.h>
+extern "C" {
+#include "DNA_node_types.h"
+
+#include "BKE_node.h"
+
+#include "BLI_listbase.h"
+}
+
+#include "MEM_guardedalloc.h"
+
#include "openvdb_capi.h"
#include "openvdb_intern.h"
#include "openvdb_util.h"
@@ -36,19 +46,34 @@ int OpenVDB_getVersionHex()
return OPENVDB_LIBRARY_VERSION;
}
-void OpenVDB_getGridInfo(const char *filename)
+void OpenVDB_getNodeSockets(const char *filename, bNodeTree *ntree, bNode *node)
{
int ret = OPENVDB_NO_ERROR;
+ initialize();
try {
io::File file(filename);
file.open();
- for (io::File::NameIterator name_iter = file.beginName();
- name_iter != file.endName();
- ++name_iter)
- {
- std::cout << name_iter.gridName() << std::endl;
+ GridPtrVecPtr grids = file.getGrids();
+
+ for (size_t i = 0; i < grids->size(); ++i) {
+ GridBase::ConstPtr grid = (*grids)[i];
+ int type;
+
+ if (grid->valueType() == "float") {
+ type = SOCK_FLOAT;
+ }
+ else if (grid->valueType() == "vec3s") {
+ type = SOCK_VECTOR;
+ }
+ else {
+ continue;
+ }
+
+ const char *name = grid->getName().c_str();
+
+ nodeAddStaticSocket(ntree, node, SOCK_OUT, type, PROP_NONE, NULL, name);
}
}
catch (...) {
diff --git a/source/blender/openvdb/openvdb_capi.h b/source/blender/openvdb/openvdb_capi.h
index 8e4ae41..0315851 100644
--- a/source/blender/openvdb/openvdb_capi.h
+++ b/source/blender/openvdb/openvdb_capi.h
@@ -30,12 +30,14 @@
extern "C" {
#endif
+struct bNode;
+struct bNodeTree;
struct FLUID_3D;
struct WTURBULENCE;
int OpenVDB_getVersionHex(void);
-void OpenVDB_getGridInfo(const char *filename);
+void OpenVDB_getNodeSockets(const char *filename, struct bNodeTree *ntree, struct bNode *node);
/* This duplicates a few properties from SmokeDomainSettings,
More information about the Bf-blender-cvs
mailing list