#pragma once #include "opengl/shader_program_variable.hpp" #include namespace shader_program::attributes::point_cloud { enum class flags : int { none = 0, position = 1 << 0, normal = 1 << 1, color = 1 << 2, reflectance = 1 << 3 }; constexpr inline auto position = zgl::shader_program_variable({ GL_FLOAT_VEC3, 0 }, "vertex_position"); constexpr inline auto normal = zgl::shader_program_variable({ GL_FLOAT_VEC3, 1 }, "vertex_normal"); constexpr inline auto color = zgl::shader_program_variable({ GL_FLOAT_VEC3, 2 }, "vertex_color"); constexpr inline auto reflectance = zgl::shader_program_variable({ GL_FLOAT, 2 }, "vertex_reflectance"); constexpr inline auto all = std::array{ position, normal, color, reflectance }; } [[nodiscard]] constexpr shader_program::attributes::point_cloud::flags operator|( const shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b ) { return static_cast(static_cast(a) | static_cast(b)); } [[nodiscard]] constexpr shader_program::attributes::point_cloud::flags operator&( const shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b ) { return static_cast(static_cast(a) & static_cast(b)); } [[nodiscard]] constexpr shader_program::attributes::point_cloud::flags operator^( const shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b ) { return static_cast(static_cast(a) ^ static_cast(b)); } [[nodiscard]] constexpr shader_program::attributes::point_cloud::flags operator~(const shader_program::attributes::point_cloud::flags& a) { return static_cast(~static_cast(a)); } constexpr shader_program::attributes::point_cloud::flags& operator|=(shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b) { return a = a | b; } constexpr shader_program::attributes::point_cloud::flags& operator&=(shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b) { return a = a & b; } constexpr shader_program::attributes::point_cloud::flags& operator^=(shader_program::attributes::point_cloud::flags& a, const shader_program::attributes::point_cloud::flags& b) { return a = a ^ b; } [[nodiscard]] constexpr bool operator<( shader_program::attributes::point_cloud::flags lhs, shader_program::attributes::point_cloud::flags rhs ) { return static_cast(lhs) < static_cast(rhs); } [[nodiscard]] constexpr bool operator<=( shader_program::attributes::point_cloud::flags lhs, shader_program::attributes::point_cloud::flags rhs ) { return static_cast(lhs) <= static_cast(rhs); } [[nodiscard]] constexpr bool operator>( shader_program::attributes::point_cloud::flags lhs, shader_program::attributes::point_cloud::flags rhs ) { return static_cast(lhs) > static_cast(rhs); } [[nodiscard]] constexpr bool operator>=( shader_program::attributes::point_cloud::flags lhs, shader_program::attributes::point_cloud::flags rhs ) { return static_cast(lhs) >= static_cast(rhs); }