From 0c84939117449c30f57620ef196e3a94bb87fda2 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 1 Jul 2021 19:49:56 +0200 Subject: Cleanup: use template utility function to handle OpenVDB grid types in Cycles --- intern/cycles/render/image_vdb.cpp | 193 ++++++++++++++----------------------- 1 file changed, 73 insertions(+), 120 deletions(-) (limited to 'intern/cycles/render/image_vdb.cpp') diff --git a/intern/cycles/render/image_vdb.cpp b/intern/cycles/render/image_vdb.cpp index fb6394e8917..13cdda552ba 100644 --- a/intern/cycles/render/image_vdb.cpp +++ b/intern/cycles/render/image_vdb.cpp @@ -16,8 +16,9 @@ #include "render/image_vdb.h" +#include "util/util_openvdb.h" + #ifdef WITH_OPENVDB -# include # include #endif #ifdef WITH_NANOVDB @@ -26,6 +27,51 @@ CCL_NAMESPACE_BEGIN +#ifdef WITH_OPENVDB +struct NumChannelsOp { + int num_channels = 0; + + template + bool operator()(const openvdb::GridBase::ConstPtr &grid) + { + num_channels = channels; + return true; + } +}; + +struct ToDenseOp { + openvdb::CoordBBox bbox; + void *pixels; + + template + bool operator()(const openvdb::GridBase::ConstPtr &grid) + { + openvdb::tools::Dense dense(bbox, + (FloatDataType *)pixels); + openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); + return true; + } +}; + +# ifdef WITH_NANOVDB +struct ToNanoOp { + nanovdb::GridHandle<> nanogrid; + + template + bool operator()(const openvdb::GridBase::ConstPtr &grid) + { + if constexpr (!std::is_same_v) { + nanogrid = nanovdb::openToNanoVDB(FloatGridType(*openvdb::gridConstPtrCast(grid))); + return true; + } + else { + return false; + } + } +}; +# endif +#endif + VDBImageLoader::VDBImageLoader(const string &grid_name) : grid_name(grid_name) { } @@ -41,98 +87,40 @@ bool VDBImageLoader::load_metadata(const ImageDeviceFeatures &features, ImageMet return false; } - bbox = grid->evalActiveVoxelBoundingBox(); - if (bbox.empty()) { + /* Get number of channels from type. */ + NumChannelsOp op; + if (!openvdb::grid_type_operation(grid, op)) { return false; } - /* Set dimensions. */ - openvdb::Coord dim = bbox.dim(); - metadata.width = dim.x(); - metadata.height = dim.y(); - metadata.depth = dim.z(); + metadata.channels = op.num_channels; /* Set data type. */ - if (grid->isType()) { - metadata.channels = 1; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast(grid)); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 3; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast(grid)); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 1; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast(grid))); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 1; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast(grid))); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 1; # ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast(grid))); + if (features.has_nanovdb) { + /* NanoVDB expects no inactive leaf nodes. */ + /*openvdb::FloatGrid &pruned_grid = *openvdb::gridPtrCast(grid); + openvdb::tools::pruneInactive(pruned_grid.tree()); + nanogrid = nanovdb::openToNanoVDB(pruned_grid);*/ + ToNanoOp op; + if (!openvdb::grid_type_operation(grid, op)) { + return false; } -# endif - } - else if (grid->isType()) { - metadata.channels = 1; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::FloatGrid(*openvdb::gridConstPtrCast(grid))); - } -# endif + nanogrid = std::move(op.nanogrid); } - else if (grid->isType()) { - metadata.channels = 3; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::Vec3fGrid(*openvdb::gridConstPtrCast(grid))); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 3; -# ifdef WITH_NANOVDB - if (features.has_nanovdb) { - nanogrid = nanovdb::openToNanoVDB( - openvdb::Vec3fGrid(*openvdb::gridConstPtrCast(grid))); - } -# endif - } - else if (grid->isType()) { - metadata.channels = 1; -# ifdef WITH_NANOVDB - return false; // Unsupported # endif - } - else { + + /* Set dimensions. */ + bbox = grid->evalActiveVoxelBoundingBox(); + if (bbox.empty()) { return false; } + openvdb::Coord dim = bbox.dim(); + metadata.width = dim.x(); + metadata.height = dim.y(); + metadata.depth = dim.z(); + # ifdef WITH_NANOVDB if (nanogrid) { metadata.byte_size = nanogrid.size(); @@ -200,45 +188,10 @@ bool VDBImageLoader::load_pixels(const ImageMetaData &, void *pixels, const size else # endif { - if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense( - bbox, (openvdb::Vec3f *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } - else if (grid->isType()) { - openvdb::tools::Dense dense(bbox, (float *)pixels); - openvdb::tools::copyToDense(*openvdb::gridConstPtrCast(grid), dense); - } + ToDenseOp op; + op.pixels = pixels; + op.bbox = bbox; + openvdb::grid_type_operation(grid, op); } return true; #else -- cgit v1.2.3