[Bf-blender-cvs] [51e72e47039] geometry-nodes-curve-support: Geometry Nodes Curves: Cleanup

Hans Goudey noreply at git.blender.org
Fri Apr 16 06:54:03 CEST 2021


Commit: 51e72e470397d2b2cab880f8a61d082d27c26381
Author: Hans Goudey
Date:   Thu Apr 15 15:04:12 2021 -0500
Branches: geometry-nodes-curve-support
https://developer.blender.org/rB51e72e470397d2b2cab880f8a61d082d27c26381

Geometry Nodes Curves: Cleanup

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

M	source/blender/blenkernel/BKE_derived_curve.hh
M	source/blender/blenkernel/intern/derived_curve.cc
M	source/blender/blenkernel/intern/geometry_component_curve.cc
M	source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc

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

diff --git a/source/blender/blenkernel/BKE_derived_curve.hh b/source/blender/blenkernel/BKE_derived_curve.hh
index b2a7a311d3d..556a5276ac2 100644
--- a/source/blender/blenkernel/BKE_derived_curve.hh
+++ b/source/blender/blenkernel/BKE_derived_curve.hh
@@ -142,6 +142,9 @@ class Spline {
   virtual int resolution() const = 0;
   virtual void set_resolution(const int value) = 0;
 
+  // virtual void drop_front(const int index) = 0;
+  // virtual void drop_back(const int index) = 0;
+
   virtual void mark_cache_invalid();
   virtual int evaluated_points_size() const = 0;
   int evaluated_edges_size() const;
@@ -155,8 +158,6 @@ class Spline {
   /* TODO: I'm not sure this is the best abstraction here, maybe we want another cache. */
   float get_evaluated_point_radius(const int index) const;
 
-  void trim_lengths(const float start_length, const float end_length);
-
  protected:
   virtual void correct_end_tangents() const = 0;
   virtual void ensure_base_cache() const = 0;
@@ -186,6 +187,10 @@ class BezierSpline : public Spline {
   int size() const final;
   int resolution() const final;
   void set_resolution(const int value) final;
+
+  // void drop_front(const int index) final;
+  // void drop_back(const int index) final;
+
   int evaluated_points_size() const final;
 
  protected:
@@ -229,6 +234,10 @@ class NURBSpline : public Spline {
   int size() const final;
   int resolution() const final;
   void set_resolution(const int value) final;
+
+  // void drop_front(const int index) final;
+  // void drop_back(const int index) final;
+
   int evaluated_points_size() const final;
 
  protected:
@@ -262,6 +271,10 @@ class PolySpline : public Spline {
   int size() const final;
   int resolution() const final;
   void set_resolution(const int value) final;
+
+  // void drop_front(const int index) final;
+  // void drop_back(const int index) final;
+
   int evaluated_points_size() const final;
 
  protected:
diff --git a/source/blender/blenkernel/intern/derived_curve.cc b/source/blender/blenkernel/intern/derived_curve.cc
index 11fe05d2223..ba6b59ada19 100644
--- a/source/blender/blenkernel/intern/derived_curve.cc
+++ b/source/blender/blenkernel/intern/derived_curve.cc
@@ -529,25 +529,6 @@ float Spline::get_evaluated_point_radius(const int evaluated_index) const
   return interpf(next_radius, radius, factor);
 }
 
-void Spline::trim_lengths(const float start_length, const float end_length)
-{
-  Span<float> lengths = this->evaluated_lengths();
-
-  const float *lower = std::lower_bound(lengths.begin(), lengths.end(), start_length);
-  const float *upper = std::lower_bound(lengths.begin(), lengths.end(), end_length);
-
-  const int i_lower = lower - lengths.begin();
-  const int i_upper = upper - lengths.begin();
-
-  Span<PointMapping> mappings = this->evaluated_mappings();
-
-  const int i_control_lower = mappings[i_lower].control_point_index;
-  const int i_control_upper = mappings[i_upper].control_point_index;
-
-  // this->drop_front_control_points(i_control_upper);
-  // this->drop_back_control_points(this->size() - i_control_upper);
-}
-
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -633,6 +614,17 @@ int BezierSpline::evaluated_points_size() const
   return total_len;
 }
 
+// void BezierSpline::drop_front(const int count)
+// {
+
+//   this->mark_cache_invalid();
+// }
+
+// void BezierSpline::drop_back(const int count)
+// {
+//   this->control_points.this->mark_cache_invalid();
+// }
+
 /**
  * If the spline is not cyclic, the direction for the first and last points is just the
  * direction formed by the corresponding handles and control points. In the unlikely situation
diff --git a/source/blender/blenkernel/intern/geometry_component_curve.cc b/source/blender/blenkernel/intern/geometry_component_curve.cc
index 0a0cae65169..332e10cfcff 100644
--- a/source/blender/blenkernel/intern/geometry_component_curve.cc
+++ b/source/blender/blenkernel/intern/geometry_component_curve.cc
@@ -349,6 +349,7 @@ static void get_spline_radius_data(const Spline &spline, fn::GMutableSpan r_data
       r_span[i] = bezier_spline->control_points[i].radius;
     }
   }
+  /* TODO: Other spline types. */
 }
 
 static void get_spline_position_data(const Spline &spline, fn::GMutableSpan r_data)
@@ -359,6 +360,7 @@ static void get_spline_position_data(const Spline &spline, fn::GMutableSpan r_da
       r_span[i] = bezier_spline->control_points[i].position;
     }
   }
+  /* TODO: Other spline types. */
 }
 
 /**
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc
index 2d285c1134b..6b942347e8b 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_trim.cc
@@ -67,6 +67,31 @@ static void geo_node_curve_trim_update(bNodeTree *UNUSED(ntree), bNode *node)
 
 namespace blender::nodes {
 
+static void trim_spline(Spline &spline, const float length_start, const float length_end)
+{
+  BLI_assert(length_start <= length_end);
+
+  std::cout << "\n TRIM SPLINE \n";
+  std::cout << "Start length: " << length_start << "\n";
+  std::cout << "End length: " << length_end << "\n";
+  Span<float> lengths = spline.evaluated_lengths();
+  const float *lower = std::lower_bound(lengths.begin(), lengths.end(), length_start);
+  const float *upper = std::upper_bound(lengths.begin(), lengths.end(), length_end);
+  const int i_lower = lower - lengths.begin();
+  const int i_upper = upper - lengths.begin();
+  std::cout << "i_lower: " << i_lower << "\n";
+  std::cout << "i_upper: " << i_upper << "\n";
+  BLI_assert(i_lower <= i_upper);
+
+  Span<PointMapping> mappings = spline.evaluated_mappings();
+  const int i_control_lower = mappings[i_lower].control_point_index;
+  const int i_control_upper = mappings[i_upper].control_point_index;
+  std::cout << "i_control_lower: " << i_control_lower << "\n";
+  std::cout << "i_control_upper: " << i_control_upper << "\n";
+  BLI_assert(i_control_lower <= i_control_upper);
+
+}
+
 static void geo_node_curve_trim_exec(GeoNodeExecParams params)
 {
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
@@ -79,6 +104,7 @@ static void geo_node_curve_trim_exec(GeoNodeExecParams params)
 
   if (!geometry_set.has_curve()) {
     params.set_output("Geometry", geometry_set);
+    return;
   }
 
   DCurve &curve = *geometry_set.get_curve_for_write();
@@ -89,17 +115,17 @@ static void geo_node_curve_trim_exec(GeoNodeExecParams params)
       const float factor_end = params.extract_input<float>("End");
       for (SplinePtr &spline : curve.splines) {
         const float length = spline->evaluated_lengths().last();
-        const float length_start = factor_start * length;
-        const float length_end = factor_end * length;
-        spline->trim_lengths(length_start, length_end);
+        const float start = factor_start * length;
+        const float end = factor_end * length;
+        trim_spline(*spline, std::min(start, end), std::max(start, end));
       }
       break;
     }
     case GEO_NODE_CURVE_TRIM_LENGTH: {
-      const float length_start = params.extract_input<float>("Start_001");
-      const float length_end = params.extract_input<float>("End_001");
+      const float start = params.extract_input<float>("Start_001");
+      const float end = params.extract_input<float>("End_001");
       for (SplinePtr &spline : curve.splines) {
-        spline->trim_lengths(length_start, length_end);
+        trim_spline(*spline, std::min(start, end), std::max(start, end));
       }
       break;
     }



More information about the Bf-blender-cvs mailing list