#pragma once #include "opengl/shader_program_variable.hpp" #include namespace shader_program::uniforms::point_cloud { enum class flags : int { none = 0, mvp = 1 << 0, point_size = 1 << 1, color = 1 << 2, model = 1 << 3, camera_position = 1 << 4, rainbow_offset_y = 1 << 5, rainbow_scale_y = 1 << 6, }; constexpr inline auto mvp = zgl::shader_program_variable({ GL_FLOAT_MAT4, 0 }, "mvp"); constexpr inline auto point_size = zgl::shader_program_variable({ GL_FLOAT, 2 }, "point_size"); constexpr inline auto color = zgl::shader_program_variable({ GL_FLOAT_VEC4, 3 }, "color"); constexpr inline auto model = zgl::shader_program_variable({ GL_FLOAT_MAT4, 4 }, "model"); constexpr inline auto camera_position = zgl::shader_program_variable({ GL_FLOAT_VEC3, 5 }, "camera_position"); constexpr inline auto rainbow_offset_y = zgl::shader_program_variable({ GL_FLOAT, 6 }, "rainbow_offset_y"); constexpr inline auto rainbow_scale_y = zgl::shader_program_variable({ GL_FLOAT, 7 }, "rainbow_scale_y"); constexpr inline auto all = std::array{ mvp, point_size, color, model, camera_position, rainbow_offset_y, rainbow_scale_y }; } [[nodiscard]] constexpr shader_program::uniforms::point_cloud::flags operator|( const shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b ) { return static_cast(static_cast(a) | static_cast(b)); } [[nodiscard]] constexpr shader_program::uniforms::point_cloud::flags operator&( const shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b ) { return static_cast(static_cast(a) & static_cast(b)); } [[nodiscard]] constexpr shader_program::uniforms::point_cloud::flags operator^( const shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b ) { return static_cast(static_cast(a) ^ static_cast(b)); } [[nodiscard]] constexpr shader_program::uniforms::point_cloud::flags operator~(const shader_program::uniforms::point_cloud::flags& a) { return static_cast(~static_cast(a)); } constexpr shader_program::uniforms::point_cloud::flags& operator|=(shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b) { return a = a | b; } constexpr shader_program::uniforms::point_cloud::flags& operator&=(shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b) { return a = a & b; } constexpr shader_program::uniforms::point_cloud::flags& operator^=(shader_program::uniforms::point_cloud::flags& a, const shader_program::uniforms::point_cloud::flags& b) { return a = a ^ b; } [[nodiscard]] constexpr bool operator<( shader_program::uniforms::point_cloud::flags lhs, shader_program::uniforms::point_cloud::flags rhs ) { return static_cast(lhs) < static_cast(rhs); } [[nodiscard]] constexpr bool operator<=( shader_program::uniforms::point_cloud::flags lhs, shader_program::uniforms::point_cloud::flags rhs ) { return static_cast(lhs) <= static_cast(rhs); } [[nodiscard]] constexpr bool operator>( shader_program::uniforms::point_cloud::flags lhs, shader_program::uniforms::point_cloud::flags rhs ) { return static_cast(lhs) > static_cast(rhs); } [[nodiscard]] constexpr bool operator>=( shader_program::uniforms::point_cloud::flags lhs, shader_program::uniforms::point_cloud::flags rhs ) { return static_cast(lhs) >= static_cast(rhs); }