mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-15 13:16:58 +00:00
1
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user