summaryrefslogtreecommitdiff
path: root/src/serialization-input.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-06-11 16:04:48 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-06-11 16:04:54 -0400
commit0f89d12e747b380b35143815a2c8e87c6ee752d4 (patch)
tree78617e7cb819093aa9c0ad107b5dc79891e8ff55 /src/serialization-input.cpp
parente478bae42cf886a12433331937887de4c4e85ce2 (diff)
pke: serialize PkeInput first-pass
Diffstat (limited to 'src/serialization-input.cpp')
-rw-r--r--src/serialization-input.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/serialization-input.cpp b/src/serialization-input.cpp
new file mode 100644
index 0000000..e81665a
--- /dev/null
+++ b/src/serialization-input.cpp
@@ -0,0 +1,207 @@
+
+#include "serialization-input.hpp"
+
+#include "compile-time-assert.hpp"
+#include "pk.h"
+#include "scene.hpp"
+
+#include <cstring>
+
+pk_handle pke_serialize_input_action(srlztn_serialize_helper *h, PkeInputAction *action) {
+ char *s;
+ int len;
+ pke_kve kve{};
+ pke_kve_container kvec{};
+
+ kvec.srlztn_handle = h->handle_head;
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_INPUT_ACTION);
+ 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<40==sizeof(PkeInputAction)>();
+ {
+ kve.key = SRLZTN_INPUT_ACTION_NAME;
+ len = strlen(action->name)+1;
+ s = pk_new<char>(len, h->bkt);
+ sprintf(s, "%s", action->name);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ for (int i = 0; i < PKE_INPUT_ACTION_MASK_INDEX_COUNT; ++i) {
+ if (action->masks[i].computedHash == InputEventHash{0}) {
+ continue;
+ }
+ {
+ kve.key = SRLZTN_INPUT_ACTION_MASK_HASH;
+ len = snprintf(NULL, 0, "0x%.4hX", static_cast<InputEventHash_T>(action->masks[i].computedHash));
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "0x%.4hX", static_cast<InputEventHash_T>(action->masks[i].computedHash));
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ {
+ kve.key = SRLZTN_INPUT_ACTION_MASK_BUTTON;
+ len = snprintf(NULL, 0, "%i", action->masks[i].button);
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "%i", action->masks[i].button);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ {
+ kve.key = SRLZTN_INPUT_ACTION_MASK_MODS;
+ len = snprintf(NULL, 0, "%i", action->masks[i].mods);
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "%i", action->masks[i].mods);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ }
+
+ pk_arr_append_t(&h->kvp_containers, kvec);
+ return kvec.srlztn_handle;
+}
+
+void pke_deserialize_input_action(srlztn_deserialize_helper *h, pke_kve_container *kvec, PkeInputAction &action) {
+ (void)h;
+ uint32_t i;
+ int32_t mask_index = -1;
+ char *s;
+ pke_kve *kve = nullptr;
+ PK_STN_RES stn_res = PK_STN_RES(0);
+
+ compt_a<40==sizeof(PkeInputAction)>();
+ for (i = 0; i < kvec->arr.next; ++i) {
+ kve = &kvec->arr[i];
+ if (strncmp(kve->key, SRLZTN_INPUT_ACTION_NAME, strlen(SRLZTN_INPUT_ACTION_NAME)) == 0) {
+ // TODO specific bkt?
+ s = pk_new<char>(strlen(kve->val)+1, NULL);
+ sprintf(s, "%s", kve->key);
+ action.name = s;
+ continue;
+ }
+ if (strncmp(kve->key, SRLZTN_INPUT_ACTION_MASK_HASH, strlen(SRLZTN_INPUT_ACTION_MASK_HASH)) == 0) {
+ mask_index += 1;
+ assert(mask_index < PKE_INPUT_ACTION_MASK_INDEX_COUNT);
+ InputEventHash_T hash;
+ stn_res = pk_stn(&hash, kve->val, NULL, 16);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_INPUT_ACTION_MASK_HASH, kve->val);
+ continue;
+ }
+ action.masks[mask_index].computedHash = InputEventHash{hash};
+ continue;
+ }
+ if (strncmp(kve->key, SRLZTN_INPUT_ACTION_MASK_BUTTON, strlen(SRLZTN_INPUT_ACTION_MASK_BUTTON)) == 0) {
+ assert(mask_index >= 0);
+ assert(mask_index < PKE_INPUT_ACTION_MASK_INDEX_COUNT);
+ stn_res = pk_stn(&action.masks[mask_index].button, kve->val, NULL);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_INPUT_ACTION_MASK_BUTTON, kve->val);
+ }
+ continue;
+ }
+ if (strncmp(kve->key, SRLZTN_INPUT_ACTION_MASK_MODS, strlen(SRLZTN_INPUT_ACTION_MASK_MODS)) == 0) {
+ assert(mask_index >= 0);
+ assert(mask_index < PKE_INPUT_ACTION_MASK_INDEX_COUNT);
+ stn_res = pk_stn(&action.masks[mask_index].mods, kve->val, NULL);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_INPUT_ACTION_MASK_MODS, kve->val);
+ }
+ continue;
+ }
+ }
+}
+
+pk_handle pke_serialize_input_set(srlztn_serialize_helper *h, PkeInputSet *input_set) {
+ char *s;
+ int len;
+ pke_kve kve{};
+ pke_kve_container kvec{};
+
+ kvec.srlztn_handle = h->handle_head;
+ kvec.type_code = cstring_to_pk_cstr(SRLZTN_OBJ_INPUT_SET);
+ kvec.bkt = h->bkt;
+ kvec.arr.bkt = h->bkt;
+ kvec.children.bkt = h->bkt;
+ kvec.child_handles.bkt = h->bkt;
+ h->handle_head.itemIndex++;
+
+ for (int i = 0; i < input_set->actionCount; ++i) {
+ pk_handle child_handle = pke_serialize_input_action(h, &input_set->actions[i]);
+ pk_arr_append_t(&kvec.child_handles, child_handle);
+ }
+
+ compt_a<32==sizeof(PkeInputSet)>();
+ {
+ kve.key = SRLZTN_INPUT_SET_TITLE;
+ len = strlen(input_set->title)+1;
+ s = pk_new<char>(len, h->bkt);
+ sprintf(s, "%s", input_set->title);
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+ {
+ kve.key = SRLZTN_INPUT_SET_FLAGS;
+ len = snprintf(NULL, 0, "0x%.04X", static_cast<InputActionSetFlags_T>(input_set->flags));
+ s = pk_new<char>(len+1, h->bkt);
+ sprintf(s, "0x%.04X", static_cast<InputActionSetFlags_T>(input_set->flags));
+ kve.val = s;
+ kve.end = SRLZTN_KVE_END;
+ pk_arr_append_t(&kvec.arr, kve);
+ }
+
+ pk_arr_append_t(&h->kvp_containers, kvec);
+ return kvec.srlztn_handle;
+}
+
+void pke_deserialize_input_set(srlztn_deserialize_helper *h, pke_kve_container *kvec) {
+ (void)h;
+ uint32_t i, k;
+ char *s;
+ pke_kve *kve = nullptr;
+ PkeInputSet set{};
+ PK_STN_RES stn_res = PK_STN_RES(0);
+
+ // TODO specific bucket
+ set.actionCount = kvec->children.next;
+ set.actions = pk_new<PkeInputAction>(kvec->children.next, NULL);
+ for (k = 0; k < set.actionCount; ++k) {
+ pke_deserialize_input_action(h, kvec->children[k], set.actions[k]);
+ }
+
+ compt_a<40==sizeof(PkeInputAction)>();
+ for (i = 0; i < kvec->arr.next; ++i) {
+ kve = &kvec->arr[i];
+ if (strncmp(kve->key, SRLZTN_INPUT_SET_TITLE, strlen(SRLZTN_INPUT_SET_TITLE)) == 0) {
+ // TODO specific bkt?
+ s = pk_new<char>(strlen(kve->val)+1, NULL);
+ sprintf(s, "%s", kve->key);
+ set.title = s;
+ continue;
+ }
+ if (strncmp(kve->key, SRLZTN_INPUT_SET_FLAGS, strlen(SRLZTN_INPUT_SET_FLAGS)) == 0) {
+ InputActionSetFlags_T flags;
+ stn_res = pk_stn(&flags, kve->val, NULL, 16);
+ if (stn_res != PK_STN_RES_SUCCESS) {
+ fprintf(stderr, "[%s] Err '%u' parsing '%s' primary from: '%s'\n", __FILE__, stn_res, SRLZTN_INPUT_SET_FLAGS, kve->val);
+ continue;
+ }
+ set.flags = InputActionSetFlags{flags};
+ continue;
+ }
+ }
+
+ InputActionSetHandle action_set_handle = PkeInput_RegisterSet(set);
+ pke_scene_register_input_action_set(h->scene->scene_handle, action_set_handle);
+ if (PK_HAS_FLAG(set.flags, PKE_INPUT_ACTION_SET_FLAG_AUTO_ENABLE)) {
+ PkeInput_ActivateSet(action_set_handle);
+ }
+}