You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
7.3 KiB
229 lines
7.3 KiB
//========= 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; |