[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