diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-06-18 16:19:32 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-07-21 10:16:14 -0400 |
| commit | b5133e3ee3f75bdca0b4f5ade5e77f506cb4f0c1 (patch) | |
| tree | e0dcf3af58d7c06f906099b69bc44154714ba84e /src | |
| parent | 2ecda48bd1cc16b2e5e3e1ebb05098e191121aad (diff) | |
pke: chkpt: add pkev component
Diffstat (limited to 'src')
| -rw-r--r-- | src/components.hpp | 9 | ||||
| -rw-r--r-- | src/ecs.cpp | 66 | ||||
| -rw-r--r-- | src/ecs.hpp | 5 | ||||
| -rw-r--r-- | src/game.cpp | 3 | ||||
| -rw-r--r-- | src/level.cpp | 5 | ||||
| -rw-r--r-- | src/level.hpp | 2 | ||||
| -rw-r--r-- | src/static-ui.hpp | 28 |
7 files changed, 112 insertions, 6 deletions
diff --git a/src/components.hpp b/src/components.hpp index 1adeda3..e1d9bcd 100644 --- a/src/components.hpp +++ b/src/components.hpp @@ -17,6 +17,7 @@ struct EntityHandle : public pk_bkt_arr_handle { }; struct GenericEntityHandle : public pk_bkt_arr_handle { }; struct GrBindsHandle : public pk_bkt_arr_handle { }; struct InstanceHandle : public pk_bkt_arr_handle { }; +struct PkeEventMgrHandle : public pk_bkt_arr_handle { }; struct SceneHandle : public pk_bkt_arr_handle { }; struct LevelHandle : public pk_bkt_arr_handle { }; @@ -24,6 +25,7 @@ constexpr EntityHandle EntityHandle_MAX = EntityHandle{ pk_bkt_arr_handle_MAX_co constexpr GenericEntityHandle GenericEntityHandle_MAX = GenericEntityHandle{ pk_bkt_arr_handle_MAX_constexpr }; constexpr GrBindsHandle GrBindsHandle_MAX = GrBindsHandle{ pk_bkt_arr_handle_MAX_constexpr }; constexpr InstanceHandle InstanceHandle_MAX = InstanceHandle{ pk_bkt_arr_handle_MAX_constexpr }; +constexpr PkeEventMgrHandle PkeEventMgrHandle_MAX = PkeEventMgrHandle{ pk_bkt_arr_handle_MAX_constexpr }; constexpr SceneHandle SceneHandle_MAX = SceneHandle{ pk_bkt_arr_handle_MAX_constexpr }; constexpr LevelHandle LevelHandle_MAX = LevelHandle{ pk_bkt_arr_handle_MAX_constexpr }; @@ -91,4 +93,11 @@ struct CompInstance { bool isNeedingUpdated = false; }; +struct pke_component_event_manager { + EntityHandle entity_handle; + PkeEventMgrHandle pke_ev_mgr_handle; + pk_uuid uuid = pk_uuid_max; + pk_ev_mgr_id_T ev_mgr_id; +}; + #endif /* PKE_COMPONENTS_HPP */ 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*>(); diff --git a/src/ecs.hpp b/src/ecs.hpp index 436429c..8b4080a 100644 --- a/src/ecs.hpp +++ b/src/ecs.hpp @@ -35,4 +35,9 @@ void ECS_GetInstances(Entity_Base *entity, pk_arr_t<CompInstance *> &arr); void ECS_UpdateInstance(CompInstance *instance, const InstPos &instPos, bool overridePhysics = false); pk_bkt_arr *ECS_GetInstances(); +pke_component_event_manager *ECS_CreateEvManager(Entity_Base *entity, pk_uuid uuid); +pke_component_event_manager *ECS_GetEvManager(PkeEventMgrHandle handle); +void ECS_GetEvManagers(Entity_Base *entity, pk_arr_t<pke_component_event_manager *> &arr); +pk_bkt_arr *ECS_GetEvManagers(); + #endif /* PKE_ECS_HPP */ diff --git a/src/game.cpp b/src/game.cpp index b64b118..edcfecc 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -152,7 +152,8 @@ void Game_Main(PKEWindowProperties windowProps, const char *executablePath) { // if we were passed only a scene name, create a faux level. if (!pkeSettings.args.levelName && pkeSettings.args.sceneName) { - pke_level *lvl = pke_level_create("faux-level"); + // TODO uuids + pke_level *lvl = pke_level_create("faux-level", pk_uuid_zed, pk_uuid_zed); pkeSettings.rt.nextLevel = lvl->levelHandle; scene_instance si{}; pke_scene *scn = pke_scene_get_by_path(pkeSettings.args.sceneName); diff --git a/src/level.cpp b/src/level.cpp index 44b10af..4293038 100644 --- a/src/level.cpp +++ b/src/level.cpp @@ -24,7 +24,7 @@ pke_level *pke_level_Get_Inner(LevelHandle handle) { } */ -pke_level *pke_level_create(const char *levelName) { +pke_level *pke_level_create(const char *levelName, pk_uuid level_uuid, pk_uuid ev_mgr_uuid) { NULL_CHAR_ARR(safe_name, LEVEL_NAME_MAX_LEN + 1); size_t len = strlen(levelName); @@ -45,7 +45,10 @@ pke_level *pke_level_create(const char *levelName) { lvl = &level_mstr.bc[level_handle]; new (lvl) pke_level{}; + lvl->uuid = level_uuid; ECS_CreateEntity(lvl); + (void)ev_mgr_uuid; + // ECS_CreateEvManager(lvl, ev_mgr_uuid); // TODO if (lvl->bkt == nullptr) { lvl->bkt = pk_mem_bucket_create(levelName, PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE); diff --git a/src/level.hpp b/src/level.hpp index 622369a..c515eea 100644 --- a/src/level.hpp +++ b/src/level.hpp @@ -5,7 +5,7 @@ void pke_level_init(); void pke_level_teardown(); -pke_level *pke_level_create(const char *levelName); +pke_level *pke_level_create(const char *levelName, pk_uuid level_uuid, pk_uuid ev_mgr_uuid); pke_level *pke_level_get(LevelHandle handle); pke_level *pke_level_get_by_name(const char *levelName); struct pk_bkt_arr *pke_level_get_levels(); diff --git a/src/static-ui.hpp b/src/static-ui.hpp index fa1ecf7..947f39f 100644 --- a/src/static-ui.hpp +++ b/src/static-ui.hpp @@ -32,10 +32,18 @@ const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_TEXT // TODO image, render target, etc // inputs -const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_INPUT_TEXT +// TODO +const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_BUTTON_TEXT = PKE_UI_BOX_TYPE(100); -// TODO multi-line text, scalar, float, slider, button, etc - +// TODO +const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_BUTTON_IMAGE + = PKE_UI_BOX_TYPE(101); +const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_INPUT_TEXT + = PKE_UI_BOX_TYPE(105); +// TODO +const PKE_UI_BOX_TYPE PKE_UI_BOX_TYPE_INPUT_MULTILINE_TEXT + = PKE_UI_BOX_TYPE(106); +// TODO scalar, float, slider, etc const PKE_UI_BOX_FLAG PKE_UI_BOX_FLAG_NONE = PKE_UI_BOX_FLAG(0); @@ -97,6 +105,20 @@ union pke_ui_box_type_data { struct pke_ui_box_type_data_text { FontRenderHandle font_render_handle; } text; + struct pke_ui_box_type_data_button_text { + FontRenderHandle font_render_handle; + pk_ev_id_T ev_mgr; + } button_text; + struct pke_ui_box_type_data_button_image { + VkDeviceMemory image_memory; + VkImage image_default; + VkImageView image_view_default; + VkImage image_hovered; + VkImageView image_view_hovered; + VkImage image_pressed; + VkImageView image_view_pressed; + pk_ev_id_T ev_mgr; + } button_image; }; struct pke_ui_graphics_bindings { |
