From d107be98d4d38cb5e46939c867547e4a4699bd97 Mon Sep 17 00:00:00 2001
From: OusmBlueNinja <89956790+OusmBlueNinja@users.noreply.github.com>
Date: Thu, 22 May 2025 09:25:29 -0500
Subject: [PATCH] Improves asset loading and shader management
Improves asset management by adding a shutdown procedure that safely terminates the asset scanning thread. This prevents crashes and ensures a clean exit.
Enhances shader management by introducing shader naming and improved error logging. This makes debugging easier. Also renames the sprite shader.
Fixes a minor bug related to sprite drawing position.
Adds Git mappings for submodules.
---
.idea/vcs.xml | 3 +++
main.cpp | 1 -
src/core/Core.cpp | 19 ++++++++++++++-----
src/core/renderer/Renderer.cpp | 2 +-
src/core/systems/AssetManager.cpp | 9 ++++++++-
src/core/systems/Shader.cpp | 10 ++++++----
src/core/systems/Shader.h | 5 ++++-
src/editor/Editor.cpp | 6 +++++-
8 files changed, 41 insertions(+), 14 deletions(-)
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1dd..d8a45e9 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -2,5 +2,8 @@
+
+
+
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
index 4265ee5..09eea31 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,7 +3,6 @@
//
#include "Editor.h"
-#include "Layer.h"
#include "Core.h"
int main()
diff --git a/src/core/Core.cpp b/src/core/Core.cpp
index 2eaadbb..89a4876 100644
--- a/src/core/Core.cpp
+++ b/src/core/Core.cpp
@@ -10,6 +10,7 @@
namespace OX
{
+
void Core::AddLayer(std::unique_ptr layer)
{
Logger::LogDebug("Added Layer: '%s'", layer->GetName().c_str());
@@ -25,6 +26,11 @@ namespace OX
OX_ASSERT(!m_layers.empty(), "No Layers Attached");
+ for (const auto &layer: m_layers) {
+ Logger::LogDebug("Initializing Layer: '%s'", layer->GetName().c_str());
+ layer->Init(*this);
+ }
+
std::string layerTitle;
for (size_t i = 0; i < m_layers.size(); ++i) {
if (i > 0)
@@ -33,10 +39,7 @@ namespace OX
}
- for (const auto &layer: m_layers) {
- Logger::LogDebug("Initializing Layer: '%s'", layer->GetName().c_str());
- layer->Init(*this);
- }
+
std::string fullTitle = layerTitle + " - " + m_name;
@@ -49,6 +52,7 @@ namespace OX
}
+
void Core::Run()
{
m_running = true;
@@ -84,7 +88,7 @@ namespace OX
if (auto asset = AssetManager::Get("res://Assets/tile_001.png"); asset && asset->GetTypeName() == "texture2D") {
const auto tex = std::static_pointer_cast(asset);
- renderer.DrawSprite({tex->GetID(), {100, 100}, {64, 64}});
+ renderer.DrawSprite({tex->GetID(), {0, 0}, {64, 64}});
}
@@ -103,12 +107,17 @@ namespace OX
for (auto &layer: m_layers) {
+
Logger::LogDebug("Shutting down Layer: '%s'", layer->GetName().c_str());
layer->Shutdown(*this);
+ Logger::LogOk("'%s' Shutdown Complete", layer->GetName().c_str());
+
}
m_layers.clear();
+
AssetManager::Shutdown();
+ Logger::LogOk("AssetManager Shutdown Complete.");
window.Shutdown();
diff --git a/src/core/renderer/Renderer.cpp b/src/core/renderer/Renderer.cpp
index 683c2b7..82e8d0a 100644
--- a/src/core/renderer/Renderer.cpp
+++ b/src/core/renderer/Renderer.cpp
@@ -78,7 +78,7 @@ namespace OX
FragColor = texture(u_Texture, vUV);
}
)GLSL";
-
+ m_shader.SetName("SpriteShader");
m_shader.LoadFromSource(vs, fs);
CreateQuad();
diff --git a/src/core/systems/AssetManager.cpp b/src/core/systems/AssetManager.cpp
index ccbcbd7..da64161 100644
--- a/src/core/systems/AssetManager.cpp
+++ b/src/core/systems/AssetManager.cpp
@@ -15,7 +15,8 @@ namespace OX
// statics
std::unordered_map > AssetManager::s_LoadedAssets;
std::unordered_map AssetManager::s_MetadataMap;
- // Map from actual file path to virtual ID
+
+ // Map from an actual file path to virtual ID
std::unordered_map AssetManager::s_PathToID;
std::mutex AssetManager::s_AssetMutex;
std::mutex AssetManager::s_TreeMutex;
@@ -44,6 +45,9 @@ namespace OX
void AssetManager::Shutdown()
{
+
+ s_Scanning = false;
+
if (s_ScanThread.joinable()) {
s_ScanThread.join();
}
@@ -66,6 +70,9 @@ namespace OX
{
while (s_Scanning) {
for (auto &entry: fs::recursive_directory_iterator(s_ProjectRoot)) {
+
+ if (!s_Scanning) break; // Note: This is needed or shutdown takes ages.
+
const auto &path = entry.path();
std::string resPath = MakeVirtualPath(path);
diff --git a/src/core/systems/Shader.cpp b/src/core/systems/Shader.cpp
index 4caab21..8c74643 100644
--- a/src/core/systems/Shader.cpp
+++ b/src/core/systems/Shader.cpp
@@ -48,7 +48,7 @@ namespace OX
if (!success) {
char info[512];
glGetProgramInfoLog(program, 512, nullptr, info);
- std::cerr << "[Shader] Linking failed:\n" << info << '\n';
+ Logger::LogError("'%s' Linking failed: '%s'", m_name.c_str(), info);
glDeleteProgram(program);
return false;
}
@@ -61,7 +61,7 @@ namespace OX
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
- Logger::LogOk("Shader Loaded (%s,%s)", m_vertexPath.c_str(), m_fragmentPath.c_str());
+ Logger::LogDebug("Shader '%s' Loaded", m_name.c_str());
return true;
}
@@ -90,7 +90,8 @@ namespace OX
char info[512];
glGetShaderInfoLog(shader, 512, nullptr, info);
- Logger::LogError("Failed to Compile Shader '%s', '%s'", m_fragmentPath.c_str(), info);
+
+ Logger::LogDebug("Failed to Compile Shader: '%s'", m_name.c_str());
return 0;
}
@@ -116,7 +117,8 @@ namespace OX
Reload();
}
} catch (const std::exception &e) {
- Logger::LogError("Failed to Reload Shader '%s', %s", m_vertexPath.c_str(), e.what());
+ Logger::LogError("Failed to Reload Shader '%s', %s", m_name.c_str(), e.what());
+
}
}
diff --git a/src/core/systems/Shader.h b/src/core/systems/Shader.h
index e20fc7c..8da4902 100644
--- a/src/core/systems/Shader.h
+++ b/src/core/systems/Shader.h
@@ -16,6 +16,8 @@ namespace OX
Shader(const std::string &vertexPath, const std::string &fragmentPath);
+ void SetName(const std::string &name) { m_name = name; };
+
bool LoadFromFiles(const std::string &vertexPath, const std::string &fragmentPath);
bool LoadFromSource(const std::string &vertexSrc, const std::string &fragmentSrc);
@@ -40,9 +42,10 @@ namespace OX
void SetMat4(const std::string &name, const glm::mat4 &value);
- void SetBool(const std::string &name, const bool value);
+ void SetBool(const std::string &name, bool value);
private:
+ std::string m_name{"Default Shader"};
GLuint m_programID = 0;
std::string m_vertexPath;
std::string m_fragmentPath;
diff --git a/src/editor/Editor.cpp b/src/editor/Editor.cpp
index 02d7768..1717374 100644
--- a/src/editor/Editor.cpp
+++ b/src/editor/Editor.cpp
@@ -18,6 +18,10 @@ namespace OX
{
Logger::LogInfo("%s Init", m_name.c_str());
+
+ m_name = OX_EDITOR_VERSION;
+
+
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO &io = ImGui::GetIO();
@@ -163,9 +167,9 @@ namespace OX
delete fileBrowser;
fileBrowser = nullptr;
- Logger::LogOk("Editor::Shutdown");
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
+
}
} // OX