diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-20 21:08:19 -0400 |
| commit | 40d69e7e40a18865a31af2f55efcde369d36dbbb (patch) | |
| tree | 95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/serialization.cpp | |
| parent | ead9e484db969a880470d625b1884aced296e722 (diff) | |
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/serialization.cpp')
| -rw-r--r-- | src/serialization.cpp | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/src/serialization.cpp b/src/serialization.cpp index ce2dbd3..352ecc9 100644 --- a/src/serialization.cpp +++ b/src/serialization.cpp @@ -1,13 +1,17 @@ #include "serialization.hpp" +#include "font.hpp" #include "pk.h" #include "serialization-component.hpp" #include "serialization-camera.hpp" #include "camera.hpp" #include "ecs.hpp" +#include "serialization-font.hpp" +#include "serialization-static-ui.hpp" +#include "static-ui.hpp" bool srlztn_mapping_find_first_handle_by_uuid(void *handle, void *mapping) { - srlztn_instance_mapping *inst_mapping = reinterpret_cast<srlztn_instance_mapping *>(mapping); + srlztn_ecs_mapping *inst_mapping = reinterpret_cast<srlztn_ecs_mapping *>(mapping); return inst_mapping->serialized_uuid == *reinterpret_cast<pk_uuid *>(handle); } bool srlztn_kvec_find_first_by_handle(void *handle, void *container) { @@ -27,10 +31,10 @@ srlztn_serialize_helper *pke_serialize_init(pk_membucket *bkt) { srlztn_deserialize_helper *pke_deserialize_init(pk_membucket *bkt) { srlztn_deserialize_helper *helper = pk_new<srlztn_deserialize_helper>(bkt); helper->bkt = bkt; + helper->kvp_containers = {}; helper->kvp_containers.bkt = bkt; + helper->mapping = {}; helper->mapping.bkt = bkt; - pk_arr_reset(&helper->kvp_containers); - pk_arr_reset(&helper->mapping); pk_arr_reserve(&helper->kvp_containers, 1); pk_arr_reserve(&helper->mapping, 1); return helper; @@ -60,6 +64,27 @@ void pke_deserialize_project_from_stream(std::istream &i, srlztn_deserialize_hel } void pke_serialize_scene(srlztn_serialize_helper *h) { + FontTypeIndex font_type_count; + FontType *fonts = FontType_GetFonts(font_type_count); + for (FontTypeIndex_T b = 0; b < (FontTypeIndex_T)font_type_count; ++b) { + FontType *fr = &fonts[b]; + if (PK_HAS_FLAG(fr->entity_flags, ENTITY_FLAG_DO_NOT_SERIALIZE)) { + continue; + } + for (FontRenderIndex_T i = 0; i < (FontRenderIndex_T)fr->h_render; ++i) { + pke_serialize_font_render(h, &fr->renders[i]); + } + } + + pke_ui_box_count_T box_count; + pke_ui_box **ui_boxes = pke_ui_get_root_boxes(&box_count); + for (pke_ui_box_count_T i = 0; i < box_count; ++i) { + if (PK_HAS_FLAG(ui_boxes[i]->entity_flags, ENTITY_FLAG_DO_NOT_SERIALIZE)) { + continue; + } + pke_serialize_ui_box(h, ui_boxes[i]); + } + pk_handle_bucket_index_T instanceBucketCount = ECS_GetInstances_BucketCount(); for (pk_handle_bucket_index_T b = 0; b < instanceBucketCount; ++b) { pk_handle_item_index_T count; @@ -91,11 +116,19 @@ void pke_deserialize_scene(srlztn_deserialize_helper *h) { for (i = 0; i < h->kvp_containers.next; ++i) { kvec = &h->kvp_containers[i]; - if (strstr(kvec->type_code.val, SRLZTN_OBJ_INSTANCE) != nullptr) { + if (strcmp(kvec->type_code.val, SRLZTN_OBJ_FONT_RENDER) == 0) { + pke_deserialize_font_render(h, kvec); + continue; + } + if (strcmp(kvec->type_code.val, SRLZTN_OBJ_UI_BOX) == 0) { + pke_deserialize_ui_box(h, kvec); + continue; + } + if (strcmp(kvec->type_code.val, SRLZTN_OBJ_INSTANCE) == 0) { pke_deserialize_instance(h, kvec); continue; } - if (strstr(kvec->type_code.val, SRLZTN_OBJ_CAMERA) != nullptr) { + if (strcmp(kvec->type_code.val, SRLZTN_OBJ_CAMERA) == 0) { pke_deserialize_camera(h, kvec); continue; } @@ -195,10 +228,13 @@ void pke_deserialize_scene_from_stream(std::istream &i, srlztn_deserialize_helpe } else if (state == 1 && strlen(read_line) > 0) { // kve start offset = strchr(read_line, ':') - read_line; s = pk_new<char>(strlen(read_line) + 1); - sprintf(s, "%.*s", (int)offset+1, read_line); - kve.key = s; if (strstr(read_line, "::")) { + offset += 1; state = 2; + } + sprintf(s, "%.*s", (int)offset+1, read_line); + kve.key = s; + if (state == 2) { continue; } read_line[offset] = '\0'; @@ -217,21 +253,23 @@ void pke_deserialize_scene_from_stream(std::istream &i, srlztn_deserialize_helpe state = 3; continue; } - if (state == 3) { - rl = pk_new<char>(strlen(s) + strlen(read_line) + 1, h->bkt); - sprintf(rl, "%s%s", s, read_line); - pk_delete<char>(s, strlen(s) + 1, h->bkt); - s = rl; - continue; - } // multiline end if (strstr(read_line, SRLZTN_MULTILINE_END)) { assert(state >= 2); + kve.val = s; kve.end = SRLZTN_MULTILINE_END; pk_arr_append_t(&kvec.arr, kve); state = 1; continue; } + if (state == 3) { + int sz = snprintf(NULL, 0, "%s%s", s, read_line); + rl = pk_new<char>(sz+1, h->bkt); + sprintf(rl, "%s%s", s, read_line); + pk_delete<char>(s, strlen(s) + 1, h->bkt); + s = rl; + continue; + } // end of object if (state != 2) { state = 0; |
