15#include <vsg/maths/plane.h>
16#include <vsg/maths/vec3.h>
17#include <vsg/maths/vec4.h>
38 constexpr explicit t_mat4(value_type v) :
44 constexpr t_mat4(value_type v0, value_type v1, value_type v2, value_type v3,
45 value_type v4, value_type v5, value_type v6, value_type v7,
46 value_type v8, value_type v9, value_type v10, value_type v11,
47 value_type v12, value_type v13, value_type v14, value_type v15) :
48 value{{v0, v1, v2, v3},
55 constexpr explicit t_mat4(value_type v[16]) :
56 value{{v[0], v[1], v[2], v[3]},
57 {v[4], v[5], v[6], v[7]},
58 {v[8], v[9], v[10], v[11]},
59 {v[12], v[13], v[14], v[15]}} {}
61 constexpr t_mat4(
const column_type& c0,
62 const column_type& c1,
63 const column_type& c2,
64 const column_type& c3) :
70 explicit t_mat4(
const t_mat4<R>& rhs)
78 constexpr std::size_t size()
const {
return 16; }
79 constexpr std::size_t columns()
const {
return 4; }
80 constexpr std::size_t rows()
const {
return 4; }
82 column_type& operator[](std::size_t c) {
return value[c]; }
83 const column_type& operator[](std::size_t c)
const {
return value[c]; }
85 value_type& operator()(std::size_t c, std::size_t r) {
return value[c][r]; }
86 value_type operator()(std::size_t c, std::size_t r)
const {
return value[c][r]; }
89 t_mat4& operator=(
const t_mat4<R>& rhs)
98 void set(value_type v0, value_type v1, value_type v2, value_type v3,
99 value_type v4, value_type v5, value_type v6, value_type v7,
100 value_type v8, value_type v9, value_type v10, value_type v11,
101 value_type v12, value_type v13, value_type v14, value_type v15)
103 value[0].set(v0, v1, v2, v3);
104 value[1].set(v4, v5, v6, v7);
105 value[2].set(v8, v9, v10, v11);
106 value[3].set(v12, v13, v14, v15);
110 void set(
const t_mat4<R>& rhs)
118 T* data() {
return value[0].data(); }
119 const T* data()
const {
return value[0].data(); }
126 VSG_type_name(vsg::mat4);
127 VSG_type_name(vsg::dmat4);
128 VSG_type_name(vsg::ldmat4);
133 return lhs.value[0] == rhs.value[0] &&
134 lhs.value[1] == rhs.value[1] &&
135 lhs.value[2] == rhs.value[2] &&
136 lhs.value[3] == rhs.value[3];
140 bool operator!=(
const t_mat4<T>& lhs,
const t_mat4<T>& rhs)
142 return lhs.value[0] != rhs.value[0] ||
143 lhs.value[1] != rhs.value[1] ||
144 lhs.value[2] != rhs.value[2] ||
145 lhs.value[3] != rhs.value[3];
151 if (lhs.value[0] < rhs.value[0])
return true;
152 if (rhs.value[0] < lhs.value[0])
return false;
153 if (lhs.value[1] < rhs.value[1])
return true;
154 if (rhs.value[1] < lhs.value[1])
return false;
155 if (lhs.value[2] < rhs.value[2])
return true;
156 if (rhs.value[2] < lhs.value[2])
return false;
157 return lhs.value[3] < rhs.value[3];
163 return lhs[0][r] * rhs[c][0] +
164 lhs[1][r] * rhs[c][1] +
165 lhs[2][r] * rhs[c][2] +
166 lhs[3][r] * rhs[c][3];
172 return t_mat4<T>(dot(lhs, rhs, 0, 0), dot(lhs, rhs, 0, 1), dot(lhs, rhs, 0, 2), dot(lhs, rhs, 0, 3),
173 dot(lhs, rhs, 1, 0), dot(lhs, rhs, 1, 1), dot(lhs, rhs, 1, 2), dot(lhs, rhs, 1, 3),
174 dot(lhs, rhs, 2, 0), dot(lhs, rhs, 2, 1), dot(lhs, rhs, 2, 2), dot(lhs, rhs, 2, 3),
175 dot(lhs, rhs, 3, 0), dot(lhs, rhs, 3, 1), dot(lhs, rhs, 3, 2), dot(lhs, rhs, 3, 3));
181 return t_vec4<T>(lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0] * rhs[3],
182 lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1] * rhs[3],
183 lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2] * rhs[3],
184 lhs[0][3] * rhs[0] + lhs[1][3] * rhs[1] + lhs[2][3] * rhs[2] + lhs[3][3] * rhs[3]);
190 template<
typename T,
typename R>
193 t_plane<R> transformed(lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0] * rhs[3],
194 lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1] * rhs[3],
195 lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2] * rhs[3],
196 lhs[0][3] * rhs[0] + lhs[1][3] * rhs[1] + lhs[2][3] * rhs[2] + lhs[3][3] * rhs[3]);
197 T inv =
static_cast<R
>(1.0) / length(transformed.n);
198 return t_plane<T>(transformed[0] * inv, transformed[1] * inv, transformed[2] * inv, transformed[3] * inv);
206 return t_vec4<T>(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + lhs[3] * rhs[0][3],
207 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + lhs[3] * rhs[1][3],
208 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + lhs[3] * rhs[2][3],
209 lhs[0] * rhs[3][0] + lhs[1] * rhs[3][1] + lhs[2] * rhs[3][2] + lhs[3] * rhs[3][3]);
215 template<
typename T,
typename R>
218 t_plane<T> transformed(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + lhs[3] * rhs[0][3],
219 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + lhs[3] * rhs[1][3],
220 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + lhs[3] * rhs[2][3],
221 lhs[0] * rhs[3][0] + lhs[1] * rhs[3][1] + lhs[2] * rhs[3][2] + lhs[3] * rhs[3][3]);
222 T inv =
static_cast<T
>(1.0) / length(transformed.n);
223 return t_plane<T>(transformed[0] * inv, transformed[1] * inv, transformed[2] * inv, transformed[3] * inv);
229 T inv =
static_cast<T
>(1.0) / (lhs[0][3] * rhs[0] + lhs[1][3] * rhs[1] + lhs[2][3] * rhs[2] + lhs[3][3]);
230 return t_vec3<T>((lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0]) * inv,
231 (lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1]) * inv,
232 (lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2]) * inv);
238 T inv =
static_cast<T
>(1.0) / (lhs[0] * rhs[3][0] + lhs[1] * rhs[3][1] + lhs[2] * rhs[3][2] + rhs[3][3]);
239 return t_vec3<T>(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + rhs[0][3] * inv,
240 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + rhs[1][3] * inv,
241 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + rhs[2][3] * inv);
t_mat4 template class that represents a 4x4 matrix.
Definition mat4.h:25
t_vec3 template class that represents a 3D vector
Definition vec3.h:34
t_vec4 template class that represents a 4D vector
Definition vec4.h:35