[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