[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59732] branches/soc-2013-cycles_volume/ intern/cycles/kernel/textures: - added templated lookup, hidden behind the new VDBAccessor class; had to move VDBVolumeFile definition to avoid circular reference;
Rafael Campos
rafaelcdn at gmail.com
Mon Sep 2 14:51:53 CEST 2013
Revision: 59732
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59732
Author: jehuty
Date: 2013-09-02 12:51:53 +0000 (Mon, 02 Sep 2013)
Log Message:
-----------
- added templated lookup, hidden behind the new VDBAccessor class; had to move VDBVolumeFile definition to avoid circular reference;
Modified Paths:
--------------
branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_definitions.h
branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_lookup.h
branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_volume.cpp
Modified: branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_definitions.h
===================================================================
--- branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_definitions.h 2013-09-02 12:02:46 UTC (rev 59731)
+++ branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_definitions.h 2013-09-02 12:51:53 UTC (rev 59732)
@@ -19,33 +19,70 @@
#ifndef __VDB_DEFINITIONS_H__
#define __VDB_DEFINITIONS_H__
-#include <openvdb/openvdb.h>
-#include <OpenImageIO/ustring.h>
+#include "vdb_lookup.h"
+#include <openvdb/tools/Interpolation.h>
+//#include <OpenImageIO/ustring.h>
+#include <OSL/oslconfig.h>
+#include <vector.h>
CCL_NAMESPACE_BEGIN
using OpenImageIO::ustring;
+typedef boost::shared_ptr<VDBAccessor> VDBAccessorPtr;
+typedef vector<VDBAccessorPtr> AccessorVector;
+
typedef struct VDBVolumeFile {
openvdb::io::File file;
ustring version;
-
+
+ AccessorVector accessors;
openvdb::GridPtrVecPtr grids;
openvdb::MetaMap::Ptr meta;
+ VDBAccessorPtr getAccessor(ustring grid_name)
+ {
+ VDBAccessorPtr ptr;
+
+ for (int i = 0; i < accessors.size(); i++)
+ {
+ if (accessors[i]->getGridPtr()->getName() == grid_name.string())
+ {
+ ptr = accessors[i];
+ break;
+ }
+ }
+
+ return ptr;
+ }
+
+ VDBAccessorPtr getAccessor()
+ {
+ return accessors[0];
+ }
+
VDBVolumeFile(ustring filename) : file(filename.string())
{
file.open();
grids = file.getGrids();
+ for(int i = 0; i < grids->size(); i++)
+ {
+ VDBAccessorPtr ptr(new VDBAccessor((*grids)[i]));
+ accessors.push_back(ptr);
+ }
+
meta = file.getMetadata();
version = file.version();
}
~VDBVolumeFile()
{
file.close();
+ accessors.clear();
}
+
+
} VDBVolumeFile;
CCL_NAMESPACE_END
Modified: branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_lookup.h
===================================================================
--- branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_lookup.h 2013-09-02 12:02:46 UTC (rev 59731)
+++ branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_lookup.h 2013-09-02 12:51:53 UTC (rev 59732)
@@ -21,31 +21,140 @@
#include <openvdb/openvdb.h>
-template <typename GridType>
-class VDBLookup {
+CCL_NAMESPACE_BEGIN
+
+typedef enum VDB_GridType
+{
+ VDB_GRID_NOT_SET,
+ VDB_GRID_BOOL,
+ VDB_GRID_FLOAT,
+ VDB_GRID_DOUBLE,
+ VDB_GRID_INT32,
+ VDB_GRID_INT64,
+ VDB_GRID_VEC3I,
+ VDB_GRID_VEC3F,
+ VDB_GRID_VEC3D
+} VDB_GridType;
+
+class VDBAccessor {
public:
- static typename GridType::ValueType vdb_lookup_single_point(const GridType &grid, int i, int j, int k);
- static typename GridType::ValueType* vdb_lookup_multiple_points(const GridType &grid, int i[], int j[], int k[], int num);
+ VDBAccessor(openvdb::GridBase::Ptr grid);
+ VDBAccessor() { }
+ ~VDBAccessor() { }
+
+ //getGrid
+ openvdb::GridBase::Ptr getGridPtr();
+
+ void vdb_lookup_single_point(int i, int j, int k, float *result);
+ void vdb_lookup_multiple_points(int i[], int j[], int k[], float *result);
+
+private:
+ openvdb::GridBase::Ptr m_grid;
+ VDB_GridType m_type;
+
+ template <typename GridType>
+ typename GridType::ValueType vdb_lookup_single_point(int i, int j, int k);
+
+ template <typename GridType>
+ typename GridType::ValueType* vdb_lookup_multiple_points(int i[], int j[], int k[], int num);
};
+VDBAccessor::VDBAccessor(openvdb::GridBase::Ptr grid)
+{
+ if (grid->isType<openvdb::BoolGrid>())
+ m_type = VDB_GRID_BOOL;
+ else if (grid->isType<openvdb::FloatGrid>())
+ m_type = VDB_GRID_FLOAT;
+ else if (grid->isType<openvdb::DoubleGrid>())
+ m_type = VDB_GRID_DOUBLE;
+ else if (grid->isType<openvdb::Int32Grid>())
+ m_type = VDB_GRID_INT32;
+ else if (grid->isType<openvdb::Int64Grid>())
+ m_type = VDB_GRID_INT64;
+ else if (grid->isType<openvdb::Vec3IGrid>())
+ m_type = VDB_GRID_VEC3I;
+ else if (grid->isType<openvdb::Vec3fGrid>())
+ m_type = VDB_GRID_VEC3F;
+ else if (grid->isType<openvdb::Vec3DGrid>())
+ m_type = VDB_GRID_VEC3D;
+ else
+ m_type = VDB_GRID_NOT_SET;
+
+ m_grid = grid;
+}
+
+openvdb::GridBase::Ptr VDBAccessor::getGridPtr()
+{
+ return m_grid;
+}
+
+template <typename VectorType>
+void copyVectorToFloatArray(VectorType &vec, float *array, int num)
+{
+ for (int i = 0; i < num; i++)
+ array[i] = vec[i];
+}
+
+void VDBAccessor::vdb_lookup_single_point(int i, int j, int k, float *result)
+{
+ switch (m_type) {
+ case VDB_GRID_BOOL:
+ *result = static_cast<float>(VDBAccessor::vdb_lookup_single_point<openvdb::BoolGrid>(i, j, k));
+ break;
+ case VDB_GRID_FLOAT:
+ *result = VDBAccessor::vdb_lookup_single_point<openvdb::FloatGrid>(i, j, k);
+ break;
+ case VDB_GRID_DOUBLE:
+ *result = static_cast<float>(VDBAccessor::vdb_lookup_single_point<openvdb::DoubleGrid>(i, j, k));
+ break;
+ case VDB_GRID_INT32:
+ *result = static_cast<float>(VDBAccessor::vdb_lookup_single_point<openvdb::Int32Grid>(i, j, k));
+ break;
+ case VDB_GRID_INT64:
+ *result = static_cast<float>(VDBAccessor::vdb_lookup_single_point<openvdb::Int64Grid>(i, j, k));
+ break;
+ case VDB_GRID_VEC3I:
+ {
+ openvdb::Vec3i result3i = VDBAccessor::vdb_lookup_single_point<openvdb::Vec3IGrid>(i, j, k);
+ copyVectorToFloatArray(result3i, result, 3);
+ break;
+ }
+ case VDB_GRID_VEC3F:
+ {
+ openvdb::Vec3f result3f = VDBAccessor::vdb_lookup_single_point<openvdb::Vec3fGrid>(i, j, k);
+ copyVectorToFloatArray(result3f, result, 3);
+ break;
+ }
+ case VDB_GRID_VEC3D:
+ {
+ openvdb::Vec3d result3d = VDBAccessor::vdb_lookup_single_point<openvdb::Vec3DGrid>(i, j, k);
+ copyVectorToFloatArray(result3d, result, 3);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
template <typename GridType>
-typename GridType::ValueType VDBLookup<GridType>::vdb_lookup_single_point(const GridType &grid, int i, int j, int k)
+typename GridType::ValueType VDBAccessor::vdb_lookup_single_point(int i, int j, int k)
{
+ GridType typedGrid = *(openvdb::gridPtrCast<GridType>(m_grid));
typename GridType::ValueType result;
openvdb::math::Coord xyz(i, j, k);
- result = grid.tree().getValue(xyz);
-
+ result = typedGrid.tree().getValue(xyz);
return result;
}
template <typename GridType>
-typename GridType::ValueType* VDBLookup<GridType>::vdb_lookup_multiple_points(const GridType &grid, int i[], int j[], int k[], int num)
+typename GridType::ValueType* VDBAccessor::vdb_lookup_multiple_points(int i[], int j[], int k[], int num)
{
+ GridType typedGrid = *(openvdb::gridPtrCast<GridType>(m_grid));
typename GridType::ValueType result;
openvdb::math::Coord xyz;
- typename GridType::ConstAccessor accessor = grid.getAccessor();
+ typename GridType::ConstAccessor accessor = typedGrid.getAccessor();
GridType::ValueType *result = new typename GridType::ValueType[num];
for (int pos = 0; pos < num; pos++) {
@@ -57,5 +166,6 @@
return result;
}
+CCL_NAMESPACE_END
#endif /* __VDB_LOOKUP_H__ */
Modified: branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_volume.cpp
===================================================================
--- branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_volume.cpp 2013-09-02 12:02:46 UTC (rev 59731)
+++ branches/soc-2013-cycles_volume/intern/cycles/kernel/textures/vdb_volume.cpp 2013-09-02 12:51:53 UTC (rev 59732)
@@ -57,28 +57,34 @@
}
else
{
- openvdb::GridBase::Ptr grid;
-
+ VDBAccessorPtr accessor;
if (options.subimagename) {
- grid = vdb_p->file.readGrid(options.subimagename.string());
+ accessor = vdb_p->getAccessor(options.subimagename);
}
else
{
- grid = (*(vdb_p->grids))[0];
+ accessor = vdb_p->getAccessor();
}
- if (!grid) return false;
-
- //decide on type of grid; let's say it's a float grid.
- openvdb::Int32Grid::Ptr intGrid = openvdb::gridPtrCast<openvdb::Int32Grid>(grid);
+ if (!accessor) return false;
+ /*
float x, y, z = 0;
x = OpenVDBUtil::nearest_neighbor(P[0]);
y = OpenVDBUtil::nearest_neighbor(P[1]);
z = OpenVDBUtil::nearest_neighbor(P[2]);
- *result = VDBLookup<openvdb::Int32Grid>::vdb_lookup_single_point(*intGrid, (int)x, (int)y, (int)z);
+ */
+ //accessor->vdb_lookup_single_point(x, y, z, result);
+ openvdb::tools::GridSampler<openvdb::FloatTree, openvdb::tools::BoxSampler>
+ sampler(openvdb::gridPtrCast<openvdb::FloatGrid>(accessor->getGridPtr())->constTree(), accessor->getGridPtr()->transform());
+ openvdb::Vec3d p(P[0], P[1], P[2]);
+ *result = sampler.wsSample(p);
+ // VDBLookup::vdb_lookup_single_point(grid, x, y, z, result);
+
+ // *result = VDBLookup<openvdb::Int32Grid>::vdb_lookup_single_point(*intGrid, (int)x, (int)y, (int)z);
+
return true;
}
}
More information about the Bf-blender-cvs
mailing list