From 0da4d6d67f352b1376116dce231dc682d9eb149d Mon Sep 17 00:00:00 2001 From: maelstrom Date: Thu, 17 Apr 2025 22:33:24 +0200 Subject: [PATCH] misc(snap): add properties to snap --- core/src/objects/base/instance.cpp | 4 ++-- core/src/objects/base/instance.h | 2 +- core/src/objects/snap.cpp | 23 +++++++++++++++++------ core/src/objects/snap.h | 3 ++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/core/src/objects/base/instance.cpp b/core/src/objects/base/instance.cpp index 56f9e6a..58a34a8 100644 --- a/core/src/objects/base/instance.cpp +++ b/core/src/objects/base/instance.cpp @@ -119,7 +119,7 @@ void Instance::updateAncestry(std::optional> updatedCh // Old workspace used to exist, and workspaces differ if (!oldWorkspace.expired() && oldWorkspace != _workspace) { - OnWorkspaceRemoved(!oldWorkspace.expired() ? std::make_optional(oldWorkspace.lock()) : std::nullopt); + OnWorkspaceRemoved(oldWorkspace.lock()); } // New workspace exists, and workspaces differ @@ -171,7 +171,7 @@ void Instance::OnWorkspaceAdded(std::optional> oldWor // Empty stub } -void Instance::OnWorkspaceRemoved(std::optional> oldWorkspace) { +void Instance::OnWorkspaceRemoved(std::shared_ptr oldWorkspace) { // Empty stub } diff --git a/core/src/objects/base/instance.h b/core/src/objects/base/instance.h index c151f13..4fa97ec 100644 --- a/core/src/objects/base/instance.h +++ b/core/src/objects/base/instance.h @@ -65,7 +65,7 @@ protected: virtual void OnParentUpdated(std::optional> oldParent, std::optional> newParent); virtual void OnAncestryChanged(std::optional> child, std::optional> newParent); virtual void OnWorkspaceAdded(std::optional> oldWorkspace, std::shared_ptr newWorkspace); - virtual void OnWorkspaceRemoved(std::optional> oldWorkspace); + virtual void OnWorkspaceRemoved(std::shared_ptr oldWorkspace); // The root data model this object is a descendant of std::optional> dataModel(); diff --git a/core/src/objects/snap.cpp b/core/src/objects/snap.cpp index 3101d76..b3253b8 100644 --- a/core/src/objects/snap.cpp +++ b/core/src/objects/snap.cpp @@ -26,22 +26,22 @@ Snap::Snap(): Instance(&TYPE) { .backingField = &part0, .type = &Data::InstanceRef::TYPE, .codec = fieldCodecOf>(), - // .updateCallback = memberFunctionOf(&Part::onUpdated, this), + .updateCallback = memberFunctionOf(&Snap::onUpdated, this), }}, { "Part1", { .backingField = &part1, .type = &Data::InstanceRef::TYPE, .codec = fieldCodecOf>(), - // .updateCallback = memberFunctionOf(&Part::onUpdated, this), + .updateCallback = memberFunctionOf(&Snap::onUpdated, this), }}, { "C0", { .backingField = &c0, .type = &Data::CFrame::TYPE, .codec = fieldCodecOf(), - // .updateCallback = memberFunctionOf(&Part::onUpdated, this), + .updateCallback = memberFunctionOf(&Snap::onUpdated, this), }}, { "C1", { .backingField = &c0, .type = &Data::CFrame::TYPE, .codec = fieldCodecOf(), - // .updateCallback = memberFunctionOf(&Part::onUpdated, this), + .updateCallback = memberFunctionOf(&Snap::onUpdated, this), }}, } }); @@ -60,13 +60,24 @@ void Snap::OnWorkspaceAdded(std::optional> oldWorkspa buildJoint(); } -void Snap::OnWorkspaceRemoved(std::optional> oldWorkspace) { +void Snap::OnWorkspaceRemoved(std::shared_ptr oldWorkspace) { if (!this->joint) return; - if (!oldWorkspace) oldWorkspace.value()->physicsWorld->destroyJoint(this->joint); + oldWorkspace->physicsWorld->destroyJoint(this->joint); this->joint = nullptr; } +void Snap::onUpdated(std::string property) { + // We are not in the workspace, so we don't really care what values are currently set + if (!workspace()) return; + + // Workspace cannot have changed, so if the joint currently exists, it is in the present one + if (this->joint) + workspace().value()->physicsWorld->destroyJoint(this->joint); + + buildJoint(); +} + void Snap::buildJoint() { if (part0.expired() || part1.expired() || !workspace()) return; diff --git a/core/src/objects/snap.h b/core/src/objects/snap.h index fe13ed1..1617d8d 100644 --- a/core/src/objects/snap.h +++ b/core/src/objects/snap.h @@ -10,8 +10,9 @@ class Snap : public Instance { rp::FixedJoint* joint = nullptr; protected: void OnWorkspaceAdded(std::optional> oldWorkspace, std::shared_ptr newWorkspace) override; - void OnWorkspaceRemoved(std::optional> oldWorkspace) override; + void OnWorkspaceRemoved(std::shared_ptr oldWorkspace) override; + void onUpdated(std::string property); void buildJoint(); void breakJoint(); public: