hkpFixedBufferRayHitCollector.h
上传用户: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. #ifndef HK_FIXED_BUFFER_RAY_HIT_COLLECTOR_H
  9. #define HK_FIXED_BUFFER_RAY_HIT_COLLECTOR_H
  10. #include <Physics/Collide/Shape/Query/hkpRayHitCollector.h>
  11. struct hkpWorldRayCastOutput;
  12. # define hkpWorldRayCastOutput_Storage hkpWorldRayCastOutput 
  13. ///
  14. /// This collector class will always collect the n closest points (with n == 'capacity' as supplied in the constructor).
  15. /// For now it is only used with hkCollisionQuery jobs. Its usage is hardcoded into the jobs, so you cannot derive and
  16. /// use your derived class instead, but you can register your own custom addCdPoint() callback function by calling
  17. /// registerFixedBufferCdPointCollectorAddCdPointCallbackFunction().
  18. ///
  19. class hkpFixedBufferRayHitCollector : public hkpRayHitCollector
  20. {
  21. public:
  22. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_AGENT, hkpFixedBufferRayHitCollector);
  23. public:
  24. /// The constructor needs to be passed in a pointer to the result array and its maximum capacity.
  25. HK_FORCE_INLINE hkpFixedBufferRayHitCollector(hkpWorldRayCastOutput_Storage* buffer, int capacity);
  26. /// This resets the m_earlyOutHitFraction to 1. You should call this if you want to
  27. /// reuse the class for a new ray cast.
  28. inline void reset();
  29. /// Virtual destructor for derived objects
  30. virtual ~hkpFixedBufferRayHitCollector() { }
  31. /// Call this static function to register the collector's default addRayHit() callback implementation.
  32. static void HK_CALL registerDefaultAddRayHitFunction();
  33. public:
  34. /// The collector's default addRayHit() implementation.
  35. ///
  36. /// This implementation will collect up to n closest hits (with n == 'capacity' as supplied in the class constructor).
  37. /// As long as there's room available in the internal array, new hits will simply be appended.
  38. /// Once the maximum capacity is reached we will check if the new hit is closer than the already available furthest
  39. /// hit and replace the latter accordingly. 
  40. static void HK_CALL addRayHitImplementation(const hkpCdBody& cdBody, const hkpShapeRayCastCollectorOutput& hitInfo, hkpFixedBufferRayHitCollector* collector);
  41. protected:
  42. virtual HK_FORCE_INLINE void addRayHit(const hkpCdBody& cdBody, const hkpShapeRayCastCollectorOutput& hitInfo);
  43. public:
  44. hkPadSpu<hkpWorldRayCastOutput_Storage*> m_rayCastOutputBase; // the result array's base address
  45. hkPadSpu<hkpWorldRayCastOutput_Storage*> m_nextFreeOutput; // the next free entry in the result array
  46. hkPadSpu<int> m_capacity; // the maximum number of entries available in the result array
  47. hkPadSpu<int> m_numOutputs; // the current number of entries available in the result array
  48. /// This is only used when the collector is used on Spu.
  49. /// For each hit collected we output the rootCollidable pointer, and we must use the permanent pointer in main memory 
  50. /// and not the temporary copy on Spu.
  51. hkPadSpu<const hkpCollidable*> m_collidableOnPpu;
  52. };
  53. //
  54. // User callback registering stuff for hkpFixedBufferRayHitCollector::addRayHit()
  55. //
  56. typedef void (HK_CALL *hkFixedBufferRayHitCollectorAddRayHitCallbackFunc)(const hkpCdBody& cdBody, const hkpShapeRayCastCollectorOutput& hitInfo, class hkpFixedBufferRayHitCollector* collector);
  57. extern hkFixedBufferRayHitCollectorAddRayHitCallbackFunc g_FixedBufferRayHitCollectorAddRayHitCallbackFunc;
  58. /// Register your custom hkpFixedBufferRayHitCollector::addCdPoint() implementation with this function.
  59. ///
  60. /// Note that when using the hkpFixedBufferRayHitCollector you can only ever have one global, shared addCdPoint() implementation.
  61. HK_FORCE_INLINE void registerFixedBufferRayHitCollectorAddRayHitCallbackFunction(hkFixedBufferRayHitCollectorAddRayHitCallbackFunc func)
  62. {
  63. g_FixedBufferRayHitCollectorAddRayHitCallbackFunc = func;
  64. }
  65. #include <Physics/Collide/Query/Collector/RayCollector/hkpFixedBufferRayHitCollector.inl>
  66. #endif // HK_FIXED_BUFFER_RAY_HIT_COLLECTOR_H
  67. /*
  68. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  69. * Confidential Information of Havok.  (C) Copyright 1999-2009
  70. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  71. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  72. * rights, and intellectual property rights in the Havok software remain in
  73. * Havok and/or its suppliers.
  74. * Use of this software for evaluation purposes is subject to and indicates
  75. * acceptance of the End User licence Agreement for this product. A copy of
  76. * the license is included with this software and is also available at www.havok.com/tryhavok.
  77. */