[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