GLSL Struct 1.4.0
glslstruct
Loading...
Searching...
No Matches
mat_data.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_DATA_HPP_
12 #define _GLSL_STRUCT_MAT_DATA_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/vec_data.hpp>
21 #include <glslstruct/type/traits/concepts/mat_traits_concept.hpp>
22
23namespace glslstruct {
24 /**
25 * @brief glsl mat data container
26 * @ingroup glslstruct
27 */
28 class mat_data {
29 private:
30 /// @brief returns vector of data bytes of glm::mat
31 template<class T, glm::length_t C, glm::length_t R, glm::qualifier Q>
32 [[nodiscard]] static _GLSL_STRUCT_CONSTEXPR20 std::vector<vec_data> _get_data(const glm::mat<C, R, T, Q>& value) {
33 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable to be treated as raw bytes!!");
34
35 std::vector<vec_data> data;
36 for (size_t c = 0; c < C; ++c) { data.emplace_back(glm::column(value, c)); }
37 return data;
38 }
39
40 /// @brief returns vector of data bytes of mstd::mat
41 template<class T, size_t C, size_t R>
42 [[nodiscard]] static _GLSL_STRUCT_CONSTEXPR20 std::vector<vec_data> _get_data(const mstd::mat<C, R, T>& value) {
43 static_assert(std::is_trivially_copyable_v<T>, "T must be trivially copyable to be treated as raw bytes!!");
44
45 using column_type = _GLSL_STRUCT_TYPENAME17 mstd::mat<C, R, T>::column_type;
46
47 std::vector<vec_data> data;
48 for (size_t c = 0; c < C; ++c) { data.emplace_back(column_type(value[c])); }
49
50 return data;
51 }
52
53 /// @brief vector of data bytes
54 std::vector<vec_data> _data;
55
56 public:
57 /// @brief constructor which accepts raw data (not recommended to use for end user)
58 explicit mat_data(const std::vector<vec_data>& data);
59
60 /// @brief constructor for glm::mat
62 template<class T, glm::length_t C, glm::length_t R, glm::qualifier Q>
63 #else
64 template<class T, glm::length_t C, glm::length_t R, glm::qualifier Q,
65 std::enable_if_t<(mstd::is_same_type_in_v<T, bool, int, unsigned int, float, double> && mstd::is_in_range_v<C, 2, 4> &&
66 mstd::is_in_range_v<R, 2, 4>),
67 bool> = true>
68 #endif
69 explicit mat_data(
70 const glm::mat<C, R, T, Q>& value
71 ) _GLSL_STRUCT_REQUIRES((mstd::is_same_type_in_v<T, bool, int, unsigned int, float, double> &&
72 mstd::is_in_range_v<C, 2, 4> && mstd::is_in_range_v<R, 2, 4>))
73 : mat_data(_get_data(value)) {
74 }
75
76 /// @brief constructor for mstd::mat
78 template<class T, size_t C, size_t R>
79 #else
80 template<class T, size_t C, size_t R,
81 std::enable_if_t<(mstd::is_same_type_in_v<T, bool, int, unsigned int, float, double> && mstd::is_in_range_v<C, 2, 4> &&
82 mstd::is_in_range_v<R, 2, 4>),
83 bool> = true>
84 #endif
85 explicit mat_data(
86 const mstd::mat<C, R, T>& value
87 ) _GLSL_STRUCT_REQUIRES((mstd::is_same_type_in_v<T, bool, int, unsigned int, float, double> &&
88 mstd::is_in_range_v<C, 2, 4> && mstd::is_in_range_v<R, 2, 4>))
89 : mat_data(_get_data(value)) {
90 }
91
92 /// @brief default copy constructor
93 mat_data(const mat_data& other);
94 /// @brief default move constructor
95 mat_data(mat_data&& other) noexcept;
96
97 /// @brief default destructor
98 ~mat_data();
99
100 /// @brief default copy assign operator
101 mat_data& operator=(const mat_data& other);
102 /// @brief default move assign operator
103 mat_data& operator=(mat_data&& other) noexcept;
104
105 /// @brief returns value from this mat_data container using mat_traits conversion
107 template<utils::glsl_mat T>
108 #else
109 template<class T, std::enable_if_t<utils::is_glsl_mat_v<T>, bool> = true>
110 #endif
111 T get() const {
112 return mat_traits<T>::get_value(*this);
113 }
114
115 /// @brief returns value data in bytes
116 [[nodiscard]] const std::vector<vec_data>& data() const noexcept;
117 };
118} // namespace glslstruct
119
120 #endif
121#endif
#define _GLSL_STRUCT_TYPENAME17
Definition config.hpp:216
#define _GLSL_STRUCT_CONSTEXPR20
constexpr keyword for c++20 and higher
Definition config.hpp:213
#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_REQUIRES(condition)
requires keyword for c++20 and higher
Definition config.hpp:214