#pragma once #include #include #include #include #include "util/string_lookup.hpp" #include "../metadata/shader_source_metadata.hpp" #include "opengl/shading/requirements/shader_source_requirements.hpp" #include "opengl/metadata/preprocessed_shader_source_metadata.hpp" #include "assets/dynamic_data_stores/dynamic_shader_source_store.hpp" #include "opengl/shading/shader_source_set.hpp" namespace zgl { class shader_preprocessor { public: void preprocess( const dynamic_shader_source_store& shader_sources ); void fetch_shader_sources( const dynamic_shader_source_store& shader_sources, std::span requirements, std::span metadata, std::vector& shader_strings ); protected: void tokenize_declarations(std::string_view source); std::optional parse_metadata_from_tokens(); [[nodiscard]] static bool parse_stage_declaration( std::span values, shader_source_metadata& metadata ); [[nodiscard]] static bool parse_geometry_declaration( std::span tokens, shader_source_metadata& metadata ); [[nodiscard]] static bool parse_features_declaration( std::span values, shader_source_metadata& metadata ); [[nodiscard]] static bool parse_static_enable_declaration( std::span values, shader_source_metadata& metadata ); [[nodiscard]] static bool parse_dynamic_enable_declaration( std::span values, shader_source_metadata& metadata ); template static void parse_feature_tokens( std::span values, const ztu::string_lookup& feature_lookup, T& features ); static void get_define_strings( shading::model_geometry::types geometry, shading::features::generic::type features, shading::features::generic::type& feature_count, std::vector& defines ); private: inline static auto mesh_feature_defines = std::array{ "#define FACE\n", "#define LINE\n", "#define POINT\n", "#define V_L\n", "#define V_RGB\n", "#define V_A\n", "#define LIGHTING\n", "#define TEXTURE\n", "#define U_RGBA\n", }; inline static auto point_cloud_feature_defines = std::array{ "#define SQUARE\n", "#define LIGHTING\n", "#define V_L\n", "#define V_RGB\n", "#define V_A\n", "#define U_RGBA\n", "#define RAINBOW\n" }; std::vector m_value_token_buffer; std::vector m_declaration_token_count_buffer; std::array m_declaration_type_index_buffer; using source_lookup_entry_type = std::pair; using source_lookup_type = std::vector; source_lookup_type m_shader_source_lookup; }; }