hkpPhysicsContext.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_UTILITIES2_PHYSICS_CONTEXT_H
  9. #define HK_UTILITIES2_PHYSICS_CONTEXT_H
  10. #include <Common/Visualize/hkProcessContext.h>
  11. #include <Physics/Dynamics/World/Listener/hkpWorldDeletionListener.h>
  12. #include <Physics/Dynamics/Action/hkpActionListener.h>
  13. #include <Physics/Dynamics/Constraint/hkpConstraintListener.h>
  14. #include <Physics/Dynamics/Phantom/hkpPhantomListener.h>
  15. #include <Physics/Dynamics/Entity/hkpEntityListener.h>
  16. class hkpWorld;
  17. class hkpEntity;
  18. class hkpPhantom;
  19. /// A simple interface that viewers that want to know
  20. /// when hkWorlds are added and removed from the physics
  21. /// context can impliment.
  22. class hkpPhysicsContextWorldListener
  23. {
  24.     public:
  25.         virtual ~hkpPhysicsContextWorldListener() { }
  26.         virtual void worldAddedCallback( hkpWorld* newWorld ) = 0;
  27.         virtual void worldRemovedCallback( hkpWorld* newWorld ) = 0;
  28. };
  29. #define HK_PHYSICS_CONTEXT_TYPE_STRING "Physics"
  30. /// This is the context that processes (here called the older name
  31. /// of 'viewers') can use if they understand physics Worlds. It listens on all 
  32. /// added worlds and can trigger deletion and addition callbacks 
  33. /// to processes (viewers) if requested. A context itself is just a data store
  34. /// for any information that a viewer will need. In this case it is pointers to 
  35. /// hkWorlds, as from that any of the physics viewers can find the parts they are 
  36. /// interested in and then register themselves with the world to get the appropriate 
  37. /// callbacks to keep their state up to date.
  38. class hkpPhysicsContext : 
  39. public hkReferencedObject, public hkProcessContext, 
  40. public hkpWorldDeletionListener, 
  41. public hkpEntityListener, 
  42. public hkpPhantomListener,
  43. public hkpConstraintListener,
  44. public hkpActionListener
  45. {
  46. public:
  47. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_VDB);
  48. hkpPhysicsContext();
  49. /// Register all Processes (Physics Viewers) 
  50. /// in the Utilities. If you don't call this
  51. /// or a subset of what it calls, all you will get
  52. /// is the common viewers in hkVisualize (debug display and stats).
  53. /// If you don't see the hkpShapeDisplayViewer for instance in the 
  54. /// list of available viewers in the VDB client, it is beacuse 
  55. /// this has not been called.
  56. static void HK_CALL registerAllPhysicsProcesses();
  57. /// As there can be any number of different user types
  58. /// of data contexts, the type is simply identified by string.
  59. virtual const char* getType() { return HK_PHYSICS_CONTEXT_TYPE_STRING; }
  60. /// Register a world. This context is a deletion listener, so will 
  61. /// remove the world when it sees it deleted. It does not reference
  62. /// the world, just keeps track of it by way of the listeners.
  63. void addWorld( hkpWorld* newWorld );
  64. /// Explicitly remove a world from the context. If 
  65. /// you delete a world it will remove itself from
  66. /// the context anyway as this context is a deletion
  67. /// listener.
  68. void removeWorld( hkpWorld* newWorld ); 
  69. /// Find the index of the given world, returns -1
  70. /// if not found in this context.
  71. int findWorld(hkpWorld* world); 
  72. /// Get number of worlds registered in this context.
  73. inline int getNumWorlds() { return m_worlds.getSize(); }
  74. /// Get the i-th world registered in this context.
  75. inline hkpWorld* getWorld(int i) { return m_worlds[i]; }
  76. /// So that processes can see all the worlds dynamically, 
  77. /// they can be hkpPhysicsContextWorldListener which simply
  78. /// get world added to this context events. As such they would
  79. /// be able to then register themselves as rigidbody added
  80. /// listeners and so on and for instance be able to create 
  81. /// bodies to display upon those further callbacks.
  82. void addWorldAddedListener( hkpPhysicsContextWorldListener* cb );
  83. /// So that processes can see all the worlds dynamically, 
  84. /// they can be hkpPhysicsContextWorldListener which simply
  85. /// can get world removed from this context, and can update
  86. /// their state accordingly (remove some display geoms etc).
  87. void removeWorldAddedListener( hkpPhysicsContextWorldListener* cb );
  88. public:
  89. /// Set the VDB that owns this context. This is callled by the VDB iteslf.
  90. virtual void setOwner(hkVisualDebugger* vdb);
  91. // Physics callbacks we want to track
  92. /// Raised when the given world has been deleted, default action is 
  93. /// to remove it from the list of registered worlds and notify 
  94. /// any interested viewers that the world has been removed.
  95. virtual void worldDeletedCallback( hkpWorld* world );
  96. /// Inspection (tweaking on the client side affecting this server side)
  97. /// requires that at least high level objects get removed from the 
  98. /// list of available tweakable objects. Tweakables are registered here
  99. /// from the physics contexts worlds through this context owner, the VDB itself.
  100. virtual void entityAddedCallback( hkpEntity* entity );
  101. virtual void entityRemovedCallback( hkpEntity* entity );
  102. virtual void phantomAddedCallback( hkpPhantom* phantom );
  103. virtual void phantomRemovedCallback( hkpPhantom* phantom );
  104. virtual void constraintAddedCallback( hkpConstraintInstance* constraint );
  105. virtual void constraintRemovedCallback( hkpConstraintInstance* constraint );
  106. virtual void actionAddedCallback( hkpAction* action );
  107. virtual void actionRemovedCallback( hkpAction* action );
  108. protected:
  109. /// As a context must exist at least as long as the VDB, we explicitly
  110. /// do not allow local variables of it to force the use of 'new' and removeRefernce().
  111. /// The VDB itself can't add a reference a context is just a abstract interface that
  112. /// any user data item can impliment for their own viewers.
  113. virtual ~hkpPhysicsContext();
  114. /// Iterates through existing objects (entities, phantoms etc)
  115. /// and adds them for Inspection (tweaking) and then adds 
  116. /// listeners to pick up when that state changes and objects are
  117. /// added or removed etc. Called upon addWorld.
  118. /// Non const as has to add listeners
  119. void addForInspection( hkpWorld* w );
  120. /// Iterates through existing objects (entities, phantoms etc)
  121. /// and removes them for Inspection (tweaking). Called upon removeWorld.
  122. /// Non const as has to remove listeners
  123. void removeFromInspection( hkpWorld* w);
  124. hkArray<hkpWorld*> m_worlds;
  125. hkArray<hkpPhysicsContextWorldListener*> m_addListeners;
  126. };
  127. #endif // HK_VISUALIZE_PROCESS_CONTEXT_H
  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. */