source-engine/game/client/portal/portal_render_targets.cpp

229 lines
7.3 KiB
C++
Raw Normal View History

2022-04-16 09:05:19 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Portal mod render targets are specified by and accessable through this singleton
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "portal_render_targets.h"
#include "materialsystem/imaterialsystem.h"
#include "rendertexture.h"
//-----------------------------------------------------------------------------
// Purpose: Called in CClientRenderTargets::InitClientRenderTargets, used to set
// the CTextureReference member
// Input : pMaterialSystem - material system passed in from the engine
// Output : ITexture* - the created texture
//-----------------------------------------------------------------------------
ITexture* CPortalRenderTargets::InitPortal1Texture( IMaterialSystem* pMaterialSystem )
{
if ( IsX360() )
{
// shouldn't be using
Assert( 0 );
return NULL;
}
return pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_Portal1",
1, 1, RT_SIZE_FULL_FRAME_BUFFER,
pMaterialSystem->GetBackBufferFormat(),
MATERIAL_RT_DEPTH_SHARED,
0,
CREATERENDERTARGETFLAGS_HDR );
}
ITexture* CPortalRenderTargets::GetPortal1Texture()
{
return m_Portal1Texture;
}
//-----------------------------------------------------------------------------
// Purpose: Called in CClientRenderTargets::InitClientRenderTargets, used to set
// the CTextureReference member
// Input : pMaterialSystem - material system passed in from the engine
// Output : ITexture* - the created texture
//-----------------------------------------------------------------------------
ITexture* CPortalRenderTargets::InitPortal2Texture( IMaterialSystem* pMaterialSystem )
{
if ( IsX360() )
{
// shouldn't be using
Assert( 0 );
return NULL;
}
return pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_Portal2",
1, 1, RT_SIZE_FULL_FRAME_BUFFER,
pMaterialSystem->GetBackBufferFormat(),
MATERIAL_RT_DEPTH_SHARED,
0,
CREATERENDERTARGETFLAGS_HDR );
}
ITexture* CPortalRenderTargets::GetPortal2Texture()
{
return m_Portal2Texture;
}
//-----------------------------------------------------------------------------
// Purpose: Called in CClientRenderTargets::InitClientRenderTargets, used to set
// the CTextureReference member
// Input : pMaterialSystem - material system passed in from the engine
// Output : ITexture* - the created texture
//-----------------------------------------------------------------------------
ITexture* CPortalRenderTargets::InitDepthDoublerTexture( IMaterialSystem* pMaterialSystem )
{
return pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_DepthDoubler",
512, 512, RT_SIZE_DEFAULT,
pMaterialSystem->GetBackBufferFormat(),
MATERIAL_RT_DEPTH_SHARED,
0,
CREATERENDERTARGETFLAGS_HDR );
}
ITexture* CPortalRenderTargets::GetDepthDoublerTexture()
{
return m_DepthDoublerTexture;
}
void CPortalRenderTargets::InitPortalWaterTextures( IMaterialSystem* pMaterialSystem )
{
if ( IsX360() )
{
return;
}
//Reflections
m_WaterReflectionTextures[0].Init(
pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_PortalWaterReflection_Depth1",
512, 512, RT_SIZE_PICMIP,
pMaterialSystem->GetBackBufferFormat(),
MATERIAL_RT_DEPTH_SEPARATE,
TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
CREATERENDERTARGETFLAGS_HDR ) );
m_WaterReflectionTextures[1].Init(
pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_PortalWaterReflection_Depth2",
256, 256, RT_SIZE_PICMIP,
pMaterialSystem->GetBackBufferFormat(),
MATERIAL_RT_DEPTH_SEPARATE,
TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
CREATERENDERTARGETFLAGS_HDR ) );
//Refractions
m_WaterRefractionTextures[0].Init(
pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_PortalWaterRefraction_Depth1",
512, 512, RT_SIZE_PICMIP,
// This is different than reflection because it has to have alpha for fog factor.
IMAGE_FORMAT_RGBA8888,
MATERIAL_RT_DEPTH_SEPARATE,
TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
CREATERENDERTARGETFLAGS_HDR ) );
m_WaterRefractionTextures[1].Init(
pMaterialSystem->CreateNamedRenderTargetTextureEx2(
"_rt_PortalWaterRefraction_Depth2",
256, 256, RT_SIZE_PICMIP,
// This is different than reflection because it has to have alpha for fog factor.
IMAGE_FORMAT_RGBA8888,
MATERIAL_RT_DEPTH_SEPARATE,
TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
CREATERENDERTARGETFLAGS_HDR ) );
}
ITexture* CPortalRenderTargets::GetWaterReflectionTextureForStencilDepth( int iStencilDepth )
{
if ( IsX360() )
{
return NULL;
}
if ( iStencilDepth > 2 )
return NULL;
if ( iStencilDepth == 0 )
return m_WaterReflectionTexture; //from CBaseClientRenderTargets
return m_WaterReflectionTextures[ iStencilDepth - 1 ];
}
ITexture* CPortalRenderTargets::GetWaterRefractionTextureForStencilDepth( int iStencilDepth )
{
if ( IsX360() )
{
return NULL;
}
if ( iStencilDepth > 2 )
return NULL;
if ( iStencilDepth == 0 )
return m_WaterRefractionTexture; //from CBaseClientRenderTargets
return m_WaterRefractionTextures[ iStencilDepth - 1 ];
}
//-----------------------------------------------------------------------------
// Purpose: InitClientRenderTargets, interface called by the engine at material system init in the engine
// Input : pMaterialSystem - the interface to the material system from the engine (our singleton hasn't been set up yet)
// pHardwareConfig - the user's hardware config, useful for conditional render targets setup
//-----------------------------------------------------------------------------
void CPortalRenderTargets::InitClientRenderTargets( IMaterialSystem* pMaterialSystem, IMaterialSystemHardwareConfig* pHardwareConfig )
{
// If they don't support stencils, allocate render targets for drawing portals.
// TODO: When stencils are default, do the below check before bothering to allocate the RTs
// and make sure that switching from Stencil<->RT mode reinits the material system.
// if ( materials->StencilBufferBits() == 0 )
if ( IsPC() || !IsX360() )
{
m_Portal1Texture.Init( InitPortal1Texture( pMaterialSystem ) );
m_Portal2Texture.Init( InitPortal2Texture( pMaterialSystem ) );
}
m_DepthDoublerTexture.Init( InitDepthDoublerTexture( pMaterialSystem ) );
if ( IsPC() || !IsX360() )
{
InitPortalWaterTextures( pMaterialSystem );
}
// Water effects & camera from the base class (standard HL2 targets)
BaseClass::InitClientRenderTargets( pMaterialSystem, pHardwareConfig, 512, 256 );
}
//-----------------------------------------------------------------------------
// Purpose: Shutdown client render targets. This gets called during shutdown in the engine
// Input : -
//-----------------------------------------------------------------------------
void CPortalRenderTargets::ShutdownClientRenderTargets()
{
m_Portal1Texture.Shutdown();
m_Portal2Texture.Shutdown();
m_DepthDoublerTexture.Shutdown();
for ( int i = 0; i < 2; ++i )
{
m_WaterReflectionTextures[i].Shutdown();
m_WaterRefractionTextures[i].Shutdown();
}
// Clean up standard HL2 RTs (camera and water)
BaseClass::ShutdownClientRenderTargets();
}
static CPortalRenderTargets g_PortalRenderTargets;
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CPortalRenderTargets, IClientRenderTargets, CLIENTRENDERTARGETS_INTERFACE_VERSION, g_PortalRenderTargets );
CPortalRenderTargets* portalrendertargets = &g_PortalRenderTargets;