[Bf-blender-cvs] [be0417d6901] master: Cleanup: Move curve length field input to blenkernel

Hans Goudey noreply at git.blender.org
Thu May 5 12:41:51 CEST 2022


Commit: be0417d690183726b0364088cc261578ad813637
Author: Hans Goudey
Date:   Thu May 5 12:41:36 2022 +0200
Branches: master
https://developer.blender.org/rBbe0417d690183726b0364088cc261578ad813637

Cleanup: Move curve length field input to blenkernel

To use in the geometry module when the resample curves code
is moved there (T97448).

===================================================================

M	source/blender/blenkernel/BKE_geometry_fields.hh
M	source/blender/blenkernel/intern/geometry_component_curves.cc
M	source/blender/nodes/geometry/node_geometry_util.hh
M	source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
M	source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_geometry_fields.hh b/source/blender/blenkernel/BKE_geometry_fields.hh
index 36b382feb5f..9c86ab262ef 100644
--- a/source/blender/blenkernel/BKE_geometry_fields.hh
+++ b/source/blender/blenkernel/BKE_geometry_fields.hh
@@ -162,4 +162,14 @@ class AnonymousAttributeFieldInput : public GeometryFieldInput {
   bool is_equal_to(const fn::FieldNode &other) const override;
 };
 
+class CurveLengthFieldInput final : public GeometryFieldInput {
+ public:
+  CurveLengthFieldInput();
+  GVArray get_varray_for_context(const GeometryComponent &component,
+                                 AttributeDomain domain,
+                                 IndexMask mask) const final;
+  uint64_t hash() const override;
+  bool is_equal_to(const fn::FieldNode &other) const override;
+};
+
 }  // namespace blender::bke
diff --git a/source/blender/blenkernel/intern/geometry_component_curves.cc b/source/blender/blenkernel/intern/geometry_component_curves.cc
index bc9bba3ee2f..7c4a7db6462 100644
--- a/source/blender/blenkernel/intern/geometry_component_curves.cc
+++ b/source/blender/blenkernel/intern/geometry_component_curves.cc
@@ -237,6 +237,69 @@ VArray<float3> curve_normals_varray(const CurveComponent &component, const Attri
   return nullptr;
 }
 
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Curve Length Field Input
+ * \{ */
+
+static VArray<float> construct_curve_length_gvarray(const CurveComponent &component,
+                                                    const AttributeDomain domain)
+{
+  if (!component.has_curves()) {
+    return {};
+  }
+  const Curves &curves_id = *component.get_for_read();
+  const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
+
+  curves.ensure_evaluated_lengths();
+
+  VArray<bool> cyclic = curves.cyclic();
+  VArray<float> lengths = VArray<float>::ForFunc(
+      curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t index) {
+        return curves.evaluated_length_total_for_curve(index, cyclic[index]);
+      });
+
+  if (domain == ATTR_DOMAIN_CURVE) {
+    return lengths;
+  }
+
+  if (domain == ATTR_DOMAIN_POINT) {
+    return component.attribute_try_adapt_domain<float>(
+        std::move(lengths), ATTR_DOMAIN_CURVE, ATTR_DOMAIN_POINT);
+  }
+
+  return {};
+}
+
+CurveLengthFieldInput::CurveLengthFieldInput()
+    : GeometryFieldInput(CPPType::get<float>(), "Spline Length node")
+{
+  category_ = Category::Generated;
+}
+
+GVArray CurveLengthFieldInput::get_varray_for_context(const GeometryComponent &component,
+                                                      const AttributeDomain domain,
+                                                      IndexMask UNUSED(mask)) const
+{
+  if (component.type() == GEO_COMPONENT_TYPE_CURVE) {
+    const CurveComponent &curve_component = static_cast<const CurveComponent &>(component);
+    return construct_curve_length_gvarray(curve_component, domain);
+  }
+  return {};
+}
+
+uint64_t CurveLengthFieldInput::hash() const
+{
+  /* Some random constant hash. */
+  return 3549623580;
+}
+
+bool CurveLengthFieldInput::is_equal_to(const fn::FieldNode &other) const
+{
+  return dynamic_cast<const CurveLengthFieldInput *>(&other) != nullptr;
+}
+
 }  // namespace blender::bke
 
 /** \} */
diff --git a/source/blender/nodes/geometry/node_geometry_util.hh b/source/blender/nodes/geometry/node_geometry_util.hh
index 0ed75bcfa9b..5b7211e44b4 100644
--- a/source/blender/nodes/geometry/node_geometry_util.hh
+++ b/source/blender/nodes/geometry/node_geometry_util.hh
@@ -81,14 +81,4 @@ void separate_geometry(GeometrySet &geometry_set,
 std::optional<CustomDataType> node_data_type_to_custom_data_type(eNodeSocketDatatype type);
 std::optional<CustomDataType> node_socket_to_custom_data_type(const bNodeSocket &socket);
 
-class CurveLengthFieldInput final : public GeometryFieldInput {
- public:
-  CurveLengthFieldInput();
-  GVArray get_varray_for_context(const GeometryComponent &component,
-                                 AttributeDomain domain,
-                                 IndexMask mask) const final;
-  uint64_t hash() const override;
-  bool is_equal_to(const fn::FieldNode &other) const override;
-};
-
 }  // namespace blender::nodes
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
index aec6320d881..471d6af560f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
@@ -535,7 +535,7 @@ static Field<int> get_curve_count_field(GeoNodeExecParams params,
 
     auto get_count_op = std::make_shared<FieldOperation>(
         FieldOperation(get_count_fn,
-                       {Field<float>(std::make_shared<CurveLengthFieldInput>()),
+                       {Field<float>(std::make_shared<bke::CurveLengthFieldInput>()),
                         params.extract_input<Field<float>>("Length")}));
 
     return Field<int>(std::move(get_count_op));
diff --git a/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc b/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc
index db1b0d5a2f8..84d773ff8eb 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_input_spline_length.cc
@@ -4,71 +4,6 @@
 
 #include "BKE_curves.hh"
 
-namespace blender::nodes {
-
-/* --------------------------------------------------------------------
- * Spline Length
- */
-
-static VArray<float> construct_curve_length_gvarray(const CurveComponent &component,
-                                                    const AttributeDomain domain)
-{
-  if (!component.has_curves()) {
-    return {};
-  }
-  const Curves &curves_id = *component.get_for_read();
-  const bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
-
-  curves.ensure_evaluated_lengths();
-
-  VArray<bool> cyclic = curves.cyclic();
-  VArray<float> lengths = VArray<float>::ForFunc(
-      curves.curves_num(), [&curves, cyclic = std::move(cyclic)](int64_t index) {
-        return curves.evaluated_length_total_for_curve(index, cyclic[index]);
-      });
-
-  if (domain == ATTR_DOMAIN_CURVE) {
-    return lengths;
-  }
-
-  if (domain == ATTR_DOMAIN_POINT) {
-    return component.attribute_try_adapt_domain<float>(
-        std::move(lengths), ATTR_DOMAIN_CURVE, ATTR_DOMAIN_POINT);
-  }
-
-  return {};
-}
-
-CurveLengthFieldInput::CurveLengthFieldInput()
-    : GeometryFieldInput(CPPType::get<float>(), "Spline Length node")
-{
-  category_ = Category::Generated;
-}
-
-GVArray CurveLengthFieldInput::get_varray_for_context(const GeometryComponent &component,
-                                                      const AttributeDomain domain,
-                                                      IndexMask UNUSED(mask)) const
-{
-  if (component.type() == GEO_COMPONENT_TYPE_CURVE) {
-    const CurveComponent &curve_component = static_cast<const CurveComponent &>(component);
-    return construct_curve_length_gvarray(curve_component, domain);
-  }
-  return {};
-}
-
-uint64_t CurveLengthFieldInput::hash() const
-{
-  /* Some random constant hash. */
-  return 3549623580;
-}
-
-bool CurveLengthFieldInput::is_equal_to(const fn::FieldNode &other) const
-{
-  return dynamic_cast<const CurveLengthFieldInput *>(&other) != nullptr;
-}
-
-}  // namespace blender::nodes
-
 namespace blender::nodes::node_geo_input_spline_length_cc {
 
 static void node_declare(NodeDeclarationBuilder &b)
@@ -136,7 +71,7 @@ class SplineCountFieldInput final : public GeometryFieldInput {
 
 static void node_geo_exec(GeoNodeExecParams params)
 {
-  Field<float> spline_length_field{std::make_shared<CurveLengthFieldInput>()};
+  Field<float> spline_length_field{std::make_shared<bke::CurveLengthFieldInput>()};
   Field<int> spline_count_field{std::make_shared<SplineCountFieldInput>()};
 
   params.set_output("Length", std::move(spline_length_field));



More information about the Bf-blender-cvs mailing list