[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