Skip to content

Commit cb5ba3a

Browse files
committed
Use pass around twist splines as shared_ptr, not unique_ptr
1 parent 99d96e2 commit cb5ba3a

File tree

6 files changed

+39
-35
lines changed

6 files changed

+39
-35
lines changed

src/riderConstraint.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) {
380380
// I can optimize things a lot more if we do everything at once
381381
// So, whatever plug is asked for, just compute it all
382382
MStatus status;
383-
std::vector<TwistSplineT*> splines;
383+
std::vector<std::shared_ptr<TwistSplineT>> splines;
384384
std::vector<double> weights;
385385
std::vector<double> splineLens;
386386
std::vector<double> endParams;
@@ -417,7 +417,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) {
417417
double endParam = endParamH.asDouble();
418418

419419
auto inSplineData = (TwistSplineData *)pd;
420-
TwistSplineT *spline = inSplineData->getSpline();
420+
std::shared_ptr<TwistSplineT> spline = inSplineData->getSharedSpline();
421421
if (spline == nullptr) {
422422
inSpAH.next();
423423
continue;
@@ -533,7 +533,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) {
533533
bool twisted = splines.size() == 1;
534534

535535
for (size_t sIdx = 0; sIdx<splines.size(); ++sIdx) {
536-
TwistSplineT *spline = splines[sIdx];
536+
std::shared_ptr<TwistSplineT> spline = splines[sIdx];
537537
if (spline == nullptr) continue;
538538

539539
double mp = endParams[sIdx];

src/twistSpline.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -648,20 +648,24 @@ class TwistSpline {
648648
std::vector<Float> getRemap() const { return remap; }
649649
Float getTotalLength() const { return totalLength; }
650650

651-
/// Copy constructor
652-
TwistSpline(TwistSpline const &old){
653-
this->verts = old.verts;
654-
this->quats = old.quats;
655-
this->scales = old.scales;
656-
this->lockPositions = old.lockPositions;
657-
this->lockValues = old.lockValues;
658-
this->userTwists = old.userTwists;
659-
this->twistLocks = old.twistLocks;
660-
this->orientLocks = old.orientLocks;
661-
this->remap = old.remap;
662-
this->projSteps = old.projSteps;
663-
this->lutSteps = old.lutSteps;
664-
this->totalLength = old.totalLength;
651+
/// Copy constructor by reference and by shared_ptr just for convenience
652+
TwistSpline(TwistSpline const &old) : TwistSpline(&old){}
653+
TwistSpline(const std::shared_ptr<TwistSpline> &old) : TwistSpline(old.get()){}
654+
655+
/// Copy constructor by pointer
656+
TwistSpline(const TwistSpline * const old){
657+
this->verts = old->verts;
658+
this->quats = old->quats;
659+
this->scales = old->scales;
660+
this->lockPositions = old->lockPositions;
661+
this->lockValues = old->lockValues;
662+
this->userTwists = old->userTwists;
663+
this->twistLocks = old->twistLocks;
664+
this->orientLocks = old->orientLocks;
665+
this->remap = old->remap;
666+
this->projSteps = old->projSteps;
667+
this->lutSteps = old->lutSteps;
668+
this->totalLength = old->totalLength;
665669
IndexType numVerts = size(verts);
666670
if (numVerts < 2) {
667671
segments.clear();
@@ -677,7 +681,7 @@ class TwistSpline {
677681
ss = {&(scales[3*i]), &(scales[3*i + 1]), &(scales[3*i + 2]), &(scales[3*i + 3])};
678682
qq = {&(quats[3*i]), &(quats[3*i + 1]), &(quats[3*i + 2]), &(quats[3*i + 3])};
679683
segments[i] = std::unique_ptr<TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>>(
680-
new TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>(*(old.segments[i]), vv, ss, qq)
684+
new TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>(*(old->segments[i]), vv, ss, qq)
681685
);
682686
}
683687
}

src/twistSplineData.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,22 @@ TwistSplineData::~TwistSplineData() {
4242

4343
void TwistSplineData::copy(const MPxData& other) {
4444
if (other.typeId() == TwistSplineData::id) {
45-
const TwistSplineData* otherData = (const TwistSplineData*) & other;
46-
_twistSpline = std::make_unique<TwistSplineT>(*otherData->getSpline());
45+
const TwistSplineData* otherData = static_cast<const TwistSplineData*>(&other);
46+
_twistSpline = std::make_shared<TwistSplineT>(otherData->getSharedSpline());
4747
}
4848
else {
49-
// we need to convert to the other type based on its iff Tag
49+
// we need to convert to the other type based on its iff Tag
5050
cerr << "wrong data format!" << endl;
5151
}
5252
return;
5353
}
5454

55-
const TwistSplineT* TwistSplineData::getSpline() const {
56-
return _twistSpline.get();
55+
const std::shared_ptr<TwistSplineT> TwistSplineData::getSharedSpline() const {
56+
return _twistSpline;
5757
}
5858

59-
TwistSplineT* TwistSplineData::getSpline() {
60-
return _twistSpline.get();
59+
std::shared_ptr<TwistSplineT> TwistSplineData::getSharedSpline(){
60+
return _twistSpline;
6161
}
6262

6363
MTypeId TwistSplineData::typeId() const {

src/twistSplineData.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ class TwistSplineData : public MPxData {
5252
virtual void copy(const MPxData& other);
5353

5454
// Data access
55-
const TwistSplineT* getSpline() const;
56-
TwistSplineT* getSpline();
55+
const std::shared_ptr<TwistSplineT> getSharedSpline() const;
56+
std::shared_ptr<TwistSplineT> getSharedSpline();
5757

5858
// static methods and data.
5959
MTypeId typeId() const;
@@ -63,6 +63,6 @@ class TwistSplineData : public MPxData {
6363
static void* creator();
6464

6565
private:
66-
std::unique_ptr<TwistSplineT> _twistSpline;
66+
std::shared_ptr<TwistSplineT> _twistSpline;
6767
};
6868

src/twistSplineNode.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ MStatus TwistSplineNode::initialize() {
207207
return MS::kSuccess;
208208
}
209209

210-
TwistSplineT* TwistSplineNode::getSplineData() const {
210+
std::shared_ptr<TwistSplineT> TwistSplineNode::getSplineData() const {
211211
MStatus stat;
212212
MObject output;
213213

@@ -216,11 +216,11 @@ TwistSplineT* TwistSplineNode::getSplineData() const {
216216
tPlug.getValue(output);
217217
MFnPluginData outData(output);
218218
auto tsd = dynamic_cast<TwistSplineData *>(outData.data());
219-
return tsd->getSpline();
219+
return tsd->getSharedSpline();
220220
}
221221

222222
MBoundingBox TwistSplineNode::boundingBox() const {
223-
TwistSplineT *ts = getSplineData();
223+
std::shared_ptr<TwistSplineT> ts = getSplineData();
224224

225225
double minx, miny, minz, maxx, maxy, maxz;
226226
minx = miny = minz = std::numeric_limits<double>::max();
@@ -390,7 +390,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) {
390390
MCHECKERROR(status);
391391
outSplineData = dynamic_cast<TwistSplineData*>(fnDataCreator.data(&status));
392392
MCHECKERROR(status);
393-
TwistSplineT *outSpline = outSplineData->getSpline();
393+
std::shared_ptr<TwistSplineT> outSpline = outSplineData->getSharedSpline();
394394

395395
//if (points.length() != 0)
396396
outSpline->setVerts(points, scales, quats, lockPositions, lockVals, userTwist, twistLock, orientLock);
@@ -416,7 +416,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) {
416416
}
417417

418418
auto inSplineData = dynamic_cast<TwistSplineData *>(pd);
419-
TwistSplineT *spline = inSplineData->getSpline();
419+
std::shared_ptr<TwistSplineT> spline = inSplineData->getSharedSpline();
420420
if (spline == nullptr) {
421421
outHandle.setMObject(MObject::kNullObj);
422422
return MS::kSuccess;
@@ -457,7 +457,7 @@ MStatus TwistSplineNode::compute(const MPlug& plug, MDataBlock& data) {
457457
}
458458

459459
auto inSplineData = dynamic_cast<TwistSplineData *>(pd);
460-
TwistSplineT *spline = inSplineData->getSpline();
460+
std::shared_ptr<TwistSplineT> spline = inSplineData->getSharedSpline();
461461

462462
if (spline == nullptr) {
463463
outHandle.setDouble(0.0);

src/twistSplineNode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class TwistSplineNode : public MPxLocatorNode
6969
static MStatus initialize();
7070
virtual bool isBounded() const { return true; }
7171
virtual MBoundingBox boundingBox() const;
72-
TwistSplineT* getSplineData() const;
72+
std::shared_ptr<TwistSplineT> getSplineData() const;
7373
void getDebugDraw(bool &oDraw, double &oScale) const;
7474
void getSplineDraw(bool &oDraw) const;
7575

0 commit comments

Comments
 (0)