diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-21 17:44:03 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-23 11:42:23 -0500 |
| commit | fa7fc343a0e444da72938fad58d219cf52228976 (patch) | |
| tree | 24630be0c54f9768a13f32c5970558768e343543 /src/ecs.cpp | |
| parent | 6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff) | |
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/ecs.cpp')
| -rw-r--r-- | src/ecs.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
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<void (*)(EntityHandle, EntityHandle)>(lhsInst->collisionCallback.func); + } + if (lhsColFunc == nullptr && lhsGrBinds && lhsGrBinds->collisionCallback.func) { + lhsColFunc = reinterpret_cast<void (*)(EntityHandle, EntityHandle)>(lhsGrBinds->collisionCallback.func); + } + + if (rhsInst && rhsInst->collisionCallback.func != nullptr) { + rhsColFunc = reinterpret_cast<void (*)(EntityHandle, EntityHandle)>(rhsInst->collisionCallback.func); + } + if (rhsColFunc == nullptr && rhsGrBinds && rhsGrBinds->collisionCallback.func) { + rhsColFunc = reinterpret_cast<void (*)(EntityHandle, EntityHandle)>(rhsGrBinds->collisionCallback.func); + } + + if (lhsColFunc) { + lhsColFunc(lhs, rhs); + } + if (rhsColFunc) { + rhsColFunc(lhs, rhs); + } +} + CompGrBinds &ECS_CreateGrBinds(EntityHandle entHandle) { assert(entHandle != EntityHandle_MAX); |
