Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
6.8 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //
  7. //=============================================================================//
  8. #ifndef C_FIRE_SMOKE_H
  9. #define C_FIRE_SMOKE_H
  10. #include "particles_simple.h"
  11. #include "tempent.h"
  12. #include "glow_overlay.h"
  13. #include "view.h"
  14. #include "particle_litsmokeemitter.h"
  15. class CFireOverlay;
  16. class C_FireSprite : public C_Sprite
  17. {
  18. DECLARE_CLASS( C_FireSprite, C_Sprite );
  19. private:
  20. virtual int DrawModel( int flags )
  21. {
  22. if ( m_bFadeFromAbove )
  23. {
  24. // The sprites become less visible the more you look down or up at them
  25. Vector vToPos = GetLocalOrigin() - CurrentViewOrigin();
  26. VectorNormalize( vToPos );
  27. float fUpAmount = vToPos.z;
  28. int iAlpha = 255;
  29. if ( fUpAmount < -0.75f )
  30. iAlpha = 0;
  31. else if ( fUpAmount < -0.65f )
  32. iAlpha = 255 - (int)( ( fUpAmount + 0.65f ) * 10.0f * -255.0f );
  33. else if ( fUpAmount > 0.85f )
  34. iAlpha = 0;
  35. else if ( fUpAmount > 0.75f )
  36. iAlpha = 255 - (int)( ( fUpAmount - 0.75f ) * 10.0f * 255.0f );
  37. SetColor( iAlpha, iAlpha, iAlpha );
  38. }
  39. return BaseClass::DrawModel( flags );
  40. }
  41. public:
  42. Vector m_vecMoveDir;
  43. bool m_bFadeFromAbove;
  44. };
  45. class C_FireFromAboveSprite : public C_Sprite
  46. {
  47. DECLARE_CLASS( C_FireFromAboveSprite, C_Sprite );
  48. virtual int DrawModel( int flags )
  49. {
  50. // The sprites become more visible the more you look down or up at them
  51. Vector vToPos = GetLocalOrigin() - CurrentViewOrigin();
  52. VectorNormalize( vToPos );
  53. float fUpAmount = vToPos.z;
  54. int iAlpha = 0;
  55. if ( fUpAmount < -0.85f )
  56. iAlpha = 255;
  57. else if ( fUpAmount < -0.65f )
  58. iAlpha = (int)( ( fUpAmount + 0.65f ) * 5.0f * -255.0f );
  59. else if ( fUpAmount > 0.75f )
  60. iAlpha = 255;
  61. else if ( fUpAmount > 0.55f )
  62. iAlpha = (int)( ( fUpAmount - 0.55f ) * 5.0f * 255.0f );
  63. SetColor( iAlpha, iAlpha, iAlpha );
  64. return BaseClass::DrawModel( flags );
  65. }
  66. };
  67. #ifdef _XBOX
  68. // XBox reduces the flame count
  69. #define NUM_CHILD_FLAMES 1
  70. #else
  71. #define NUM_CHILD_FLAMES 4
  72. #endif
  73. #define SMOKE_RISE_RATE 92.0f
  74. #define SMOKE_LIFETIME 2.0f
  75. #define EMBER_LIFETIME 2.0f
  76. #define FLAME_CHILD_SPREAD 64.0f
  77. #define FLAME_SOURCE_HEIGHT 128.0f
  78. #define FLAME_FROM_ABOVE_SOURCE_HEIGHT 32.0f
  79. //==================================================
  80. // C_FireSmoke
  81. //==================================================
  82. //NOTENOTE: Mirrored in dlls/fire_smoke.h
  83. #define bitsFIRESMOKE_NONE 0x00000000
  84. #define bitsFIRESMOKE_ACTIVE 0x00000001
  85. #define bitsFIRESMOKE_SMOKE 0x00000002
  86. #define bitsFIRESMOKE_SMOKE_COLLISION 0x00000004
  87. #define bitsFIRESMOKE_GLOW 0x00000008
  88. #define bitsFIRESMOKE_VISIBLE_FROM_ABOVE 0x00000010
  89. #define OVERLAY_MAX_VISIBLE_RANGE 512.0f
  90. class C_FireSmoke : public C_BaseEntity
  91. {
  92. public:
  93. DECLARE_CLIENTCLASS();
  94. DECLARE_CLASS( C_FireSmoke, C_BaseEntity );
  95. C_FireSmoke();
  96. ~C_FireSmoke();
  97. void Start( void );
  98. void Simulate( void );
  99. void StartClientOnly( void );
  100. void RemoveClientOnly( void );
  101. protected:
  102. void Update( void );
  103. void UpdateAnimation( void );
  104. void UpdateScale( void );
  105. void UpdateFlames( void );
  106. void AddFlames( void );
  107. void SpawnSmoke( void );
  108. void FindClipPlane( void );
  109. //C_BaseEntity
  110. public:
  111. virtual void OnDataChanged( DataUpdateType_t updateType );
  112. virtual bool ShouldDraw();
  113. float GetScale( void ) const { return m_flScaleRegister; }
  114. //From the server
  115. public:
  116. float m_flStartScale;
  117. float m_flScale;
  118. float m_flScaleTime;
  119. int m_nFlags;
  120. int m_nFlameModelIndex;
  121. int m_nFlameFromAboveModelIndex;
  122. //Client-side only
  123. public:
  124. float m_flScaleRegister;
  125. float m_flScaleStart;
  126. float m_flScaleEnd;
  127. float m_flScaleTimeStart;
  128. float m_flScaleTimeEnd;
  129. float m_flChildFlameSpread;
  130. VPlane m_planeClip;
  131. float m_flClipPerc;
  132. bool m_bClipTested;
  133. bool m_bFadingOut;
  134. protected:
  135. void UpdateEffects( void );
  136. //CSmartPtr<CEmberEffect> m_pEmberEmitter;
  137. CSmartPtr<CLitSmokeEmitter> m_pSmokeEmitter;
  138. C_FireSprite m_entFlames[NUM_CHILD_FLAMES];
  139. C_FireFromAboveSprite m_entFlamesFromAbove[NUM_CHILD_FLAMES];
  140. float m_entFlameScales[NUM_CHILD_FLAMES];
  141. TimedEvent m_tParticleSpawn;
  142. CFireOverlay *m_pFireOverlay;
  143. // New Particle Fire Effect
  144. CNewParticleEffect *m_hEffect;
  145. private:
  146. C_FireSmoke( const C_FireSmoke & );
  147. };
  148. //Fire overlay
  149. class CFireOverlay : public CGlowOverlay
  150. {
  151. public:
  152. //Constructor
  153. CFireOverlay( C_FireSmoke *owner )
  154. {
  155. m_pOwner = owner;
  156. m_flScale = 0.0f;
  157. m_nGUID = random->RandomInt( -999999, 999999 );
  158. }
  159. //-----------------------------------------------------------------------------
  160. // Purpose: Generate a flicker value
  161. // Output : scalar value
  162. //-----------------------------------------------------------------------------
  163. float GetFlickerScale( void )
  164. {
  165. float result = 0.0f;
  166. float time = Helper_GetTime() + m_nGUID;
  167. result = sin( time * 1000.0f );
  168. result += 0.5f * sin( time * 2000.0f );
  169. result -= 0.5f * cos( time * 8000.0f );
  170. return result;
  171. }
  172. //-----------------------------------------------------------------------------
  173. // Purpose: Update the overlay
  174. //-----------------------------------------------------------------------------
  175. virtual bool Update( void )
  176. {
  177. if ( m_pOwner == NULL )
  178. return false;
  179. float scale = m_pOwner->GetScale();
  180. float dscale = scale - m_flScale;
  181. m_vPos[2] += dscale * FLAME_SOURCE_HEIGHT;
  182. m_flScale = scale;
  183. scale *= 0.75f;
  184. float flickerScale = GetFlickerScale();
  185. float newScale = scale + ( scale * flickerScale * 0.1f );
  186. m_Sprites[0].m_flHorzSize = ( newScale * 0.2f ) + ( m_Sprites[0].m_flHorzSize * 0.8f );
  187. m_Sprites[0].m_flVertSize = m_Sprites[0].m_flHorzSize * 1.5f;
  188. float cameraDistance = ( CurrentViewOrigin() - (m_pOwner->GetAbsOrigin())).Length();
  189. C_BasePlayer *local = C_BasePlayer::GetLocalPlayer();
  190. if ( local )
  191. {
  192. cameraDistance *= local->GetFOVDistanceAdjustFactor();
  193. }
  194. if ( cameraDistance > OVERLAY_MAX_VISIBLE_RANGE )
  195. cameraDistance = OVERLAY_MAX_VISIBLE_RANGE;
  196. float alpha = 1.0f - ( cameraDistance / OVERLAY_MAX_VISIBLE_RANGE );
  197. Vector newColor = m_vBaseColors[0] + ( m_vBaseColors[0] * flickerScale * 0.5f );
  198. m_Sprites[0].m_vColor = ( newColor * 0.1f ) + ( m_Sprites[0].m_vColor * 0.9f ) * alpha;
  199. return true;
  200. }
  201. public:
  202. C_FireSmoke *m_pOwner;
  203. Vector m_vBaseColors[MAX_SUN_LAYERS];
  204. float m_flScale;
  205. int m_nGUID;
  206. };
  207. //
  208. // Entity flame, client-side implementation
  209. //
  210. #define NUM_FLAMELETS 5
  211. class C_EntityFlame : public C_BaseEntity
  212. {
  213. public:
  214. DECLARE_CLIENTCLASS();
  215. DECLARE_CLASS( C_EntityFlame, C_BaseEntity );
  216. C_EntityFlame( void );
  217. ~C_EntityFlame( void );
  218. virtual void Simulate( void );
  219. virtual void UpdateOnRemove( void );
  220. virtual void OnDataChanged( DataUpdateType_t updateType );
  221. virtual void ClientThink( void );
  222. CNewParticleEffect *m_hEffect;
  223. EHANDLE m_hEntAttached; // The entity that we are burning (attached to).
  224. EHANDLE m_hOldAttached;
  225. protected:
  226. void CreateEffect( void );
  227. void StopEffect( void );
  228. };
  229. #endif //C_FIRE_SMOKE_H