Permalink
Browse files

Updated DMath

  • Loading branch information...
dpasca committed May 22, 2014
1 parent 2e44768 commit fd917920069ab73d6fa4091cb32b9e3ca6a81494
@@ -33,6 +33,7 @@ class VecN
void Set( const _TS *p_ ) { FOR_I_N v[i] = p_[i]; }
void SetZero() { FOR_I_N v[i] = 0; }
+ bool IsZero() const { FOR_I_N if (v[i]) return false; return true; }
_TS AddReduce() const { _TS acc=_TS(0); FOR_I_N acc += v[i]; return acc; }
@@ -147,28 +147,6 @@
#define DEG2RAD(_X_) ((_X_) * (3.14159265f/180))
-//==================================================================
-template < typename _TA , typename _TB >
-inline _TA DMix( const _TA &a, const _TA &b, const _TB &t )
-{
- return (_TA)(a + (b - a) * t);
-}
-template < typename _TA , typename _TB >
-inline _TA DLerp( const _TA &a, const _TA &b, const _TB &t )
-{
- return (_TA)(a + (b - a) * t);
-}
-
-//===============================================================
-template <class T>
-inline float DInvLerp( const T& left, const T& right, const T& x )
-{
- if ( x < left ) return 0.f; else
- if ( x > right ) return 1.f;
-
- return (float)(x - left) / (float)(right - left);
-}
-
//==================================================================
template <class T> inline T DCos( const T &a ) { assert( 0 ); return T(); }
template <> inline float DCos<float>( const float &a ) { return cosf( a ); }
@@ -199,42 +177,91 @@ template <class T> inline T DPow( const T &a, const T &b ) { assert( 0 );
template <> inline float DPow<float>( const float &a, const float &b ) { return powf( a, b ); }
template <> inline double DPow<double>( const double &a, const double &b ){ return pow( a, b ); }
+//==================================================================
+template <class T> inline T DFloor( const T &a ) { assert( 0 ); return T(); }
+template <class T> inline T DCeil( const T &a ) { assert( 0 ); return T(); }
+
+#if defined(__GNUC__)
+template <> inline float DFloor<float>( const float &a ) { return __builtin_floorf( a );}
+template <> inline double DFloor<double>( const double &a ){ return __builtin_floor( a ); }
+template <> inline float DCeil<float>( const float &a ) { return __builtin_ceilf( a ); }
+template <> inline double DCeil<double>( const double &a ) { return __builtin_ceil( a ); }
+#else
+template <> inline float DFloor<float>( const float &a ) { return floorf( a ); }
+template <> inline double DFloor<double>( const double &a ){ return floor( a ); }
+template <> inline float DCeil<float>( const float &a ) { return ceilf( a ); }
+template <> inline double DCeil<double>( const double &a ) { return ceil( a ); }
+#endif
+
//==================================================================
template <class T> inline T DSign( const T &a )
{
if ( a < 0 ) return T( -1 ); else
if ( a > 0 ) return T( 1 ); else
return T( 0 );
}
-
//==================================================================
template <class T> inline T DAbs( const T &a )
{
if ( a < T(0) ) return -a; else
return a;
}
-
//==================================================================
template <class T> inline T DMin( const T &a, const T &b )
{
if ( a < b ) return a; else
return b;
}
-
+//==================================================================
+template <class T> inline T DMin3( const T &a, const T &b, const T &c )
+{
+ if ( a < b ) return a < c ? a : c; else
+ return b < c ? b : c;
+}
//==================================================================
template <class T> inline T DMax( const T &a, const T &b )
{
if ( a > b ) return a; else
return b;
}
-
+//==================================================================
+template <class T> inline T DMax3( const T &a, const T &b, const T &c )
+{
+ if ( a > b ) return a > c ? a : c; else
+ return b > c ? b : c;
+}
//==================================================================
template <class T> inline T DClamp( const T& a, const T& x0, const T& x1 )
{
if ( a < x0 ) return x0; else
if ( a > x1 ) return x1; else
return a;
}
+//==================================================================
+template < typename _TA , typename _TB >
+inline _TA DMix( const _TA &a, const _TA &b, const _TB &t )
+{
+ return (_TA)(a + (b - a) * t);
+}
+template < typename _TA , typename _TB >
+inline _TA DLerp( const _TA &a, const _TA &b, const _TB &t )
+{
+ return (_TA)(a + (b - a) * t);
+}
+template <typename _TA, typename _TB>
+inline _TA DInvLerp( const _TA &left, const _TA &right, const _TB &x )
+{
+ if ( x < left ) return _TA(0); else
+ if ( x > right ) return _TA(1);
+
+ return DClamp( (x - left) / (right - left), _TA(0), _TA(1) );
+}
+template <typename _TA , typename _TB>
+inline _TA DSmoothStep( const _TA &a, const _TA &b, const _TB &t )
+{
+ auto x = DInvLerp( a, b, t );
+ return x*x*(_TA(3) - _TA(2)*x);
+}
#define FM_E ((float)M_E )
#define FM_LOG2E ((float)M_LOG2E )
Oops, something went wrong.

0 comments on commit fd91792

Please sign in to comment.