#pragma once #include #include #include #include #include #include "assets/data_stores/shader_source_store.hpp" #include "opengl/shader_program_lookup.hpp" #include "opengl/handles/shader_handle.hpp" #include "util/string_lookup.hpp" #include "shader_source_manager.hpp" #include "assets/data_stores.hpp" #include "opengl/metadata/shader_metadata.hpp" #include "opengl/data/shader_data.hpp" #include "opengl/handles/shader_handle_set.hpp" #include "opengl/shading/requirements/shader_requirements.hpp" #include "opengl/metadata/shader_set_metadata.hpp" #include "opengl/shading/requirements/shader_set_requirements.hpp" namespace zgl { class shader_manager { using metadata_type = shader_metadata; using data_type = shader_data; using handle_type = shader_handle; using entry_type = std::pair; using entry_view_type = std::pair; public: void process(const assets::data_stores& stores); void get_handles( const assets::shader_source_store& shader_sources, std::span requirements, std::span metadata, std::span shader_sets ); protected: std::optional find_shader( const shading::shader_requirements& requirements ); static bool compile_shader( GLenum shader_type, std::span source_strings, shader_data& shader ); shader_source_manager m_preprocessor{}; std::vector m_shader_lookup{}; private: std::vector m_source_requirement_buffer{}; std::vector m_preprocessed_shader_source_metadata_buffer{}; std::vector m_source_strings_buffer{}; }; }