diff options
Diffstat (limited to 'game/client/portal/portal_render_targets.cpp')
| -rw-r--r-- | game/client/portal/portal_render_targets.cpp | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/game/client/portal/portal_render_targets.cpp b/game/client/portal/portal_render_targets.cpp new file mode 100644 index 0000000..4ba8893 --- /dev/null +++ b/game/client/portal/portal_render_targets.cpp @@ -0,0 +1,229 @@ +//========= 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;
\ No newline at end of file |