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

其他游戏

开发平台:

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. HK_FORCE_INLINE hkReal hkpSampledHeightFieldShape::getHeightAt( int x, int z ) const
  9. {
  10. return getHeightAtImpl(x, z);
  11. }
  12. HK_FORCE_INLINE hkBool hkpSampledHeightFieldShape::getTriangleFlip() const
  13. {
  14. return getTriangleFlipImpl();
  15. }
  16. template<class IMPL>
  17. HK_FORCE_INLINE void HK_CALL hkSampledHeightFieldShape_collideSpheres(
  18. const IMPL& impl,
  19. const hkpHeightFieldShape::CollideSpheresInput& input,
  20. hkpHeightFieldShape::SphereCollisionOutput* outputArray )
  21. {
  22. const hkSphere* spheres = input.m_spheres;
  23. hkpHeightFieldShape::SphereCollisionOutput* output = outputArray;
  24. hkVector4 defNormal;
  25. defNormal.set( 0,1,0,HK_REAL_MAX);
  26. for (int i = input.m_numSpheres -1; i>=0; output++, spheres++, i--)
  27. {
  28. output[0] = defNormal;
  29. hkVector4 pos;  pos.setMul4( spheres->getPosition(), impl.m_floatToIntScale );
  30. hkIntUnion64 out;
  31. hkVector4Util::convertToUint16( spheres->getPosition(), impl.m_floatToIntOffsetFloorCorrected, impl.m_floatToIntScale, out );
  32. hkInt32 x = out.u16[0];
  33. hkInt32 z = out.u16[2];
  34. //
  35. // Check for boundaries
  36. //
  37. if ( (x >= (impl.m_xRes-1) ) || (z >= (impl.m_zRes-1) ) )
  38. {
  39. continue;
  40. }
  41. hkReal subX = pos(0) - hkReal(x);
  42. hkReal subZ = pos(2) - hkReal(z);
  43. //HK_ASSERT(0x668a555b,  subX >= 0.0f && subX <= 1.0f );
  44. //HK_ASSERT(0x20de02d8,  subZ >= 0.0f && subZ <= 1.0f );
  45. hkReal height;
  46. hkReal vertHeight;
  47. int  vertX;
  48.   if ( impl.IMPL::getTriangleFlip() )
  49. {
  50. hkReal h00 = impl.IMPL::getHeightAt( x+0, z   );
  51. vertHeight = h00;
  52. vertX = x;
  53. hkReal h11 = impl.IMPL::getHeightAt( x+1, z+1 );
  54. if ( subX > subZ )
  55. {
  56. hkReal h10 = impl.IMPL::getHeightAt( x+1, z   );
  57. hkReal dx = h10 - h00;
  58. hkReal dz = h11 - h10;
  59. height = h00  + subZ * dz + subX * dx;
  60. output[0](0) = -dx;
  61. output[0](2) = -dz;
  62. }
  63. else
  64. {
  65. hkReal h01 = impl.IMPL::getHeightAt( x, z+1 );
  66. hkReal dx = h11 - h01;
  67. hkReal dz = h01 - h00;
  68. height = h00  + subZ * dz + subX * dx;
  69. output[0](0) = -dx;
  70. output[0](2) = -dz;
  71. }
  72. }
  73. else
  74. {
  75. hkReal h10 = impl.IMPL::getHeightAt( x+1, z  );
  76. vertHeight = h10;
  77. vertX = x+1;
  78. hkReal h01 = impl.IMPL::getHeightAt( x,   z+1 );
  79. if ( subX + subZ > 1.0f )
  80. {
  81. hkReal h11 = impl.IMPL::getHeightAt( x+1, z+1 );
  82. hkReal dx = h11 - h01;
  83. hkReal dz = h11 - h10;
  84. height = h10  + subZ * dz + (subX - 1.0f) * dx;
  85. output[0](0) = -dx;
  86. output[0](2) = -dz;
  87. }
  88. else
  89. {
  90. hkReal h00 = impl.IMPL::getHeightAt( x+0, z   );
  91. hkReal dx = h10 - h00;
  92. hkReal dz = h01 - h00;
  93. height = h00  + subZ * dz + subX * dx;
  94. output[0](0) = -dx;
  95. output[0](2) = -dz;
  96. }
  97. }
  98. output->mul4( impl.m_floatToIntScale ); // reverse multiply to correct for optimized cross product
  99. output->normalize3();
  100. hkReal absoluteDepth;
  101. if (!impl.m_useProjectionBasedHeight)
  102. {
  103. absoluteDepth = (pos(1) - height) * impl.m_intToFloatScale(1) - spheres->getRadius();
  104. }
  105. else
  106. {
  107. hkVector4 triangleVert; triangleVert.set((hkReal)vertX, vertHeight,(hkReal)z);
  108. hkVector4 vectorToTri;
  109. vectorToTri.setSub4(pos, triangleVert);
  110. vectorToTri.mul4(impl.m_intToFloatScale);
  111. hkReal distanceToTri = output->dot3(vectorToTri);
  112. absoluteDepth = distanceToTri - spheres->getRadius();
  113. }
  114. output[0](3) = absoluteDepth;
  115. }
  116. }
  117. /*
  118. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  119. * Confidential Information of Havok.  (C) Copyright 1999-2009
  120. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  121. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  122. * rights, and intellectual property rights in the Havok software remain in
  123. * Havok and/or its suppliers.
  124. * Use of this software for evaluation purposes is subject to and indicates
  125. * acceptance of the End User licence Agreement for this product. A copy of
  126. * the license is included with this software and is also available at www.havok.com/tryhavok.
  127. */