2
3
4
5
6
7
8
11#ifndef _GLSL_STRUCT_VEC_TRAITS_HPP
12 #define _GLSL_STRUCT_VEC_TRAITS_HPP
14 #include <glslstruct/config.hpp>
17_GLSL_STRUCT_ERROR(
"This is only available for c++17 and greater!");
20 #include <glslstruct/type/data/vec_data.hpp>
23 #pragma region DEFAULT_TRAITS
26
27
28
29 template<
class T, glm::length_t L, glm::qualifier Q>
30 struct vec_traits<glm::vec<L, T, Q> > {
38 static vec_data get_data(
const glm::vec<L, T, Q>& value) {
return vec_data(value); }
41 static glm::vec<L, T, Q> get_value(
const vec_data& data) {
42 const std::vector<std::byte>& bytes = data.data();
45 const size_t maxSize = std::min(bytes.size(),
sizeof(
int) * L);
47 glm::vec<L,
int, Q> value;
48 std::copy_n(bytes.begin(), maxSize,
reinterpret_cast<std::byte*>(glm::value_ptr(value)));
52 const size_t maxSize = std::min(bytes.size(),
sizeof(T) * L);
54 glm::vec<L, T, Q> value;
55 std::copy_n(bytes.begin(), maxSize,
reinterpret_cast<std::byte*>(glm::value_ptr(value)));
62
63
64
65 template<
class T, size_t N>
66 struct vec_traits<mstd::vec<N, T> > {
74 static vec_data get_data(
const mstd::vec<N, T>& value) {
return vec_data(value); }
77 static mstd::vec<N, T> get_value(
const vec_data& data) {
78 const std::vector<std::byte>& bytes = data.data();
81 const size_t maxSize = std::min(bytes.size(),
sizeof(
int) * N);
83 mstd::vec<N,
int> iValue;
84 std::copy_n(bytes.begin(), maxSize,
reinterpret_cast<std::byte*>(
static_cast<
int*>(iValue)));
86 mstd::vec<N, T> value;
87 for (size_t i = 0; i < N; ++i) { value[i] = iValue[i] > 0; }
91 const size_t maxSize = std::min(bytes.size(),
sizeof(T) * N);
93 mstd::vec<N, T> value;
94 std::copy_n(bytes.begin(), maxSize,
reinterpret_cast<std::byte*>(
static_cast<T*>(value)));
102 #pragma region FUNCTIONS
105 template<utils::glsl_vec T>
107 template<
class T, std::enable_if_t<utils::is_glsl_vec_v<T>,
bool> =
true>
109 static inline size_t get_vec_length()
noexcept {
110 return vec_traits<T>::get_length();
115 template<utils::glsl_vec T>
117 template<
class T, std::enable_if_t<utils::is_glsl_vec_v<T>,
bool> =
true>
119 static inline ValueType get_vec_value_type()
noexcept {
120 return vec_traits<T>::get_value_type();
125 template<utils::glsl_vec T>
127 template<
class T, std::enable_if_t<utils::is_glsl_vec_v<T>,
bool> =
true>
129 static inline vec_data get_vec_data(
const T& value) {
130 return vec_traits<T>::get_data(value);
135 template<utils::glsl_vec T>
137 template<
class T, std::enable_if_t<utils::is_glsl_vec_v<T>,
bool> =
true>
139 static inline T get_vec_value(
const vec_data& data) {
140 return vec_traits<T>::get_value(data);
144 std::string vec_to_string(ValueType valueType, size_t length);
148 template<utils::glsl_vec T>
150 template<
class T, std::enable_if_t<utils::is_glsl_vec_v<T>,
bool> =
true>
152 static inline std::string vec_to_string() {
153 return vec_to_string(get_vec_value_type<T>(), get_vec_length<T>());
#define _GLSL_STRUCT_HAS_CXX20
check if compiler has c++ version greater or equal to c++20 and if user enabled c++20 features using ...
Definition config.hpp:142
#define _GLSL_STRUCT_HAS_CXX17
check if compiler has c++ version greater or equal to c++17
Definition config.hpp:130
#define _GLSL_STRUCT_CONSTEXPR17
constexpr for c++17 and higher
Definition config.hpp:196