summaryrefslogtreecommitdiff
path: root/src/ecs.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-06-18 16:19:32 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-07-21 10:16:14 -0400
commitb5133e3ee3f75bdca0b4f5ade5e77f506cb4f0c1 (patch)
treee0dcf3af58d7c06f906099b69bc44154714ba84e /src/ecs.cpp
parent2ecda48bd1cc16b2e5e3e1ebb05098e191121aad (diff)
pke: chkpt: add pkev component
Diffstat (limited to 'src/ecs.cpp')
-rw-r--r--src/ecs.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/ecs.cpp b/src/ecs.cpp
index 5d409be..038a7f3 100644
--- a/src/ecs.cpp
+++ b/src/ecs.cpp
@@ -18,6 +18,7 @@ struct ECS {
pk_bkt_arr_t<Entity_Base *> entityPtrs{};
pk_bkt_arr_t<CompGrBinds> grBinds{};
pk_bkt_arr_t<CompInstance> instances{};
+ pk_bkt_arr_t<pke_component_event_manager> ev_mgrs{};
} bc;
} ecs;
@@ -62,6 +63,7 @@ void ECS_Init() {
new (&ecs.bc.entityPtrs) pk_bkt_arr_t<Entity_Base*>{ pk_bkt_arr_handle_MAX_constexpr };
new (&ecs.bc.grBinds) pk_bkt_arr_t<CompGrBinds>{ pk_bkt_arr_handle_MAX_constexpr };
new (&ecs.bc.instances) pk_bkt_arr_t<CompInstance>{ pk_bkt_arr_handle_MAX_constexpr };
+ new (&ecs.bc.ev_mgrs) pk_bkt_arr_t<pke_component_event_manager>{ pk_bkt_arr_handle_MAX_constexpr };
pk_arr_reserve(&entitiesMarkedForRemoval, 16);
pk_arr_reserve(&EntitiesToBeRemoved, 16);
pk_arr_reserve(&entitiesYetToBeRemoved, 16);
@@ -181,8 +183,10 @@ void ECS_Tick(double delta) {
using InstIterFn = pk_tmpln_1<void, CompInstance *, void *>;
using GrBindsIterFn = pk_tmpln_1<void, CompGrBinds *, void *>;
+ using CompEvMgrIterFn = pk_tmpln_1<void, pke_component_event_manager *, void *>;
InstIterFn inst_iter_cb{};
GrBindsIterFn grbinds_iter_cb{};
+ CompEvMgrIterFn comp_ev_mgr_iter_cb{};
pk_arr_t<updateGrBindsAfter> updateGrBinds;
updateGrBinds.bkt = pkeSettings.mem_bkt.game_transient;
@@ -259,6 +263,18 @@ void ECS_Tick(double delta) {
if (entityRemovalCount > 0 || updateGrBinds.next > 0) {
pk_bkt_arr_iterate(&ecs.bc.grBinds, &GrBindsIterFn::invoke, &grbinds_iter_cb);
}
+
+ comp_ev_mgr_iter_cb.func = [](pke_component_event_manager *arr_obj_data) {
+ Entity_Base *ent = ecs.bc.entityPtrs[arr_obj_data->entity_handle];
+ if (pk_arr_find_first_index(&entitiesYetToBeRemoved, ent, ecs_pk_arr_find_first_matching_pointer) != uint32_t(-1)) {
+ pk_ev_destroy_mgr(arr_obj_data->ev_mgr_id);
+ pk_bkt_arr_free_handle(&ecs.bc.ev_mgrs, arr_obj_data->pke_ev_mgr_handle);
+ }
+ };
+ if (entityRemovalCount > 0) {
+ pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &comp_ev_mgr_iter_cb);
+ }
+
}
struct InstanceBufferCopyChunk {
@@ -556,11 +572,61 @@ pk_bkt_arr *ECS_GetInstances() {
return &ecs.bc.instances;
}
+pke_component_event_manager *ECS_CreateEvManager(Entity_Base *entity, pk_uuid uuid) {
+ assert(entity != nullptr && entity != CAFE_BABE(Entity_Base));
+
+ PkeEventMgrHandle ev_mgr_handle { pk_bkt_arr_new_handle(&ecs.bc.ev_mgrs) };
+ auto *comp = &ecs.bc.ev_mgrs[ev_mgr_handle];
+ new (comp) pke_component_event_manager{};
+ comp->entity_handle = entity->handle;
+ comp->pke_ev_mgr_handle = ev_mgr_handle;
+ comp->uuid = uuid;
+ if (comp->uuid == pk_uuid_zed || comp->uuid == pk_uuid_max) {
+ comp->uuid = pk_uuid_new_v7();
+ }
+
+ comp->ev_mgr_id = pk_ev_create_mgr();
+
+ return comp;
+}
+
+pke_component_event_manager *ECS_GetEvManager(PkeEventMgrHandle handle) {
+ if (handle == PkeEventMgrHandle_MAX) return nullptr;
+
+ assert(pk_bkt_arr_handle_validate(&ecs.bc.ev_mgrs, handle) == PK_BKT_ARR_HANDLE_VALIDATION_VALID);
+ auto *ev_mgr = &ecs.bc.ev_mgrs[handle];
+
+ return ev_mgr;
+}
+
+void ECS_GetEvManagers(Entity_Base *entity, pk_arr_t<pke_component_event_manager *> &arr) {
+ if (entity == nullptr) return;
+
+ // 2025-05-29 JCB PERF
+ // There's gotta be a better way to do this than looping
+ // Let's leave it until it shows up in performance tests.
+
+ using CompEvMgrIterFn = pk_tmpln_1<void, pke_component_event_manager *, void *>;
+ CompEvMgrIterFn inst_iter_cb{};
+
+ inst_iter_cb.func = [&entity, &arr](pke_component_event_manager *arr_obj_data) {
+ if (arr_obj_data->entity_handle == entity->handle) {
+ pk_arr_append_t<pke_component_event_manager*>(&arr, arr_obj_data);
+ }
+ };
+ pk_bkt_arr_iterate(&ecs.bc.ev_mgrs, &CompEvMgrIterFn::invoke, &inst_iter_cb);
+}
+
+pk_bkt_arr *ECS_GetEvManagers() {
+ return &ecs.bc.ev_mgrs;
+}
+
void ECS_Teardown() {
pk_arr_reset(&EntitiesWithExcessInstances);
pk_arr_reset(&entitiesYetToBeRemoved);
pk_arr_reset(&EntitiesToBeRemoved);
pk_arr_reset(&entitiesMarkedForRemoval);
+ ecs.bc.ev_mgrs.~pk_bkt_arr_t<pke_component_event_manager>();
ecs.bc.instances.~pk_bkt_arr_t<CompInstance>();
ecs.bc.grBinds.~pk_bkt_arr_t<CompGrBinds>();
ecs.bc.entityPtrs.~pk_bkt_arr_t<Entity_Base*>();