[Bf-blender-cvs] [88d295f9526] master: Geometry Nodes: Updated Subdivision Surface Node
Jarrett Johnson
noreply at git.blender.org
Fri Oct 15 22:12:59 CEST 2021
Commit: 88d295f95260f063d65e23460d36eb13bb884fa8
Author: Jarrett Johnson
Date: Fri Oct 15 15:12:04 2021 -0500
Branches: master
https://developer.blender.org/rB88d295f95260f063d65e23460d36eb13bb884fa8
Geometry Nodes: Updated Subdivision Surface Node
Replaces the old Subdivision Surface Node.
Changes:
- Removes implicit instance realization, instead the node runs once
per unique instance.
- "Use Creases" becomes a crease field input applied to edges.
The values are clamped between zero and one.
Addresses T91763
Differential Revision: https://developer.blender.org/D12830
===================================================================
M release/scripts/startup/nodeitems_builtins.py
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/node.cc
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/legacy/node_geo_subdivision_surface.cc
A source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
===================================================================
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 2d03fbddd48..99be554184b 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -148,6 +148,7 @@ def mesh_node_items(context):
yield NodeItem("GeometryNodeMeshToPoints")
yield NodeItem("GeometryNodeSplitEdges")
yield NodeItem("GeometryNodeSubdivideMesh")
+ yield NodeItem("GeometryNodeSubdivisionSurface")
yield NodeItem("GeometryNodeTriangulate")
yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
yield NodeItem("GeometryNodeInputShadeSmooth")
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index a68edfca2d3..6dcb35de3af 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1538,6 +1538,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define GEO_NODE_SPLIT_EDGES 1123
#define GEO_NODE_MESH_TO_CURVE 1124
#define GEO_NODE_TRANSFER_ATTRIBUTE 1125
+#define GEO_NODE_SUBDIVISION_SURFACE 1126
/** \} */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 491e29b8c4d..52ba6d1ccb8 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5726,6 +5726,7 @@ static void registerGeometryNodes()
register_node_type_geo_legacy_select_by_handle_type();
register_node_type_geo_legacy_curve_subdivide();
register_node_type_geo_legacy_edge_split();
+ register_node_type_geo_legacy_subdivision_surface();
register_node_type_geo_align_rotation_to_vector();
register_node_type_geo_attribute_capture();
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 5a8430752ca..a202d247e60 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -278,6 +278,7 @@ set(SRC
geometry/nodes/node_geo_triangulate.cc
geometry/nodes/node_geo_viewer.cc
geometry/nodes/node_geo_volume_to_mesh.cc
+ geometry/nodes/node_geo_subdivision_surface.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 d3cb9beef26..94fed3c3975 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -43,6 +43,7 @@ void register_node_type_geo_legacy_curve_reverse(void);
void register_node_type_geo_legacy_select_by_handle_type(void);
void register_node_type_geo_legacy_curve_subdivide(void);
void register_node_type_geo_legacy_edge_split(void);
+void register_node_type_geo_legacy_subdivision_surface(void);
void register_node_type_geo_align_rotation_to_vector(void);
void register_node_type_geo_attribute_capture(void);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 9022e56c910..827a12ff812 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -399,6 +399,7 @@ DefNode(GeometryNode, GEO_NODE_SET_SPLINE_CYCLIC, 0, "SET_SPLINE_CYCLIC", SetSpl
DefNode(GeometryNode, GEO_NODE_SET_SPLINE_RESOLUTION, 0, "SET_SPLINE_RESOLUTION", SetSplineResolution, "Set Spline Resolution", "")
DefNode(GeometryNode, GEO_NODE_STRING_JOIN, 0, "STRING_JOIN", StringJoin, "Join Strings", "")
DefNode(GeometryNode, GEO_NODE_STRING_TO_CURVES, def_geo_string_to_curves, "STRING_TO_CURVES", StringToCurves, "String to Curves", "")
+DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE, def_geo_subdivision_surface, "SUBDIVISION_SURFACE", SubdivisionSurface, "Subdivision Surface", "")
DefNode(GeometryNode, GEO_NODE_SWITCH, def_geo_switch, "SWITCH", Switch, "Switch", "")
DefNode(GeometryNode, GEO_NODE_TRANSFER_ATTRIBUTE, def_geo_transfer_attribute, "ATTRIBUTE_TRANSFER", AttributeTransfer, "Transfer Attribute", "")
DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform", "")
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc
index 07d3f89bdb7..101c915eb77 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc
+++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc
@@ -128,7 +128,7 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params)
} // namespace blender::nodes
-void register_node_type_geo_subdivision_surface()
+void register_node_type_geo_legacy_subdivision_surface()
{
static bNodeType ntype;
diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
similarity index 59%
copy from source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc
copy to source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
index 07d3f89bdb7..d37f968caa8 100644
--- a/source/blender/nodes/geometry/nodes/legacy/node_geo_subdivision_surface.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_subdivision_surface.cc
@@ -14,13 +14,17 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+
#include "BKE_mesh.h"
#include "BKE_subdiv.h"
#include "BKE_subdiv_mesh.h"
-#include "DNA_modifier_types.h"
#include "UI_interface.h"
#include "UI_resources.h"
+
#include "node_geometry_util.hh"
namespace blender::nodes {
@@ -29,7 +33,12 @@ static void geo_node_subdivision_surface_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::Int>("Level").default_value(1).min(0).max(6);
- b.add_input<decl::Bool>("Use Creases");
+ b.add_input<decl::Float>("Crease")
+ .default_value(0.0f)
+ .min(0.0f)
+ .max(1.0f)
+ .supports_field()
+ .subtype(PROP_FACTOR);
b.add_output<decl::Geometry>("Geometry");
}
@@ -60,17 +69,8 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
- geometry_set = geometry_set_realize_instances(geometry_set);
-
- if (!geometry_set.has_mesh()) {
- params.set_output("Geometry", geometry_set);
- return;
- }
+ Field<float> crease_field = params.extract_input<Field<float>>("Crease");
-#ifndef WITH_OPENSUBDIV
- params.error_message_add(NodeWarningType::Error,
- TIP_("Disabled, Blender was compiled without OpenSubdiv"));
-#else
const NodeGeometrySubdivisionSurface &storage =
*(const NodeGeometrySubdivisionSurface *)params.node().storage;
const int uv_smooth = storage.uv_smooth;
@@ -83,46 +83,68 @@ static void geo_node_subdivision_surface_exec(GeoNodeExecParams params)
return;
}
- const bool use_crease = params.extract_input<bool>("Use Creases");
- const Mesh *mesh_in = geometry_set.get_mesh_for_read();
-
- /* Initialize mesh settings. */
- SubdivToMeshSettings mesh_settings;
- mesh_settings.resolution = (1 << subdiv_level) + 1;
- mesh_settings.use_optimal_display = false;
-
- /* Initialize subdivision settings. */
- SubdivSettings subdiv_settings;
- subdiv_settings.is_simple = false;
- subdiv_settings.is_adaptive = false;
- subdiv_settings.use_creases = use_crease;
- subdiv_settings.level = subdiv_level;
-
- subdiv_settings.vtx_boundary_interpolation = BKE_subdiv_vtx_boundary_interpolation_from_subsurf(
- boundary_smooth);
- subdiv_settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(
- uv_smooth);
-
- /* Apply subdivision to mesh. */
- Subdiv *subdiv = BKE_subdiv_update_from_mesh(nullptr, &subdiv_settings, mesh_in);
-
- /* In case of bad topology, skip to input mesh. */
- if (subdiv == nullptr) {
- params.set_output("Geometry", std::move(geometry_set));
- return;
- }
-
- Mesh *mesh_out = BKE_subdiv_to_mesh(subdiv, &mesh_settings, mesh_in);
- BKE_mesh_normals_tag_dirty(mesh_out);
-
- MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
- mesh_component.replace(mesh_out);
-
- // BKE_subdiv_stats_print(&subdiv->stats);
- BKE_subdiv_free(subdiv);
-
+#ifndef WITH_OPENSUBDIV
+ params.error_message_add(NodeWarningType::Error,
+ TIP_("Disabled, Blender was compiled without OpenSubdiv"));
+#else
+ geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
+ if (!geometry_set.has_mesh()) {
+ return;
+ }
+
+ MeshComponent &mesh_component = geometry_set.get_component_for_write<MeshComponent>();
+ AttributeDomain domain = ATTR_DOMAIN_EDGE;
+ GeometryComponentFieldContext field_context{mesh_component, domain};
+ const int domain_size = mesh_component.attribute_domain_size(domain);
+
+ FieldEvaluator evaluator(field_context, domain_size);
+ evaluator.add(crease_field);
+ evaluator.evaluate();
+ const VArray<float> &creases = evaluator.get_evaluated<float>(0);
+
+ OutputAttribute_Typed<float> crease = mesh_component.attribute_try_get_for_output_only<float>(
+ "crease", domain);
+ MutableSpan<float> crease_span = crease.as_span();
+ for (auto i : creases.index_range()) {
+ crease_span[i] = std::clamp(creases[i], 0.0f, 1.0f);
+ }
+ crease.save();
+
+ /* Initialize mesh settings. */
+ SubdivToMeshSettings mesh_settings;
+ mesh_settings.resolution = (1 << subdiv_level) + 1;
+ mesh_settings.use_optimal_display = false;
+
+ /* Initialize subdivision settings. */
+ SubdivSettings subdiv_settings;
+ subdiv_settings.is_simple = false;
+ subdiv_settings.is_adaptive = false;
+ subdiv_settings.use_creases = !(creases.is_single() && creases.get_internal_single() == 0.0f);
+ subdiv_settings.level = subdiv_level;
+
+ subdiv_settings.vtx_boundary_interpolation =
+ BKE_subdiv_vtx_boundary_interpolation_from_subsurf(boundary_smooth);
+ subdiv_settings.fvar_linear_interpolation = BKE_subdiv_fvar_interpolation_from_uv_smooth(
+ uv_smooth);
+
+ Mesh *mesh_in = mesh_component.get_for_write();
+
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list