Files
vibe3_physics/source/gpu/shader_manager.hpp
Sergio Valor f272bab296 feat(shaders): sistema de shaders runtime amb presets externs
- Afegir GpuShaderPreset i ShaderManager per carregar shaders des de data/shaders/
- Implementar preset ntsc-md-rainbows (2 passos: encode + decode MAME NTSC)
- Render loop multi-pass per shaders externs (targets intermedis R16G16B16A16_FLOAT)
- cycleShader(): cicla OFF→PostFX natius→shaders externs amb tecla X
- --shader <nom> per arrancar directament amb un preset extern
- CMake auto-descubreix i compila data/shaders/**/*.vert/.frag → .spv
- HUD F1 mostra 'Shader: <nom>' quan hi ha shader extern actiu

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 13:37:22 +01:00

42 lines
1.4 KiB
C++

#pragma once
#include <SDL3/SDL_gpu.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "gpu_shader_preset.hpp"
// ============================================================================
// ShaderManager — discovers and manages runtime shader presets under
// a root directory (e.g., data/shaders/).
//
// Each subdirectory with a preset.ini is treated as a shader preset.
// ============================================================================
class ShaderManager {
public:
// Scan root_dir for preset subdirectories (each must contain preset.ini).
void scan(const std::string& root_dir);
// Available preset names (e.g. {"ntsc-md-rainbows"}).
const std::vector<std::string>& names() const { return names_; }
// Load and return a preset (cached). Returns null on failure.
GpuShaderPreset* load(SDL_GPUDevice* device,
const std::string& name,
SDL_GPUTextureFormat swapchain_fmt,
int w, int h);
// Recreate intermediate render targets on resolution change.
void onResize(SDL_GPUDevice* device, SDL_GPUTextureFormat swapchain_fmt, int w, int h);
void destroyAll(SDL_GPUDevice* device);
private:
std::string root_dir_;
std::vector<std::string> names_;
std::map<std::string, std::string> dirs_;
std::map<std::string, std::unique_ptr<GpuShaderPreset>> loaded_;
};