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:
authorHans Goudey <h.goudey@me.com>2021-04-08 21:28:35 +0300
committerHans Goudey <h.goudey@me.com>2021-04-08 21:28:35 +0300
commit0e2a1ef13223925a874d6dbb139e0ce9f4eecab5 (patch)
treeabfe1aa3ae40c424e9b5ee6291adf1c81dde39f2 /source/blender/blenkernel/intern/volume.cc
parent223093ed17e23948399070689b3d5ad9ce964746 (diff)
BKE: Add a utility to transform a shallow copy of a volume grid
Often you need to apply a transformation to a grid without changing the original, and it's necessary to avoid a deep copy of the actual data. OpenVDB has a function to do this, this commit simply adds a wrapper to transform and use that function with blender's `float4x4` data type. Split from D10906
Diffstat (limited to 'source/blender/blenkernel/intern/volume.cc')
-rw-r--r--source/blender/blenkernel/intern/volume.cc23
1 files changed, 23 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index a51828453ca..a22f4c3eddb 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -28,7 +28,10 @@
#include "BLI_compiler_compat.h"
#include "BLI_fileops.h"
+#include "BLI_float3.hh"
+#include "BLI_float4x4.hh"
#include "BLI_ghash.h"
+#include "BLI_index_range.hh"
#include "BLI_map.hh"
#include "BLI_math.h"
#include "BLI_path_util.h"
@@ -63,6 +66,10 @@ static CLG_LogRef LOG = {"bke.volume"};
#define VOLUME_FRAME_NONE INT_MAX
+using blender::float3;
+using blender::float4x4;
+using blender::IndexRange;
+
#ifdef WITH_OPENVDB
# include <atomic>
# include <list>
@@ -1496,6 +1503,22 @@ float BKE_volume_simplify_factor(const Depsgraph *depsgraph)
/* OpenVDB Grid Access */
#ifdef WITH_OPENVDB
+
+/**
+ * Return a new grid pointer with only the metadata and transform changed.
+ * This is useful for instances, where there is a separate transform on top of the original
+ * grid transform that must be applied for some operations that only take a grid argument.
+ */
+openvdb::GridBase::ConstPtr BKE_volume_grid_shallow_transform(openvdb::GridBase::ConstPtr grid,
+ const blender::float4x4 &transform)
+{
+ openvdb::math::Transform::Ptr grid_transform = grid->transform().copy();
+ grid_transform->postMult(openvdb::Mat4d(((float *)transform.values)));
+
+ /* Create a transformed grid. The underlying tree is shared. */
+ return grid->copyGridReplacingTransform(grid_transform);
+}
+
openvdb::GridBase::ConstPtr BKE_volume_grid_openvdb_for_metadata(const VolumeGrid *grid)
{
return grid->grid();