[Bf-blender-cvs] [d84de15b467] temp-geometry-nodes-volume: initial volume transformation support
Jacques Lucke
noreply at git.blender.org
Mon Jan 18 16:36:46 CET 2021
Commit: d84de15b467b9953569dad1454d4d5247dd541a2
Author: Jacques Lucke
Date: Mon Jan 18 15:52:12 2021 +0100
Branches: temp-geometry-nodes-volume
https://developer.blender.org/rBd84de15b467b9953569dad1454d4d5247dd541a2
initial volume transformation support
===================================================================
M source/blender/nodes/CMakeLists.txt
M source/blender/nodes/geometry/nodes/node_geo_transform.cc
===================================================================
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index e9985cb0e13..b23959160f0 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -365,4 +365,18 @@ if(WITH_OPENSUBDIV)
add_definitions(-DWITH_OPENSUBDIV)
endif()
+if(WITH_OPENVDB)
+ list(APPEND INC
+ ../../../intern/openvdb
+ )
+ list(APPEND INC_SYS
+ ${OPENVDB_INCLUDE_DIRS}
+ )
+ list(APPEND LIB
+ bf_intern_openvdb
+ ${OPENVDB_LIBRARIES}
+ )
+ add_definitions(-DWITH_OPENVDB ${OPENVDB_DEFINITIONS})
+endif()
+
blender_add_lib(bf_nodes "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform.cc b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
index abfa603b584..bafd0e0fe84 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_transform.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
@@ -14,11 +14,15 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <openvdb/openvdb.h>
+
#include "BLI_math_matrix.h"
#include "DNA_pointcloud_types.h"
+#include "DNA_volume_types.h"
#include "BKE_mesh.h"
+#include "BKE_volume.h"
#include "node_geometry_util.hh"
@@ -108,6 +112,35 @@ static void transform_instances(InstancesComponent &instances,
}
}
+static void transform_volume(VolumeComponent &component,
+ const float3 translation,
+ const float3 rotation,
+ const float3 scale)
+{
+ Volume *volume = component.get_for_write();
+ if (volume == nullptr) {
+ return;
+ }
+
+ // BKE_volume_load(volume, bmain);
+
+ float matrix[4][4];
+ loc_eul_size_to_mat4(matrix, translation, rotation, scale);
+
+ openvdb::Mat4s vdb_matrix;
+ memcpy(vdb_matrix.asPointer(), matrix, sizeof(float[4][4]));
+ openvdb::Mat4d vdb_matrix_d{vdb_matrix};
+
+ const int num_grids = BKE_volume_num_grids(volume);
+ for (const int i : IndexRange(num_grids)) {
+ VolumeGrid *volume_grid = BKE_volume_grid_get(volume, i);
+
+ openvdb::GridBase::Ptr grid = BKE_volume_grid_openvdb_for_write(volume, volume_grid, false);
+ openvdb::math::Transform &grid_transform = grid->transform();
+ grid_transform.postMult(vdb_matrix_d);
+ }
+}
+
static void geo_node_transform_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
@@ -130,6 +163,11 @@ static void geo_node_transform_exec(GeoNodeExecParams params)
transform_instances(instances, translation, rotation, scale);
}
+ if (geometry_set.has<VolumeComponent>()) {
+ VolumeComponent &volume_component = geometry_set.get_component_for_write<VolumeComponent>();
+ transform_volume(volume_component, translation, rotation, scale);
+ }
+
params.set_output("Geometry", std::move(geometry_set));
}
} // namespace blender::nodes
More information about the Bf-blender-cvs
mailing list