Browse Source

Math: default/identity and NoInit constructors for Frustum, tests.

pull/190/head
Vladimír Vondruš 10 years ago
parent
commit
3e2464cded
  1. 21
      src/Magnum/Math/Frustum.h
  2. 71
      src/Magnum/Math/Test/FrustumTest.cpp

21
src/Magnum/Math/Frustum.h

@ -58,7 +58,18 @@ template<class T> class Frustum {
m.row(3) - m.row(2)};
}
/** @brief Constructor */
/**
* @brief Identity constructor
*
* Equivalent to creating a frustum from an identity matrix.
* @see @ref fromMatrix()
*/
constexpr /*implicit*/ Frustum(IdentityInitT = IdentityInit) noexcept;
/** @brief Construct a frustum without initializing the contents */
explicit Frustum(NoInitT) noexcept: _data{Vector4<T>{NoInit}, Vector4<T>{NoInit}, Vector4<T>{NoInit}, Vector4<T>{NoInit}, Vector4<T>{NoInit}, Vector4<T>{NoInit}} {}
/** @brief Construct a frustum from plane equations */
constexpr /*implicit*/ Frustum(const Vector4<T>& left, const Vector4<T>& right, const Vector4<T>& bottom, const Vector4<T>& top, const Vector4<T>& near, const Vector4<T>& far) noexcept: _data{left, right, bottom, top, near, far} {}
/** @brief Equality comparison */
@ -113,6 +124,14 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili
extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utility::Debug&, const Frustum<Float>&);
#endif
template<class T> constexpr Frustum<T>::Frustum(IdentityInitT) noexcept: _data{
{ 1.0f, 0.0f, 0.0f, 1.0f},
{-1.0f, 0.0f, 0.0f, 1.0f},
{ 0.0f, 1.0f, 0.0f, 1.0f},
{ 0.0f, -1.0f, 0.0f, 1.0f},
{ 0.0f, 0.0f, 1.0f, 1.0f},
{ 0.0f, 0.0f, -1.0f, 1.0f}} {}
}}
#endif

71
src/Magnum/Math/Test/FrustumTest.cpp

@ -36,6 +36,9 @@ struct FrustumTest: Corrade::TestSuite::Tester {
explicit FrustumTest();
void construct();
void constructIdentity();
void constructNoInit();
void constructCopy();
void constructFromMatrix();
void compare();
@ -49,6 +52,9 @@ typedef Math::Frustum<Float> Frustum;
FrustumTest::FrustumTest() {
addTests({&FrustumTest::construct,
&FrustumTest::constructIdentity,
&FrustumTest::constructNoInit,
&FrustumTest::constructCopy,
&FrustumTest::constructFromMatrix,
&FrustumTest::compare,
@ -76,6 +82,67 @@ void FrustumTest::construct() {
CORRADE_VERIFY((std::is_nothrow_constructible<Frustum, Vector4, Vector4, Vector4, Vector4, Vector4, Vector4>::value));
}
void FrustumTest::constructIdentity() {
Frustum expected{
{ 1.0f, 0.0f, 0.0f, 1.0f},
{-1.0f, 0.0f, 0.0f, 1.0f},
{ 0.0f, 1.0f, 0.0f, 1.0f},
{ 0.0f, -1.0f, 0.0f, 1.0f},
{ 0.0f, 0.0f, 1.0f, 1.0f},
{ 0.0f, 0.0f, -1.0f, 1.0f}};
constexpr Frustum a;
constexpr Frustum b{IdentityInit};
CORRADE_COMPARE(a, expected);
CORRADE_COMPARE(b, expected);
CORRADE_VERIFY(std::is_nothrow_default_constructible<Frustum>::value);
CORRADE_VERIFY((std::is_nothrow_constructible<Frustum, IdentityInitT>::value));
}
void FrustumTest::constructNoInit() {
Frustum a{
{-1.0f, 2.0f, -3.0f, 0.1f},
{ 1.0f, -2.0f, 3.0f, 0.2f},
{-4.0f, 5.0f, -6.0f, 0.3f},
{ 4.0f, -5.0f, 6.0f, 0.4f},
{-7.0f, 8.0f, -9.0f, 0.5f},
{ 7.0f, 8.0f, 9.0f, 0.6f}};
new(&a) Frustum{NoInit};
{
#if defined(__GNUC__) && __GNUC__*100 + __GNUC_MINOR__ >= 601 && __OPTIMIZE__
CORRADE_EXPECT_FAIL("GCC 6.1+ misoptimizes and overwrites the value.");
#endif
CORRADE_COMPARE(a, (Frustum{
{-1.0f, 2.0f, -3.0f, 0.1f},
{ 1.0f, -2.0f, 3.0f, 0.2f},
{-4.0f, 5.0f, -6.0f, 0.3f},
{ 4.0f, -5.0f, 6.0f, 0.4f},
{-7.0f, 8.0f, -9.0f, 0.5f},
{ 7.0f, 8.0f, 9.0f, 0.6f}}));
}
/* Implicit construction is not allowed */
CORRADE_VERIFY((std::is_nothrow_constructible<Frustum, NoInitT>::value));
}
void FrustumTest::constructCopy() {
constexpr Frustum a{
{-1.0f, 2.0f, -3.0f, 0.1f},
{ 1.0f, -2.0f, 3.0f, 0.2f},
{-4.0f, 5.0f, -6.0f, 0.3f},
{ 4.0f, -5.0f, 6.0f, 0.4f},
{-7.0f, 8.0f, -9.0f, 0.5f},
{ 7.0f, 8.0f, 9.0f, 0.6f}};
constexpr Frustum b{a};
CORRADE_COMPARE(b, a);
CORRADE_VERIFY(std::is_nothrow_copy_constructible<Frustum>::value);
CORRADE_VERIFY(std::is_nothrow_copy_assignable<Frustum>::value);
}
void FrustumTest::constructFromMatrix() {
using namespace Magnum::Math::Literals;
@ -91,6 +158,10 @@ void FrustumTest::constructFromMatrix() {
Matrix4::perspectiveProjection(90.0_degf, 1.0f, 1.0f, 10.0f));
CORRADE_COMPARE(frustum, expected);
/* Constructing from a default-constructed matrix should be equivalent to
default constructor */
CORRADE_COMPARE(Frustum::fromMatrix({}), Frustum{});
}
void FrustumTest::compare() {

Loading…
Cancel
Save