GLSL Struct 1.4.0
glslstruct
Loading...
Searching...
No Matches
mat_traits.hpp
1/*
2 * glslstruct - a C++ library designed to easily represent GLSL's Uniform Buffer Objects (UBOs) and Shader Storage Buffer Objects (SSBOs) in C++.
3 *
4 * Licensed under the BSD 3-Clause License with Attribution Requirement.
5 * See the LICENSE file for details: https://github.com/MAIPA01/glslstruct/blob/main/LICENSE
6 *
7 * Copyright (c) 2025, Patryk Antosik (MAIPA01)
8 */
9
10#pragma once
11#ifndef _GLSL_STRUCT_MAT_TRAITS_HPP_
12 #define _GLSL_STRUCT_MAT_TRAITS_HPP_
13
14 #include <glslstruct/config.hpp>
15
17_GLSL_STRUCT_ERROR("This is only available for c++17 and greater!");
18 #else
19
20 #include <glslstruct/type/data/mat_data.hpp>
21
22namespace glslstruct {
23 #pragma region DEFAULT_TRAITS
24
25 /**
26 * @brief mat_traits for glm::mat values
27 * @ingroup glslstruct
28 */
29 template<class T, glm::length_t C, glm::length_t R, glm::qualifier Q>
30 struct mat_traits<glm::mat<C, R, T, Q> > {
31 /// @brief returns number of columns of glm::mat
32 static _GLSL_STRUCT_CONSTEXPR17 size_t get_columns() noexcept { return C; }
33
34 /// @brief returns number of rows of glm::mat
35 static _GLSL_STRUCT_CONSTEXPR17 size_t get_rows() noexcept { return R; }
36
37 /// @brief returns ValueType of glm::mat
38 static _GLSL_STRUCT_CONSTEXPR17 ValueType get_value_type() noexcept { return glslstruct::get_value_type<T>(); }
39
40 /// @brief returns mat_data of glm::mat
41 static mat_data get_data(const glm::mat<C, R, T, Q>& value) { return mat_data(value); }
42
43 /// @brief returns glm::mat from mat_data
44 static glm::mat<C, R, T, Q> get_value(const mat_data& data) {
45 const std::vector<vec_data>& vecs = data.data();
46
47 glm::mat<C, R, T, Q> value;
48 for (size_t i = 0; i < vecs.size() && i < C; ++i) {
49 value[i] = vecs[i].get<typename glm::mat<C, R, T, Q>::col_type>();
50 }
51 return value;
52 }
53 };
54
55 /**
56 * @brief mat_traits for mstd::mat values
57 * @ingroup glslstruct
58 */
59 template<class T, size_t C, size_t R>
60 struct mat_traits<mstd::mat<C, R, T> > {
61 /// @brief returns number of columns of mstd::mat
62 static _GLSL_STRUCT_CONSTEXPR17 size_t get_columns() noexcept { return C; }
63
64 /// @brief returns number of rows of mstd::mat
65 static _GLSL_STRUCT_CONSTEXPR17 size_t get_rows() noexcept { return R; }
66
67 /// @brief returns ValueType of mstd::mat
68 static _GLSL_STRUCT_CONSTEXPR17 ValueType get_value_type() noexcept { return glslstruct::get_value_type<T>(); }
69
70 /// @brief returns mat_data of mstd::mat
71 static mat_data get_data(const mstd::mat<C, R, T>& value) { return mat_data(value); }
72
73 /// @brief returns mstd::mat from mat_data
74 static mstd::mat<C, R, T> get_value(const mat_data& data) {
75 const std::vector<vec_data>& vecs = data.data();
76
77 mstd::mat<C, R, T> value;
78 for (size_t i = 0; i < vecs.size() && i < C; ++i) {
79 value[i] = vecs[i].get<typename mstd::mat<C, R, T>::column_type>();
80 }
81 return value;
82 }
83 };
84
85 #pragma endregion
86
87 #pragma region FUNCTIONS
88 /// @brief returns number of columns of T based on mat_traits
90 template<utils::glsl_mat T>
91 #else
92 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
93 #endif
94 static _GLSL_STRUCT_INLINE17 _GLSL_STRUCT_CONSTEXPR17 size_t get_mat_columns() noexcept {
95 return mat_traits<T>::get_columns();
96 }
97
98 /// @brief returns number of rows of T based on mat_traits
100 template<utils::glsl_mat T>
101 #else
102 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
103 #endif
104 static _GLSL_STRUCT_INLINE17 _GLSL_STRUCT_CONSTEXPR17 size_t get_mat_rows() noexcept {
105 return mat_traits<T>::get_rows();
106 }
107
108 /// @brief returns ValueType of T based on mat_traits
110 template<utils::glsl_mat T>
111 #else
112 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
113 #endif
114 static _GLSL_STRUCT_INLINE17 _GLSL_STRUCT_CONSTEXPR17 ValueType get_mat_value_type() noexcept {
115 return mat_traits<T>::get_value_type();
116 }
117
118 /// @brief returns mat_data of T based on mat_traits
120 template<utils::glsl_mat T>
121 #else
122 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
123 #endif
124 static inline mat_data get_mat_data(const T& value) {
125 return mat_traits<T>::get_data(value);
126 }
127
128 /// @brief returns mat value of type T from mat_data based on mat_traits
130 template<utils::glsl_mat T>
131 #else
132 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
133 #endif
134 static inline T get_mat_value(const mat_data& data) {
135 return mat_traits<T>::get_value(data);
136 }
137
138 /// @brief returns glsl mat type string
139 std::string mat_to_string(ValueType valueType, size_t columns, size_t rows);
140
141 /// @brief returns glsl mat type string from type T based on mat_traits
143 template<utils::glsl_mat T>
144 #else
145 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
146 #endif
147 static inline std::string mat_to_string() {
148 return mat_to_string(get_mat_value_type<T>(), get_mat_columns<T>(), get_mat_rows<T>());
149 }
150
151 #pragma endregion
152} // namespace glslstruct
153
154 #endif
155#endif
#define _GLSL_STRUCT_INLINE17
Definition config.hpp:215
#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