From 10b593631c35d9f0b0fa293bedf41630747ef99d Mon Sep 17 00:00:00 2001 From: WSAL Evan Date: Tue, 4 Nov 2025 17:42:01 -0500 Subject: [PATCH] Working AssetManager and Shader class --- CMakeLists.txt | 3 ++ include/wv/assets/AssetLoader.h | 12 ++++++++ include/wv/assets/AssetManager.h | 19 ++++++------- include/wv/assets/AssetProvider.h | 27 +++++++++++------- include/wv/assets/IAssetProvider.h | 9 ------ include/wv/core.h | 4 ++- include/wv/rendering/Shader.h | 16 +++++++++-- src/rendering/Shader.cpp | 45 +++++++++++++++++++----------- 8 files changed, 87 insertions(+), 48 deletions(-) create mode 100644 include/wv/assets/AssetLoader.h delete mode 100644 include/wv/assets/IAssetProvider.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 07d4dc9..88f6fcc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,10 @@ add_library(WVCore STATIC src/app/App.cpp + src/assets/AssetManager.cpp + src/rendering/Renderer.cpp + src/rendering/Shader.cpp src/rendering/Window.cpp ${glad_SOURCE_DIR}/src/glad.c diff --git a/include/wv/assets/AssetLoader.h b/include/wv/assets/AssetLoader.h new file mode 100644 index 0000000..fc74285 --- /dev/null +++ b/include/wv/assets/AssetLoader.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace WillowVox +{ + template + struct AssetLoader + { + static std::shared_ptr Load(const std::string& name); + }; +} \ No newline at end of file diff --git a/include/wv/assets/AssetManager.h b/include/wv/assets/AssetManager.h index ec139db..5f6f1aa 100644 --- a/include/wv/assets/AssetManager.h +++ b/include/wv/assets/AssetManager.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -12,23 +12,22 @@ namespace WillowVox static AssetManager& GetInstance(); template - void GetAsset(const std::string& assetName) + std::shared_ptr GetAsset(const std::string& name) { - IAssetProvider* provider = nullptr; + // Get the asset provider for the given type + AssetProvider* provider = nullptr; auto it = m_AssetTypes.find(typeid(T)); if (it != m_AssetTypes.end()) - { - provider = it->second.get(); - // Use provider to get the asset - } + provider = static_cast*>(it->second.get()); else { // Create and register a new provider for this asset type - m_AssetTypes[typeid(T)] = std::make_unique(); - provider = m_AssetTypes[typeid(T)].get(); + m_AssetTypes[typeid(T)] = std::make_unique>(); + provider = static_cast*>(m_AssetTypes[typeid(T)].get()); } - + // Get the asset from the provider + return provider->GetAsset(name); } private: diff --git a/include/wv/assets/AssetProvider.h b/include/wv/assets/AssetProvider.h index abcae74..a5058f6 100644 --- a/include/wv/assets/AssetProvider.h +++ b/include/wv/assets/AssetProvider.h @@ -1,31 +1,38 @@ #pragma once -#include +#include +#include namespace WillowVox { + class IAssetProvider + { + public: + }; + template class AssetProvider : public IAssetProvider { public: - T GetAsset(const std::string& assetName) + std::shared_ptr GetAsset(const std::string& name) { - auto it = m_Assets.find(assetName); - if (it != m_Assets.end()) - { + auto it = m_assets.find(name); + if (it != m_assets.end()) return it->second; - } else { - T asset = LoadAsset(assetName); - m_Assets[assetName] = asset; + std::shared_ptr asset = AssetLoader::Load(name); + m_assets.emplace(name, asset); return asset; } } - T LoadAsset(const std::string& assetName); + void AddAsset(const std::string& name, std::shared_ptr asset) + { + m_assets.emplace(name, asset); + } private: - std::unordered_map m_Assets; + std::unordered_map> m_assets; }; } \ No newline at end of file diff --git a/include/wv/assets/IAssetProvider.h b/include/wv/assets/IAssetProvider.h deleted file mode 100644 index eacec32..0000000 --- a/include/wv/assets/IAssetProvider.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -namespace WillowVox -{ - class IAssetProvider - { - public: - }; -} \ No newline at end of file diff --git a/include/wv/core.h b/include/wv/core.h index 2328693..8303940 100644 --- a/include/wv/core.h +++ b/include/wv/core.h @@ -4,4 +4,6 @@ #include -#include \ No newline at end of file +#include + +#include \ No newline at end of file diff --git a/include/wv/rendering/Shader.h b/include/wv/rendering/Shader.h index f979f80..a9da18e 100644 --- a/include/wv/rendering/Shader.h +++ b/include/wv/rendering/Shader.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace WillowVox @@ -7,8 +8,11 @@ namespace WillowVox class Shader { public: - Shader(const char* vertexShaderPath, const char* fragmentShaderPath); - Shader(const char* vertexShaderCode, const char* fragmentShaderCode, bool codePassed); + static std::shared_ptr FromFiles(const char* vertexShaderPath, const char* fragmentShaderPath); + static std::shared_ptr FromFiles(const std::string& name); + static std::shared_ptr FromSource(const char* vertexShaderCode, const char* fragmentShaderCode); + + Shader(unsigned int programId) : _programId(programId) {} ~Shader(); void Bind(); @@ -27,4 +31,12 @@ namespace WillowVox private: unsigned int _programId; }; + + template<> struct AssetLoader + { + static std::shared_ptr Load(const std::string& name) + { + return Shader::FromFiles(name); + } + }; } \ No newline at end of file diff --git a/src/rendering/Shader.cpp b/src/rendering/Shader.cpp index 3ae989e..f1a4a89 100644 --- a/src/rendering/Shader.cpp +++ b/src/rendering/Shader.cpp @@ -9,8 +9,8 @@ namespace WillowVox { - Shader::Shader(const char* vertexShaderPath, const char* fragmentShaderPath) - { + std::shared_ptr Shader::FromFiles(const char* vertexShaderPath, const char* fragmentShaderPath) + { // 1. retrieve the vertex/fragment source code from filePath std::string vertexCode; std::string fragmentCode; @@ -72,24 +72,34 @@ namespace WillowVox } // shader program - _programId = glCreateProgram(); - glAttachShader(_programId, vertex); - glAttachShader(_programId, fragment); - glLinkProgram(_programId); + unsigned int programId = glCreateProgram(); + glAttachShader(programId, vertex); + glAttachShader(programId, fragment); + glLinkProgram(programId); // print linking errors if any - glGetProgramiv(_programId, GL_LINK_STATUS, &success); + glGetProgramiv(programId, GL_LINK_STATUS, &success); if (!success) { - glGetProgramInfoLog(_programId, 512, nullptr, infoLog); + glGetProgramInfoLog(programId, 512, nullptr, infoLog); Logger::Error("Error linking shader program: %s", infoLog); } // delete the shaders glDeleteShader(vertex); glDeleteShader(fragment); - } - Shader::Shader(const char* vertexShaderCode, const char* fragmentShaderCode, bool codePassed) + std::shared_ptr shader = std::make_shared(programId); + return shader; + } + + std::shared_ptr Shader::FromFiles(const std::string& name) + { + std::string vertPath = "assets/shaders/" + name + ".vert"; + std::string fragPath = "assets/shaders/" + name + ".frag"; + return Shader::FromFiles(vertPath.c_str(), fragPath.c_str()); + } + + std::shared_ptr Shader::FromSource(const char* vertexShaderCode, const char* fragmentShaderCode) { // 2. compile shaders unsigned int vertex, fragment; @@ -121,21 +131,24 @@ namespace WillowVox } // shader program - _programId = glCreateProgram(); - glAttachShader(_programId, vertex); - glAttachShader(_programId, fragment); - glLinkProgram(_programId); + unsigned int programId = glCreateProgram(); + glAttachShader(programId, vertex); + glAttachShader(programId, fragment); + glLinkProgram(programId); // print linking errors if any - glGetProgramiv(_programId, GL_LINK_STATUS, &success); + glGetProgramiv(programId, GL_LINK_STATUS, &success); if (!success) { - glGetProgramInfoLog(_programId, 512, nullptr, infoLog); + glGetProgramInfoLog(programId, 512, nullptr, infoLog); Logger::Error("Error linking shader program: %s", infoLog); } // delete the shaders glDeleteShader(vertex); glDeleteShader(fragment); + + std::shared_ptr shader = std::make_shared(programId); + return shader; } Shader::~Shader()