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

其他游戏

开发平台:

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_COMPRESSION_H
  9. #define HK_COMPRESSION_H
  10. #include <Common/Base/hkBase.h>
  11. #include <Common/Base/hkBase.h>
  12. extern "C"
  13. {
  14. /*
  15.  * Block Encoding
  16.  */
  17. struct hkaBlockDesc {
  18. hkUint32 m_bitWidth; // The bit size of the original data
  19. hkUint32 m_runSymbol; // The most commonly occuring symbol - this should be in little endian format
  20. hkUint32 m_preserved; // The number of unencoded 4 byte chunks at the start of the stream
  21. };
  22. /// Calculate the number of bytes required to encode the given raw data using the description provided
  23. hkUint32 HK_CALL hkCalcBlockEncodedSize(const hkUint8* rawData, hkUint32 rawDataSizeBytes, hkaBlockDesc& desc);
  24. /// Encode the given raw data using the description provided
  25. void HK_CALL hkBlockEncode( const hkUint8* rawData, hkUint32 rawDataSizeBytes, hkaBlockDesc& desc, hkUint8* encodedData);
  26. /// Decode the given data using the description provided
  27. hkUint32 HK_CALL hkBlockDecode( const hkUint8* encodedData, hkaBlockDesc& desc, hkUint8* rawData, hkUint32 rawDataSizeBytes);
  28. /*
  29.  * Wavelet Compression
  30.  */
  31. /// This applies a wavelet transformation to a set of real numbers
  32. /// and produces a set of wavelet components in place. The components generally have a 
  33. /// much smaller range of values than the original data and can be represented
  34. /// with fewer bits than the original raw data signal.
  35. /// The number of raw data components (nValues) must be a power of 2.
  36. void HK_CALL hkWaveletTransform( hkReal* rawData, hkUint32 nValues );
  37. /// This applies the inverse wavelet transformation to a set of wavelet coefficients
  38. /// and reproduces the original raw signal in place. 
  39. /// The number of raw data components (nValues) must be a power of 2.
  40. void HK_CALL hkInverseWaveletTransform( hkReal* waveletData, hkUint32 nValues );
  41. /// This method iterates through the wavelet coefficients and clamps a proportion of them to 0
  42. /// This truncation allows both the quantizer and encoder to do a much better job.
  43. /// If useTruncation is false, we clamp values such that error is less than the tolerance ie tolerance is a thresholding value.
  44. /// If useTruncation is true, we clamp a proportion of values given by tolerance, ie. tolerance should be between 0 (lossless) and 1 (fully lossy).
  45. void HK_CALL hkZeroSmallWaveletCoefficients( hkReal* waveletData, hkUint32 nValues, hkReal tolerance, hkBool useTruncation);
  46. /*
  47.  * Delta Compression
  48.  */
  49. /// This applies a delta transformation to a set of real numbers
  50. /// and produces a set of delta coefficients in place. The components generally have a 
  51. /// much smaller range of values than the original data and can be represented
  52. /// with fewer bits than the original raw data signal.
  53. void HK_CALL hkDeltaTransform( hkReal* rawData, hkUint32 nValues );
  54. /// This applies the inverse delta transformation to a set of delta coefficients
  55. /// and reproduces the original raw signal in place. 
  56. void HK_CALL hkInverseDeltaTransform( hkReal* deltaData, hkUint32 nValues);
  57. /*
  58.  * Quantization
  59.  */
  60. struct hkaQuantizeDesc {
  61. hkUint8  m_bitWidth; // The number of bits for each quantized element
  62. hkUint8  m_preserved; // The number of unquantized reals at the start of the stream
  63. hkReal   m_scale; // The scale of the data = (max-min)
  64. hkReal   m_offset; // The offset of the data (zero is preserved)
  65. };
  66. /// Calculates a quantisation description for the given data
  67. /// precision > 1/(2^bitWidth)
  68. void HK_CALL hkQuantizeCalcDesc( const hkReal* data, hkUint32 nValues, hkaQuantizeDesc& desc, hkUint32 quantizedBits = 16, hkUint32 preserve = 0 );
  69. /// Calculates the buffer size required to quantize the number of given bytes with the given header
  70. hkUint32 HK_CALL hkCalcQuantizedSize(hkUint32 nValues, const hkaQuantizeDesc& desc);
  71. /// Quantizes the real coefficients into the data buffer.
  72. void HK_CALL hkQuantizeReal( const hkReal* data, hkUint32 nValues, const hkaQuantizeDesc& desc, hkUint8* quantized );
  73. /// Expands the data into the preallocated buffer
  74. void HK_CALL hkExpandReal( const hkUint8* HK_RESTRICT quantized, const hkaQuantizeDesc& desc, hkReal* HK_RESTRICT data, hkUint32 nValues );
  75. /*
  76.  * Quaternion 32 bit compression
  77.  */
  78. /// Compress the quaternion to a 32 bit number
  79. void HK_CALL hkQuantizeQuaternion( const hkQuaternion& in, hkUint32& out );
  80. /// Decompress a 32 number back into a quaternion
  81. void HK_CALL hkExpandQuaternion( const hkUint32& in, hkQuaternion& out );
  82. void HK_CALL ApproximateNURBSCurve(
  83. int numSamples, const hkReal *sampleTimes, const hkVector4 *sampleData,
  84. int degree, hkReal tolerance,
  85. int *numKnotsOut, hkReal *knotsOut,
  86. int *numPointsOut, hkVector4 *pointsOut );
  87. // Offset into packed Nurbs data
  88. const hkUint8* HK_CALL computePackedNurbsOffsets( const hkUint8* base, const hkUint32* p, hkUint32 o2, hkUint32 o3 );
  89. // Signed quaternion packing/unpacking/endian
  90. void HK_CALL packSignedQuaternion16( const hkQuaternion* in, hkUint8* out );
  91. void HK_CALL packSignedQuaternion24( const hkQuaternion* in, hkUint8* out );
  92. void HK_CALL packSignedQuaternion32( const hkQuaternion* in, hkUint8* out8 );
  93. void HK_CALL packSignedQuaternion40( const hkQuaternion* in, hkUint8* out );
  94. void HK_CALL packSignedQuaternion48( const hkQuaternion* in, hkUint8* out8 );
  95. void HK_CALL packSignedQuaternion128( const hkQuaternion* in, hkUint8* out8 );
  96. void HK_CALL unpackSignedQuaternion16( const hkUint8* in, hkQuaternion* out );
  97. void HK_CALL unpackSignedQuaternion24( const hkUint8* in, hkQuaternion* out );
  98. void HK_CALL unpackSignedQuaternion32( const hkUint8* in8, hkQuaternion* out );
  99. void HK_CALL unpackSignedQuaternion40( const hkUint8* in, hkQuaternion* out );
  100. void HK_CALL unpackSignedQuaternion48( const hkUint8* in8, hkQuaternion* out );
  101. void HK_CALL unpackSignedQuaternion128( const hkUint8* in8, hkQuaternion* out );
  102. void HK_CALL handleEndianSignedQuaternion24( hkUint8* dataInOut );
  103. void HK_CALL handleEndianSignedQuaternion16( hkUint8* dataInOut );
  104. void HK_CALL handleEndianSignedQuaternion32( hkUint8* dataInOut );
  105. void HK_CALL handleEndianSignedQuaternion40( hkUint8* dataInOut );
  106. void HK_CALL handleEndianSignedQuaternion48( hkUint8* dataInOut );
  107. void HK_CALL handleEndianSignedQuaternion128( hkUint8* dataInOut );
  108. hkReal HK_CALL getApproximateAccuracySignedQuaternion16();
  109. hkReal HK_CALL getApproximateAccuracySignedQuaternion24();
  110. hkReal HK_CALL getApproximateAccuracySignedQuaternion32();
  111. hkReal HK_CALL getApproximateAccuracySignedQuaternion40();
  112. hkReal HK_CALL getApproximateAccuracySignedQuaternion48();
  113. hkReal HK_CALL getApproximateAccuracySignedQuaternion128();
  114. }
  115. #endif // HK_COMPRESSION_H
  116. /*
  117. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  118. * Confidential Information of Havok.  (C) Copyright 1999-2009
  119. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  120. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  121. * rights, and intellectual property rights in the Havok software remain in
  122. * Havok and/or its suppliers.
  123. * Use of this software for evaluation purposes is subject to and indicates
  124. * acceptance of the End User licence Agreement for this product. A copy of
  125. * the license is included with this software and is also available at www.havok.com/tryhavok.
  126. */