diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-24 11:19:34 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-24 11:19:34 -0400 |
| commit | c58e91fee38659c6b2b262e6670af9d7a1d663b7 (patch) | |
| tree | e8a72f07b98bdc668181de7441c5cc3a0e228911 | |
| parent | b1409537eb5a3bbdbae892cf3f6a451dee5472a9 (diff) | |
pke: ui button text serialization first-pass
| -rw-r--r-- | src/components.hpp | 2 | ||||
| -rw-r--r-- | src/ecs.cpp | 2 | ||||
| -rw-r--r-- | src/serialization-static-ui.cpp | 135 | ||||
| -rw-r--r-- | src/serialization.hpp | 1 | ||||
| -rw-r--r-- | tests-proj/ui-text-button.pstf | 36 |
5 files changed, 143 insertions, 33 deletions
diff --git a/src/components.hpp b/src/components.hpp index 36c3785..aa60334 100644 --- a/src/components.hpp +++ b/src/components.hpp @@ -25,7 +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 PkeEventHandle PkeEventMgrHandle_MAX = PkeEventHandle{ pk_bkt_arr_handle_MAX_constexpr }; +constexpr PkeEventHandle PkeEventHandle_MAX = PkeEventHandle{ 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 }; diff --git a/src/ecs.cpp b/src/ecs.cpp index b4391dc..6fcbeb4 100644 --- a/src/ecs.cpp +++ b/src/ecs.cpp @@ -634,7 +634,7 @@ pke_component_event *ECS_CreateEv(Entity_Base *entity, pk_uuid uuid) { } pke_component_event *ECS_GetEv(PkeEventHandle handle) { - if (handle == PkeEventMgrHandle_MAX) return nullptr; + if (handle == PkeEventHandle_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]; diff --git a/src/serialization-static-ui.cpp b/src/serialization-static-ui.cpp index 67c0c1e..b790978 100644 --- a/src/serialization-static-ui.cpp +++ b/src/serialization-static-ui.cpp @@ -8,7 +8,7 @@ #include "serialization.hpp" #include "static-ui.hpp" -pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_button_image *data) { +pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_text *data) { char *s; pke_kve kve{}; pke_kve_container kvec{}; @@ -21,27 +21,12 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t kvec.child_handles.bkt = h->bkt; h->handle_head.itemIndex++; - compt_a<64==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_image)>(); - { - kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_DEFAULT; - s = pk_new_arr<char>(AssetKeyLength, h->bkt); - memcpy(s, data->img_key_default, AssetKeyLength); - kve.val = s; - kve.end = SRLZTN_KVE_END; - pk_arr_append_t(&kvec.arr, kve); - } - { - kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_HOVERED; - s = pk_new_arr<char>(AssetKeyLength, h->bkt); - memcpy(s, data->img_key_hovered, AssetKeyLength); - kve.val = s; - kve.end = SRLZTN_KVE_END; - pk_arr_append_t(&kvec.arr, kve); - } + compt_a<4==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); { - kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_PRESSED; - s = pk_new_arr<char>(AssetKeyLength, h->bkt); - memcpy(s, data->img_key_pressed, AssetKeyLength); + kve.key = SRLZTN_UI_BOX_DATA_TEXT_FONT_RENDER_UUID; + s = pk_new_arr<char>(37, h->bkt); + FontRender *fr = FontType_GetFontRender(data->font_render_handle); + sprintf(s, pk_uuid_printf_format, pk_uuid_printf_var(fr->uuid)); kve.val = s; kve.end = SRLZTN_KVE_END; pk_arr_append_t(&kvec.arr, kve); @@ -56,7 +41,7 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t return kvec.srlztn_handle; } -pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_text *data) { +pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_button_text *data) { char *s; pke_kve kve{}; pke_kve_container kvec{}; @@ -69,9 +54,9 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t kvec.child_handles.bkt = h->bkt; h->handle_head.itemIndex++; - compt_a<4==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_text)>(); + compt_a<16==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); { - kve.key = SRLZTN_UI_BOX_DATA_TEXT_FONT_RENDER_UUID; + kve.key = SRLZTN_UI_BOX_DATA_BUTTON_TEXT_FONT_RENDER_UUID; s = pk_new_arr<char>(37, h->bkt); FontRender *fr = FontType_GetFontRender(data->font_render_handle); sprintf(s, pk_uuid_printf_format, pk_uuid_printf_var(fr->uuid)); @@ -79,6 +64,55 @@ pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_t kve.end = SRLZTN_KVE_END; pk_arr_append_t(&kvec.arr, kve); } + // 2025-09-24 TODO JCB + // data->pke_event_handle; + // data->ev_id; + + pk_arr_append_t(&h->kvp_containers, kvec); + kvec.arr.data = nullptr; + kvec.children.data = nullptr; + kvec.child_handles.data = nullptr; + return kvec.srlztn_handle; +} + +pk_handle pke_serialize_ui_box_internal(srlztn_serialize_helper *h, pke_ui_box_type_data::pke_ui_box_type_data_button_image *data) { + char *s; + pke_kve kve{}; + pke_kve_container kvec{}; + + kvec.srlztn_handle = h->handle_head; + kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_UI_BOX_TYPE_DATA); + kvec.bkt = h->bkt; + kvec.arr.bkt = h->bkt; + kvec.children.bkt = h->bkt; + kvec.child_handles.bkt = h->bkt; + h->handle_head.itemIndex++; + + compt_a<64==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_image)>(); + { + kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_DEFAULT; + s = pk_new_arr<char>(AssetKeyLength, h->bkt); + memcpy(s, data->img_key_default, AssetKeyLength); + kve.val = s; + kve.end = SRLZTN_KVE_END; + pk_arr_append_t(&kvec.arr, kve); + } + { + kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_HOVERED; + s = pk_new_arr<char>(AssetKeyLength, h->bkt); + memcpy(s, data->img_key_hovered, AssetKeyLength); + kve.val = s; + kve.end = SRLZTN_KVE_END; + pk_arr_append_t(&kvec.arr, kve); + } + { + kve.key = SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_PRESSED; + s = pk_new_arr<char>(AssetKeyLength, h->bkt); + memcpy(s, data->img_key_pressed, AssetKeyLength); + kve.val = s; + kve.end = SRLZTN_KVE_END; + pk_arr_append_t(&kvec.arr, kve); + } // 2025-08-19 TODO JCB // pressed callback @@ -108,6 +142,30 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta data->font_render_handle = fr->fr_handle; } +void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_container *kvec, pke_ui_box_type_data::pke_ui_box_type_data_button_text *data) { + (void)h; + assert(kvec != nullptr); + assert(data != nullptr); + assert(kvec->arr.next == 1); + pk_uuid font_render_uuid = pk_uuid_zed; + + // TODO + data->font_render_handle = FontRenderHandle_MAX; + data->pke_event_handle = PkeEventHandle_MAX; + data->ev_id = pk_ev_id_T{0}; + + compt_a<16==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_text)>(); + if (strstr(SRLZTN_UI_BOX_DATA_BUTTON_TEXT_FONT_RENDER_UUID, kvec->arr[0].key)) { + kvec->arr[0].val >> font_render_uuid; + } + + assert(font_render_uuid != pk_uuid_zed); + + FontRender *fr = static_cast<FontRender *>(ECS_GetEntityByUUID(font_render_uuid)); + + data->font_render_handle = fr->fr_handle; +} + void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_container *kvec, pke_ui_box_type_data::pke_ui_box_type_data_button_image *data) { (void)h; uint32_t u; @@ -117,7 +175,7 @@ void pke_deserialize_ui_box_internal(srlztn_deserialize_helper *h, pke_kve_conta assert(kvec->arr.next == 3); data->gr_binds_bkt_arr_handle = pk_bkt_arr_handle_MAX; - data->pke_event_handle = PkeEventMgrHandle_MAX; + data->pke_event_handle = PkeEventHandle_MAX; data->ev_id = {}; compt_a<64==sizeof(pke_ui_box_type_data::pke_ui_box_type_data_button_image)>(); @@ -159,11 +217,21 @@ pk_handle pke_serialize_ui_box(srlztn_serialize_helper *h, pke_ui_box *box) { kvec.child_handles.bkt = h->bkt; - if (box->type == PKE_UI_BOX_TYPE_TEXT) { - pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->text)); - } - if (box->type == PKE_UI_BOX_TYPE_BUTTON_IMAGE) { - pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->button_image)); + switch (box->type) { + case PKE_UI_BOX_TYPE_STANDARD: + break; + case PKE_UI_BOX_TYPE_TEXT: + pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->text)); + break; + case PKE_UI_BOX_TYPE_BUTTON_TEXT: + pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->button_text)); + break; + case PKE_UI_BOX_TYPE_BUTTON_IMAGE: + pk_arr_append_t(&kvec.child_handles, pke_serialize_ui_box_internal(h, &box->type_data->button_image)); + break; + default: + fprintf(stderr, "[pke_serialize_ui_box] unhandled box type: %hhu\n", static_cast<PKE_UI_BOX_TYPE_T>(box->type)); + return PK_HANDLE_MAX; } kvec.srlztn_handle = h->handle_head; @@ -423,6 +491,7 @@ void pke_deserialize_ui_box(srlztn_deserialize_helper *h, pke_kve_container *kve case PKE_UI_BOX_TYPE_STANDARD: case PKE_UI_BOX_TYPE_TEXT: case PKE_UI_BOX_TYPE_INPUT_TEXT: + case PKE_UI_BOX_TYPE_BUTTON_TEXT: case PKE_UI_BOX_TYPE_BUTTON_IMAGE: break; default: @@ -471,11 +540,15 @@ void pke_deserialize_ui_box(srlztn_deserialize_helper *h, pke_kve_container *kve case PKE_UI_BOX_TYPE_TEXT: pke_deserialize_ui_box_internal(h, kvec->children[0], &bx.type_data->text); break; + case PKE_UI_BOX_TYPE_BUTTON_TEXT: + pke_deserialize_ui_box_internal(h, kvec->children[0], &bx.type_data->button_text); + break; case PKE_UI_BOX_TYPE_BUTTON_IMAGE: pke_deserialize_ui_box_internal(h, kvec->children[0], &bx.type_data->button_image); break; default: - break; + fprintf(stderr, "[pke_deserialize_ui_box] unhandled box type: %hhu\n", static_cast<PKE_UI_BOX_TYPE_T>(bx.type)); + return; } } diff --git a/src/serialization.hpp b/src/serialization.hpp index fd8ebb8..4aacf4e 100644 --- a/src/serialization.hpp +++ b/src/serialization.hpp @@ -61,6 +61,7 @@ iccsc SRLZTN_UI_BOX_TYPE = "Type:"; iccsc SRLZTN_UI_BOX_COLOR_BORDER = "ColorBorder:"; iccsc SRLZTN_UI_BOX_COLOR_BACKGROUND = "ColorBackground:"; iccsc SRLZTN_UI_BOX_DATA_TEXT_FONT_RENDER_UUID = "FontRenderUUID:"; +iccsc SRLZTN_UI_BOX_DATA_BUTTON_TEXT_FONT_RENDER_UUID = "FontRenderUUID:"; iccsc SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_DEFAULT = "AssetKeyDefault:"; iccsc SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_HOVERED = "AssetKeyHovered:"; iccsc SRLZTN_UI_BOX_DATA_BUTTON_IMAGE_ASSET_KEY_PRESSED = "AssetKeyPressed:"; diff --git a/tests-proj/ui-text-button.pstf b/tests-proj/ui-text-button.pstf new file mode 100644 index 0000000..3796613 --- /dev/null +++ b/tests-proj/ui-text-button.pstf @@ -0,0 +1,36 @@ +:PKFB: +:0: + +FontRenderSettings:00000000!00000000 +CharScale:44.500000 +LineHeightScale:1.000000 +CharSpacingScale:1.000000 +SurfaceAreaSize:562;615 +SurfaceAreaPos:187;205 +SurfaceAreaFlags:0x00 +ColorForeground:0.400000;0.900000;0.500000;0.800000 +ColorBackground:0.000000;0.000000;0.000000;0.000000 + +FontRender:00000000!00000001 +ChildId:00000000!00000000 +UUID:68d40872-698a-70ba-aeb1-41f241b71efb +FontTypeTitle:fnt_mquin_7y +TextBegin:: +text button +:MULTILINE_END: + +UIBoxTypeData:00000000!00000002 +FontRenderUUID:68d40872-698a-70ba-aeb1-41f241b71efb + +UIBox:00000000!00000003 +ChildId:00000000!00000002 +UUID:68d40872-3e6a-78d2-a38e-1f2946e87ccd +Flags:0x64 +PosTopLeft:0.000000;0.000000 +MaxSize:0.600000;0.600000 +Type:0x64 +Layer:0x00 +ColorBorder:1.000000;0.000000;0.000000;1.000000 +ColorBackground:0.200000;0.300000;0.200000;0.500000 + +:PKFE:
\ No newline at end of file |
