mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-29 17:43:01 +00:00
229 lines
7.3 KiB
C++
229 lines
7.3 KiB
C++
|
//========= 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;
|