130 lines
3.6 KiB
C
130 lines
3.6 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <fostbite2D/core/types.h>
|
|||
|
|
#include <fostbite2D/render/shader/shader_interface.h>
|
|||
|
|
#include <filesystem>
|
|||
|
|
#include <functional>
|
|||
|
|
#include <unordered_map>
|
|||
|
|
|
|||
|
|
namespace frostbite2D {
|
|||
|
|
|
|||
|
|
// ============================================================================
|
|||
|
|
// Shader重载回调
|
|||
|
|
// ============================================================================
|
|||
|
|
using ShaderReloadCallback = std::function<void(Ptr<IShader> newShader)>;
|
|||
|
|
|
|||
|
|
// ============================================================================
|
|||
|
|
// Shader管理器 - 统一入口
|
|||
|
|
// ============================================================================
|
|||
|
|
class ShaderManager {
|
|||
|
|
public:
|
|||
|
|
/**
|
|||
|
|
* @brief 获取单例实例
|
|||
|
|
* @return Shader管理器实例引用
|
|||
|
|
*/
|
|||
|
|
static ShaderManager &getInstance();
|
|||
|
|
|
|||
|
|
// ------------------------------------------------------------------------
|
|||
|
|
// 初始化和关闭
|
|||
|
|
// ------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 初始化Shader系统
|
|||
|
|
* @param factory 渲染后端Shader工厂
|
|||
|
|
* @return 初始化成功返回true,失败返回false
|
|||
|
|
*/
|
|||
|
|
bool init(Ptr<IShaderFactory> factory);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 关闭Shader系统
|
|||
|
|
*/
|
|||
|
|
void shutdown();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 检查是否已初始化
|
|||
|
|
* @return 已初始化返回true,否则返回false
|
|||
|
|
*/
|
|||
|
|
bool isInitialized() const { return initialized_; }
|
|||
|
|
|
|||
|
|
// ------------------------------------------------------------------------
|
|||
|
|
// Shader加载
|
|||
|
|
// ------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 从源码加载Shader
|
|||
|
|
* @param name Shader名称
|
|||
|
|
* @param vertSource 顶点着色器源码
|
|||
|
|
* @param fragSource 片段着色器源码
|
|||
|
|
* @return 加载的Shader实例
|
|||
|
|
*/
|
|||
|
|
Ptr<IShader> loadFromSource(const std::string &name,
|
|||
|
|
const std::string &vertSource,
|
|||
|
|
const std::string &fragSource);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 从文件加载Shader
|
|||
|
|
* @param name Shader名称
|
|||
|
|
* @param vertPath 顶点着色器文件路径
|
|||
|
|
* @param fragPath 片段着色器文件路径
|
|||
|
|
* @return 加载的Shader实例,失败返回nullptr
|
|||
|
|
*/
|
|||
|
|
Ptr<IShader> loadFromFile(const std::string &name,
|
|||
|
|
const std::filesystem::path &vertPath,
|
|||
|
|
const std::filesystem::path &fragPath);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 获取已加载的Shader
|
|||
|
|
* @param name Shader名称
|
|||
|
|
* @return Shader实例,不存在返回nullptr
|
|||
|
|
*/
|
|||
|
|
Ptr<IShader> get(const std::string &name) const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 检查Shader是否存在
|
|||
|
|
* @param name Shader名称
|
|||
|
|
* @return 存在返回true,否则返回false
|
|||
|
|
*/
|
|||
|
|
bool has(const std::string &name) const;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 移除Shader
|
|||
|
|
* @param name Shader名称
|
|||
|
|
*/
|
|||
|
|
void remove(const std::string &name);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 清除所有Shader
|
|||
|
|
*/
|
|||
|
|
void clear();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 注册重载回调
|
|||
|
|
* @param name Shader名称
|
|||
|
|
* @param callback 重载回调函数
|
|||
|
|
*/
|
|||
|
|
void setReloadCallback(const std::string &name,
|
|||
|
|
ShaderReloadCallback callback);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
ShaderManager() = default;
|
|||
|
|
~ShaderManager() = default;
|
|||
|
|
ShaderManager(const ShaderManager &) = delete;
|
|||
|
|
ShaderManager &operator=(const ShaderManager &) = delete;
|
|||
|
|
|
|||
|
|
Ptr<IShaderFactory> factory_;
|
|||
|
|
|
|||
|
|
struct ShaderInfo {
|
|||
|
|
Ptr<IShader> shader;
|
|||
|
|
ShaderReloadCallback reloadCallback;
|
|||
|
|
std::string vertSource;
|
|||
|
|
std::string fragSource;
|
|||
|
|
std::filesystem::path vertPath;
|
|||
|
|
std::filesystem::path fragPath;
|
|||
|
|
};
|
|||
|
|
std::unordered_map<std::string, ShaderInfo> shaders_;
|
|||
|
|
|
|||
|
|
bool initialized_ = false;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
} // namespace frostbite2D
|