hkpProjectileGun.h
上传用户: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. #ifndef HKP_PROJECTILE_GUN_H
  9. #define HKP_PROJECTILE_GUN_H
  10. #include <Physics/Utilities/Weapons/hkpFirstPersonGun.h>
  11. #include <Physics/Dynamics/Collide/hkpCollisionListener.h>
  12. class hkpProjectileGun;
  13. /// Little helper for the projectile guns.
  14. /// This projectile can act on collisions occurring in the world.
  15. class hkpGunProjectile : public hkReferencedObject, public hkpCollisionListener
  16. {
  17.   public:
  18. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_DEMO);
  19. enum Flags { HIT_LISTENING = 0x4, HIT = 0x2, DESTROYED = 0x1 };
  20. /// Ctor
  21. hkpGunProjectile(hkpProjectileGun* gun, hkpRigidBody* body);
  22. /// Dtor
  23. ~hkpGunProjectile();
  24. public:
  25. /// Returns true if the projectile is destroyed
  26. HK_FORCE_INLINE bool isDestroyed() const { return (m_flags.get() & DESTROYED) != 0; }
  27. /// Destroy the projectile
  28. void destroy();
  29. /// Returns true if the projectile was hit in the last simulation
  30. HK_FORCE_INLINE bool wasHit() const { return (m_flags.get() & HIT) != 0; }
  31. /// Clear the hit flag
  32. HK_FORCE_INLINE void clearHit() { m_flags.andWith(hkUint8(~HIT)); }
  33. /// Get the rigid body
  34. HK_FORCE_INLINE hkpRigidBody* getRigidBody() const { return m_body; }
  35. /// Returns true if the projectile is in the world
  36. HK_FORCE_INLINE bool isInWorld() const { return m_body && m_body->getWorld() != HK_NULL; }
  37. /// Get the t
  38. HK_FORCE_INLINE hkReal getExistanceTime() const { return m_existanceTime; }
  39. /// Returns true if it is hit listening for hits
  40. HK_FORCE_INLINE bool isHitListening() { return (m_flags.get() & HIT_LISTENING) != 0; }
  41. /// Enable/disable hit listening
  42. void setHitListening(bool enable);
  43. /// Add it to the world
  44. void addToWorld(hkpWorld* world);
  45. /// Remove from the world
  46. void removeFromWorld();
  47. /// Update the projectile
  48. void update(hkReal timeStep);
  49. /// Get the gun the projectile belongs to
  50. HK_FORCE_INLINE hkpProjectileGun* getGun() const { return m_gun; }
  51. /// If the velocity of the body is greater than minVelocity, turn the body such that
  52. /// it's x axis is facing along the direction of motion
  53. static void HK_CALL flyTrue(hkpRigidBody* body, hkReal minVelocity, hkReal timeStep);
  54. public:
  55. /// Called when destroyed (you can only destroy a projectile once)
  56. virtual void onDestroy();
  57. /// Called when a hit occurs
  58. virtual void onHit(hkpContactPointConfirmedEvent& event) { m_flags.orWith(HIT); }
  59. /// Called on an update
  60. virtual void onUpdate(hkReal timeStep) {}
  61. private:
  62. void _destroyBody();
  63. // hkpCollisionListener
  64. virtual void contactPointAddedCallback( hkpContactPointAddedEvent& event) {}
  65. virtual void contactPointConfirmedCallback( hkpContactPointConfirmedEvent& event) { onHit(event); }
  66. virtual void contactPointRemovedCallback( hkpContactPointRemovedEvent& event ) {}
  67. protected:
  68. // State flags
  69. hkFlags<Flags, hkUint8> m_flags;
  70. // The body
  71. hkpRigidBody* m_body;
  72. // Holds existance time
  73. hkReal m_existanceTime;
  74. // Gun
  75. hkpProjectileGun* m_gun;
  76. };
  77. extern const hkClass hkpProjectileGunClass;
  78. /// Base class for guns that fire bullets with physics representation which are reacting on impact.
  79. class hkpProjectileGun : public hkpFirstPersonGun
  80. {
  81.     public:
  82. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_DEMO);
  83. HK_DECLARE_REFLECTION();
  84. /// Ctor
  85. hkpProjectileGun(hkpWorld* world, hkdWorld* destructionWorld);
  86. hkpProjectileGun(class hkFinishLoadedObjectFlag flag);
  87. /// Dtor
  88. virtual ~hkpProjectileGun();
  89. public:
  90. // FirstPersonGun
  91. virtual void stepGun( hkReal timeStep, hkpWorld* world, const hkpRigidBody* characterBody, const hkTransform& viewTransform, bool fire, bool fireRmb );
  92. virtual void fireGun( hkpWorld* world, const hkTransform& viewTransform );
  93. virtual void reset( hkpWorld* world );
  94. // own methods
  95. virtual void onGunFired(hkpWorld* world, const hkTransform& viewTransform) {}
  96. virtual void onUpdate( hkReal timeStep, hkpWorld* world, const hkpRigidBody* characterBody, const hkTransform& viewTransform, bool fire, bool fireRmb );
  97. protected:
  98. /// Destroys all of the projectiles
  99. void clearProjectiles();
  100. /// Destroys and projectiles older than specified age (they are still in the projectile list tho)
  101. void destroyAgedProjectiles(hkReal time);
  102. /// Removes all projectiles from the list which are destroyed
  103. void removeDestroyedProjectiles();
  104. /// Update all of the projectiles by timestep time
  105. void updateProjectiles(hkReal timeStep);
  106. /// Clear the hit flag
  107. void clearHitProjectiles();
  108. /// Returns the first (first added), active (not destroyed) projectile. If none found returns NULL.
  109. hkpGunProjectile* getFirstActiveProjectile() const;
  110. /// Adds a projectile
  111. void addProjectile(hkpGunProjectile* proj);
  112. public:
  113. int m_maxProjectiles;                  //+default(5) +hk.RangeInt32(absmin=0,absmax=1000) +hk.Ui(visible=true, label="Max Projectiles in World")
  114. hkReal m_reloadTime;                   //+default(0.3f) +hk.RangeReal(absmin=0.0,absmax=100.0) +hk.Ui(visible=true, label="Reload delay")
  115. /// Counts down m_reload time. If <=0 can fire.
  116. hkReal m_reload;                       //+nosave
  117. hkArray<hkpGunProjectile*> m_projectiles; //+nosave
  118. hkpWorld* m_world;                     //+nosave
  119. hkdWorld* m_destructionWorld;          //+nosave
  120. };
  121. #endif // HKP_PROJECTILE_GUN_H
  122. /*
  123. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  124. * Confidential Information of Havok.  (C) Copyright 1999-2009
  125. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  126. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  127. * rights, and intellectual property rights in the Havok software remain in
  128. * Havok and/or its suppliers.
  129. * Use of this software for evaluation purposes is subject to and indicates
  130. * acceptance of the End User licence Agreement for this product. A copy of
  131. * the license is included with this software and is also available at www.havok.com/tryhavok.
  132. */