Commit: 990e0fd319467e015ee5c9cb394b24498e2b88d3 Author: Hans Goudey Date: Fri Aug 13 15:03:23 2021 -0500 Branches: geometry-nodes-level-set-nodes https://developer.blender.org/rB990e0fd319467e015ee5c9cb394b24498e2b88d3
Add level set morph node =================================================================== M release/scripts/startup/nodeitems_builtins.py M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/intern/node.cc M source/blender/makesdna/DNA_node_types.h M source/blender/makesrna/intern/rna_nodetree.c M source/blender/nodes/CMakeLists.txt M source/blender/nodes/NOD_geometry.h M source/blender/nodes/NOD_static_types.h M source/blender/nodes/geometry/nodes/node_geo_level_set_boolean.cc A source/blender/nodes/geometry/nodes/node_geo_level_set_morph.cc M source/blender/nodes/geometry/nodes/node_geo_level_set_primitive_sphere.cc =================================================================== diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 16c972d9fce..ed2c2c1cab7 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -600,6 +600,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeLevelSetBoolean"), NodeItem("GeometryNodeLevelSetFilter"), NodeItem("GeometryNodeLevelSetToFogVolume"), + NodeItem("GeometryNodeLevelSetMorph"), ]), 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 b82fa6b0972..abca5ea6412 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1483,6 +1483,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_LEVEL_SET_TO_FOG_VOLUME 1078 #define GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE 1079 #define GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC 1080 +#define GEO_NODE_LEVEL_SET_MORPH 1081 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 9634de28667..c21c23466b3 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -5162,6 +5162,7 @@ static void registerGeometryNodes() register_node_type_geo_join_geometry(); register_node_type_geo_level_set_boolean(); register_node_type_geo_level_set_filter(); + register_node_type_geo_level_set_morph(); 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(); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 6a3ed352fe0..81421c35831 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1312,6 +1312,13 @@ typedef struct NodeGeometryLevelSetBoolean { uint8_t operation; } NodeGeometryLevelSetBoolean; +typedef struct NodeGeometryLevelSetMorph { + /* GeometryNodeLevelSetSpacialScheme */ + uint8_t spatial_scheme; + /* GeometryNodeLevelSetTemporalScheme */ + uint8_t temporal_scheme; +} NodeGeometryLevelSetMorph; + typedef struct NodeGeometryLevelSetFilter { /* GeometryNodeFilterOperation */ uint8_t operation; @@ -2023,6 +2030,17 @@ typedef enum NodeGeometryPlatonicShape { GEO_NODE_PLATONIC_ICOSAHEDRON = 20, } NodeGeometryPlatonicShape; +typedef enum GeometryNodeLevelSetSpatialScheme { + GEO_NODE_LEVEL_SET_MORPH_SPATIAL_FIRST = 0, + GEO_NODE_LEVEL_SET_MORPH_SPATIAL_HJWENO5 = 1, +} GeometryNodeLevelSetSpatialScheme; + +typedef enum GeometryNodeLevelSetTemporalScheme { + GEO_NODE_LEVEL_SET_MORPH_SPATIAL_FORWARD_EULER = 0, + GEO_NODE_LEVEL_SET_MORPH_SPATIAL_2ND = 1, + GEO_NODE_LEVEL_SET_MORPH_SPATIAL_3RD = 2, +} GeometryNodeLevelSetTemporalScheme; + typedef enum GeometryNodeAttributeTransferMapMode { GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST_FACE_INTERPOLATED = 0, GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST = 1, diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 22283fa3d58..5013c4d5da0 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -9941,6 +9941,40 @@ static void def_geo_level_set_filter(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update"); } +static void def_geo_level_set_morph(StructRNA *srna) +{ + PropertyRNA *prop; + + static EnumPropertyItem spatial_scheme_items[] = { + {GEO_NODE_LEVEL_SET_MORPH_SPATIAL_FIRST, "FIRST", 0, "First", "1st-order biased gradient"}, + {GEO_NODE_LEVEL_SET_MORPH_SPATIAL_HJWENO5, + "HJWENO5", + 0, + "HJWENO5", + "5th-order HJ-WENO biased gradient"}, + {0, NULL, 0, NULL, NULL}, + }; + + static EnumPropertyItem temporal_scheme_items[] = { + {GEO_NODE_LEVEL_SET_MORPH_SPATIAL_FORWARD_EULER, "FORWARD_EULER", 0, "Forward Euler", ""}, + {GEO_NODE_LEVEL_SET_MORPH_SPATIAL_2ND, "2ND", 0, "Second Order", "2nd order Runge-Kutta"}, + {GEO_NODE_LEVEL_SET_MORPH_SPATIAL_3RD, "3RD", 0, "Third Order", "3rd order Runge-Kutta"}, + {0, NULL, 0, NULL, NULL}, + }; + + RNA_def_struct_sdna_from(srna, "NodeGeometryLevelSetMorph", "storage"); + + prop = RNA_def_property(srna, "spatial_scheme", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, spatial_scheme_items); + RNA_def_property_ui_text(prop, "Spatial Scheme", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); + + prop = RNA_def_property(srna, "temporal_scheme", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, temporal_scheme_items); + RNA_def_property_ui_text(prop, "Temporal Scheme", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + static void def_geo_level_set_primitive_platonic(StructRNA *srna) { PropertyRNA *prop; diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index 0f713295fff..2a8ce01bf80 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -189,6 +189,7 @@ set(SRC geometry/nodes/node_geo_join_geometry.cc geometry/nodes/node_geo_level_set_boolean.cc geometry/nodes/node_geo_level_set_filter.cc + geometry/nodes/node_geo_level_set_morph.cc 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 diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index dc7fe0e96f5..df653c21b2d 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -75,6 +75,7 @@ void register_node_type_geo_is_viewport(void); void register_node_type_geo_join_geometry(void); void register_node_type_geo_level_set_boolean(void); void register_node_type_geo_level_set_filter(void); +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); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index cfa436432b9..bdf60d6aa21 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -316,6 +316,7 @@ DefNode(GeometryNode, GEO_NODE_IS_VIEWPORT, 0, "IS_VIEWPORT", IsViewport, "Is Vi DefNode(GeometryNode, GEO_NODE_JOIN_GEOMETRY, 0, "JOIN_GEOMETRY", JoinGeometry, "Join Geometry", "") DefNode(GeometryNode, GEO_NODE_LEVEL_SET_BOOLEAN , def_geo_level_set_boolean, "LEVEL_SET_BOOLEAN", LevelSetBoolean, "Level Set Boolean", "") DefNode(GeometryNode, GEO_NODE_LEVEL_SET_FILTER , def_geo_level_set_filter, "LEVEL_SET_FILTER", LevelSetFilter, "Level Set Filter", "") +DefNode(GeometryNode, GEO_NODE_LEVEL_SET_MORPH , def_geo_level_set_morph, "LEVEL_SET_MORPH", LevelSetMorph, "Level Set Morph", "") 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", "") 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 4ca59d691c5..05ebb5fc362 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 @@ -140,10 +140,22 @@ static void geo_node_level_set_boolean_exec(GeoNodeExecParams params) 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) { - params.set_output("Level Set", std::move(geometry_set_a)); + if (volume_a == nullptr && volume_b == nullptr) { + params.set_output("Level Set", GeometrySet()); return; } + if (ELEM(operation, GEO_NODE_BOOLEAN_DIFFERENCE, GEO_NODE_BOOLEAN_UNION)) { + if (volume_a == nullptr) { + params.set_output("Level Set", std::move(geometry_set_b)); + return; + } + } + if (operation == GEO_NODE_BOOLEAN_UNION) { + if (volume_b == nullptr) { + params.set_output("Level Set", std::move(geometry_set_a)); + return; + } + } const Main *bmain = DEG_get_bmain(params.depsgraph()); BKE_volume_load(volume_a, bmain); diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_morph.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_morph.cc new file mode 100644 index 00000000000..5ba34cce7ec --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_morph.cc @@ -0,0 +1,213 @@ +/* + * 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/openvdb.h> +# include <openvdb/tools/GridTransformer.h> +# include <openvdb/tools/LevelSetMorph.h> +#endif + +#include "BKE_volume.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "DEG_depsgraph_query.h" + +#include "node_geometry_util.hh" + +st @@ 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