summaryrefslogtreecommitdiff
path: root/game/client/portal/portal_render_targets.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/portal/portal_render_targets.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/portal/portal_render_targets.cpp')
-rw-r--r--game/client/portal/portal_render_targets.cpp229
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