Splines: Function to copy spline settings without data

Often you need to copy a spline to do an operation, but don't want
to manually copy over all of the settings. I've already forgotten to
do it once anyway. These functions copy a spline's "settings" into a
new spline, but not the data. I tried to avoid duplicating any copying
so this is easier to extend in the future.

Differential Revision: https://developer.blender.org/D11463
This commit is contained in:
Hans Goudey 2021-06-02 09:11:35 -04:00
parent 5b176b66da
commit 21de669141
4 changed files with 38 additions and 5 deletions

View File

@ -101,15 +101,14 @@ class Spline {
Spline(const Type type) : type_(type)
{
}
Spline(Spline &other)
: normal_mode(other.normal_mode),
attributes(other.attributes),
type_(other.type_),
is_cyclic_(other.is_cyclic_)
Spline(Spline &other) : attributes(other.attributes), type_(other.type_)
{
copy_base_settings(other, *this);
}
virtual SplinePtr copy() const = 0;
/** Return a new spline with the same type and settings like "cyclic", but without any data. */
virtual SplinePtr copy_settings() const = 0;
Spline::Type type() const;
@ -183,6 +182,12 @@ class Spline {
protected:
virtual void correct_end_tangents() const = 0;
/** Copy settings stored in the base spline class. */
static void copy_base_settings(const Spline &src, Spline &dst)
{
dst.normal_mode = src.normal_mode;
dst.is_cyclic_ = src.is_cyclic_;
}
};
/**
@ -236,6 +241,7 @@ class BezierSpline final : public Spline {
public:
virtual SplinePtr copy() const final;
SplinePtr copy_settings() const final;
BezierSpline() : Spline(Type::Bezier)
{
}
@ -377,6 +383,7 @@ class NURBSpline final : public Spline {
public:
SplinePtr copy() const final;
SplinePtr copy_settings() const final;
NURBSpline() : Spline(Type::NURBS)
{
}
@ -444,6 +451,7 @@ class PolySpline final : public Spline {
public:
SplinePtr copy() const final;
SplinePtr copy_settings() const final;
PolySpline() : Spline(Type::Poly)
{
}

View File

@ -31,6 +31,14 @@ SplinePtr BezierSpline::copy() const
return std::make_unique<BezierSpline>(*this);
}
SplinePtr BezierSpline::copy_settings() const
{
std::unique_ptr<BezierSpline> copy = std::make_unique<BezierSpline>();
copy_base_settings(*this, *copy);
copy->resolution_ = resolution_;
return copy;
}
int BezierSpline::size() const
{
const int size = positions_.size();

View File

@ -32,6 +32,16 @@ SplinePtr NURBSpline::copy() const
return std::make_unique<NURBSpline>(*this);
}
SplinePtr NURBSpline::copy_settings() const
{
std::unique_ptr<NURBSpline> copy = std::make_unique<NURBSpline>();
copy_base_settings(*this, *copy);
copy->knots_mode = knots_mode;
copy->resolution_ = resolution_;
copy->order_ = order_;
return copy;
}
int NURBSpline::size() const
{
const int size = positions_.size();

View File

@ -28,6 +28,13 @@ SplinePtr PolySpline::copy() const
return std::make_unique<PolySpline>(*this);
}
SplinePtr PolySpline::copy_settings() const
{
std::unique_ptr<PolySpline> copy = std::make_unique<PolySpline>();
copy_base_settings(*this, *copy);
return copy;
}
int PolySpline::size() const
{
const int size = positions_.size();