summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-21 17:44:03 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-23 11:42:23 -0500
commitfa7fc343a0e444da72938fad58d219cf52228976 (patch)
tree24630be0c54f9768a13f32c5970558768e343543 /src/ecs.cpp
parent6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff)
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp51
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);