500 ms transition for underwater blur

This commit is contained in:
Andrei Drexler 2011-04-01 14:49:43 +00:00
parent 391b404134
commit 8d7859931b
3 changed files with 26 additions and 5 deletions

View file

@ -2893,9 +2893,15 @@ void CG_DrawBigPolygon(void) {
trap_R_AddPolyToScene(cgs.media.blackHackShader, 4, Corners);
}
static qboolean CG_UnderWater( void )
// Makro - this needs to be called after cg.waterTransitionTime and cg.inWaterLastFrame have been updated
static float CG_GetUnderWaterFraction( void )
{
return 0 != (CG_PointContents(cg.refdef.vieworg, -1) & (CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA));
const int WATER_ANIM_TIME = 500; // msec
const int delta = cg.time - cg.waterTransitionTime;
float frac = Com_Clamp(0.f, 1.f, delta / (float)WATER_ANIM_TIME);
if (!cg.inWaterLastFrame)
frac = 1.f - frac;
return frac;
}
static qboolean CG_IsDead( void )
@ -2927,9 +2933,7 @@ static void CG_DrawIRVisionBlend( void )
static void CG_SetupPostProcess( void )
{
cg.refdefex.blurFactor = CG_GetDamageBlendAlpha();
if (CG_UnderWater())
cg.refdefex.blurFactor += 1.f;
cg.refdefex.blurFactor += CG_GetUnderWaterFraction();
if (CG_IsDead())
cg.refdefex.blurFactor += 1.f;

View file

@ -1201,6 +1201,10 @@ typedef struct {
// Makro - explosion screen shake
int explosionTime;
float explosionForce;
// Makro - water transitions
qboolean inWaterLastFrame;
int waterTransitionTime;
} cg_t;
//Blaze: struct to hold the func_breakable stuff

View file

@ -1262,6 +1262,18 @@ void CG_AddLensFlare(qboolean sun)
}
}
static qboolean CG_UnderWater( void )
{
return 0 != (CG_PointContents(cg.refdef.vieworg, -1) & (CONTENTS_WATER | CONTENTS_SLIME | CONTENTS_LAVA));
}
static void CG_UpdateWaterTransitions( void )
{
qboolean inWater = CG_UnderWater();
if (inWater != cg.inWaterLastFrame)
cg.waterTransitionTime = cg.time;
cg.inWaterLastFrame = inWater;
}
/*
=================
@ -1324,6 +1336,7 @@ void CG_DrawActiveFrame(int serverTime, stereoFrame_t stereoView, qboolean demoP
// build cg.refdef
inwater = CG_CalcViewValues();
CG_UpdateWaterTransitions();
// first person blend blobs, done after AnglesToAxis
if (!cg.renderingThirdPerson) {