123
This commit is contained in:
423
Cry3DEngine/3DEngineScreenEffects.cpp
Normal file
423
Cry3DEngine/3DEngineScreenEffects.cpp
Normal file
@@ -0,0 +1,423 @@
|
||||
/*
|
||||
=====================================================================
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user