[Bf-blender-cvs] [3c69a62] openvdb: Store grids' informations in the node.
Kévin Dietrich
noreply at git.blender.org
Tue Jun 9 02:02:56 CEST 2015
Commit: 3c69a62f22bd4514f206cecd40a094898fa95a40
Author: Kévin Dietrich
Date: Mon Jun 8 22:09:28 2015 +0200
Branches: openvdb
https://developer.blender.org/rB3c69a62f22bd4514f206cecd40a094898fa95a40
Store grids' informations in the node.
Patch by @lukastoenne, with minor edits.
===================================================================
M intern/cycles/render/openvdb.cpp
M intern/openvdb/openvdb_capi.cpp
M intern/openvdb/openvdb_capi.h
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/makesdna/DNA_node_types.h
M source/blender/nodes/shader/nodes/node_shader_openvdb.c
===================================================================
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 34133e4..1410e79 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -157,6 +157,8 @@ size_t VolumeManager::add_openvdb_volume(const std::string& filename, const std:
io::File file(filename);
file.open();
+ if (!file.hasGrid(name)) return -1;
+
if(grid_type == NODE_VDB_FLOAT) {
slot = find_empty_slot(float_volumes);
diff --git a/intern/openvdb/openvdb_capi.cpp b/intern/openvdb/openvdb_capi.cpp
index 9fa3f5b..686ef54 100644
--- a/intern/openvdb/openvdb_capi.cpp
+++ b/intern/openvdb/openvdb_capi.cpp
@@ -38,10 +38,7 @@ int OpenVDB_getVersionHex()
return OPENVDB_LIBRARY_VERSION;
}
-void OpenVDB_get_grid_names_and_types(const char *filename,
- char **grid_names,
- char **grid_types,
- int *num_grids)
+void OpenVDB_get_grid_info(const char *filename, OpenVDBGridInfoCallback cb, void *userdata)
{
int ret = OPENVDB_NO_ERROR;
initialize();
@@ -51,23 +48,20 @@ void OpenVDB_get_grid_names_and_types(const char *filename,
file.open();
GridPtrVecPtr grids = file.getGrids();
+ int grid_num = grids->size();
- *num_grids = grids->size();
-
- for (size_t i = 0; i < *num_grids; ++i) {
+ for (size_t i = 0; i < grid_num; ++i) {
GridBase::ConstPtr grid = (*grids)[i];
- grid_names[i] = strdup(grid->getName().c_str());
-
- /* XXX - this is blender specific, for external files it might crash if
- * it doens't find a "is_color" metaValue, cases where it doens't crash
- * are when the vector grids are at the end of the grid vector.
- */
- if (grid->valueType() == "vec3s" && grid->metaValue<bool>("is_color")) {
- grid_types[i] = strdup("color");
- }
- else {
- grid_types[i] = strdup(grid->valueType().c_str());
+
+ const char *name = strdup(grid->getName().c_str());
+ const char *value_type = strdup(grid->valueType().c_str());
+ bool is_color = false;
+
+ if (grid->getMetadata< TypedMetadata<bool> >("is_color")) {
+ is_color = grid->metaValue<bool>("is_color");
}
+
+ cb(userdata, name, value_type, is_color);
}
}
catch (...) {
diff --git a/intern/openvdb/openvdb_capi.h b/intern/openvdb/openvdb_capi.h
index 077d806..4830c8d 100644
--- a/intern/openvdb/openvdb_capi.h
+++ b/intern/openvdb/openvdb_capi.h
@@ -38,7 +38,8 @@ struct OpenVDBVectorGrid;
int OpenVDB_getVersionHex(void);
-void OpenVDB_get_grid_names_and_types(const char *filename, char **grid_names, char **grid_types, int *num_grids);
+typedef void (*OpenVDBGridInfoCallback)(void *userdata, const char *name, const char *value_type, bool is_color);
+void OpenVDB_get_grid_info(const char *filename, OpenVDBGridInfoCallback cb, void *userdata);
enum {
OPENVDB_NO_ERROR = 0,
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index eb54d20..c8b1eea 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2804,6 +2804,10 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
NodeShaderScript *nss = (NodeShaderScript *) node->storage;
nss->bytecode = newdataadr(fd, nss->bytecode);
}
+ else if (node->type==SH_NODE_OPENVDB) {
+ NodeShaderOpenVDB *vdb = (NodeShaderOpenVDB *)node->storage;
+ link_list(fd, &vdb->grid_info);
+ }
}
else if (ntree->type==NTREE_COMPOSIT) {
if (ELEM(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT))
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 9fe83b3..838f846 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -869,20 +869,31 @@ static void write_nodetree(WriteData *wd, bNodeTree *ntree)
writestruct(wd, DATA, "bNodeLink", 1, link);
if (node->storage) {
/* could be handlerized at some point, now only 1 exception still */
- if (ntree->type==NTREE_SHADER && (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB))
- write_curvemapping(wd, node->storage);
- else if (ntree->type==NTREE_SHADER && node->type==SH_NODE_SCRIPT) {
- NodeShaderScript *nss = (NodeShaderScript *)node->storage;
- if (nss->bytecode)
- writedata(wd, DATA, strlen(nss->bytecode)+1, nss->bytecode);
- writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
+ if (ntree->type==NTREE_SHADER) {
+ if (node->type==SH_NODE_CURVE_VEC || node->type==SH_NODE_CURVE_RGB)
+ write_curvemapping(wd, node->storage);
+ else if (node->type==SH_NODE_SCRIPT) {
+ NodeShaderScript *nss = (NodeShaderScript *)node->storage;
+ if (nss->bytecode)
+ writedata(wd, DATA, strlen(nss->bytecode)+1, nss->bytecode);
+ writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
+ }
+ else if (node->type==SH_NODE_OPENVDB) {
+ NodeShaderOpenVDB *vdb = (NodeShaderOpenVDB *)node->storage;
+ writelist(wd, DATA, "OpenVDBGridInfo", &vdb->grid_info);
+ writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
+ }
+ }
+ else if (ntree->type==NTREE_COMPOSIT) {
+ if (ELEM(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT))
+ write_curvemapping(wd, node->storage);
+ else if (node->type==CMP_NODE_MOVIEDISTORTION) {
+ /* pass */
+ }
}
- else if (ntree->type==NTREE_COMPOSIT && ELEM(node->type, CMP_NODE_TIME, CMP_NODE_CURVE_VEC, CMP_NODE_CURVE_RGB, CMP_NODE_HUECORRECT))
- write_curvemapping(wd, node->storage);
- else if (ntree->type==NTREE_TEXTURE && (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME) )
- write_curvemapping(wd, node->storage);
- else if (ntree->type==NTREE_COMPOSIT && node->type==CMP_NODE_MOVIEDISTORTION) {
- /* pass */
+ else if (ntree->type==NTREE_TEXTURE) {
+ if (node->type==TEX_NODE_CURVE_RGB || node->type==TEX_NODE_CURVE_TIME)
+ write_curvemapping(wd, node->storage);
}
else
writestruct(wd, DATA, node->typeinfo->storagename, 1, node->storage);
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index e77ee28..dc497f3 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -855,9 +855,32 @@ typedef struct NodeShaderUVMap {
char uv_map[64];
} NodeShaderUVMap;
+typedef struct OpenVDBGridInfo {
+ struct OpenVDBGridInfo *next, *prev;
+
+ char name[64]; /* MAX_NAME */
+ short flag;
+ short type;
+ int pad;
+} OpenVDBGridInfo;
+
+typedef enum eOpenVDBGridInfo_Flag {
+ OPENVDB_FLAG_UNIFORM_VOXELS = (1 << 0),
+} eOpenVDBGridInfo_Flag;
+
+typedef enum eOpenVDBGridInfo_Type {
+ OPENVDB_TYPE_UNKNOWN = 0,
+ OPENVDB_TYPE_FLOAT = 1,
+ OPENVDB_TYPE_VEC3 = 2,
+ OPENVDB_TYPE_COLOR = 3,
+} eOpenVDBGridInfo_Type;
+
typedef struct NodeShaderOpenVDB {
char filename[1024];
short sampling, source;
+ int pad;
+
+ ListBase grid_info;
} NodeShaderOpenVDB;
enum {
diff --git a/source/blender/nodes/shader/nodes/node_shader_openvdb.c b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
index e1e3c21..2d5db09 100644
--- a/source/blender/nodes/shader/nodes/node_shader_openvdb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
@@ -29,8 +29,6 @@
#include "openvdb_capi.h"
-#define MAX_GRIDS 32
-
static bNodeSocketTemplate sh_node_openvdb_in[] = {
{SOCK_VECTOR, 1, N_("Vector"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
{-1, 0, ""}
@@ -42,6 +40,26 @@ static void node_shader_init_openvdb(bNodeTree *UNUSED(ntree), bNode *node)
node->storage = vdb;
}
+static void node_shader_free_openvdb(bNode *node)
+{
+ NodeShaderOpenVDB *vdb = node->storage;
+ if (vdb) {
+ BLI_freelistN(&vdb->grid_info);
+ MEM_freeN(vdb);
+ }
+}
+
+static void node_shader_copy_openvdb(bNodeTree *UNUSED(dest_ntree), bNode *dst_node, bNode *src_node)
+{
+ dst_node->storage = MEM_dupallocN(src_node->storage);
+ if (dst_node->storage) {
+ NodeShaderOpenVDB *src_vdb = src_node->storage;
+ NodeShaderOpenVDB *dst_vdb = dst_node->storage;
+
+ BLI_duplicatelist(&dst_vdb->grid_info, &src_vdb->grid_info);
+ }
+}
+
#ifdef WITH_OPENVDB
static bNodeSocket *node_output_relink(bNode *node, bNodeSocket *oldsock, int oldindex)
{
@@ -56,12 +74,33 @@ static bNodeSocket *node_output_relink(bNode *node, bNodeSocket *oldsock, int ol
return BLI_findlink(&node->outputs, oldindex);
}
+static void node_openvdb_get_info(void *userdata, const char *name, const char *value_type, bool is_color)
+{
+ NodeShaderOpenVDB *vdb = userdata;
+ OpenVDBGridInfo *info = MEM_callocN(sizeof(OpenVDBGridInfo), "openvdb grid info");
+
+ BLI_strncpy(info->name, name, sizeof(info->name));
+ if (STREQ(value_type, "float"))
+ info->type = OPENVDB_TYPE_FLOAT;
+ else if (STREQ(value_type, "vec3s")) {
+ if (is_color)
+ info->type = OPENVDB_TYPE_COLOR;
+ else
+ info->type = OPENVDB_TYPE_VEC3;
+ }
+ else
+ info->type = OPENVDB_TYPE_UNKNOWN;
+
+ info->flag = 0;
+
+ BLI_addtail(&vdb->grid_info, info);
+}
+
static void node_openvdb_get_sockets(Main *bmain, bNodeTree *ntree, bNode *node)
{
NodeShaderOpenVDB *vdb = node->storage;
- char *grid_names[MAX_GRIDS], *grid_types[MAX_GRIDS];
+ OpenVDBGridInfo *info;
char *filename;
- int i, num_grids;
if (!vdb) {
return;
@@ -73,25 +112,21 @@ static void node_openvdb_get_sockets(Main *bmain, bNodeTree *ntree, bNode *node)
BLI_path_abs(filename, bmain->name);
}
- OpenVDB_get_grid_names_and_types(filename, grid_names, grid_types, &num_grids);
-
- for (i = 0; i < num_grids; i++) {
- int type;
-
- if (STREQ(grid_types[i], "float")) {
- type = SOCK_FLOAT;
- }
- else if (STREQ(grid_types[i], "vec3s")) {
- type = SOCK_VECTOR;
- }
- else if (STREQ(grid_types[i], "color")) {
- type = SOCK_RGBA;
+ BLI_freelistN(&vdb->grid_info);
+ OpenVDB_get_grid_info(filename, node_openvdb_get_info, vdb);
+
+ for (info = vdb->grid_info.first; info; info = info->next) {
+ switch (info->type) {
+ case OPENVDB_TYPE_FLOAT:
+ nodeAddStaticSocket(ntree, node, SOCK_OUT
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list