#pragma once #include "assets/components/mesh_vertex_components.hpp" #include "assets/components/point_cloud_vertex_components.hpp" #include "assets/components/material_components.hpp" #include "shader_program/attributes/mesh_attributes.hpp" #include "shader_program/uniforms/mesh_uniforms.hpp" #include #include namespace shader_program::features::mesh { struct type { attributes::mesh::flags attributes{ attributes::mesh::flags::none }; uniforms::mesh::flags uniforms{ uniforms::mesh::flags::none }; }; namespace indices { using type = ztu::u8; constexpr inline type face = 0; constexpr inline type line = 1; constexpr inline type point = 2; constexpr inline type luminance = 3; constexpr inline type color = 4; constexpr inline type alpha = 5; constexpr inline type lighting = 6; constexpr inline type texture = 7; constexpr inline type uniform_color = 8; } enum class flags : std::uint16_t { none = 0, face = 1 << indices::face, line = 1 << indices::line, point = 1 << indices::point, luminance = 1 << indices::luminance, color = 1 << indices::color, alpha = 1 << indices::alpha, lighting = 1 << indices::lighting, texture = 1 << indices::texture, uniform_color = 1 << indices::uniform_color }; constexpr inline auto face = type{ .attributes = attributes::mesh::flags::position, .uniforms = uniforms::mesh::flags::mvp_matrix }; constexpr inline auto line = type{ .attributes = attributes::mesh::flags::position, .uniforms = uniforms::mesh::flags::mvp_matrix }; constexpr inline auto point = type{ .attributes = attributes::mesh::flags::position, .uniforms = ( uniforms::mesh::flags::mvp_matrix | uniforms::mesh::flags::point_size ) }; constexpr inline auto luminance = type{ .attributes = attributes::mesh::flags::luminance }; constexpr inline auto color = type{ .attributes = attributes::mesh::flags::color }; constexpr inline auto alpha = type{ .attributes = attributes::mesh::flags::alpha }; constexpr inline auto lighting = type{ .attributes = attributes::mesh::flags::normal, .uniforms = ( uniforms::mesh::flags::model_matrix | uniforms::mesh::flags::view_pos | uniforms::mesh::flags::point_light_direction | uniforms::mesh::flags::point_light_color | uniforms::mesh::flags::ambient_light_color | uniforms::mesh::flags::ambient_filter | uniforms::mesh::flags::diffuse_filter | uniforms::mesh::flags::specular_filter | uniforms::mesh::flags::shininess ) }; constexpr inline auto texture = type{ .attributes = attributes::mesh::flags::tex_coord, .uniforms = uniforms::mesh::flags::tex }; constexpr inline auto uniform_color = type{ .uniforms = uniforms::mesh::flags::color }; constexpr inline auto all = std::array{ face, line, point, luminance, color, alpha, lighting, texture, uniform_color }; constexpr inline auto names = std::array{ "face", "line", "point", "luminance", "color", "alpha", "lighting", "texture", "uniform_color" }; constexpr inline auto defines = std::array{ "FACE", "LINE", "POINT", "V_L", "V_RGB", "V_A", "LIGHTING", "TEXTURE", "U_RGBA" }; }