[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