91 lines
2.5 KiB
C++
91 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include <Orange/Math/Unit.h>
|
|
#include <Orange/Math/Constants.h>
|
|
|
|
namespace orange
|
|
{
|
|
namespace detail
|
|
{
|
|
template <typename T>
|
|
class Radian;
|
|
|
|
template <typename T>
|
|
class Degree : public Unit<Degree, T>
|
|
{
|
|
public:
|
|
constexpr Degree() {}
|
|
|
|
constexpr explicit Degree(T value)
|
|
: Unit<orange::detail::Degree, T>(value)
|
|
{
|
|
}
|
|
|
|
constexpr Degree(Unit<orange::detail::Degree, T> value)
|
|
: Unit<orange::detail::Degree, T>(value)
|
|
{
|
|
}
|
|
|
|
template <typename U>
|
|
constexpr explicit Degree(Unit<orange::detail::Degree, U> value)
|
|
: Unit<orange::detail::Degree, T>(value)
|
|
{
|
|
}
|
|
|
|
constexpr Degree(Unit<Radian, T> value);
|
|
};
|
|
|
|
template <typename T>
|
|
class Radian : public Unit<Radian, T>
|
|
{
|
|
public:
|
|
Radian() {}
|
|
|
|
constexpr explicit Radian(T value)
|
|
: Unit<orange::detail::Radian, T>(value)
|
|
{
|
|
}
|
|
|
|
constexpr Radian(Unit<orange::detail::Radian, T> value)
|
|
: Unit<orange::detail::Radian, T>(value)
|
|
{
|
|
}
|
|
template <typename U>
|
|
constexpr explicit Radian(Unit<orange::detail::Radian, U> value)
|
|
: Unit<orange::detail::Radian, T>(value)
|
|
{
|
|
}
|
|
|
|
constexpr Radian(Unit<Degree, T> value);
|
|
};
|
|
|
|
template <typename T>
|
|
constexpr Degree<T>::Degree(Unit<Radian, T> value)
|
|
: Unit<orange::detail::Degree, T>(T(360) * T(value) / Math::Tau)
|
|
{
|
|
}
|
|
|
|
template <typename T>
|
|
constexpr Radian<T>::Radian(Unit<Degree, T> value)
|
|
: Unit<orange::detail::Radian, T>(T(value) * Math::Tau / T(360))
|
|
{
|
|
}
|
|
}
|
|
|
|
using Radian = detail::Radian<float>;
|
|
using Degree = detail::Degree<float>;
|
|
|
|
constexpr Radian operator"" _rad(long double value) { return Radian{static_cast<float>(value)}; }
|
|
constexpr Radian operator"" _rad(unsigned long long value) { return Radian{static_cast<float>(value)}; }
|
|
|
|
constexpr Degree operator"" _deg(long double value) { return Degree{static_cast<float>(value)}; }
|
|
constexpr Degree operator"" _deg(unsigned long long value) { return Degree{static_cast<float>(value)}; }
|
|
|
|
struct EulerAngles
|
|
{
|
|
Radian pitch;
|
|
Radian yaw;
|
|
Radian roll;
|
|
};
|
|
|
|
} |