|
|
@@ -953,8 +953,7 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_VECTOR_COERCE_OP(tname, op, tprefix, t1, t2, tf) \ |
|
|
|
tprefix \ |
|
|
|
static inline tname<tf> operator op(tname<t1> const &a, \ |
|
|
|
tname<t2> const &b) \ |
|
|
|
inline tname<tf> operator op(tname<t1> const &a, tname<t2> const &b) \ |
|
|
|
{ \ |
|
|
|
tname<tf> ret; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(t1); n++) \ |
|
|
@@ -964,16 +963,14 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_VECTOR_OP(tname, op, tprefix, type) \ |
|
|
|
tprefix \ |
|
|
|
static inline tname<type> operator op##=(tname<type> &a, \ |
|
|
|
tname<type> const &b) \ |
|
|
|
inline tname<type> operator op##=(tname<type> &a, tname<type> const &b) \ |
|
|
|
{ \ |
|
|
|
return a = a op b; \ |
|
|
|
} |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_VECTOR_BOOLOP(tname, op, op2, ret, tprefix, t1, t2) \ |
|
|
|
tprefix \ |
|
|
|
static inline bool operator op(tname<t1> const &a, \ |
|
|
|
tname<t2> const &b) \ |
|
|
|
inline bool operator op(tname<t1> const &a, tname<t2> const &b) \ |
|
|
|
{ \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(t1); n++) \ |
|
|
|
if (!(a[n] op2 b[n])) \ |
|
|
@@ -983,7 +980,7 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_SCALAR_COERCE_OP(tname, op, tprefix, t1, t2, tf) \ |
|
|
|
tprefix \ |
|
|
|
static inline tname<tf> operator op(tname<t1> const &a, t2 const &val) \ |
|
|
|
inline tname<tf> operator op(tname<t1> const &a, t2 const &val) \ |
|
|
|
{ \ |
|
|
|
tname<tf> ret; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(t1); n++) \ |
|
|
@@ -992,7 +989,7 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
} \ |
|
|
|
\ |
|
|
|
tprefix \ |
|
|
|
static inline tname<tf> operator op(t1 const &val, tname<t2> const &a) \ |
|
|
|
inline tname<tf> operator op(t1 const &val, tname<t2> const &a) \ |
|
|
|
{ \ |
|
|
|
tname<tf> ret; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(t2); n++) \ |
|
|
@@ -1002,14 +999,14 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_SCALAR_OP(tname, op, tprefix, type) \ |
|
|
|
tprefix \ |
|
|
|
static inline tname<type> operator op##=(tname<type> &a, type const &val) \ |
|
|
|
inline tname<type> operator op##=(tname<type> &a, type const &val) \ |
|
|
|
{ \ |
|
|
|
return a = a op val; \ |
|
|
|
} |
|
|
|
|
|
|
|
#define DECLARE_UNARY_OPS(tname, tprefix, type) \ |
|
|
|
tprefix \ |
|
|
|
static inline tname<type> operator -(tname<type> const &a) \ |
|
|
|
inline tname<type> operator -(tname<type> const &a) \ |
|
|
|
{ \ |
|
|
|
tname<type> ret; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(type); n++) \ |
|
|
@@ -1018,7 +1015,7 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
} \ |
|
|
|
\ |
|
|
|
tprefix \ |
|
|
|
static inline type sqlen(tname<type> const &a) \ |
|
|
|
inline type sqlen(tname<type> const &a) \ |
|
|
|
{ \ |
|
|
|
type acc = 0; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(type); n++) \ |
|
|
@@ -1027,14 +1024,14 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
} \ |
|
|
|
\ |
|
|
|
tprefix \ |
|
|
|
static inline double len(tname<type> const &a) \ |
|
|
|
inline double len(tname<type> const &a) \ |
|
|
|
{ \ |
|
|
|
using namespace std; \ |
|
|
|
return sqrt((double)sqlen(a)); \ |
|
|
|
} \ |
|
|
|
\ |
|
|
|
tprefix \ |
|
|
|
static inline tname<type> normalize(tname<type> const &val) \ |
|
|
|
inline tname<type> normalize(tname<type> const &val) \ |
|
|
|
{ \ |
|
|
|
type norm = (type)len(val); \ |
|
|
|
return norm ? val / norm : val * (type)0; \ |
|
|
@@ -1051,7 +1048,7 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
DECLARE_VECTOR_VECTOR_BOOLOP(tname, !=, ==, false, tprefix, t1, t2) \ |
|
|
|
\ |
|
|
|
tprefix \ |
|
|
|
static inline tf dot(tname<t1> const &a, tname<t2> const &b) \ |
|
|
|
inline tf dot(tname<t1> const &a, tname<t2> const &b) \ |
|
|
|
{ \ |
|
|
|
tf ret = 0; \ |
|
|
|
for (size_t n = 0; n < sizeof(a) / sizeof(t1); n++) \ |
|
|
@@ -1078,19 +1075,19 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
DECLARE_VECTOR_VECTOR_BOOLOP(tname, >, >, true, tprefix, t1, t2) |
|
|
|
|
|
|
|
#define DECLARE_VECTOR_OPS(tname, tprefix, type) \ |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, /* empty */, type, type, type) \ |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, static, type, type, type) \ |
|
|
|
\ |
|
|
|
DECLARE_VECTOR_VECTOR_OP(tname, *, tprefix, type) \ |
|
|
|
DECLARE_VECTOR_VECTOR_OP(tname, /, tprefix, type) |
|
|
|
|
|
|
|
#define DECLARE_ALL_NONVECTOR_OPS(tname) \ |
|
|
|
DECLARE_BINARY_OPS(tname, template<typename T>, T) \ |
|
|
|
DECLARE_UNARY_OPS(tname, template<typename T>, T) |
|
|
|
DECLARE_BINARY_OPS(tname, template<typename T> static, T) \ |
|
|
|
DECLARE_UNARY_OPS(tname, template<typename T> static, T) |
|
|
|
|
|
|
|
#define DECLARE_ALL_VECTOR_OPS_INNER(tname, type) \ |
|
|
|
DECLARE_BINARY_OPS(tname, /* empty */, type) \ |
|
|
|
DECLARE_UNARY_OPS(tname, /* empty */, type) \ |
|
|
|
DECLARE_VECTOR_OPS(tname, /* empty */, type) \ |
|
|
|
DECLARE_BINARY_OPS(tname, static, type) \ |
|
|
|
DECLARE_UNARY_OPS(tname, static, type) \ |
|
|
|
DECLARE_VECTOR_OPS(tname, static, type) \ |
|
|
|
|
|
|
|
#define DECLARE_ALL_VECTOR_OPS(tname) \ |
|
|
|
DECLARE_ALL_VECTOR_OPS_INNER(tname, half) \ |
|
|
@@ -1106,11 +1103,11 @@ static inline Quat<T> operator /(Quat<T> x, Quat<T> const &y) |
|
|
|
DECLARE_ALL_VECTOR_OPS_INNER(tname, uint64_t) |
|
|
|
|
|
|
|
#define DECLARE_ALL_VECTOR_COERCE_OPS_INNER(tname, tlow, thigh) \ |
|
|
|
DECLARE_BINARY_COERCE_OPS(tname, /* empty */, tlow, thigh, thigh) \ |
|
|
|
DECLARE_BINARY_COERCE_OPS(tname, /* empty */, thigh, tlow, thigh) \ |
|
|
|
DECLARE_BINARY_COERCE_OPS(tname, static, tlow, thigh, thigh) \ |
|
|
|
DECLARE_BINARY_COERCE_OPS(tname, static, thigh, tlow, thigh) \ |
|
|
|
\ |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, /* empty */, tlow, thigh, thigh) \ |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, /* empty */, thigh, tlow, thigh) |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, static, tlow, thigh, thigh) \ |
|
|
|
DECLARE_VECTOR_COERCE_OPS(tname, static, thigh, tlow, thigh) |
|
|
|
|
|
|
|
#define DECLARE_ALL_VECTOR_COERCE_OPS(tname) \ |
|
|
|
/* Apply the same coercion rules as in the C++ standard. However, */ \ |
|
|
|