From fa7fc343a0e444da72938fad58d219cf52228976 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Thu, 21 Dec 2023 17:44:03 -0500 Subject: plugin checkpoint - multiple plugins and collision callbacks --- src/ecs.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src/ecs.cpp') diff --git a/src/ecs.cpp b/src/ecs.cpp index 4580abe..c33caaa 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -327,6 +327,57 @@ void ECS_Tick_Late(double delta) { } } +void FindComponents(EntityHandle handle, Entity *&ent, CompInstance *&compInst, CompGrBinds *&grBinds) { + ECS_GetEntity_Inner(handle, ent); + if (ent == nullptr) + return; + GrBindsHandle grBindsHandle = ent->grBindsHandle; + if (ent->instanceHandle != InstanceHandle_MAX) { + compInst = &Comp_Instance_BucketContainer.buckets[ent->instanceHandle.bucketIndex].instances[ent->instanceHandle.itemIndex]; + if (grBindsHandle == GrBindsHandle_MAX) + grBindsHandle = compInst->grBindsHandle; + } + if (grBindsHandle != GrBindsHandle_MAX) { + grBinds = &Comp_GrBinds_BucketContainer.buckets[grBindsHandle.bucketIndex].compGrBinds[grBindsHandle.itemIndex]; + } +} + +void ECS_HandleCollision(EntityHandle lhs, EntityHandle rhs) { + Entity *lhsEnt = nullptr; + CompInstance *lhsInst = nullptr; + CompGrBinds *lhsGrBinds = nullptr; + FindComponents(lhs, lhsEnt, lhsInst, lhsGrBinds); + + Entity *rhsEnt = nullptr; + CompInstance *rhsInst = nullptr; + CompGrBinds *rhsGrBinds = nullptr; + FindComponents(rhs, rhsEnt, rhsInst, rhsGrBinds); + + void (*lhsColFunc)(EntityHandle, EntityHandle) = nullptr; + void (*rhsColFunc)(EntityHandle, EntityHandle) = nullptr; + + if (lhsInst && lhsInst->collisionCallback.func != nullptr) { + lhsColFunc = reinterpret_cast(lhsInst->collisionCallback.func); + } + if (lhsColFunc == nullptr && lhsGrBinds && lhsGrBinds->collisionCallback.func) { + lhsColFunc = reinterpret_cast(lhsGrBinds->collisionCallback.func); + } + + if (rhsInst && rhsInst->collisionCallback.func != nullptr) { + rhsColFunc = reinterpret_cast(rhsInst->collisionCallback.func); + } + if (rhsColFunc == nullptr && rhsGrBinds && rhsGrBinds->collisionCallback.func) { + rhsColFunc = reinterpret_cast(rhsGrBinds->collisionCallback.func); + } + + if (lhsColFunc) { + lhsColFunc(lhs, rhs); + } + if (rhsColFunc) { + rhsColFunc(lhs, rhs); + } +} + CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { assert(entHandle != EntityHandle_MAX); -- cgit v1.2.3