diff options
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); |
