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

其他游戏

开发平台:

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 <ContentTools/Common/Filters/FilterTutorial/hctFilterTutorial.h>
  9. #include <ContentTools/Common/Filters/FilterTutorial/ConvertToPhantomAction/MyPhantomShape.h>
  10. #include <Physics/Dynamics/Action/hkpBinaryAction.h>
  11. #include <Physics/Dynamics/Entity/hkpRigidBody.h>
  12. //
  13. // Actions
  14. //
  15. // Apply a constant force to the rigid body
  16. // (Use a binary action so that it maintains a ref to the phantom)
  17. class MyWindAction : public hkpBinaryAction
  18. {
  19. public:
  20. MyWindAction( hkpRigidBody* phantom, hkpRigidBody* rb, const hkVector4& force ) : hkpBinaryAction(phantom,rb), m_force(force) {}
  21. MyWindAction( hkFinishLoadedObjectFlag flag ) : hkpBinaryAction(flag) {}
  22. /*virtual*/ void applyAction( const hkStepInfo& stepInfo )
  23. {
  24. hkpRigidBody* rb = (hkpRigidBody*)getEntityB();
  25. rb->applyForce( stepInfo.m_deltaTime, m_force );
  26. }
  27. /*virtual*/ MyWindAction* clone( const hkArray<hkpEntity*>& newEntities, const hkArray<hkpPhantom*>& newPhantoms ) const
  28. {
  29. return HK_NULL;
  30. }
  31. hkVector4 m_force;
  32. };
  33. // Apply a 'point' force to the rigid body
  34. class MyAttractAction : public hkpBinaryAction
  35. {
  36. public:
  37. MyAttractAction( hkpRigidBody* phantom, hkpRigidBody* rb, float strength ) : hkpBinaryAction(phantom,rb), m_strength(strength) {}
  38. MyAttractAction( hkFinishLoadedObjectFlag flag ) : hkpBinaryAction(flag) {}
  39. /*virtual*/ void applyAction( const hkStepInfo& stepInfo )
  40. {
  41. hkVector4 force;
  42. force.setSub4( getEntityA()->getMotion()->getPosition(), getEntityB()->getMotion()->getPosition() );
  43. float distance = force.length3();
  44. force.mul4( m_strength / ( ( distance * distance ) + HK_REAL_EPSILON ) );
  45. hkpRigidBody* rb = (hkpRigidBody*)getEntityB();
  46. rb->applyForce( stepInfo.m_deltaTime, force );
  47. }
  48. /*virtual*/ MyAttractAction* clone( const hkArray<hkpEntity*>& newEntities, const hkArray<hkpPhantom*>& newPhantoms ) const
  49. {
  50. return HK_NULL;
  51. }
  52. float m_strength;
  53. };
  54. //
  55. // hkpPhantom interface implementation
  56. //
  57. MyPhantomShape::MyPhantomShape()
  58. {
  59. m_actionType = ACTION_WIND;
  60. m_direction.setZero4();
  61. m_strength = 0.0f;
  62. }
  63. /*virtual*/ void MyPhantomShape::phantomEnterEvent( const hkpCollidable* phantomColl, const hkpCollidable* otherColl, const hkpCollisionInput& env )
  64. {
  65. hkpRigidBody* phantom = hkGetRigidBody( phantomColl );
  66. hkpRigidBody* rb = hkGetRigidBody( otherColl );
  67. if( !phantom || !rb )
  68. {
  69. return;
  70. }
  71. // Create the appropriate action
  72. hkpAction* action = HK_NULL;
  73. switch( m_actionType )
  74. {
  75. case ACTION_WIND:
  76. {
  77. hkVector4 force;
  78. force.setMul4( m_strength, m_direction );
  79. action = new MyWindAction( phantom, rb, force );
  80. }
  81. break;
  82. case ACTION_ATTRACT:
  83. {
  84. action = new MyAttractAction( phantom, rb, m_strength );
  85. }
  86. break;
  87. case ACTION_DEFLECT:
  88. {
  89. // use the attract action with a negative strength
  90. action = new MyAttractAction( phantom, rb, -m_strength );
  91. }
  92. break;
  93. }
  94. // Add it to the world
  95. if( action )
  96. {
  97. rb->getWorld()->addAction( action );
  98. action->removeReference();
  99. }
  100. }
  101. /*virtual*/ void MyPhantomShape::phantomLeaveEvent( const hkpCollidable* phantomColl, const hkpCollidable* otherColl )
  102. {
  103. hkpRigidBody* phantom = hkGetRigidBody( phantomColl );
  104. hkpRigidBody* rb = hkGetRigidBody( otherColl );
  105. if( !phantom || !rb )
  106. {
  107. return;
  108. }
  109. // Find and remove the appropriate action
  110. int numActions = phantom->getNumActions();
  111. for( int i=numActions-1; i>=0; --i )
  112. {
  113. hkpAction* action = phantom->getAction(i);
  114. if (action)
  115. {
  116. hkArray<hkpEntity*> entities;
  117. action->getEntities( entities );
  118. for( int j=0; j<entities.getSize(); ++j )
  119. {
  120. if( entities[j] == rb )
  121. {
  122. action->getWorld()->removeAction( action );
  123. }
  124. }
  125. }
  126. }
  127. }
  128. /*
  129. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  130. * Confidential Information of Havok.  (C) Copyright 1999-2009
  131. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  132. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  133. * rights, and intellectual property rights in the Havok software remain in
  134. * Havok and/or its suppliers.
  135. * Use of this software for evaluation purposes is subject to and indicates
  136. * acceptance of the End User licence Agreement for this product. A copy of
  137. * the license is included with this software and is also available at www.havok.com/tryhavok.
  138. */