[Bf-blender-cvs] [788ecf2] openvdb: Don't construct default samplers, rather just store pointers to accessors and transforms.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:07:52 CEST 2015
Commit: 788ecf29a7fbaa6ed50f1d0edeb3b8b478995ff7
Author: Kévin Dietrich
Date: Sat May 23 08:23:47 2015 +0200
Branches: openvdb
https://developer.blender.org/rB788ecf29a7fbaa6ed50f1d0edeb3b8b478995ff7
Don't construct default samplers, rather just store pointers to
accessors and transforms.
===================================================================
M intern/cycles/util/util_openvdb.h
===================================================================
diff --git a/intern/cycles/util/util_openvdb.h b/intern/cycles/util/util_openvdb.h
index fb8a5f8..e24e18b 100644
--- a/intern/cycles/util/util_openvdb.h
+++ b/intern/cycles/util/util_openvdb.h
@@ -51,9 +51,6 @@ using boost::math::isfinite;
class vdb_float_volume : public float_volume {
typedef openvdb::tools::GridSampler<openvdb::FloatGrid::ConstAccessor, openvdb::tools::PointSampler> point_sampler_t;
typedef openvdb::tools::GridSampler<openvdb::FloatGrid::ConstAccessor, openvdb::tools::BoxSampler> box_sampler_t;
- point_sampler_t *point_sampler;
- box_sampler_t *box_sampler;
-
typedef openvdb::tools::VolumeRayIntersector<openvdb::FloatGrid> isector_t;
typedef isector_t::RayType vdb_ray_t;
@@ -66,6 +63,7 @@ class vdb_float_volume : public float_volume {
box_map box_samplers;
openvdb::FloatGrid::ConstAccessor *accessor;
+ openvdb::math::Transform *transfrom;
/* Main intersector, its purpose is to initialize the voxels' bounding box
* so the ones for the various threads do not do this, rather they are
@@ -76,10 +74,9 @@ class vdb_float_volume : public float_volume {
public:
vdb_float_volume(openvdb::FloatGrid::Ptr grid)
+ : transfrom(&grid->transform())
{
accessor = new openvdb::FloatGrid::ConstAccessor(grid->getConstAccessor());
- point_sampler = new point_sampler_t(*accessor, grid->transform());
- box_sampler = new box_sampler_t(*accessor, grid->transform());
/* only grids with uniform voxels can be used with VolumeRayIntersector */
if(grid->hasUniformVoxels()) {
@@ -88,13 +85,36 @@ public:
}
else {
uniform_voxels = false;
+ main_isector = NULL;
}
}
~vdb_float_volume()
{
- delete point_sampler;
- delete box_sampler;
+ for(point_map::iterator iter = point_samplers.begin();
+ iter != point_samplers.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+
+ for(box_map::iterator iter = box_samplers.begin();
+ iter != box_samplers.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+
+ if(uniform_voxels) {
+ delete main_isector;
+
+ for(isect_map::iterator iter = isectors.begin();
+ iter != isectors.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+ }
}
ccl_always_inline float sample(int sampling, float3 co)
@@ -107,7 +127,7 @@ public:
if(iter == point_samplers.end()) {
openvdb::FloatGrid::ConstAccessor *acc = new openvdb::FloatGrid::ConstAccessor(*accessor);
- sampler = new point_sampler_t(*acc, point_sampler->transform());
+ sampler = new point_sampler_t(*acc, *transfrom);
pair<pthread_t, point_sampler_t *> sampl(thread, sampler);
point_samplers.insert(sampl);
}
@@ -123,7 +143,7 @@ public:
if(iter == box_samplers.end()) {
openvdb::FloatGrid::ConstAccessor *acc = new openvdb::FloatGrid::ConstAccessor(*accessor);
- sampler = new box_sampler_t(*acc, box_sampler->transform());
+ sampler = new box_sampler_t(*acc, *transfrom);
pair<pthread_t, box_sampler_t *> sampl(thread, sampler);
box_samplers.insert(sampl);
}
@@ -228,6 +248,7 @@ class vdb_float3_volume : public float3_volume {
box_map box_samplers;
openvdb::Vec3SGrid::ConstAccessor *accessor;
+ openvdb::math::Transform *transfrom;
/* Main intersector, its purpose is to initialize the voxels' bounding box
* so the ones for the various threads do not do this, rather they are
@@ -238,10 +259,9 @@ class vdb_float3_volume : public float3_volume {
public:
vdb_float3_volume(openvdb::Vec3SGrid::Ptr grid)
+ : transfrom(&grid->transform())
{
accessor = new openvdb::Vec3SGrid::ConstAccessor(grid->getConstAccessor());
- point_sampler = new point_sampler_t(grid->tree(), grid->transform());
- box_sampler = new box_sampler_t(grid->tree(), grid->transform());
/* only grids with uniform voxels can be used with VolumeRayIntersector */
if(grid->hasUniformVoxels()) {
@@ -250,13 +270,36 @@ public:
}
else {
uniform_voxels = false;
+ main_isector = NULL;
}
}
~vdb_float3_volume()
{
- delete point_sampler;
- delete box_sampler;
+ for(point_map::iterator iter = point_samplers.begin();
+ iter != point_samplers.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+
+ for(box_map::iterator iter = box_samplers.begin();
+ iter != box_samplers.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+
+ if(uniform_voxels) {
+ delete main_isector;
+
+ for(isect_map::iterator iter = isectors.begin();
+ iter != isectors.end();
+ ++iter)
+ {
+ delete iter->second;
+ }
+ }
}
ccl_always_inline float3 sample(int sampling, float3 co)
More information about the Bf-blender-cvs
mailing list