Browse Source

Math: conversion constructor for Frustum.

pull/190/head
Vladimír Vondruš 10 years ago
parent
commit
01fa24910f
  1. 16
      src/Magnum/Math/Frustum.h
  2. 28
      src/Magnum/Math/Test/FrustumTest.cpp

16
src/Magnum/Math/Frustum.h

@ -72,6 +72,14 @@ template<class T> class Frustum {
/** @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 Construct frustum from another of different type
*
* Performs only default casting on the values, no rounding or
* anything else.
*/
template<class U> constexpr explicit Frustum(const Frustum<U>& other) noexcept;
/** @brief Equality comparison */
bool operator==(const Frustum<T>& other) const {
for(std::size_t i = 0; i != 6; ++i)
@ -150,6 +158,14 @@ template<class T> constexpr Frustum<T>::Frustum(IdentityInitT) noexcept: _data{
{ 0.0f, 0.0f, 1.0f, 1.0f},
{ 0.0f, 0.0f, -1.0f, 1.0f}} {}
template<class T> template<class U> constexpr Frustum<T>::Frustum(const Frustum<U>& other) noexcept: _data{
Vector4<T>{other[0]},
Vector4<T>{other[1]},
Vector4<T>{other[2]},
Vector4<T>{other[3]},
Vector4<T>{other[4]},
Vector4<T>{other[5]}} {}
}}
#endif

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

@ -38,6 +38,7 @@ struct FrustumTest: Corrade::TestSuite::Tester {
void construct();
void constructIdentity();
void constructNoInit();
void constructConversion();
void constructCopy();
void constructFromMatrix();
@ -51,11 +52,13 @@ struct FrustumTest: Corrade::TestSuite::Tester {
typedef Math::Vector4<Float> Vector4;
typedef Math::Matrix4<Float> Matrix4;
typedef Math::Frustum<Float> Frustum;
typedef Math::Frustum<Double> Frustumd;
FrustumTest::FrustumTest() {
addTests({&FrustumTest::construct,
&FrustumTest::constructIdentity,
&FrustumTest::constructNoInit,
&FrustumTest::constructConversion,
&FrustumTest::constructCopy,
&FrustumTest::constructFromMatrix,
@ -132,6 +135,31 @@ void FrustumTest::constructNoInit() {
CORRADE_VERIFY((std::is_nothrow_constructible<Frustum, NoInitT>::value));
}
void FrustumTest::constructConversion() {
constexpr Frustumd a{
{-1.0, 2.0, -3.0, 0.1},
{ 1.0, -2.0, 3.0, 0.2},
{-4.0, 5.0, -6.0, 0.3},
{ 4.0, -5.0, 6.0, 0.4},
{-7.0, 8.0, -9.0, 0.5},
{ 7.0, 8.0, 9.0, 0.6}};
Frustum expected{
{-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, expected);
/* Implicit conversion is not allowed */
CORRADE_VERIFY(!(std::is_convertible<Frustum, Frustumd>::value));
CORRADE_VERIFY((std::is_nothrow_constructible<Frustum, Frustumd>::value));
}
void FrustumTest::constructCopy() {
constexpr Frustum a{
{-1.0f, 2.0f, -3.0f, 0.1f},

Loading…
Cancel
Save