Riyyi
7 months ago
18 changed files with 342 additions and 395 deletions
@ -0,0 +1,55 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <memory> // std::shared_ptr, std::static_pointer_cast |
||||||
|
#include <string> |
||||||
|
#include <string_view> |
||||||
|
|
||||||
|
#include "ruc/format/log.h" |
||||||
|
|
||||||
|
#include "inferno/asset/asset-manager.h" |
||||||
|
#include "inferno/asset/shader.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
AssetManager::AssetManager(s) |
||||||
|
{ |
||||||
|
ruc::info("AssetManager initialized"); |
||||||
|
} |
||||||
|
|
||||||
|
AssetManager::~AssetManager() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void AssetManager::add(std::string_view path, std::shared_ptr<Asset> asset) |
||||||
|
{ |
||||||
|
// Construct (key, value) pair and insert it into the unordered_map
|
||||||
|
auto stringPath = std::string(path.begin(), path.end()); |
||||||
|
m_assetList.emplace(std::move(stringPath), std::move(asset)); |
||||||
|
} |
||||||
|
|
||||||
|
bool AssetManager::exists(std::string_view path) |
||||||
|
{ |
||||||
|
return m_assetList.find(path.data()) != m_assetList.end(); |
||||||
|
} |
||||||
|
|
||||||
|
void AssetManager::remove(std::string_view path) |
||||||
|
{ |
||||||
|
if (exists(path)) { |
||||||
|
m_assetList.erase(path.data()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void AssetManager::remove(std::shared_ptr<Asset> asset) |
||||||
|
{ |
||||||
|
if (exists(asset->path())) { |
||||||
|
m_assetList.erase(asset->path()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,94 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <memory> // std::shared_ptr |
||||||
|
#include <string> |
||||||
|
#include <string_view> |
||||||
|
#include <unordered_map> |
||||||
|
|
||||||
|
#include "ruc/meta/assert.h" |
||||||
|
#include "ruc/meta/types.h" |
||||||
|
#include "ruc/singleton.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
class Asset { |
||||||
|
public: |
||||||
|
virtual ~Asset() = default; |
||||||
|
|
||||||
|
std::string path() const { return m_path; } |
||||||
|
|
||||||
|
// -------------------------------------
|
||||||
|
|
||||||
|
std::string className() const { return typeid(*this).name(); } |
||||||
|
|
||||||
|
template<typename T> |
||||||
|
bool fastIs() const = delete; |
||||||
|
|
||||||
|
virtual bool isFont() const { return false; } |
||||||
|
virtual bool isShader() const { return false; } |
||||||
|
virtual bool isTexture() const { return false; } |
||||||
|
virtual bool isTexture2D() const { return false; } |
||||||
|
virtual bool isTextureCubemap() const { return false; } |
||||||
|
|
||||||
|
protected: |
||||||
|
Asset(std::string_view path) |
||||||
|
: m_path(std::string(path.begin(), path.end())) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
protected: |
||||||
|
std::string m_path; |
||||||
|
}; |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
template<typename T> |
||||||
|
concept IsAsset = std::same_as<Asset, T> || std::derived_from<T, Asset>; |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
class AssetManager : public ruc::Singleton<AssetManager> { |
||||||
|
public: |
||||||
|
AssetManager(s); |
||||||
|
virtual ~AssetManager(); |
||||||
|
|
||||||
|
void add(std::string_view path, std::shared_ptr<Asset> asset); |
||||||
|
bool exists(std::string_view path); |
||||||
|
void remove(std::string_view path); |
||||||
|
void remove(std::shared_ptr<Asset> asset); |
||||||
|
|
||||||
|
template<IsAsset T> |
||||||
|
std::shared_ptr<T> get(std::string_view path) |
||||||
|
{ |
||||||
|
if (!exists(path)) { |
||||||
|
return nullptr; |
||||||
|
} |
||||||
|
|
||||||
|
auto asset = m_assetList.at(path.data()); |
||||||
|
VERIFY(is<T>(asset.get()), "expected asset {}, got {}", typeid(T).name(), asset->className()); |
||||||
|
return std::static_pointer_cast<T>(asset); |
||||||
|
} |
||||||
|
|
||||||
|
template<IsAsset T> |
||||||
|
std::shared_ptr<T> load(std::string_view path) |
||||||
|
{ |
||||||
|
if (exists(path)) { |
||||||
|
return get<T>(path); |
||||||
|
} |
||||||
|
|
||||||
|
auto asset = T::create(path); |
||||||
|
add(path, asset); |
||||||
|
return asset; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
std::unordered_map<std::string, std::shared_ptr<Asset>> m_assetList; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -0,0 +1,64 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022,2024 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <cstdint> // int32_t, uint32_t |
||||||
|
#include <string_view> |
||||||
|
|
||||||
|
#include "glm/fwd.hpp" // glm::mat3, glm::mat4, glm::vec2, glm::vec3 |
||||||
|
|
||||||
|
#include "inferno/asset/asset-manager.h" |
||||||
|
|
||||||
|
namespace Inferno { |
||||||
|
|
||||||
|
class Shader : public Asset { |
||||||
|
public: |
||||||
|
virtual ~Shader(); |
||||||
|
|
||||||
|
// Factory function
|
||||||
|
static std::shared_ptr<Shader> create(std::string_view path); |
||||||
|
|
||||||
|
int32_t findUniform(std::string_view name) const; |
||||||
|
|
||||||
|
void setInt(std::string_view name, int value); |
||||||
|
void setInt(std::string_view name, int* values, uint32_t count); |
||||||
|
void setFloat(std::string_view name, float value) const; |
||||||
|
void setFloat(std::string_view name, float v1, float v2, float v3, float v4) const; |
||||||
|
void setFloat(std::string_view name, glm::vec2 value) const; |
||||||
|
void setFloat(std::string_view name, glm::vec3 value) const; |
||||||
|
void setFloat(std::string_view name, glm::vec4 value) const; |
||||||
|
void setFloat(std::string_view name, glm::mat3 matrix) const; |
||||||
|
void setFloat(std::string_view name, glm::mat4 matrix) const; |
||||||
|
|
||||||
|
void bind() const; |
||||||
|
void unbind() const; |
||||||
|
|
||||||
|
uint32_t id() const { return m_id; } |
||||||
|
|
||||||
|
protected: |
||||||
|
uint32_t compileShader(int32_t type, const char* shaderSource) const; |
||||||
|
uint32_t linkShader(uint32_t vertex, uint32_t fragment) const; |
||||||
|
int32_t checkStatus(uint32_t check, bool isProgram = false) const; |
||||||
|
|
||||||
|
private: |
||||||
|
Shader(std::string_view path) |
||||||
|
: Asset(path) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
virtual bool isShader() const override { return true; } |
||||||
|
|
||||||
|
private: |
||||||
|
uint32_t m_id { 0 }; |
||||||
|
}; |
||||||
|
|
||||||
|
// -----------------------------------------
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
template<> |
||||||
|
inline bool Asset::fastIs<Shader>() const { return isShader(); } |
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
} // namespace Inferno
|
@ -1,77 +0,0 @@ |
|||||||
/*
|
|
||||||
* Copyright (C) 2022 Riyyi |
|
||||||
* |
|
||||||
* SPDX-License-Identifier: MIT |
|
||||||
*/ |
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <cstdint> // int32_t, uint32_t |
|
||||||
#include <memory> // std::shared_ptr |
|
||||||
#include <string> // std::string |
|
||||||
#include <unordered_map> // std::unordered_map |
|
||||||
|
|
||||||
#include "glm/glm.hpp" |
|
||||||
#include "ruc/singleton.h" |
|
||||||
|
|
||||||
namespace Inferno { |
|
||||||
|
|
||||||
class Shader { |
|
||||||
public: |
|
||||||
Shader(const std::string& name); |
|
||||||
virtual ~Shader(); |
|
||||||
|
|
||||||
int32_t findUniform(const std::string& name) const; |
|
||||||
|
|
||||||
void setInt(const std::string& name, int value); |
|
||||||
void setInt(const std::string& name, int* values, uint32_t count); |
|
||||||
void setFloat(const std::string& name, float value) const; |
|
||||||
void setFloat(const std::string& name, float v1, float v2, float v3, float v4) const; |
|
||||||
void setFloat(const std::string& name, glm::vec2 value) const; |
|
||||||
void setFloat(const std::string& name, glm::vec3 value) const; |
|
||||||
void setFloat(const std::string& name, glm::vec4 value) const; |
|
||||||
void setFloat(const std::string& name, glm::mat3 matrix) const; |
|
||||||
void setFloat(const std::string& name, glm::mat4 matrix) const; |
|
||||||
|
|
||||||
void bind() const; |
|
||||||
void unbind() const; |
|
||||||
|
|
||||||
inline std::string name() const { return m_name; } |
|
||||||
inline uint32_t id() const { return m_id; } |
|
||||||
|
|
||||||
protected: |
|
||||||
uint32_t compileShader(int32_t type, const char* shaderSource) const; |
|
||||||
uint32_t linkShader(uint32_t vertex, uint32_t fragment) const; |
|
||||||
int32_t checkStatus(uint32_t check, bool isProgram = false) const; |
|
||||||
|
|
||||||
private: |
|
||||||
std::string m_name; |
|
||||||
uint32_t m_id; |
|
||||||
}; |
|
||||||
|
|
||||||
// -------------------------------------
|
|
||||||
|
|
||||||
class ShaderManager final : public ruc::Singleton<ShaderManager> { |
|
||||||
public: |
|
||||||
ShaderManager(s); |
|
||||||
virtual ~ShaderManager(); |
|
||||||
|
|
||||||
void add(const std::string& name, std::shared_ptr<Shader> shader); |
|
||||||
std::shared_ptr<Shader> load(const std::string& name); |
|
||||||
std::shared_ptr<Shader> load(const std::string& vertexSource, |
|
||||||
const std::string& fragmentSource); |
|
||||||
std::shared_ptr<Shader> get(const std::string& name); |
|
||||||
bool exists(const std::string& name); |
|
||||||
|
|
||||||
void remove(const std::string& name); |
|
||||||
void remove(std::shared_ptr<Shader> shader); |
|
||||||
|
|
||||||
protected: |
|
||||||
std::string computeName(const std::string& vertexSource, |
|
||||||
const std::string& fragmentSource); |
|
||||||
|
|
||||||
private: |
|
||||||
std::unordered_map<std::string, std::shared_ptr<Shader>> m_shaderList; |
|
||||||
}; |
|
||||||
|
|
||||||
} // namespace Inferno
|
|
Loading…
Reference in new issue