[Bf-blender-cvs] [1341109] openvdb: Tackle some of the review points.

Kévin Dietrich noreply at git.blender.org
Fri Jun 5 14:07:14 CEST 2015


Commit: 1341109c70f67001d88b87941b7e738df3fe9f6b
Author: Kévin Dietrich
Date:   Wed May 20 18:40:26 2015 +0200
Branches: openvdb
https://developer.blender.org/rB1341109c70f67001d88b87941b7e738df3fe9f6b

Tackle some of the review points.

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

M	intern/cycles/CMakeLists.txt
M	intern/cycles/kernel/kernel.cpp
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/svm/svm_openvdb.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/CMakeLists.txt
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/openvdb.cpp
M	intern/cycles/render/openvdb.h
M	intern/cycles/render/scene.h
M	intern/cycles/util/CMakeLists.txt
M	intern/cycles/util/util_openvdb.h
M	source/blender/blenkernel/intern/smoke.c

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

diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 2e1565c..ef0f624 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -148,6 +148,9 @@ endif()
 
 if(WITH_OPENVDB)
 	add_definitions(-DWITH_OPENVDB)
+	include_directories(
+		${OPENVDB_INCLUDE_DIRS}
+	)
 endif()
 
 add_definitions(
@@ -201,6 +204,7 @@ include_directories(
 	${OPENIMAGEIO_INCLUDE_DIRS}/OpenImageIO
 	${OPENEXR_INCLUDE_DIR}
 	${OPENEXR_INCLUDE_DIRS}
+	# TODO(kevin)
 	${OPENVDB_INCLUDE_DIRS}
 	${PUGIXML_INCLUDE_DIR}
 )
diff --git a/intern/cycles/kernel/kernel.cpp b/intern/cycles/kernel/kernel.cpp
index e5c95b8..5f7d208 100644
--- a/intern/cycles/kernel/kernel.cpp
+++ b/intern/cycles/kernel/kernel.cpp
@@ -35,13 +35,13 @@ void kernel_const_copy(KernelGlobals *kg, const char *name, void *host, size_t s
 		memcpy(&kg->__data, host, size);
 #ifdef __OPENVDB__
 	else if(strcmp(name, "__vdb_float_samplers_p") == 0)
-		kg->vdb_float_samplers_p.insert(kg->vdb_float_samplers_p.begin() + size, (vdb_fsampler_p *)host);
+		kg->vdb_float_samplers_p[size] = (vdb_fsampler_p *)host;
 	else if(strcmp(name, "__vdb_float_samplers_b") == 0)
-		kg->vdb_float_samplers_b.insert(kg->vdb_float_samplers_b.begin() + size, (vdb_fsampler_b *)host);
-	else if(strcmp(name, "__vdb_vec3s_samplers_p") == 0)
-		kg->vdb_vec3s_samplers_p.insert(kg->vdb_vec3s_samplers_p.begin() + size, (vdb_vsampler_p *)host);
-	else if(strcmp(name, "__vdb_vec3s_samplers_b") == 0)
-		kg->vdb_vec3s_samplers_b.insert(kg->vdb_vec3s_samplers_b.begin() + size, (vdb_vsampler_b *)host);
+		kg->vdb_float_samplers_b[size] = (vdb_fsampler_b *)host;
+	else if(strcmp(name, "__vdb_float3_samplers_p") == 0)
+		kg->vdb_float3_samplers_p[size] = (vdb_vsampler_p *)host;
+	else if(strcmp(name, "__vdb_float3_samplers_b") == 0)
+		kg->vdb_float3_samplers_b[size] = (vdb_vsampler_b *)host;
 #endif
 	else
 		assert(0);
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index ba8ccc6..cc72c5f 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -31,19 +31,19 @@ struct OSLThreadData;
 struct OSLShadingSystem;
 #endif
 
-#define MAX_BYTE_IMAGES   1024
-#define MAX_FLOAT_IMAGES  1024
+#define MAX_BYTE_IMAGES     1024
+#define MAX_FLOAT_IMAGES    1024
+#define MAX_VOLUME_SAMPLERS 1024
 
 typedef struct KernelGlobals {
 	texture_image_uchar4 texture_byte_images[MAX_BYTE_IMAGES];
 	texture_image_float4 texture_float_images[MAX_FLOAT_IMAGES];
 
 #ifdef __OPENVDB__
-	/* We can't use arrays here as grid samplers don't have a default constructor */
-	vector<vdb_fsampler_p*> vdb_float_samplers_p;
-	vector<vdb_fsampler_b*> vdb_float_samplers_b;
-	vector<vdb_vsampler_p*> vdb_vec3s_samplers_p;
-	vector<vdb_vsampler_b*> vdb_vec3s_samplers_b;
+	vdb_fsampler_p *vdb_float_samplers_p[MAX_VOLUME_SAMPLERS];
+	vdb_fsampler_b *vdb_float_samplers_b[MAX_VOLUME_SAMPLERS];
+	vdb_vsampler_p *vdb_float3_samplers_p[MAX_VOLUME_SAMPLERS];
+	vdb_vsampler_b *vdb_float3_samplers_b[MAX_VOLUME_SAMPLERS];
 #endif
 
 #define KERNEL_TEX(type, ttype, name) ttype name;
diff --git a/intern/cycles/kernel/svm/svm_openvdb.h b/intern/cycles/kernel/svm/svm_openvdb.h
index ee41eb9..5d4deb9 100644
--- a/intern/cycles/kernel/svm/svm_openvdb.h
+++ b/intern/cycles/kernel/svm/svm_openvdb.h
@@ -33,11 +33,8 @@ ccl_device void svm_node_openvdb(KernelGlobals *kg, ShaderData *sd, float *stack
 	tfm.w = read_node_float(kg, offset);
 	co = transform_point(&tfm, co);
 
-#ifdef __KERNEL_GPU__
-	float3 out = make_float3(0.0f, 0.0f, 0.0f);
-#else
 	if(type == NODE_VDB_FLOAT) {
-		float out = 0.0f;
+		float out;
 		if(sampling == OPENVDB_SAMPLE_POINT) {
 			out = kg->vdb_float_samplers_p[slot]->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
 		}
@@ -49,13 +46,13 @@ ccl_device void svm_node_openvdb(KernelGlobals *kg, ShaderData *sd, float *stack
 			stack_store_float(stack, out_offset, out);
 		}
 	}
-	else if(type == NODE_VDB_VEC3S) {
-		openvdb::Vec3s r = openvdb::Vec3s(0.0f);
+	else if(type == NODE_VDB_FLOAT3) {
+		openvdb::Vec3s r;
 		if(sampling == OPENVDB_SAMPLE_POINT) {
-			r = kg->vdb_vec3s_samplers_p[slot]->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			r = kg->vdb_float3_samplers_p[slot]->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
 		}
 		else {
-			r = kg->vdb_vec3s_samplers_b[slot]->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
+			r = kg->vdb_float3_samplers_b[slot]->wsSample(openvdb::Vec3d(co.x, co.y, co.z));
 		}
 
 		float3 out = make_float3(r.x(), r.y(), r.z());
@@ -64,7 +61,6 @@ ccl_device void svm_node_openvdb(KernelGlobals *kg, ShaderData *sd, float *stack
 			stack_store_float3(stack, out_offset, out);
 		}
 	}
-#endif
 }
 
 #endif
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 5d52f3b..c39aa1e 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -120,7 +120,7 @@ typedef enum NodeType {
 	NODE_NORMAL_MAP,
 	NODE_HAIR_INFO,
 	NODE_UVMAP,
-	NODE_OPENVDB
+	NODE_OPENVDB,
 } NodeType;
 
 typedef enum NodeAttributeType {
@@ -366,8 +366,8 @@ typedef enum NodeBumpOffset {
 } NodeBumpOffset;
 
 typedef enum NodeOpenVDBType {
-	NODE_VDB_FLOAT = 0,
-	NODE_VDB_VEC3S = 1,
+	NODE_VDB_FLOAT  = 0,
+	NODE_VDB_FLOAT3 = 1,
 } NodeOpenVDBType;
 
 typedef enum ShaderType {
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 0cfff42..e85b7e6 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -12,9 +12,14 @@ set(INC
 
 set(INC_SYS
 	${GLEW_INCLUDE_DIR}
-	${OPENVDB_INCLUDE_DIRS}
 )
 
+if(WITH_OPENVDB)
+	list(APPEND INC_SYS
+		${OPENVDB_INCLUDE_DIRS}
+	)
+endif()
+
 set(SRC
 	attribute.cpp
 	background.cpp
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 6d4a7f9..540a8e9 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -4371,11 +4371,7 @@ OpenVDBNode::OpenVDBNode()
 {
 	filename = "";
 	vdb_manager = NULL;
-#ifdef WITH_OPENVDB
 	sampling = OPENVDB_SAMPLE_POINT;
-#else
-	sampling = 0;
-#endif
 
 	tfm = transform_identity();
 
@@ -4407,7 +4403,7 @@ void OpenVDBNode::compile(SVMCompiler &compiler)
 		int type = NODE_VDB_FLOAT;
 
 		if(out->type == SHADER_SOCKET_VECTOR) {
-			type = NODE_VDB_VEC3S;
+			type = NODE_VDB_FLOAT3;
 		}
 
 		grid_slot = vdb_manager->add_volume(filename.string(),
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 30df2e8..9833358 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -23,6 +23,8 @@ CCL_NAMESPACE_BEGIN
 
 #ifdef WITH_OPENVDB
 
+#define MAX_VOLUME_SAMPLERS 1024
+
 OpenVDBManager::OpenVDBManager()
 {
 	openvdb::initialize();
@@ -30,10 +32,10 @@ OpenVDBManager::OpenVDBManager()
 	scalar_grids.reserve(64);
 	vector_grids.reserve(64);
 	current_grids.reserve(64);
-	float_samplers_p.reserve(64);
-	float_samplers_b.reserve(64);
-	vec3s_samplers_p.reserve(64);
-	vec3s_samplers_b.reserve(64);
+//	float_samplers_p.reserve(64);
+//	float_samplers_b.reserve(64);
+//	float3_samplers_p.reserve(64);
+//	float3_samplers_b.reserve(64);
 
 	need_update = true;
 }
@@ -45,8 +47,8 @@ OpenVDBManager::~OpenVDBManager()
 	current_grids.clear();
 	float_samplers_p.clear();
 	float_samplers_b.clear();
-	vec3s_samplers_p.clear();
-	vec3s_samplers_b.clear();
+	float3_samplers_p.clear();
+	float3_samplers_b.clear();
 }
 
 static inline void catch_exceptions()
@@ -54,15 +56,9 @@ static inline void catch_exceptions()
 	try {
 		throw;
 	}
-	catch (const openvdb::Exception &e) {
-		std::cerr << e.what() << "\n";
-	}
-	catch (const std::exception &e) {
+	catch (const openvdb::IoError &e) {
 		std::cerr << e.what() << "\n";
 	}
-	catch (...) {
-		std::cerr << "Unknown error in OpenVDB library...\n";
-	}
 }
 
 int OpenVDBManager::add_volume(const string &filename, const string &name, int sampling, int grid_type)
@@ -82,7 +78,7 @@ int OpenVDBManager::add_volume(const string &filename, const string &name, int s
 			FloatGrid::Ptr grid = gridPtrCast<FloatGrid>(file.readGrid(name));
 			slot = add_scalar_grid(grid, sampling);
 		}
-		else if(grid_type == NODE_VDB_VEC3S) {
+		else if(grid_type == NODE_VDB_FLOAT3) {
 			Vec3SGrid::Ptr grid = gridPtrCast<Vec3SGrid>(file.readGrid(name));
 			slot = add_vector_grid(grid, sampling);
 		}
@@ -138,12 +134,12 @@ void OpenVDBManager::delete_sampler(int grid_type, int sampling, size_t slot)
 	}
 	else {
 		if(sampling == OPENVDB_SAMPLE_POINT) {
-			delete vec3s_samplers_p[slot];
-			vec3s_samplers_p[slot] = NULL;
+			delete float3_samplers_p[slot];
+			float3_samplers_p[slot] = NULL;
 		}
 		else {
-			delete vec3s_samplers_b[slot];
-			vec3s_samplers_b[slot] = NULL;
+			delete float3_samplers_b[slot];
+			float3_samplers_b[slot] = NULL;
 		}
 	}
 }
@@ -154,11 +150,22 @@ size_t find_empty_slot(Container container)
 	size_t slot = 0;
 
 	for(; slot < container.size(); ++slot) {
+		std::cout << "Slot: " << slot << "\n";
 		if(!container[slot]) {
 			break;
 		}
 	}
 
+	if(slot == container.size()) {
+		if(slot == MAX_VOLUME_SAMPLERS) {
+			printf("OpenVDBManager::add_volume: volume sampler limit reached %d!\n",
+			       MAX_VOLUME_SAMPLERS);
+			return -1;
+		}
+
+		container.resize(slot + 1);
+	}
+
 	return slot;
 }
 
@@ -169,12 +176,16 @@ size_t OpenVDBManager::add_scalar_grid(openvdb::FloatGrid::Ptr grid, int samplin
 	if(sampling == OPENVDB_SAMPLE_POINT) {
 		slot = find_empty_slot(float_samplers_p);
 
+		if(slot == -1) return -1;
+
 		vdb_fsampler_p *sampler = new vdb_fsampler_p(grid->tree(), grid->transform());
 		float_samplers_p.insert(float_samplers_p.begin() + slot, sampler);
 	}
 	else {
 		slot = find_empty_slot(float_samplers_b);
 
+		if(slot == -1) return -1;
+
 		vdb_fsampler_b *sampler = new vdb_fsampler_b(grid->tree(), grid->transform());
 		float_samplers_b.insert(float_samplers_b.begin() + slot, sampler);
 	}
@@ -189,16 +200,20 @@ size_t OpenVDBManager::add_vector_grid(openvdb::Vec3SGrid::Ptr grid, int samplin
 	size_t slot = 0;
 
 	if(sampling == OPENVDB_SAMPLE_POINT) {
-		slot = find_empty_slot(vec3s_samplers_p);
+		slot = find_empty_slot(float3_samplers_p);
+
+		if(slot == -1) return -1;
 
 		vdb_vsampler_p *sampler = new vdb_v

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list