[Bf-blender-cvs] [c8c64d4081f] geometry-nodes-level-set-nodes: Make sure non-procedural volumes are loaded, add debug timers

Hans Goudey noreply at git.blender.org
Fri Aug 13 22:09:29 CEST 2021


Commit: c8c64d4081f7649bdc2b2dab98415db88ccda07e
Author: Hans Goudey
Date:   Wed Aug 11 09:20:10 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rBc8c64d4081f7649bdc2b2dab98415db88ccda07e

Make sure non-procedural volumes are loaded, add debug timers

===================================================================

M	source/blender/modifiers/intern/MOD_mesh_to_volume.cc
M	source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc
M	source/blender/nodes/geometry/nodes/node_geo_level_set_filter.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_to_level_set.cc
M	source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
M	source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
index c9030f1969d..774249a794a 100644
--- a/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
+++ b/source/blender/modifiers/intern/MOD_mesh_to_volume.cc
@@ -49,6 +49,7 @@
 #include "BLI_float4x4.hh"
 #include "BLI_index_range.hh"
 #include "BLI_span.hh"
+#include "BLI_timeit.hh"
 
 #include "RNA_access.h"
 
@@ -222,6 +223,9 @@ static Volume *mesh_to_volume(ModifierData *md,
   if (mesh == nullptr) {
     return input_volume;
   }
+
+  SCOPED_TIMER(__func__);
+
   BKE_mesh_wrapper_ensure_mdata(mesh);
 
   const float4x4 mesh_to_own_object_space_transform = float4x4(ctx->object->imat) *
diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc
index 8fe5ce2baa0..4ca59d691c5 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc
@@ -25,6 +25,8 @@
 #include "UI_interface.h"
 #include "UI_resources.h"
 
+#include "DEG_depsgraph_query.h"
+
 #include "node_geometry_util.hh"
 
 static bNodeSocketTemplate geo_node_level_set_boolean_in[] = {
@@ -134,6 +136,8 @@ static void geo_node_level_set_boolean_exec(GeoNodeExecParams params)
       *(const NodeGeometryLevelSetBoolean *)params.node().storage;
   const GeometryNodeBooleanOperation operation = (GeometryNodeBooleanOperation)storage.operation;
 
+  SCOPED_TIMER(__func__);
+
   Volume *volume_a = geometry_set_a.get_volume_for_write();
   const Volume *volume_b = geometry_set_b.get_volume_for_read();
   if (volume_a == nullptr || volume_b == nullptr) {
@@ -141,6 +145,10 @@ static void geo_node_level_set_boolean_exec(GeoNodeExecParams params)
     return;
   }
 
+  const Main *bmain = DEG_get_bmain(params.depsgraph());
+  BKE_volume_load(volume_a, bmain);
+  BKE_volume_load(volume_b, bmain);
+
   level_set_boolean(*volume_a, *volume_b, operation, params);
 #else
   params.error_message_add(NodeWarningType::Error,
diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_filter.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_filter.cc
index 535d023636c..9740b1d3ac9 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_level_set_filter.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_filter.cc
@@ -21,12 +21,11 @@
 
 #include "BKE_volume.h"
 
-#include "DNA_mesh_types.h"
-#include "DNA_meshdata_types.h"
-
 #include "UI_interface.h"
 #include "UI_resources.h"
 
+#include "DEG_depsgraph_query.h"
+
 #include "node_geometry_util.hh"
 
 static bNodeSocketTemplate geo_node_level_set_filter_in[] = {
@@ -149,6 +148,9 @@ static void geo_node_level_set_filter_exec(GeoNodeExecParams params)
     return;
   }
 
+  const Main *bmain = DEG_get_bmain(params.depsgraph());
+  BKE_volume_load(volume, bmain);
+
   const NodeGeometryLevelSetFilter &data =
       *(const NodeGeometryLevelSetFilter *)params.node().storage;
   const GeometryNodeFilterOperation operation = (GeometryNodeFilterOperation)data.operation;
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_level_set.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_level_set.cc
index 17930904791..dbf7d8e7434 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_to_level_set.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_to_level_set.cc
@@ -94,9 +94,12 @@ static openvdb::FloatGrid::Ptr meshes_to_level_set_grid(
 
   // openvdb::math::Transform::Ptr transform = openvdb::math::Transform::createLinearTransform(
   //     voxel_size);
-  openvdb::FloatGrid::Ptr grid = openvdb::tools::meshToLevelSet<openvdb::FloatGrid>(
-      {}, positions, triangles, 1.0f);
-  grid->transform().postScale(voxel_size);
+  openvdb::FloatGrid::Ptr grid;
+  {
+    SCOPED_TIMER("  mesh_to_level_set_only_openvdb");
+    grid = openvdb::tools::meshToLevelSet<openvdb::FloatGrid>({}, positions, triangles);
+    grid->transform().postScale(voxel_size);
+  }
 
   return grid;
 }
@@ -121,6 +124,8 @@ static void geo_node_mesh_to_level_set_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Mesh");
 
+  SCOPED_TIMER(__func__);
+
   Vector<GeometryInstanceGroup> set_groups;
   bke::geometry_set_gather_instances(geometry_set, set_groups);
   if (set_groups.is_empty()) {
@@ -136,6 +141,11 @@ static void geo_node_mesh_to_level_set_exec(GeoNodeExecParams params)
     }
   }
 
+  if (set_groups.is_empty()) {
+    params.set_output("Level Set", GeometrySet());
+    return;
+  }
+
   GeometrySet geometry_set_out;
 #ifdef WITH_OPENVDB
   const float voxel_size = params.get_input<float>("Voxel Size");
diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
index 91e268392dc..e920efffb27 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -30,7 +30,6 @@
 
 static bNodeSocketTemplate geo_node_points_to_volume_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
-    {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
     {SOCK_FLOAT, N_("Voxel Size"), 0.3f, 0.0f, 0.0f, 0.0f, 0.01f, FLT_MAX, PROP_DISTANCE},
     {SOCK_FLOAT, N_("Voxel Amount"), 64.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
     {SOCK_STRING, N_("Radius")},
@@ -112,8 +111,7 @@ struct ParticleList {
 }  // namespace
 
 static openvdb::FloatGrid::Ptr generate_volume_from_points(const Span<float3> positions,
-                                                           const Span<float> radii,
-                                                           const float density)
+                                                           const Span<float> radii)
 {
   /* Create a new grid that will be filled. #ParticlesToLevelSet requires the background value to
    * be positive. It will be set to zero later on. */
@@ -128,15 +126,6 @@ static openvdb::FloatGrid::Ptr generate_volume_from_points(const Span<float3> po
   op.rasterizeSpheres(particles);
   op.finalize();
 
-  /* Convert the level set to a fog volume. This also sets the background value to zero. Inside the
-   * fog there will be a density of 1. */
-  openvdb::tools::sdfToFogVolume(*new_grid);
-
-  /* Take the desired density into account. */
-  openvdb::tools::foreach (new_grid->beginValueOn(),
-                           [&](const openvdb::FloatGrid::ValueOnIter &iter) {
-                             iter.modifyValue([&](float &value) { value *= density; });
-                           });
   return new_grid;
 }
 
@@ -233,9 +222,8 @@ static void initialize_volume_component_from_points(const GeometrySet &geometry_
   openvdb::FloatGrid::Ptr density_grid = openvdb::gridPtrCast<openvdb::FloatGrid>(
       BKE_volume_grid_openvdb_for_write(volume, c_density_grid));
 
-  const float density = params.get_input<float>("Density");
   convert_to_grid_index_space(voxel_size, positions, radii);
-  openvdb::FloatGrid::Ptr new_grid = generate_volume_from_points(positions, radii, density);
+  openvdb::FloatGrid::Ptr new_grid = generate_volume_from_points(positions, radii);
   /* This merge is cheap, because the #density_grid is empty. */
   density_grid->merge(*new_grid);
   density_grid->transform().postScale(voxel_size);
@@ -267,7 +255,7 @@ void register_node_type_geo_points_to_volume()
   static bNodeType ntype;
 
   geo_node_type_base(
-      &ntype, GEO_NODE_POINTS_TO_VOLUME, "Points to Volume", NODE_CLASS_GEOMETRY, 0);
+      &ntype, GEO_NODE_POINTS_TO_VOLUME, "Points to Level Set", NODE_CLASS_GEOMETRY, 0);
   node_type_socket_templates(&ntype, geo_node_points_to_volume_in, geo_node_points_to_volume_out);
   node_type_storage(&ntype,
                     "NodeGeometryPointsToVolume",
diff --git a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
index 4c1151bf6c2..25be548c035 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_volume_to_mesh.cc
@@ -94,6 +94,8 @@ static void create_mesh_from_volume(GeometrySet &geometry_set_in,
     return;
   }
 
+  SCOPED_TIMER(__func__);
+
   const NodeGeometryVolumeToMesh &storage =
       *(const NodeGeometryVolumeToMesh *)params.node().storage;



More information about the Bf-blender-cvs mailing list