| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 |
- /*
- -----------------------------------------------------------------------------
- This source file is part of OGRE
- (Object-oriented Graphics Rendering Engine)
- For the latest info, see http://www.ogre3d.org/
- Copyright (c) 2000-2011 Torus Knot Software Ltd
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- -----------------------------------------------------------------------------
- */
- #ifndef __Math_H__
- #define __Math_H__
- #include "CmPrerequisitesUtil.h"
- namespace CamelotFramework
- {
- /** \addtogroup Core
- * @{
- */
- /** \addtogroup Math
- * @{
- */
- /** Wrapper class which indicates a given angle value is in Radians.
- @remarks
- Radian values are interchangeable with Degree values, and conversions
- will be done automatically between them.
- */
- class Radian
- {
- float mRad;
- public:
- explicit Radian ( float r=0 ) : mRad(r) {}
- Radian ( const Degree& d );
- Radian& operator = ( const float& f ) { mRad = f; return *this; }
- Radian& operator = ( const Radian& r ) { mRad = r.mRad; return *this; }
- Radian& operator = ( const Degree& d );
- float valueDegrees() const; // see bottom of this file
- float valueRadians() const { return mRad; }
- float valueAngleUnits() const;
- const Radian& operator + () const { return *this; }
- Radian operator + ( const Radian& r ) const { return Radian ( mRad + r.mRad ); }
- Radian operator + ( const Degree& d ) const;
- Radian& operator += ( const Radian& r ) { mRad += r.mRad; return *this; }
- Radian& operator += ( const Degree& d );
- Radian operator - () const { return Radian(-mRad); }
- Radian operator - ( const Radian& r ) const { return Radian ( mRad - r.mRad ); }
- Radian operator - ( const Degree& d ) const;
- Radian& operator -= ( const Radian& r ) { mRad -= r.mRad; return *this; }
- Radian& operator -= ( const Degree& d );
- Radian operator * ( float f ) const { return Radian ( mRad * f ); }
- Radian operator * ( const Radian& f ) const { return Radian ( mRad * f.mRad ); }
- Radian& operator *= ( float f ) { mRad *= f; return *this; }
- Radian operator / ( float f ) const { return Radian ( mRad / f ); }
- Radian& operator /= ( float f ) { mRad /= f; return *this; }
- bool operator < ( const Radian& r ) const { return mRad < r.mRad; }
- bool operator <= ( const Radian& r ) const { return mRad <= r.mRad; }
- bool operator == ( const Radian& r ) const { return mRad == r.mRad; }
- bool operator != ( const Radian& r ) const { return mRad != r.mRad; }
- bool operator >= ( const Radian& r ) const { return mRad >= r.mRad; }
- bool operator > ( const Radian& r ) const { return mRad > r.mRad; }
- inline CM_UTILITY_EXPORT friend std::ostream& operator <<
- ( std::ostream& o, const Radian& v )
- {
- o << "Radian(" << v.valueRadians() << ")";
- return o;
- }
- };
- /** Wrapper class which indicates a given angle value is in Degrees.
- @remarks
- Degree values are interchangeable with Radian values, and conversions
- will be done automatically between them.
- */
- class Degree
- {
- float mDeg; // if you get an error here - make sure to define/typedef 'float' first
- public:
- explicit Degree ( float d=0 ) : mDeg(d) {}
- Degree ( const Radian& r ) : mDeg(r.valueDegrees()) {}
- Degree& operator = ( const float& f ) { mDeg = f; return *this; }
- Degree& operator = ( const Degree& d ) { mDeg = d.mDeg; return *this; }
- Degree& operator = ( const Radian& r ) { mDeg = r.valueDegrees(); return *this; }
- float valueDegrees() const { return mDeg; }
- float valueRadians() const; // see bottom of this file
- float valueAngleUnits() const;
- const Degree& operator + () const { return *this; }
- Degree operator + ( const Degree& d ) const { return Degree ( mDeg + d.mDeg ); }
- Degree operator + ( const Radian& r ) const { return Degree ( mDeg + r.valueDegrees() ); }
- Degree& operator += ( const Degree& d ) { mDeg += d.mDeg; return *this; }
- Degree& operator += ( const Radian& r ) { mDeg += r.valueDegrees(); return *this; }
- Degree operator - () const { return Degree(-mDeg); }
- Degree operator - ( const Degree& d ) const { return Degree ( mDeg - d.mDeg ); }
- Degree operator - ( const Radian& r ) const { return Degree ( mDeg - r.valueDegrees() ); }
- Degree& operator -= ( const Degree& d ) { mDeg -= d.mDeg; return *this; }
- Degree& operator -= ( const Radian& r ) { mDeg -= r.valueDegrees(); return *this; }
- Degree operator * ( float f ) const { return Degree ( mDeg * f ); }
- Degree operator * ( const Degree& f ) const { return Degree ( mDeg * f.mDeg ); }
- Degree& operator *= ( float f ) { mDeg *= f; return *this; }
- Degree operator / ( float f ) const { return Degree ( mDeg / f ); }
- Degree& operator /= ( float f ) { mDeg /= f; return *this; }
- bool operator < ( const Degree& d ) const { return mDeg < d.mDeg; }
- bool operator <= ( const Degree& d ) const { return mDeg <= d.mDeg; }
- bool operator == ( const Degree& d ) const { return mDeg == d.mDeg; }
- bool operator != ( const Degree& d ) const { return mDeg != d.mDeg; }
- bool operator >= ( const Degree& d ) const { return mDeg >= d.mDeg; }
- bool operator > ( const Degree& d ) const { return mDeg > d.mDeg; }
- inline CM_UTILITY_EXPORT friend std::ostream& operator <<
- ( std::ostream& o, const Degree& v )
- {
- o << "Degree(" << v.valueDegrees() << ")";
- return o;
- }
- };
- /** Wrapper class which identifies a value as the currently default angle
- type, as defined by Math::setAngleUnit.
- @remarks
- Angle values will be automatically converted between radians and degrees,
- as appropriate.
- */
- class Angle
- {
- float mAngle;
- public:
- explicit Angle ( float angle ) : mAngle(angle) {}
- operator Radian() const;
- operator Degree() const;
- };
- // these functions could not be defined within the class definition of class
- // Radian because they required class Degree to be defined
- inline Radian::Radian ( const Degree& d ) : mRad(d.valueRadians()) {
- }
- inline Radian& Radian::operator = ( const Degree& d ) {
- mRad = d.valueRadians(); return *this;
- }
- inline Radian Radian::operator + ( const Degree& d ) const {
- return Radian ( mRad + d.valueRadians() );
- }
- inline Radian& Radian::operator += ( const Degree& d ) {
- mRad += d.valueRadians();
- return *this;
- }
- inline Radian Radian::operator - ( const Degree& d ) const {
- return Radian ( mRad - d.valueRadians() );
- }
- inline Radian& Radian::operator -= ( const Degree& d ) {
- mRad -= d.valueRadians();
- return *this;
- }
- /** Class to provide access to common mathematical functions.
- @remarks
- Most of the maths functions are aliased versions of the C runtime
- library functions. They are aliased here to provide future
- optimisation opportunities, either from faster RTLs or custom
- math approximations.
- @note
- <br>This is based on MgcMath.h from
- <a href="http://www.geometrictools.com/">Wild Magic</a>.
- */
- class CM_UTILITY_EXPORT Math
- {
- public:
- /** The angular units used by the API. This functionality is now deprecated in favor
- of discreet angular unit types ( see Degree and Radian above ). The only place
- this functionality is actually still used is when parsing files. Search for
- usage of the Angle class for those instances
- */
- enum AngleUnit
- {
- AU_DEGREE,
- AU_RADIAN
- };
- protected:
- // angle units used by the api
- static AngleUnit msAngleUnit;
- /// Size of the trig tables as determined by constructor.
- static int mTrigTableSize;
- /// Radian -> index factor value ( mTrigTableSize / 2 * PI )
- static float mTrigTableFactor;
- static float* mSinTable;
- static float* mTanTable;
- /** Private function to build trig tables.
- */
- void buildTrigTables();
- static float SinTable (float fValue);
- static float TanTable (float fValue);
- public:
- /** Default constructor.
- @param
- trigTableSize Optional parameter to set the size of the
- tables used to implement Sin, Cos, Tan
- */
- Math(unsigned int trigTableSize = 4096);
- /** Default destructor.
- */
- ~Math();
- static inline float Abs (float fValue) { return float(fabs(fValue)); }
- static inline Degree Abs (const Degree& dValue) { return Degree(fabs(dValue.valueDegrees())); }
- static inline Radian Abs (const Radian& rValue) { return Radian(fabs(rValue.valueRadians())); }
- static Radian ACos (float fValue);
- static Radian ASin (float fValue);
- static inline Radian ATan (float fValue) { return Radian(atan(fValue)); }
- static inline Radian ATan2 (float fY, float fX) { return Radian(atan2(fY,fX)); }
- static inline float Ceil (float fValue) { return float(ceil(fValue)); }
- static inline int CeilToInt (float fValue) { return int(ceil(fValue)); }
- static inline float Round (float fValue) { return floor(fValue + 0.5f); }
- static inline int RoundToInt (float fValue) { return int(floor(fValue + 0.5f)); }
- static inline bool isNaN(float f)
- {
- // std::isnan() is C99, not supported by all compilers
- // However NaN always fails this next test, no other number does.
- return f != f;
- }
- /** Cosine function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Cos (const Radian& fValue, bool useTables = false) {
- return (!useTables) ? float(cos(fValue.valueRadians())) : SinTable(fValue.valueRadians() + HALF_PI);
- }
- /** Cosine function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Cos (float fValue, bool useTables = false) {
- return (!useTables) ? float(cos(fValue)) : SinTable(fValue + HALF_PI);
- }
- static inline float Exp (float fValue) { return float(exp(fValue)); }
- static inline float Floor (float fValue) { return float(floor(fValue)); }
- static inline int FloorToInt (float fValue) { return int(floor(fValue)); }
- static inline float Log (float fValue) { return float(log(fValue)); }
- /// Stored value of log(2) for frequent use
- static const float LOG2;
- static inline float Log2 (float fValue) { return float(log(fValue)/LOG2); }
- static inline float LogN (float base, float fValue) { return float(log(fValue)/log(base)); }
- static inline float Pow (float fBase, float fExponent) { return float(pow(fBase,fExponent)); }
- static float Sign (float fValue);
- static inline Radian Sign ( const Radian& rValue )
- {
- return Radian(Sign(rValue.valueRadians()));
- }
- static inline Degree Sign ( const Degree& dValue )
- {
- return Degree(Sign(dValue.valueDegrees()));
- }
- /** Sine function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Sin (const Radian& fValue, bool useTables = false) {
- return (!useTables) ? float(sin(fValue.valueRadians())) : SinTable(fValue.valueRadians());
- }
- /** Sine function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Sin (float fValue, bool useTables = false) {
- return (!useTables) ? float(sin(fValue)) : SinTable(fValue);
- }
- static inline float Sqr (float fValue) { return fValue*fValue; }
- static inline float Sqrt (float fValue) { return float(sqrt(fValue)); }
- static inline Radian Sqrt (const Radian& fValue) { return Radian(sqrt(fValue.valueRadians())); }
- static inline Degree Sqrt (const Degree& fValue) { return Degree(sqrt(fValue.valueDegrees())); }
- /** Inverse square root i.e. 1 / Sqrt(x), good for vector
- normalisation.
- */
- static float InvSqrt(float fValue);
- static float UnitRandom (); // in [0,1]
- static float RangeRandom (float fLow, float fHigh); // in [fLow,fHigh]
- static float SymmetricRandom (); // in [-1,1]
- /** Tangent function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Tan (const Radian& fValue, bool useTables = false) {
- return (!useTables) ? float(tan(fValue.valueRadians())) : TanTable(fValue.valueRadians());
- }
- /** Tangent function.
- @param
- fValue Angle in radians
- @param
- useTables If true, uses lookup tables rather than
- calculation - faster but less accurate.
- */
- static inline float Tan (float fValue, bool useTables = false) {
- return (!useTables) ? float(tan(fValue)) : TanTable(fValue);
- }
- static inline float DegreesToRadians(float degrees) { return degrees * fDeg2Rad; }
- static inline float RadiansToDegrees(float radians) { return radians * fRad2Deg; }
- /** These functions used to set the assumed angle units (radians or degrees)
- expected when using the Angle type.
- @par
- You can set this directly after creating a new Root, and also before/after resource creation,
- depending on whether you want the change to affect resource files.
- */
- static void setAngleUnit(AngleUnit unit);
- /** Get the unit being used for angles. */
- static AngleUnit getAngleUnit(void);
- /** Convert from the current AngleUnit to radians. */
- static float AngleUnitsToRadians(float units);
- /** Convert from radians to the current AngleUnit . */
- static float RadiansToAngleUnits(float radians);
- /** Convert from the current AngleUnit to degrees. */
- static float AngleUnitsToDegrees(float units);
- /** Convert from degrees to the current AngleUnit. */
- static float DegreesToAngleUnits(float degrees);
- /** Checks whether a given point is inside a triangle, in a
- 2-dimensional (Cartesian) space.
- @remarks
- The vertices of the triangle must be given in either
- trigonometrical (anticlockwise) or inverse trigonometrical
- (clockwise) order.
- @param
- p The point.
- @param
- a The triangle's first vertex.
- @param
- b The triangle's second vertex.
- @param
- c The triangle's third vertex.
- @returns
- If the point resides in the triangle, <b>true</b> is
- returned.
- @par
- If the point is outside the triangle, <b>false</b> is
- returned.
- */
- static bool pointInTri2D(const Vector2& p, const Vector2& a,
- const Vector2& b, const Vector2& c);
- /** Checks whether a given 3D point is inside a triangle.
- @remarks
- The vertices of the triangle must be given in either
- trigonometrical (anticlockwise) or inverse trigonometrical
- (clockwise) order, and the point must be guaranteed to be in the
- same plane as the triangle
- @param
- p The point.
- @param
- a The triangle's first vertex.
- @param
- b The triangle's second vertex.
- @param
- c The triangle's third vertex.
- @param
- normal The triangle plane's normal (passed in rather than calculated
- on demand since the caller may already have it)
- @returns
- If the point resides in the triangle, <b>true</b> is
- returned.
- @par
- If the point is outside the triangle, <b>false</b> is
- returned.
- */
- static bool pointInTri3D(const Vector3& p, const Vector3& a,
- const Vector3& b, const Vector3& c, const Vector3& normal);
- /** Ray / plane intersection, returns boolean result and distance. */
- static std::pair<bool, float> intersects(const Ray& ray, const Plane& plane);
- /** Ray / sphere intersection, returns boolean result and distance. */
- static std::pair<bool, float> intersects(const Ray& ray, const Sphere& sphere,
- bool discardInside = true);
-
- /** Ray / box intersection, returns boolean result and distance. */
- static std::pair<bool, float> intersects(const Ray& ray, const AABox& box);
- /** Ray / box intersection, returns boolean result and two intersection distance.
- @param
- ray The ray.
- @param
- box The box.
- @param
- d1 A real pointer to retrieve the near intersection distance
- from the ray origin, maybe <b>null</b> which means don't care
- about the near intersection distance.
- @param
- d2 A real pointer to retrieve the far intersection distance
- from the ray origin, maybe <b>null</b> which means don't care
- about the far intersection distance.
- @returns
- If the ray is intersects the box, <b>true</b> is returned, and
- the near intersection distance is return by <i>d1</i>, the
- far intersection distance is return by <i>d2</i>. Guarantee
- <b>0</b> <= <i>d1</i> <= <i>d2</i>.
- @par
- If the ray isn't intersects the box, <b>false</b> is returned, and
- <i>d1</i> and <i>d2</i> is unmodified.
- */
- static bool intersects(const Ray& ray, const AABox& box,
- float* d1, float* d2);
- /** Ray / triangle intersection, returns boolean result and distance.
- @param
- ray The ray.
- @param
- a The triangle's first vertex.
- @param
- b The triangle's second vertex.
- @param
- c The triangle's third vertex.
- @param
- normal The triangle plane's normal (passed in rather than calculated
- on demand since the caller may already have it), doesn't need
- normalised since we don't care.
- @param
- positiveSide Intersect with "positive side" of the triangle
- @param
- negativeSide Intersect with "negative side" of the triangle
- @returns
- If the ray is intersects the triangle, a pair of <b>true</b> and the
- distance between intersection point and ray origin returned.
- @par
- If the ray isn't intersects the triangle, a pair of <b>false</b> and
- <b>0</b> returned.
- */
- static std::pair<bool, float> intersects(const Ray& ray, const Vector3& a,
- const Vector3& b, const Vector3& c, const Vector3& normal,
- bool positiveSide = true, bool negativeSide = true);
- /** Ray / triangle intersection, returns boolean result and distance.
- @param
- ray The ray.
- @param
- a The triangle's first vertex.
- @param
- b The triangle's second vertex.
- @param
- c The triangle's third vertex.
- @param
- positiveSide Intersect with "positive side" of the triangle
- @param
- negativeSide Intersect with "negative side" of the triangle
- @returns
- If the ray is intersects the triangle, a pair of <b>true</b> and the
- distance between intersection point and ray origin returned.
- @par
- If the ray isn't intersects the triangle, a pair of <b>false</b> and
- <b>0</b> returned.
- */
- static std::pair<bool, float> intersects(const Ray& ray, const Vector3& a,
- const Vector3& b, const Vector3& c,
- bool positiveSide = true, bool negativeSide = true);
- /** Sphere / box intersection test. */
- static bool intersects(const Sphere& sphere, const AABox& box);
- /** Plane / box intersection test. */
- static bool intersects(const Plane& plane, const AABox& box);
- /** Ray / convex plane list intersection test.
- @param ray The ray to test with
- @param plaeList List of planes which form a convex volume
- @param normalIsOutside Does the normal point outside the volume
- */
- static std::pair<bool, float> intersects(
- const Ray& ray, const Vector<Plane>::type& planeList,
- bool normalIsOutside);
- /** Ray / convex plane list intersection test.
- @param ray The ray to test with
- @param plaeList List of planes which form a convex volume
- @param normalIsOutside Does the normal point outside the volume
- */
- static std::pair<bool, float> intersects(
- const Ray& ray, const List<Plane>::type& planeList,
- bool normalIsOutside);
- /** Sphere / plane intersection test.
- @remarks NB just do a plane.getDistance(sphere.getCenter()) for more detail!
- */
- static bool intersects(const Sphere& sphere, const Plane& plane);
- /** Compare 2 reals, using tolerance for inaccuracies.
- */
- static bool RealEqual(float a, float b,
- float tolerance = std::numeric_limits<float>::epsilon());
- /** Calculates the tangent space vector for a given set of positions / texture coords. */
- static Vector3 calculateTangentSpaceVector(
- const Vector3& position1, const Vector3& position2, const Vector3& position3,
- float u1, float v1, float u2, float v2, float u3, float v3);
- /** Build a reflection matrix for the passed in plane. */
- static Matrix4 buildReflectionMatrix(const Plane& p);
- /** Calculate a face normal, including the w component which is the offset from the origin. */
- static Vector4 calculateFaceNormal(const Vector3& v1, const Vector3& v2, const Vector3& v3);
- /** Calculate a face normal, no w-information. */
- static Vector3 calculateBasicFaceNormal(const Vector3& v1, const Vector3& v2, const Vector3& v3);
- /** Calculate a face normal without normalize, including the w component which is the offset from the origin. */
- static Vector4 calculateFaceNormalWithoutNormalize(const Vector3& v1, const Vector3& v2, const Vector3& v3);
- /** Calculate a face normal without normalize, no w-information. */
- static Vector3 calculateBasicFaceNormalWithoutNormalize(const Vector3& v1, const Vector3& v2, const Vector3& v3);
- /** Generates a value based on the Gaussian (normal) distribution function
- with the given offset and scale parameters.
- */
- static float gaussianDistribution(float x, float offset = 0.0f, float scale = 1.0f);
- /** Clamp a value within an inclusive range. */
- template <typename T>
- static T Clamp(T val, T minval, T maxval)
- {
- assert (minval <= maxval && "Invalid clamp range");
- return std::max(std::min(val, maxval), minval);
- }
- /** Clamp a value within an inclusive range. */
- template <typename T>
- static T Clamp01(T val)
- {
- return std::max(std::min(val, (T)1), (T)0);
- }
- static Matrix4 makeViewMatrix(const Vector3& position, const Quaternion& orientation,
- const Matrix4* reflectMatrix = 0);
- /** Get a bounding radius value from a bounding box. */
- static float boundingRadiusFromAABB(const AABox& aabb);
- static const float POS_INFINITY;
- static const float NEG_INFINITY;
- static const float PI;
- static const float TWO_PI;
- static const float HALF_PI;
- static const float fDeg2Rad;
- static const float fRad2Deg;
- };
- // these functions must be defined down here, because they rely on the
- // angle unit conversion functions in class Math:
- inline float Radian::valueDegrees() const
- {
- return Math::RadiansToDegrees ( mRad );
- }
- inline float Radian::valueAngleUnits() const
- {
- return Math::RadiansToAngleUnits ( mRad );
- }
- inline float Degree::valueRadians() const
- {
- return Math::DegreesToRadians ( mDeg );
- }
- inline float Degree::valueAngleUnits() const
- {
- return Math::DegreesToAngleUnits ( mDeg );
- }
- inline Angle::operator Radian() const
- {
- return Radian(Math::AngleUnitsToRadians(mAngle));
- }
- inline Angle::operator Degree() const
- {
- return Degree(Math::AngleUnitsToDegrees(mAngle));
- }
- inline Radian operator * ( float a, const Radian& b )
- {
- return Radian ( a * b.valueRadians() );
- }
- inline Radian operator / ( float a, const Radian& b )
- {
- return Radian ( a / b.valueRadians() );
- }
- inline Degree operator * ( float a, const Degree& b )
- {
- return Degree ( a * b.valueDegrees() );
- }
- inline Degree operator / ( float a, const Degree& b )
- {
- return Degree ( a / b.valueDegrees() );
- }
- /** @} */
- /** @} */
- }
- #endif
|