summaryrefslogtreecommitdiff
path: root/game/client/view_scene.h
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/view_scene.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/view_scene.h')
-rw-r--r--game/client/view_scene.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/game/client/view_scene.h b/game/client/view_scene.h
new file mode 100644
index 0000000..9126904
--- /dev/null
+++ b/game/client/view_scene.h
@@ -0,0 +1,166 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef VIEW_SCENE_H
+#define VIEW_SCENE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+#include "convar.h"
+#include "iviewrender.h"
+#include "view_shared.h"
+#include "rendertexture.h"
+#include "materialsystem/itexture.h"
+
+
+extern ConVar mat_wireframe;
+extern ConVar building_cubemaps;
+
+
+// Transform into view space (translate and rotate the camera into the origin).
+void ViewTransform( const Vector &worldSpace, Vector &viewSpace );
+
+// Transform a world point into normalized screen space (X and Y from -1 to 1).
+// Returns 0 if the point is behind the viewer.
+int ScreenTransform( const Vector& point, Vector& screen );
+int HudTransform( const Vector& point, Vector& screen );
+
+
+extern ConVar r_updaterefracttexture;
+extern int g_viewscene_refractUpdateFrame;
+extern bool g_bAllowMultipleRefractUpdatesPerScenePerFrame;
+bool DrawingShadowDepthView( void );
+bool DrawingMainView();
+
+inline void UpdateRefractTexture( int x, int y, int w, int h, bool bForceUpdate = false )
+{
+ Assert( !DrawingShadowDepthView() );
+
+ if ( !IsRetail() && !r_updaterefracttexture.GetBool() )
+ return;
+
+ CMatRenderContextPtr pRenderContext( materials );
+ ITexture *pTexture = GetPowerOfTwoFrameBufferTexture();
+ if ( IsPC() || bForceUpdate || g_bAllowMultipleRefractUpdatesPerScenePerFrame || (gpGlobals->framecount != g_viewscene_refractUpdateFrame) )
+ {
+ // forced or only once per frame
+ Rect_t rect;
+ rect.x = x;
+ rect.y = y;
+ rect.width = w;
+ rect.height = h;
+ pRenderContext->CopyRenderTargetToTextureEx( pTexture, 0, &rect, NULL );
+
+ g_viewscene_refractUpdateFrame = gpGlobals->framecount;
+ }
+ pRenderContext->SetFrameBufferCopyTexture( pTexture );
+}
+
+inline void UpdateRefractTexture( bool bForceUpdate = false )
+{
+ Assert( !DrawingShadowDepthView() );
+
+ CMatRenderContextPtr pRenderContext( materials );
+
+ int x,y,w,h;
+ pRenderContext->GetViewport( x, y, w, h );
+ UpdateRefractTexture( x, y, w, h, bForceUpdate );
+}
+
+inline void UpdateScreenEffectTexture( int textureIndex, int x, int y, int w, int h, bool bDestFullScreen = false, Rect_t *pActualRect = NULL )
+{
+ Rect_t srcRect;
+ srcRect.x = x;
+ srcRect.y = y;
+ srcRect.width = w;
+ srcRect.height = h;
+
+ CMatRenderContextPtr pRenderContext( materials );
+ ITexture *pTexture = GetFullFrameFrameBufferTexture( textureIndex );
+ int nSrcWidth, nSrcHeight;
+ pRenderContext->GetRenderTargetDimensions( nSrcWidth, nSrcHeight );
+ int nDestWidth = pTexture->GetActualWidth();
+ int nDestHeight = pTexture->GetActualHeight();
+
+ Rect_t destRect = srcRect;
+ if( !bDestFullScreen && ( nSrcWidth > nDestWidth || nSrcHeight > nDestHeight ) )
+ {
+ // the source and target sizes aren't necessarily the same (specifically in dx7 where
+ // nonpow2 rendertargets aren't supported), so lets figure it out here.
+ float scaleX = ( float )nDestWidth / ( float )nSrcWidth;
+ float scaleY = ( float )nDestHeight / ( float )nSrcHeight;
+ destRect.x = srcRect.x * scaleX;
+ destRect.y = srcRect.y * scaleY;
+ destRect.width = srcRect.width * scaleX;
+ destRect.height = srcRect.height * scaleY;
+ destRect.x = clamp( destRect.x, 0, nDestWidth );
+ destRect.y = clamp( destRect.y, 0, nDestHeight );
+ destRect.width = clamp( destRect.width, 0, nDestWidth - destRect.x );
+ destRect.height = clamp( destRect.height, 0, nDestHeight - destRect.y );
+ }
+
+ pRenderContext->CopyRenderTargetToTextureEx( pTexture, 0, &srcRect, bDestFullScreen ? NULL : &destRect );
+ pRenderContext->SetFrameBufferCopyTexture( pTexture, textureIndex );
+
+ if ( pActualRect )
+ {
+ pActualRect->x = destRect.x;
+ pActualRect->y = destRect.y;
+ pActualRect->width = destRect.width;
+ pActualRect->height = destRect.height;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Draws the screen effect
+//-----------------------------------------------------------------------------
+inline void DrawScreenEffectMaterial( IMaterial *pMaterial, int x, int y, int w, int h )
+{
+ Rect_t actualRect;
+ UpdateScreenEffectTexture( 0, x, y, w, h, false, &actualRect );
+ ITexture *pTexture = GetFullFrameFrameBufferTexture( 0 );
+
+ CMatRenderContextPtr pRenderContext( materials );
+
+ pRenderContext->DrawScreenSpaceRectangle( pMaterial, x, y, w, h,
+ actualRect.x, actualRect.y, actualRect.x+actualRect.width-1, actualRect.y+actualRect.height-1,
+ pTexture->GetActualWidth(), pTexture->GetActualHeight() );
+}
+
+
+//intended for use by dynamic meshes to naively update front buffer textures needed by a material
+inline void UpdateFrontBufferTexturesForMaterial( IMaterial *pMaterial, bool bForce = false )
+{
+ Assert( !DrawingShadowDepthView() );
+
+ if( pMaterial->NeedsPowerOfTwoFrameBufferTexture() )
+ {
+ UpdateRefractTexture( bForce );
+ }
+ else if( pMaterial->NeedsFullFrameBufferTexture() )
+ {
+ const CViewSetup *pView = view->GetViewSetup();
+ UpdateScreenEffectTexture( 0, pView->x, pView->y, pView->width, pView->height );
+ }
+}
+
+inline void UpdateScreenEffectTexture( void )
+{
+ Assert( !DrawingShadowDepthView() );
+
+ const CViewSetup *pViewSetup = view->GetViewSetup();
+ UpdateScreenEffectTexture( 0, pViewSetup->x, pViewSetup->y, pViewSetup->width, pViewSetup->height);
+}
+
+// reset the tonem apping to a constant value, and clear the filter bank
+void ResetToneMapping(float value);
+
+void UpdateFullScreenDepthTexture( void );
+
+#endif // VIEW_SCENE_H