diff options
author | Hans Goudey <h.goudey@me.com> | 2021-06-28 22:28:52 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-06-28 22:28:52 +0300 |
commit | a0c45a2d5416f780451a23830087a6e712d26ef1 (patch) | |
tree | 60933bec1cba120dbe5cdf8c5b266c46409f4b85 /source | |
parent | 790cb28766813c94733637e46a6527eaf9a04a6b (diff) |
Cleanup: Add function to create a CurveEval from a nurbs list
Sometimes the current spline list isn't part of the original curve, like
when using the deformed control points, etc. This will be helpful in
the curve modifier stack.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_spline.hh | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve_eval.cc | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/geometry_set_instances.cc | 2 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_vector.hh | 3 |
4 files changed, 15 insertions, 5 deletions
diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh index 0de9270bde1..1aac2e311e3 100644 --- a/source/blender/blenkernel/BKE_spline.hh +++ b/source/blender/blenkernel/BKE_spline.hh @@ -32,6 +32,7 @@ #include "BKE_attribute_math.hh" struct Curve; +struct ListBase; class Spline; using SplinePtr = std::unique_ptr<Spline>; @@ -546,4 +547,6 @@ struct CurveEval { void assert_valid_point_attributes() const; }; -std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve); +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &curve, + const ListBase &nurbs_list); +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve); diff --git a/source/blender/blenkernel/intern/curve_eval.cc b/source/blender/blenkernel/intern/curve_eval.cc index 0a6e4458a35..72ee2587c8a 100644 --- a/source/blender/blenkernel/intern/curve_eval.cc +++ b/source/blender/blenkernel/intern/curve_eval.cc @@ -257,9 +257,10 @@ static SplinePtr spline_from_dna_poly(const Nurb &nurb) return spline; } -std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve) +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve, + const ListBase &nurbs_list) { - Vector<const Nurb *> nurbs(*BKE_curve_nurbs_get(&const_cast<Curve &>(dna_curve))); + Vector<const Nurb *> nurbs(nurbs_list); std::unique_ptr<CurveEval> curve = std::make_unique<CurveEval>(); curve->resize(nurbs.size()); @@ -295,6 +296,11 @@ std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve) return curve; } +std::unique_ptr<CurveEval> curve_eval_from_dna_curve(const Curve &dna_curve) +{ + return curve_eval_from_dna_curve(dna_curve, *BKE_curve_nurbs_get_for_read(&dna_curve)); +} + /** * Check the invariants that curve control point attributes should always uphold, necessary * because attributes are stored on splines rather than in a flat array on the curve: diff --git a/source/blender/blenkernel/intern/geometry_set_instances.cc b/source/blender/blenkernel/intern/geometry_set_instances.cc index 3c50b966f04..01b51d552a9 100644 --- a/source/blender/blenkernel/intern/geometry_set_instances.cc +++ b/source/blender/blenkernel/intern/geometry_set_instances.cc @@ -56,7 +56,7 @@ static void add_curve_data_as_geometry_component(const Object &object, GeometryS { BLI_assert(object.type == OB_CURVE); if (object.data != nullptr) { - std::unique_ptr<CurveEval> curve = curve_eval_from_dna_curve(*(Curve *)object.data); + std::unique_ptr<CurveEval> curve = curve_eval_from_dna_curve(*(const Curve *)object.data); CurveComponent &curve_component = geometry_set.get_component_for_write<CurveComponent>(); curve_component.replace(curve.release(), GeometryOwnershipType::Owned); } diff --git a/source/blender/blenlib/BLI_vector.hh b/source/blender/blenlib/BLI_vector.hh index 5b88ad6fa7d..da02c4f4ae1 100644 --- a/source/blender/blenlib/BLI_vector.hh +++ b/source/blender/blenlib/BLI_vector.hh @@ -213,7 +213,8 @@ class Vector { * Example Usage: * Vector<ModifierData *> modifiers(ob->modifiers); */ - Vector(ListBase &values, Allocator allocator = {}) : Vector(NoExceptConstructor(), allocator) + Vector(const ListBase &values, Allocator allocator = {}) + : Vector(NoExceptConstructor(), allocator) { LISTBASE_FOREACH (T, value, &values) { this->append(value); |