hkpAabbUtil.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. #include <Common/Base/Types/Geometry/Aabb/hkAabb.h>
  9. void HK_CALL hkpAabbUtil::calcAabb( const hkTransform& localToWorld, const hkVector4& halfExtents, float extraRadius, hkAabb& aabbOut )
  10. {
  11. #if defined (HK_PS2) && defined (HK_COMPILER_GCC) && (HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED)
  12. asm (
  13. " lqc2 vf8, 0x00(%3) # column(0) n"
  14. " qmtc2 %4, vf12 # extra radius n"
  15. " lqc2 vf9, 0x10(%3) # column(1) n"
  16. " lqc2 vf10, 0x20(%3) # column(2) n"
  17. " lqc2 vf11, 0x30(%3) # column(3) n"
  18. " vaddx.xyzw vf12, vf0, vf12 #   broadcast extra radius n"
  19. " vmulx.xyz vf8, vf8,  %2 # transformedX.setMul4( halfExtents(0), localToWorld.getRotation().getColumn(0)) n"
  20. " vmuly.xyz vf9, vf9,  %2 # transformedY.setMul4( halfExtents(1), localToWorld.getRotation().getColumn(0)) n"
  21. " vmulz.xyz vf10,vf10, %2 # transformedZ.setMul4( halfExtents(2), localToWorld.getRotation().getColumn(0)) n"
  22. " vabs.xyz    vf8, vf8 # abs x n"
  23. " vabs.xyz    vf9, vf9 # abs y n"
  24. " vabs.xyz    vf10, vf10 # abs z n"
  25. " vmulaw.xyzw      ACC, vf8, vf0 # x+y+zn"
  26. " vmaddaw.xyzw  ACC, vf9, vf0 # n"
  27. " vmaddaw.xyzw  ACC, vf12,vf0 # extra radius n"
  28. " vmaddw.xyzw %1, vf10, vf0 # extends = all togethern"
  29. " vsub.xyz %0, vf11, %1 # min = offset - extends  n"
  30. " vadd.xyz %1, vf11, %1 # max += offset n"
  31.  : "=j" (aabbOut.m_min.getQuad() ), "=j" (aabbOut.m_max.getQuad() )
  32.  :  "j"(halfExtents.getQuad()), "r"( &localToWorld.getRotation().getColumn(0) ), "r" ( extraRadius )
  33.  : "vf8", "vf9", "vf10", "vf11", "vf12", "memory" );
  34. #else
  35. hkVector4 he0; he0.setBroadcast3clobberW( halfExtents, 0 );
  36. hkVector4 he1; he1.setBroadcast3clobberW( halfExtents, 1 );
  37. hkVector4 he2; he2.setBroadcast3clobberW( halfExtents, 2 );
  38. hkVector4 transformedX; transformedX.setMul4( he0, localToWorld.getRotation().getColumn(0));
  39. hkVector4 transformedY; transformedY.setMul4( he1, localToWorld.getRotation().getColumn(1));
  40. hkVector4 transformedZ; transformedZ.setMul4( he2, localToWorld.getRotation().getColumn(2));
  41. transformedX.setAbs4( transformedX );
  42. transformedY.setAbs4( transformedY );
  43. transformedZ.setAbs4( transformedZ );
  44. hkVector4 max = aabbOut.m_max; // copy so local on xbox etc
  45. hkVector4 min = aabbOut.m_min;
  46. hkVector4 extra; extra.setAll3( extraRadius );
  47. transformedZ.add4( extra );
  48. max.setAdd4( transformedX, transformedY );
  49. max.add4( transformedZ );
  50. min.setNeg4(max);
  51. max.add4( localToWorld.getTranslation() );
  52. min.add4( localToWorld.getTranslation()  );
  53. aabbOut.m_max = max;
  54. aabbOut.m_min = min;
  55. #endif
  56. }
  57. void HK_CALL hkpAabbUtil::calcAabb( const hkTransform& localToWorld, const hkVector4& halfExtents, const hkVector4& center, float extraRadius, hkAabb& aabbOut )
  58. {
  59. #if defined HK_PS2 && defined (HK_COMPILER_GCC) && (HK_CONFIG_SIMD == HK_CONFIG_SIMD_ENABLED)
  60. asm (
  61. " lqc2 vf8, 0x00(%3) # column(0) n"
  62. " qmtc2 %4, vf12 # extra radius n"
  63. " lqc2 vf9, 0x10(%3) # column(1) n"
  64. " lqc2 vf10, 0x20(%3) # column(2) n"
  65. " lqc2 vf11, 0x30(%3) # column(3) n"
  66. " vaddx.xyzw vf12, vf0, vf12 #   broadcast extra radius n"
  67. " vmulax.xyz ACC,  vf8, %5 #   vf13.setTransformedPos(center) n" 
  68. " vmadday.xyz ACC,  vf9, %5 #   vf13.setTransformedPos(center) n" 
  69. " vmaddaz.xyz ACC,  vf10, %5 #   vf13.setTransformedPos(center) n" 
  70. " vmaddw.xyz vf11, vf11, vf0 #   vf13.setTransformedPos(center) n" 
  71. " vmulx.xyz vf8, vf8,  %2 # transformedX.setMul4( halfExtents(0), localToWorld.getRotation().getColumn(0)) n"
  72. " vmuly.xyz vf9, vf9,  %2 # transformedY.setMul4( halfExtents(1), localToWorld.getRotation().getColumn(0)) n"
  73. " vmulz.xyz vf10,vf10, %2 # transformedZ.setMul4( halfExtents(2), localToWorld.getRotation().getColumn(0)) n"
  74. " vabs.xyz    vf8, vf8 # abs x n"
  75. " vabs.xyz    vf9, vf9 # abs y n"
  76. " vabs.xyz    vf10, vf10 # abs z n"
  77. " vmulaw.xyzw      ACC, vf8, vf0 # x+y+zn"
  78. " vmaddaw.xyzw  ACC, vf9, vf0 # n"
  79. " vmaddaw.xyzw  ACC, vf10,vf0 # extra radius n"
  80. " vmaddw.xyzw %1, vf12, vf0 # extends = all togethern"
  81. " vsub.xyz %0, vf11, %1 # min = offset - extends  n"
  82. " vadd.xyz %1, vf11, %1 # max += offset n"
  83.  : "=j" (aabbOut.m_min.getQuad() ), "=j" (aabbOut.m_max.getQuad() )
  84.  :  "j"(halfExtents.getQuad()), "r"( &localToWorld.getRotation().getColumn(0) ), "r" ( extraRadius ), "j" (center.getQuad())
  85.  : "vf8", "vf9", "vf10", "vf11", "vf12", "memory" );
  86. #else
  87. hkVector4 he0; he0.setBroadcast3clobberW( halfExtents, 0 );
  88. hkVector4 he1; he1.setBroadcast3clobberW( halfExtents, 1 );
  89. hkVector4 he2; he2.setBroadcast3clobberW( halfExtents, 2 );
  90. hkVector4 transformedX; transformedX.setMul4( he0, localToWorld.getRotation().getColumn(0));
  91. hkVector4 transformedY; transformedY.setMul4( he1, localToWorld.getRotation().getColumn(1));
  92. hkVector4 transformedZ; transformedZ.setMul4( he2, localToWorld.getRotation().getColumn(2));
  93. transformedX.setAbs4( transformedX );
  94. transformedY.setAbs4( transformedY );
  95. transformedZ.setAbs4( transformedZ );
  96. hkVector4 max = aabbOut.m_max; // copy so local on xbox etc
  97. hkVector4 min = aabbOut.m_min;
  98. hkVector4 extra; extra.setAll3( extraRadius );
  99. transformedZ.add4( extra );
  100. max.setAdd4( transformedX, transformedY );
  101. max.add4( transformedZ );
  102. min.setNeg4(max);
  103. hkVector4 temp;
  104. temp._setTransformedPos(localToWorld, center);
  105. max.add4( temp );
  106. min.add4( temp );
  107. aabbOut.m_max = max;
  108. aabbOut.m_min = min;
  109. #endif
  110. }
  111. void hkpAabbUtil::sweepAabb(const hkMotionState* motionState, hkReal tolerance, const hkAabb& aabbIn, hkAabb& aabbOut)
  112. {
  113. //
  114. //  Expand the aabb by the angular part
  115. //
  116. hkReal radius = motionState->m_deltaAngle(3) * motionState->m_objectRadius;
  117. hkVector4 rotationalGain; rotationalGain.setAll(radius);
  118. aabbOut.m_min.setSub4(aabbIn.m_min, rotationalGain);
  119. aabbOut.m_max.setAdd4(aabbIn.m_max, rotationalGain);
  120. //
  121. // restrict the size of the AABB to the worst case radius size
  122. //
  123. {
  124. hkVector4 radius4; radius4.setAll3( motionState->m_objectRadius + tolerance );
  125. hkVector4 maxR; maxR.setAdd4( motionState->getSweptTransform().m_centerOfMass1, radius4 );
  126. hkVector4 minR; minR.setSub4( motionState->getSweptTransform().m_centerOfMass1, radius4 );
  127. HK_ON_DEBUG
  128. (
  129. // I consider success when (aabbInOut.m_min <= maxR) and (minR <= aabbInOut.m_max) are true for all XYZ
  130. hkVector4Comparison a = aabbIn.m_min.compareLessThanEqual4( maxR );
  131. hkVector4Comparison b = minR.compareLessThanEqual4( aabbIn.m_max );
  132. hkVector4Comparison both; both.setAnd(a,b);
  133. HK_ASSERT2(0x366ca7b2, both.allAreSet(hkVector4Comparison::MASK_XYZ), "Invalid Radius. Did you make changes to a shape or change its center of mass while the owner was added to the world?" );
  134. );
  135. aabbOut.m_min.setMax4( aabbOut.m_min, minR );
  136. aabbOut.m_min.setMin4( aabbOut.m_min, aabbIn.m_min );
  137. aabbOut.m_max.setMin4( aabbOut.m_max, maxR );
  138. aabbOut.m_max.setMax4( aabbOut.m_max, aabbIn.m_max );
  139. }
  140. //
  141. // Sweep/expand the aabb along the motion path
  142. //
  143. hkVector4 invPath; invPath.setSub4( motionState->getSweptTransform().m_centerOfMass0, motionState->getSweptTransform().m_centerOfMass1 );
  144. hkVector4 zero; zero.setZero4();
  145. hkVector4 minPath; minPath.setMin4( zero, invPath );
  146. hkVector4 maxPath; maxPath.setMax4( zero, invPath );
  147. aabbOut.m_min.add4( minPath );
  148. aabbOut.m_max.add4( maxPath );
  149. #if defined(HK_DEBUG)
  150. hkReal diffMinX = aabbIn.m_min(0) - aabbOut.m_min(0);
  151. hkReal diffMinY = aabbIn.m_min(1) - aabbOut.m_min(1);
  152. hkReal diffMinZ = aabbIn.m_min(2) - aabbOut.m_min(2);
  153. hkReal diffMaxX = aabbOut.m_max(0) - aabbIn.m_max(0);
  154. hkReal diffMaxY = aabbOut.m_max(1) - aabbIn.m_max(1);
  155. hkReal diffMaxZ = aabbOut.m_max(2) - aabbIn.m_max(2);
  156. HK_ASSERT2( 0xaf63e413, diffMinX >= 0.0f && diffMinY >= 0.0f && diffMinZ >= 0.0f && diffMaxX >= 0.0f && diffMaxY >= 0.0f && diffMaxZ >= 0.0f, "Expanded AABB is smaller than the unexpanded AABB." );
  157. #endif
  158. }
  159. HK_ON_CPU( HK_FORCE_INLINE void HK_CALL hkpAabbUtil::sweepOffsetAabb(const hkpAabbUtil::OffsetAabbInput& input, const hkAabb& aabbIn, hkAabb& aabbOut) )
  160. HK_ON_SPU( HK_FORCE_INLINE void HK_CALL hkAabbUtil_sweepOffsetAabb(const hkpAabbUtil::OffsetAabbInput& input, const hkAabb& aabbIn, hkAabb& aabbOut) )
  161. {
  162. hkSimdReal half(0.5f);
  163. hkVector4 aabbHalfSize; aabbHalfSize.setSub4(aabbIn.m_max, aabbIn.m_min);  aabbHalfSize.mul4(half);
  164. hkVector4 aabbCenter; aabbCenter.setInterpolate4(aabbIn.m_max, aabbIn.m_min, half);
  165. hkVector4 arm; arm._setTransformedPos(input.m_endTransformInv, aabbCenter);
  166. hkVector4 min = aabbCenter;
  167. hkVector4 max = aabbCenter;
  168. {
  169. hkVector4 p; p._setTransformedPos(input.m_startTransform, arm);
  170. min.setMin4(min, p);
  171. max.setMax4(max, p);
  172. }
  173. // extended arm for the in-between transforms (cos(22.5deg)
  174. const hkVector4 centerOfMassLocal = input.m_motionState->getSweptTransform().m_centerOfMassLocal;
  175. for (int i = 0; i < input.m_numTransforms; i++)
  176. {
  177. hkVector4 extendedArm;
  178. extendedArm.setSub4(arm, centerOfMassLocal);
  179. extendedArm.mul4(input.m_transforms[i].getTranslation().getSimdAt(3));
  180. extendedArm.add4(centerOfMassLocal);
  181. hkVector4 p; p._setTransformedPos(input.m_transforms[i], extendedArm);
  182. min.setMin4(min, p);
  183. max.setMax4(max, p);
  184. }
  185. //
  186. // Expand the aabb due to angular rotation of the shape around the aabbIn's center
  187. //
  188. {
  189. hkSimdReal r = aabbHalfSize.length3();
  190. hkVector4 radius; radius.setAll(r);
  191. aabbHalfSize.addMul4(input.m_motionState->m_deltaAngle.getSimdAt(3), radius);
  192. aabbHalfSize.setMin4(radius, aabbHalfSize);
  193. }
  194. aabbOut.m_min.setSub4(min, aabbHalfSize);
  195. aabbOut.m_max.setAdd4(max, aabbHalfSize);
  196. // We need to ensure that in order for our hkAabbUint32 compression to work
  197. aabbOut.m_min.setMin4(aabbIn.m_min, aabbOut.m_min);
  198. aabbOut.m_max.setMax4(aabbIn.m_max, aabbOut.m_max);
  199. }
  200. /*
  201. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  202. * Confidential Information of Havok.  (C) Copyright 1999-2009
  203. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  204. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  205. * rights, and intellectual property rights in the Havok software remain in
  206. * Havok and/or its suppliers.
  207. * Use of this software for evaluation purposes is subject to and indicates
  208. * acceptance of the End User licence Agreement for this product. A copy of
  209. * the license is included with this software and is also available at www.havok.com/tryhavok.
  210. */