summaryrefslogtreecommitdiff
path: root/src/serialization.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
commit40d69e7e40a18865a31af2f55efcde369d36dbbb (patch)
tree95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/serialization.cpp
parentead9e484db969a880470d625b1884aced296e722 (diff)
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/serialization.cpp')
-rw-r--r--src/serialization.cpp66
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;