[Bf-blender-cvs] [9eaa1a732ce] soc-2018-cycles-volumes: Move VDB functions from Cycles to intern/openvdb.
Geraldine Chua
noreply at git.blender.org
Thu Aug 2 18:10:06 CEST 2018
Commit: 9eaa1a732cea21b5789b5026871faf39fb8de451
Author: Geraldine Chua
Date: Thu Aug 2 23:06:52 2018 +0800
Branches: soc-2018-cycles-volumes
https://developer.blender.org/rB9eaa1a732cea21b5789b5026871faf39fb8de451
Move VDB functions from Cycles to intern/openvdb.
So they can be used on Blender side. Changed variable names and types to
be more consistent between Cycles and intern/openvdb.
===================================================================
M intern/cycles/render/openvdb.cpp
M intern/cycles/util/util_sparse_grid.h
M intern/openvdb/intern/openvdb_dense_convert.cc
M intern/openvdb/intern/openvdb_dense_convert.h
M intern/openvdb/openvdb_capi.cc
M intern/openvdb/openvdb_capi.h
M source/blender/blenkernel/intern/pointcache.c
===================================================================
diff --git a/intern/cycles/render/openvdb.cpp b/intern/cycles/render/openvdb.cpp
index 68f2cfa4af0..d863ae42233 100644
--- a/intern/cycles/render/openvdb.cpp
+++ b/intern/cycles/render/openvdb.cpp
@@ -1,9 +1,12 @@
#include <openvdb/openvdb.h>
#include <openvdb/tools/GridTransformer.h>
+
+#include "render/openvdb.h"
+
#include "intern/openvdb_reader.h"
+#include "intern/openvdb_dense_convert.h"
#include "openvdb_capi.h"
-#include "render/openvdb.h"
#include "util/util_logging.h"
#include "util/util_path.h"
@@ -24,23 +27,10 @@ static bool operator >=(const openvdb::math::Vec3s &a, const float &b)
return a.x() >= b || a.y() >= b || a.z() >= b;
}
-static void copy(float *des, const openvdb::math::Vec3s *src)
-{
- *(des + 0) = src->x();
- *(des + 1) = src->y();
- *(des + 2) = src->z();
- *(des + 3) = 1.0f;
-}
-
-static void copy(float *des, const float *src)
-{
- *des = *src;
-}
-
-static const int tile_index(openvdb::math::Coord start, int3 tiled_res)
+static const int tile_index(openvdb::math::Coord start, const int tiled_res[3])
{
return compute_index(start.x() / TILE_SIZE, start.y() / TILE_SIZE,
- start.z() / TILE_SIZE, tiled_res.x, tiled_res.y);
+ start.z() / TILE_SIZE, tiled_res[0], tiled_res[1]);
}
/* Simple range shift for grids with non-zero background values. May have
@@ -48,24 +38,19 @@ static const int tile_index(openvdb::math::Coord start, int3 tiled_res)
static void shift_range(openvdb::Vec3SGrid::Ptr grid)
{
using namespace openvdb;
-
- const math::Vec3s z(0.0f, 0.0f, 0.0f);
const math::Vec3s background_value = grid->background();
-
- if(background_value != z) {
+ if(background_value != math::Vec3s(0.0f, 0.0f, 0.0f)) {
for (Vec3SGrid::ValueOnIter iter = grid->beginValueOn(); iter; ++iter) {
iter.setValue(iter.getValue() - background_value);
}
- tools::changeBackground(grid->tree(), z);
+ tools::changeBackground(grid->tree(), math::Vec3s(0.0f, 0.0f, 0.0f));
}
}
static void shift_range(openvdb::FloatGrid::Ptr grid)
{
using namespace openvdb;
-
const float background_value = grid->background();
-
if(background_value != 0.0f) {
for (FloatGrid::ValueOnIter iter = grid->beginValueOn(); iter; ++iter) {
iter.setValue(iter.getValue() - background_value);
@@ -78,8 +63,8 @@ template<typename GridType>
static bool get_grid(const string& filepath,
const string& grid_name,
typename GridType::Ptr& grid,
- int3 *resolution,
- openvdb::math::Coord *minimum_bound)
+ int resolution[3],
+ int min_bound[3])
{
using namespace openvdb;
@@ -115,15 +100,8 @@ static bool get_grid(const string& filepath,
* voxels below background value. */
shift_range(grid);
- int min_bound[3], res[3];
- OpenVDBReader_get_bounds(reader, min_bound, NULL, res, NULL, NULL, NULL);
-
- if(resolution) {
- *resolution = make_int3(res[0], res[1], res[2]);
- }
- if(minimum_bound) {
- *minimum_bound = math::Coord(min_bound[0], min_bound[1], min_bound[2]);
- }
+ /* Retrieve bound data. */
+ OpenVDBReader_get_bounds(reader, min_bound, NULL, resolution, NULL, NULL, NULL);
OpenVDBReader_free(reader);
return true;
@@ -159,12 +137,12 @@ int3 openvdb_get_resolution(const string& filepath)
return make_int3(res[0], res[1], res[2]);
}
-/* For now, since there is no official OpenVDB interpolation implementations
+/* For now, since there is no official OpenVDB accessor implementations
* for CUDA or OpenCL, OpenVDB grids can only be saved for CPU rendering.
* Otherwise, we convert the OpenVDB grids to arrays. */
/* Direct load external OpenVDB grid to device.
- * Thread must be locked before file_load_openvdb_cpu() is called. */
+ * Thread must be locked before openvdb_load_device_*() is called. */
template<typename GridType>
static device_memory *openvdb_load_device_extern(Device *device,
const string& filepath,
@@ -177,23 +155,19 @@ static device_memory *openvdb_load_device_extern(Device *device,
typename GridType::Ptr grid = GridType::create();
typename GridType::Ptr orig_grid = GridType::create();
- int3 resolution;
- math::Coord min_bound;
+ int res[3], min_bound[3];
- if(!get_grid<GridType>(filepath, grid_name, orig_grid, &resolution, &min_bound)) {
+ if(!get_grid<GridType>(filepath, grid_name, orig_grid, res, min_bound)) {
return NULL;
}
- /* In order to keep sampling uniform, we expect a volume's bound to begin at
- * (0, 0, 0) in object space. External VDBs may have a non-zero origin, so
- * all voxels must be translated. This process may be memory inefficient. */
-
- if(min_bound.x() == 0 && min_bound.y() == 0 && min_bound.z() == 0) {
+ if(min_bound[0] == 0 && min_bound[1] == 0 && min_bound[2] == 0) {
grid = orig_grid;
}
else {
+ /* Create translate grid that begins at (0, 0, 0). */
math::Mat4d xform = math::Mat4d::identity();
- math::Vec3d translation(-min_bound.x(), -min_bound.y(), -min_bound.z());
+ math::Vec3d translation(-min_bound[0], -min_bound[1], -min_bound[1]);
xform.setTranslation(translation);
tools::GridTransformer transformer(xform);
transformer.transformGrid<tools::PointSampler, GridType>(*orig_grid, *grid);
@@ -203,7 +177,8 @@ static device_memory *openvdb_load_device_extern(Device *device,
device_openvdb<GridType> *tex_img =
new device_openvdb<GridType>(device, mem_name.c_str(), MEM_TEXTURE,
- grid, accessor, resolution);
+ grid, accessor,
+ make_int3(res[0], res[1], res[2]));
tex_img->interpolation = interpolation;
tex_img->extension = extension;
@@ -245,23 +220,23 @@ static void openvdb_load_preprocess(const string& filepath,
using namespace openvdb;
typename GridType::Ptr grid = GridType::create();
- int3 resolution;
- math::Coord min_bound;
+ int res[3], min_bound[3];
- if(!get_grid<GridType>(filepath, grid_name, grid, &resolution, &min_bound) ||
+ if(!get_grid<GridType>(filepath, grid_name, grid, res, min_bound) ||
!(channels == 4 || channels == 1))
{
return;
}
- const int3 tiled_res = make_int3(get_tile_res(resolution.x),
- get_tile_res(resolution.y),
- get_tile_res(resolution.z));
- const int3 last_tile = make_int3(resolution.x % TILE_SIZE,
- resolution.y % TILE_SIZE,
- resolution.z % TILE_SIZE);
- const int tile_count = tiled_res.x * tiled_res.y * tiled_res.z;
+ const int tiled_res[3] = {get_tile_res(res[0]),
+ get_tile_res(res[1]),
+ get_tile_res(res[2])};
+ const int remainder[3] = {res[0] % TILE_SIZE,
+ res[1] % TILE_SIZE,
+ res[2] % TILE_SIZE};
+ const int tile_count = tiled_res[0] * tiled_res[1] * tiled_res[2];
const int tile_pix_count = TILE_SIZE * TILE_SIZE * TILE_SIZE * channels;
+ const math::Coord min(min_bound[0], min_bound[1], min_bound[2]);
sparse_index->resize(tile_count, -1); /* 0 if active, -1 if inactive. */
int voxel_count = 0;
@@ -269,18 +244,18 @@ static void openvdb_load_preprocess(const string& filepath,
for (typename GridType::TreeType::LeafCIter iter = grid->tree().cbeginLeaf(); iter; ++iter) {
const typename GridType::TreeType::LeafNodeType *leaf = iter.getLeaf();
const T *data = leaf->buffer().data();
- const math::Coord start = leaf->getNodeBoundingBox().getStart() - min_bound;
+ const math::Coord start = leaf->getNodeBoundingBox().getStart() - min;
for(int i = 0; i < tile_pix_count; ++i) {
if(data[i] >= threshold) {
sparse_index->at(tile_index(start, tiled_res)) = 0;
/* Calculate how many voxels are in this tile. */
- int tile_width = (start.x() + TILE_SIZE > resolution.x) ? last_tile.x : TILE_SIZE;
- int tile_height = (start.y() + TILE_SIZE > resolution.y) ? last_tile.y : TILE_SIZE;
- int tile_depth = (start.z() + TILE_SIZE > resolution.z) ? last_tile.z : TILE_SIZE;
- voxel_count += tile_width * tile_height * tile_depth;
+ const int tile_width = (start.x() + TILE_SIZE > res[0]) ? remainder[0] : TILE_SIZE;
+ const int tile_height = (start.y() + TILE_SIZE > res[1]) ? remainder[1] : TILE_SIZE;
+ const int tile_depth = (start.z() + TILE_SIZE > res[2]) ? remainder[2] : TILE_SIZE;
+ voxel_count += tile_width * tile_height * tile_depth;
break;
}
}
@@ -288,7 +263,7 @@ static void openvdb_load_preprocess(const string& filepath,
/* Check memory savings. */
const int sparse_mem_use = tile_count * sizeof(int) + voxel_count * channels * sizeof(float);
- const int dense_mem_use = resolution.x * resolution.y * resolution.z * channels * sizeof(float);
+ const int dense_mem_use = res[0] * res[1] * res[2] * channels * sizeof(float);
if(sparse_mem_use < dense_mem_use) {
VLOG(1) << "Memory of " << grid_name << " decreased from "
@@ -323,21 +298,19 @@ void openvdb_load_preprocess(const string& filepath,
}
}
-
template<typename GridType, typename T>
static void openvdb_load_image(const string& filepath,
const string& grid_name,
const int channels,
- float *image,
+ float *data,
vector<int> *sparse_index)
{
using namespace openvdb;
typename GridType::Ptr grid = GridType::create();
- int3 resolution;
- math::Coord min_bound;
+ int res[3], min_bound[3];
- if(!get_grid<GridType>(filepath, grid_name, grid, &resolution, &min_bound) ||
+ if(!get_grid<GridType>(filepath, grid_name, grid, res, min_bound) ||
!(channels == 4 || channels == 1))
{
return;
@@ -352,40 +325,39 @@ static void openvdb_load_image(const string& filepath,
if(make_sparse) {
/* Load VDB as sparse image. */
- const int3 tiled_res = make_int3(get_tile_res(resolution.x),
- get_tile_res(resolution.y),
- get_tile_res(resolution.z));
- c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list