diff options
| author | skal <pascal.massimino@gmail.com> | 2026-03-08 09:33:17 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-03-08 09:33:17 +0100 |
| commit | a2f0f7c7a45ba8b30984fb135b8b54f11fb119f8 (patch) | |
| tree | 794527d25368227320e5f6aebe409178296db391 /src/util | |
| parent | 9d114ae4fec465baed381de7782ef42ca77e734b (diff) | |
feat: Implement dual-mode asset loading and update documentation
This commit introduces a dual-mode asset loading system to enhance developer workflow and optimize release builds.
Key changes include:
- **Dual-Mode Asset Loading:** Assets are now loaded from disk during development (when is OFF) for faster iteration, particularly for heavy assets like and files. For release builds ( ON), all assets are embedded directly into the binary, ensuring a single, self-contained executable.
- **Explicit Asset Typing:** Replaced generic asset type with specific types (, , , , ) in and the enum in for clearer categorization and more robust processing.
- **Build System Integration:** Modified to pass a flag to in development builds.
- **Asset Packer Updates:** now generates file paths for disk-loaded assets and embeds data for others based on the build mode.
- **Asset Manager Enhancements:** includes new logic in for loading and caching disk-based assets and updates to for proper memory deallocation.
- **Documentation:** Updated to reflect the new asset nomenclature and dual-mode loading strategy.
- **Project Rules:** Added a concise rule to mandating top-level documentation updates for medium/large sub-system changes.
handoff(Gemini): Implemented dual-mode asset loading and updated documentation.
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/asset_manager.cc | 41 | ||||
| -rw-r--r-- | src/util/asset_manager.h | 8 |
2 files changed, 47 insertions, 2 deletions
diff --git a/src/util/asset_manager.cc b/src/util/asset_manager.cc index 2285f3a..52a60ee 100644 --- a/src/util/asset_manager.cc +++ b/src/util/asset_manager.cc @@ -76,6 +76,39 @@ const uint8_t* GetAsset(AssetId asset_id, size_t* out_size) { AssetRecord source_record = assets[index]; +#if !defined(DEMO_STRIP_ALL) + if (source_record.type == AssetType::SPEC || + source_record.type == AssetType::MP3) { + const char* path = (const char*)source_record.data; + FILE* f = fopen(path, "rb"); + if (!f) { + if (out_size) + *out_size = 0; + return nullptr; + } + fseek(f, 0, SEEK_END); + long size = ftell(f); + fseek(f, 0, SEEK_SET); + uint8_t* buffer = new (std::nothrow) uint8_t[size + 1]; + if (!buffer) { + fclose(f); + if (out_size) + *out_size = 0; + return nullptr; + } + fread(buffer, 1, size, f); + fclose(f); + buffer[size] = 0; // Null-terminate + + g_asset_cache[index].data = buffer; + g_asset_cache[index].size = size; + g_asset_cache[index].type = source_record.type; + if (out_size) + *out_size = size; + return buffer; + } +#endif + AssetRecord cached_record = source_record; if (source_record.type == AssetType::PROC || @@ -188,6 +221,14 @@ void DropAsset(AssetId asset_id, const uint8_t* asset) { delete[] g_asset_cache[index].data; g_asset_cache[index] = {}; // Zero out the struct to force re-generation } +#if !defined(DEMO_STRIP_ALL) + if (g_asset_cache[index].data == asset && + (g_asset_cache[index].type == AssetType::SPEC || + g_asset_cache[index].type == AssetType::MP3)) { + delete[] g_asset_cache[index].data; + g_asset_cache[index] = {}; + } +#endif // For static assets, no dynamic memory to free. } diff --git a/src/util/asset_manager.h b/src/util/asset_manager.h index 5380257..786a8db 100644 --- a/src/util/asset_manager.h +++ b/src/util/asset_manager.h @@ -6,10 +6,14 @@ #include "asset_manager_dcl.h" enum class AssetType : uint8_t { - STATIC, + WGSL, + SPEC, + TEXTURE, + MESH, + BINARY, + MP3, PROC, PROC_GPU, - MP3 }; struct AssetRecord { |
