hkFpuMathFuncs.inl
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #include <Common/Base/Fwd/hkcmath.h>
  9. #include <Common/Base/Fwd/hkcfloat.h>
  10. extern "C"
  11. {
  12. hkReal HK_CALL hkMath_atan2fApproximation( hkReal x, hkReal y );
  13. }
  14. #define HK_INT32_MIN (-2147483647 - 1) // Minimum (signed) int 32-bit value
  15. #define HK_INT32_MAX 2147483647 // Maximum (signed) int 32-bit value
  16. #define HK_REAL_PI 3.14159265358979f
  17. #define HK_REAL_DEG_TO_RAD (3.14159265358979f / 180.0f)
  18. #define HK_REAL_EPSILON FLT_EPSILON // smallest such that 1.0+FLT_EPSILON != 1.0
  19. #define HK_REAL_MIN FLT_MIN // min positive value
  20. #define HK_REAL_MAX 3.40282e+38f // max value - not actually FLT_MAX since on some systems
  21. // FLT_MAX is indistinguishable from NaN or Inf which we reserve
  22. // for error checking.
  23. #if defined(HK_PLATFORM_PS3_PPU) || defined(HK_PLATFORM_PS3_SPU) ||  defined(HK_PLATFORM_RVL) || defined(HK_PLATFORM_GC)
  24. #define HK_STD_NAMESPACE std
  25. #else
  26. #define HK_STD_NAMESPACE /*nothing*/
  27. #endif
  28. namespace hkMath
  29. {
  30. //
  31. // Some implementations may be overridden on a given platform.
  32. //
  33. #ifndef HK_MATH_sqrt
  34. inline hkReal HK_CALL sqrt(hkReal r) { return HK_STD_NAMESPACE::sqrtf(r); }
  35. #endif
  36. #ifndef HK_MATH_sqrtInverse
  37. inline hkReal HK_CALL sqrtInverse(hkReal r) { return 1.0f / hkMath::sqrt(r); }
  38. #endif
  39. #ifndef HK_MATH_fabs
  40. inline hkReal HK_CALL fabs(hkReal r) { return HK_STD_NAMESPACE::fabsf(r); }
  41. #endif
  42. #ifndef  HK_MATH_pow 
  43. inline hkReal HK_CALL pow( hkReal r, hkReal s ) { return HK_STD_NAMESPACE::powf( r, s ); }
  44. #endif
  45. #ifndef HK_MATH_ceil
  46. inline hkReal HK_CALL ceil( hkReal r ) { return HK_STD_NAMESPACE::ceilf( r ); }
  47. #endif
  48. #ifndef HK_MATH_sin
  49. inline hkReal HK_CALL sin (hkReal r) { return HK_STD_NAMESPACE::sinf(r); }
  50. #endif
  51. #ifndef HK_MATH_cos
  52. inline hkReal HK_CALL cos (hkReal r) { return HK_STD_NAMESPACE::cosf(r); }
  53. #endif
  54. #ifndef HK_MATH_acos
  55. inline hkReal HK_CALL acos(hkReal r)
  56. {
  57. // be generous about numbers slightly outside range
  58. HK_ASSERT(0x41278654,  hkMath::fabs(r) < 1.001f );
  59. if( hkMath::fabs(r) >= 1.0f )
  60. {
  61. r = ( r>0 ) ? 0 : HK_REAL_PI;
  62. return r;
  63. }
  64. return HK_STD_NAMESPACE::acosf(r);
  65. }
  66. #endif
  67. #ifndef HK_MATH_asin
  68. inline hkReal HK_CALL asin(hkReal r)
  69. {
  70. // be generous about numbers outside range
  71. HK_ASSERT(0x286a6f5f,  hkMath::fabs(r) < 1.001f );
  72. if( hkMath::fabs(r) >= 1.0f )
  73. {
  74. r = ( r>0 ) ? 0.5f * HK_REAL_PI : -0.5f * HK_REAL_PI;
  75. return r;
  76. }
  77. return HK_STD_NAMESPACE::asinf(r);
  78. }
  79. #endif
  80. #ifndef HK_MATH_floor
  81. inline hkReal HK_CALL floor(hkReal r) { return HK_STD_NAMESPACE::floorf(r); }
  82. #endif
  83. #ifndef HK_MATH_prefetch128
  84. // prefetch at least 128 bytes
  85. inline void prefetch128( const void* ) { }
  86. #endif
  87. #ifndef HK_MATH_forcePrefetch
  88. template<int SIZE>
  89. inline void forcePrefetch( const void* p )
  90. {
  91. // volatile register int a = (int*)p;
  92. }
  93. #endif
  94. #ifndef HK_MATH_hkFloor
  95. hkReal HK_CALL hkFloor(hkReal r);
  96. #endif
  97. #ifndef HK_MATH_hkFloatToInt
  98. int HK_CALL hkFloatToInt(hkReal r);
  99. #endif
  100. #ifndef HK_MATH_hkFloorToInt
  101. int HK_CALL hkFloorToInt(hkReal r);
  102. #endif
  103. #ifndef HK_MATH_hkToIntFast
  104. // Fast rounding, however last bit might be wrong.
  105. inline int HK_CALL hkToIntFast( hkReal r )
  106. {
  107. int i; // use even when simd disabled on ia32
  108. _asm {
  109. fld r
  110. fistp i
  111. }
  112. return i;
  113. }
  114. #endif
  115. inline int HK_CALL isNegative(hkReal r0)
  116. {
  117. return (r0<0)? hkVector4Comparison::MASK_X : 0;
  118. }
  119. inline hkBool HK_CALL equal(hkReal x, hkReal y, hkReal tolerance2=1e-5f)
  120. {
  121. return hkMath::fabs(x-y) < tolerance2;
  122. }
  123. #ifndef HK_MATH_max2
  124. template <typename T>
  125. inline T HK_CALL max2( T x, T y)
  126. {
  127. return x > y ? x : y;
  128. }
  129. #endif
  130. #ifndef HK_MATH_min2
  131. template <typename T>
  132. inline T HK_CALL min2( T x, T y)
  133. {
  134. return x < y ? x : y;
  135. }
  136. #endif
  137. template <typename T>
  138. inline T HK_CALL clamp( T x, T mi, T ma)
  139. {
  140. if ( x < mi ) return mi;
  141. if ( x > ma ) return ma;
  142. return x;
  143. }
  144. inline hkBool HK_CALL isFinite(hkReal r)
  145. {
  146. // Check the 8 exponent bits.
  147. // Usually NAN == (exponent = all 1, mantissa = non-zero)
  148. //         INF == (exponent = all 1, mantissa = zero)
  149. // This simply checks the exponent
  150. HK_ASSERT(0x2d910c70, sizeof(hkReal) == sizeof(int));
  151. union {
  152. hkReal f;
  153. unsigned int i;
  154. } val;
  155. val.f = r;
  156. return ((val.i & 0x7f800000) != 0x7f800000);
  157. }
  158. inline bool isPower2(unsigned int v)
  159. {
  160. return (v & (v - 1)) == 0;
  161. }
  162. hkReal HK_CALL rand01();
  163. inline hkReal HK_CALL atan2fApproximation( hkReal sina, hkReal cosa )
  164. {
  165. return hkMath_atan2fApproximation(sina, cosa);
  166. }
  167. inline hkReal HK_CALL randRange(hkReal minv, hkReal maxv)
  168. {
  169. return minv + rand01() * (maxv-minv);
  170. }
  171. #ifndef HK_MATH_fselectGreaterEqualZero
  172. inline hkReal fselectGreaterEqualZero( hkReal testVar, hkReal ifTrue, hkReal ifFalse)
  173. {
  174. return (testVar >= 0.0f) ? ifTrue : ifFalse;
  175. }
  176. #endif
  177. #ifndef HK_MATH_fselectGreaterZero
  178. inline hkReal fselectGreaterZero( hkReal testVar, hkReal ifTrue, hkReal ifFalse)
  179. {
  180. return (testVar > 0.0f) ? ifTrue : ifFalse;
  181. }
  182. #endif
  183. #ifndef HK_MATH_fselectEqualZero
  184. inline hkReal fselectEqualZero( hkReal testVar, hkReal ifTrue, hkReal ifFalse)
  185. {
  186. return (testVar == 0.0f) ? ifTrue : ifFalse;
  187. }
  188. #endif
  189. #ifndef HK_MATH_intInRange
  190. /// Returns any nonzero value if lowInclusive<=value and value<highExclusive.
  191. inline int intInRange( int value, int lowInclusive, int highExclusive )
  192. {
  193. return (lowInclusive <= value) & (value < highExclusive);
  194. }
  195. #endif
  196. #ifndef HK_MATH_interpolate2d
  197. /// Interpolates between y0 and y1 using x0,x1 interval as the basis
  198. inline hkReal interpolate2d( hkReal x, hkReal x0, hkReal x1, hkReal y0, hkReal y1 )
  199. {
  200. //HK_ASSERT2(0x2342ab9,(x<=x0)||(x>=x1),"x is not from interval <x0,x1>!");
  201. HK_ASSERT2(0x2342ab9,(x0 != x1), "no proper interval defined!");
  202. return y0 + (x-x0)*(y1-y0)/(x1-x0);
  203. }
  204. #endif
  205. }
  206. /*
  207. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  208. * Confidential Information of Havok.  (C) Copyright 1999-2009
  209. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  210. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  211. * rights, and intellectual property rights in the Havok software remain in
  212. * Havok and/or its suppliers.
  213. * Use of this software for evaluation purposes is subject to and indicates
  214. * acceptance of the End User licence Agreement for this product. A copy of
  215. * the license is included with this software and is also available at www.havok.com/tryhavok.
  216. */