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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs