GroveEngine/modules/BgfxRenderer/Shaders/ShaderManager.h
StillHammer 1443c1209e feat(BgfxRenderer): Complete Phase 2-3 with shaders and triangle rendering
Phase 2 - RHI Layer:
- Fix Command struct default constructor for union with non-trivial types
- Add missing mutex includes in ResourceCache.cpp
- Fix const_cast for getChildReadOnly in SceneCollector

Phase 3 - Shaders & Visual Test:
- Add ShaderManager for centralized shader loading
- Embed pre-compiled shaders (OpenGL, Vulkan, DX11, Metal)
- Add test_20_bgfx_rhi: 23 unit tests for RHI components
- Add test_21_bgfx_triangle: visual test rendering colored triangle

Test results:
- RHI unit tests: 23/23 passing
- Visual test: ~567 FPS with Vulkan renderer

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 16:43:17 +08:00

62 lines
1.6 KiB
C++

#pragma once
#include "../RHI/RHITypes.h"
#include <bgfx/bgfx.h>
#include <string>
#include <unordered_map>
namespace grove {
/**
* @brief Manages shader loading and caching for BgfxRenderer
*
* Loads embedded pre-compiled shaders based on the current renderer type.
* Supports: OpenGL, OpenGL ES, Vulkan, DirectX 11/12, Metal
*/
class ShaderManager {
public:
ShaderManager() = default;
~ShaderManager();
// Non-copyable
ShaderManager(const ShaderManager&) = delete;
ShaderManager& operator=(const ShaderManager&) = delete;
/**
* @brief Initialize with current renderer type
*/
void init(bgfx::RendererType::Enum rendererType);
/**
* @brief Shutdown and destroy all shaders
*/
void shutdown();
/**
* @brief Get a shader program by name
* @param name Program name (e.g., "color", "sprite", "debug")
* @return Valid program handle or invalid handle if not found
*/
bgfx::ProgramHandle getProgram(const std::string& name);
/**
* @brief Check if a program exists
*/
bool hasProgram(const std::string& name) const;
/**
* @brief Get current renderer type
*/
bgfx::RendererType::Enum getRendererType() const { return m_rendererType; }
private:
bgfx::ShaderHandle loadShader(const char* name);
void loadBuiltinShaders();
bgfx::RendererType::Enum m_rendererType = bgfx::RendererType::Count;
std::unordered_map<std::string, bgfx::ProgramHandle> m_programs;
bool m_initialized = false;
};
} // namespace grove