From 3b62246ef8f39cbe61d63099a96a2197a0683dc3 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 31 Oct 2013 10:12:26 +0000 Subject: [PATCH] math: minor rework in the Euler angles conversion. --- src/math/vector.cpp | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/math/vector.cpp b/src/math/vector.cpp index 4634c8e1..731e82b2 100644 --- a/src/math/vector.cpp +++ b/src/math/vector.cpp @@ -648,11 +648,15 @@ static inline quat quat_fromeuler_generic(vec3 const &v, int i, int j, int k) return ret; } -#define DEFINE_GENERIC_EULER_CONVERSIONS(name, i, j, k) \ +#define DEFINE_GENERIC_EULER_CONVERSIONS(a1, a2, a3) \ + DEFINE_GENERIC_EULER_CONVERSIONS_INNER(a1, a2, a3, a1##a2##a3) \ + +#define DEFINE_GENERIC_EULER_CONVERSIONS_INNER(a1, a2, a3, name) \ /* Create quaternions from Euler angles */ \ template<> quat quat::fromeuler_##name(vec3 const &v) \ { \ - return quat_fromeuler_generic(v, i, j, k); \ + int x = 0, y = 1, z = 2; UNUSED(x, y, z); \ + return quat_fromeuler_generic(v, a1, a2, a3); \ } \ \ template<> quat quat::fromeuler_##name(float phi, float theta, float psi) \ @@ -663,7 +667,8 @@ static inline quat quat_fromeuler_generic(vec3 const &v, int i, int j, int k) /* Create 3×3 matrices from Euler angles */ \ template<> mat3 mat3::fromeuler_##name(vec3 const &v) \ { \ - return mat3_fromeuler_generic(v, i, j, k); \ + int x = 0, y = 1, z = 2; UNUSED(x, y, z); \ + return mat3_fromeuler_generic(v, a1, a2, a3); \ } \ \ template<> mat3 mat3::fromeuler_##name(float phi, float theta, float psi) \ @@ -674,7 +679,8 @@ static inline quat quat_fromeuler_generic(vec3 const &v, int i, int j, int k) /* Create 4×4 matrices from Euler angles */ \ template<> mat4 mat4::fromeuler_##name(vec3 const &v) \ { \ - return mat4(mat3_fromeuler_generic(v, i, j, k), 1.f); \ + int x = 0, y = 1, z = 2; UNUSED(x, y, z); \ + return mat4(mat3_fromeuler_generic(v, a1, a2, a3), 1.f); \ } \ \ template<> mat4 mat4::fromeuler_##name(float phi, float theta, float psi) \ @@ -685,24 +691,26 @@ static inline quat quat_fromeuler_generic(vec3 const &v, int i, int j, int k) /* Retrieve Euler angles from a quaternion */ \ template<> vec3 vec3::toeuler_##name(quat const &q) \ { \ - return quat_toeuler_generic(q, i, j, k); \ + int x = 0, y = 1, z = 2; UNUSED(x, y, z); \ + return quat_toeuler_generic(q, a1, a2, a3); \ } -DEFINE_GENERIC_EULER_CONVERSIONS(xyx, 0, 1, 0) -DEFINE_GENERIC_EULER_CONVERSIONS(xzx, 0, 2, 0) -DEFINE_GENERIC_EULER_CONVERSIONS(yxy, 1, 0, 1) -DEFINE_GENERIC_EULER_CONVERSIONS(yzy, 1, 2, 1) -DEFINE_GENERIC_EULER_CONVERSIONS(zxz, 2, 0, 2) -DEFINE_GENERIC_EULER_CONVERSIONS(zyz, 2, 1, 2) +DEFINE_GENERIC_EULER_CONVERSIONS(x, y, x) +DEFINE_GENERIC_EULER_CONVERSIONS(x, z, x) +DEFINE_GENERIC_EULER_CONVERSIONS(y, x, y) +DEFINE_GENERIC_EULER_CONVERSIONS(y, z, y) +DEFINE_GENERIC_EULER_CONVERSIONS(z, x, z) +DEFINE_GENERIC_EULER_CONVERSIONS(z, y, z) -DEFINE_GENERIC_EULER_CONVERSIONS(xyz, 0, 1, 2) -DEFINE_GENERIC_EULER_CONVERSIONS(xzy, 0, 2, 1) -DEFINE_GENERIC_EULER_CONVERSIONS(yxz, 1, 0, 2) -DEFINE_GENERIC_EULER_CONVERSIONS(yzx, 1, 2, 0) -DEFINE_GENERIC_EULER_CONVERSIONS(zxy, 2, 0, 1) -DEFINE_GENERIC_EULER_CONVERSIONS(zyx, 2, 1, 0) +DEFINE_GENERIC_EULER_CONVERSIONS(x, y, z) +DEFINE_GENERIC_EULER_CONVERSIONS(x, z, y) +DEFINE_GENERIC_EULER_CONVERSIONS(y, x, z) +DEFINE_GENERIC_EULER_CONVERSIONS(y, z, x) +DEFINE_GENERIC_EULER_CONVERSIONS(z, x, y) +DEFINE_GENERIC_EULER_CONVERSIONS(z, y, x) #undef DEFINE_GENERIC_EULER_CONVERSIONS +#undef DEFINE_GENERIC_EULER_CONVERSIONS_INNER template<> mat4 mat4::lookat(vec3 eye, vec3 center, vec3 up) {