From b6dbcb41439db92f09044aa7b1c4b2c165fb383b Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Sun, 4 Jan 2026 04:08:22 -0600 Subject: [PATCH 01/15] start on asset refactor --- Encore/src/assets.cpp | 83 +++++++++++++++++++++++++++++++++++++ Encore/src/assets.h | 95 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 7ccbd5cf..ccf8a4e1 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -6,7 +6,90 @@ #include #include "raygui.h" +#include +#include + class Assets; +class Asset; + +void Asset::CheckForFetch() { + switch (state) { + case UNLOADED: + Load(); + std::cout << "Warning: Asset" << id << " was fetched while unloaded. Loading on render thread..."; + break; + case LOADING: + loadingThread.join(); + std::cout << "Warning: Asset " << id << " was fetched before it was done loading. Waiting for loading to be finished..."; + break; + case PREFINALIZED: + Finalize(); + break; + } +} + +void Asset::StartLoad() { + if (state == UNLOADED) { + state = LOADING; + loadingThread = std::thread([this](){Asset::Load();}); + } +} + +void FileAsset::LoadFile() { + std::ifstream file(GetPath(), std::ios::binary | std::ios::ate); + fileSize = file.tellg(); + file.seekg(0, std::ios::beg); + + fileBuffer = (char*)malloc(fileSize); + file.read(fileBuffer, fileSize); + file.close(); +} + +void FileAsset::FreeFileBuffer() { + free(fileBuffer); +} + +void FileAsset::Load() { + LoadFile(); + state = LOADED; +} + +char *FileAsset::FetchRaw() { + CheckForFetch(); + return fileBuffer; +} + +void TextureAsset::Load() { + LoadFile(); + auto image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + tex = LoadTextureFromImage(image); + if (filter) { + GenTextureMipmaps(&tex); + SetTextureFilter(tex, TEXTURE_FILTER_TRILINEAR); + } + UnloadImage(image); + FreeFileBuffer(); + state = LOADED; +} + +void FontAsset::Load() { + LoadFile(); + font = LoadFontFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize, fontSize, nullptr, 250); + font.baseSize = fontSize; + font.glyphCount = 250; + font.glyphs = LoadFontData((const unsigned char*)fileBuffer, fileSize, fontSize, nullptr, 250, FONT_SDF); + Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, 250, fontSize, 4, 0); + font.texture = LoadTextureFromImage(atlas); + UnloadImage(atlas); + SetTextureFilter(font.texture, TEXTURE_FILTER_TRILINEAR); + state = LOADED; +} + +void Assets::RegisterAllAssets() { + RegisterAsset(new TextureAsset("encore-white.png", true)); + RegisterAsset(new FontAsset("fonts/Rubik-Regular.ttf", 128)); + RegisterAsset(new FontAsset("fonts/JetBrainsMonoNL-Regular.ttf", 64)); +} Texture2D Assets::LoadTextureFilter(const std::filesystem::path &texturePath, int &loadedAssets) { diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 37578547..68ed706b 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -2,9 +2,96 @@ #include "raylib.h" #include "menus/uiUnits.h" +#include +#include #include +#include +#include #include +enum AssetState { + UNLOADED, + LOADING, + PREFINALIZED, + LOADED +}; + + +class Asset { + virtual void StartLoad(); + virtual void Load(); + virtual void Finalize(); +public: + std::atomic state = UNLOADED; + std::string id; + std::thread loadingThread ; + Asset(const std::string &id) { + this->id = id; + } + + /// Checks if this asset is loaded. Only use in the render thread! + void CheckForFetch(); + + /// Call when you're polling the asset's for when it's loaded. + bool CanFetch() const { + return state == LOADED || state == PREFINALIZED; + } + +}; + +class FileAsset : public Asset { + std::filesystem::path path; +protected: + char *fileBuffer; + size_t fileSize; + void LoadFile(); + virtual void Load(); + void FreeFileBuffer(); + +public: + FileAsset(const std::string &id) : Asset(id) { + path = std::filesystem::path("Assets") / id; + } + std::filesystem::path &GetPath() { + return path; + } + char *FetchRaw(); +}; + +class TextureAsset : public FileAsset { + Texture2D tex; + virtual void Load(); + bool filter; +public: + TextureAsset(const std::string &id, bool filter) : FileAsset(id) { + this->filter = filter; + } + Texture2D Fetch() { + CheckForFetch(); + return tex; + } + operator Texture2D() { + return Fetch(); + } +}; + +class FontAsset : public FileAsset { + Font font; + int fontSize; + virtual void Load(); +public: + FontAsset(const std::string &id, int fontSize) : FileAsset(id) { + this->fontSize = fontSize; + } + Font Fetch() { + CheckForFetch(); + return font; + } + operator Font() { + return Fetch(); + } +}; + class Assets { private: Assets() {} @@ -12,8 +99,16 @@ class Assets { std::filesystem::path directory = GetPrevDirectoryPath(GetApplicationDirectory()); Font LoadFontFilter(const std::filesystem::path &fontPath, int fontSize, int &loadedAssets); + std::map assetMap = {}; public: + Asset *RegisterAsset(Asset *asset) { + assetMap.emplace(asset->id, asset); + } + + void RegisterAllAssets(); + + static Assets &getInstance() { static Assets instance; // This is the single instance return instance; From 68fda3e7e8d06a45056c095dd2677ddbba5c2e62 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Mon, 5 Jan 2026 01:28:34 -0600 Subject: [PATCH 02/15] Make font and texture assets work, asset sets --- Encore/src/assets.cpp | 55 ++++++++++++++++++++++++----- Encore/src/assets.h | 80 +++++++++++++++++++++++++++++++++++++++++-- Encore/src/main.cpp | 13 ++++--- 3 files changed, 133 insertions(+), 15 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index ccf8a4e1..f512ec5d 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -5,6 +5,7 @@ #include "assets.h" #include #include "raygui.h" +#include "util/enclog.h" #include #include @@ -16,13 +17,18 @@ void Asset::CheckForFetch() { switch (state) { case UNLOADED: Load(); - std::cout << "Warning: Asset" << id << " was fetched while unloaded. Loading on render thread..."; + Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was fetched before it was loaded. Loading immediately on main thread...", id.c_str())); break; case LOADING: - loadingThread.join(); - std::cout << "Warning: Asset " << id << " was fetched before it was done loading. Waiting for loading to be finished..."; + Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was fetched while it is being loaded. Blocking until it is loaded...", id.c_str())); + while (state == LOADING) {} // spin spin spin + if (state == PREFINALIZED) { + Encore::EncoreLog(LOG_INFO, TextFormat("Finalizing asset %s...", id.c_str())); + Finalize(); + } break; case PREFINALIZED: + Encore::EncoreLog(LOG_INFO, TextFormat("Finalizing asset %s...", id.c_str())); Finalize(); break; } @@ -31,10 +37,20 @@ void Asset::CheckForFetch() { void Asset::StartLoad() { if (state == UNLOADED) { state = LOADING; - loadingThread = std::thread([this](){Asset::Load();}); + loadingThread = std::thread([this](){this->Load();}); + loadingThread.detach(); + //Encore::EncoreLog(LOG_INFO, TextFormat("Loading asset %s...", id.c_str())); + } else { + Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was double loaded.", id.c_str())); } } +void Asset::LoadImmediate() { + Encore::EncoreLog(LOG_INFO, TextFormat("Loading asset %s immediately...", id.c_str())); + StartLoad(); + while (state == LOADING) {} +} + void FileAsset::LoadFile() { std::ifstream file(GetPath(), std::ios::binary | std::ios::ate); fileSize = file.tellg(); @@ -54,6 +70,10 @@ void FileAsset::Load() { state = LOADED; } +size_t FileAsset::GetFileSize() { + CheckForFetch(); + return fileSize; +} char *FileAsset::FetchRaw() { CheckForFetch(); return fileBuffer; @@ -61,24 +81,42 @@ char *FileAsset::FetchRaw() { void TextureAsset::Load() { LoadFile(); - auto image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + FreeFileBuffer(); + state = PREFINALIZED; +} + +void TextureAsset::Finalize() { tex = LoadTextureFromImage(image); if (filter) { GenTextureMipmaps(&tex); SetTextureFilter(tex, TEXTURE_FILTER_TRILINEAR); } UnloadImage(image); - FreeFileBuffer(); state = LOADED; } void FontAsset::Load() { + auto start = std::chrono::high_resolution_clock::now(); LoadFile(); - font = LoadFontFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize, fontSize, nullptr, 250); + font = {}; font.baseSize = fontSize; font.glyphCount = 250; + font.glyphPadding = 4; font.glyphs = LoadFontData((const unsigned char*)fileBuffer, fileSize, fontSize, nullptr, 250, FONT_SDF); - Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, 250, fontSize, 4, 0); + atlas = GenImageFontAtlas(font.glyphs, &font.recs, 250, fontSize, 4, 0); + for (int i = 0; i < font.glyphCount; i++) + { + UnloadImage(font.glyphs[i].image); + font.glyphs[i].image = ImageFromImage(atlas, font.recs[i]); + } + FreeFileBuffer(); + auto end = std::chrono::high_resolution_clock::now(); + Encore::EncoreLog(LOG_INFO, TextFormat("Generated font data for %s in %i microseconds.", id.c_str(), (std::chrono::duration_cast(end - start).count()))); + state = PREFINALIZED; +} + +void FontAsset::Finalize() { font.texture = LoadTextureFromImage(atlas); UnloadImage(atlas); SetTextureFilter(font.texture, TEXTURE_FILTER_TRILINEAR); @@ -86,6 +124,7 @@ void FontAsset::Load() { } void Assets::RegisterAllAssets() { + RegisterAsset(new FileAsset("encore_favicon-NEW.png")); RegisterAsset(new TextureAsset("encore-white.png", true)); RegisterAsset(new FontAsset("fonts/Rubik-Regular.ttf", 128)); RegisterAsset(new FontAsset("fonts/JetBrainsMonoNL-Regular.ttf", 64)); diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 68ed706b..8921590a 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -18,9 +18,9 @@ enum AssetState { class Asset { - virtual void StartLoad(); - virtual void Load(); - virtual void Finalize(); +protected: + virtual void Load() {} + virtual void Finalize() {} public: std::atomic state = UNLOADED; std::string id; @@ -29,6 +29,11 @@ class Asset { this->id = id; } + /// Starts loading this asset. + virtual void StartLoad(); + + /// Starts loading this asset and blocks until it is loaded. + virtual void LoadImmediate(); /// Checks if this asset is loaded. Only use in the render thread! void CheckForFetch(); @@ -55,12 +60,18 @@ class FileAsset : public Asset { std::filesystem::path &GetPath() { return path; } + size_t GetFileSize(); char *FetchRaw(); + operator const unsigned char*() { + return (const unsigned char *)FetchRaw(); + } }; class TextureAsset : public FileAsset { Texture2D tex; + Image image; virtual void Load(); + virtual void Finalize(); bool filter; public: TextureAsset(const std::string &id, bool filter) : FileAsset(id) { @@ -78,7 +89,9 @@ class TextureAsset : public FileAsset { class FontAsset : public FileAsset { Font font; int fontSize; + Image atlas; virtual void Load(); + virtual void Finalize(); public: FontAsset(const std::string &id, int fontSize) : FileAsset(id) { this->fontSize = fontSize; @@ -104,10 +117,16 @@ class Assets { public: Asset *RegisterAsset(Asset *asset) { assetMap.emplace(asset->id, asset); + return asset; } void RegisterAllAssets(); + template static A *Get(const std::string &id) { + Assets &instance = getInstance(); + return static_cast(instance.assetMap.at(id)); + } + static Assets &getInstance() { static Assets instance; // This is the single instance @@ -353,3 +372,58 @@ class Assets { void FirstAssets(); void LoadAssets(); }; + +/// Used for easily loading groups of assets and polling their state as one. +class AssetSet { + std::vector assets; +public: + + AssetSet(std::initializer_list l) { + const auto names = std::vector(l); + assets.reserve(l.size()); + for (int i = 0; i < l.size(); i++) { + assets.push_back(Assets::Get(names[i])); + } + } + + void StartLoad() { + for (int i = 0; i < assets.size(); i++) { + auto asset = assets[i]; + if (asset->state == UNLOADED) { + asset->StartLoad(); + } + } + } + + bool PollLoaded() { + for (int i = 0; i < assets.size(); i++) { + auto asset = assets[i]; + if (!asset->CanFetch()) { + return false; + } + } + return true; + } + + int CountLoaded() { + int loaded = 0; + for (int i = 0; i < assets.size(); i++) { + if (assets[i]->CanFetch()) { + loaded++; + } + } + return loaded; + } + + int AssetCount() { + return assets.size(); + } + + float GetProgress() { + return static_cast(CountLoaded()) / static_cast(AssetCount()); + } + + void BlockUntilLoaded() { + while (!PollLoaded()) {} + } +}; \ No newline at end of file diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index d6b15efb..f339b7c6 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -172,9 +172,15 @@ int main(int argc, char *argv[]) { SETDEFAULTSTYLE(); SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); - assets.FirstAssets(); - SetWindowIcon(assets.icon); - GuiSetFont(assets.rubik); + assets.RegisterAllAssets(); + AssetSet initialSet = {"encore_favicon-NEW.png", "fonts/Rubik-Regular.ttf", "fonts/JetBrainsMonoNL-Regular.ttf", "encore-white.png"}; + initialSet.StartLoad(); + initialSet.BlockUntilLoaded(); + auto icon = Assets::Get("encore_favicon-NEW.png"); + SetWindowIcon(LoadImageFromMemory(".png", *icon, icon->GetFileSize())); + assets.rubik = *Assets::Get("fonts/Rubik-Regular.ttf"); + assets.JetBrainsMono = *Assets::Get("fonts/JetBrainsMonoNL-Regular.ttf"); + assets.encoreWhiteLogo = *Assets::Get("encore-white.png"); assets.LoadAssets(); TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; @@ -186,7 +192,6 @@ int main(int argc, char *argv[]) { Encore::EncoreLog(LOG_INFO, TextFormat("Unlocked framerate.")); TheFrameManager.removeFPSLimit = true; } - // audioManager.loadSample("Assets/highway/clap.mp3", "clap"); while (!WindowShouldClose()) { u.calcUnits(); From b3cd8d298683c82e5f0a21a015150e78d2f7182d Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Mon, 5 Jan 2026 01:48:53 -0600 Subject: [PATCH 03/15] optimize original font code a bit --- Encore/src/assets.cpp | 10 ++++++++-- Encore/src/assets.h | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index f512ec5d..82524d76 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -147,13 +147,19 @@ Model Assets::LoadModel_(const std::filesystem::path &modelPath, int &loadedAsse Font Assets::LoadFontFilter( const std::filesystem::path &fontPath, int fontSize, int &loadedAssets ) { - Font font = LoadFontEx(fontPath.string().c_str(), fontSize, nullptr, 250); + Font font = {}; font.baseSize = fontSize; font.glyphCount = 250; + font.glyphPadding = 4; int fileSize = 0; unsigned char *fileData = LoadFileData(fontPath.string().c_str(), &fileSize); - font.glyphs = LoadFontData(fileData, fileSize, fontSize, 0, 250, FONT_SDF); + font.glyphs = LoadFontData((const unsigned char*)fileData, fileSize, fontSize, nullptr, 250, FONT_SDF); Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, 250, fontSize, 4, 0); + for (int i = 0; i < font.glyphCount; i++) + { + UnloadImage(font.glyphs[i].image); + font.glyphs[i].image = ImageFromImage(atlas, font.recs[i]); + } font.texture = LoadTextureFromImage(atlas); UnloadImage(atlas); SetTextureFilter(font.texture, TEXTURE_FILTER_TRILINEAR); diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 8921590a..6b0c8704 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -7,6 +7,7 @@ #include #include #include +#include #include enum AssetState { @@ -112,7 +113,7 @@ class Assets { std::filesystem::path directory = GetPrevDirectoryPath(GetApplicationDirectory()); Font LoadFontFilter(const std::filesystem::path &fontPath, int fontSize, int &loadedAssets); - std::map assetMap = {}; + std::unordered_map assetMap = {}; public: Asset *RegisterAsset(Asset *asset) { From d9a61dc00eda1dc617e82da15367bce28296b571 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Mon, 5 Jan 2026 20:04:55 -0600 Subject: [PATCH 04/15] Ditch the map, use macros to define assets --- Encore/src/assets.cpp | 31 ++++++++++------ Encore/src/assets.h | 83 ++++++++++++++++++++++++------------------- Encore/src/main.cpp | 35 ++++++++---------- 3 files changed, 81 insertions(+), 68 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 82524d76..2823c175 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -13,11 +13,21 @@ class Assets; class Asset; +Assets TheAssets; // This is the single instance + +Assets &Assets::getInstance() { + return TheAssets; +} + void Asset::CheckForFetch() { switch (state) { case UNLOADED: Load(); Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was fetched before it was loaded. Loading immediately on main thread...", id.c_str())); + if (state == PREFINALIZED) { // TODO: Don't duplicate this logic + Encore::EncoreLog(LOG_INFO, TextFormat("Finalizing asset %s...", id.c_str())); + Finalize(); + } break; case LOADING: Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was fetched while it is being loaded. Blocking until it is loaded...", id.c_str())); @@ -82,6 +92,8 @@ char *FileAsset::FetchRaw() { void TextureAsset::Load() { LoadFile(); image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + width = image.width; + height = image.height; FreeFileBuffer(); state = PREFINALIZED; } @@ -123,13 +135,6 @@ void FontAsset::Finalize() { state = LOADED; } -void Assets::RegisterAllAssets() { - RegisterAsset(new FileAsset("encore_favicon-NEW.png")); - RegisterAsset(new TextureAsset("encore-white.png", true)); - RegisterAsset(new FontAsset("fonts/Rubik-Regular.ttf", 128)); - RegisterAsset(new FontAsset("fonts/JetBrainsMonoNL-Regular.ttf", 64)); -} - Texture2D Assets::LoadTextureFilter(const std::filesystem::path &texturePath, int &loadedAssets) { Texture2D tex = LoadTexture(texturePath.string().c_str()); @@ -166,7 +171,7 @@ Font Assets::LoadFontFilter( loadedAssets++; return font; } -void Assets::FirstAssets() { +/*void Assets::FirstAssets() { icon = LoadImage((directory / "Assets/encore_favicon-NEW.png").string().c_str()); encoreWhiteLogo = Assets::LoadTextureFilter((directory / "Assets/encore-white.png"), loadedAssets); @@ -176,6 +181,10 @@ void Assets::FirstAssets() { JetBrainsMono = LoadFontFilter( (directory / "Assets/fonts/JetBrainsMonoNL-Regular.ttf"), 64, loadedAssets ); +}*/ + +void Assets::TempAssets() { + sdfShader = LoadShader(0, (directory / "Assets/fonts/sdf.fs").string().c_str()); } void Assets::LoadAssets() { Color accentColor = { 255, 0, 255, 255 }; @@ -467,9 +476,9 @@ void Assets::LoadAssets() { redHatDisplayItalicLarge = Assets::LoadFontFilter( (directory / "Assets/fonts/RedHatDisplay-BlackItalic.ttf"), 128, loadedAssets ); - redHatDisplayBlack = Assets::LoadFontFilter( - (directory / "Assets/fonts/RedHatDisplay-Black.ttf"), 128, loadedAssets - ); + // redHatDisplayBlack = Assets::LoadFontFilter( + // (directory / "Assets/fonts/RedHatDisplay-Black.ttf"), 128, loadedAssets + // ); rubikBoldItalic = Assets::LoadFontFilter( (directory / "Assets/fonts/Rubik-BoldItalic.ttf"), 128, loadedAssets diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 6b0c8704..8e4ddcf9 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -22,6 +22,7 @@ class Asset { protected: virtual void Load() {} virtual void Finalize() {} + Asset(Asset& other) {} public: std::atomic state = UNLOADED; std::string id; @@ -75,6 +76,8 @@ class TextureAsset : public FileAsset { virtual void Finalize(); bool filter; public: + int width = 0; + int height = 0; TextureAsset(const std::string &id, bool filter) : FileAsset(id) { this->filter = filter; } @@ -106,33 +109,28 @@ class FontAsset : public FileAsset { } }; +#define ASSET(varname) TheAssets.varname +#define ASSETPTR(varname) &TheAssets.varname + + +#define NEWFILEASSET(varname, path) FileAsset varname = FileAsset(path) +#define NEWFONTASSET(varname, path, size) FontAsset varname = FontAsset(path, size) +#define NEWTEXASSET(varname, path) TextureAsset varname = TextureAsset(path, true) +#define NEWTEXASSET_NOFILTER(varname, path) TextureAsset varname = TextureAsset(path, false) + + + class Assets { private: - Assets() {} std::vector images; std::filesystem::path directory = GetPrevDirectoryPath(GetApplicationDirectory()); Font LoadFontFilter(const std::filesystem::path &fontPath, int fontSize, int &loadedAssets); - std::unordered_map assetMap = {}; public: - Asset *RegisterAsset(Asset *asset) { - assetMap.emplace(asset->id, asset); - return asset; - } - - void RegisterAllAssets(); - - template static A *Get(const std::string &id) { - Assets &instance = getInstance(); - return static_cast(instance.assetMap.at(id)); - } + Assets() {} - - static Assets &getInstance() { - static Assets instance; // This is the single instance - return instance; - } + static Assets &getInstance(); void setDirectory(std::filesystem::path assetsDirectory) { directory = assetsDirectory; @@ -282,19 +280,19 @@ class Assets { std::vector InstIcons; Image icon; - Texture2D encoreWhiteLogo; + NEWTEXASSET(encoreWhiteLogo, "encore-white.png"); Texture2D songBackground; Font redHatDisplayItalic; - Font redHatDisplayBlack; + NEWFONTASSET(redHatDisplayBlack, "fonts/RedHatDisplay-Black.ttf", 128); Font redHatDisplayItalicLarge; Font josefinSansItalic; Font josefinSansNormal; Font josefinSansBold; Font redHatMono; - Font rubik; + NEWFONTASSET(rubik, "fonts/Rubik-Regular.ttf", 128); Font rubikItalic; - Font JetBrainsMono; + NEWFONTASSET(JetBrainsMono, "fonts/JetBrainsMonoNL-Regular.ttf", 64); Font rubikBoldItalic; Font rubikBold; @@ -325,7 +323,7 @@ class Assets { // Sound clapOD; void DrawTextRubik( const char *text, float posX, float posY, float fontSize, Color color - ) const { + ) { BeginShaderMode(sdfShader); DrawTextEx(rubik, text, { posX, posY }, fontSize, 1, color); EndShaderMode(); @@ -335,36 +333,38 @@ class Assets { BeginShaderMode(sdfShader); EndShaderMode(); } - void DrawTextJSN(const char *text, float posX, float posY, Color color) const { + void DrawTextJSN(const char *text, float posX, float posY, Color color) { BeginShaderMode(sdfShader); DrawTextEx(josefinSansNormal, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); EndShaderMode(); } - void DrawTextJSB(const char *text, float posX, float posY, Color color) const { + void DrawTextJSB(const char *text, float posX, float posY, Color color) { BeginShaderMode(sdfShader); DrawTextEx(josefinSansBold, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); EndShaderMode(); } - void DrawTextJSI(const char *text, float posX, float posY, Color color) const { + void DrawTextJSI(const char *text, float posX, float posY, Color color) { BeginShaderMode(sdfShader); DrawTextEx(josefinSansItalic, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); EndShaderMode(); } - float MeasureTextRubik(const char *text, float fontSize) const { + // I don't like these measure functions. Why are they so inconsistent? + // These would probably be better inlined... - Sulfrix + float MeasureTextRubik(const char *text, float fontSize) { return MeasureTextEx(rubik, text, fontSize, 1).x; } - float MeasureTextRHDI(const char *text) const { + float MeasureTextRHDI(const char *text) { return MeasureTextEx(redHatDisplayItalic, text, 48, 1).x; } - float MeasureTextJSN(const char *text, float fontSize) const { + float MeasureTextJSN(const char *text, float fontSize) { return MeasureTextEx(josefinSansNormal, text, 48, 1).x; } - float MeasureTextJSB(const char *text, float fontSize) const { + float MeasureTextJSB(const char *text, float fontSize) { return MeasureTextEx(josefinSansBold, text, 48, 1).x; } - float MeasureTextJSI(const char *text, float fontSize) const { + float MeasureTextJSI(const char *text, float fontSize) { return MeasureTextEx(josefinSansItalic, text, 48, 1).x; } static Texture2D @@ -372,19 +372,23 @@ class Assets { static Model LoadModel_(const std::filesystem::path &modelPath, int &loadedAssets); void FirstAssets(); void LoadAssets(); + void TempAssets(); // For development of the asset rework, this should be removed! }; +#undef NEWTEXASSET +#undef NEWTEXASSET_NOFILTER +#undef NEWFONTASSET +#undef NEWFILEASSET + +extern Assets TheAssets; + /// Used for easily loading groups of assets and polling their state as one. class AssetSet { std::vector assets; public: - AssetSet(std::initializer_list l) { - const auto names = std::vector(l); - assets.reserve(l.size()); - for (int i = 0; i < l.size(); i++) { - assets.push_back(Assets::Get(names[i])); - } + AssetSet(std::initializer_list l) { + assets = std::vector(l); } void StartLoad() { @@ -426,5 +430,10 @@ class AssetSet { void BlockUntilLoaded() { while (!PollLoaded()) {} + for (int i = 0; i < assets.size(); i++) { + // This finalizes any assets that need it + // We're blocking anyways so why not + assets[i]->CheckForFetch(); + } } }; \ No newline at end of file diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index f339b7c6..0c9a9c0d 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -97,7 +97,6 @@ int main(int argc, char *argv[]) { SetConfigFlags(FLAG_WINDOW_RESIZABLE); glfwWindowHint(GLFW_SAMPLES, 4); - SetWindowState(FLAG_MSAA_4X_HINT); bool windowToggle = true; ArgumentList::InitArguments(argc, argv); @@ -144,20 +143,19 @@ int main(int argc, char *argv[]) { SetConfigFlags(FLAG_VSYNC_HINT); } Encore::EncoreLog(LOG_INFO, TextFormat("Vertical sync: %d", vsyncArg)); + InitWindow(800, 600, "Encore"); if (!TheGameSettings.Fullscreen) { - InitWindow( - GetMonitorWidth(GetCurrentMonitor()) * 0.75f, - GetMonitorHeight(GetCurrentMonitor()) * 0.75f, - "Encore" - ); - SET_WINDOW_WINDOWED(); + int x, y, width, height; + glfwGetMonitorWorkarea(glfwGetPrimaryMonitor(), &x, &y, &width, &height); + Encore::EncoreLog(LOG_INFO, TextFormat("Workarea of monitor %s: %i %i %i %i", glfwGetMonitorName(glfwGetPrimaryMonitor()), x, y, width, height)); + int windowWidth = width * 0.75; + int windowHeight = height * 0.75; + SetWindowPosition(width/2 - windowWidth/2 + x, height/2 - windowHeight/2 + y); + SetWindowSize(windowWidth, windowHeight); + ClearWindowState(FLAG_WINDOW_UNDECORATED); MaximizeWindow(); } else { - InitWindow( - GetMonitorWidth(GetCurrentMonitor()), - GetMonitorHeight(GetCurrentMonitor()), - "Encore" - ); + SetWindowSize(GetMonitorWidth(0), GetMonitorHeight(0)); SET_WINDOW_FULLSCREEN_BORDERLESS(); } bool AudioInitSuccessful = TheAudioManager.Init(); @@ -172,17 +170,14 @@ int main(int argc, char *argv[]) { SETDEFAULTSTYLE(); SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); - assets.RegisterAllAssets(); - AssetSet initialSet = {"encore_favicon-NEW.png", "fonts/Rubik-Regular.ttf", "fonts/JetBrainsMonoNL-Regular.ttf", "encore-white.png"}; + auto icon = FileAsset("encore_favicon-NEW.png"); + AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), &icon, ASSETPTR(redHatDisplayBlack)}; initialSet.StartLoad(); initialSet.BlockUntilLoaded(); - auto icon = Assets::Get("encore_favicon-NEW.png"); - SetWindowIcon(LoadImageFromMemory(".png", *icon, icon->GetFileSize())); - assets.rubik = *Assets::Get("fonts/Rubik-Regular.ttf"); - assets.JetBrainsMono = *Assets::Get("fonts/JetBrainsMonoNL-Regular.ttf"); - assets.encoreWhiteLogo = *Assets::Get("encore-white.png"); - assets.LoadAssets(); + SetWindowIcon(LoadImageFromMemory(".png", icon, icon.GetFileSize())); TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; + TheAssets.TempAssets(); + if (TheGameSettings.Framerate > 0) Encore::EncoreLog( From 0f271b3f9ec14334f130fe0a22255168c3852ff5 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 02:10:15 -0600 Subject: [PATCH 05/15] okay i think we're getting somewhere --- Encore/src/assets.cpp | 47 ++++++++++++++--- Encore/src/assets.h | 68 ++++++++++++++++++++++--- Encore/src/main.cpp | 5 +- Encore/src/menus/SongSelectMenu.cpp | 2 +- Encore/src/menus/cacheLoadingScreen.cpp | 27 ++++------ Encore/src/menus/cacheLoadingScreen.h | 6 --- Encore/src/menus/gameMenu.cpp | 5 +- 7 files changed, 116 insertions(+), 44 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 2823c175..811525b7 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -50,8 +50,6 @@ void Asset::StartLoad() { loadingThread = std::thread([this](){this->Load();}); loadingThread.detach(); //Encore::EncoreLog(LOG_INFO, TextFormat("Loading asset %s...", id.c_str())); - } else { - Encore::EncoreLog(LOG_WARNING, TextFormat("Asset %s was double loaded.", id.c_str())); } } @@ -64,15 +62,22 @@ void Asset::LoadImmediate() { void FileAsset::LoadFile() { std::ifstream file(GetPath(), std::ios::binary | std::ios::ate); fileSize = file.tellg(); + int realFileSize = fileSize; + if (addNullTerminator) + fileSize ++; file.seekg(0, std::ios::beg); fileBuffer = (char*)malloc(fileSize); - file.read(fileBuffer, fileSize); + file.read(fileBuffer, realFileSize); file.close(); + if (addNullTerminator) + fileBuffer[fileSize-1] = '\0'; } void FileAsset::FreeFileBuffer() { - free(fileBuffer); + if (fileBuffer != nullptr) { + free(fileBuffer); + } } void FileAsset::Load() { @@ -89,6 +94,30 @@ char *FileAsset::FetchRaw() { return fileBuffer; } +void ShaderAsset::Load() { + AssetSet code = {}; + if (fragmentCode) + code.AddAsset(fragmentCode); + if (vertexCode) + code.AddAsset(vertexCode); + code.StartLoad(); + code.BlockUntilLoaded(); + state = PREFINALIZED; +} + +void ShaderAsset::Finalize() { + const char *fragString = fragmentCode ? fragmentCode->FetchRaw() : nullptr; + const char *vertString = vertexCode ? vertexCode->FetchRaw() : nullptr; + shader = LoadShaderFromMemory(vertString, fragString); + for (auto uniform : uniformPositions) { + uniform.second = GetShaderLocation(shader, uniform.first.c_str()); + } + state = LOADED; + // These destructors probably don't free the file buffers. Sad! + delete fragmentCode; + delete vertexCode; +} + void TextureAsset::Load() { LoadFile(); image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); @@ -183,9 +212,10 @@ Font Assets::LoadFontFilter( ); }*/ -void Assets::TempAssets() { - sdfShader = LoadShader(0, (directory / "Assets/fonts/sdf.fs").string().c_str()); -} +AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic)}; +AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic)}; + +#ifdef DONTCOMPILE void Assets::LoadAssets() { Color accentColor = { 255, 0, 255, 255 }; Color overdriveColor = Color { 255, 200, 0, 255 }; @@ -497,7 +527,7 @@ void Assets::LoadAssets() { fxaa = LoadShader(0, (directory / "Assets/ui/fxaa.frag").string().c_str()); texLoc = GetShaderLocation(fxaa, "texture0"); resLoc = GetShaderLocation(fxaa, "resolution"); - sdfShader = LoadShader(0, (directory / "Assets/fonts/sdf.fs").string().c_str()); + //sdfShader = LoadShader(0, (directory / "Assets/fonts/sdf.fs").string().c_str()); bgShader = LoadShader(0, (directory / "Assets/ui/wavy.fs").string().c_str()); bgTimeLoc = GetShaderLocation(bgShader, "time"); // clapOD = LoadSound((highwayDir / "clap.ogg")); @@ -619,3 +649,4 @@ odHighwayX.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTextureOD; sustainMatMiss.maps[MATERIAL_MAP_DIFFUSE].texture = sustainTexture; sustainMatMiss.maps[MATERIAL_MAP_DIFFUSE].color = DARKGRAY; } +#endif diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 8e4ddcf9..e4951e10 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -22,7 +23,7 @@ class Asset { protected: virtual void Load() {} virtual void Finalize() {} - Asset(Asset& other) {} + //Asset(Asset& other) {} public: std::atomic state = UNLOADED; std::string id; @@ -49,13 +50,15 @@ class Asset { class FileAsset : public Asset { std::filesystem::path path; protected: - char *fileBuffer; size_t fileSize; void LoadFile(); virtual void Load(); void FreeFileBuffer(); public: + char *fileBuffer; + bool addNullTerminator = false; + FileAsset(const std::string &id) : Asset(id) { path = std::filesystem::path("Assets") / id; } @@ -67,6 +70,46 @@ class FileAsset : public Asset { operator const unsigned char*() { return (const unsigned char *)FetchRaw(); } + virtual ~FileAsset() { + //FreeFileBuffer(); + } +}; + +class ShaderAsset : public Asset { + FileAsset *fragmentCode; + FileAsset *vertexCode; + std::unordered_map uniformPositions; + const char *fStr; + const char *vStr; + std::function postFinalizeFunc; + Shader shader; +protected: + virtual void Load(); + virtual void Finalize(); +public: + ShaderAsset(const std::string &fsPath, const std::string &vsPath, std::initializer_list uniforms, std::function postFinalizeFunc) : Asset(fsPath) { + if (!fsPath.empty()) { + fragmentCode = new FileAsset(fsPath); + fragmentCode->addNullTerminator = true; + } + if (!vsPath.empty()) { + vertexCode = new FileAsset(vsPath); + vertexCode->addNullTerminator = true; + } + this->postFinalizeFunc = postFinalizeFunc; + for (auto uniform : uniforms) { + uniformPositions.emplace(uniform, 0); + } + } + + Shader Fetch() { + CheckForFetch(); + return shader; + } + + operator Shader() { + return Fetch(); + } }; class TextureAsset : public FileAsset { @@ -117,6 +160,8 @@ class FontAsset : public FileAsset { #define NEWFONTASSET(varname, path, size) FontAsset varname = FontAsset(path, size) #define NEWTEXASSET(varname, path) TextureAsset varname = TextureAsset(path, true) #define NEWTEXASSET_NOFILTER(varname, path) TextureAsset varname = TextureAsset(path, false) +#define NEWSHADERASSET(varname, fspath, vspath, uniforms) ShaderAsset varname = ShaderAsset(fspath, vspath, uniforms, {}) +#define NEWSHADERASSET_POSTFINALIZE(varname, fspath, vspath, uniforms, postfinalize) ShaderAsset varname = ShaderAsset(fspath, vspath, uniforms, postfinalize) @@ -143,6 +188,8 @@ class Assets { Assets(const Assets &) = delete; void operator=(const Assets &) = delete; + NEWFILEASSET(favicon, "encore_favicon-NEW.png"); + int loadedAssets; int totalAssets = 32; Model smasherInner; @@ -283,10 +330,10 @@ class Assets { NEWTEXASSET(encoreWhiteLogo, "encore-white.png"); Texture2D songBackground; - Font redHatDisplayItalic; + NEWFONTASSET(redHatDisplayItalic, "fonts/RedHatDisplay-BlackItalic.ttf", 128); NEWFONTASSET(redHatDisplayBlack, "fonts/RedHatDisplay-Black.ttf", 128); - Font redHatDisplayItalicLarge; - Font josefinSansItalic; + NEWFONTASSET(redHatDisplayItalicLarge, "fonts/RedHatDisplay-Black.ttf", 128); + NEWFONTASSET(josefinSansItalic, "fonts/JosefinSans-Italic.ttf", 128); Font josefinSansNormal; Font josefinSansBold; Font redHatMono; @@ -317,7 +364,7 @@ class Assets { Material CodaLane; Texture2D CodaLaneTex; - Shader sdfShader; + NEWSHADERASSET(sdfShader, "fonts/sdf.fs", "", {}); Shader bgShader; int bgTimeLoc; // Sound clapOD; @@ -381,7 +428,6 @@ class Assets { #undef NEWFILEASSET extern Assets TheAssets; - /// Used for easily loading groups of assets and polling their state as one. class AssetSet { std::vector assets; @@ -391,6 +437,10 @@ class AssetSet { assets = std::vector(l); } + void AddAsset(Asset *asset) { + assets.push_back(asset); + } + void StartLoad() { for (int i = 0; i < assets.size(); i++) { auto asset = assets[i]; @@ -436,4 +486,6 @@ class AssetSet { assets[i]->CheckForFetch(); } } -}; \ No newline at end of file +}; +extern AssetSet initialSet; +extern AssetSet mainMenuSet; diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index 0c9a9c0d..77584b2d 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -170,13 +170,10 @@ int main(int argc, char *argv[]) { SETDEFAULTSTYLE(); SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); - auto icon = FileAsset("encore_favicon-NEW.png"); - AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), &icon, ASSETPTR(redHatDisplayBlack)}; initialSet.StartLoad(); initialSet.BlockUntilLoaded(); - SetWindowIcon(LoadImageFromMemory(".png", icon, icon.GetFileSize())); + SetWindowIcon(LoadImageFromMemory(".png", ASSET(favicon), ASSET(favicon).GetFileSize())); TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; - TheAssets.TempAssets(); if (TheGameSettings.Framerate > 0) diff --git a/Encore/src/menus/SongSelectMenu.cpp b/Encore/src/menus/SongSelectMenu.cpp index 0fae00b4..8af9ec9b 100644 --- a/Encore/src/menus/SongSelectMenu.cpp +++ b/Encore/src/menus/SongSelectMenu.cpp @@ -315,7 +315,7 @@ void SongSelectMenu::Draw() { ); } else if (!TheSongList.listMenuEntries[i].hiddenEntry) { bool isCurSong = TheSongList.curSong && i == TheSongList.curSong->songListPos - 1; - Font &artistFont = isCurSong ? assets.josefinSansItalic : assets.josefinSansItalic; + Font artistFont = assets.josefinSansItalic; Song &songi = TheSongList.songs[TheSongList.listMenuEntries[i].songListID]; int songID = TheSongList.listMenuEntries[i].songListID; diff --git a/Encore/src/menus/cacheLoadingScreen.cpp b/Encore/src/menus/cacheLoadingScreen.cpp index 3ecc9a40..bd9dde48 100644 --- a/Encore/src/menus/cacheLoadingScreen.cpp +++ b/Encore/src/menus/cacheLoadingScreen.cpp @@ -27,15 +27,8 @@ std::vector CacheSplash = { }; void cacheLoadingScreen::Load() { - std::filesystem::path assetsdir = GetApplicationDirectory(); - assetsdir /= "Assets"; - RedHatDisplay = GameMenu::LoadFontFilter(assetsdir / "fonts/RedHatDisplay-Black.ttf"); - RubikBold = GameMenu::LoadFontFilter(assetsdir / "fonts/Rubik-Bold.ttf"); - JosefinSansItalic = - GameMenu::LoadFontFilter(assetsdir / "fonts/JosefinSans-Italic.ttf"); - encoreLogo = GameMenu::LoadTextureFilter(assetsdir / "encore_favicon-NEW.png"); + SplashSel = GetRandomValue(0, CacheSplash.size() - 1); - sdfShader = LoadShader(0, (assetsdir / "fonts/sdf.fs").string().c_str()); } // todo(3drosalia): make another class for drawing these things without having to uh. @@ -65,12 +58,12 @@ void cacheLoadingScreen::Draw() { ); GameMenu::mhDrawText( - RedHatDisplay, + ASSET(redHatDisplayBlack), "LOADING CACHE", { u.LeftSide, u.hpct(0.05f) }, u.hinpct(0.125f), WHITE, - sdfShader, + ASSET(sdfShader), LEFT ); float RubikFontSize = u.hinpct(0.05f); @@ -78,12 +71,12 @@ void cacheLoadingScreen::Draw() { int toLoad = MaxChartsToLoad; std::string LoadingText = TextFormat("%d/%d songs loaded", loaded, toLoad); GameMenu::mhDrawText( - RubikBold, + ASSET(rubikBold), LoadingText, { u.RightSide, u.hpct(0.085f) }, RubikFontSize, LIGHTGRAY, - sdfShader, + ASSET(sdfShader), RIGHT ); GameMenu::DrawBottomOvershell(); @@ -92,22 +85,24 @@ void cacheLoadingScreen::Draw() { GetScreenHeight() - u.hpct(0.14f) + u.hinpct(0.07f), u.hinpct(0.14f), u.hinpct(0.14f) }; + + auto logo = ASSETPTR(encoreWhiteLogo); // TODO: this should be the favicon DrawTexturePro( - encoreLogo, - { 0, 0, (float)encoreLogo.width, (float)encoreLogo.height }, + *logo, + { 0, 0, (float)logo->width, (float)logo->height }, LogoRect, { u.hinpct(0.07f), u.hinpct(0.07f) }, 0, WHITE ); GameMenu::mhDrawText( - JosefinSansItalic, + ASSET(josefinSansItalic), CacheSplash[SplashSel], { u.LeftSide + u.hinpct(0.16), GetScreenHeight() - u.hpct(0.14f) + u.hinpct(0.055f) }, RubikFontSize / 1.5f, WHITE, - sdfShader, + ASSET(sdfShader), LEFT ); if (!started) { diff --git a/Encore/src/menus/cacheLoadingScreen.h b/Encore/src/menus/cacheLoadingScreen.h index dee19de4..99ac263b 100644 --- a/Encore/src/menus/cacheLoadingScreen.h +++ b/Encore/src/menus/cacheLoadingScreen.h @@ -8,13 +8,7 @@ #include "raylib.h" class cacheLoadingScreen : public Menu { - Texture2D encoreLogo; - Font RedHatDisplay; - Font RubikBold; - Font JosefinSansItalic; int SplashSel; - Texture2D LoadingScreenBackground; - Shader sdfShader; public: cacheLoadingScreen(); diff --git a/Encore/src/menus/gameMenu.cpp b/Encore/src/menus/gameMenu.cpp index 3996624f..bfa7f10c 100644 --- a/Encore/src/menus/gameMenu.cpp +++ b/Encore/src/menus/gameMenu.cpp @@ -225,6 +225,9 @@ void MainMenu::Load() { std::filesystem::path directory = GetPrevDirectoryPath(GetApplicationDirectory()); ChooseSplashText(directory); PickRandomMenuSong(); + if (!mainMenuSet.PollLoaded()) { + mainMenuSet.StartLoad(); + } } void MainMenu::KeyboardInputCallback(int key, int scancode, int action, int mods) { if (ThePlayerManager.PlayersActive == 0) { @@ -263,7 +266,7 @@ void MainMenu::AttractScreen() { }; DrawTextEx( - menuAss.josefinSansItalic, + ASSET(josefinSansItalic), SplashString.c_str(), GreetSplashPos, SplashFontSize, From 062c983b7b24e7e59cac4dcbc7963425a097092d Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 17:27:11 -0600 Subject: [PATCH 06/15] Initial loading screen --- Encore/src/assets.cpp | 2 +- Encore/src/assets.h | 1 + Encore/src/main.cpp | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 811525b7..2ff44bc0 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -212,7 +212,7 @@ Font Assets::LoadFontFilter( ); }*/ -AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic)}; +AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(faviconTex), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic)}; AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic)}; #ifdef DONTCOMPILE diff --git a/Encore/src/assets.h b/Encore/src/assets.h index e4951e10..f6beec9f 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -189,6 +189,7 @@ class Assets { void operator=(const Assets &) = delete; NEWFILEASSET(favicon, "encore_favicon-NEW.png"); + NEWTEXASSET(faviconTex, "encore_favicon-NEW.png"); int loadedAssets; int totalAssets = 32; diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index 77584b2d..d680974e 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -5,6 +5,8 @@ #include "util/discord.h" #include "util/enclog.h" #include "gameplay/enctime.h" + + #include #include "settings/keybinds.h" @@ -88,6 +90,18 @@ std::string commitHash = GIT_COMMIT_HASH; int minWidth = 640; int minHeight = 480; +void DrawLoadingScreen(unsigned char alpha, float progress) { + Texture icon = ASSET(faviconTex); + float scale = (GetScreenHeight() / 1080.0f) * 0.3; + int iconSize = (icon.height * scale)/2; // Dividing by 2 for centering + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), {0, 0, 0, alpha}); + DrawTextureEx(icon, {GetScreenWidth()/2.0f-iconSize, GetScreenHeight()/2.0f-iconSize}, 0, scale, {255, 255, 255, alpha}); + + Vector2 screenCenter = {GetScreenWidth()/2.0f, GetScreenHeight()/2.0f}; + DrawRing(screenCenter, scale*300.0f, scale*320.0f, -90, 360-90, 64, {255, 255, 255, (unsigned char)(alpha/3)}); + DrawRing(screenCenter, scale*300.0f, scale*320.0f, -90, 360*progress-90, 64, {255, 255, 255, alpha}); +} + int main(int argc, char *argv[]) { TheGameRPC.Initialize(); SetTraceLogCallback(Encore::EncoreLog); @@ -171,11 +185,13 @@ int main(int argc, char *argv[]) { SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); initialSet.StartLoad(); - initialSet.BlockUntilLoaded(); + AssetSet({ASSETPTR(favicon), ASSETPTR(faviconTex)}).BlockUntilLoaded(); SetWindowIcon(LoadImageFromMemory(".png", ASSET(favicon), ASSET(favicon).GetFileSize())); TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; + + if (TheGameSettings.Framerate > 0) Encore::EncoreLog( LOG_INFO, TextFormat("Target FPS: %d", TheGameSettings.Framerate) @@ -214,12 +230,20 @@ int main(int argc, char *argv[]) { BeginDrawing(); ClearBackground(DARKGRAY); - - if (TheMenuManager.onNewMenu) { - TheMenuManager.LoadMenu(); + if (!initialSet.PollLoaded()) { + DrawLoadingScreen(255, initialSet.GetProgress()); + } else { + static float loadingScreenFade = 1.0f; + if (TheMenuManager.onNewMenu) { + TheMenuManager.LoadMenu(); + } + TheGameRPC.Update(); + TheMenuManager.DrawMenu(); + if (loadingScreenFade > 0) { + loadingScreenFade -= GetFrameTime()*5.0f; + DrawLoadingScreen(255*loadingScreenFade, 1); + } } - TheGameRPC.Update(); - TheMenuManager.DrawMenu(); EndDrawing(); TheFrameManager.WaitForFrame(); From 5c0ea6e1a808c62739bc47a8a1c61e9963ddaa90 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 18:36:51 -0600 Subject: [PATCH 07/15] Start loading song cache ASAP, before any assets even start loading --- Encore/src/assets.cpp | 2 +- Encore/src/assets.h | 11 +++++++---- Encore/src/main.cpp | 6 ++++-- Encore/src/menus/cacheLoadingScreen.cpp | 20 +++++--------------- Encore/src/song/cacheload.cpp | 16 ++++++++++++++++ Encore/src/song/cacheload.h | 16 ++++++++++++++++ 6 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 Encore/src/song/cacheload.cpp create mode 100644 Encore/src/song/cacheload.h diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 2ff44bc0..7f1f3727 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -213,7 +213,7 @@ Font Assets::LoadFontFilter( }*/ AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(faviconTex), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic)}; -AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic)}; +AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture)}; #ifdef DONTCOMPILE void Assets::LoadAssets() { diff --git a/Encore/src/assets.h b/Encore/src/assets.h index f6beec9f..4bdf5581 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -102,6 +102,10 @@ class ShaderAsset : public Asset { } } + int GetUniformLoc(const std::string& uniformName) { + return uniformPositions.find(uniformName)->second; + } + Shader Fetch() { CheckForFetch(); return shader; @@ -324,7 +328,7 @@ class Assets { Model liftModelOD; std::vector YargRings; - Texture2D BaseRingTexture; + NEWTEXASSET(BaseRingTexture, "ui/hugh ring/rings.png"); std::vector InstIcons; Image icon; @@ -343,7 +347,7 @@ class Assets { NEWFONTASSET(JetBrainsMono, "fonts/JetBrainsMonoNL-Regular.ttf", 64); Font rubikBoldItalic; - Font rubikBold; + NEWFONTASSET(rubikBold, "fonts/Rubik-Bold.ttf", 128); // clapOD = LoadSound((directory / "Assets/highway/clap.ogg").string().c_str()); // SetSoundVolume(clapOD, 0.375); @@ -366,8 +370,7 @@ class Assets { Texture2D CodaLaneTex; NEWSHADERASSET(sdfShader, "fonts/sdf.fs", "", {}); - Shader bgShader; - int bgTimeLoc; + NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time"}); // Sound clapOD; void DrawTextRubik( const char *text, float posX, float posY, float fontSize, Color color diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index d680974e..59d207cc 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -10,6 +10,7 @@ #include #include "settings/keybinds.h" +#include "song/cacheload.h" #define assertm(exp, msg) assert((void(msg), exp)) #define RAYGUI_IMPLEMENTATION @@ -150,6 +151,7 @@ int main(int argc, char *argv[]) { #endif TheSettingsInitializer.InitSettings(directory); + CacheLoad::StartLoad(); ThePlayerManager.SetPlayerListSaveFileLocation(directory / "players.json"); ThePlayerManager.LoadPlayerList(); @@ -205,7 +207,7 @@ int main(int argc, char *argv[]) { u.calcUnits(); double curTime = GetTime(); float bgTime = curTime / 5.0f; - SetShaderValue(assets.bgShader, assets.bgTimeLoc, &bgTime, SHADER_UNIFORM_FLOAT); + SetShaderValue(ASSET(bgShader), ASSET(bgShader).GetUniformLoc("time"), &bgTime, SHADER_UNIFORM_FLOAT); if (IsKeyPressed(KEY_F11) || (IsKeyPressed(KEY_LEFT_ALT) && IsKeyPressed(KEY_ENTER))) { TheGameSettings.Fullscreen = !TheGameSettings.Fullscreen; @@ -240,8 +242,8 @@ int main(int argc, char *argv[]) { TheGameRPC.Update(); TheMenuManager.DrawMenu(); if (loadingScreenFade > 0) { - loadingScreenFade -= GetFrameTime()*5.0f; DrawLoadingScreen(255*loadingScreenFade, 1); + loadingScreenFade -= GetFrameTime()*5.0f; } } EndDrawing(); diff --git a/Encore/src/menus/cacheLoadingScreen.cpp b/Encore/src/menus/cacheLoadingScreen.cpp index bd9dde48..f7b0c641 100644 --- a/Encore/src/menus/cacheLoadingScreen.cpp +++ b/Encore/src/menus/cacheLoadingScreen.cpp @@ -15,6 +15,7 @@ #include "raygui.h" #include "MenuManager.h" #include "settings/settings.h" +#include "song/cacheload.h" std::vector CacheSplash = { "Want a break from the cache?", @@ -31,15 +32,6 @@ void cacheLoadingScreen::Load() { SplashSel = GetRandomValue(0, CacheSplash.size() - 1); } -// todo(3drosalia): make another class for drawing these things without having to uh. -// implement it in every menu class -std::atomic_bool finished = false; -std::atomic_bool started = false; - -void LoadCache() { - TheSongList.LoadCache(TheGameSettings.SongPaths); - finished = true; -} void cacheLoadingScreen::Draw() { Units u = Units::getInstance(); @@ -86,7 +78,7 @@ void cacheLoadingScreen::Draw() { u.hinpct(0.14f), u.hinpct(0.14f) }; - auto logo = ASSETPTR(encoreWhiteLogo); // TODO: this should be the favicon + auto logo = ASSETPTR(faviconTex); DrawTexturePro( *logo, { 0, 0, (float)logo->width, (float)logo->height }, @@ -105,12 +97,10 @@ void cacheLoadingScreen::Draw() { ASSET(sdfShader), LEFT ); - if (!started) { - started = true; - std::thread CacheLoader(LoadCache); - CacheLoader.detach(); + if (!CacheLoad::started) { + CacheLoad::StartLoad(); } - if (finished) { + if (CacheLoad::finished) { TheMenuManager.SwitchScreen(MAIN_MENU); } } diff --git a/Encore/src/song/cacheload.cpp b/Encore/src/song/cacheload.cpp new file mode 100644 index 00000000..9517b924 --- /dev/null +++ b/Encore/src/song/cacheload.cpp @@ -0,0 +1,16 @@ +#include "cacheload.h" +#include "songlist.h" + +std::atomic_bool CacheLoad::finished; +std::atomic_bool CacheLoad::started; +std::thread CacheLoad::cacheLoadThread; + +void CacheLoad::StartLoad() { + if (started) return; + started = true; + cacheLoadThread = std::thread([]() { + TheSongList.LoadCache(TheGameSettings.SongPaths); + finished = true; + }); + cacheLoadThread.detach(); +} \ No newline at end of file diff --git a/Encore/src/song/cacheload.h b/Encore/src/song/cacheload.h new file mode 100644 index 00000000..1e9ab9c6 --- /dev/null +++ b/Encore/src/song/cacheload.h @@ -0,0 +1,16 @@ +#pragma once +#ifndef CACHELOAD_H +#define CACHELOAD_H +#include +#include +#include "settings/settings.h" + +namespace CacheLoad { + extern std::atomic_bool finished; + extern std::atomic_bool started; + extern std::thread cacheLoadThread; + + void StartLoad(); + +} +#endif \ No newline at end of file From 1b071093bf9c09effe7d74223b25965d0bf7949c Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 19:49:52 -0600 Subject: [PATCH 08/15] fancier load anim --- Encore/src/assets.h | 10 +++++++--- Encore/src/main.cpp | 27 ++++++++++++++++++++------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 4bdf5581..61b5927f 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -454,14 +454,18 @@ class AssetSet { } } - bool PollLoaded() { + bool PollLoaded(bool doFinalize = false) { + bool loaded = true; for (int i = 0; i < assets.size(); i++) { auto asset = assets[i]; if (!asset->CanFetch()) { - return false; + loaded = false; + } + if (doFinalize && asset->state == PREFINALIZED) { + asset->CheckForFetch(); } } - return true; + return loaded; } int CountLoaded() { diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index 59d207cc..3283551a 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -93,14 +93,18 @@ int minHeight = 480; void DrawLoadingScreen(unsigned char alpha, float progress) { Texture icon = ASSET(faviconTex); + float fade = (1.0 - (alpha/255.0)); + fade *= fade; + unsigned char quadAlpha = 255*(1.0-fade); float scale = (GetScreenHeight() / 1080.0f) * 0.3; - int iconSize = (icon.height * scale)/2; // Dividing by 2 for centering - DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), {0, 0, 0, alpha}); - DrawTextureEx(icon, {GetScreenWidth()/2.0f-iconSize, GetScreenHeight()/2.0f-iconSize}, 0, scale, {255, 255, 255, alpha}); + float iconScale = scale + fade * 0.5; + int iconSize = (icon.height * iconScale)/2; // Dividing by 2 for centering + DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), {0, 0, 0, quadAlpha}); Vector2 screenCenter = {GetScreenWidth()/2.0f, GetScreenHeight()/2.0f}; DrawRing(screenCenter, scale*300.0f, scale*320.0f, -90, 360-90, 64, {255, 255, 255, (unsigned char)(alpha/3)}); DrawRing(screenCenter, scale*300.0f, scale*320.0f, -90, 360*progress-90, 64, {255, 255, 255, alpha}); + DrawTextureEx(icon, {GetScreenWidth()/2.0f-iconSize, GetScreenHeight()/2.0f-iconSize}, 0, iconScale, {255, 255, 255, alpha}); } int main(int argc, char *argv[]) { @@ -149,10 +153,10 @@ int main(int argc, char *argv[]) { CFRelease(bundle); } #endif - TheSettingsInitializer.InitSettings(directory); CacheLoad::StartLoad(); ThePlayerManager.SetPlayerListSaveFileLocation(directory / "players.json"); + ThePlayerManager.LoadPlayerList(); if (TheGameSettings.VerticalSync) { @@ -189,7 +193,11 @@ int main(int argc, char *argv[]) { initialSet.StartLoad(); AssetSet({ASSETPTR(favicon), ASSETPTR(faviconTex)}).BlockUntilLoaded(); SetWindowIcon(LoadImageFromMemory(".png", ASSET(favicon), ASSET(favicon).GetFileSize())); - TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; + if (!CacheLoad::finished) { + TheMenuManager.currentScreen = CACHE_LOADING_SCREEN; + } else { + TheMenuManager.currentScreen = MAIN_MENU; + } @@ -232,7 +240,7 @@ int main(int argc, char *argv[]) { BeginDrawing(); ClearBackground(DARKGRAY); - if (!initialSet.PollLoaded()) { + if (!initialSet.PollLoaded(true)) { DrawLoadingScreen(255, initialSet.GetProgress()); } else { static float loadingScreenFade = 1.0f; @@ -243,7 +251,12 @@ int main(int argc, char *argv[]) { TheMenuManager.DrawMenu(); if (loadingScreenFade > 0) { DrawLoadingScreen(255*loadingScreenFade, 1); - loadingScreenFade -= GetFrameTime()*5.0f; + float frameTime = GetFrameTime(); + // Cap the frame time here so the fade animation doesn't get skipped by the stutter caused by loading the song preview + if (frameTime > 0.032) { + frameTime = 0.032; + } + loadingScreenFade -= frameTime*5.0f; } } EndDrawing(); From d31dd3ce5bb747cf6886452c726647c28b6684be Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 20:19:45 -0600 Subject: [PATCH 09/15] Migrate more fonts --- Encore/src/assets.cpp | 4 ++-- Encore/src/assets.h | 10 +++++----- Encore/src/main.cpp | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 7f1f3727..fac9f170 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -212,8 +212,8 @@ Font Assets::LoadFontFilter( ); }*/ -AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(faviconTex), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic)}; -AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture)}; +AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(faviconTex), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic), ASSETPTR(bgShader)}; +AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture), ASSETPTR(rubikBold), ASSETPTR(rubikBoldItalic), ASSETPTR(rubikItalic)}; #ifdef DONTCOMPILE void Assets::LoadAssets() { diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 61b5927f..53f8442b 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -339,13 +339,13 @@ class Assets { NEWFONTASSET(redHatDisplayBlack, "fonts/RedHatDisplay-Black.ttf", 128); NEWFONTASSET(redHatDisplayItalicLarge, "fonts/RedHatDisplay-Black.ttf", 128); NEWFONTASSET(josefinSansItalic, "fonts/JosefinSans-Italic.ttf", 128); - Font josefinSansNormal; - Font josefinSansBold; - Font redHatMono; + NEWFONTASSET(josefinSansNormal, "fonts/JosefinSans-Normal.ttf", 128); + NEWFONTASSET(josefinSansBold, "fonts/JosefinSans-Bold.ttf", 128); + NEWFONTASSET(redHatMono, "fonts/RedHatMono-Bold.ttf", 128); NEWFONTASSET(rubik, "fonts/Rubik-Regular.ttf", 128); - Font rubikItalic; + NEWFONTASSET(rubikItalic, "fonts/Rubik-Italic.ttf", 128); NEWFONTASSET(JetBrainsMono, "fonts/JetBrainsMonoNL-Regular.ttf", 64); - Font rubikBoldItalic; + NEWFONTASSET(rubikBoldItalic, "fonts/Rubik-BoldItalic.ttf", 128); NEWFONTASSET(rubikBold, "fonts/Rubik-Bold.ttf", 128); diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index 3283551a..67b41de8 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -191,6 +191,7 @@ int main(int argc, char *argv[]) { SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); initialSet.StartLoad(); + mainMenuSet.StartLoad(); AssetSet({ASSETPTR(favicon), ASSETPTR(faviconTex)}).BlockUntilLoaded(); SetWindowIcon(LoadImageFromMemory(".png", ASSET(favicon), ASSET(favicon).GetFileSize())); if (!CacheLoad::finished) { From c543a66678f47fadcfa5cfb8b7dd14105c7dbc2f Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 20:29:21 -0600 Subject: [PATCH 10/15] document these asset sets a bit --- Encore/src/assets.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index fac9f170..1c452fb5 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -212,8 +212,22 @@ Font Assets::LoadFontFilter( ); }*/ -AssetSet initialSet = {ASSETPTR(encoreWhiteLogo), ASSETPTR(JetBrainsMono), ASSETPTR(rubik), ASSETPTR(favicon), ASSETPTR(faviconTex), ASSETPTR(redHatDisplayBlack), ASSETPTR(sdfShader), ASSETPTR(josefinSansItalic), ASSETPTR(bgShader)}; -AssetSet mainMenuSet = {ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture), ASSETPTR(rubikBold), ASSETPTR(rubikBoldItalic), ASSETPTR(rubikItalic)}; +// Assets that need to be loaded in order to display the cache loading screen and the +// title screen. Adding assets to this set will affect boot times (especially fonts) +AssetSet initialSet = { ASSETPTR(encoreWhiteLogo), + ASSETPTR(rubik), + ASSETPTR(favicon), + ASSETPTR(faviconTex), + ASSETPTR(redHatDisplayBlack), + ASSETPTR(sdfShader), + ASSETPTR(josefinSansItalic), + ASSETPTR(bgShader) }; +// Assets that are queued to load at boot but aren't critical for displaying the title +// screen. Adding assets to this set results in a smaller impact on boot times +AssetSet mainMenuSet = { + ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture), ASSETPTR(rubikBold), + ASSETPTR(rubikBoldItalic), ASSETPTR(rubikItalic), ASSETPTR(JetBrainsMono), +}; #ifdef DONTCOMPILE void Assets::LoadAssets() { From 6667009ac9a80f8be8915c93f1765c52df746904 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 20:53:26 -0600 Subject: [PATCH 11/15] let's not poll that every frame --- Encore/src/assets.cpp | 2 +- Encore/src/assets.h | 16 ++++++++++++---- Encore/src/main.cpp | 4 +++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 1c452fb5..2baf0899 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -109,7 +109,7 @@ void ShaderAsset::Finalize() { const char *fragString = fragmentCode ? fragmentCode->FetchRaw() : nullptr; const char *vertString = vertexCode ? vertexCode->FetchRaw() : nullptr; shader = LoadShaderFromMemory(vertString, fragString); - for (auto uniform : uniformPositions) { + for (auto &uniform : uniformPositions) { uniform.second = GetShaderLocation(shader, uniform.first.c_str()); } state = LOADED; diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 53f8442b..b9bfc542 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -1,6 +1,7 @@ #pragma once #include "raylib.h" #include "menus/uiUnits.h" +#include "util/enclog.h" #include #include @@ -103,7 +104,12 @@ class ShaderAsset : public Asset { } int GetUniformLoc(const std::string& uniformName) { - return uniformPositions.find(uniformName)->second; + if (!uniformPositions.contains(uniformName)) { + Encore::EncoreLog(LOG_ERROR, TextFormat("Attempted to get unknown uniform %s on asset %s", uniformName.c_str(), id.c_str())); + return -1; + } + auto found = uniformPositions.find(uniformName); + return found->second; } Shader Fetch() { @@ -164,8 +170,10 @@ class FontAsset : public FileAsset { #define NEWFONTASSET(varname, path, size) FontAsset varname = FontAsset(path, size) #define NEWTEXASSET(varname, path) TextureAsset varname = TextureAsset(path, true) #define NEWTEXASSET_NOFILTER(varname, path) TextureAsset varname = TextureAsset(path, false) -#define NEWSHADERASSET(varname, fspath, vspath, uniforms) ShaderAsset varname = ShaderAsset(fspath, vspath, uniforms, {}) -#define NEWSHADERASSET_POSTFINALIZE(varname, fspath, vspath, uniforms, postfinalize) ShaderAsset varname = ShaderAsset(fspath, vspath, uniforms, postfinalize) +// Have to use variadic macros here because the preprocessor can't understand that the +// commas in the initializer list are not parameter seperators +#define NEWSHADERASSET(varname, ...) ShaderAsset varname = ShaderAsset(__VA_ARGS__, {}) +#define NEWSHADERASSET_POSTFINALIZE(varname, ...) ShaderAsset varname = ShaderAsset(__VA_ARGS__) @@ -370,7 +378,7 @@ class Assets { Texture2D CodaLaneTex; NEWSHADERASSET(sdfShader, "fonts/sdf.fs", "", {}); - NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time"}); + NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time", "test"}); // Sound clapOD; void DrawTextRubik( const char *text, float posX, float posY, float fontSize, Color color diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index 67b41de8..ac2c074b 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -241,10 +241,12 @@ int main(int argc, char *argv[]) { BeginDrawing(); ClearBackground(DARKGRAY); - if (!initialSet.PollLoaded(true)) { + static bool showLoading = true; + if (showLoading && !initialSet.PollLoaded(true)) { DrawLoadingScreen(255, initialSet.GetProgress()); } else { static float loadingScreenFade = 1.0f; + showLoading = false; if (TheMenuManager.onNewMenu) { TheMenuManager.LoadMenu(); } From 4e7a235b0519f3d1941b85f469fea5cfa8836032 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 21:59:12 -0600 Subject: [PATCH 12/15] this branch finally gets in game --- Encore/src/assets.cpp | 40 +++++++++++++++++++++++++--- Encore/src/assets.h | 41 ++++++++++++++++++++--------- Encore/src/main.cpp | 1 + Encore/src/menus/SongSelectMenu.cpp | 16 ++++++++--- 4 files changed, 79 insertions(+), 19 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 2baf0899..e8cf2f1d 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -41,6 +41,7 @@ void Asset::CheckForFetch() { Encore::EncoreLog(LOG_INFO, TextFormat("Finalizing asset %s...", id.c_str())); Finalize(); break; + default:; } } @@ -224,10 +225,41 @@ AssetSet initialSet = { ASSETPTR(encoreWhiteLogo), ASSETPTR(bgShader) }; // Assets that are queued to load at boot but aren't critical for displaying the title // screen. Adding assets to this set results in a smaller impact on boot times -AssetSet mainMenuSet = { - ASSETPTR(redHatDisplayItalic), ASSETPTR(BaseRingTexture), ASSETPTR(rubikBold), - ASSETPTR(rubikBoldItalic), ASSETPTR(rubikItalic), ASSETPTR(JetBrainsMono), -}; +AssetSet mainMenuSet = { ASSETPTR(redHatDisplayItalic), + ASSETPTR(BaseRingTexture), + ASSETPTR(rubikBold), + ASSETPTR(rubikBoldItalic), + ASSETPTR(rubikItalic), + ASSETPTR(JetBrainsMono), + ASSETPTR(discord), + ASSETPTR(github), + ASSETPTR(emptyStar), + ASSETPTR(star), + ASSETPTR(goldStar), + ASSETPTR(goldStarUnfilled), + ASSETPTR(redHatMono), + ASSETPTR(Timerbox), + ASSETPTR(TimerboxOutline), + ASSETPTR(Scorebox) }; + + + +void Assets::AddRingsAndInstruments() { + for (int i = 1; i <= 6; i++) { + TextureAsset *tex = new TextureAsset(TextFormat("ui/hugh ring/rings-%i.png", i), true); + YargRings.push_back(tex); + // Grabbing from the vec because it moved + mainMenuSet.AddAsset(tex); + } + InstIcons.push_back(new TextureAsset("ui/hugh ring/drums-inv.png", true)); + InstIcons.push_back(new TextureAsset("ui/hugh ring/bass-inv.png", true)); + InstIcons.push_back(new TextureAsset("ui/hugh ring/lead-inv.png", true)); + InstIcons.push_back(new TextureAsset("ui/hugh ring/keys-inv.png", true)); + InstIcons.push_back(new TextureAsset("ui/hugh ring/vox-inv.png", true)); + for (auto icon : InstIcons) { + mainMenuSet.AddAsset(icon); + } +} #ifdef DONTCOMPILE void Assets::LoadAssets() { diff --git a/Encore/src/assets.h b/Encore/src/assets.h index b9bfc542..0b5d2668 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -32,6 +32,8 @@ class Asset { Asset(const std::string &id) { this->id = id; } + /// Empty constructor provided so vectors can initialize. Do not use! + Asset() {} /// Starts loading this asset. virtual void StartLoad(); @@ -46,6 +48,10 @@ class Asset { return state == LOADED || state == PREFINALIZED; } + Asset(Asset &&other) noexcept : id(std::move(other.id)), + state(state.load()), + loadingThread() {} + }; class FileAsset : public Asset { @@ -63,6 +69,7 @@ class FileAsset : public Asset { FileAsset(const std::string &id) : Asset(id) { path = std::filesystem::path("Assets") / id; } + FileAsset() {} std::filesystem::path &GetPath() { return path; } @@ -74,6 +81,9 @@ class FileAsset : public Asset { virtual ~FileAsset() { //FreeFileBuffer(); } + FileAsset(FileAsset&& other) noexcept : path(std::move(other.path)), + fileSize(other.fileSize), + fileBuffer(other.fileBuffer) {} }; class ShaderAsset : public Asset { @@ -134,6 +144,7 @@ class TextureAsset : public FileAsset { TextureAsset(const std::string &id, bool filter) : FileAsset(id) { this->filter = filter; } + TextureAsset() {} Texture2D Fetch() { CheckForFetch(); return tex; @@ -141,6 +152,11 @@ class TextureAsset : public FileAsset { operator Texture2D() { return Fetch(); } + + TextureAsset(TextureAsset &&other) noexcept : FileAsset(std::move(other)), + tex(other.tex), + image(other.image), + filter(other.filter) {} }; class FontAsset : public FileAsset { @@ -186,6 +202,7 @@ class Assets { public: Assets() {} + void AddRingsAndInstruments(); static Assets &getInstance(); @@ -225,14 +242,14 @@ class Assets { Model smasherPressed; Texture2D smasherPressTex; - Texture2D goldStarUnfilled; - Texture2D star; - Texture2D goldStar; - Texture2D emptyStar; + NEWTEXASSET(goldStarUnfilled, "ui/gold-star_unfilled.png"); + NEWTEXASSET(star, "ui/star.png"); + NEWTEXASSET(goldStar, "ui/gold-star.png"); + NEWTEXASSET(emptyStar, "ui/empty-star.png"); - Texture2D Scorebox; - Texture2D Timerbox; - Texture2D TimerboxOutline; + NEWTEXASSET(Scorebox, "gameplay/ui/Scorebox.png"); + NEWTEXASSET(Timerbox, "gameplay/ui/Timerbox.png"); + NEWTEXASSET(TimerboxOutline, "gameplay/ui/TimerboxOutline.png"); Model odFrame; Model odBar; @@ -335,9 +352,9 @@ class Assets { Model liftModel; Model liftModelOD; - std::vector YargRings; + std::vector YargRings; NEWTEXASSET(BaseRingTexture, "ui/hugh ring/rings.png"); - std::vector InstIcons; + std::vector InstIcons; Image icon; NEWTEXASSET(encoreWhiteLogo, "encore-white.png"); @@ -360,8 +377,8 @@ class Assets { // clapOD = LoadSound((directory / "Assets/highway/clap.ogg").string().c_str()); // SetSoundVolume(clapOD, 0.375); - Texture2D discord; - Texture2D github; + NEWTEXASSET(discord, "ui/discord-mark-white.png"); + NEWTEXASSET(github, "ui/github-mark-white.png"); Texture2D sustainTexture; Texture2D sustainHeldTexture; @@ -378,7 +395,7 @@ class Assets { Texture2D CodaLaneTex; NEWSHADERASSET(sdfShader, "fonts/sdf.fs", "", {}); - NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time", "test"}); + NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time"}); // Sound clapOD; void DrawTextRubik( const char *text, float posX, float posY, float fontSize, Color color diff --git a/Encore/src/main.cpp b/Encore/src/main.cpp index ac2c074b..69093ea2 100644 --- a/Encore/src/main.cpp +++ b/Encore/src/main.cpp @@ -191,6 +191,7 @@ int main(int argc, char *argv[]) { SetRandomSeed(std::chrono::system_clock::now().time_since_epoch().count()); initialSet.StartLoad(); + TheAssets.AddRingsAndInstruments(); mainMenuSet.StartLoad(); AssetSet({ASSETPTR(favicon), ASSETPTR(faviconTex)}).BlockUntilLoaded(); SetWindowIcon(LoadImageFromMemory(".png", ASSET(favicon), ASSET(favicon).GetFileSize())); diff --git a/Encore/src/menus/SongSelectMenu.cpp b/Encore/src/menus/SongSelectMenu.cpp index 8af9ec9b..d3bea572 100644 --- a/Encore/src/menus/SongSelectMenu.cpp +++ b/Encore/src/menus/SongSelectMenu.cpp @@ -570,10 +570,20 @@ void SongSelectMenu::Draw() { Rectangle Placement = { IconLeftPos, BoxTopPos, IconWidth, IconWidth }; Color TintColor = WHITE; if (SongToDisplayInfo.parts[i] && SongToDisplayInfo.parts[i]->diff == -1) TintColor = DARKGRAY; - DrawTexturePro(assets.InstIcons[asdasd], { 0, 0, (float)assets.InstIcons[asdasd].width, (float)assets.InstIcons[asdasd].height }, Placement, { 0, 0 }, 0, TintColor); + auto instIcon = assets.InstIcons[asdasd]; + DrawTexturePro(*instIcon, { 0, 0, (float)instIcon->width, (float)instIcon->height }, Placement, { 0, 0 }, 0, TintColor); DrawTexturePro(assets.BaseRingTexture, { 0, 0, (float)assets.BaseRingTexture.width, (float)assets.BaseRingTexture.height }, Placement, { 0, 0 }, 0, ColorBrightness(WHITE, 2)); - if (SongToDisplayInfo.parts[i] && SongToDisplayInfo.parts[i]->diff > 0) - DrawTexturePro(assets.YargRings[SongToDisplayInfo.parts[i]->diff - 1], { 0, 0, (float)assets.YargRings[SongToDisplayInfo.parts[i]->diff - 1].width, (float)assets.YargRings[SongToDisplayInfo.parts[i]->diff - 1].height }, Placement, { 0, 0 }, 0, WHITE); + if (SongToDisplayInfo.parts[i] && SongToDisplayInfo.parts[i]->diff > 0) { + auto ring = assets.YargRings[SongToDisplayInfo.parts[i]->diff - 1]; + DrawTexturePro( + *ring, + { 0, 0, (float)ring->width, (float)ring->height }, + Placement, + { 0, 0 }, + 0, + WHITE + ); + } } GameMenu::DrawBottomOvershell(); From 73c71635afae2c412a439d80df6df74b45396ff9 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 22:37:30 -0600 Subject: [PATCH 13/15] cull as much old asset code as I can --- Encore/src/assets.cpp | 486 +--------------------------- Encore/src/assets.h | 194 +---------- Encore/src/menus/ReadyUpMenu.cpp | 12 +- Encore/src/menus/SongSelectMenu.cpp | 10 +- 4 files changed, 24 insertions(+), 678 deletions(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index e8cf2f1d..d363ba8f 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -80,6 +80,9 @@ void FileAsset::FreeFileBuffer() { free(fileBuffer); } } +const std::filesystem::path FileAsset::GetBaseDirectory() { + return TheAssets.getDirectory() / "Assets"; +} void FileAsset::Load() { LoadFile(); @@ -165,53 +168,6 @@ void FontAsset::Finalize() { state = LOADED; } -Texture2D -Assets::LoadTextureFilter(const std::filesystem::path &texturePath, int &loadedAssets) { - Texture2D tex = LoadTexture(texturePath.string().c_str()); - GenTextureMipmaps(&tex); - SetTextureFilter(tex, TEXTURE_FILTER_TRILINEAR); - loadedAssets++; - return tex; -} - -Model Assets::LoadModel_(const std::filesystem::path &modelPath, int &loadedAssets) { - return LoadModel(modelPath.string().c_str()); - loadedAssets++; -} - -Font Assets::LoadFontFilter( - const std::filesystem::path &fontPath, int fontSize, int &loadedAssets -) { - Font font = {}; - font.baseSize = fontSize; - font.glyphCount = 250; - font.glyphPadding = 4; - int fileSize = 0; - unsigned char *fileData = LoadFileData(fontPath.string().c_str(), &fileSize); - font.glyphs = LoadFontData((const unsigned char*)fileData, fileSize, fontSize, nullptr, 250, FONT_SDF); - Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, 250, fontSize, 4, 0); - for (int i = 0; i < font.glyphCount; i++) - { - UnloadImage(font.glyphs[i].image); - font.glyphs[i].image = ImageFromImage(atlas, font.recs[i]); - } - font.texture = LoadTextureFromImage(atlas); - UnloadImage(atlas); - SetTextureFilter(font.texture, TEXTURE_FILTER_TRILINEAR); - loadedAssets++; - return font; -} -/*void Assets::FirstAssets() { - icon = LoadImage((directory / "Assets/encore_favicon-NEW.png").string().c_str()); - encoreWhiteLogo = - Assets::LoadTextureFilter((directory / "Assets/encore-white.png"), loadedAssets); - rubik = Assets::LoadFontFilter( - (directory / "Assets/fonts/Rubik-Regular.ttf"), 128, loadedAssets - ); - JetBrainsMono = LoadFontFilter( - (directory / "Assets/fonts/JetBrainsMonoNL-Regular.ttf"), 64, loadedAssets - ); -}*/ // Assets that need to be loaded in order to display the cache loading screen and the // title screen. Adding assets to this set will affect boot times (especially fonts) @@ -260,439 +216,3 @@ void Assets::AddRingsAndInstruments() { mainMenuSet.AddAsset(icon); } } - -#ifdef DONTCOMPILE -void Assets::LoadAssets() { - Color accentColor = { 255, 0, 255, 255 }; - Color overdriveColor = Color { 255, 200, 0, 255 }; - std::filesystem::path highwayDir = directory / "Assets" / "gameplay" / "highway"; - //smasherReg = - // Assets::LoadModel_((highwayDir / "/smasher.obj"), loadedAssets); - smasherInner = - Assets::LoadModel_((highwayDir / "smasherInner.obj"), loadedAssets); - smasherInnerTex = - LoadTexture((highwayDir / "smasherbase.png").string().c_str()); - smasherInner.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherInnerTex; - - smasherOuter = - Assets::LoadModel_((highwayDir / "smasherOuter.obj"), loadedAssets); - smasherOuterTex = - LoadTexture((highwayDir / "smasherframe.png").string().c_str()); - smasherOuter.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherOuterTex; - - smasherTopPressedTex = - LoadTexture((highwayDir / "smasher-on.png").string().c_str()); - smasherTopUnpressedTex = - LoadTexture((highwayDir / "smasher-off.png").string().c_str()); - - smasherBoardTex = - Assets::LoadTextureFilter(highwayDir / "board.png", loadedAssets); - smasherBoard = - Assets::LoadModel_((highwayDir / "board_x.obj"), loadedAssets); - smasherBoardEMH = - Assets::LoadModel_((highwayDir / "board_emh.obj"), loadedAssets); - - lanes = Assets::LoadModel_((highwayDir / "lanes.obj"), loadedAssets); - lanesTex = - Assets::LoadTextureFilter(highwayDir / "lanes.png", loadedAssets); - - smasherPressed = - Assets::LoadModel_((highwayDir / "smasher.obj"), loadedAssets); - smasherPressTex = - LoadTexture((highwayDir / "smasher_press.png").string().c_str()); - - star = Assets::LoadTextureFilter(directory / "Assets/ui/star.png", loadedAssets); - goldStar = - Assets::LoadTextureFilter(directory / "Assets/ui/gold-star.png", loadedAssets); - goldStarUnfilled = Assets::LoadTextureFilter( - directory / "Assets/ui/gold-star_unfilled.png", loadedAssets - ); - emptyStar = - Assets::LoadTextureFilter(directory / "Assets/ui/empty-star.png", loadedAssets); - - Highway = LoadShader( - (highwayDir / "fLighting.vsh").string().c_str(), - (highwayDir / "highwayShader.fsh").string().c_str() - ); - HighwayTexShaderLoc = GetShaderLocation(Highway, "highwayTex"); - HighwayTimeShaderLoc = GetShaderLocation(Highway, "time"); - - odFrame = Assets::LoadModel_((directory / "Assets/ui/od_frame.obj"), loadedAssets); - odBar = Assets::LoadModel_((directory / "Assets/ui/od_fill.obj"), loadedAssets); - multFrame = - Assets::LoadModel_((directory / "Assets/ui/multcircle_frame.obj"), loadedAssets); - multBar = - Assets::LoadModel_((directory / "Assets/ui/multcircle_fill.obj"), loadedAssets); - multCtr3 = Assets::LoadModel_((directory / "Assets/ui/multbar_3.obj"), loadedAssets); - multCtr5 = Assets::LoadModel_((directory / "Assets/ui/multbar_5.obj"), loadedAssets); - multNumber = - Assets::LoadModel_((directory / "Assets/ui/mult_number_plane.obj"), loadedAssets); - odMultFrame = - Assets::LoadTextureFilter(directory / "Assets/ui/mult_base.png", loadedAssets); - odMultFill = - Assets::LoadTextureFilter(directory / "Assets/ui/mult_fill.png", loadedAssets); - odMultFillActive = - Assets::LoadTextureFilter(directory / "Assets/ui/mult_fill_od.png", loadedAssets); - multNumberTex = - Assets::LoadTextureFilter(directory / "Assets/ui/mult_number.png", loadedAssets); - odMultShader = LoadShader("Assets/gameplay/highway/fLighting.vsh", "Assets/ui/odmult.fs"); - multNumberShader = LoadShader(0, "Assets/ui/multnumber.fs"); - - MultInnerDot = Assets::LoadModel_( - (highwayDir / "multiplier/MultCenterDot.obj"), loadedAssets - ); - MultFill = Assets::LoadModel_( - (highwayDir / "multiplier/MultFill.obj"), loadedAssets - ); - MultOuterFrame = Assets::LoadModel_( - (highwayDir / "multiplier/MultOuterFrame.obj"), loadedAssets - ); - MultInnerFrame = Assets::LoadModel_( - (highwayDir / "multiplier/MultInnerFrame.obj"), loadedAssets - ); - - MultFillBase = Assets::LoadTextureFilter( - (highwayDir / "multiplier/Untitled.png"), loadedAssets - ); - // why is it called "od" - MultFCTex1 = Assets::LoadTextureFilter( - (highwayDir / "multiplier/od-shine.png"), loadedAssets - ); - MultFCTex2 = Assets::LoadTextureFilter( - (highwayDir / "multiplier/od-shine2.png"), loadedAssets - ); - MultFCTex3 = Assets::LoadTextureFilter( - (highwayDir / "multiplier/od-shine3.png"), loadedAssets - ); - - FullComboIndicator = LoadShader(0, "Assets/ui/fc_ind.fsh"); - BottomTextureLoc = GetShaderLocation(FullComboIndicator, "baseTex"); - MiddleTextureLoc = GetShaderLocation(FullComboIndicator, "tex1"); - TopTextureLoc = GetShaderLocation(FullComboIndicator, "tex2"); - TimeLoc = GetShaderLocation(FullComboIndicator, "time"); - FCColorLoc = GetShaderLocation(FullComboIndicator, "color"); - FCIndLoc = GetShaderLocation(FullComboIndicator, "isFC"); - BasicColorLoc = GetShaderLocation(FullComboIndicator, "basicColor"); - MultInnerFrame.materials[0].shader = FullComboIndicator; - - MultiplierFill = LoadShader(0, (highwayDir/"multiplier/MultiplierFill.fsh").string().c_str()); - - MultTextureLoc = GetShaderLocation(MultiplierFill, "BaseTexture"); // sampler - MultiplierColorLoc = GetShaderLocation(MultiplierFill, "MultiplierColor"); // vec4 - FillPercentageLoc = GetShaderLocation(MultiplierFill, "FillPercentage"); // 0-1 float - - odLoc = GetShaderLocation(odMultShader, "overdrive"); - comboCounterLoc = GetShaderLocation(odMultShader, "comboCounter"); - multLoc = GetShaderLocation(odMultShader, "multBar"); - isBassOrVocalLoc = GetShaderLocation(odMultShader, "isBassOrVocal"); - uvOffsetXLoc = GetShaderLocation(multNumberShader, "uvOffsetX"); - uvOffsetYLoc = GetShaderLocation(multNumberShader, "uvOffsetY"); - - HighwayFade = LoadShader( - (highwayDir / "fLighting.vsh").string().c_str(), - (highwayDir / "highwayFade.frag").string().c_str() - ); - HighwayFadeStartLoc = GetShaderLocation(HighwayFade, "fadeStart"); - HighwayFadeEndLoc = GetShaderLocation(HighwayFade, "fadeEnd"); - HighwayColorLoc = GetShaderLocation(HighwayFade, "colorForAccent"); - HighwayAccentFadeLoc = GetShaderLocation(HighwayFade, "useInAccent"); - HighwayFade.locs[SHADER_LOC_COLOR_DIFFUSE] = HighwayColorLoc; - - // Highway.locs[SHADER_LOC_COLOR_DIFFUSE] = GetShaderLocation(Highway, "colDiffuse"); - // Highway.locs[SHADER_LOC_MAP_DIFFUSE] = GetShaderLocation(Highway, "highwayTex"); - HighwayColorShaderLoc = GetShaderLocation(Highway, "highwayColor"); - HighwayScrollFadeStartLoc = GetShaderLocation(Highway, "fadeStart"); - HighwayScrollFadeEndLoc = GetShaderLocation(Highway, "fadeEnd"); - - expertHighwaySides = - Assets::LoadModel_(highwayDir / "sides_x.obj", loadedAssets); - DarkerHighwayThing = - Assets::LoadModel_((highwayDir / "highway_x.obj"), loadedAssets); - expertHighway = - Assets::LoadModel_((highwayDir / "highway_x.obj"), loadedAssets); - expertHighway.materials[0].shader = Highway; - - emhHighwaySides = - Assets::LoadModel_((highwayDir / "sides_emh.obj"), loadedAssets); - emhHighway = - Assets::LoadModel_((highwayDir / "highway_emh.obj"), loadedAssets); - odHighwayEMH = Assets::LoadModel_( - (highwayDir / "overdrive_emh.obj"), loadedAssets - ); - emhHighway.materials[0].shader = Highway; - emhHighwaySides.materials[0].shader = HighwayFade; - odHighwayEMH.materials[0].shader = Highway; - odHighwayX = - Assets::LoadModel_((highwayDir / "overdrive_x.obj"), loadedAssets); - odHighwayX.materials[0].shader = Highway; - highwayTexture = - Assets::LoadTextureFilter(highwayDir / "highway.png", loadedAssets); - highwayTextureOD = Assets::LoadTextureFilter( - highwayDir / "overdrive.png", loadedAssets - ); - highwaySidesTexture = - Assets::LoadTextureFilter(highwayDir / "sides.png", loadedAssets); - - noteTopModel = - Assets::LoadModel_((directory / "Assets/notes/note_top.obj"), loadedAssets); - noteBottomModel = - Assets::LoadModel_((directory / "Assets/notes/note_bottom.obj"), loadedAssets); - - KickBottomModel = - Assets::LoadModel_((directory / "Assets/notes/kick.obj"), loadedAssets); - KickSideModel = - Assets::LoadModel_((directory / "Assets/notes/kickSides.obj"), loadedAssets); - KickBottom = - Assets::LoadTextureFilter(directory / "Assets/notes/kick.png", loadedAssets); - KickSide = - Assets::LoadTextureFilter(highwayDir / "sides.png", loadedAssets); - - CymbalInner = Assets::LoadModel_( - (directory / "Assets/notes/cymbal/CymbalWhite.obj"), loadedAssets - ); - CymbalOuter = Assets::LoadModel_( - (directory / "Assets/notes/cymbal/CymbalColor.obj"), loadedAssets - ); - CymbalBottom = Assets::LoadModel_( - (directory / "Assets/notes/cymbal/CymbalBottom.obj"), loadedAssets - ); - CymbalInner.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - CymbalBottom.materials[0].maps[MATERIAL_MAP_ALBEDO].color = GRAY; - - CodaLaneTex = LoadTextureFilter((directory / "Assets/notes/codaLanes.png"), loadedAssets); - CodaLane = LoadMaterialDefault(); - CodaLane.maps[MATERIAL_MAP_ALBEDO].texture = CodaLaneTex; - CodaLane.shader = HighwayFade; - - SoloSides = LoadMaterialDefault(); - SoloSides.maps[MATERIAL_MAP_ALBEDO].texture = soloTexture; - SoloSides.shader = HighwayFade; - - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-1.png"), loadedAssets) - ); - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-2.png"), loadedAssets) - ); - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-3.png"), loadedAssets) - ); - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-4.png"), loadedAssets) - ); - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-5.png"), loadedAssets) - ); - YargRings.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings-6.png"), loadedAssets) - ); - - BaseRingTexture = - LoadTextureFilter((directory / "Assets/ui/hugh ring/rings.png"), loadedAssets); - - InstIcons.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/drums-inv.png"), loadedAssets) - ); - InstIcons.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/bass-inv.png"), loadedAssets) - ); - InstIcons.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/lead-inv.png"), loadedAssets) - ); - InstIcons.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/keys-inv.png"), loadedAssets) - ); - InstIcons.push_back( - LoadTextureFilter((directory / "Assets/ui/hugh ring/vox-inv.png"), loadedAssets) - ); - - - SoloBox = Assets::LoadModel_((highwayDir / "Solo.obj"), loadedAssets); - SoloBackground = - Assets::LoadTextureFilter(highwayDir / "SoloBox.png", loadedAssets); - SoloBox.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = SoloBackground; - - // noteTexture = Assets::LoadTextureFilter(directory / "Assets/notes/note.png", - // loadedAssets); emitTexture = Assets::LoadTextureFilter(directory / - // "Assets/notes/note_e_new.png", loadedAssets); - Scorebox = LoadTextureFilter((directory / "Assets/gameplay/ui/Scorebox.png"), loadedAssets); - Timerbox = LoadTextureFilter((directory / "Assets/gameplay/ui/Timerbox.png"), loadedAssets); - TimerboxOutline = LoadTextureFilter((directory / "Assets/gameplay/ui/TimerboxOutline.png"), loadedAssets); - - noteTopModelOD = - Assets::LoadModel_((directory / "Assets/notes/note_top_od.obj"), loadedAssets); - noteBottomModelOD = - Assets::LoadModel_((directory / "Assets/notes/note_bottom.obj"), loadedAssets); - - noteTopModelHP = - Assets::LoadModel_((directory / "Assets/notes/hopo_top.obj"), loadedAssets); - noteBottomModelHP = - Assets::LoadModel_((directory / "Assets/notes/hopo_bottom.obj"), loadedAssets); - - noteTextureOD = - Assets::LoadTextureFilter(directory / "Assets/notes/note.png", loadedAssets); - emitTextureOD = Assets::LoadTextureFilter( - directory / "Assets/notes/note_e_new.png", loadedAssets - ); - - liftModel = Assets::LoadModel_((directory / "Assets/notes/lift.obj"), loadedAssets); - liftModelOD = Assets::LoadModel_((directory / "Assets/notes/lift.obj"), loadedAssets); - - beatline = LoadModel_((highwayDir / "beatline.obj"), loadedAssets); - beatlineTex = - LoadTextureFilter((highwayDir / "beatline.png"), loadedAssets); - beatline.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = beatlineTex; - - songBackground = - Assets::LoadTextureFilter((directory / "Assets/background.png"), loadedAssets); - - redHatDisplayItalic = Assets::LoadFontFilter( - (directory / "Assets/fonts/RedHatDisplay-BlackItalic.ttf"), 128, loadedAssets - ); - redHatDisplayItalicLarge = Assets::LoadFontFilter( - (directory / "Assets/fonts/RedHatDisplay-BlackItalic.ttf"), 128, loadedAssets - ); - // redHatDisplayBlack = Assets::LoadFontFilter( - // (directory / "Assets/fonts/RedHatDisplay-Black.ttf"), 128, loadedAssets - // ); - - rubikBoldItalic = Assets::LoadFontFilter( - (directory / "Assets/fonts/Rubik-BoldItalic.ttf"), 128, loadedAssets - ); - rubikBold = Assets::LoadFontFilter( - (directory / "Assets/fonts/Rubik-Bold.ttf"), 128, loadedAssets - ); - rubikItalic = Assets::LoadFontFilter( - (directory / "Assets/fonts/Rubik-Italic.ttf"), 128, loadedAssets - ); - - josefinSansItalic = Assets::LoadFontFilter( - (directory / "Assets/fonts/JosefinSans-Italic.ttf"), 128, loadedAssets - ); - redHatMono = Assets::LoadFontFilter(directory /"Assets/fonts/RedHatMono-Bold.ttf", 128, loadedAssets); - fxaa = LoadShader(0, (directory / "Assets/ui/fxaa.frag").string().c_str()); - texLoc = GetShaderLocation(fxaa, "texture0"); - resLoc = GetShaderLocation(fxaa, "resolution"); - //sdfShader = LoadShader(0, (directory / "Assets/fonts/sdf.fs").string().c_str()); - bgShader = LoadShader(0, (directory / "Assets/ui/wavy.fs").string().c_str()); - bgTimeLoc = GetShaderLocation(bgShader, "time"); - // clapOD = LoadSound((highwayDir / "clap.ogg")); - // SetSoundVolume(clapOD, 0.375); - - discord = Assets::LoadTextureFilter( - directory / "Assets/ui/discord-mark-white.png", loadedAssets - ); - github = Assets::LoadTextureFilter( - directory / "Assets/ui/github-mark-white.png", loadedAssets - ); - - soloTexture = - Assets::LoadTextureFilter(highwayDir / "overdrive-old.png", loadedAssets); - sustainTexture = - Assets::LoadTextureFilter(directory / "Assets/notes/sustain.png", loadedAssets); - sustainHeldTexture = Assets::LoadTextureFilter( - directory / "Assets/notes/sustain-held.png", loadedAssets - ); - - // smasherReg.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherRegTex; - // smasherReg.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - // smasherReg.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherRegTex; - // smasherReg.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - - smasherPressed.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherPressTex; - smasherPressed.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - - smasherBoard.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherBoardTex; - smasherBoard.materials[0].maps[MATERIAL_MAP_ALBEDO].color = GRAY; - - smasherBoardEMH.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = smasherBoardTex; - smasherBoardEMH.materials[0].maps[MATERIAL_MAP_ALBEDO].color = GRAY; - - lanes.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = lanesTex; - lanes.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - - odFrame.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - odFrame.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - odBar.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - odBar.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - multFrame.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - multFrame.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - multBar.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - multBar.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - multCtr3.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - multCtr3.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - multCtr5.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = odMultFrame; - multCtr5.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - odBar.materials[0].maps[MATERIAL_MAP_EMISSION].texture = odMultFill; - multBar.materials[0].maps[MATERIAL_MAP_EMISSION].texture = odMultFill; - multCtr3.materials[0].maps[MATERIAL_MAP_EMISSION].texture = odMultFill; - multCtr5.materials[0].maps[MATERIAL_MAP_EMISSION].texture = odMultFill; - odBar.materials[0].shader = odMultShader; - multBar.materials[0].shader = odMultShader; - multCtr3.materials[0].shader = odMultShader; - multCtr5.materials[0].shader = odMultShader; - - odMultShader.locs[SHADER_LOC_MAP_EMISSION] = - GetShaderLocation(odMultShader, "fillTex"); - - multNumber.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = multNumberTex; - multNumber.materials[0].shader = multNumberShader; - - MultFill.materials[0].shader = MultiplierFill; - - // SetTextureWrap(highwayTextureOD, TEXTURE_WRAP_CLAMP); - - odHighwayEMH.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTextureOD; - -odHighwayX.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTextureOD; - odHighwayX.materials[0].maps[MATERIAL_MAP_ALBEDO].color = overdriveColor; - odHighwayEMH.materials[0].maps[MATERIAL_MAP_ALBEDO].color = overdriveColor; - expertHighwaySides.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = - highwaySidesTexture; - expertHighwaySides.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - expertHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTexture; - expertHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].color = GRAY; - emhHighwaySides.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwaySidesTexture; - emhHighwaySides.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - emhHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = highwayTexture; - emhHighway.materials[0].maps[MATERIAL_MAP_ALBEDO].color = GRAY; - - noteTopModel.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - noteBottomModel.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - - KickBottomModel.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = KickBottom; - KickSideModel.materials[0].maps[MATERIAL_MAP_ALBEDO].texture = KickSide; - - noteTopModelOD.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - noteBottomModelOD.materials[0].maps[MATERIAL_MAP_ALBEDO].color = overdriveColor; - - noteTopModelHP.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - noteBottomModelHP.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - - liftModel.materials[0].maps[MATERIAL_MAP_ALBEDO].color = accentColor; - liftModelOD.materials[0].maps[MATERIAL_MAP_ALBEDO].color = WHITE; - - sustainMat = LoadMaterialDefault(); - soloMat = LoadMaterialDefault(); - sustainMatHeld = LoadMaterialDefault(); - sustainMatOD = LoadMaterialDefault(); - sustainMatHeldOD = LoadMaterialDefault(); - sustainMatMiss = LoadMaterialDefault(); - soloMat.maps[MATERIAL_MAP_DIFFUSE].texture = soloTexture; - soloMat.maps[MATERIAL_MAP_DIFFUSE].color = SKYBLUE; - sustainMat.maps[MATERIAL_MAP_DIFFUSE].texture = sustainTexture; - sustainMat.maps[MATERIAL_MAP_DIFFUSE].color = - ColorTint(accentColor, { 180, 180, 180, 255 }); - sustainMatHeld.maps[MATERIAL_MAP_EMISSION].texture = sustainHeldTexture; - sustainMatHeld.maps[MATERIAL_MAP_EMISSION].color = WHITE; - sustainMatHeld.maps[MATERIAL_MAP_EMISSION].value = 1; - sustainMatHeld.maps[MATERIAL_MAP_DIFFUSE].texture = sustainHeldTexture; - sustainMatHeld.maps[MATERIAL_MAP_DIFFUSE].color = accentColor; - sustainMatOD.maps[MATERIAL_MAP_DIFFUSE].texture = sustainTexture; - sustainMatOD.maps[MATERIAL_MAP_DIFFUSE].color = { 180, 180, 180, 255 }; - sustainMatHeldOD.maps[MATERIAL_MAP_DIFFUSE].texture = sustainHeldTexture; - sustainMatHeldOD.maps[MATERIAL_MAP_DIFFUSE].color = WHITE; - sustainMatMiss.maps[MATERIAL_MAP_DIFFUSE].texture = sustainTexture; - sustainMatMiss.maps[MATERIAL_MAP_DIFFUSE].color = DARKGRAY; -} -#endif diff --git a/Encore/src/assets.h b/Encore/src/assets.h index 0b5d2668..223d3f09 100644 --- a/Encore/src/assets.h +++ b/Encore/src/assets.h @@ -66,8 +66,10 @@ class FileAsset : public Asset { char *fileBuffer; bool addNullTerminator = false; + static const std::filesystem::path GetBaseDirectory(); + FileAsset(const std::string &id) : Asset(id) { - path = std::filesystem::path("Assets") / id; + path = GetBaseDirectory() / id; } FileAsset() {} std::filesystem::path &GetPath() { @@ -195,10 +197,7 @@ class FontAsset : public FileAsset { class Assets { private: - std::vector images; std::filesystem::path directory = GetPrevDirectoryPath(GetApplicationDirectory()); - Font - LoadFontFilter(const std::filesystem::path &fontPath, int fontSize, int &loadedAssets); public: Assets() {} @@ -220,27 +219,6 @@ class Assets { NEWFILEASSET(favicon, "encore_favicon-NEW.png"); NEWTEXASSET(faviconTex, "encore_favicon-NEW.png"); - int loadedAssets; - int totalAssets = 32; - Model smasherInner; - Model smasherOuter; - Texture2D smasherInnerTex; - Texture2D smasherOuterTex; - Texture2D smasherTopPressedTex; - Texture2D smasherTopUnpressedTex; - - Model smasherBoard; - Texture2D smasherBoardTex; - Model smasherBoardEMH; - - Model beatline; - Texture2D beatlineTex; - - Model lanes; - Texture2D lanesTex; - - Model smasherPressed; - Texture2D smasherPressTex; NEWTEXASSET(goldStarUnfilled, "ui/gold-star_unfilled.png"); NEWTEXASSET(star, "ui/star.png"); @@ -251,115 +229,18 @@ class Assets { NEWTEXASSET(Timerbox, "gameplay/ui/Timerbox.png"); NEWTEXASSET(TimerboxOutline, "gameplay/ui/TimerboxOutline.png"); - Model odFrame; - Model odBar; - Model multFrame; - Model multBar; - Model multCtr3; - Model multCtr5; - Model multNumber; - Texture2D odMultFrame; - Texture2D odMultFill; - Texture2D odMultFillActive; - Texture2D multNumberTex; - - Texture2D MultFillBase; - Texture2D MultFCTex1; - Texture2D MultFCTex2; - Texture2D MultFCTex3; - - Model MultInnerDot; - Model MultFill; - Model MultOuterFrame; - Model MultInnerFrame; - - int MultTextureLoc; - int MultiplierColorLoc; - int FillPercentageLoc; - - Shader MultiplierFill; - Shader FullComboIndicator; - int BottomTextureLoc; - int MiddleTextureLoc; - int TopTextureLoc; - int BasicColorLoc; - int TimeLoc; - int FCColorLoc; - int FCIndLoc; - Shader Highway; - int HighwayTexShaderLoc; - int HighwayTimeShaderLoc; - int HighwayColorShaderLoc; - int HighwayScrollFadeStartLoc; - int HighwayScrollFadeEndLoc; - int CurveMaxLoc; - Shader HighwayFade; - int HighwayFadeStartLoc; - int HighwayFadeEndLoc; - int HighwayColorLoc; - int HighwayAccentFadeLoc; - - Shader odMultShader; - Shader multNumberShader; - Shader fxaa; - - int texLoc; - int resLoc; - - int odLoc; - int comboCounterLoc; - int multLoc; - int isBassOrVocalLoc; - int uvOffsetXLoc; - int uvOffsetYLoc; - - Model expertHighwaySides; - Model expertHighway; - Model emhHighwaySides; - Model emhHighway; - Model odHighwayEMH; - Model odHighwayX; - Model DarkerHighwayThing; - Texture2D highwayTexture; - Texture2D highwayTextureOD; - Texture2D highwaySidesTexture; - - Model noteBottomModelHP; - Model noteTopModelHP; - - Model noteBottomModel; - Model noteTopModel; - Texture2D noteTexture; - Texture2D emitTexture; - - Model KickBottomModel; - Model KickSideModel; - Texture2D KickBottom; - Texture2D KickSide; - - Model CymbalInner; - Model CymbalOuter; - Model CymbalBottom; - - Model SoloBox; - Texture2D SoloBackground; - - Model noteBottomModelOD; - Model noteTopModelOD; - Texture2D noteTextureOD; - Texture2D emitTextureOD; - - Model liftModel; - Model liftModelOD; - std::vector YargRings; NEWTEXASSET(BaseRingTexture, "ui/hugh ring/rings.png"); + std::vector YargRings; std::vector InstIcons; Image icon; NEWTEXASSET(encoreWhiteLogo, "encore-white.png"); Texture2D songBackground; + // Used as a default background for the menu + NEWTEXASSET(highwayTexture, "gameplay/highway/highway.png"); + NEWFONTASSET(redHatDisplayItalic, "fonts/RedHatDisplay-BlackItalic.ttf", 128); NEWFONTASSET(redHatDisplayBlack, "fonts/RedHatDisplay-Black.ttf", 128); NEWFONTASSET(redHatDisplayItalicLarge, "fonts/RedHatDisplay-Black.ttf", 128); @@ -374,81 +255,22 @@ class Assets { NEWFONTASSET(rubikBold, "fonts/Rubik-Bold.ttf", 128); - // clapOD = LoadSound((directory / "Assets/highway/clap.ogg").string().c_str()); - // SetSoundVolume(clapOD, 0.375); - NEWTEXASSET(discord, "ui/discord-mark-white.png"); NEWTEXASSET(github, "ui/github-mark-white.png"); - Texture2D sustainTexture; - Texture2D sustainHeldTexture; - Texture2D soloTexture; - Material soloMat; - Material sustainMat; - Material sustainMatOD; - Material sustainMatHeld; - Material sustainMatHeldOD; - Material sustainMatMiss; - - Material SoloSides; - Material CodaLane; - Texture2D CodaLaneTex; NEWSHADERASSET(sdfShader, "fonts/sdf.fs", "", {}); NEWSHADERASSET(bgShader, "ui/wavy.fs", "", {"time"}); - // Sound clapOD; - void DrawTextRubik( - const char *text, float posX, float posY, float fontSize, Color color - ) { - BeginShaderMode(sdfShader); - DrawTextEx(rubik, text, { posX, posY }, fontSize, 1, color); - EndShaderMode(); - } + void DrawTextRHDI(const char* text, float x, float y, float fontSize, Color color) { DrawTextEx(redHatDisplayItalic, text, {x, y}, fontSize, 0, color); BeginShaderMode(sdfShader); EndShaderMode(); } - void DrawTextJSN(const char *text, float posX, float posY, Color color) { - BeginShaderMode(sdfShader); - DrawTextEx(josefinSansNormal, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); - EndShaderMode(); - } - void DrawTextJSB(const char *text, float posX, float posY, Color color) { - BeginShaderMode(sdfShader); - DrawTextEx(josefinSansBold, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); - EndShaderMode(); - } - - void DrawTextJSI(const char *text, float posX, float posY, Color color) { - BeginShaderMode(sdfShader); - DrawTextEx(josefinSansItalic, text, { posX, posY }, Units::getInstance().hinpct(0.05f), 1, color); - EndShaderMode(); - } - // I don't like these measure functions. Why are they so inconsistent? - // These would probably be better inlined... - Sulfrix float MeasureTextRubik(const char *text, float fontSize) { return MeasureTextEx(rubik, text, fontSize, 1).x; } - float MeasureTextRHDI(const char *text) { - return MeasureTextEx(redHatDisplayItalic, text, 48, 1).x; - } - float MeasureTextJSN(const char *text, float fontSize) { - return MeasureTextEx(josefinSansNormal, text, 48, 1).x; - } - float MeasureTextJSB(const char *text, float fontSize) { - return MeasureTextEx(josefinSansBold, text, 48, 1).x; - } - float MeasureTextJSI(const char *text, float fontSize) { - return MeasureTextEx(josefinSansItalic, text, 48, 1).x; - } - static Texture2D - LoadTextureFilter(const std::filesystem::path &texturePath, int &loadedAssets); - static Model LoadModel_(const std::filesystem::path &modelPath, int &loadedAssets); - void FirstAssets(); - void LoadAssets(); - void TempAssets(); // For development of the asset rework, this should be removed! }; #undef NEWTEXASSET diff --git a/Encore/src/menus/ReadyUpMenu.cpp b/Encore/src/menus/ReadyUpMenu.cpp index 97c9317f..21ab9dba 100644 --- a/Encore/src/menus/ReadyUpMenu.cpp +++ b/Encore/src/menus/ReadyUpMenu.cpp @@ -220,12 +220,12 @@ void ReadyUpMenu::Draw() { || player.Instrument == PlasticBass) { isBassOrVocal = 1; } - SetShaderValue( - assets.odMultShader, - assets.isBassOrVocalLoc, - &isBassOrVocal, - SHADER_UNIFORM_INT - ); + // SetShaderValue( + // assets.odMultShader, + // assets.isBassOrVocalLoc, + // &isBassOrVocal, + // SHADER_UNIFORM_INT + // ); } GuiSetStyle(BUTTON, TEXT_COLOR_NORMAL, 0xcbcbcbFF); GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER); diff --git a/Encore/src/menus/SongSelectMenu.cpp b/Encore/src/menus/SongSelectMenu.cpp index d3bea572..4d545ef0 100644 --- a/Encore/src/menus/SongSelectMenu.cpp +++ b/Encore/src/menus/SongSelectMenu.cpp @@ -569,12 +569,16 @@ void SongSelectMenu::Draw() { float IconLeftPos = (float)(u.RightSide - AlbumHeight) + IconWidth * ResetToLeftPos; Rectangle Placement = { IconLeftPos, BoxTopPos, IconWidth, IconWidth }; Color TintColor = WHITE; - if (SongToDisplayInfo.parts[i] && SongToDisplayInfo.parts[i]->diff == -1) TintColor = DARKGRAY; + int diffNumber = SongToDisplayInfo.parts[i]->diff; + if (SongToDisplayInfo.parts[i] && diffNumber == -1) TintColor = DARKGRAY; auto instIcon = assets.InstIcons[asdasd]; DrawTexturePro(*instIcon, { 0, 0, (float)instIcon->width, (float)instIcon->height }, Placement, { 0, 0 }, 0, TintColor); DrawTexturePro(assets.BaseRingTexture, { 0, 0, (float)assets.BaseRingTexture.width, (float)assets.BaseRingTexture.height }, Placement, { 0, 0 }, 0, ColorBrightness(WHITE, 2)); - if (SongToDisplayInfo.parts[i] && SongToDisplayInfo.parts[i]->diff > 0) { - auto ring = assets.YargRings[SongToDisplayInfo.parts[i]->diff - 1]; + if (SongToDisplayInfo.parts[i] && diffNumber > 0) { + if (diffNumber > 6) { + diffNumber = 6; + } + auto ring = assets.YargRings[diffNumber - 1]; DrawTexturePro( *ring, { 0, 0, (float)ring->width, (float)ring->height }, From e39d510825fe8d0e25a1a1ab9dbd48ae20a2df17 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Wed, 7 Jan 2026 22:51:15 -0600 Subject: [PATCH 14/15] msvc pls --- Encore/src/assets.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index d363ba8f..798350d8 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -124,7 +124,7 @@ void ShaderAsset::Finalize() { void TextureAsset::Load() { LoadFile(); - image = LoadImageFromMemory(GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + image = LoadImageFromMemory((const char *)GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); width = image.width; height = image.height; FreeFileBuffer(); From 8bf1c7cbd2a9a7362afcdfbb1c3be579c8947f34 Mon Sep 17 00:00:00 2001 From: Sulfrix Date: Thu, 8 Jan 2026 00:42:25 -0600 Subject: [PATCH 15/15] fuck you nt --- Encore/src/assets.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Encore/src/assets.cpp b/Encore/src/assets.cpp index 798350d8..ecddde53 100644 --- a/Encore/src/assets.cpp +++ b/Encore/src/assets.cpp @@ -124,7 +124,8 @@ void ShaderAsset::Finalize() { void TextureAsset::Load() { LoadFile(); - image = LoadImageFromMemory((const char *)GetPath().extension().c_str(), (const unsigned char*)fileBuffer, fileSize); + image = LoadImageFromMemory( + reinterpret_cast(GetPath().extension().generic_u8string().c_str()), (const unsigned char*)fileBuffer, fileSize); width = image.width; height = image.height; FreeFileBuffer();