21 template<
typename Vec,
size_t N>
24 using value = value_t<Vec>;
27 inline mat(
void) : _col() {};
30 inline mat(value&& val)
32 for(
size_t i=0; i != N; ++i)
40 template<
typename... V>
requires (
sizeof...(V) == N)
41 inline mat(V&&... col) : _col({(std::forward<V>(col))...}) {};
44 inline mat(
const mat& src) : _col(src._col) {}
47 decltype(
auto)
operator()(
size_t row,
size_t col)
const {
return _col[col][row]; }
48 decltype(
auto)
operator()(
size_t row,
size_t col) {
return _col[col][row]; }
50 decltype(
auto) col(
size_t col)
const {
return _col[col]; }
51 Vec row(
size_t row)
const
54 for(
size_t i=0; i != N; ++i)
55 result[i] = _col[i][row];
64 for(
size_t row=0; row != N; ++row)
65 for(
size_t col=0; col != N; ++col)
66 result(col,row) = m(row,col);
72 friend std::ostream&
operator<<(std::ostream& s,
const mat& m)
75 for(
size_t i=0; i != N; ++i)
85 inline mat
operator-(
void)
const {
return apply_op(std::negate<>()); }
87 inline mat
operator+(
const mat& m)
const {
return apply_op(std::plus<>(), m._col); }
88 inline mat
operator-(
const mat& m)
const {
return apply_op(std::minus<>(), m._col); }
90 inline mat&
operator+=(
const mat& m) {
return apply_op_inplace( [](
auto& r,
auto& m) {
r += m; }, m); }
91 inline mat&
operator-=(
const mat& m) {
return apply_op_inplace( [](
auto& r,
auto& m) {
r -= m; }, m); }
93 inline mat
operator+(
const value& v)
const {
return apply_op(std::plus<>(), v); }
94 inline mat
operator-(
const value& v)
const {
return apply_op(std::minus<>(), v); }
95 inline mat
operator*(
const value& v)
const {
return apply_op(std::multiplies<>(), v); }
96 inline mat
operator/(
const value& v)
const {
return apply_op(std::divides<>(), v); }
98 inline mat&
operator+=(value&& v) {
return apply_op_inplace([](
auto& r,
auto& v) {
r+=
v; },
v); }
99 inline mat&
operator-=(value&& v) {
return apply_op_inplace([](
auto& r,
auto& v) {
r-=
v; },
v); }
100 inline mat&
operator*=(value&& v) {
return apply_op_inplace([](
auto& r,
auto& v) {
r*=
v; },
v); }
101 inline mat&
operator/=(value&& v) {
return apply_op_inplace([](
auto& r,
auto& v) {
r/=
v; },
v); }
103 friend inline constexpr mat
operator+(
const value& v,
const mat& m) {
return (m+v); }
104 friend inline constexpr mat
operator-(
const value& v,
const mat& m) {
return (-m + v); }
105 friend inline constexpr mat
operator*(
const value& v,
const mat& m) {
return (m*v); }
110 for(
size_t r=0;
r != N; ++
r)
112 auto row = this->row(r);
113 result[
r] =
dot(row, v);
121 for(
size_t r=0;
r != N; ++
r)
123 auto row = this->row(r);
124 for(
size_t c=0; c != N; ++c)
125 result(r, c) =
dot(row, m.col(c));
139 template<
typename... T,
typename OP>
140 inline auto apply_op(
const OP& op, T&&... t)
const
143 multirange_for([&](
auto& r,
auto&... m) {
r = op(m...); }, result._col, _col, t...);
148 template<
typename... T,
typename OP>
149 inline auto& apply_op_inplace(
const OP& op, T&&... t)
159 std::array<Vec, N> _col;
174 using mat2d = bbm::detail::mat<vec2d<T>, 2>;
178 using mat3d = bbm::detail::mat<vec3d<T>, 3>;
Defines additional helper methods for vectors.
ranged for loop over multiple containers at once
auto dot(const T &a, const T &b)
Definition: horizontal.h:17
constexpr decltype(auto) r(bbm::color< T > &c)
Definition: color.h:18
constexpr decltype(auto) v(bbm::vec2d< T > &v)
Definition: vec.h:40
Definition: aggregatebsdf.h:29
constexpr M transpose(const M &m)
Bring 'transpose' in the bbm namespace.
Definition: mat.h:170
auto operator/(const vector< T > &v, const U &u)
Definition: vector_util.h:273
constexpr FLAGNAME operator+(FLAGNAME a, FLAGNAME b)
Conact two flags.
Definition: flags.h:40
bbm::detail::mat< vec3d< T >, 3 > mat3d
3D matrix
Definition: mat.h:178
constexpr FLAGNAME & operator+=(FLAGNAME &a, FLAGNAME b)
Update 'a' with a+b.
Definition: flags.h:84
auto & operator*=(vector< T > &v, const U &u)
Definition: vector_util.h:267
bbm::detail::mat< vec2d< T >, 2 > mat2d
2D matrix
Definition: mat.h:174
auto operator*(const vector< T > &v, const U &u)
Definition: vector_util.h:268
auto & operator/=(vector< T > &v, const U &u)
Definition: vector_util.h:272
void multirange_for(FUNC &&func, Ts &&... containers)
ranged for loop over multiple containers at once
Definition: multirange_for.h:43
std::ostream & operator<<(std::ostream &s, const BSDF &bsdf)
Definition: bsdf_base.h:138
constexpr M identity(void)
create an identity matrix
Definition: mat.h:166
decltype(auto) value(T &&t)
return the value of an attribute, or if not an attribute the object
Definition: attribute_value.h:20
auto & operator-=(vector< T > &v, const U &u)
Definition: vector_util.h:263
auto operator-(const vector< T > &v, const U &u)
Definition: vector_util.h:264