[Bf-blender-cvs] [e537bb57a35] geometry-nodes-level-set-nodes: Add volume sample node and level set to mask node
Hans Goudey
noreply at git.blender.org
Sat Aug 14 03:30:00 CEST 2021
Commit: e537bb57a358031ec8a2cdbe134c3f6e224522d8
Author: Hans Goudey
Date: Fri Aug 13 20:29:47 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rBe537bb57a358031ec8a2cdbe134c3f6e224522d8
Add volume sample node and level set to mask node
===================================================================
M release/scripts/startup/nodeitems_builtins.py
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/BKE_volume.h
M source/blender/blenkernel/intern/node.cc
M source/blender/blenkernel/intern/volume.cc
M source/blender/nodes/CMakeLists.txt
M source/blender/nodes/NOD_geometry.h
M source/blender/nodes/NOD_static_types.h
A source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
M source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
A source/blender/nodes/geometry/nodes/node_geo_volume_sample.cc
===================================================================
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index ed2c2c1cab7..c92b1dd4bc5 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -600,7 +600,9 @@ geometry_node_categories = [
NodeItem("GeometryNodeLevelSetBoolean"),
NodeItem("GeometryNodeLevelSetFilter"),
NodeItem("GeometryNodeLevelSetToFogVolume"),
+ NodeItem("GeometryNodeLevelSetToMask"),
NodeItem("GeometryNodeLevelSetMorph"),
+ NodeItem("GeometryNodeVolumeSample"),
]),
GeometryNodeCategory("GEO_PRIMITIVES_VOLUME", "Volume Primitives", items=[
NodeItem("GeometryNodeLevelSetSphere"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index abca5ea6412..f2320c85dbb 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1484,6 +1484,8 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE 1079
#define GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC 1080
#define GEO_NODE_LEVEL_SET_MORPH 1081
+#define GEO_NODE_VOLUME_SAMPLE 1082
+#define GEO_NODE_LEVEL_SET_TO_MASK 1083
/** \} */
diff --git a/source/blender/blenkernel/BKE_volume.h b/source/blender/blenkernel/BKE_volume.h
index 10e023c201f..d9965c88f76 100644
--- a/source/blender/blenkernel/BKE_volume.h
+++ b/source/blender/blenkernel/BKE_volume.h
@@ -171,7 +171,7 @@ bool BKE_volume_min_max(const Volume *volume, blender::float3 &r_min, blender::f
VolumeGrid *BKE_volume_grid_add_vdb(Volume *volume,
blender::StringRef name,
- openvdb::FloatGrid::Ptr vdb_grid);
+ openvdb::GridBase::Ptr vdb_grid);
bool BKE_volume_grid_bounds(openvdb::GridBase::ConstPtr grid,
blender::float3 &r_min,
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c21c23466b3..ef1603e83fb 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5166,6 +5166,7 @@ static void registerGeometryNodes()
register_node_type_geo_level_set_primitive_platonic();
register_node_type_geo_level_set_primitive_sphere();
register_node_type_geo_level_set_to_fog_volume();
+ register_node_type_geo_level_set_to_mask();
register_node_type_geo_material_assign();
register_node_type_geo_material_replace();
register_node_type_geo_mesh_primitive_circle();
@@ -5197,6 +5198,7 @@ static void registerGeometryNodes()
register_node_type_geo_transform();
register_node_type_geo_triangulate();
register_node_type_geo_viewer();
+ register_node_type_geo_volume_sample();
register_node_type_geo_volume_to_mesh();
}
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index e787a9a52ce..f576dd381dc 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -1470,7 +1470,7 @@ VolumeGrid *BKE_volume_grid_add(Volume *volume, const char *name, VolumeGridType
#ifdef WITH_OPENVDB
VolumeGrid *BKE_volume_grid_add_vdb(Volume *volume,
const StringRef name,
- openvdb::FloatGrid::Ptr vdb_grid)
+ openvdb::GridBase::Ptr vdb_grid)
{
VolumeGridVector &grids = *volume->runtime.grids;
BLI_assert(BKE_volume_grid_find_for_read(volume, name.data()) == nullptr);
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 2a8ce01bf80..8050007bec0 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -193,6 +193,7 @@ set(SRC
geometry/nodes/node_geo_level_set_primitive_platonic.cc
geometry/nodes/node_geo_level_set_primitive_sphere.cc
geometry/nodes/node_geo_level_set_to_fog_volume.cc
+ geometry/nodes/node_geo_level_set_to_mask.cc
geometry/nodes/node_geo_material_assign.cc
geometry/nodes/node_geo_material_replace.cc
geometry/nodes/node_geo_mesh_primitive_circle.cc
@@ -222,6 +223,7 @@ set(SRC
geometry/nodes/node_geo_transform.cc
geometry/nodes/node_geo_triangulate.cc
geometry/nodes/node_geo_viewer.cc
+ geometry/nodes/node_geo_volume_sample.cc
geometry/nodes/node_geo_volume_to_mesh.cc
geometry/node_geometry_exec.cc
geometry/node_geometry_tree.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index df653c21b2d..9b34d93fa24 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -79,6 +79,7 @@ void register_node_type_geo_level_set_morph(void);
void register_node_type_geo_level_set_primitive_platonic(void);
void register_node_type_geo_level_set_primitive_sphere(void);
void register_node_type_geo_level_set_to_fog_volume(void);
+void register_node_type_geo_level_set_to_mask(void);
void register_node_type_geo_material_assign(void);
void register_node_type_geo_material_replace(void);
void register_node_type_geo_mesh_primitive_circle(void);
@@ -111,6 +112,7 @@ void register_node_type_geo_transform(void);
void register_node_type_geo_triangulate(void);
void register_node_type_geo_viewer(void);
void register_node_type_geo_volume_to_mesh(void);
+void register_node_type_geo_volume_sample(void);
#ifdef __cplusplus
}
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index bdf60d6aa21..b77f069ffad 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -320,6 +320,7 @@ DefNode(GeometryNode, GEO_NODE_LEVEL_SET_MORPH , def_geo_level_set_morph, "LEVEL
DefNode(GeometryNode, GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE , 0, "LEVEL_SET_PRIMITIVE_SPHERE", LevelSetSphere, "Level Set Sphere", "")
DefNode(GeometryNode, GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC , def_geo_level_set_primitive_platonic, "LEVEL_SET_PRIMITIVE_PLATONIC", LevelSetPlatonic, "Level Set Platonic", "")
DefNode(GeometryNode, GEO_NODE_LEVEL_SET_TO_FOG_VOLUME , 0, "LEVEL_SET_TO_FOG", LevelSetToFogVolume, "Level Set to Fog Volume", "")
+DefNode(GeometryNode, GEO_NODE_LEVEL_SET_TO_MASK , 0, "LEVEL_SET_TO_Mask", LevelSetToMask, "Level Set to Mask", "")
DefNode(GeometryNode, GEO_NODE_MATERIAL_ASSIGN, 0, "MATERIAL_ASSIGN", MaterialAssign, "Material Assign", "")
DefNode(GeometryNode, GEO_NODE_MATERIAL_REPLACE, 0, "MATERIAL_REPLACE", MaterialReplace, "Material Replace", "")
DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_CIRCLE, def_geo_mesh_circle, "MESH_PRIMITIVE_CIRCLE", MeshCircle, "Mesh Circle", "")
@@ -350,6 +351,7 @@ DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform"
DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
DefNode(GeometryNode, GEO_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "")
DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
+DefNode(GeometryNode, GEO_NODE_VOLUME_SAMPLE, 0, "VOLUME_SAMPLE", VolumeSample, "Sample Volume", "")
/* undefine macros */
#undef DefNode
diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
new file mode 100644
index 00000000000..0a88a021e16
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
@@ -0,0 +1,112 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef WITH_OPENVDB
+# include <openvdb/tools/LevelSetUtil.h>
+#endif
+
+#include "BKE_lib_id.h"
+#include "BKE_volume.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_to_mask_in[] = {
+ {SOCK_GEOMETRY, N_("Level Set")},
+ {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_level_set_to_mask_out[] = {
+ {SOCK_GEOMETRY, N_("Mask Volume")},
+ {-1, ""},
+};
+
+namespace blender::nodes {
+
+#ifdef WITH_OPENVDB
+
+static Volume *level_set_to_mask(const Volume &volume, const GeoNodeExecParams ¶ms)
+{
+ Volume *mask_volume = (Volume *)BKE_id_new_nomain(ID_VO, nullptr);
+ BKE_volume_init_grids(mask_volume);
+
+ const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(&volume, 0);
+ if (volume_grid == nullptr) {
+ params.error_message_add(NodeWarningType::Error, TIP_("Volume is empty"));
+ return mask_volume;
+ }
+
+ openvdb::GridBase::ConstPtr grid_base = BKE_volume_grid_openvdb_for_read(&volume, volume_grid);
+ if (grid_base->getGridClass() != openvdb::GridClass::GRID_LEVEL_SET) {
+ params.error_message_add(NodeWarningType::Error, TIP_("Volume is not a level set"));
+ }
+
+ openvdb::BoolGrid::Ptr mask_grid;
+ bke::volume::to_static_type(BKE_volume_grid_type(volume_grid), [&](auto dummy) {
+ using GridType = decltype(dummy);
+ if constexpr (std::is_same_v<GridType, openvdb::FloatGrid>) {
+ const GridType &grid = static_cast<const GridType &>(*grid_base);
+ mask_grid = openvdb::tools::sdfInteriorMask(grid);
+ }
+ });
+
+ BKE_volume_grid_add_vdb(mask_volume, "mask", std::move(mask_grid));
+
+ return mask_volume;
+}
+
+#endif /* WITH_OPENVDB */
+
+static void geo_node_level_set_to_mask_exec(GeoNodeExecParams params)
+{
+
+#ifdef WITH_OPENVDB
+ GeometrySet geometry_set = params.extract_input<GeometrySet
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list