Browse Source

Math: avoid using std::array.

Plain C array and a view on it is much better. And lighter weight. And
compiles faster.
pull/331/head
Vladimír Vondruš 7 years ago
parent
commit
676b19ec0b
  1. 13
      src/Magnum/Math/Bezier.h

13
src/Magnum/Math/Bezier.h

@ -30,8 +30,6 @@
* @brief Class @ref Magnum::Math::Bezier, alias @ref Magnum::Math::QuadraticBezier, @ref Magnum::Math::QuadraticBezier2D, @ref Magnum::Math::QuadraticBezier3D, @ref Magnum::Math::CubicBezier, @ref Magnum::Math::CubicBezier2D, @ref Magnum::Math::CubicBezier3D * @brief Class @ref Magnum::Math::Bezier, alias @ref Magnum::Math::QuadraticBezier, @ref Magnum::Math::QuadraticBezier2D, @ref Magnum::Math::QuadraticBezier3D, @ref Magnum::Math::CubicBezier, @ref Magnum::Math::CubicBezier2D, @ref Magnum::Math::CubicBezier3D
*/ */
#include <array>
#include "Magnum/Math/Vector.h" #include "Magnum/Math/Vector.h"
namespace Magnum { namespace Math { namespace Magnum { namespace Math {
@ -178,7 +176,9 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
* @see @ref subdivide() * @see @ref subdivide()
*/ */
Vector<dimensions, T> value(Float t) const { Vector<dimensions, T> value(Float t) const {
return calculateIntermediatePoints(t)[0][order]; Bezier<order, dimensions, T> iPoints[order + 1];
calculateIntermediatePoints(iPoints, t);
return iPoints[0][order];
} }
/** /**
@ -189,7 +189,8 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
* @see @ref value() * @see @ref value()
*/ */
std::pair<Bezier<order, dimensions, T>, Bezier<order, dimensions, T>> subdivide(Float t) const { std::pair<Bezier<order, dimensions, T>, Bezier<order, dimensions, T>> subdivide(Float t) const {
const auto iPoints = calculateIntermediatePoints(t); Bezier<order, dimensions, T> iPoints[order + 1];
calculateIntermediatePoints(iPoints, t);
Bezier<order, dimensions, T> left, right; Bezier<order, dimensions, T> left, right;
for(std::size_t i = 0; i <= order; ++i) for(std::size_t i = 0; i <= order; ++i)
left[i] = iPoints[0][i]; left[i] = iPoints[0][i];
@ -207,8 +208,7 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
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{}}))...} {}
/* Calculates and returns all intermediate points generated when using De Casteljau's algorithm */ /* Calculates and returns all intermediate points generated when using De Casteljau's algorithm */
std::array<Bezier<order, dimensions, T>, order + 1> calculateIntermediatePoints(Float t) const { void calculateIntermediatePoints(Bezier<order, dimensions, T>(&iPoints)[order + 1], Float t) const {
std::array<Bezier<order, dimensions, T>, order + 1> iPoints;
for(std::size_t i = 0; i <= order; ++i) { for(std::size_t i = 0; i <= order; ++i) {
iPoints[i][0] = _data[i]; iPoints[i][0] = _data[i];
} }
@ -217,7 +217,6 @@ template<UnsignedInt order, UnsignedInt dimensions, class T> class Bezier {
iPoints[i][r] = (1 - t)*iPoints[i][r - 1] + t*iPoints[i + 1][r - 1]; iPoints[i][r] = (1 - t)*iPoints[i][r - 1] + t*iPoints[i + 1][r - 1];
} }
} }
return iPoints;
} }
Vector<dimensions, T> _data[order + 1]; Vector<dimensions, T> _data[order + 1];

Loading…
Cancel
Save