[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