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.
This commit is contained in:
OusmBlueNinja 2025-05-22 09:25:29 -05:00
parent f7e0882597
commit d107be98d4
8 changed files with 41 additions and 14 deletions

3
.idea/vcs.xml generated
View File

@ -2,5 +2,8 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cmake-build-debug/_deps/assimp-src" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cmake-build-debug/_deps/glfw-src" vcs="Git" />
<mapping directory="$PROJECT_DIR$/cmake-build-debug/_deps/imgui-src" vcs="Git" />
</component>
</project>

View File

@ -3,7 +3,6 @@
//
#include "Editor.h"
#include "Layer.h"
#include "Core.h"
int main()

View File

@ -10,6 +10,7 @@
namespace OX
{
void Core::AddLayer(std::unique_ptr<Layer> 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<Texture2D>(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();

View File

@ -78,7 +78,7 @@ namespace OX
FragColor = texture(u_Texture, vUV);
}
)GLSL";
m_shader.SetName("SpriteShader");
m_shader.LoadFromSource(vs, fs);
CreateQuad();

View File

@ -15,7 +15,8 @@ namespace OX
// statics
std::unordered_map<std::string, std::shared_ptr<Asset> > AssetManager::s_LoadedAssets;
std::unordered_map<std::string, AssetManager::AssetMetadata> AssetManager::s_MetadataMap;
// Map from actual file path to virtual ID
// Map from an actual file path to virtual ID
std::unordered_map<std::string, std::string> 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);

View File

@ -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());
}
}

View File

@ -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;

View File

@ -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