diff --git a/src/riderConstraint.cpp b/src/riderConstraint.cpp index 7117f9d..e82ec64 100644 --- a/src/riderConstraint.cpp +++ b/src/riderConstraint.cpp @@ -380,7 +380,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) { // I can optimize things a lot more if we do everything at once // So, whatever plug is asked for, just compute it all MStatus status; - std::vector splines; + std::vector> splines; std::vector weights; std::vector splineLens; std::vector endParams; @@ -417,7 +417,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) { double endParam = endParamH.asDouble(); auto inSplineData = (TwistSplineData *)pd; - TwistSplineT *spline = inSplineData->getSpline(); + std::shared_ptr spline = inSplineData->getSharedSpline(); if (spline == nullptr) { inSpAH.next(); continue; @@ -533,7 +533,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) { bool twisted = splines.size() == 1; for (size_t sIdx = 0; sIdx spline = splines[sIdx]; if (spline == nullptr) continue; double mp = endParams[sIdx]; diff --git a/src/twistSpline.h b/src/twistSpline.h index 5f90d05..6139567 100644 --- a/src/twistSpline.h +++ b/src/twistSpline.h @@ -648,20 +648,24 @@ class TwistSpline { std::vector getRemap() const { return remap; } Float getTotalLength() const { return totalLength; } - /// Copy constructor - TwistSpline(TwistSpline const &old){ - this->verts = old.verts; - this->quats = old.quats; - this->scales = old.scales; - this->lockPositions = old.lockPositions; - this->lockValues = old.lockValues; - this->userTwists = old.userTwists; - this->twistLocks = old.twistLocks; - this->orientLocks = old.orientLocks; - this->remap = old.remap; - this->projSteps = old.projSteps; - this->lutSteps = old.lutSteps; - this->totalLength = old.totalLength; + /// Copy constructor by reference and by shared_ptr just for convenience + TwistSpline(TwistSpline const &old) : TwistSpline(&old){} + TwistSpline(const std::shared_ptr &old) : TwistSpline(old.get()){} + + /// Copy constructor by pointer + TwistSpline(const TwistSpline * const old){ + this->verts = old->verts; + this->quats = old->quats; + this->scales = old->scales; + this->lockPositions = old->lockPositions; + this->lockValues = old->lockValues; + this->userTwists = old->userTwists; + this->twistLocks = old->twistLocks; + this->orientLocks = old->orientLocks; + this->remap = old->remap; + this->projSteps = old->projSteps; + this->lutSteps = old->lutSteps; + this->totalLength = old->totalLength; IndexType numVerts = size(verts); if (numVerts < 2) { segments.clear(); @@ -677,7 +681,7 @@ class TwistSpline { ss = {&(scales[3*i]), &(scales[3*i + 1]), &(scales[3*i + 2]), &(scales[3*i + 3])}; qq = {&(quats[3*i]), &(quats[3*i + 1]), &(quats[3*i + 2]), &(quats[3*i + 3])}; segments[i] = std::unique_ptr>( - new TwistSplineSegment(*(old.segments[i]), vv, ss, qq) + new TwistSplineSegment(*(old->segments[i]), vv, ss, qq) ); } } diff --git a/src/twistSplineData.cpp b/src/twistSplineData.cpp index acc325b..48d0901 100644 --- a/src/twistSplineData.cpp +++ b/src/twistSplineData.cpp @@ -42,22 +42,22 @@ TwistSplineData::~TwistSplineData() { void TwistSplineData::copy(const MPxData& other) { if (other.typeId() == TwistSplineData::id) { - const TwistSplineData* otherData = (const TwistSplineData*) & other; - _twistSpline = std::make_unique(*otherData->getSpline()); + const TwistSplineData* otherData = static_cast(&other); + _twistSpline = std::make_shared(otherData->getSharedSpline()); } else { - // we need to convert to the other type based on its iff Tag + // we need to convert to the other type based on its iff Tag cerr << "wrong data format!" << endl; } return; } -const TwistSplineT* TwistSplineData::getSpline() const { - return _twistSpline.get(); +const std::shared_ptr TwistSplineData::getSharedSpline() const { + return _twistSpline; } -TwistSplineT* TwistSplineData::getSpline() { - return _twistSpline.get(); +std::shared_ptr TwistSplineData::getSharedSpline(){ + return _twistSpline; } MTypeId TwistSplineData::typeId() const { diff --git a/src/twistSplineData.h b/src/twistSplineData.h index 2af1ae3..ea27a20 100644 --- a/src/twistSplineData.h +++ b/src/twistSplineData.h @@ -52,8 +52,8 @@ class TwistSplineData : public MPxData { virtual void copy(const MPxData& other); // Data access - const TwistSplineT* getSpline() const; - TwistSplineT* getSpline(); + const std::shared_ptr getSharedSpline() const; + std::shared_ptr getSharedSpline(); // static methods and data. MTypeId typeId() const; @@ -63,6 +63,6 @@ class TwistSplineData : public MPxData { static void* creator(); private: - std::unique_ptr _twistSpline; + std::shared_ptr _twistSpline; }; diff --git a/src/twistSplineNode.cpp b/src/twistSplineNode.cpp index 1c8791d..3c402f2 100644 --- a/src/twistSplineNode.cpp +++ b/src/twistSplineNode.cpp @@ -207,7 +207,7 @@ MStatus TwistSplineNode::initialize() { return MS::kSuccess; } -TwistSplineT* TwistSplineNode::getSplineData() const { +std::shared_ptr TwistSplineNode::getSplineData() const { MStatus stat; MObject output; @@ -216,11 +216,11 @@ TwistSplineT* TwistSplineNode::getSplineData() const { tPlug.getValue(output); MFnPluginData outData(output); auto tsd = dynamic_cast(outData.data()); - return tsd->getSpline(); + return tsd->getSharedSpline(); } MBoundingBox TwistSplineNode::boundingBox() const { - TwistSplineT *ts = getSplineData(); + std::shared_ptr ts = getSplineData(); double minx, miny, minz, maxx, maxy, maxz; minx = miny = minz = std::numeric_limits::max(); @@ -390,7 +390,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) { MCHECKERROR(status); outSplineData = dynamic_cast(fnDataCreator.data(&status)); MCHECKERROR(status); - TwistSplineT *outSpline = outSplineData->getSpline(); + std::shared_ptr outSpline = outSplineData->getSharedSpline(); //if (points.length() != 0) outSpline->setVerts(points, scales, quats, lockPositions, lockVals, userTwist, twistLock, orientLock); @@ -416,7 +416,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) { } auto inSplineData = dynamic_cast(pd); - TwistSplineT *spline = inSplineData->getSpline(); + std::shared_ptr spline = inSplineData->getSharedSpline(); if (spline == nullptr) { outHandle.setMObject(MObject::kNullObj); return MS::kSuccess; @@ -457,7 +457,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) { } auto inSplineData = dynamic_cast(pd); - TwistSplineT *spline = inSplineData->getSpline(); + std::shared_ptr spline = inSplineData->getSharedSpline(); if (spline == nullptr) { outHandle.setDouble(0.0); diff --git a/src/twistSplineNode.h b/src/twistSplineNode.h index f698f4b..272788e 100644 --- a/src/twistSplineNode.h +++ b/src/twistSplineNode.h @@ -69,7 +69,7 @@ class TwistSplineNode : public MPxLocatorNode static MStatus initialize(); virtual bool isBounded() const { return true; } virtual MBoundingBox boundingBox() const; - TwistSplineT* getSplineData() const; + std::shared_ptr getSplineData() const; void getDebugDraw(bool &oDraw, double &oScale) const; void getSplineDraw(bool &oDraw) const;