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

其他游戏

开发平台:

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. #ifndef HK_MATH_VECTOR3_UTIL_H
  9. #define HK_MATH_VECTOR3_UTIL_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/Types/Geometry/Aabb/hkAabb.h>
  12. union hkIntUnion64
  13. {
  14. hkQuadReal quad;
  15. hkInt64 i64;
  16. hkUint64 u64;
  17. hkInt32 i32[2];
  18. hkUint32 u32[2];
  19. hkInt16 i16[4];
  20. hkUint16 u16[4];
  21. hkInt8 i8[8];
  22. hkUint8 u8[8];
  23. };
  24. namespace hkVector4Util
  25. {
  26. /// Sets the calling vector to be the normal to the 2 vectors (b-a) and (c-a).<br>
  27. /// NOTE: The calculated result is not explicitly normalized.
  28. /// This function is particularly fast on PlayStation(R)2.
  29. /// Result = (b-a) cross (c-a)
  30. HK_FORCE_INLINE void HK_CALL setNormalOfTriangle(hkVector4& result, const hkVector4 &a, const hkVector4& b,const hkVector4& c);
  31. /// Multiplies sign bits from signsSource onto inout leaving the mantissa and exponent untouched.
  32. HK_FORCE_INLINE void HK_CALL mulSigns4( hkVector4& inout, const hkVector4& signsSource);
  33. /// 
  34. HK_FORCE_INLINE void HK_CALL convertToUint16( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, hkIntUnion64& out );
  35. /// 
  36. HK_FORCE_INLINE void HK_CALL convertToUint16WithClip( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, const hkVector4& min, const hkVector4& max, hkIntUnion64& out);
  37. /// calculates a value x so that convertToUint16WithClip( out, in + x/scale, ... ) == out = int(floor( (in+offset)*scale
  38. hkReal HK_CALL getFloatToInt16FloorCorrection();
  39. /// 
  40. HK_FORCE_INLINE void HK_CALL convertToUint32( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, hkUint32* out );
  41. ///
  42. HK_FORCE_INLINE void HK_CALL convertToUint32WithClip( const hkVector4& in, const hkVector4& offset, const hkVector4& scale, const hkVector4& min, const hkVector4& max, hkUint32* out);
  43. /// calculates a value x so that convertToUint32WithClip( out, in + x/scale, ... ) == out = int(floor( (in+offset)*scale
  44. hkReal HK_CALL getFloatToInt32FloorCorrection();
  45. /// Converts a floating-point AABB to an integer AABB
  46. HK_FORCE_INLINE void HK_CALL convertAabbToUint32( const hkAabb& aabb, const hkVector4& offsetLow, const hkVector4& offsetHigh, const hkVector4& scale, hkAabbUint32& aabbOut );
  47. /// Converts an integer AABB to a floating-point AABB
  48. HK_FORCE_INLINE void HK_CALL convertAabbFromUint32( const hkAabbUint32& aabbIn, const hkVector4& offsetLow, const hkVector4& scale, hkAabb& aabbOut);
  49. /// Store the difference between a big expandedAabbInt and a smaller, enclosed unexpandedAabbInt_InOut in m_expansionXXX components of unexpandedAabbInt_InOut.
  50. HK_FORCE_INLINE void HK_CALL compressExpandedAabbUint32(const hkAabbUint32& expandedAabbInt, hkAabbUint32& unexpandedAabbInt_InOut);
  51. /// Expand a compressed unexpandedAabbInt to an expandedAabbOut using the information stored in the m_expansionXXX components.
  52. HK_FORCE_INLINE void HK_CALL uncompressExpandedAabbUint32(const hkAabbUint32& unexpandedAabbInt, hkAabbUint32& expandedAabbOut);
  53. /// Finds a vector that is perpendicular to a line segment.
  54. ///
  55. /// Achieved by constructing a vector from the segment vector with the following properties:
  56. /// (Segment vector is any vector parallel to the line segment.)
  57. /// 1) component with the smallest index is set to 0
  58. /// 2) the remaining two component are copied into the new vector but are swapped in position
  59. /// 3) one of the copied components is multiplied by -1.0 (has it's sign flipped!)
  60. ///
  61. /// leaving: (for example)
  62. /// segmentVector = (x, y, z), with let's say y as the smallest component
  63. /// segmentNormal = (-z, 0 , x) or (z, 0, -x), either will do.
  64. ///
  65. /// This will in fact be orthogonal as (in the example) the dot product will be zero.
  66. /// i.e. x*-z + y*0 + z*x = 0 
  67. ///
  68. HK_FORCE_INLINE void HK_CALL calculatePerpendicularVector(const hkVector4& vectorIn, hkVector4& biVectorOut);
  69. /// Transforms an array of points.
  70. HK_FORCE_INLINE void HK_CALL transformPoints( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut );
  71. /// Transforms an array of points including the .w component
  72. HK_FORCE_INLINE void HK_CALL mul4xyz1Points( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut );
  73. /// Transforms an array of spheres (keeps the .w component as the radius)
  74. HK_FORCE_INLINE void HK_CALL transformSpheres( const hkTransform& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut );
  75. /// Transforms an array of plane equations
  76. HK_FORCE_INLINE void HK_CALL transformPlaneEquations( const hkTransform& t, const hkVector4* planesIn, int numPlanes, hkVector4* planesOuts );
  77. /// Rotate an array of points.
  78. HK_FORCE_INLINE void HK_CALL rotatePoints( const hkMatrix3& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut );
  79. /// Invert rotate an array of points.
  80. HK_FORCE_INLINE void HK_CALL rotateInversePoints( const hkRotation& t, const hkVector4* vectorsIn, int numVectors, hkVector4* vectorsOut );
  81. /// set aTcOut = aTb * bTc
  82. HK_FORCE_INLINE void HK_CALL setMul( const hkMatrix3& aTb, const hkMatrix3& bTc, hkMatrix3& aTcOut );
  83. /// set aTcOut = bTa^1 * bTc
  84. HK_FORCE_INLINE void HK_CALL setInverseMul( const hkRotation& bTa, const hkMatrix3& bTc, hkMatrix3& aTcOut );
  85. /// set aTcOut = aTb * bTc
  86. HK_FORCE_INLINE void HK_CALL transpose( hkMatrix3& m );
  87. /// m += add
  88. HK_FORCE_INLINE void HK_CALL add( hkMatrix3& m, const hkMatrix3& add );
  89. /// Sets this vector components: this(0) = a0.dot3(b0), this(1) = a1.dot3(b1) ...
  90. HK_FORCE_INLINE void HK_CALL dot3_3vs3( const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, hkVector4& dotsOut);
  91. /// Sets this vector components: this(0) = a0.dot3(b0) ... this(3) = a3.dot3(b3) 
  92. HK_FORCE_INLINE void HK_CALL dot3_4vs4( const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, const hkVector4& a3, const hkVector4& b3, hkVector4& dotsOut);
  93. /// Sets this vector components: this(0) = a0.dot4(b0) ... this(3) = a3.dot4(b3) 
  94. HK_FORCE_INLINE void HK_CALL dot4_4vs4( const hkVector4& a0, const hkVector4& b0, const hkVector4& a1, const hkVector4& b1, const hkVector4& a2, const hkVector4& b2, const hkVector4& a3, const hkVector4& b3, hkVector4& dotsOut);
  95. /// Sets this vector components: this(i) = vector.dot3(ai) for i=0..3
  96. HK_FORCE_INLINE void HK_CALL dot3_1vs4( const hkVector4& vectorIn, const hkVector4& a0, const hkVector4& a1, const hkVector4& a2, const hkVector4& a3, hkVector4& dotsOut);
  97. /// Sets this vector components: this(i+j) = ai.dot3(bj)
  98. HK_FORCE_INLINE void HK_CALL dot3_2vs2( const hkVector4& a0, const hkVector4& a2, const hkVector4& b0, const hkVector4& b1, hkVector4& dotsOut);
  99. /// build an orthonormal matrix, where the first column matches the parameter dir.
  100. /// Note: Dir must be normalized
  101. HK_FORCE_INLINE void HK_CALL buildOrthonormal( const hkVector4& dir, hkMatrix3& out );
  102. /// build an orthonormal matrix, where the first column matches the parameter dir and the second
  103. /// column matches dir2 as close as possible
  104. /// Note: Dir must be normalized
  105. HK_FORCE_INLINE void HK_CALL buildOrthonormal( const hkVector4& dir, const hkVector4& dir2, hkMatrix3& out );
  106. /// out = in^-1, in must be symmetric and invertible
  107. HK_FORCE_INLINE void HK_CALL invertSymmetric( const hkMatrix3& in, hkReal eps, hkMatrix3& out );
  108. /// Resets the fpu after using MMX instructions on x86. No-op for other architectures.
  109. HK_FORCE_INLINE void HK_CALL exitMmx();
  110. /// Returns the squared distance from p to the line segment ab 
  111. HK_FORCE_INLINE hkSimdReal HK_CALL distToLineSquared( const hkVector4& a, const hkVector4& b, const hkVector4& p );
  112. /// check for free registers for computers with lot's of registers (e.g. PlayStation(R)2)
  113. HK_FORCE_INLINE void HK_CALL checkRegisters( hkUint32 registerMask );
  114. /// reserve registers for computers with lots of registers (e.g. PlayStation(R)2)
  115. HK_FORCE_INLINE void HK_CALL reserveRegisters( hkUint32 registerMask );
  116. /// release these registers
  117. HK_FORCE_INLINE void HK_CALL releaseRegisters( hkUint32 registerMask );
  118. //
  119. // compression
  120. //
  121. // packs a normalized quaternion into a single 4*8 bit integer. The error is roughly 0.01f per component
  122. hkUint32 HK_CALL packQuaternionIntoInt32( hkVector4Parameter qin);
  123. // unpack an 32 bit integer into quaternion. Note: The resulting quaternion is not normalized ( |q.length4()-1.0f| < 0.04f )
  124. HK_FORCE_INLINE void HK_CALL unPackInt32IntoQuaternion( hkUint32 ivalue, hkVector4& qout );
  125. HK_FORCE_INLINE void memClear16( void* dest, int numQuads);
  126. extern hkUint32 m_reservedRegisters;
  127. enum { AABB_UINT32_MAX_FVALUE = 0x7ffe0000 };
  128. extern hkQuadReal hkAabbUint32MaxVal;
  129. }
  130. // For internal use. Define this to check that register allocations
  131. // between functions do not clash. Disabled by default
  132. // because it does not work in a multithreaded environment.
  133. //# define HK_CHECK_REG_FOR_PS2
  134. HK_FORCE_INLINE void HK_CALL hkVector4Util::reserveRegisters( hkUint32 registerMask )
  135. {
  136. #ifdef HK_CHECK_REG_FOR_PS2
  137. HK_ASSERT2(0x23c4e825,  (registerMask & m_reservedRegisters) == 0, "Register clash");
  138. m_reservedRegisters |= registerMask;
  139. #endif
  140. }
  141. HK_FORCE_INLINE void HK_CALL hkVector4Util::checkRegisters( hkUint32 registerMask )
  142. {
  143. #ifdef HK_CHECK_REG_FOR_PS2
  144. HK_ASSERT2(0x2459dd7d,  (registerMask & m_reservedRegisters) == 0, "Register clash");
  145. #endif
  146. }
  147. HK_FORCE_INLINE void HK_CALL hkVector4Util::releaseRegisters( hkUint32 registerMask )
  148. {
  149. #ifdef HK_CHECK_REG_FOR_PS2
  150. m_reservedRegisters &= ~registerMask;
  151. #endif
  152. }
  153. #if HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED
  154. # if defined(HK_COMPILER_HAS_INTRINSICS_IA32)
  155. # include <Common/Base/Math/Vector/Sse/hkSseVector4Util.inl>
  156. # elif defined(HK_ARCH_PS2)
  157. # include <Common/Base/Math/Vector/Ps2/hkPs2Vector4Util.inl>
  158. # elif defined(HK_PLATFORM_PS3_SPU) || defined(HK_PLATFORM_PS3_PPU)
  159. # include <Common/Base/Math/Vector/Ps3/hkPs3Vector4Util.inl>
  160. # elif defined(HK_PLATFORM_XBOX360)
  161. # include <Common/Base/Math/Vector/Xbox360/hkXbox360Vector4Util.inl>
  162. # endif
  163. #else
  164. #endif // HK_CONFIG_SIMD
  165. #include <Common/Base/Math/Vector/hkVector4Util.inl>
  166. #endif // HK_MATH_VECTOR3_UTIL_H
  167. /*
  168. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  169. * Confidential Information of Havok.  (C) Copyright 1999-2009
  170. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  171. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  172. * rights, and intellectual property rights in the Havok software remain in
  173. * Havok and/or its suppliers.
  174. * Use of this software for evaluation purposes is subject to and indicates
  175. * acceptance of the End User licence Agreement for this product. A copy of
  176. * the license is included with this software and is also available at www.havok.com/tryhavok.
  177. */