summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-08-05 19:07:06 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-08-06 17:00:26 -0400
commit9a48fc73d7a25685fc7917c3edc271f595e093da (patch)
tree0f400205af7d419e9f4fb40ebd3ad1db12c49219 /src
parentf7d860cee74ad3b94e0d15ea157783b7760f6d55 (diff)
pke: first-pass add asset details
Diffstat (limited to 'src')
-rw-r--r--src/asset-manager.cpp32
-rw-r--r--src/asset-manager.hpp24
-rw-r--r--src/font.cpp8
-rw-r--r--src/project.cpp33
4 files changed, 77 insertions, 20 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp
index f0f6d5e..27fbf67 100644
--- a/src/asset-manager.cpp
+++ b/src/asset-manager.cpp
@@ -28,14 +28,14 @@ AssetKey EngineDefinedAssets[EngineDefinedAssetCount] = {
void AM_Init() {
new (&asset_mstr.bc) pk_bkt_arr_t<Asset>{ pk_bkt_arr_handle_MAX_constexpr };
asset_mstr.thread_pool = PkeThreads_Init(2, 255);
- AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv");
- AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv");
- AM_Register(EngineDefinedAssets[2], PKE_ASSET_TYPE_SHADER, "assets/shaders/vertex.vert.spv");
- AM_Register(EngineDefinedAssets[3], PKE_ASSET_TYPE_SHADER, "assets/shaders/texture.frag.spv");
- AM_Register(EngineDefinedAssets[4], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.vert.spv");
- AM_Register(EngineDefinedAssets[5], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.frag.spv");
- AM_Register(EngineDefinedAssets[6], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.vert.spv");
- AM_Register(EngineDefinedAssets[7], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.frag.spv");
+ AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv", nullptr);
+ AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv", nullptr);
+ AM_Register(EngineDefinedAssets[2], PKE_ASSET_TYPE_SHADER, "assets/shaders/vertex.vert.spv", nullptr);
+ AM_Register(EngineDefinedAssets[3], PKE_ASSET_TYPE_SHADER, "assets/shaders/texture.frag.spv", nullptr);
+ AM_Register(EngineDefinedAssets[4], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.vert.spv", nullptr);
+ AM_Register(EngineDefinedAssets[5], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.frag.spv", nullptr);
+ AM_Register(EngineDefinedAssets[6], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.vert.spv", nullptr);
+ AM_Register(EngineDefinedAssets[7], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.frag.spv", nullptr);
}
void AM_Load_Task(Asset &asset) {
@@ -65,7 +65,7 @@ inline Asset *AM_Get_Inner(const char (&key)[AssetKeyLength]) {
return &asset_mstr.bc[handle];
}
-AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment) {
+AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment, union pke_asset_details *details) {
assert(data != nullptr && "Attempt to register invalid asset data");
assert(data != CAFE_BABE(void) && "Attempt to register invalid asset data");
assert(size != 0 && "Attempt to register asset data of size 0");
@@ -76,6 +76,8 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, i
AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)};
Asset &asset = asset_mstr.bc[assetHandle];
new (&asset) Asset{};
+ memset(&asset.details, 0, sizeof(union pke_asset_details));
+ if (details != nullptr) asset.details = *details;
asset.handle = assetHandle;
strncpy(asset.key, key, AssetKeyLength);
asset.basePath = nullptr;
@@ -88,7 +90,7 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, i
return assetHandle;
}
-AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) {
+AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path, union pke_asset_details *details) {
Asset *searchedAsset = AM_Get_Inner(key);
if (searchedAsset != nullptr) {
return searchedAsset->handle;
@@ -96,6 +98,8 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) {
AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)};
Asset &asset = asset_mstr.bc[assetHandle];
new (&asset) Asset{};
+ memset(&asset.details, 0, sizeof(union pke_asset_details));
+ if (details != nullptr) asset.details = *details;
asset.handle = assetHandle;
strncpy(asset.key, key, AssetKeyLength);
int64_t pathLen = strlen(path);
@@ -114,7 +118,7 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) {
return assetHandle;
}
-AssetHandle AM_Register(const char *path, AssetType type) {
+AssetHandle AM_Register(const char *path, AssetType type, union pke_asset_details *details) {
NULL_CHAR_ARR(assetKey, AssetKeyLength);
int64_t pathLen = strlen(path);
int64_t pathOffset = (pathLen > AssetKeyLength ? pathLen - AssetKeyLength : 0);
@@ -128,6 +132,8 @@ AssetHandle AM_Register(const char *path, AssetType type) {
AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)};
Asset &asset = asset_mstr.bc[assetHandle];
new (&asset) Asset{};
+ memset(&asset.details, 0, sizeof(union pke_asset_details));
+ if (details != nullptr) asset.details = *details;
asset.handle = assetHandle;
strncpy(asset.key, assetKey, AssetKeyLength);
auto *copiedPath = pk_new_arr<char>(pathLen + 1);
@@ -145,7 +151,7 @@ AssetHandle AM_Register(const char *path, AssetType type) {
return assetHandle;
}
-AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size) {
+AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size, union pke_asset_details *details) {
assert(data != nullptr && "Attempt to register invalid asset data");
assert(data != CAFE_BABE(void) && "Attempt to register invalid asset data");
assert(size != 0 && "Attempt to register asset data of size 0");
@@ -156,6 +162,8 @@ AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *
AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)};
Asset &asset = asset_mstr.bc[assetHandle];
new (&asset) Asset{};
+ memset(&asset.details, 0, sizeof(union pke_asset_details));
+ if (details != nullptr) asset.details = *details;
asset.handle = assetHandle;
strncpy(asset.key, key, AssetKeyLength);
asset.basePath = nullptr;
diff --git a/src/asset-manager.hpp b/src/asset-manager.hpp
index bf065f2..a50aeac 100644
--- a/src/asset-manager.hpp
+++ b/src/asset-manager.hpp
@@ -36,6 +36,21 @@ const AssetFlags PKE_ASSET_FLAGS_MEM_STATIC = AssetFlags {0x01};
constexpr int64_t EngineDefinedAssetCount = 8;
extern AssetKey EngineDefinedAssets[EngineDefinedAssetCount];
+union pke_asset_details {
+ struct pke_asset_details_shader {
+ } shader;
+ struct pke_asset_details_model {
+ } model;
+ struct pke_asset_details_texture {
+ uint32_t width;
+ uint32_t height;
+ } texture;
+ struct pke_asset_details_audio {
+ } audio;
+ struct pke_asset_details_font {
+ } font;
+};
+
struct Asset {
AssetHandle handle{};
AssetKey key = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
@@ -47,13 +62,14 @@ struct Asset {
AssetLoadingState state = PKE_ASSET_LOADING_STATE_UNLOADED;
AssetType type = PKE_ASSET_TYPE_UNSET;
AssetFlags flags = PKE_ASSET_FLAGS_NONE;
+ union pke_asset_details details;
};
void AM_Init();
-AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment);
-AssetHandle AM_Register(const char *path, AssetType type);
-AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path);
-AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size);
+AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment, union pke_asset_details *details = nullptr);
+AssetHandle AM_Register(const char *path, AssetType type, union pke_asset_details *details = nullptr);
+AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path, union pke_asset_details *details = nullptr);
+AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size, union pke_asset_details *details = nullptr);
void AM_Release(AssetHandle assetHandle);
const Asset *AM_Get(AssetHandle assetHandle);
const AssetHandle AM_GetHandle(const AssetKey &key);
diff --git a/src/font.cpp b/src/font.cpp
index deaf956..26004e3 100644
--- a/src/font.cpp
+++ b/src/font.cpp
@@ -252,9 +252,15 @@ void FontType_Init() {
ft->glyphs = nullptr;
ft->renders = nullptr;
}
+ union pke_asset_details ak_img_details {
+ .texture = {
+ .width = 952,
+ .height = 952,
+ },
+ };
AssetKey ak_img = "fnt_mquin_img\0\0";
AssetKey ak_glyphs = "fnt_mquin_gly\0\0";
- AssetHandle ah_img = AM_Register_Static(ak_img, PKE_ASSET_TYPE_TEXTURE, embedded_fonts[0].data, embedded_fonts[0].size);
+ AssetHandle ah_img = AM_Register_Static(ak_img, PKE_ASSET_TYPE_TEXTURE, embedded_fonts[0].data, embedded_fonts[0].size, &ak_img_details);
AssetHandle ah_glyphs = AM_Register_Static(ak_glyphs, PKE_ASSET_TYPE_UNSET, embedded_fonts[1].data, embedded_fonts[1].size);
FontTypeMSDFSettings msdf_s;
msdf_s.minimum_scale = 144;
diff --git a/src/project.cpp b/src/project.cpp
index 0669c75..cf774a1 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -3,6 +3,7 @@
#include "asset-manager.hpp"
#include "components.hpp"
+#include "pk.h"
#include "plugins.hpp"
#include "entities.hpp"
#include "helpers.hpp"
@@ -46,6 +47,8 @@ const char* const PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_MASK = "B
const char* const PKE_PROJ_FILE_ASSET_KEY = "Asset::Key: ";
const char* const PKE_PROJ_FILE_ASSET_BASE_PATH = "Asset::BasePath: ";
const char* const PKE_PROJ_FILE_ASSET_TYPE = "Asset::Type: ";
+const char* const PKE_PROJ_FILE_ASSET_TXTR_WIDTH = "Asset::Width: ";
+const char* const PKE_PROJ_FILE_ASSET_TXTR_HEIGHT = "Asset::Height: ";
/*
void Proj_SerializeProjectSettings(std::ostream &stream) {
@@ -124,6 +127,15 @@ void Proj_SerializeAsset(std::ostream &stream, const Asset &asset) {
if (asset.type != a.type) {
stream << PKE_PROJ_FILE_ASSET_TYPE << static_cast<uint64_t>(asset.type) << std::endl;
}
+ switch (asset.type) {
+ case PKE_ASSET_TYPE_TEXTURE:
+ stream << PKE_PROJ_FILE_ASSET_TXTR_WIDTH << asset.details.texture.width << std::endl;
+ stream << PKE_PROJ_FILE_ASSET_TXTR_HEIGHT << asset.details.texture.height << std::endl;
+ break;
+ default:
+ /* no-op */
+ break;
+ }
}
/*
@@ -295,15 +307,18 @@ void Proj_DeserializeEntityType(std::istream &stream) {
void Proj_DeserializeAssset(std::istream &stream) {
size_t prefixLen, strLen;
AssetKey keyStr;
+ union pke_asset_details details;
+ memset(&details, 0, sizeof(union pke_asset_details));
keyStr[AssetKeyLength-1] = '\0';
const size_t path_len = 256;
char basePath[path_len];
basePath[0] = '\0';
basePath[path_len-1] = '\0';
AssetType at{PKE_ASSET_TYPE_UNSET};
+ PK_STN_RES result;
while (memset(projReadLine, 0, projReadLineLength), stream.getline(projReadLine, projReadLineLength)) {
if (strcmp(projReadLine, PKE_PROJ_FILE_OBJ_END) == 0) {
- AM_Register(keyStr, at, basePath);
+ AM_Register(keyStr, at, basePath, &details);
return;
}
if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_KEY) != nullptr) {
@@ -322,9 +337,21 @@ void Proj_DeserializeAssset(std::istream &stream) {
if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TYPE) != nullptr) {
prefixLen = strlen(PKE_PROJ_FILE_ASSET_TYPE);
AssetType_T val{};
- STR2NUM_ERROR result = str2num(val, projReadLine + prefixLen);
+ result = pk_stn<AssetType_T>(&val, projReadLine + prefixLen, nullptr);
at = AssetType{val};
- assert(result == STR2NUM_ERROR::SUCCESS);
+ assert(result == PK_STN_RES_SUCCESS);
+ continue;
+ }
+ if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TXTR_WIDTH) != nullptr) {
+ prefixLen = strlen(PKE_PROJ_FILE_ASSET_TXTR_WIDTH);
+ result = pk_stn<uint32_t>(&details.texture.width, projReadLine + prefixLen, nullptr);
+ assert(result == PK_STN_RES_SUCCESS);
+ continue;
+ }
+ if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TXTR_HEIGHT) != nullptr) {
+ prefixLen = strlen(PKE_PROJ_FILE_ASSET_TXTR_HEIGHT);
+ result = pk_stn<uint32_t>(&details.texture.height, projReadLine + prefixLen, nullptr);
+ assert(result == PK_STN_RES_SUCCESS);
continue;
}
}