fix(physics): reset velocity on move + update property so that joints break

This commit is contained in:
maelstrom 2025-04-23 12:49:18 +02:00
parent 4005bf1cb5
commit 4b799f75d4
5 changed files with 18 additions and 0 deletions

View file

@ -90,6 +90,11 @@ Part::Part(PartConstructParams params): Instance(&TYPE), cframe(Data::CFrame::Fr
.codec = cframeRotationCodec(), .codec = cframeRotationCodec(),
.updateCallback = memberFunctionOf(&Part::onUpdated, this), .updateCallback = memberFunctionOf(&Part::onUpdated, this),
.flags = PropertyFlags::PROP_NOSAVE .flags = PropertyFlags::PROP_NOSAVE
}}, { "Velocity", {
.backingField = &velocity,
.type = &Vector3::TYPE,
.codec = fieldCodecOf<Data::Vector3>(),
.updateCallback = memberFunctionOf(&Part::onUpdated, this),
}}, { "CFrame", { }}, { "CFrame", {
.backingField = &cframe, .backingField = &cframe,
.type = &Data::CFrame::TYPE, .type = &Data::CFrame::TYPE,
@ -180,6 +185,10 @@ void Part::OnAncestryChanged(std::optional<std::shared_ptr<Instance>> child, std
} }
void Part::onUpdated(std::string property) { void Part::onUpdated(std::string property) {
// Reset velocity
if (property != "Velocity")
velocity = Data::Vector3::ZERO;
if (workspace()) if (workspace())
workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<Part>(this->shared_from_this())); workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast<Part>(this->shared_from_this()));

View file

@ -43,6 +43,7 @@ protected:
public: public:
const static InstanceType TYPE; const static InstanceType TYPE;
Data::Vector3 velocity;
Data::CFrame cframe; Data::CFrame cframe;
glm::vec3 size; glm::vec3 size;
Data::Color3 color; Data::Color3 color;

View file

@ -94,6 +94,7 @@ void Workspace::SyncPartPhysics(std::shared_ptr<Part> part) {
part->rigidBody->updateMassFromColliders(); part->rigidBody->updateMassFromColliders();
part->rigidBody->updateLocalInertiaTensorFromColliders(); part->rigidBody->updateLocalInertiaTensorFromColliders();
part->rigidBody->setLinearVelocity(part->velocity);
// part->rigidBody->setMass(density * part->size.x * part->size.y * part->size.z); // part->rigidBody->setMass(density * part->size.x * part->size.y * part->size.z);
part->rigidBody->setUserData(&*part); part->rigidBody->setUserData(&*part);
@ -111,6 +112,7 @@ void Workspace::PhysicsStep(float deltaTime) {
std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(obj); std::shared_ptr<Part> part = std::dynamic_pointer_cast<Part>(obj);
const rp::Transform& transform = part->rigidBody->getTransform(); const rp::Transform& transform = part->rigidBody->getTransform();
part->cframe = Data::CFrame(transform); part->cframe = Data::CFrame(transform);
part->velocity = part->rigidBody->getLinearVelocity();
} }
} }

View file

@ -157,6 +157,7 @@ void MainGLWidget::handleObjectDrag(QMouseEvent* evt) {
gWorkspace()->SyncPartPhysics(draggingObject.lock()); gWorkspace()->SyncPartPhysics(draggingObject.lock());
draggingObject.lock()->UpdateProperty("Position");
sendPropertyUpdatedSignal(draggingObject.lock(), "Position", draggingObject.lock()->position()); sendPropertyUpdatedSignal(draggingObject.lock(), "Position", draggingObject.lock()->position());
} }
@ -244,6 +245,8 @@ void MainGLWidget::handleLinearTransform(QMouseEvent* evt) {
playSound("./assets/excluded/switch.wav"); playSound("./assets/excluded/switch.wav");
gWorkspace()->SyncPartPhysics(part); gWorkspace()->SyncPartPhysics(part);
part->UpdateProperty("Position");
part->UpdateProperty("Size");
sendPropertyUpdatedSignal(part, "Position", part->position()); sendPropertyUpdatedSignal(part, "Position", part->position());
sendPropertyUpdatedSignal(part, "Size", Data::Vector3(part->size)); sendPropertyUpdatedSignal(part, "Size", Data::Vector3(part->size));
} }
@ -287,6 +290,7 @@ void MainGLWidget::handleRotationalTransform(QMouseEvent* evt) {
part->cframe = initialFrame * Data::CFrame::FromEulerAnglesXYZ(-angles); part->cframe = initialFrame * Data::CFrame::FromEulerAnglesXYZ(-angles);
gWorkspace()->SyncPartPhysics(part); gWorkspace()->SyncPartPhysics(part);
part->UpdateProperty("Rotation");
sendPropertyUpdatedSignal(part, "Rotation", part->cframe.ToEulerAnglesXYZ()); sendPropertyUpdatedSignal(part, "Rotation", part->cframe.ToEulerAnglesXYZ());
} }

View file

@ -178,6 +178,8 @@ MainWindow::MainWindow(QWidget *parent)
// gWorkspace()->AddChild(snap); // gWorkspace()->AddChild(snap);
gDataModel->GetService<JointsService>()->AddChild(snap); gDataModel->GetService<JointsService>()->AddChild(snap);
snap->UpdateProperty("Part0");
snap->UpdateProperty("Part1");
} }
void MainWindow::closeEvent(QCloseEvent* evt) { void MainWindow::closeEvent(QCloseEvent* evt) {