From 0e2a1ef13223925a874d6dbb139e0ce9f4eecab5 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 8 Apr 2021 13:28:35 -0500 Subject: 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 --- source/blender/blenkernel/intern/volume.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'source/blender/blenkernel/intern/volume.cc') 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 # include @@ -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(); -- cgit v1.2.3