@@ -24,7 +24,7 @@ TESTS = testsuite | |||||
testsuite_SOURCES = testsuite.cpp \ | testsuite_SOURCES = testsuite.cpp \ | ||||
unit/vector.cpp unit/matrix.cpp unit/half.cpp unit/trig.cpp \ | unit/vector.cpp unit/matrix.cpp unit/half.cpp unit/trig.cpp \ | ||||
unit/build.cpp unit/real.cpp unit/image.cpp unit/quat.cpp unit/cmplx.cpp \ | unit/build.cpp unit/real.cpp unit/image.cpp unit/quat.cpp unit/cmplx.cpp \ | ||||
unit/array.cpp | |||||
unit/array.cpp unit/rotation.cpp | |||||
testsuite_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | testsuite_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | ||||
testsuite_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | testsuite_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | ||||
testsuite_DEPENDENCIES = $(top_builddir)/src/liblol.a | testsuite_DEPENDENCIES = $(top_builddir)/src/liblol.a | ||||
@@ -26,11 +26,11 @@ LOLUNIT_FIXTURE(QuaternionTest) | |||||
LOLUNIT_TEST(Equality) | LOLUNIT_TEST(Equality) | ||||
{ | { | ||||
quat a4(1.0f, 2.0f, 3.0f, 4.0f); | |||||
quat b4(0.0f, 2.0f, 3.0f, 4.0f); | |||||
quat c4(1.0f, 0.0f, 3.0f, 4.0f); | |||||
quat d4(1.0f, 2.0f, 0.0f, 4.0f); | |||||
quat e4(1.0f, 2.0f, 3.0f, 0.0f); | |||||
quat a4(1.f, 2.f, 3.f, 4.f); | |||||
quat b4(0.f, 2.f, 3.f, 4.f); | |||||
quat c4(1.f, 0.f, 3.f, 4.f); | |||||
quat d4(1.f, 2.f, 0.f, 4.f); | |||||
quat e4(1.f, 2.f, 3.f, 0.f); | |||||
LOLUNIT_ASSERT_EQUAL(a4, a4); | LOLUNIT_ASSERT_EQUAL(a4, a4); | ||||
LOLUNIT_ASSERT_NOT_DIFFERENT(a4, a4); | LOLUNIT_ASSERT_NOT_DIFFERENT(a4, a4); | ||||
@@ -47,8 +47,8 @@ LOLUNIT_FIXTURE(QuaternionTest) | |||||
LOLUNIT_TEST(UnaryMinus) | LOLUNIT_TEST(UnaryMinus) | ||||
{ | { | ||||
quat a(1.0f, 3.0f, 2.0f, 4.0f); | |||||
quat b(-1.0f, -3.0f, -2.0f, -4.0f); | |||||
quat a(1.f, 3.f, 2.f, 4.f); | |||||
quat b(-1.f, -3.f, -2.f, -4.f); | |||||
LOLUNIT_ASSERT_EQUAL(a, -b); | LOLUNIT_ASSERT_EQUAL(a, -b); | ||||
LOLUNIT_ASSERT_EQUAL(-a, b); | LOLUNIT_ASSERT_EQUAL(-a, b); | ||||
@@ -56,8 +56,8 @@ LOLUNIT_FIXTURE(QuaternionTest) | |||||
LOLUNIT_TEST(Conjugate) | LOLUNIT_TEST(Conjugate) | ||||
{ | { | ||||
quat a(1.0f, 3.0f, 2.0f, 4.0f); | |||||
quat b(1.0f, -3.0f, -2.0f, -4.0f); | |||||
quat a(1.f, 3.f, 2.f, 4.f); | |||||
quat b(1.f, -3.f, -2.f, -4.f); | |||||
LOLUNIT_ASSERT_EQUAL(a, ~b); | LOLUNIT_ASSERT_EQUAL(a, ~b); | ||||
LOLUNIT_ASSERT_EQUAL(~a, b); | LOLUNIT_ASSERT_EQUAL(~a, b); | ||||
@@ -65,31 +65,31 @@ LOLUNIT_FIXTURE(QuaternionTest) | |||||
LOLUNIT_TEST(Norm) | LOLUNIT_TEST(Norm) | ||||
{ | { | ||||
quat a(2.0f, -2.0f, -8.0f, 3.0f); | |||||
quat a(2.f, -2.f, -8.f, 3.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(a), 81.0f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(a), 81.f); | |||||
quat b = a * ~a; | quat b = a * ~a; | ||||
quat c(norm(a), 0.0f, 0.0f, 0.0f); | |||||
quat c(norm(a), 0.f, 0.f, 0.f); | |||||
LOLUNIT_ASSERT_EQUAL(b, c); | LOLUNIT_ASSERT_EQUAL(b, c); | ||||
quat d(2.0f, 3.0f, -4.0f, -1.0f); | |||||
quat d(2.f, 3.f, -4.f, -1.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(a * d), norm(a) * norm(d)); | LOLUNIT_ASSERT_EQUAL(norm(a * d), norm(a) * norm(d)); | ||||
} | } | ||||
LOLUNIT_TEST(Base) | LOLUNIT_TEST(Base) | ||||
{ | { | ||||
quat i(0.0f, 1.0f, 0.0f, 0.0f); | |||||
quat j(0.0f, 0.0f, 1.0f, 0.0f); | |||||
quat k(0.0f, 0.0f, 0.0f, 1.0f); | |||||
quat one(1.0f, 0.0f, 0.0f, 0.0f); | |||||
quat one(1.f, 0.f, 0.f, 0.f); | |||||
quat i(0.f, 1.f, 0.f, 0.f); | |||||
quat j(0.f, 0.f, 1.f, 0.f); | |||||
quat k(0.f, 0.f, 0.f, 1.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(i), 1.0f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(j), 1.0f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(k), 1.0f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(one), 1.0f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(one), 1.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(i), 1.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(j), 1.f); | |||||
LOLUNIT_ASSERT_EQUAL(norm(k), 1.f); | |||||
LOLUNIT_ASSERT_EQUAL(i * i, -one); | LOLUNIT_ASSERT_EQUAL(i * i, -one); | ||||
LOLUNIT_ASSERT_EQUAL(j * j, -one); | LOLUNIT_ASSERT_EQUAL(j * j, -one); | ||||
@@ -106,40 +106,50 @@ LOLUNIT_FIXTURE(QuaternionTest) | |||||
LOLUNIT_TEST(Normalize) | LOLUNIT_TEST(Normalize) | ||||
{ | { | ||||
quat a(2.0f, -2.0f, -8.0f, 3.0f); | |||||
quat a(2.f, -2.f, -8.f, 3.f); | |||||
quat b = normalize(a); | quat b = normalize(a); | ||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(b), 1.0, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(norm(b), 1.0, 1e-5); | |||||
} | } | ||||
LOLUNIT_TEST(Reciprocal) | LOLUNIT_TEST(Reciprocal) | ||||
{ | { | ||||
quat a(2.0f, -2.0f, -8.0f, 3.0f); | |||||
quat a(2.f, -2.f, -8.f, 3.f); | |||||
quat b = re(a); | quat b = re(a); | ||||
quat m1 = a * b; | quat m1 = a * b; | ||||
quat m2 = b * a; | quat m2 = b * a; | ||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.x, m2.x, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.y, m2.y, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.z, m2.z, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.w, m2.w, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.x, 0.0, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.y, 0.0, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.z, 0.0, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.w, 1.0, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.w, m2.w, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.x, m2.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.y, m2.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.z, m2.z, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.w, 1.0, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.x, 0.0, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.y, 0.0, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m1.z, 0.0, 1e-5); | |||||
} | } | ||||
LOLUNIT_TEST(Rotation) | LOLUNIT_TEST(Rotation) | ||||
{ | { | ||||
quat a = quat::rotate(10.0f, vec3(1, 0, 0)); | |||||
quat b = quat::rotate(20.0f, vec3(1, 0, 0)); | |||||
/* Check that rotating 10 degrees twice means rotating 20 degrees */ | |||||
quat a = quat::rotate(10.f, vec3(1, 0, 0)); | |||||
quat b = quat::rotate(20.f, vec3(1, 0, 0)); | |||||
quat c = a * a; | quat c = a * a; | ||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(a.w, a.w, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(a.x, a.x, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(a.y, a.y, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(a.z, a.z, 1e-8); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.w, b.w, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.x, b.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.y, b.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.z, b.z, 1e-5); | |||||
/* Check that rotating 10 degrees then 20 is the same as 20 then 10 */ | |||||
quat d = a * b; | |||||
quat e = b * a; | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(e.w, d.w, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(e.x, d.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(e.y, d.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(e.z, d.z, 1e-5); | |||||
} | } | ||||
}; | }; | ||||
@@ -0,0 +1,124 @@ | |||||
// | |||||
// Lol Engine | |||||
// | |||||
// Copyright: (c) 2010-2012 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. | |||||
// | |||||
#if defined HAVE_CONFIG_H | |||||
# include "config.h" | |||||
#endif | |||||
#include "core.h" | |||||
#include "lol/unit.h" | |||||
namespace lol | |||||
{ | |||||
LOLUNIT_FIXTURE(RotationTest) | |||||
{ | |||||
void SetUp() {} | |||||
void TearDown() {} | |||||
LOLUNIT_TEST(Rotate2D) | |||||
{ | |||||
/* Check that rotation is CCW */ | |||||
mat2 m90 = mat2::rotate(90.f); | |||||
vec2 a(2.f, 3.f); | |||||
vec2 b = m90 * a; | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(b.x, -a.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(b.y, a.x, 1e-5); | |||||
} | |||||
LOLUNIT_TEST(Compose2D) | |||||
{ | |||||
/* Check that rotating 20 degrees twice means rotating 40 degrees */ | |||||
mat2 m20 = mat2::rotate(20.f); | |||||
mat2 m40 = mat2::rotate(40.f); | |||||
mat2 m20x20 = m20 * m20; | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[0][0], m40[0][0], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[1][0], m40[1][0], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[0][1], m40[0][1], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[1][1], m40[1][1], 1e-5); | |||||
} | |||||
LOLUNIT_TEST(Rotate3D) | |||||
{ | |||||
/* Check that rotation is CCW around each axis */ | |||||
mat3 m90x = mat3::rotate(90.f, 1.f, 0.f, 0.f); | |||||
mat3 m90y = mat3::rotate(90.f, 0.f, 1.f, 0.f); | |||||
mat3 m90z = mat3::rotate(90.f, 0.f, 0.f, 1.f); | |||||
vec3 a(2.f, 3.f, 4.f); | |||||
vec3 b = m90x * a; | |||||
vec3 c = m90y * a; | |||||
vec3 d = m90z * a; | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(b.x, a.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(b.y, -a.z, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(b.z, a.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.x, a.z, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.y, a.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.z, -a.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(d.x, -a.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(d.y, a.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(d.z, a.z, 1e-5); | |||||
} | |||||
LOLUNIT_TEST(Compose3D) | |||||
{ | |||||
/* Check that rotating 20 degrees twice means rotating 40 degrees */ | |||||
mat3 m20 = mat3::rotate(20.f, 1.f, 2.f, 3.f); | |||||
mat3 m40 = mat3::rotate(40.f, 1.f, 2.f, 3.f); | |||||
mat3 m20x20 = m20 * m20; | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[0][0], m40[0][0], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[1][0], m40[1][0], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[2][0], m40[2][0], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[0][1], m40[0][1], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[1][1], m40[1][1], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[2][1], m40[2][1], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[0][2], m40[0][2], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[1][2], m40[1][2], 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(m20x20[2][2], m40[2][2], 1e-5); | |||||
} | |||||
LOLUNIT_TEST(QuaternionTransform) | |||||
{ | |||||
/* Check that rotating using a quaternion is the same as rotating | |||||
* using a matrix */ | |||||
mat3 m20 = mat3::rotate(20.f, 1.f, 2.f, 3.f); | |||||
quat q20 = quat::rotate(20.f, 1.f, 2.f, 3.f); | |||||
vec3 a(-2.f, 4.f, 3.f); | |||||
vec3 b = m20 * a; | |||||
vec3 c = q20.transform(a); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.x, b.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.y, b.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(c.z, b.z, 1e-5); | |||||
} | |||||
LOLUNIT_TEST(QuaternionFromMatrix) | |||||
{ | |||||
quat q1 = quat::rotate(20.f, 1.f, 2.f, 3.f); | |||||
quat q2 = quat(mat3::rotate(20.f, 1.f, 2.f, 3.f)); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(q2.w, q1.w, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(q2.x, q1.x, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(q2.y, q1.y, 1e-5); | |||||
LOLUNIT_ASSERT_DOUBLES_EQUAL(q2.z, q1.z, 1e-5); | |||||
} | |||||
}; | |||||
} /* namespace lol */ | |||||
@@ -36,6 +36,7 @@ | |||||
<ClCompile Include="..\test\unit\matrix.cpp" /> | <ClCompile Include="..\test\unit\matrix.cpp" /> | ||||
<ClCompile Include="..\test\unit\quat.cpp" /> | <ClCompile Include="..\test\unit\quat.cpp" /> | ||||
<ClCompile Include="..\test\unit\real.cpp" /> | <ClCompile Include="..\test\unit\real.cpp" /> | ||||
<ClCompile Include="..\test\unit\rotation.cpp" /> | |||||
<ClCompile Include="..\test\unit\trig.cpp" /> | <ClCompile Include="..\test\unit\trig.cpp" /> | ||||
<ClCompile Include="..\test\unit\vector.cpp" /> | <ClCompile Include="..\test\unit\vector.cpp" /> | ||||
</ItemGroup> | </ItemGroup> | ||||