hkaSplineCompressedAnimation.inl
上传用户: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. /// Copies dynamic and static values into their respective components, based on a mask
  9. /// param mask Mask describing the dynamic and static components of the data
  10. /// param S Static values
  11. /// param I Identity values
  12. /// param inOut Output with static/identity values overwritten
  13. void hkaSplineCompressedAnimation::recompose( hkUint8 mask, const hkVector4& S, const hkVector4& I, hkVector4& inOut )
  14. {
  15. #if defined( HK_PLATFORM_XBOX360 ) || defined( HK_PLATFORM_PS3_PPU )
  16. // This mask reverses bits
  17. static const int reverse[16] = { 0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE, 0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF };
  18. hkVector4Comparison stat; stat.set( static_cast< hkVector4Comparison::Mask >( reverse[ mask & 0x0F ] ) );
  19. hkVector4Comparison iden; iden.set( static_cast< hkVector4Comparison::Mask >( reverse[ ~mask & ( ~mask >> 4 ) & 0x0F ] ) );
  20. inOut.select32( inOut, S, stat );
  21. inOut.select32( inOut, I, iden );
  22. #else
  23. int stat = mask & 0x0F;
  24. int iden = ~mask & ( ~mask >> 4 ) & 0x0F;
  25. int shift = 0x01;
  26. for ( int i = 0; i < 4; i++ )
  27. {
  28. if ( stat & shift )
  29. {
  30. inOut( i ) = S( i );
  31. }
  32. else if ( iden & shift )
  33. {
  34. inOut( i ) = I( i );
  35. }
  36. shift <<= 1;
  37. }
  38. #endif
  39. }
  40. /// Reads 8 bits from an internal buffer
  41. /// param dataInOut Buffer which is incremented
  42. hkUint8 hkaSplineCompressedAnimation::read8( const hkUint8*& dataInOut )
  43. {
  44. return *dataInOut++;
  45. }
  46. /// Reads 16 bits from an internal buffer
  47. /// param dataInOut Buffer which is incremented
  48. hkUint16 hkaSplineCompressedAnimation::read16( const hkUint8*& dataInOut )
  49. {
  50. return *reinterpret_cast< const hkUint16*&  >( dataInOut )++;
  51. }
  52. /// Reads a real value from an internal buffer
  53. /// param dataInOut Buffer which is incremented
  54. hkReal hkaSplineCompressedAnimation::readReal( const hkUint8*& dataInOut )
  55. {
  56. return *reinterpret_cast< const hkReal*&  >( dataInOut )++;
  57. }
  58. /// Update a pointer to be aligned
  59. /// param align Number of bytes to align (must be a multiple of 2)
  60. void hkaSplineCompressedAnimation::readAlign( int align, const hkUint8*& dataInOut )
  61. {
  62. dataInOut = reinterpret_cast< const hkUint8 * > ( HK_NEXT_MULTIPLE_OF( align, reinterpret_cast< hk_size_t >( dataInOut ) ) );
  63. }
  64. /// Align a point for quaternions (varies based on the number of bytes per quaternion)
  65. /// param type The type of quaternion compression to use
  66. /// param dataInOut Pointer to byte buffer (updated)
  67. void hkaSplineCompressedAnimation::readAlignQuaternion( TrackCompressionParams::RotationQuantization type, const hkUint8*& dataInOut )
  68. {
  69. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( type ), "Spline data corrupt." );
  70. // Bit mask for byte alignment
  71. // Each type has it's own unique byte alignment
  72. static const int align[6] = { 4, 1, 2, 1, 2, 4 };
  73. readAlign( align[ type ], dataInOut );
  74. }
  75. /// return The number of bytes required for the current quaternion packing scheme
  76. /// param type The type of quaternion compression to use
  77. int hkaSplineCompressedAnimation::bytesPerQuaternion( TrackCompressionParams::RotationQuantization type )
  78. {
  79. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( type ), "Spline data corrupt." );
  80. static const int size[6] = { 4, 5, 6, 3, 2, 16 };
  81. return size[ type ];
  82. }
  83. /// return The number of bytes required per component for the current packing scheme
  84. /// param type The type of quaternion compression to use
  85. int hkaSplineCompressedAnimation::bytesPerComponent( TrackCompressionParams::ScalarQuantization type )
  86. {
  87. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( type ), "Spline data corrupt." );
  88. static const int size[2] = { 1, 2 };
  89. return size[ type ];
  90. }
  91. /// return A packed floating point value expanded
  92. /// param minp Minimum expected value
  93. /// param maxp Maximum expected value
  94. /// param Packed value to expand
  95. hkReal hkaSplineCompressedAnimation::unpack16( hkReal minp, hkReal maxp, hkUint16 val )
  96. {
  97. const hkReal span = 65535.0f;
  98. return ( static_cast< hkReal >( val ) / span ) * ( maxp - minp ) + minp;
  99. }
  100. /// Unpack the representation of the given quantization types
  101. /// param translation The type of translation quantization given
  102. /// param rotation The type of rotation quantization given
  103. /// param scale The type of scale quantization given
  104. void hkaSplineCompressedAnimation::unpackQuantizationTypes( hkUint8 packedQuatizationTypes, TrackCompressionParams::ScalarQuantization& translation, TrackCompressionParams::RotationQuantization& rotation, TrackCompressionParams::ScalarQuantization& scale )
  105. {
  106. translation = static_cast< TrackCompressionParams::ScalarQuantization >( ( packedQuatizationTypes >> 0 ) & 0x03 );
  107. rotation = static_cast< TrackCompressionParams::RotationQuantization >( ( packedQuatizationTypes >> 2 ) & 0x0F );
  108. scale = static_cast< TrackCompressionParams::ScalarQuantization >( ( packedQuatizationTypes >> 6 ) & 0x03 );
  109. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( translation ), "Spline data corrupt." );
  110. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( rotation ), "Spline data corrupt." );
  111. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( scale ), "Spline data corrupt." );
  112. }
  113. void hkaSplineCompressedAnimation::unpackMaskAndQuantizationType( hkUint8 packedMaskAndQuatizationType, hkUint8& mask, TrackCompressionParams::ScalarQuantization& floatQuantization )
  114. {
  115. // Read in the floatQuantization from the 1st (not 0th) bit
  116. floatQuantization = static_cast< TrackCompressionParams::ScalarQuantization >( ( packedMaskAndQuatizationType >> 1 ) & 0x03 );
  117. mask = packedMaskAndQuatizationType & ~0x06;
  118. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( floatQuantization ), "Spline data corrupt." );
  119. HK_ASSERT2( 0x3aa3eb74,  ( mask & 0x06 ) == 0, "Spline data corrupt." );
  120. }
  121. /// return A packed floating point value expanded
  122. /// param minp Minimum expected value
  123. /// param maxp Maximum expected value
  124. /// param Packed value to expand
  125. hkReal hkaSplineCompressedAnimation::unpack8( hkReal minp, hkReal maxp, hkUint8 val )
  126. {
  127. const hkReal span = 255.0f;
  128. return ( static_cast< hkReal >( val ) / span ) * ( maxp - minp ) + minp;
  129. }
  130. /// Expands a quantized quaternion
  131. /// param type The type of quaternion compression to use
  132. /// param in Input buffer to read from
  133. /// param out Quaternion to store the result
  134. void hkaSplineCompressedAnimation::unpackQuaternion( TrackCompressionParams::RotationQuantization type, const hkUint8* in, hkQuaternion* out )
  135. {
  136. static void ( HK_CALL * unpackfunc[6] )( const hkUint8* in, hkQuaternion* out ) = { unpackSignedQuaternion32, unpackSignedQuaternion40, unpackSignedQuaternion48, unpackSignedQuaternion24, unpackSignedQuaternion16, unpackSignedQuaternion128 };
  137. HK_ASSERT2( 0x3aa3eb74, TrackCompressionParams::validQuantization( type ), "Spline data corrupt." );
  138. (* unpackfunc[ type ] )( in, out );
  139. }
  140. /// Evaluate the spline at a given time.  Chooses from several optimized function implementations
  141. /// param u Time to evaluate at
  142. /// param p Degree of the curve
  143. /// param U Array of knot values for the given time
  144. /// param P Array of control point values for the given time
  145. /// param out Output value
  146. void hkaSplineCompressedAnimation::evaluate( hkReal u, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4& out )
  147. {
  148. static void (* evaluateFunction[4] )( hkReal u, int p, hkReal U[ MAX_DEGREE * 2 ], hkVector4 P[ MAX_ORDER ], hkVector4& out ) =
  149. #if (HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED) && !defined(HK_PLATFORM_SIM)
  150. { HK_NULL, evaluateLinear, evaluateSIMD, evaluateSIMD }
  151. #else
  152. { HK_NULL, evaluateLinear, evaluateSimple, evaluateSimple }
  153. #endif
  154. ;
  155. HK_ASSERT2( 0x3aa3eb74,  p >= 1 && p <= 3, "Spline data corrupt." );
  156. return evaluateFunction[ p ]( u, p, U, P, out );
  157. }
  158. /// Algorithm A2.1 The NURBS Book p68 - Determine the knot span index
  159. /// return The index i such that U[i] <= u < U[i+1]
  160. /// param n Max control point index
  161. /// param p Degree
  162. /// param u Knot value to find span for as byte
  163. /// param U Array of knots as bytes
  164. int hkaSplineCompressedAnimation::findSpan( int n, int p, hkUint8 u, const hkUint8* U )
  165. {
  166. // Bounds protect
  167. // Splines can extrapolate, so times (slightly) outside the range are OK.
  168. if ( u >= U[ n+1 ] ) return n;
  169. if ( u <= U[0] ) return p;
  170. // Search
  171. int low = p;
  172. int high = n + 1;
  173. int mid = ( low + high ) / 2;
  174. while ( u < U[mid] || u >= U[mid+1] )
  175. {
  176. if ( u < U[mid] ) high = mid;
  177. else low = mid;
  178. mid = ( low + high ) / 2;
  179. }
  180. return mid;
  181. }
  182. /// Find the local time within a block and computes the data pointer
  183. /// param time Time to query the animation
  184. /// param blockOut Which block the local time lies within
  185. /// param blockTimeOut Local time within the block
  186. /// param quantizedTimeOut Time expressed as integer within the block
  187. void hkaSplineCompressedAnimation::getBlockAndTime( hkReal time, int& blockOut, hkReal& blockTimeOut, hkUint8& quantizedTimeOut ) const
  188. {
  189. // Clamp the time requested
  190. time = hkMath::max2( 0.0f, time );
  191. time = hkMath::min2( m_duration, time );
  192. // Find the appropriate block
  193. blockOut = static_cast< int >( time * m_blockInverseDuration );
  194. // Clamp the block
  195. blockOut = hkMath::max2( blockOut, 0 );
  196. blockOut = hkMath::min2( blockOut, m_numBlocks-1 );
  197. // Find the local time within the block
  198. blockTimeOut = time - static_cast< hkReal >( blockOut ) * m_blockDuration;
  199. // Find the truncated time
  200. quantizedTimeOut = static_cast< hkUint8 >( ( blockTimeOut * m_blockInverseDuration ) * ( m_maxFramesPerBlock - 1 ) );
  201. }
  202. /*
  203. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  204. * Confidential Information of Havok.  (C) Copyright 1999-2009
  205. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  206. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  207. * rights, and intellectual property rights in the Havok software remain in
  208. * Havok and/or its suppliers.
  209. * Use of this software for evaluation purposes is subject to and indicates
  210. * acceptance of the End User licence Agreement for this product. A copy of
  211. * the license is included with this software and is also available at www.havok.com/tryhavok.
  212. */