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.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user