Browse Source

Math: ability to convert Bezier underlying type.

pull/175/merge
Vladimír Vondruš 10 years ago
parent
commit
aaa0b0945a
  1. 13
      src/Magnum/Math/Bezier.h
  2. 16
      src/Magnum/Math/Test/BezierTest.cpp

13
src/Magnum/Math/Bezier.h

@ -50,6 +50,8 @@ Implementation of M-order N-dimensional
template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier { template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
static_assert(order != 0, "Bezier cannot have zero order"); static_assert(order != 0, "Bezier cannot have zero order");
template<UnsignedInt, UnsignedInt, class> friend class Bezier;
public: public:
typedef T Type; /**< @brief Underlying data type */ typedef T Type; /**< @brief Underlying data type */
@ -85,6 +87,14 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
static_assert(sizeof...(U) + 1 == order + 1, "Wrong number of arguments"); static_assert(sizeof...(U) + 1 == order + 1, "Wrong number of arguments");
} }
/**
* @brief Construct Bézier curve from another of different type
*
* Performs only default casting on the values, no rounding or
* anything else.
*/
template<class U> constexpr explicit Bezier(const Bezier<order, dimensions, U>& other) noexcept: Bezier{typename Implementation::GenerateSequence<order + 1>::Type(), other} {}
/** /**
* @brief Subdivide the curve * @brief Subdivide the curve
* @param t The interpolation factor * @param t The interpolation factor
@ -137,6 +147,9 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
} }
private: private:
/* Implementation for Bezier<order, dimensions, T>::Bezier(const Bezier<order, dimensions, U>&) */
template<class U, std::size_t ...sequence> constexpr explicit Bezier(Implementation::Sequence<sequence...>, const Bezier<order, dimensions, U>& other) noexcept: _data{Vector<dimensions, T>(other._data[sequence])...} {}
/* Implementation for Bezier<order, dimensions, T>::Bezier(ZeroInitT) and Bezier<order, dimensions, T>::Bezier(NoInitT) */ /* Implementation for Bezier<order, dimensions, T>::Bezier(ZeroInitT) and Bezier<order, dimensions, T>::Bezier(NoInitT) */
/* MSVC 2015 can't handle {} here */ /* MSVC 2015 can't handle {} here */
template<class U, std::size_t ...sequence> constexpr explicit Bezier(Implementation::Sequence<sequence...>, U): _data{Vector<dimensions, T>((static_cast<void>(sequence), U{typename U::Init{}}))...} {} template<class U, std::size_t ...sequence> constexpr explicit Bezier(Implementation::Sequence<sequence...>, U): _data{Vector<dimensions, T>((static_cast<void>(sequence), U{typename U::Init{}}))...} {}

16
src/Magnum/Math/Test/BezierTest.cpp

@ -35,7 +35,9 @@
namespace Magnum { namespace Math { namespace Test { namespace Magnum { namespace Math { namespace Test {
typedef Math::Vector2<Float> Vector2; typedef Math::Vector2<Float> Vector2;
typedef Math::Vector2<Double> Vector2d;
typedef Math::QuadraticBezier2D<Float> QuadraticBezier2D; typedef Math::QuadraticBezier2D<Float> QuadraticBezier2D;
typedef Math::QuadraticBezier2D<Double> QuadraticBezier2Dd;
typedef Math::CubicBezier2D<Float> CubicBezier2D; typedef Math::CubicBezier2D<Float> CubicBezier2D;
struct BezierTest : Corrade::TestSuite::Tester { struct BezierTest : Corrade::TestSuite::Tester {
@ -44,6 +46,7 @@ struct BezierTest : Corrade::TestSuite::Tester {
void construct(); void construct();
void constructDefault(); void constructDefault();
void constructNoInit(); void constructNoInit();
void constructConversion();
void constructCopy(); void constructCopy();
void data(); void data();
@ -61,6 +64,7 @@ BezierTest::BezierTest() {
addTests({&BezierTest::construct, addTests({&BezierTest::construct,
&BezierTest::constructDefault, &BezierTest::constructDefault,
&BezierTest::constructNoInit, &BezierTest::constructNoInit,
&BezierTest::constructConversion,
&BezierTest::constructCopy, &BezierTest::constructCopy,
&BezierTest::data, &BezierTest::data,
@ -100,6 +104,18 @@ void BezierTest::constructNoInit() {
CORRADE_VERIFY((std::is_nothrow_constructible<QuadraticBezier2D, NoInitT>::value)); CORRADE_VERIFY((std::is_nothrow_constructible<QuadraticBezier2D, NoInitT>::value));
} }
void BezierTest::constructConversion() {
constexpr QuadraticBezier2Dd a{Vector2d{0.5, 1.0}, Vector2d{1.1, 0.3}, Vector2d{0.1, 1.2}};
constexpr QuadraticBezier2D b{a};
CORRADE_COMPARE(b, (QuadraticBezier2D{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}));
/* Implicit conversion is not allowed */
CORRADE_VERIFY(!(std::is_convertible<QuadraticBezier2Dd, QuadraticBezier2D>::value));
CORRADE_VERIFY((std::is_nothrow_constructible<QuadraticBezier2D, QuadraticBezier2Dd>::value));
}
void BezierTest::constructCopy() { void BezierTest::constructCopy() {
constexpr QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}}; constexpr QuadraticBezier2D a{Vector2{0.5f, 1.0f}, Vector2{1.1f, 0.3f}, Vector2{0.1f, 1.2f}};
constexpr QuadraticBezier2D b{a}; constexpr QuadraticBezier2D b{a};

Loading…
Cancel
Save