summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-24 11:19:34 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-24 11:19:34 -0400
commitc58e91fee38659c6b2b262e6670af9d7a1d663b7 (patch)
treee8a72f07b98bdc668181de7441c5cc3a0e228911
parentb1409537eb5a3bbdbae892cf3f6a451dee5472a9 (diff)
pke: ui button text serialization first-pass
-rw-r--r--src/components.hpp2
-rw-r--r--src/ecs.cpp2
-rw-r--r--src/serialization-static-ui.cpp135
-rw-r--r--src/serialization.hpp1
-rw-r--r--tests-proj/ui-text-button.pstf36
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