[Bf-blender-cvs] [cc220c3] openvdb: Various cleanups.

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


Commit: cc220c34ad00b2d87c3413b2bceec5cea45bbfce
Author: Kévin Dietrich
Date:   Wed May 20 00:15:55 2015 +0200
Branches: openvdb
https://developer.blender.org/rBcc220c34ad00b2d87c3413b2bceec5cea45bbfce

Various cleanups.

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

M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/openvdb.cpp

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

diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 5b7b08b..6d4a7f9 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -4414,6 +4414,10 @@ void OpenVDBNode::compile(SVMCompiler &compiler)
 		                                    output_names[i].string(),
 		                                    sampling, type);
 
+		if(grid_slot == -1) {
+			continue;
+		}
+
 		compiler.stack_assign(out);
 
 		compiler.add_node(NODE_OPENVDB,
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 5281d78..30df2e8 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -26,15 +26,23 @@ CCL_NAMESPACE_BEGIN
 OpenVDBManager::OpenVDBManager()
 {
 	openvdb::initialize();
+
+	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);
+
 	need_update = true;
 }
 
 OpenVDBManager::~OpenVDBManager()
 {
+	scalar_grids.clear();
+	vector_grids.clear();
+	current_grids.clear();
 	float_samplers_p.clear();
 	float_samplers_b.clear();
 	vec3s_samplers_p.clear();
@@ -46,12 +54,14 @@ static inline void catch_exceptions()
 	try {
 		throw;
 	}
-	/* OpenVDB exceptions all derive from std::exception so it should be fine */
+	catch (const openvdb::Exception &e) {
+		std::cerr << e.what() << "\n";
+	}
 	catch (const std::exception &e) {
-		std::cerr << e.what() << std::endl;
+		std::cerr << e.what() << "\n";
 	}
 	catch (...) {
-		std::cerr << "Unknown error in OpenVDB library..." << std::endl;
+		std::cerr << "Unknown error in OpenVDB library...\n";
 	}
 }
 
@@ -76,15 +86,17 @@ int OpenVDBManager::add_volume(const string &filename, const string &name, int s
 			Vec3SGrid::Ptr grid = gridPtrCast<Vec3SGrid>(file.readGrid(name));
 			slot = add_vector_grid(grid, sampling);
 		}
+
+		add_grid_description(filename, name, sampling, slot);
+
+		need_update = true;
 	}
 	catch (...) {
 		catch_exceptions();
+		need_update = false;
+		slot = -1;
 	}
 
-	add_grid_description(filename, name, sampling, slot);
-
-	need_update = true;
-
 	return slot;
 }
 
@@ -136,28 +148,34 @@ void OpenVDBManager::delete_sampler(int grid_type, int sampling, size_t slot)
 	}
 }
 
+template <typename Container>
+size_t find_empty_slot(Container container)
+{
+	size_t slot = 0;
+
+	for(; slot < container.size(); ++slot) {
+		if(!container[slot]) {
+			break;
+		}
+	}
+
+	return slot;
+}
+
 size_t OpenVDBManager::add_scalar_grid(openvdb::FloatGrid::Ptr grid, int sampling)
 {
 	size_t slot = 0;
 
 	if(sampling == OPENVDB_SAMPLE_POINT) {
-		vdb_fsampler_p *sampler = new vdb_fsampler_p(grid->tree(), grid->transform());
+		slot = find_empty_slot(float_samplers_p);
 
-		for(; slot < float_samplers_p.size(); slot++) {
-			if(!float_samplers_p[slot]) {
-				break;
-			}
-		}
+		vdb_fsampler_p *sampler = new vdb_fsampler_p(grid->tree(), grid->transform());
 		float_samplers_p.insert(float_samplers_p.begin() + slot, sampler);
 	}
 	else {
-		vdb_fsampler_b *sampler = new vdb_fsampler_b(grid->tree(), grid->transform());
+		slot = find_empty_slot(float_samplers_b);
 
-		for(; slot < float_samplers_b.size(); slot++) {
-			if(!float_samplers_b[slot]) {
-				break;
-			}
-		}
+		vdb_fsampler_b *sampler = new vdb_fsampler_b(grid->tree(), grid->transform());
 		float_samplers_b.insert(float_samplers_b.begin() + slot, sampler);
 	}
 
@@ -171,23 +189,15 @@ size_t OpenVDBManager::add_vector_grid(openvdb::Vec3SGrid::Ptr grid, int samplin
 	size_t slot = 0;
 
 	if(sampling == OPENVDB_SAMPLE_POINT) {
-		vdb_vsampler_p *sampler = new vdb_vsampler_p(grid->tree(), grid->transform());
+		slot = find_empty_slot(vec3s_samplers_p);
 
-		for(; slot < vec3s_samplers_p.size(); slot++) {
-			if(!vec3s_samplers_p[slot]) {
-				break;
-			}
-		}
+		vdb_vsampler_p *sampler = new vdb_vsampler_p(grid->tree(), grid->transform());
 		vec3s_samplers_p.insert(vec3s_samplers_p.begin() + slot, sampler);
 	}
 	else {
-		vdb_vsampler_b *sampler = new vdb_vsampler_b(grid->tree(), grid->transform());
+		slot = find_empty_slot(vec3s_samplers_b);
 
-		for(; slot < vec3s_samplers_b.size(); slot++) {
-			if(!vec3s_samplers_b[slot]) {
-				break;
-			}
-		}
+		vdb_vsampler_b *sampler = new vdb_vsampler_b(grid->tree(), grid->transform());
 		vec3s_samplers_b.insert(vec3s_samplers_b.begin() + slot, sampler);
 	}
 
@@ -219,18 +229,30 @@ void OpenVDBManager::device_update(Device *device, DeviceScene *dscene, Scene *s
 	progress.set_status("Updating OpenVDB volumes", "Sending samplers to device.");
 
 	for(size_t i = 0; i < float_samplers_p.size(); ++i) {
+		if(!float_samplers_p[i]) {
+			continue;
+		}
 		device->const_copy_to("__vdb_float_samplers_p", float_samplers_p[i], i);
 	}
 
 	for(size_t i = 0; i < float_samplers_b.size(); ++i) {
+		if(!float_samplers_b[i]) {
+			continue;
+		}
 		device->const_copy_to("__vdb_float_samplers_b", float_samplers_b[i], i);
 	}
 
 	for(size_t i = 0; i < vec3s_samplers_p.size(); ++i) {
+		if(!vec3s_samplers_p[i]) {
+			continue;
+		}
 		device->const_copy_to("__vdb_vec3s_samplers_p", vec3s_samplers_p[i], i);
 	}
 
 	for(size_t i = 0; i < vec3s_samplers_b.size(); ++i) {
+		if(!vec3s_samplers_b[i]) {
+			continue;
+		}
 		device->const_copy_to("__vdb_vec3s_samplers_b", vec3s_samplers_b[i], i);
 	}




More information about the Bf-blender-cvs mailing list