|
|
@@ -1,132 +0,0 @@ |
|
|
|
// |
|
|
|
// Lol Engine |
|
|
|
// |
|
|
|
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> |
|
|
|
// This program is free software; you can redistribute it and/or |
|
|
|
// modify it under the terms of the Do What The Fuck You Want To |
|
|
|
// Public License, Version 2, as published by Sam Hocevar. See |
|
|
|
// http://sam.zoy.org/projects/COPYING.WTFPL for more details. |
|
|
|
// |
|
|
|
|
|
|
|
// |
|
|
|
// The Matrix classes |
|
|
|
// ------------------ |
|
|
|
// |
|
|
|
|
|
|
|
#if !defined __DH_MATRIX_H__ |
|
|
|
#define __DH_MATRIX_H__ |
|
|
|
|
|
|
|
#include <cmath> |
|
|
|
|
|
|
|
#define VECTOR_OP(elems, op) \ |
|
|
|
template<typename U> \ |
|
|
|
inline Vec##elems<T> operator op(Vec##elems<U> const &val) const \ |
|
|
|
{ \ |
|
|
|
Vec##elems<T> ret; \ |
|
|
|
for (int n = 0; n < elems; n++) \ |
|
|
|
ret[n] = (*this)[n] op val[n]; \ |
|
|
|
return ret; \ |
|
|
|
} |
|
|
|
|
|
|
|
#define SCALAR_OP(elems, op) \ |
|
|
|
inline Vec##elems<T> operator op(T const &val) const \ |
|
|
|
{ \ |
|
|
|
Vec##elems<T> ret; \ |
|
|
|
for (int n = 0; n < elems; n++) \ |
|
|
|
ret[n] = (*this)[n] op val; \ |
|
|
|
return ret; \ |
|
|
|
} |
|
|
|
|
|
|
|
#define OPERATORS(elems) \ |
|
|
|
inline T& operator[](int n) { return *(&x + n); } \ |
|
|
|
inline T const& operator[](int n) const { return *(&x + n); } \ |
|
|
|
\ |
|
|
|
VECTOR_OP(elems, -) \ |
|
|
|
VECTOR_OP(elems, +) \ |
|
|
|
VECTOR_OP(elems, *) \ |
|
|
|
VECTOR_OP(elems, /) \ |
|
|
|
\ |
|
|
|
SCALAR_OP(elems, -) \ |
|
|
|
SCALAR_OP(elems, +) \ |
|
|
|
SCALAR_OP(elems, *) \ |
|
|
|
SCALAR_OP(elems, /) \ |
|
|
|
\ |
|
|
|
template<typename U> \ |
|
|
|
inline operator Vec##elems<U>() const \ |
|
|
|
{ \ |
|
|
|
Vec##elems<U> ret; \ |
|
|
|
for (int n = 0; n < elems; n++) \ |
|
|
|
ret[n] = static_cast<U>((*this)[n]); \ |
|
|
|
return ret; \ |
|
|
|
} \ |
|
|
|
\ |
|
|
|
inline T sqlen() const \ |
|
|
|
{ \ |
|
|
|
T acc = 0; \ |
|
|
|
for (int n = 0; n < elems; n++) \ |
|
|
|
acc += (*this)[n] * (*this)[n]; \ |
|
|
|
return acc; \ |
|
|
|
} \ |
|
|
|
\ |
|
|
|
inline float len() const \ |
|
|
|
{ \ |
|
|
|
return sqrtf((float)sqlen()); \ |
|
|
|
} |
|
|
|
|
|
|
|
template <typename T> struct Vec2 |
|
|
|
{ |
|
|
|
inline Vec2() { x = y = 0; } |
|
|
|
inline Vec2(T val) { x = y = val; } |
|
|
|
inline Vec2(T _x, T _y) { x = _x; y = _y; } |
|
|
|
|
|
|
|
OPERATORS(2) |
|
|
|
|
|
|
|
union { T x; T a; T i; }; |
|
|
|
union { T y; T b; T j; }; |
|
|
|
}; |
|
|
|
|
|
|
|
typedef Vec2<float> Float2; |
|
|
|
typedef Vec2<int> Int2; |
|
|
|
|
|
|
|
template <typename T> struct Vec3 |
|
|
|
{ |
|
|
|
inline Vec3() { x = y = z = 0; } |
|
|
|
inline Vec3(T val) { x = y = z = val; } |
|
|
|
inline Vec3(T _x, T _y, T _z) { x = _x; y = _y; z = _z; } |
|
|
|
|
|
|
|
OPERATORS(3) |
|
|
|
|
|
|
|
union { T x; T a; T i; }; |
|
|
|
union { T y; T b; T j; }; |
|
|
|
union { T z; T c; T k; }; |
|
|
|
}; |
|
|
|
|
|
|
|
typedef Vec3<float> Float3; |
|
|
|
typedef Vec3<int> Int3; |
|
|
|
|
|
|
|
#define SCALAR_GLOBAL(elems, op, U) \ |
|
|
|
template<typename T> \ |
|
|
|
static inline Vec##elems<U> operator op(U const &val, \ |
|
|
|
Vec##elems<T> const &that) \ |
|
|
|
{ \ |
|
|
|
Vec##elems<U> ret; \ |
|
|
|
for (int n = 0; n < elems; n++) \ |
|
|
|
ret[n] = val op that[n]; \ |
|
|
|
return ret; \ |
|
|
|
} |
|
|
|
|
|
|
|
#define SCALAR_GLOBAL2(elems, op) \ |
|
|
|
SCALAR_GLOBAL(elems, op, int) \ |
|
|
|
SCALAR_GLOBAL(elems, op, float) |
|
|
|
|
|
|
|
#define GLOBALS(elems) \ |
|
|
|
SCALAR_GLOBAL2(elems, -) \ |
|
|
|
SCALAR_GLOBAL2(elems, +) \ |
|
|
|
SCALAR_GLOBAL2(elems, *) \ |
|
|
|
SCALAR_GLOBAL2(elems, /) |
|
|
|
|
|
|
|
GLOBALS(2) |
|
|
|
GLOBALS(3) |
|
|
|
|
|
|
|
#endif // __DH_MATRIX_H__ |
|
|
|
|