Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/image_vdb.cpp')
-rw-r--r--intern/cycles/render/image_vdb.cpp58
1 files changed, 57 insertions, 1 deletions
diff --git a/intern/cycles/render/image_vdb.cpp b/intern/cycles/render/image_vdb.cpp
index 3f7dd45ee88..5d0999d5623 100644
--- a/intern/cycles/render/image_vdb.cpp
+++ b/intern/cycles/render/image_vdb.cpp
@@ -20,6 +20,9 @@
# include <openvdb/openvdb.h>
# include <openvdb/tools/Dense.h>
#endif
+#ifdef WITH_NANOVDB
+# include <nanovdb/util/OpenToNanoVDB.h>
+#endif
CCL_NAMESPACE_BEGIN
@@ -53,41 +56,84 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata)
/* Set data type. */
if (grid->isType<openvdb::FloatGrid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid));
+# endif
}
else if (grid->isType<openvdb::Vec3fGrid>()) {
metadata.channels = 3;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(*openvdb::gridConstPtrCast<openvdb::Vec3fGrid>(grid));
+# endif
}
else if (grid->isType<openvdb::BoolGrid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::BoolGrid>(grid)));
+# endif
}
else if (grid->isType<openvdb::DoubleGrid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::DoubleGrid>(grid)));
+# endif
}
else if (grid->isType<openvdb::Int32Grid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int32Grid>(grid)));
+# endif
}
else if (grid->isType<openvdb::Int64Grid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::FloatGrid(*openvdb::gridConstPtrCast<openvdb::Int64Grid>(grid)));
+# endif
}
else if (grid->isType<openvdb::Vec3IGrid>()) {
metadata.channels = 3;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3IGrid>(grid)));
+# endif
}
else if (grid->isType<openvdb::Vec3dGrid>()) {
metadata.channels = 3;
+# ifdef WITH_NANOVDB
+ nanogrid = nanovdb::openToNanoVDB(
+ openvdb::Vec3fGrid(*openvdb::gridConstPtrCast<openvdb::Vec3dGrid>(grid)));
+# endif
}
else if (grid->isType<openvdb::MaskGrid>()) {
metadata.channels = 1;
+# ifdef WITH_NANOVDB
+ return false; // Unsupported
+# endif
}
else {
return false;
}
+# ifdef WITH_NANOVDB
+ metadata.byte_size = nanogrid.size();
+ if (metadata.channels == 1) {
+ metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT;
+ }
+ else {
+ metadata.type = IMAGE_DATA_TYPE_NANOVDB_FLOAT3;
+ }
+# else
if (metadata.channels == 1) {
metadata.type = IMAGE_DATA_TYPE_FLOAT;
}
else {
metadata.type = IMAGE_DATA_TYPE_FLOAT4;
}
+# endif
/* Set transform from object space to voxel index. */
openvdb::math::Mat4f grid_matrix = grid->transform().baseMap()->getAffineMap()->getMat4();
@@ -98,8 +144,12 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata)
}
}
+# ifdef WITH_NANOVDB
+ Transform texture_to_index = transform_identity();
+# else
Transform texture_to_index = transform_translate(min.x(), min.y(), min.z()) *
transform_scale(dim.x(), dim.y(), dim.z());
+# endif
metadata.transform_3d = transform_inverse(index_to_object * texture_to_index);
metadata.use_transform_3d = true;
@@ -114,6 +164,9 @@ bool VDBImageLoader::load_metadata(ImageMetaData &metadata)
bool VDBImageLoader::load_pixels(const ImageMetaData &, void *pixels, const size_t, const bool)
{
#ifdef WITH_OPENVDB
+# ifdef WITH_NANOVDB
+ memcpy(pixels, nanogrid.data(), nanogrid.size());
+# else
if (grid->isType<openvdb::FloatGrid>()) {
openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels);
openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::FloatGrid>(grid), dense);
@@ -153,7 +206,7 @@ bool VDBImageLoader::load_pixels(const ImageMetaData &, void *pixels, const size
openvdb::tools::Dense<float, openvdb::tools::LayoutXYZ> dense(bbox, (float *)pixels);
openvdb::tools::copyToDense(*openvdb::gridConstPtrCast<openvdb::MaskGrid>(grid), dense);
}
-
+# endif
return true;
#else
(void)pixels;
@@ -183,6 +236,9 @@ void VDBImageLoader::cleanup()
/* Free OpenVDB grid memory as soon as we can. */
grid.reset();
#endif
+#ifdef WITH_NANOVDB
+ nanogrid.reset();
+#endif
}
bool VDBImageLoader::is_vdb_loader() const