Skip to content
Snippets Groups Projects
Commit d7d28baf authored by Philip Trettner's avatar Philip Trettner
Browse files

more basic mat

parent 04d09270
Branches
No related tags found
No related merge requests found
......@@ -9,6 +9,7 @@
#include "functions/coordinates.hh"
#include "functions/cross.hh"
#include "functions/data_ptr.hh"
#include "functions/diag.hh"
#include "functions/direction.hh"
#include "functions/distance.hh"
#include "functions/dot.hh"
......
#pragma once
#include "../../types/mat.hh"
#include "../scalars/scalar_math.hh"
#include "../utility.hh"
namespace tg
{
template <int C, int R, class ScalarT, class = enable_if<min(C, R) == 1>>
constexpr vec<1, ScalarT> diag(mat<C, R, ScalarT> const& m)
{
return {m[0][0]};
}
template <int C, int R, class ScalarT, class = enable_if<min(C, R) == 2>>
constexpr vec<2, ScalarT> diag(mat<C, R, ScalarT> const& m)
{
return {m[0][0], m[1][1]};
}
template <int C, int R, class ScalarT, class = enable_if<min(C, R) == 3>>
constexpr vec<3, ScalarT> diag(mat<C, R, ScalarT> const& m)
{
return {m[0][0], m[1][1], m[2][2]};
}
template <int C, int R, class ScalarT, class = enable_if<min(C, R) == 4>>
constexpr vec<4, ScalarT> diag(mat<C, R, ScalarT> const& m)
{
return {m[0][0], m[1][1], m[2][2], m[3][3]};
}
} // namespace tg
......@@ -4,6 +4,7 @@
#include "../types/pos.hh"
#include "../types/size.hh"
#include "../types/vec.hh"
#include "scalars/scalar_math.hh"
/*
* Special values of certain types:
......@@ -124,6 +125,78 @@ template <int C, int R, class ScalarT>
struct special_values<mat<C, R, ScalarT>>
{
static constexpr mat<C, R, ScalarT> ones() { return mat<C, R, ScalarT>() + ScalarT(1); }
static constexpr mat<C, R, ScalarT> identity()
{
mat<C, R, ScalarT> m;
mat_set_00(m, ScalarT(1));
mat_set_11(m, ScalarT(1));
mat_set_22(m, ScalarT(1));
mat_set_33(m, ScalarT(1));
return m;
}
static constexpr mat<C, R, ScalarT> diag(ScalarT v)
{
mat<C, R, ScalarT> m;
mat_set_00(m, v);
mat_set_11(m, v);
mat_set_22(m, v);
mat_set_33(m, v);
return m;
}
static constexpr mat<C, R, ScalarT> diag(vec<min(C, R), ScalarT> const& v)
{
mat<C, R, ScalarT> m;
mat_set_00(m, ScalarT(v));
mat_set_11(m, ScalarT(v));
mat_set_22(m, ScalarT(v));
mat_set_33(m, ScalarT(v));
return m;
}
static constexpr void mat_set_00(mat<C, R, ScalarT>& m, ScalarT v) { m[0][0] = v; }
static constexpr void mat_set_00(mat<C, R, ScalarT>& m, vec<min(C, R), ScalarT> const& v) { m[0][0] = v.x; }
template <int CC, class = enable_if<CC >= 2 && R >= 2>>
static constexpr void mat_set_11(mat<CC, R, ScalarT>& m, ScalarT v)
{
m[1][1] = v;
}
template <int CC, class = enable_if<CC >= 2 && R >= 2>>
static constexpr void mat_set_11(mat<CC, R, ScalarT>& m, vec<min(C, R), ScalarT> const& v)
{
m[1][1] = v.y;
}
static constexpr void mat_set_11(...)
{ /* nothing */
}
template <int CC, class = enable_if<CC >= 3 && R >= 3>>
static constexpr void mat_set_22(mat<CC, R, ScalarT>& m, ScalarT v)
{
m[2][2] = v;
}
template <int CC, class = enable_if<CC >= 3 && R >= 3>>
static constexpr void mat_set_22(mat<CC, R, ScalarT>& m, vec<min(C, R), ScalarT> const& v)
{
m[2][2] = v.z;
}
static constexpr void mat_set_22(...)
{ /* nothing */
}
template <int CC, class = enable_if<CC >= 4 && R >= 4>>
static constexpr void mat_set_33(mat<CC, R, ScalarT>& m, ScalarT v)
{
m[3][3] = v;
}
template <int CC, class = enable_if<CC >= 4 && R >= 4>>
static constexpr void mat_set_33(mat<CC, R, ScalarT>& m, vec<min(C, R), ScalarT> const& v)
{
m[3][3] = v.w;
}
static constexpr void mat_set_33(...)
{ /* nothing */
}
};
} // namespace detail
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment