From 8c6f038b9fa6eed71bb26f9407cf6472b31665ca Mon Sep 17 00:00:00 2001 From: maelstrom Date: Fri, 13 Jun 2025 02:12:34 +0200 Subject: [PATCH] feat(physics): added CanCollide property (which still fires Touched) --- core/src/objects/part.h | 1 + core/src/objects/workspace.cpp | 23 +++++++++++++++++++++++ core/src/objects/workspace.h | 1 + 3 files changed, 25 insertions(+) diff --git a/core/src/objects/part.h b/core/src/objects/part.h index 8db8a14..cf1a61e 100644 --- a/core/src/objects/part.h +++ b/core/src/objects/part.h @@ -70,6 +70,7 @@ public: DEF_PROP_CATEGORY(BEHAVIOR) DEF_PROP_(on_update=onUpdated) bool anchored = false; + DEF_PROP_(on_update=onUpdated) bool canCollide = true; DEF_PROP bool locked = false; DEF_PROP_CATEGORY(SURFACE) diff --git a/core/src/objects/workspace.cpp b/core/src/objects/workspace.cpp index d8c3f3f..8a85ec9 100644 --- a/core/src/objects/workspace.cpp +++ b/core/src/objects/workspace.cpp @@ -9,6 +9,7 @@ #include "physics/util.h" #include #include +#include #include rp::PhysicsCommon* Workspace::physicsCommon = new rp::PhysicsCommon; @@ -42,6 +43,25 @@ void PhysicsEventListener::onContact(const rp::CollisionCallback::CallbackData& } } +void PhysicsEventListener::onTrigger(const rp::OverlapCallback::CallbackData& data) { +for (size_t i = 0; i < data.getNbOverlappingPairs(); i++) { + auto pair = data.getOverlappingPair(i); + auto type = pair.getEventType(); + if (type == rp::OverlapCallback::OverlapPair::EventType::OverlapStay) continue; + + auto part0 = reinterpret_cast(pair.getBody1()->getUserData())->shared(); + auto part1 = reinterpret_cast(pair.getBody2()->getUserData())->shared(); + + if (type == reactphysics3d::OverlapCallback::OverlapPair::EventType::OverlapStart) { + part0->Touched->Fire({ (Variant)InstanceRef(part1) }); + part1->Touched->Fire({ (Variant)InstanceRef(part0) }); + } else if (type == reactphysics3d::OverlapCallback::OverlapPair::EventType::OverlapExit) { + part0->TouchEnded->Fire({ (Variant)InstanceRef(part1) }); + part1->TouchEnded->Fire({ (Variant)InstanceRef(part0) }); + } + } +} + void Workspace::InitService() { if (initialized) return; initialized = true; @@ -107,6 +127,9 @@ void Workspace::SyncPartPhysics(std::shared_ptr part) { part->rigidBody->setType(part->anchored ? rp::BodyType::STATIC : rp::BodyType::DYNAMIC); part->rigidBody->getCollider(0)->setCollisionCategoryBits(0b11); + part->rigidBody->getCollider(0)->setIsSimulationCollider(part->canCollide); + part->rigidBody->getCollider(0)->setIsTrigger(!part->canCollide); + rp::Material& material = part->rigidBody->getCollider(0)->getMaterial(); material.setFrictionCoefficient(0.35); material.setMassDensity(1.f); diff --git a/core/src/objects/workspace.h b/core/src/objects/workspace.h index cf5c34b..1392507 100644 --- a/core/src/objects/workspace.h +++ b/core/src/objects/workspace.h @@ -44,6 +44,7 @@ class PhysicsEventListener : public rp::EventListener { PhysicsEventListener(Workspace*); void onContact(const rp::CollisionCallback::CallbackData&) override; + void onTrigger(const rp::OverlapCallback::CallbackData&) override; }; class DEF_INST_SERVICE_(explorer_icon="workspace") Workspace : public Service {