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) :
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]}} {}
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; }
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]; }
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)
118 T* data() {
return value[0].data(); }
119 const T* data()
const {
return value[0].data(); }
131 return lhs.value[0] ==
rhs.value[0] &&
132 lhs.value[1] ==
rhs.value[1] &&
133 lhs.value[2] ==
rhs.value[2] &&
134 lhs.value[3] ==
rhs.value[3];
138 bool operator!=(
const t_mat4<T>& lhs,
const t_mat4<T>& rhs)
140 return lhs.value[0] != rhs.value[0] ||
141 lhs.value[1] != rhs.value[1] ||
142 lhs.value[2] != rhs.value[2] ||
143 lhs.value[3] != rhs.value[3];
147 bool operator<(
const t_mat4<T>& lhs,
const t_mat4<T>& rhs)
149 if (lhs.value[0] < rhs.value[0])
return true;
150 if (rhs.value[0] < lhs.value[0])
return false;
151 if (lhs.value[1] < rhs.value[1])
return true;
152 if (rhs.value[1] < lhs.value[1])
return false;
153 if (lhs.value[2] < rhs.value[2])
return true;
154 if (rhs.value[2] < lhs.value[2])
return false;
155 return lhs.value[3] < rhs.value[3];
159 T dot(
const t_mat4<T>& lhs,
const t_mat4<T>& rhs,
int c,
int r)
161 return lhs[0][r] * rhs[c][0] +
162 lhs[1][r] * rhs[c][1] +
163 lhs[2][r] * rhs[c][2] +
164 lhs[3][r] * rhs[c][3];
168 t_mat4<T> operator*(
const t_mat4<T>& lhs,
const t_mat4<T>& rhs)
170 return t_mat4<T>(dot(lhs, rhs, 0, 0), dot(lhs, rhs, 0, 1), dot(lhs, rhs, 0, 2), dot(lhs, rhs, 0, 3),
171 dot(lhs, rhs, 1, 0), dot(lhs, rhs, 1, 1), dot(lhs, rhs, 1, 2), dot(lhs, rhs, 1, 3),
172 dot(lhs, rhs, 2, 0), dot(lhs, rhs, 2, 1), dot(lhs, rhs, 2, 2), dot(lhs, rhs, 2, 3),
173 dot(lhs, rhs, 3, 0), dot(lhs, rhs, 3, 1), dot(lhs, rhs, 3, 2), dot(lhs, rhs, 3, 3));
177 t_vec4<T> operator*(
const t_mat4<T>& lhs,
const t_vec4<T>& rhs)
179 return t_vec4<T>(lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0] * rhs[3],
180 lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1] * rhs[3],
181 lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2] * rhs[3],
182 lhs[0][3] * rhs[0] + lhs[1][3] * rhs[1] + lhs[2][3] * rhs[2] + lhs[3][3] * rhs[3]);
188 template<
typename T,
typename R>
189 t_plane<R> operator*(
const t_mat4<T>& lhs,
const t_plane<R>& rhs)
191 t_plane<R> transformed(lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0] * rhs[3],
192 lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1] * rhs[3],
193 lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2] * rhs[3],
194 lhs[0][3] * rhs[0] + lhs[1][3] * rhs[1] + lhs[2][3] * rhs[2] + lhs[3][3] * rhs[3]);
195 T inv =
static_cast<R
>(1.0) / length(transformed.n);
196 return t_plane<T>(transformed[0] * inv, transformed[1] * inv, transformed[2] * inv, transformed[3] * inv);
202 t_vec4<T> operator*(
const t_vec4<T>& lhs,
const t_mat4<T>& rhs)
204 return t_vec4<T>(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + lhs[3] * rhs[0][3],
205 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + lhs[3] * rhs[1][3],
206 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + lhs[3] * rhs[2][3],
207 lhs[0] * rhs[3][0] + lhs[1] * rhs[3][1] + lhs[2] * rhs[3][2] + lhs[3] * rhs[3][3]);
213 template<
typename T,
typename R>
214 t_plane<T> operator*(
const t_plane<T>& lhs,
const t_mat4<R>& rhs)
216 t_plane<T> transformed(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + lhs[3] * rhs[0][3],
217 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + lhs[3] * rhs[1][3],
218 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + lhs[3] * rhs[2][3],
219 lhs[0] * rhs[3][0] + lhs[1] * rhs[3][1] + lhs[2] * rhs[3][2] + lhs[3] * rhs[3][3]);
220 T inv =
static_cast<T
>(1.0) / length(transformed.n);
221 return t_plane<T>(transformed[0] * inv, transformed[1] * inv, transformed[2] * inv, transformed[3] * inv);
225 t_vec3<T> operator*(
const t_mat4<T>& lhs,
const t_vec3<T>& rhs)
227 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]);
228 return t_vec3<T>((lhs[0][0] * rhs[0] + lhs[1][0] * rhs[1] + lhs[2][0] * rhs[2] + lhs[3][0]) * inv,
229 (lhs[0][1] * rhs[0] + lhs[1][1] * rhs[1] + lhs[2][1] * rhs[2] + lhs[3][1]) * inv,
230 (lhs[0][2] * rhs[0] + lhs[1][2] * rhs[1] + lhs[2][2] * rhs[2] + lhs[3][2]) * inv);
234 t_vec3<T> operator*(
const t_vec3<T>& lhs,
const t_mat4<T>& rhs)
236 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]);
237 return t_vec3<T>(lhs[0] * rhs[0][0] + lhs[1] * rhs[0][1] + lhs[2] * rhs[0][2] + rhs[0][3] * inv,
238 lhs[0] * rhs[1][0] + lhs[1] * rhs[1][1] + lhs[2] * rhs[1][2] + rhs[1][3] * inv,
239 lhs[0] * rhs[2][0] + lhs[1] * rhs[2][1] + lhs[2] * rhs[2][2] + rhs[2][3] * inv);
std container adapter for allocating with MEMORY_AFFINITY_NODES
Definition Allocator.h:138
t_mat4 template class that represents a 4x4 matrix.
Definition mat4.h:25