424 lines
13 KiB
C++
424 lines
13 KiB
C++
/*
|
|
=====================================================================
|
|
FILE : 3dEngineScreenEffects.cpp
|
|
DESC : Screen processing effects
|
|
PROJ : Crytek Engine
|
|
CODER: Tiago Sousa
|
|
|
|
Last Update: 09/12/2003
|
|
TODO:
|
|
.Clean up code...
|
|
.Remove all SCREEN_PROCESS stuff (Set/GetParameter, etc)
|
|
=====================================================================
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "3dEngine.h"
|
|
#include "objman.h"
|
|
#include "../RenderDll/Common/RendElements/CREScreenCommon.h"
|
|
|
|
// some helper macros
|
|
#define GET_ACTIVEPARAMETER(pProcess) \
|
|
*((bool*)m_pREScreenProcess->mfGetParameter((pProcess), SCREENPROCESS_ACTIVE)) \
|
|
|
|
#define GET_CVAR(pVar)\
|
|
(GetConsole()->GetCVar((pVar)))\
|
|
|
|
// interfaces for script usage
|
|
|
|
// set screen mask texture
|
|
void C3DEngine:: SetBlurMask(ITexPic *pMask)
|
|
{
|
|
if(!m_pBlurObj)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//m_pBlurObj->SetBlurMask((STexPic*) pMask);
|
|
}
|
|
|
|
// set screen mask texture
|
|
void C3DEngine:: SetScreenMask(ITexPic *pMask)
|
|
{
|
|
if(!m_pScreenObj)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//m_pScreenObj->SetScreenMask((STexPic*) pMask);
|
|
}
|
|
|
|
// setup current screen fx
|
|
void C3DEngine:: SetScreenFx(const char *pEffectName, int iActive)
|
|
{
|
|
bool bActive=iActive? 1:0;
|
|
// to avoid an untreackable crash in mscvdll strcmp
|
|
if (!pEffectName)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!strcmp(pEffectName, "NightVision"))
|
|
{
|
|
int iActive=bActive;
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_NIGHTVISION, SCREENPROCESS_ACTIVE, &iActive);
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "HeatVision"))
|
|
{
|
|
int iActive=bActive;
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_HEATVISION, SCREENPROCESS_ACTIVE, &iActive);
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "ScreenBlur"))
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_ACTIVE, &bActive);
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "FlashBang"))
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_ACTIVE, &bActive);
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "ScreenFade"))
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FADE, SCREENPROCESS_ACTIVE, &bActive);
|
|
}
|
|
}
|
|
|
|
// Setup current screen fx parameter
|
|
void C3DEngine:: SetScreenFxParam(const char *pEffectName, const char *pEffectParam, void *pValue)
|
|
{
|
|
// <<TODO>> add required/missing parameters
|
|
|
|
// to avoid an untreackable crash in mscvdll strcmp
|
|
if (!pEffectName || !pEffectParam)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// set parameters for screen fade
|
|
if(!stricmp(pEffectName, "ScreenFade"))
|
|
{
|
|
if(!stricmp(pEffectParam, "ScreenFadeTime")) // set screen fade flag
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FADE, SCREENPROCESS_TRANSITIONTIME, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenPreFadeTime")) // set screen pre fade flag (count number of frames, before start fading)
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FADE, SCREENPROCESS_PRETRANSITIONTIME, pValue);
|
|
}
|
|
}
|
|
else
|
|
if(!stricmp(pEffectName, "ScreenBlur")) // set parameters for screen blur
|
|
{
|
|
if(!stricmp(pEffectParam, "ScreenBlurAmount")) // screen blur amount
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURAMOUNT, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorRed")) // screen blur color red..
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORRED, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorGreen")) // screen blur color green..
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORGREEN, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorBlue")) // screen blur color blue..
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORBLUE, pValue);
|
|
}
|
|
}
|
|
else // get parameters for flashbang
|
|
if(!stricmp(pEffectName, "FlashBang"))
|
|
{
|
|
if(!stricmp(pEffectParam, "FlashBangTimeScale")) // flashbang timeout
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGTIMESCALE, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashPosX")) // flashbangflash position x
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHPOSX, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashPosY")) // flashbangflash position y
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHPOSY, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashSizeX")) // flashbangflash size x
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHSIZEX, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashSizeY")) // flashbangflash size y
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHSIZEY, pValue);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangForce")) // force flashbang after image texture creation
|
|
{
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFORCEAFTERIMAGE, pValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
int C3DEngine::GetScreenFx(const char *pEffectName)
|
|
{
|
|
// to avoid an untreackable crash in mscvdll strcmp
|
|
if (!pEffectName)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if(!strcmp(pEffectName, "NightVision"))
|
|
{
|
|
bool bVal=*((bool*)m_pREScreenProcess->mfGetParameter(SCREENPROCESS_NIGHTVISION, SCREENPROCESS_ACTIVE));
|
|
return bVal;
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "HeatVision"))
|
|
{
|
|
bool bVal=*((bool*)m_pREScreenProcess->mfGetParameter(SCREENPROCESS_HEATVISION, SCREENPROCESS_ACTIVE));
|
|
return bVal;
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "ScreenBlur"))
|
|
{
|
|
bool bVal=*((bool*)m_pREScreenProcess->mfGetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_ACTIVE));
|
|
return bVal;
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "FlashBang"))
|
|
{
|
|
bool bVal=*((bool*)m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_ACTIVE));
|
|
return (int)bVal;
|
|
}
|
|
else
|
|
if(!strcmp(pEffectName, "ScreenFade"))
|
|
{
|
|
bool bVal=*((bool*)m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FADE, SCREENPROCESS_ACTIVE));
|
|
return bVal;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int C3DEngine::GetScreenFxParam(const char *pEffectName, const char *pEffectParam, void *&pValue)
|
|
{
|
|
// to avoid an untreackable crash in mscvdll strcmp
|
|
if (!pEffectName || !pEffectParam)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// get parameters for screen fade
|
|
if(!stricmp(pEffectName, "ScreenFade"))
|
|
{
|
|
if(!stricmp(pEffectParam, "ScreenFadeTime")) // set screen fade flag
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FADE, SCREENPROCESS_TRANSITIONTIME);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenPreFadeTime")) // set screen pre fade flag (count number of frames, before start fading)
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FADE, SCREENPROCESS_PRETRANSITIONTIME);
|
|
}
|
|
else
|
|
{
|
|
// parameter doens't exist
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
if(!stricmp(pEffectName, "ScreenBlur")) // get parameters for screen blur
|
|
{
|
|
if(!stricmp(pEffectParam, "ScreenBlurAmount")) // screen blur amount
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURAMOUNT);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorRed")) // screen blur color red..
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORRED);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorGreen")) // screen blur color green..
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORGREEN);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "ScreenBlurColorBlue")) // screen blur color blue..
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_BLUR, SCREENPROCESS_BLURCOLORBLUE);
|
|
}
|
|
else
|
|
{
|
|
// parameter doens't exist
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
if(!stricmp(pEffectName, "FlashBang")) // get parameters for flashbang
|
|
{
|
|
if(!stricmp(pEffectParam, "FlashBangTimeScale")) // flashbang timeout
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGTIMESCALE);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashPosX")) // flashbangflash position x
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHPOSX);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashPosY")) // flashbangflash position y
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHPOSY);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashSizeX")) // flashbangflash size x
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHSIZEX);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangFlashSizeY")) // flashbangflash size y
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFLASHSIZEY);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangTimeOut")) // get current time out time
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGTIMEOUT);
|
|
}
|
|
else
|
|
if(!stricmp(pEffectParam, "FlashBangForce")) // force flashbang after image texture creation
|
|
{
|
|
pValue=m_pREScreenProcess->mfGetParameter(SCREENPROCESS_FLASHBANG, SCREENPROCESS_FLASHBANGFORCEAFTERIMAGE);
|
|
}
|
|
else
|
|
{
|
|
// parameter doens't exist
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// parameter doens't exist
|
|
return -1;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
// reset current screen effects
|
|
void C3DEngine::ResetScreenFx(void)
|
|
{
|
|
if(m_pREScreenProcess)
|
|
{
|
|
m_pREScreenProcess->mfReset();
|
|
}
|
|
}
|
|
|
|
// process all screen space special fx's
|
|
void C3DEngine::ProcessScreenEffects()
|
|
{
|
|
// don't allow this in recursive rendering..
|
|
if(m_pObjManager->m_nRenderStackLevel!=0 || !m_pREScreenProcess)
|
|
{
|
|
return;
|
|
}
|
|
|
|
FUNCTION_PROFILER( GetSystem(), PROFILE_RENDERER );
|
|
|
|
// get console vars
|
|
static ICVar *pDisableSfx=GET_CVAR("r_DisableSfx");
|
|
static ICVar *pResetSfx=GET_CVAR("r_ResetScreenFx");
|
|
|
|
// reset screen effects state
|
|
if(pResetSfx->GetIVal()!=0)
|
|
{
|
|
m_pREScreenProcess->mfReset();
|
|
}
|
|
|
|
// disable fx's
|
|
if(!pDisableSfx->GetIVal())
|
|
{
|
|
static ICVar *pNormalGlare=GET_CVAR("r_Glare");
|
|
static ICVar *pMotionBlur=GET_CVAR("r_MotionBlur");
|
|
static ICVar *pScreenColorTransfer=GET_CVAR("r_ScreenColorTransfer");
|
|
static ICVar *pMotionBlurAmount=GET_CVAR("r_MotionBlurAmount");
|
|
static ICVar *pMotionBlurDisplace=GET_CVAR("r_MotionBlurDisplace");
|
|
static ICVar *pRenderMode=GET_CVAR("r_RenderMode");
|
|
|
|
// get console vars values
|
|
int iUseMotionBlur=pMotionBlur->GetIVal();
|
|
int iRenderMode=pRenderMode->GetIVal();
|
|
int iUseGlare=((pNormalGlare->GetIVal()) && (iRenderMode>0));
|
|
|
|
// activate fx's
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_MOTIONBLUR, SCREENPROCESS_ACTIVE, &iUseMotionBlur);
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_GLARE, SCREENPROCESS_ACTIVE, &iUseGlare);
|
|
|
|
// cartoon render mode active ?
|
|
bool bCartoon=0;
|
|
if(iRenderMode==4)
|
|
{
|
|
bCartoon=1;
|
|
}
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_CARTOON, SCREENPROCESS_ACTIVE, &bCartoon);
|
|
|
|
// get screen texture if necessary
|
|
if(GET_ACTIVEPARAMETER(SCREENPROCESS_FLASHBANG) || GET_ACTIVEPARAMETER(SCREENPROCESS_COLORTRANSFER) ||
|
|
GET_ACTIVEPARAMETER(SCREENPROCESS_BLUR) || GET_ACTIVEPARAMETER(SCREENPROCESS_NIGHTVISION) ||
|
|
GET_ACTIVEPARAMETER(SCREENPROCESS_HEATVISION) || GET_ACTIVEPARAMETER(SCREENPROCESS_GLARE) ||
|
|
GET_ACTIVEPARAMETER(SCREENPROCESS_CARTOON) ||GET_ACTIVEPARAMETER(SCREENPROCESS_MOTIONBLUR))
|
|
{
|
|
CCObject *pScreenObj=GetRenderer()->EF_GetObject(true, -1);
|
|
pScreenObj->m_Matrix.SetIdentity();
|
|
GetRenderer()->EF_AddEf(0, m_pREDummy, m_pSHScreenTexMap, NULL, pScreenObj, 0, NULL, eS_Glare);
|
|
}
|
|
|
|
// process screen glare/set glare parameters
|
|
if(GET_ACTIVEPARAMETER(SCREENPROCESS_GLARE))
|
|
{
|
|
IVisArea *pCurrLocation= GetVisAreaFromPos(GetViewCamera().GetPos());
|
|
|
|
static ICVar *pGlareQuality=GET_CVAR("r_GlareQuality");
|
|
if(pGlareQuality->GetIVal()!=4)
|
|
{
|
|
if(!pCurrLocation)
|
|
{
|
|
pNormalGlare->Set(2);
|
|
}
|
|
else
|
|
{
|
|
pNormalGlare->Set(3);
|
|
}
|
|
}
|
|
}
|
|
|
|
// activate motion blur
|
|
if(GET_ACTIVEPARAMETER(SCREENPROCESS_MOTIONBLUR))
|
|
{
|
|
// get console variables
|
|
float fMotionBlurAmount=pMotionBlurAmount->GetFVal();
|
|
int iMotionBlurDisplace=pMotionBlurDisplace->GetIVal();
|
|
|
|
// pass parameters and activate effect
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_MOTIONBLUR, SCREENPROCESS_MOTIONBLURDISPLACE, &iMotionBlurDisplace);
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_MOTIONBLUR, SCREENPROCESS_MOTIONBLURAMOUNT, &fMotionBlurAmount);
|
|
m_pREScreenProcess->mfSetParameter(SCREENPROCESS_MOTIONBLUR, SCREENPROCESS_MOTIONBLURTYPE, &iUseMotionBlur);
|
|
m_pREScreenProcess->mfActivate(SCREENPROCESS_MOTIONBLUR);
|
|
}
|
|
}
|
|
|
|
CCObject *pScreenProcessObj=GetRenderer()->EF_GetObject(true, -1);
|
|
pScreenProcessObj->m_Matrix.SetIdentity();
|
|
GetRenderer()->EF_AddEf(0, m_pREScreenProcess, m_pSHScreenProcess, NULL, pScreenProcessObj, 0, NULL, eS_Glare);
|
|
}
|