summaryrefslogtreecommitdiff
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
parent2ecda48bd1cc16b2e5e3e1ebb05098e191121aad (diff)
pke: chkpt: add pkev component
-rw-r--r--src/components.hpp9
-rw-r--r--src/ecs.cpp66
-rw-r--r--src/ecs.hpp5
-rw-r--r--src/game.cpp3
-rw-r--r--src/level.cpp5
-rw-r--r--src/level.hpp2
-rw-r--r--src/static-ui.hpp28
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 {