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

其他游戏

开发平台:

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/hctConvertToPhantomActionFilter.h>
  10. #include <Physics/Utilities/Serialize/hkpPhysicsData.h>
  11. #include <Common/SceneData/Graph/hkxNode.h>
  12. #include <Common/SceneData/Attributes/hkxAttributeGroup.h>
  13. #include <Common/Base/Math/Util/hkMathUtil.h>
  14. #include <Physics/Dynamics/Entity/hkpRigidBody.h>
  15. #include <Physics/Dynamics/World/hkpPhysicsSystem.h>
  16. #include <Common/Serialize/Util/hkBuiltinTypeRegistry.h>
  17. #include <Common/Base/Reflection/hkClass.h>
  18. #include <Common/Base/Reflection/hkTypeInfo.h>
  19. #include <ContentTools/Common/Filters/FilterTutorial/ConvertToPhantomAction/MyPhantomShape.h>
  20. #include <Physics/Collide/Shape/Misc/Bv/hkpBvShape.h>
  21. // The only instance of our filter descriptor
  22. hctConvertToPhantomActionFilterDesc g_convertToPhantomActionDesc;
  23. hctConvertToPhantomActionFilter::hctConvertToPhantomActionFilter(const hctFilterManagerInterface* owner)
  24. : hctFilterInterface (owner)
  25. {
  26. m_options.m_removeMeshes = false;
  27. m_optionsDialog = HK_NULL;
  28. }
  29. hctConvertToPhantomActionFilter::~hctConvertToPhantomActionFilter()
  30. {
  31. }
  32. void hctConvertToPhantomActionFilter::process( hkRootLevelContainer& data  )
  33. {
  34. // Find and hkxScene and a hkPhysics Data objects in the root level container
  35. hkxScene* scenePtr = reinterpret_cast<hkxScene*>( data.findObjectByType( hkxSceneClass.getName() ) );
  36. if (scenePtr == HK_NULL || (scenePtr->m_rootNode == HK_NULL) )
  37. {
  38. HK_WARN_ALWAYS(0xabbaa5f0, "No scene data (or scene data root hkxNode) found. Can't continue.");
  39. return;
  40. }
  41. hkpPhysicsData* physicsPtr = reinterpret_cast<hkpPhysicsData*>( data.findObjectByType( hkpPhysicsDataClass.getName() ) );
  42. if (physicsPtr == HK_NULL)
  43. {
  44. HK_WARN_ALWAYS(0xabbaa3d0, "No physics data found, you need to use Create Rigid Bodies before this filter or have bodies already in the input data.");
  45. return;
  46. }
  47. // Keep track of how many phantoms we created so we can reported
  48. int numConverted = 0;
  49. // Search for rigid bodies in the scene
  50. for (int psi=0; psi<physicsPtr->getPhysicsSystems().getSize(); psi++)
  51. {
  52. const hkpPhysicsSystem* psystem = physicsPtr->getPhysicsSystems()[psi];
  53. for (int rbi=0; rbi<psystem->getRigidBodies().getSize(); rbi++)
  54. {
  55. hkpRigidBody* rbody = psystem->getRigidBodies()[rbi];
  56. const char* rbName = rbody->getName();
  57. // Require an associated node in the scene
  58. hkxNode* rbNode = (rbName)? scenePtr->findNodeByName(rbName): HK_NULL;
  59. if( !rbNode )
  60. {
  61. continue;
  62. }
  63. // Require an 'hkPhantomAction' attribute group
  64. const hkxAttributeGroup* attrGroup = rbNode->findAttributeGroupByName("hkPhantomAction");
  65. if (!attrGroup)
  66. {
  67. continue;
  68. }
  69. // Create our phantom shape
  70. MyPhantomShape* myPhantomShape = new MyPhantomShape();
  71. {
  72. // Set action type (required)
  73. const char* actionTypeStr = HK_NULL;
  74. attrGroup->getStringValue( "action", true, actionTypeStr );
  75. if( actionTypeStr )
  76. {
  77. if( hkString::strCasecmp( actionTypeStr, "wind" ) == 0 )
  78. {
  79. myPhantomShape->m_actionType = MyPhantomShape::ACTION_WIND;
  80. }
  81. else if( hkString::strCasecmp( actionTypeStr, "attract" ) == 0 )
  82. {
  83. myPhantomShape->m_actionType = MyPhantomShape::ACTION_ATTRACT;
  84. }
  85. else if( hkString::strCasecmp( actionTypeStr, "deflect" ) == 0 )
  86. {
  87. myPhantomShape->m_actionType = MyPhantomShape::ACTION_DEFLECT;
  88. }
  89. else
  90. {
  91. HK_WARN_ALWAYS(0xabbad3b4, "Unknow action type ("<<actionTypeStr<<").");
  92. }
  93. }
  94. else
  95. {
  96. HK_WARN_ALWAYS(0xabba9834, "Can't fine "action" attribute");
  97. }
  98. // Set other attributes (optional)
  99. attrGroup->getVectorValue( "direction", false, myPhantomShape->m_direction );
  100. attrGroup->getFloatValue( "strength", false, myPhantomShape->m_strength );
  101. // Useful warnings
  102. if ((myPhantomShape->m_actionType == MyPhantomShape::ACTION_WIND) && (myPhantomShape->m_direction.lengthSquared3()==0.0f))
  103. {
  104. HK_WARN_ALWAYS(0xabbadf82, "Wind direction is invalid - action will have no effect");
  105. }
  106. if (myPhantomShape->m_strength==0.0f)
  107. {
  108. HK_WARN_ALWAYS(0xabbacc83, "Strength is 0 - action will have no effect");
  109. }
  110. }
  111. // Set the phantom as a new bounding shape for the body
  112. {
  113. const hkpShape* oldShape = rbody->getCollidable()->getShape();
  114. hkpBvShape* bvShape = new hkpBvShape( oldShape, myPhantomShape );
  115. myPhantomShape->removeReference();
  116. rbody->setShape( bvShape );
  117. bvShape->removeReference();
  118. }
  119. // Remove meshes if the user chose to do so
  120. if (m_options.m_removeMeshes && (hkString::strCmp(rbNode->m_object.m_class->getName(), "hkxMesh")==0) )
  121. {
  122. rbNode->m_object.m_object = HK_NULL;
  123. }
  124. HK_REPORT("Converted rigid body ""<<rbName<<"" to phantom action");
  125. numConverted++;
  126. }
  127. }
  128. // Give a warning if the filter didn't do anything useful
  129. if (numConverted==0)
  130. {
  131. HK_WARN_ALWAYS(0xabba7632, "No rigid bodies converted to phantom action.");
  132. }
  133. else
  134. {
  135. HK_REPORT("Converted "<<numConverted<<" rigid bodies.");
  136. }
  137. }
  138. /*
  139. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  140. * Confidential Information of Havok.  (C) Copyright 1999-2009
  141. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  142. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  143. * rights, and intellectual property rights in the Havok software remain in
  144. * Havok and/or its suppliers.
  145. * Use of this software for evaluation purposes is subject to and indicates
  146. * acceptance of the End User licence Agreement for this product. A copy of
  147. * the license is included with this software and is also available at www.havok.com/tryhavok.
  148. */