Simplified include/osg/Math to use Standard C++ maths headers - <cmath> and <cfloat>

This commit is contained in:
Robert Osfield
2013-02-06 12:02:05 +00:00
parent 0b3da415ef
commit 19bfa92c91

View File

@@ -14,109 +14,11 @@
#ifndef __OSG_MATH
#define __OSG_MATH
#include <math.h>
#include <cmath>
#include <cfloat>
#include <osg/Export>
//certain math functions were not defined until 10.2
//so this code checks the version so it can add in workarounds for older versions.
#ifdef __APPLE__
// Using std::isnan will work for OS X, but use of <cmath>
// and std:: are not necessarily portible with other systems so
// the include of <cmath> is isolated here.
#include <cmath>
#include <AvailabilityMacros.h>
#if !defined(MAC_OS_X_VERSION_10_2) || (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_2)
// One extra check to verify the gcc version.
// The assumption is that there is no possible way to use gcc 4+
// on anything less than 10.3.9. So if gcc 4 is in use, this means
// pre-10.2 support is not intended and we need not define APPLE_PRE_10_2.
// The reason for this extra check is that if the user relies on default
// settings, MAC_OS_X_VERSION_MIN_REQUIRED will be set to 1010 and hit
// this code path, but this is probably not what they want if using gcc 4+.
#if (__GNUC__ < 4)
#define APPLE_PRE_10_2
#endif
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6)
#define APPLE_PRE_10_6
#endif
#endif
#endif
#if defined(_MSC_VER)
#include <float.h>
#endif
#if defined (sun) || \
defined (APPLE_PRE_10_6) || \
(defined (_AIX) && defined (__GNUC__))
#include <float.h>
#ifndef acosf
inline float acosf(float value) { return static_cast<float>(acos(value)); }
#endif
#ifndef asinf
inline float asinf(float value) { return static_cast<float>(asin(value)); }
#endif
#ifndef cosf
inline float cosf(float value) { return static_cast<float>(cos(value)); }
#endif
#ifndef sinf
inline float sinf(float value) { return static_cast<float>(sin(value)); }
#endif
#ifndef logf
inline float logf(float value) { return static_cast<float>(log(value)); }
#endif
#ifndef powf
inline float powf(float value1,float value2) { return static_cast<float>(pow(value1,value2)); }
#endif
#ifndef sqrtf
inline float sqrtf(float value) { return static_cast<float>(sqrt(value)); }
#endif
#ifndef fabsf
inline float fabsf(float value) { return static_cast<float>(fabs(value)); }
#endif
#ifndef atan2f
inline float atan2f(float value1, float value2) { return static_cast<float>(atan2(value1,value2)); }
#endif
#ifndef fmodf
inline float fmodf(float value1, float value2) { return static_cast<float>(fmod(value1,value2)); }
#endif
#ifndef tanf
inline float tanf(float value) { return static_cast<float>(tan(value)); }
#endif
#endif
#if defined (sun) || \
defined (__hpux) || \
defined (APPLE_PRE_10_2) || \
(defined (_AIX) && defined (__GNUC__))
#ifndef floorf
inline float floorf(float value) { return static_cast<float>(floor(value)); }
#endif
#ifndef ceilf
inline float ceilf(float value) { return static_cast<float>(ceil(value)); }
#endif
#endif
namespace osg {
// define the standard trig values
@@ -168,8 +70,7 @@ template<typename T>
inline T maximum(T lhs,T rhs) { return lhs>rhs?lhs:rhs; }
template<typename T>
inline T clampTo(T v,T minimum,T maximum)
{ return v<minimum?minimum:v>maximum?maximum:v; }
inline T clampTo(T v,T minimum,T maximum) { return v<minimum?minimum:v>maximum?maximum:v; }
template<typename T>
inline T clampAbove(T v,T minimum) { return v<minimum?minimum:v; }
@@ -208,23 +109,11 @@ inline double RadiansToDegrees(double angle) { return angle*180.0/PI; }
inline float round(float v) { return v>=0.0f?floorf(v+0.5f):ceilf(v-0.5f); }
inline double round(double v) { return v>=0.0?floor(v+0.5):ceil(v-0.5); }
#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__MWERKS__)
inline bool isNaN(float v) { return _isnan(v)!=0; }
#if defined(_MSC_VER)
inline bool isNaN(double v) { return _isnan(v)!=0; }
#else
#if defined(__APPLE__)
inline bool isNaN(float v) { return std::isnan(v); }
inline bool isNaN(double v) { return std::isnan(v); }
#else
#ifdef isnan
inline bool isNaN(float v) { return isnan(v); }
inline bool isNaN(double v) { return isnan(v); }
#else
// Need to use to std::isnan to avoid undef problem from <cmath>
inline bool isNaN(float v) { return std::isnan(v); }
inline bool isNaN(double v) { return std::isnan(v); }
#endif
#endif
inline bool isNaN(float v) { return std::isnan(v); }
inline bool isNaN(double v) { return std::isnan(v); }
#endif