Files
HL2Overcharged/game/client/postproc_effects.cpp
2025-05-21 21:09:22 +03:00

420 lines
12 KiB
C++
Raw Permalink Blame History

#include "cbase.h"
#include "materialsystem/IMaterialSystem.h"
#include "materialsystem/IMaterialVar.h"
#include "materialsystem/imaterialsystemhardwareconfig.h"
#include "rendertexture.h"
#include "view_scene.h"
#include "viewrender.h"
#include "ivieweffects.h"
#include "ClientEffectPrecacheSystem.h"
#include "view.h"
#include "shadereditor/shadereditorsystem.h"
#include "shadereditor/ivshadereditor.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define SCREENBLUR_EDITOR_NAME "ppe_gaussian_blur"
#define OVERLAY_EDITOR_NAME "ppe_dragonborn"
ConVar r_post_drawscreenblur("r_post_drawscreenblur", "0", FCVAR_CHEAT);
ConVar r_post_dragonborn("r_post_dragonborn", "0", FCVAR_CHEAT);
ConVar r_post_glass_effect("r_post_glass_effect", "0", FCVAR_CHEAT);
ConVar r_post_screen_dust("r_post_screen_dust", "0", FCVAR_CHEAT);
ConVar r_post_bokeh_dof("r_post_bokeh_dof", "0", FCVAR_CHEAT);
ConVar r_post_desaturation("r_post_desaturation", "0", FCVAR_CHEAT);
ConVar r_post_filmgrain("r_post_filmgrain", "0", FCVAR_CHEAT);
ConVar r_post_flare_anamorphic("r_post_flare_anamorphic", "0", FCVAR_CHEAT);
ConVar r_post_flare_anamorphic_strenth("r_post_flare_anamorphic_strenth", "0", FCVAR_CHEAT);
ConVar r_post_colorgrading_simple("r_post_colorgrading_simple", "0", FCVAR_CHEAT);
ConVar r_post_cinematic("r_post_cinematic", "0", FCVAR_CHEAT);
ConVar r_post_cinematic_saturation("r_post_cinematic_saturation", "0.8", FCVAR_CHEAT);
ConVar r_post_cinematic_contrast("r_post_cinematic_contrast", "1.0", FCVAR_CHEAT);
ConVar r_post_cinematic_brightness("r_post_cinematic_brightness", "0.0", FCVAR_CHEAT);
ConVar r_post_cinematic_intensity("r_post_cinematic_intensity", "0.2", FCVAR_CHEAT);
ConVar r_post_cinematic_overlay("r_post_cinematic_overlay", "0", FCVAR_CHEAT);
ConVar r_post_gears_bloom("r_post_gears_bloom", "0", FCVAR_CHEAT);
ConVar r_post_sunshaft("r_post_sunshaft", "0", FCVAR_CHEAT);
ConVar r_post_sunshaft_debug("r_post_sunshaft_debug", "0", FCVAR_CHEAT);
ConVar r_post_sunshaft_blur("r_post_sunshaft_blur", "1", FCVAR_ARCHIVE);
ConVar r_post_sunshaft_blur_amount("r_post_sunshaft_blur_amount", "0.5", FCVAR_CHEAT);
/////////////////////////////////////////////////POSTPROCESS EFFECTS////////////////////////////////////////////////////
CLIENTEFFECT_REGISTER_BEGIN(PrecachePostProcessingMaterials)
//postprocessing materials
CLIENTEFFECT_MATERIAL("effects/shaders/blurx")
CLIENTEFFECT_MATERIAL("effects/shaders/blury")
CLIENTEFFECT_MATERIAL("effects/shaders/sunshaft_base")
CLIENTEFFECT_MATERIAL("effects/shaders/sunshaft_final")
CLIENTEFFECT_MATERIAL("effects/shaders/dust")
CLIENTEFFECT_MATERIAL("effects/shaders/cross_processing_new")
CLIENTEFFECT_MATERIAL("effects/shaders/cross_processing")
CLIENTEFFECT_MATERIAL("effects/shaders/postproc_bokeh")
CLIENTEFFECT_MATERIAL("effects/shaders/colorgrading_simple")
CLIENTEFFECT_MATERIAL("effects/shaders/postproc_cinematic_overlay")
CLIENTEFFECT_MATERIAL("effects/shaders/postprocess_filmgrain")
CLIENTEFFECT_MATERIAL("effects/shaders/postproc_dragonborn")
CLIENTEFFECT_MATERIAL("effects/shaders/postproc_desaturation")
CLIENTEFFECT_MATERIAL("effects/shaders/anamorphic_bloom")
CLIENTEFFECT_MATERIAL("effects/shaders/glass_effect_01")
CLIENTEFFECT_MATERIAL("effects/shaders/postproc_gears_bloom")
CLIENTEFFECT_MATERIAL("shadereditor/_rt_framebuffer_prev")
CLIENTEFFECT_MATERIAL("shadereditor/_rt_ppe")
CLIENTEFFECT_MATERIAL("effects/shaders/Effects from CITY 17/anamorphic_bloom")
CLIENTEFFECT_MATERIAL("effects/shaders/Effects from CITY 17/anamorphic_bloom_final")
CLIENTEFFECT_MATERIAL("effects/shaders/sunrays/blurx")
CLIENTEFFECT_MATERIAL("effects/shaders/sunrays/blury")
CLIENTEFFECT_MATERIAL("effects/shaders/sunrays/sunshaft_base")
CLIENTEFFECT_MATERIAL("effects/shaders/sunrays/sunshaft_final")
CLIENTEFFECT_MATERIAL("effects/shaders/sunrays/sunshaft_debug")
CLIENTEFFECT_REGISTER_END_CONDITIONAL(engine->GetDXSupportLevel() >= 90)
inline bool ShouldDrawCommon()
{
if (!r_post_drawscreenblur.GetBool())
return false;
return g_ShaderEditorSystem->IsReady() && engine->IsInGame() && !engine->IsPaused();
}
static IMaterialVar *GetPPEMaterialVar(const char *pszPPEName, const char *pszNode, const char *pszVar)
{
if (!g_ShaderEditorSystem->IsReady())
{
Assert(0);
return NULL;
}
const int iPPEIndex = shaderEdit->GetPPEIndex(pszPPEName);
IMaterial *pMat = shaderEdit->GetPPEMaterial(iPPEIndex, pszNode);
if (IsErrorMaterial(pMat))
{
Assert(0);
return NULL;
}
IMaterialVar *pVarMutable = pMat->FindVar(pszVar, NULL, false);
Assert(pVarMutable);
return pVarMutable;
}
void CViewRender::Post_Processing_Effects(int x, int y, int width, int height)
{
if (r_post_screen_dust.GetInt() == 1)
{
IMaterial *pMaterial = materials->FindMaterial("effects/shaders/dust", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial, x, y, width, height);
CLocalPlayerFilter filterW;
}
if (r_post_screen_dust.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CLocalPlayerFilter filterW;
}
if (r_post_filmgrain.GetInt() == 1)
{
IMaterial *pMaterial = materials->FindMaterial("effects/shaders/postprocess_filmgrain", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial, x, y, width, height);
CLocalPlayerFilter filterW;
}
if (r_post_filmgrain.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filterW;
}
if (r_post_colorgrading_simple.GetInt() == 1)
{
IMaterial *pMaterial1 = materials->FindMaterial("effects/shaders/colorgrading_simple", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial1, x, y, width, height);
CLocalPlayerFilter filterQ;
}
if (r_post_colorgrading_simple.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filterQ;
}
if (r_post_cinematic.GetInt() == 1)
{
IMaterialVar *var;
IMaterial *pMaterial2 = materials->FindMaterial("effects/shaders/cross_processing", TEXTURE_GROUP_CLIENT_EFFECTS);
var = pMaterial2->FindVar("$MUTABLE_01", NULL);
var->SetFloatValue(r_post_cinematic_saturation.GetFloat());
var = pMaterial2->FindVar("$MUTABLE_02", NULL);
var->SetFloatValue(r_post_cinematic_contrast.GetFloat());
var = pMaterial2->FindVar("$MUTABLE_03", NULL);
var->SetFloatValue(r_post_cinematic_brightness.GetFloat());
var = pMaterial2->FindVar("$MUTABLE_04", NULL);
var->SetFloatValue(r_post_cinematic_intensity.GetFloat());
DrawScreenEffectMaterial(pMaterial2, x, y, width, height);
CLocalPlayerFilter filter;
}
if (r_post_cinematic.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filter;
}
if (r_post_bokeh_dof.GetInt() == 1)
{
IMaterial *pMaterial3 = materials->FindMaterial("effects/shaders/postproc_bokeh", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial3, x, y, width, height);
//view->SetScreenOverlayMaterial( pMaterial3 );
CLocalPlayerFilter filter;
}
if (r_post_bokeh_dof.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filter;
}
if (r_post_desaturation.GetInt() == 1)
{
IMaterial *pMaterial3 = materials->FindMaterial("effects/shaders/postproc_desaturation", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial3, x, y, width, height);
//view->SetScreenOverlayMaterial( pMaterial3 );
CLocalPlayerFilter filter;
}
if (r_post_desaturation.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filter;
}
if (r_post_cinematic_overlay.GetInt() == 1)
{
IMaterial *pMaterial4 = materials->FindMaterial("effects/shaders/postproc_cinematic_overlay", TEXTURE_GROUP_CLIENT_EFFECTS, false);
DrawScreenEffectMaterial(pMaterial4, x, y, width, height);
CLocalPlayerFilter filterT;
}
if (r_post_cinematic_overlay.GetInt() == 0)
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filterT;
}
if (r_post_drawscreenblur.GetInt() )
{
DrawScreenGaussianBlur(x, y, width, height);
}
if (r_post_dragonborn.GetInt())
{
// DrawDragonBorn(x, y, width, height);
IMaterial *pMaterial = materials->FindMaterial("effects/shaders/postproc_dragonborn", TEXTURE_GROUP_CLIENT_EFFECTS);
CMatRenderContextPtr pRenderContext(materials);
pRenderContext->PushRenderTargetAndViewport();
ITexture *dest_rt0 = materials->FindTexture("_rt_SmallFB0", TEXTURE_GROUP_RENDER_TARGET);
pRenderContext->SetRenderTarget(dest_rt0);
pRenderContext->Viewport(0, 0, dest_rt0->GetActualWidth(), dest_rt0->GetActualHeight());
pRenderContext->PopRenderTargetAndViewport();
CMatRenderContextPtr renderContext(materials);
renderContext->OverrideDepthEnable(true, false);
DrawScreenEffectMaterial(pMaterial, x, y, width, height);
CLocalPlayerFilter filter;
renderContext->OverrideDepthEnable(false, false);
}
if (!r_post_dragonborn.GetInt())
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filter;
}
if (r_post_glass_effect.GetInt())
{
// DrawDragonBorn(x, y, width, height);
IMaterial *pMaterial = materials->FindMaterial("effects/shaders/glass_effect_01", TEXTURE_GROUP_CLIENT_EFFECTS);
DrawScreenEffectMaterial(pMaterial, x, y, width, height);
CLocalPlayerFilter filter;
}
if (!r_post_glass_effect.GetInt())
{
view->SetScreenOverlayMaterial(null);
CLocalPlayerFilter filter;
}
}
void CViewRender::DrawScreenGaussianBlur(int x, int y, int width, int height)
{
/* if (!ShouldDrawCommon())
return;*/
static const int iScreenBlur = shaderEdit->GetPPEIndex(SCREENBLUR_EDITOR_NAME);
if (iScreenBlur < 0)
return;
if (!r_post_drawscreenblur.GetBool())
return;
DEFINE_SHADEREDITOR_MATERIALVAR(SCREENBLUR_EDITOR_NAME, "downsample", "$MUTABLE_01", pVar_ScreenBlur_Strength);
DEFINE_SHADEREDITOR_MATERIALVAR(SCREENBLUR_EDITOR_NAME, "blur x", "$MUTABLE_02", pVar_ScreenBlur_x);
DEFINE_SHADEREDITOR_MATERIALVAR(SCREENBLUR_EDITOR_NAME, "blur y", "$MUTABLE_03", pVar_ScreenBlur_y);
DEFINE_SHADEREDITOR_MATERIALVAR(SCREENBLUR_EDITOR_NAME, "blend base textures", "$MUTABLE_04", pVar_ScreenBlur_blend);
if (pVar_ScreenBlur_Strength == NULL)
{
Assert(0);
return;
}
if (pVar_ScreenBlur_x == NULL)
{
Assert(0);
return;
}
if (pVar_ScreenBlur_y == NULL)
{
Assert(0);
return;
}
if (pVar_ScreenBlur_blend == NULL)
{
Assert(0);
return;
}
bool g_pPPCtrl = r_post_drawscreenblur.GetInt();
float intensity = g_pPPCtrl ? 30.0f : 0;
if (intensity <= 0.001f)
return;
pVar_ScreenBlur_Strength->SetFloatValue(clamp(intensity, 0, 1));
CMatRenderContextPtr renderContext(materials);
renderContext->OverrideDepthEnable(true, false);
shaderEdit->DrawPPEOnDemand(iScreenBlur, x, y, width, height);
renderContext->OverrideDepthEnable(false, false);
}
void CViewRender::DrawDragonBorn(int x, int y, int width, int height)
{
/* if (!ShouldDrawCommon())
return;*/
/*
static const int iScreen = shaderEdit->GetPPEIndex(OVERLAY_EDITOR_NAME);
if (iScreen < 0)
return;
if (!r_post_dragonborn.GetBool())
return;
DEFINE_SHADEREDITOR_MATERIALVAR(OVERLAY_EDITOR_NAME, "dragonborn", "$MUTABLE_02", pVar_dragonborn);
// DEFINE_SHADEREDITOR_MATERIALVAR(OVERLAY_EDITOR_NAME, "fbquarter_0", "$MUTABLE_01", pVar_fbquarter_0);
// DEFINE_SHADEREDITOR_MATERIALVAR(OVERLAY_EDITOR_NAME, "postproc_dragonborn", "$MUTABLE_01", pVar_postproc_dragonborn);
Assert(pVar_dragonborn);
if (pVar_dragonborn == NULL)
{
Assert(0);
return;
}
/* if (pVar_postproc_dragonborn == NULL)
{
Assert(0);
return;
}*//*
// ITexture *pTexture = GetFullFrameFrameBufferTexture(0);
// CMatRenderContextPtr renderContext(materials);
bool g_pPPCtrl = r_post_dragonborn.GetInt();
float intensity = g_pPPCtrl ? 15.0f : 0;
if (intensity <= 0.001f)
return;
// pVar_dragonborn->SetFloatValue(clamp(intensity, 0.1f, 15.0f));
// pVar_postproc_dragonborn->SetFloatValue(clamp(intensity, 1.1f, 3.0f));
CMatRenderContextPtr renderContext(materials);
renderContext->OverrideDepthEnable(true, false);
shaderEdit->DrawPPEOnDemand(iScreen, x, y, width, height);
renderContext->OverrideDepthEnable(false, false);*/
}