[Bf-blender-cvs] [0cd3e5e] openvdb: Cycles: early exit add_volume if we already have a sampler allocated.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:06:30 CEST 2015
Commit: 0cd3e5e72cf1e007ffd5d7f9893b740d5b5f1622
Author: Kévin Dietrich
Date: Sat May 16 18:11:31 2015 +0200
Branches: openvdb
https://developer.blender.org/rB0cd3e5e72cf1e007ffd5d7f9893b740d5b5f1622
Cycles: early exit add_volume if we already have a sampler allocated.
This is done by means of a vector of structs which stores the grids'
information, including the grid slot, which is returned if we have a
match.
===================================================================
M intern/cycles/render/openvdb.cpp
M intern/cycles/render/openvdb.h
===================================================================
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 2ba468e..6a465b1 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -58,6 +58,44 @@ int OpenVDBManager::add_volume(const string &filename, const string &name, int s
using namespace openvdb;
size_t slot = -1;
+ /* Find existing grid */
+ for(size_t i = 0; i < current_grids.size(); ++i) {
+ GridDescription grid = current_grids[i];
+
+ if(grid.filename == filename && grid.name == name) {
+ if(grid.sampling == sampling) {
+ return grid.slot;
+ }
+ /* sampling was changed, remove the sampler */
+ else {
+ if(grid_type == NODE_VDB_FLOAT) {
+ if(grid.sampling == OPENVDB_SAMPLE_POINT) {
+ delete float_samplers_p[grid.slot];
+ float_samplers_p[grid.slot] = NULL;
+ }
+ else {
+ delete float_samplers_b[grid.slot];
+ float_samplers_b[grid.slot] = NULL;
+ }
+ }
+ else {
+ if(grid.sampling == OPENVDB_SAMPLE_POINT) {
+ delete vec3s_samplers_p[grid.slot];
+ vec3s_samplers_p[grid.slot] = NULL;
+ }
+ else {
+ delete vec3s_samplers_b[grid.slot];
+ vec3s_samplers_b[grid.slot] = NULL;
+ }
+ }
+
+ /* remove grid description too */
+ std::swap(current_grids[i], current_grids.back());
+ current_grids.pop_back();
+ }
+ }
+ }
+
try {
io::File file(filename);
file.open();
@@ -126,6 +164,14 @@ int OpenVDBManager::add_volume(const string &filename, const string &name, int s
catch_exceptions();
}
+ GridDescription descr;
+ descr.filename = filename;
+ descr.name = name;
+ descr.sampling = sampling;
+ descr.slot = slot;
+
+ current_grids.push_back(descr);
+
return slot;
}
diff --git a/intern/cycles/render/openvdb.h b/intern/cycles/render/openvdb.h
index 1419e70..8c25058 100644
--- a/intern/cycles/render/openvdb.h
+++ b/intern/cycles/render/openvdb.h
@@ -28,7 +28,14 @@ class DeviceScene;
class Progress;
class Scene;
-class OpenVDBManager {
+class OpenVDBManager {
+ struct GridDescription {
+ string filename;
+ string name;
+ int sampling;
+ int slot;
+ };
+
public:
OpenVDBManager();
~OpenVDBManager();
@@ -40,6 +47,7 @@ public:
bool need_update;
+ vector<GridDescription> current_grids;
vector<openvdb::FloatGrid::Ptr> scalar_grids;
vector<openvdb::Vec3SGrid::Ptr> vector_grids;
More information about the Bf-blender-cvs
mailing list