fix(physics): motor6d crashes
This commit is contained in:
parent
c8be848cea
commit
28f416bf63
3 changed files with 7 additions and 19 deletions
|
@ -27,14 +27,6 @@ void Motor6D::buildJoint() {
|
||||||
jointWorkspace = workspace;
|
jointWorkspace = workspace;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Motor6D::onUpdated(std::string property) {
|
|
||||||
if (property == "DesiredAngle") {
|
|
||||||
joint.setTargetAngle(desiredAngle);
|
|
||||||
} else if (property == "MaxVelocity") {
|
|
||||||
joint.setAngularVelocity(maxVelocity);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Motor6D::isDrivenJoint() {
|
bool Motor6D::isDrivenJoint() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -59,7 +51,7 @@ void Motor6D::OnPhysicsStep(float deltaTime) {
|
||||||
CFrame newFrame = rotatedAnchor * c1.Inverse();
|
CFrame newFrame = rotatedAnchor * c1.Inverse();
|
||||||
|
|
||||||
part1.lock()->cframe = newFrame;
|
part1.lock()->cframe = newFrame;
|
||||||
jointWorkspace.lock()->SetPhysicalCFrameInternal(part1.lock(), newFrame);
|
part1.lock()->UpdateNoBreakJoints();
|
||||||
} else if (!part0.lock()->anchored) {
|
} else if (!part0.lock()->anchored) {
|
||||||
CFrame anchorPoint = part1.lock()->cframe * c1;
|
CFrame anchorPoint = part1.lock()->cframe * c1;
|
||||||
Vector3 angles = anchorPoint.ToEulerAnglesXYZ();
|
Vector3 angles = anchorPoint.ToEulerAnglesXYZ();
|
||||||
|
@ -67,6 +59,6 @@ void Motor6D::OnPhysicsStep(float deltaTime) {
|
||||||
CFrame newFrame = rotatedAnchor * c0.Inverse();
|
CFrame newFrame = rotatedAnchor * c0.Inverse();
|
||||||
|
|
||||||
part0.lock()->cframe = newFrame;
|
part0.lock()->cframe = newFrame;
|
||||||
jointWorkspace.lock()->SetPhysicalCFrameInternal(part0.lock(), newFrame);
|
part0.lock()->UpdateNoBreakJoints();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,8 +5,6 @@
|
||||||
#include "objects/joint/jointinstance.h"
|
#include "objects/joint/jointinstance.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#define DEF_PROP_PHYS DEF_PROP_(on_update=onUpdated)
|
|
||||||
|
|
||||||
class DEF_INST Motor6D : public JointInstance {
|
class DEF_INST Motor6D : public JointInstance {
|
||||||
AUTOGEN_PREAMBLE
|
AUTOGEN_PREAMBLE
|
||||||
|
|
||||||
|
@ -19,12 +17,10 @@ public:
|
||||||
Motor6D();
|
Motor6D();
|
||||||
~Motor6D();
|
~Motor6D();
|
||||||
|
|
||||||
DEF_PROP float currentAngle;
|
DEF_PROP float currentAngle = 0;
|
||||||
DEF_PROP_PHYS float desiredAngle;
|
DEF_PROP float desiredAngle = 0;
|
||||||
DEF_PROP_PHYS float maxVelocity;
|
DEF_PROP float maxVelocity = 0.1;
|
||||||
|
|
||||||
static inline std::shared_ptr<Motor6D> New() { return std::make_shared<Motor6D>(); };
|
static inline std::shared_ptr<Motor6D> New() { return std::make_shared<Motor6D>(); };
|
||||||
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Motor6D>(); };
|
static inline std::shared_ptr<Instance> Create() { return std::make_shared<Motor6D>(); };
|
||||||
};
|
};
|
||||||
|
|
||||||
#undef DEF_PROP_PHYS
|
|
|
@ -306,7 +306,7 @@ void BasePart::MakeJoints() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasePart::UpdateNoBreakJoints() {
|
void BasePart::UpdateNoBreakJoints() {
|
||||||
if (workspace())
|
if (workspace() != nullptr)
|
||||||
workspace()->SyncPartPhysics(std::dynamic_pointer_cast<BasePart>(this->shared_from_this()));
|
workspace()->SyncPartPhysics(std::dynamic_pointer_cast<BasePart>(this->shared_from_this()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue