From 89f2f5cefee1a107330bbf93048f7da73f5754f7 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 25 Jul 2025 16:08:55 -0700 Subject: [PATCH] (Web port) Improve loading UX for HD Textures (#648) --- ISLE/emscripten/events.cpp | 8 ++++++++ ISLE/emscripten/events.h | 1 + ISLE/emscripten/filesystem.cpp | 18 ++++++++++++++++++ extensions/include/extensions/textureloader.h | 2 ++ extensions/src/textureloader.cpp | 5 +++++ 5 files changed, 34 insertions(+) diff --git a/ISLE/emscripten/events.cpp b/ISLE/emscripten/events.cpp index 5cf67e51..436c1b64 100644 --- a/ISLE/emscripten/events.cpp +++ b/ISLE/emscripten/events.cpp @@ -36,3 +36,11 @@ void Emscripten_SendPresenterProgress(MxDSAction* p_action, MxPresenter::TickleS Emscripten_SendEvent("presenterProgress", buf); } + +void Emscripten_SendExtensionProgress(const char* p_extension, MxU32 p_progress) +{ + char buf[128]; + SDL_snprintf(buf, sizeof(buf), "{\"name\": \"%s\", \"progress\": %d}", p_extension, p_progress); + + Emscripten_SendEvent("extensionProgress", buf); +} diff --git a/ISLE/emscripten/events.h b/ISLE/emscripten/events.h index fac59cad..a22d7b55 100644 --- a/ISLE/emscripten/events.h +++ b/ISLE/emscripten/events.h @@ -4,5 +4,6 @@ #include "mxpresenter.h" void Emscripten_SendPresenterProgress(MxDSAction* p_action, MxPresenter::TickleState p_tickleState); +void Emscripten_SendExtensionProgress(const char* p_extension, MxU32 p_progress); #endif // EMSCRIPTEN_EVENTS_H diff --git a/ISLE/emscripten/filesystem.cpp b/ISLE/emscripten/filesystem.cpp index 1c21cb03..740802b8 100644 --- a/ISLE/emscripten/filesystem.cpp +++ b/ISLE/emscripten/filesystem.cpp @@ -1,5 +1,6 @@ #include "filesystem.h" +#include "events.h" #include "extensions/textureloader.h" #include "legogamestate.h" #include "misc.h" @@ -73,6 +74,15 @@ void Emscripten_SetupFilesystem() } }; + const auto preloadFile = [](const char* p_path) -> bool { + size_t length = 0; + void* data = SDL_LoadFile(p_path, &length); + if (data) { + SDL_free(data); + } + return length > 0; + }; + for (const char* file : g_files) { registerFile(file); } @@ -84,9 +94,17 @@ void Emscripten_SetupFilesystem() Extensions::TextureLoader::options["texture loader:texture path"] = directory.GetData(); wasmfs_create_directory(directory.GetData(), 0644, fetchfs); + MxU32 i = 0; + Emscripten_SendExtensionProgress("HD Textures", 0); for (const char* file : g_textures) { MxString path = directory + "/" + file + ".bmp"; registerFile(path.GetData()); + + if (!preloadFile(path.GetData())) { + Extensions::TextureLoader::excludedFiles.emplace_back(file); + } + + Emscripten_SendExtensionProgress("HD Textures", (++i * 100) / sizeOfArray(g_textures)); } } #endif diff --git a/extensions/include/extensions/textureloader.h b/extensions/include/extensions/textureloader.h index 38cfc639..a318c9b8 100644 --- a/extensions/include/extensions/textureloader.h +++ b/extensions/include/extensions/textureloader.h @@ -5,6 +5,7 @@ #include #include +#include namespace Extensions { @@ -14,6 +15,7 @@ public: static bool PatchTexture(LegoTextureInfo* p_textureInfo); static std::map options; + static std::vector excludedFiles; static bool enabled; static constexpr std::array, 1> defaults = { diff --git a/extensions/src/textureloader.cpp b/extensions/src/textureloader.cpp index 1c6ed9b3..3fbf0f7d 100644 --- a/extensions/src/textureloader.cpp +++ b/extensions/src/textureloader.cpp @@ -3,6 +3,7 @@ using namespace Extensions; std::map TextureLoader::options; +std::vector TextureLoader::excludedFiles; bool TextureLoader::enabled = false; void TextureLoader::Initialize() @@ -97,6 +98,10 @@ bool TextureLoader::PatchTexture(LegoTextureInfo* p_textureInfo) SDL_Surface* TextureLoader::FindTexture(const char* p_name) { + if (std::find(excludedFiles.begin(), excludedFiles.end(), p_name) != excludedFiles.end()) { + return nullptr; + } + SDL_Surface* surface; const char* texturePath = options["texture loader:texture path"].c_str(); MxString path = MxString(MxOmni::GetHD()) + texturePath + "/" + p_name + ".bmp";