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.

327 lines
9.4 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #include "cbase.h"
  7. #include "shareddefs.h"
  8. #include "materialsystem/imesh.h"
  9. #include "view.h"
  10. #include "iviewrender.h"
  11. #include "view_shared.h"
  12. #include "viewrender.h"
  13. // memdbgon must be the last include file in a .cpp file!!!
  14. #include "tier0/memdbgon.h"
  15. extern IntroData_t *g_pIntroData;
  16. //-----------------------------------------------------------------------------
  17. // Purpose:
  18. //-----------------------------------------------------------------------------
  19. class C_ScriptIntro : public C_BaseEntity
  20. {
  21. DECLARE_CLASS( C_ScriptIntro, C_BaseEntity );
  22. public:
  23. DECLARE_CLIENTCLASS();
  24. C_ScriptIntro( void );
  25. ~C_ScriptIntro( void );
  26. void PostDataUpdate( DataUpdateType_t updateType );
  27. void ClientThink( void );
  28. void CalculateFOV( void );
  29. void CalculateAlpha( void );
  30. public:
  31. int m_iNextFOV;
  32. int m_iFOV;
  33. int m_iPrevFOV;
  34. int m_iStartFOV;
  35. float m_flNextFOVBlendTime;
  36. float m_flFOVBlendStartTime;
  37. bool m_bAlternateFOV;
  38. // Our intro data block
  39. IntroData_t m_IntroData;
  40. private:
  41. Vector m_vecCameraView;
  42. QAngle m_vecCameraViewAngles;
  43. int m_iBlendMode;
  44. int m_iNextBlendMode;
  45. float m_flNextBlendTime;
  46. float m_flBlendStartTime;
  47. bool m_bActive;
  48. EHANDLE m_hCameraEntity;
  49. // Fades
  50. float m_flFadeColor[3]; // Server's desired fade color
  51. float m_flFadeAlpha; // Server's desired fade alpha
  52. float m_flPrevServerFadeAlpha; // Previous server's desired fade alpha
  53. float m_flFadeDuration; // Time it should take to reach the server's new fade alpha
  54. float m_flFadeTimeStartedAt; // Time at which we last recieved a new desired fade alpha
  55. float m_flFadeAlphaStartedAt; // Alpha at which we last received a new desired fade alpha
  56. };
  57. IMPLEMENT_CLIENTCLASS_DT( C_ScriptIntro, DT_ScriptIntro, CScriptIntro )
  58. RecvPropVector( RECVINFO( m_vecCameraView ) ),
  59. RecvPropVector( RECVINFO( m_vecCameraViewAngles ) ),
  60. RecvPropInt( RECVINFO( m_iBlendMode ) ),
  61. RecvPropInt( RECVINFO( m_iNextBlendMode ) ),
  62. RecvPropFloat( RECVINFO( m_flNextBlendTime ) ),
  63. RecvPropFloat( RECVINFO( m_flBlendStartTime ) ),
  64. RecvPropBool( RECVINFO( m_bActive ) ),
  65. // Fov & fov blends
  66. RecvPropInt( RECVINFO( m_iFOV ) ),
  67. RecvPropInt( RECVINFO( m_iNextFOV ) ),
  68. RecvPropInt( RECVINFO( m_iStartFOV ) ),
  69. RecvPropFloat( RECVINFO( m_flNextFOVBlendTime ) ),
  70. RecvPropFloat( RECVINFO( m_flFOVBlendStartTime ) ),
  71. RecvPropBool( RECVINFO( m_bAlternateFOV ) ),
  72. // Fades
  73. RecvPropFloat( RECVINFO( m_flFadeAlpha ) ),
  74. RecvPropArray( RecvPropFloat( RECVINFO( m_flFadeColor[0] ) ), m_flFadeColor ),
  75. RecvPropFloat( RECVINFO( m_flFadeDuration ) ),
  76. RecvPropEHandle(RECVINFO(m_hCameraEntity)),
  77. END_RECV_TABLE()
  78. //-----------------------------------------------------------------------------
  79. // Purpose:
  80. //-----------------------------------------------------------------------------
  81. C_ScriptIntro::C_ScriptIntro( void )
  82. {
  83. m_bActive = false;
  84. m_vecCameraView = vec3_origin;
  85. m_vecCameraViewAngles = vec3_angle;
  86. m_iBlendMode = 0;
  87. m_iNextBlendMode = 0;
  88. m_flNextBlendTime = 0;
  89. m_flBlendStartTime = 0;
  90. m_IntroData.m_playerViewFOV = 0;
  91. m_flFadeAlpha = 0;
  92. m_flPrevServerFadeAlpha = 0;
  93. m_flFadeDuration = 0;
  94. m_flFadeTimeStartedAt = 0;
  95. m_flFadeAlphaStartedAt = 0;
  96. m_hCameraEntity = NULL;
  97. m_iPrevFOV = 0;
  98. m_iStartFOV = 0;
  99. g_pIntroData = NULL;
  100. // Setup fade colors
  101. m_IntroData.m_flCurrentFadeColor[0] = m_flFadeColor[0];
  102. m_IntroData.m_flCurrentFadeColor[1] = m_flFadeColor[1];
  103. m_IntroData.m_flCurrentFadeColor[2] = m_flFadeColor[2];
  104. m_IntroData.m_flCurrentFadeColor[3] = m_flFadeAlpha;
  105. }
  106. //-----------------------------------------------------------------------------
  107. // Purpose:
  108. //-----------------------------------------------------------------------------
  109. C_ScriptIntro::~C_ScriptIntro( void )
  110. {
  111. g_pIntroData = NULL;
  112. }
  113. //-----------------------------------------------------------------------------
  114. // Purpose:
  115. //-----------------------------------------------------------------------------
  116. void C_ScriptIntro::PostDataUpdate( DataUpdateType_t updateType )
  117. {
  118. BaseClass::PostDataUpdate( updateType );
  119. SetNextClientThink( CLIENT_THINK_ALWAYS );
  120. // Fill out the intro data
  121. m_IntroData.m_vecCameraView = m_vecCameraView;
  122. m_IntroData.m_vecCameraViewAngles = m_vecCameraViewAngles;
  123. m_IntroData.m_Passes.SetCount( 0 );
  124. // Find/Create our first pass
  125. IntroDataBlendPass_t *pass1;
  126. if ( m_IntroData.m_Passes.Count() == 0 )
  127. {
  128. pass1 = &m_IntroData.m_Passes[m_IntroData.m_Passes.AddToTail()];
  129. }
  130. else
  131. {
  132. pass1 = &m_IntroData.m_Passes[0];
  133. }
  134. Assert(pass1);
  135. pass1->m_BlendMode = m_iBlendMode;
  136. pass1->m_Alpha = 1.0f;
  137. if ( m_vecCameraView == vec3_origin )
  138. {
  139. m_IntroData.m_bDrawPrimary = false;
  140. }
  141. else
  142. {
  143. m_IntroData.m_bDrawPrimary = true;
  144. }
  145. // If we're currently blending to a new mode, set the second pass
  146. if ( m_flNextBlendTime > gpGlobals->curtime )
  147. {
  148. IntroDataBlendPass_t *pass2;
  149. if ( m_IntroData.m_Passes.Count() < 2 )
  150. {
  151. pass2 = &m_IntroData.m_Passes[m_IntroData.m_Passes.AddToTail()];
  152. //Msg("STARTED BLEND: Mode %d to %d.\n", m_IntroData.m_Passes[0].m_BlendMode, m_iNextBlendMode );
  153. }
  154. else
  155. {
  156. pass2 = &m_IntroData.m_Passes[1];
  157. Assert( pass2->m_BlendMode == m_iNextBlendMode );
  158. }
  159. Assert(pass2);
  160. pass2->m_BlendMode = m_iNextBlendMode;
  161. pass2->m_Alpha = 0.0f;
  162. }
  163. else if ( m_IntroData.m_Passes.Count() == 2 )
  164. {
  165. C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
  166. if ( !player )
  167. return;
  168. //Msg("FINISHED BLEND.\n");
  169. m_IntroData.m_Passes.Remove(1);
  170. }
  171. // Set the introdata our data chunk
  172. if ( m_bActive )
  173. {
  174. g_pIntroData = &m_IntroData;
  175. }
  176. else if ( g_pIntroData == &m_IntroData )
  177. {
  178. g_pIntroData = NULL;
  179. }
  180. // Update the fade color
  181. m_IntroData.m_flCurrentFadeColor[0] = m_flFadeColor[0];
  182. m_IntroData.m_flCurrentFadeColor[1] = m_flFadeColor[1];
  183. m_IntroData.m_flCurrentFadeColor[2] = m_flFadeColor[2];
  184. // Started fading?
  185. if ( m_flFadeAlpha != m_flPrevServerFadeAlpha )
  186. {
  187. m_flFadeTimeStartedAt = gpGlobals->curtime;
  188. m_flFadeAlphaStartedAt = m_IntroData.m_flCurrentFadeColor[3];
  189. m_flPrevServerFadeAlpha = m_flFadeAlpha;
  190. if ( !m_flFadeDuration )
  191. {
  192. m_flFadeDuration = 0.01;
  193. }
  194. //Msg("STARTING NEW FADE: alpha %.2f, duration %.2f.\n", m_flFadeAlpha, m_flFadeDuration );
  195. }
  196. if ( m_iPrevFOV != m_iFOV )
  197. {
  198. m_IntroData.m_playerViewFOV = m_iFOV;
  199. m_iPrevFOV = m_iFOV;
  200. }
  201. }
  202. //-----------------------------------------------------------------------------
  203. // Purpose:
  204. //-----------------------------------------------------------------------------
  205. void C_ScriptIntro::ClientThink( void )
  206. {
  207. Assert( m_IntroData.m_Passes.Count() <= 2 );
  208. if ( m_hCameraEntity )
  209. {
  210. m_IntroData.m_vecCameraView = m_hCameraEntity->GetAbsOrigin();
  211. m_IntroData.m_vecCameraViewAngles = m_hCameraEntity->GetAbsAngles();
  212. }
  213. CalculateFOV();
  214. CalculateAlpha();
  215. // Calculate the blend levels of each pass
  216. float flPerc = 1.0;
  217. if ( (m_flNextBlendTime - m_flBlendStartTime) != 0 )
  218. {
  219. flPerc = clamp( (gpGlobals->curtime - m_flBlendStartTime) / (m_flNextBlendTime - m_flBlendStartTime), 0, 1 );
  220. }
  221. // Detect when we're finished blending
  222. if ( flPerc >= 1.0 )
  223. {
  224. if ( m_IntroData.m_Passes.Count() == 2 )
  225. {
  226. // We're done blending
  227. m_IntroData.m_Passes[0].m_BlendMode = m_IntroData.m_Passes[1].m_BlendMode;
  228. m_IntroData.m_Passes[0].m_Alpha = 1.0;
  229. m_IntroData.m_Passes.Remove(1);
  230. //Msg("FINISHED BLEND.\n");
  231. }
  232. else
  233. {
  234. m_IntroData.m_Passes[0].m_Alpha = 1.0f;
  235. }
  236. return;
  237. }
  238. /*
  239. if ( m_flNextBlendTime >= gpGlobals->curtime )
  240. {
  241. Msg("INTRO BLENDING: Blending from mode %d to %d.\n", m_IntroData.m_Passes[0].m_BlendMode, m_IntroData.m_Passes[1].m_BlendMode );
  242. Msg(" curtime %.2f StartedAt %.2f FinishAt: %.2f\n", gpGlobals->curtime, m_flBlendStartTime, m_flNextBlendTime );
  243. Msg(" Perc: %.2f\n", flPerc );
  244. }
  245. */
  246. if ( m_IntroData.m_Passes.Count() == 2 )
  247. {
  248. m_IntroData.m_Passes[0].m_Alpha = 1.0 - flPerc;
  249. m_IntroData.m_Passes[1].m_Alpha = flPerc;
  250. }
  251. else
  252. {
  253. m_IntroData.m_Passes[0].m_Alpha = 1.0 - flPerc;
  254. }
  255. }
  256. extern float ScriptInfo_CalculateFOV( float flFOVBlendStartTime, float flNextFOVBlendTime, int nFOV, int nNextFOV, bool bSplineRamp );
  257. //-----------------------------------------------------------------------------
  258. // Purpose:
  259. //-----------------------------------------------------------------------------
  260. void C_ScriptIntro::CalculateFOV( void )
  261. {
  262. // We're past our blending time so we're at our target
  263. if ( m_flNextFOVBlendTime >= gpGlobals->curtime )
  264. {
  265. // Calculate where we're at
  266. m_IntroData.m_playerViewFOV = ScriptInfo_CalculateFOV( m_flFOVBlendStartTime, m_flNextFOVBlendTime, m_iStartFOV, m_iNextFOV, m_bAlternateFOV );
  267. }
  268. }
  269. //-----------------------------------------------------------------------------
  270. // Purpose:
  271. //-----------------------------------------------------------------------------
  272. void C_ScriptIntro::CalculateAlpha( void )
  273. {
  274. // Fill out the fade alpha
  275. float flNewAlpha = RemapValClamped( gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeTimeStartedAt + m_flFadeDuration, m_flFadeAlphaStartedAt, m_flFadeAlpha );
  276. /*
  277. if ( m_IntroData.m_flCurrentFadeColor[3] != flNewAlpha )
  278. {
  279. Msg("INTRO FADING: curtime %.2f StartedAt %.2f Duration: %.2f\n", gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeDuration );
  280. Msg(" TimePassed %.2f Alpha: %.2f\n", RemapValClamped( gpGlobals->curtime, m_flFadeTimeStartedAt, m_flFadeTimeStartedAt + m_flFadeDuration, 0.0, 1.0 ), m_IntroData.m_flCurrentFadeColor[3] );
  281. }
  282. */
  283. m_IntroData.m_flCurrentFadeColor[3] = flNewAlpha;
  284. }