From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- mp/src/game/client/rendertexture.cpp | 258 +++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 mp/src/game/client/rendertexture.cpp (limited to 'mp/src/game/client/rendertexture.cpp') diff --git a/mp/src/game/client/rendertexture.cpp b/mp/src/game/client/rendertexture.cpp new file mode 100644 index 00000000..829f2d43 --- /dev/null +++ b/mp/src/game/client/rendertexture.cpp @@ -0,0 +1,258 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// Implements local hooks into named renderable textures. +// See matrendertexture.cpp in material system for list of available RT's +// +//=============================================================================// + +#include "materialsystem/imesh.h" +#include "materialsystem/itexture.h" +#include "materialsystem/MaterialSystemUtil.h" +#include "tier1/strtools.h" +#include "rendertexture.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +void ReleaseRenderTargets( void ); + +void AddReleaseFunc( void ) +{ + static bool bAdded = false; + if( !bAdded ) + { + bAdded = true; + materials->AddReleaseFunc( ReleaseRenderTargets ); + } +} + +//============================================================================= +// Power of Two Frame Buffer Texture +//============================================================================= +static CTextureReference s_pPowerOfTwoFrameBufferTexture; +ITexture *GetPowerOfTwoFrameBufferTexture( void ) +{ + if ( IsX360() ) + { + return GetFullFrameFrameBufferTexture( 1 ); + } + + if ( !s_pPowerOfTwoFrameBufferTexture ) + { + s_pPowerOfTwoFrameBufferTexture.Init( materials->FindTexture( "_rt_PowerOfTwoFB", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pPowerOfTwoFrameBufferTexture ) ); + AddReleaseFunc(); + } + + return s_pPowerOfTwoFrameBufferTexture; +} + +//============================================================================= +// Fullscreen Texture +//============================================================================= +static CTextureReference s_pFullscreenTexture; +ITexture *GetFullscreenTexture( void ) +{ + if ( !s_pFullscreenTexture ) + { + s_pFullscreenTexture.Init( materials->FindTexture( "_rt_Fullscreen", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pFullscreenTexture ) ); + AddReleaseFunc(); + } + + return s_pFullscreenTexture; +} + +//============================================================================= +// Camera Texture +//============================================================================= +static CTextureReference s_pCameraTexture; +ITexture *GetCameraTexture( void ) +{ + if ( !s_pCameraTexture ) + { + s_pCameraTexture.Init( materials->FindTexture( "_rt_Camera", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pCameraTexture ) ); + AddReleaseFunc(); + } + + return s_pCameraTexture; +} + +//============================================================================= +// Full Frame Depth Texture +//============================================================================= +static CTextureReference s_pFullFrameDepthTexture; +ITexture *GetFullFrameDepthTexture( void ) +{ + if ( !s_pFullFrameDepthTexture ) + { + s_pFullFrameDepthTexture.Init( materials->FindTexture( "_rt_FullFrameDepth", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pFullFrameDepthTexture ) ); + AddReleaseFunc(); + } + + return s_pFullFrameDepthTexture; +} + +//============================================================================= +// Full Frame Buffer Textures +//============================================================================= +static CTextureReference s_pFullFrameFrameBufferTexture[MAX_FB_TEXTURES]; +ITexture *GetFullFrameFrameBufferTexture( int textureIndex ) +{ + if ( !s_pFullFrameFrameBufferTexture[textureIndex] ) + { + char name[256]; + if( textureIndex != 0 ) + { + sprintf( name, "_rt_FullFrameFB%d", textureIndex ); + } + else + { + Q_strcpy( name, "_rt_FullFrameFB" ); + } + s_pFullFrameFrameBufferTexture[textureIndex].Init( materials->FindTexture( name, TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pFullFrameFrameBufferTexture[textureIndex] ) ); + AddReleaseFunc(); + } + + return s_pFullFrameFrameBufferTexture[textureIndex]; +} + + +//============================================================================= +// Water reflection +//============================================================================= +static CTextureReference s_pWaterReflectionTexture; +ITexture *GetWaterReflectionTexture( void ) +{ + if ( !s_pWaterReflectionTexture ) + { + s_pWaterReflectionTexture.Init( materials->FindTexture( "_rt_WaterReflection", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pWaterReflectionTexture ) ); + AddReleaseFunc(); + } + + return s_pWaterReflectionTexture; +} + +//============================================================================= +// Water refraction +//============================================================================= +static CTextureReference s_pWaterRefractionTexture; +ITexture *GetWaterRefractionTexture( void ) +{ + if ( !s_pWaterRefractionTexture ) + { + s_pWaterRefractionTexture.Init( materials->FindTexture( "_rt_WaterRefraction", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pWaterRefractionTexture ) ); + AddReleaseFunc(); + } + + return s_pWaterRefractionTexture; +} + +//============================================================================= +// Small Buffer HDR0 +//============================================================================= +static CTextureReference s_pSmallBufferHDR0; +ITexture *GetSmallBufferHDR0( void ) +{ + if ( !s_pSmallBufferHDR0 ) + { + s_pSmallBufferHDR0.Init( materials->FindTexture( "_rt_SmallHDR0", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pSmallBufferHDR0 ) ); + AddReleaseFunc(); + } + + return s_pSmallBufferHDR0; +} + +//============================================================================= +// Small Buffer HDR1 +//============================================================================= +static CTextureReference s_pSmallBufferHDR1; +ITexture *GetSmallBufferHDR1( void ) +{ + if ( !s_pSmallBufferHDR1 ) + { + s_pSmallBufferHDR1.Init( materials->FindTexture( "_rt_SmallHDR1", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pSmallBufferHDR1 ) ); + AddReleaseFunc(); + } + + return s_pSmallBufferHDR1; +} + +//============================================================================= +// Quarter Sized FB0 +//============================================================================= +static CTextureReference s_pQuarterSizedFB0; +ITexture *GetSmallBuffer0( void ) +{ + if ( !s_pQuarterSizedFB0 ) + { + s_pQuarterSizedFB0.Init( materials->FindTexture( "_rt_SmallFB0", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pQuarterSizedFB0 ) ); + AddReleaseFunc(); + } + + return s_pQuarterSizedFB0; +} + +//============================================================================= +// Quarter Sized FB1 +//============================================================================= +static CTextureReference s_pQuarterSizedFB1; +ITexture *GetSmallBuffer1( void ) +{ + if ( !s_pQuarterSizedFB1 ) + { + s_pQuarterSizedFB1.Init( materials->FindTexture( "_rt_SmallFB1", TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_pQuarterSizedFB1 ) ); + AddReleaseFunc(); + } + + return s_pQuarterSizedFB1; +} + +//============================================================================= +// Teeny Textures +//============================================================================= +static CTextureReference s_TeenyTextures[MAX_TEENY_TEXTURES]; +ITexture *GetTeenyTexture( int which ) +{ + if ( IsX360() ) + { + Assert( 0 ); + return NULL; + } + + Assert( which < MAX_TEENY_TEXTURES ); + + if ( !s_TeenyTextures[which] ) + { + char nbuf[20]; + sprintf( nbuf, "_rt_TeenyFB%d", which ); + s_TeenyTextures[which].Init( materials->FindTexture( nbuf, TEXTURE_GROUP_RENDER_TARGET ) ); + Assert( !IsErrorTexture( s_TeenyTextures[which] ) ); + AddReleaseFunc(); + } + return s_TeenyTextures[which]; +} + +void ReleaseRenderTargets( void ) +{ + s_pPowerOfTwoFrameBufferTexture.Shutdown(); + s_pCameraTexture.Shutdown(); + s_pWaterReflectionTexture.Shutdown(); + s_pWaterRefractionTexture.Shutdown(); + s_pQuarterSizedFB0.Shutdown(); + s_pQuarterSizedFB1.Shutdown(); + s_pFullFrameDepthTexture.Shutdown(); + + for (int i=0; i