PageRenderTime 26ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Code/GameSDK/GameDll/Effects/GameEffects/KillCamGameEffect.cpp

https://gitlab.com/blackbird91/CS188_AI_Game
C++ | 431 lines | 286 code | 50 blank | 95 comment | 41 complexity | 5885cca8b39b2f4e2681de5f3e8ab469 MD5 | raw file
  1. /*
  2. * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
  3. * its licensors.
  4. *
  5. * For complete copyright and license terms please see the LICENSE at the root of this
  6. * distribution (the "License"). All use of this software is governed by the License,
  7. * or, if provided, by the license below or the license accompanying this file. Do not
  8. * remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
  9. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. *
  11. */
  12. // Original file Copyright Crytek GMBH or its affiliates, used under license.
  13. #include "StdAfx.h"
  14. #include "KillCamGameEffect.h"
  15. #include "ItemParams.h"
  16. #include "Effects/Tools/CVarActivationSystem.h"
  17. #include "Effects/Tools/PostEffectActivationSystem.h"
  18. #include "Network/Lobby/GameLobby.h"
  19. #include "UI/UIManager.h"
  20. #include "UI/UIHUD3D.h"
  21. REGISTER_EFFECT_DEBUG_DATA(CKillCamGameEffect::DebugOnInputEvent,CKillCamGameEffect::DebugDisplay,KillCam);
  22. REGISTER_DATA_CALLBACKS(CKillCamGameEffect::LoadStaticData,CKillCamGameEffect::ReleaseStaticData,CKillCamGameEffect::ReloadStaticData,KillCamData);
  23. // Soft-coding:
  24. IMPLEMENT_TYPE(CKillCamGameEffect); // Provides the factory creation and access to reflection
  25. //--------------------------------------------------------------------------------------------------
  26. // Desc: Static data
  27. //--------------------------------------------------------------------------------------------------
  28. const char* KILL_CAM_GAME_EFFECT_NAME = "Kill Cam";
  29. const char* KILL_CAM_GAME_EFFECT_MODE_NAMES[] =
  30. {
  31. "KillCam",
  32. "KillerCam",
  33. "IntroCam"
  34. };
  35. CKillCamGameEffect::SEffectData CKillCamGameEffect::s_data[eKCEM_TotalModes];
  36. //--------------------------------------------------------------------------------------------------
  37. //--------------------------------------------------------------------------------------------------
  38. // Name: CKillCamGameEffect
  39. // Desc: Constructor
  40. //--------------------------------------------------------------------------------------------------
  41. CKillCamGameEffect::CKillCamGameEffect()
  42. : m_currentMode(eKCEM_KillCam)
  43. , m_activeTime(0.f)
  44. , m_originalBrightness(1.f)
  45. {
  46. }//-------------------------------------------------------------------------------------------------
  47. //--------------------------------------------------------------------------------------------------
  48. // Name: ~CKillCamGameEffect
  49. // Desc: Destructor
  50. //--------------------------------------------------------------------------------------------------
  51. CKillCamGameEffect::~CKillCamGameEffect()
  52. {
  53. }
  54. //-------------------------------------------------------------------------------------------------
  55. //--------------------------------------------------------------------------------------------------
  56. // Name: Initialise
  57. // Desc: Initializes game effect
  58. //--------------------------------------------------------------------------------------------------
  59. void CKillCamGameEffect::Initialise(const SGameEffectParams* gameEffectParams)
  60. {
  61. SKillCamGameEffectParams killCamGameEffectParams;
  62. if(gameEffectParams)
  63. {
  64. killCamGameEffectParams = *(SKillCamGameEffectParams*)(gameEffectParams);
  65. }
  66. GameSDKCGameEffect::Initialise(&killCamGameEffectParams);
  67. for( int i=0; i<eKCEM_TotalModes; i++ )
  68. {
  69. m_letterBox[i].Initialise(&s_data[i].letterBox);
  70. }
  71. }//-------------------------------------------------------------------------------------------------
  72. //--------------------------------------------------------------------------------------------------
  73. // Name: Release
  74. // Desc: Releases game effect
  75. //--------------------------------------------------------------------------------------------------
  76. void CKillCamGameEffect::Release()
  77. {
  78. SetActive(false);
  79. GameSDKCGameEffect::Release();
  80. }//-------------------------------------------------------------------------------------------------
  81. //--------------------------------------------------------------------------------------------------
  82. // Name: Update
  83. // Desc: Updates the Effect.
  84. //--------------------------------------------------------------------------------------------------
  85. void CKillCamGameEffect::Update( float frameTime )
  86. {
  87. GameSDKCGameEffect::Update(frameTime);
  88. if(IsFlagSet(GAME_EFFECT_ACTIVE))
  89. {
  90. m_activeTime+=frameTime;
  91. const SEffectData& data = s_data[m_currentMode];
  92. if(data.chromaFadeTimeInv>0.f)
  93. {
  94. const float scale = clamp_tpl( 1.f-(m_activeTime*data.chromaFadeTimeInv), 0.f, 1.f );
  95. if(scale>0.01f)
  96. {
  97. static float chromabase = 0.1f;
  98. static float chromaStrength = 2.5f;
  99. static const Vec4 chroma(chromabase,chromabase,chromabase,chromaStrength);
  100. static float colorbase = 1.2f;
  101. static float grain = 2.f;
  102. static const Vec4 color(colorbase,colorbase,colorbase,grain);
  103. gEnv->pRenderer->EF_SetPostEffectParam("FilterKillCamera_Active", 1.f);
  104. gEnv->pRenderer->EF_SetPostEffectParamVec4("FilterKillCamera_ChromaShift", chroma*scale);
  105. gEnv->pRenderer->EF_SetPostEffectParamVec4("FilterKillCamera_ColorScale", color*scale);
  106. }
  107. else
  108. {
  109. gEnv->pRenderer->EF_SetPostEffectParamVec4("FilterKillCamera_ChromaShift", Vec4(0.f,0.f,0.f,0.f));
  110. gEnv->pRenderer->EF_SetPostEffectParamVec4("FilterKillCamera_ColorScale", Vec4(0.f,0.f,0.f,0.f));
  111. }
  112. }
  113. if(data.fadeOutTimeInv>0.f)
  114. {
  115. if(m_remainingTime>=0.f)
  116. {
  117. m_remainingTime = (float)fsel(m_remainingTime-frameTime,m_remainingTime-frameTime,0.f);
  118. const float blackOut = SmoothBlendValue(clamp_tpl(1.f-(m_remainingTime*data.fadeOutTimeInv),0.f,1.f));
  119. const float brightness = LERP(m_originalBrightness,0.f,blackOut);
  120. gEnv->pRenderer->EF_SetPostEffectParam("Global_User_Brightness", brightness);
  121. }
  122. }
  123. }
  124. }
  125. //--------------------------------------------------------------------------------------------------
  126. // Name: GetName
  127. // Desc: Gets effect's name
  128. //--------------------------------------------------------------------------------------------------
  129. const char* CKillCamGameEffect::GetName() const
  130. {
  131. return KILL_CAM_GAME_EFFECT_NAME;
  132. }//-------------------------------------------------------------------------------------------------
  133. //--------------------------------------------------------------------------------------------------
  134. // Name: SetActive
  135. // Desc: Sets active status of effect
  136. //--------------------------------------------------------------------------------------------------
  137. void CKillCamGameEffect::SetActive(bool isActive)
  138. {
  139. if(s_data[m_currentMode].isInitialised)
  140. {
  141. CUIHUD3D *pHUD = UIEvents::Get<CUIHUD3D>();
  142. if(pHUD)
  143. {
  144. pHUD->SetVisible(!isActive);
  145. }
  146. if(isActive)
  147. {
  148. Start();
  149. }
  150. else
  151. {
  152. Stop();
  153. }
  154. GameSDKCGameEffect::SetActive(isActive);
  155. }
  156. }//-------------------------------------------------------------------------------------------------
  157. //--------------------------------------------------------------------------------------------------
  158. // Name: Start
  159. // Desc: Starts effect
  160. //--------------------------------------------------------------------------------------------------
  161. void CKillCamGameEffect::Start()
  162. {
  163. if(IsFlagSet(GAME_EFFECT_ACTIVE) == false)
  164. {
  165. m_letterBox[m_currentMode].Register();
  166. m_activeTime = 0.f;
  167. m_remainingTime = -1.f;
  168. s_data[m_currentMode].cvarActivationSystem.StoreCurrentValues();
  169. s_data[m_currentMode].cvarActivationSystem.SetCVarsActive(true);
  170. }
  171. // Outside to re-apply if already started.
  172. // This fixes an issue where the reset of all fx is deferred and overwrites these.
  173. s_data[m_currentMode].postEffectActivationSystem.SetPostEffectsActive(true);
  174. if(s_data[m_currentMode].fadeOutTimeInv>0.f)
  175. {
  176. gEnv->pRenderer->EF_GetPostEffectParam("Global_User_Brightness", m_originalBrightness);
  177. }
  178. }//-------------------------------------------------------------------------------------------------
  179. //--------------------------------------------------------------------------------------------------
  180. // Name: Stop
  181. // Desc: Stops effect
  182. //--------------------------------------------------------------------------------------------------
  183. void CKillCamGameEffect::Stop()
  184. {
  185. if(IsFlagSet(GAME_EFFECT_ACTIVE))
  186. {
  187. const int curMode = m_currentMode;
  188. m_letterBox[curMode].UnRegister();
  189. s_data[curMode].cvarActivationSystem.SetCVarsActive(false);
  190. s_data[curMode].postEffectActivationSystem.SetPostEffectsActive(false);
  191. }
  192. }//-------------------------------------------------------------------------------------------------
  193. //////////////////////////////////////////////////////////////////////////
  194. //STATIC
  195. //--------------------------------------------------------------------------------------------------
  196. // Name: LoadStaticData
  197. // Desc: Loads static data for KillCam
  198. //--------------------------------------------------------------------------------------------------
  199. void CKillCamGameEffect::LoadStaticData(IItemParamsNode* rootNode)
  200. {
  201. CGameLobby* pGameLobby = g_pGame->GetGameLobby();
  202. const char * pLevelName = pGameLobby ? pGameLobby->GetCurrentLevelName() : "";
  203. const int children = rootNode->GetChildCount();
  204. for( int m=0; m<eKCEM_TotalModes; m++ )
  205. {
  206. for( int i=0; i<children; i++ )
  207. {
  208. const IItemParamsNode* paramNode = rootNode->GetChild(i);
  209. if(!stricmp(paramNode->GetName(), KILL_CAM_GAME_EFFECT_MODE_NAMES[m]))
  210. {
  211. if(pLevelName)
  212. {
  213. if(const char* pSpecificLevel = paramNode->GetAttribute("level"))
  214. {
  215. if(stricmp(pSpecificLevel, pLevelName))
  216. {
  217. continue;
  218. }
  219. }
  220. }
  221. LoadStaticModeData(paramNode, s_data[m]);
  222. }
  223. }
  224. }
  225. }
  226. //--------------------------------------------------------------------------------------------------
  227. // Name: LoadStaticModeData
  228. // Desc: Loads static data effect mode.
  229. //--------------------------------------------------------------------------------------------------
  230. void CKillCamGameEffect::LoadStaticModeData( const IItemParamsNode* paramNode, SEffectData& data )
  231. {
  232. if(paramNode)
  233. {
  234. // Initialise CVars
  235. data.cvarActivationSystem.Initialise(paramNode->GetChild("CVars"));
  236. // Find the Contrast and Brightness PostEffect values.
  237. data.baseContrast = data.baseBrightness = 1.f;
  238. if(const IItemParamsNode* pPostEffectsNode = paramNode->GetChild("PostEffects"))
  239. {
  240. const int childCount = pPostEffectsNode->GetChildCount();
  241. int paramIndex=0;
  242. for(int i=0; i<childCount; i++)
  243. {
  244. const IItemParamsNode* pChildNode = pPostEffectsNode->GetChild(i);
  245. {
  246. if(!strcmp(pChildNode->GetName(),"Global_User_Contrast"))
  247. {
  248. pChildNode->GetAttribute("activeValue", data.baseContrast);
  249. }
  250. else if(!strcmp(pChildNode->GetName(),"Global_User_Brightness"))
  251. {
  252. pChildNode->GetAttribute("activeValue", data.baseBrightness);
  253. }
  254. }
  255. }
  256. // Initialise post effects
  257. data.postEffectActivationSystem.Initialise(pPostEffectsNode);
  258. }
  259. // Initialise letter box
  260. const IItemParamsNode* letterBoxXmlNode = paramNode->GetChild("letterBox");
  261. if(letterBoxXmlNode)
  262. {
  263. letterBoxXmlNode->GetAttribute("scale",data.letterBox.scale);
  264. letterBoxXmlNode->GetAttribute("red",data.letterBox.color.r);
  265. letterBoxXmlNode->GetAttribute("green",data.letterBox.color.g);
  266. letterBoxXmlNode->GetAttribute("blue",data.letterBox.color.b);
  267. letterBoxXmlNode->GetAttribute("alpha",data.letterBox.color.a);
  268. }
  269. // Chroma Fade in.
  270. data.chromaFadeTimeInv = 0.f;
  271. if(paramNode->GetAttribute("chromaFadeTime", data.chromaFadeTimeInv)) { data.chromaFadeTimeInv=fres(data.chromaFadeTimeInv); }
  272. // Fade Out Time.
  273. data.fadeOutTimeInv = 0.f;
  274. if(paramNode->GetAttribute("fadeOutTime", data.fadeOutTimeInv)) { data.fadeOutTimeInv=fres(data.fadeOutTimeInv); }
  275. data.isInitialised = true;
  276. }
  277. }
  278. //--------------------------------------------------------------------------------------------------
  279. // Name: ReloadStaticData
  280. // Desc: Reloads static data
  281. //--------------------------------------------------------------------------------------------------
  282. void CKillCamGameEffect::ReloadStaticData(IItemParamsNode* rootNode)
  283. {
  284. ReleaseStaticData();
  285. LoadStaticData(rootNode);
  286. #if DEBUG_GAME_FX_SYSTEM
  287. // Data has been reloaded, so re-initialse debug effect with new data
  288. CKillCamGameEffect* pDebugKillCamEffect = (CKillCamGameEffect*)GAME_FX_SYSTEM.GetDebugEffect(KILL_CAM_GAME_EFFECT_NAME);
  289. if(pDebugKillCamEffect && pDebugKillCamEffect->IsFlagSet(GAME_EFFECT_REGISTERED))
  290. {
  291. pDebugKillCamEffect->Initialise();
  292. // Re-activate effect if currently active, so HUD Letter box will register correctly
  293. if(pDebugKillCamEffect->IsFlagSet(GAME_EFFECT_ACTIVE))
  294. {
  295. pDebugKillCamEffect->SetActive(false);
  296. pDebugKillCamEffect->SetActive(true);
  297. }
  298. }
  299. #endif
  300. }
  301. //--------------------------------------------------------------------------------------------------
  302. // Name: ReleaseStaticData
  303. // Desc: Releases static data
  304. //--------------------------------------------------------------------------------------------------
  305. void CKillCamGameEffect::ReleaseStaticData()
  306. {
  307. for( int i=0; i<eKCEM_TotalModes; i++ )
  308. {
  309. if(s_data[i].isInitialised)
  310. {
  311. s_data[i].cvarActivationSystem.Release();
  312. s_data[i].postEffectActivationSystem.Release();
  313. s_data[i].isInitialised = false;
  314. }
  315. }
  316. }
  317. //-------------------------------------------------------------------------------------------------
  318. //////////////////////////////////////////////////////////////////////////
  319. // DEBUG
  320. #if DEBUG_GAME_FX_SYSTEM
  321. static int debugMode = 0;
  322. //--------------------------------------------------------------------------------------------------
  323. // Name: DebugOnInputEvent
  324. // Desc: Called when input events happen in debug builds
  325. //--------------------------------------------------------------------------------------------------
  326. void CKillCamGameEffect::DebugOnInputEvent(int keyId)
  327. {
  328. if(s_data[debugMode].isInitialised)
  329. {
  330. CKillCamGameEffect* pKillCamEffect = (CKillCamGameEffect*)GAME_FX_SYSTEM.GetDebugEffect(KILL_CAM_GAME_EFFECT_NAME);
  331. // Create debug effect for development
  332. if(pKillCamEffect == NULL)
  333. {
  334. SKillCamGameEffectParams killCamInitParams;
  335. killCamInitParams.autoDelete = true;
  336. pKillCamEffect = CREATE_GAME_FX_SOFT_CODE_INSTANCE(CKillCamGameEffect);
  337. if(pKillCamEffect)
  338. {
  339. pKillCamEffect->Initialise(&killCamInitParams);
  340. pKillCamEffect->SetFlag(GAME_EFFECT_DEBUG_EFFECT,true);
  341. }
  342. }
  343. // Read input
  344. if(pKillCamEffect && !pKillCamEffect->IsFlagSet(GAME_EFFECT_RELEASED))
  345. {
  346. switch(keyId)
  347. {
  348. case eKI_NP_1:
  349. {
  350. pKillCamEffect->SetActive(true);
  351. break;
  352. }
  353. case eKI_NP_2:
  354. {
  355. pKillCamEffect->SetActive(false);
  356. break;
  357. }
  358. }
  359. }
  360. }
  361. }//-------------------------------------------------------------------------------------------------
  362. //--------------------------------------------------------------------------------------------------
  363. // Name: DebugDisplay
  364. // Desc: Display when this effect is selected to debug through the game effects system
  365. //--------------------------------------------------------------------------------------------------
  366. void CKillCamGameEffect::DebugDisplay(const Vec2& textStartPos,float textSize,float textYStep)
  367. {
  368. ColorF textCol(1.0f,1.0f,0.0f,1.0f);
  369. Vec2 currentTextPos = textStartPos;
  370. if(s_data[debugMode].isInitialised)
  371. {
  372. gEnv->pRenderer->Draw2dLabel(currentTextPos.x,currentTextPos.y,textSize,&textCol.r,false,"Turn on: NumPad 1");
  373. currentTextPos.y += textYStep;
  374. gEnv->pRenderer->Draw2dLabel(currentTextPos.x,currentTextPos.y,textSize,&textCol.r,false,"Turn off: NumPad 2");
  375. }
  376. else
  377. {
  378. gEnv->pRenderer->Draw2dLabel(currentTextPos.x,currentTextPos.y,textSize,&textCol.r,false,"Effect failed to load data");
  379. }
  380. }//-------------------------------------------------------------------------------------------------
  381. #endif