Skip to content

Commit

Permalink
Use pass around twist splines as shared_ptr, not unique_ptr
Browse files Browse the repository at this point in the history
  • Loading branch information
tbttfox committed Jan 31, 2025
1 parent 99d96e2 commit cb5ba3a
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 35 deletions.
6 changes: 3 additions & 3 deletions src/riderConstraint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<TwistSplineT*> splines;
std::vector<std::shared_ptr<TwistSplineT>> splines;
std::vector<double> weights;
std::vector<double> splineLens;
std::vector<double> endParams;
Expand Down Expand Up @@ -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<TwistSplineT> spline = inSplineData->getSharedSpline();
if (spline == nullptr) {
inSpAH.next();
continue;
Expand Down Expand Up @@ -533,7 +533,7 @@ MStatus riderConstraint::compute(const MPlug& plug, MDataBlock& data) {
bool twisted = splines.size() == 1;

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

double mp = endParams[sIdx];
Expand Down
34 changes: 19 additions & 15 deletions src/twistSpline.h
Original file line number Diff line number Diff line change
Expand Up @@ -648,20 +648,24 @@ class TwistSpline {
std::vector<Float> 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<TwistSpline> &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();
Expand All @@ -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<TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>>(
new TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>(*(old.segments[i]), vv, ss, qq)
new TwistSplineSegment<PointArray, Point, VectorArray, Vector, QuatArray, Quat, Float>(*(old->segments[i]), vv, ss, qq)
);
}
}
Expand Down
14 changes: 7 additions & 7 deletions src/twistSplineData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<TwistSplineT>(*otherData->getSpline());
const TwistSplineData* otherData = static_cast<const TwistSplineData*>(&other);
_twistSpline = std::make_shared<TwistSplineT>(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<TwistSplineT> TwistSplineData::getSharedSpline() const {
return _twistSpline;
}

TwistSplineT* TwistSplineData::getSpline() {
return _twistSpline.get();
std::shared_ptr<TwistSplineT> TwistSplineData::getSharedSpline(){
return _twistSpline;
}

MTypeId TwistSplineData::typeId() const {
Expand Down
6 changes: 3 additions & 3 deletions src/twistSplineData.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<TwistSplineT> getSharedSpline() const;
std::shared_ptr<TwistSplineT> getSharedSpline();

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

private:
std::unique_ptr<TwistSplineT> _twistSpline;
std::shared_ptr<TwistSplineT> _twistSpline;
};

12 changes: 6 additions & 6 deletions src/twistSplineNode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ MStatus TwistSplineNode::initialize() {
return MS::kSuccess;
}

TwistSplineT* TwistSplineNode::getSplineData() const {
std::shared_ptr<TwistSplineT> TwistSplineNode::getSplineData() const {
MStatus stat;
MObject output;

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

MBoundingBox TwistSplineNode::boundingBox() const {
TwistSplineT *ts = getSplineData();
std::shared_ptr<TwistSplineT> ts = getSplineData();

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

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

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

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

if (spline == nullptr) {
outHandle.setDouble(0.0);
Expand Down
2 changes: 1 addition & 1 deletion src/twistSplineNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<TwistSplineT> getSplineData() const;
void getDebugDraw(bool &oDraw, double &oScale) const;
void getSplineDraw(bool &oDraw) const;

Expand Down

0 comments on commit cb5ba3a

Please sign in to comment.