summaryrefslogtreecommitdiff
path: root/engine/gl_rmisc.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 /engine/gl_rmisc.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'engine/gl_rmisc.cpp')
-rw-r--r--engine/gl_rmisc.cpp298
1 files changed, 298 insertions, 0 deletions
diff --git a/engine/gl_rmisc.cpp b/engine/gl_rmisc.cpp
new file mode 100644
index 0000000..c97362e
--- /dev/null
+++ b/engine/gl_rmisc.cpp
@@ -0,0 +1,298 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//===========================================================================//
+
+// HDRFIXME: reduce the number of include files here.
+#include "render_pch.h"
+#include "cdll_int.h"
+#include "client_class.h"
+#include "icliententitylist.h"
+#include "traceinit.h"
+#include "server.h"
+#include "r_decal.h"
+#include "r_areaportal.h"
+#include "ispatialpartitioninternal.h"
+#include "cdll_engine_int.h"
+#include "ivtex.h"
+#include "materialsystem/itexture.h"
+#include "view.h"
+#include "tier0/dbg.h"
+#include "staticpropmgr.h"
+#include "icliententity.h"
+#include "gl_drawlights.h"
+#include "Overlay.h"
+#include "vmodes.h"
+#include "tier1/utlbuffer.h"
+#include "vtf/vtf.h"
+#include "bitmap/imageformat.h"
+#include "cbenchmark.h"
+#include "ivideomode.h"
+#include "materialsystem/imaterialsystemhardwareconfig.h"
+#include "../utils/common/bsplib.h"
+#include "ibsppack.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+void Linefile_Read_f(void);
+
+/*
+====================
+// if( r_drawtranslucentworld )
+// {
+// bSaveDrawTranslucentWorld = r_drawtranslucentworld->GetBool();
+ // NOTE! : We use to set this to 0 for HDR.
+ // r_drawtranslucentworld->SetValue( 0 );
+// }
+// if( r_drawtranslucentrenderables )
+R_TimeRefresh_f
+
+For program optimization
+====================
+*/
+void R_TimeRefresh_f (void)
+{
+ int i;
+ float start, stop, time;
+ CViewSetup view;
+
+ materials->Flush( true );
+
+ Q_memset(&view, 0, sizeof(view));
+ view.origin = MainViewOrigin();
+ view.angles[0] = 0;
+ view.angles[1] = 0;
+ view.angles[2] = 0;
+ view.x = 0;
+ view.y = 0;
+ view.width = videomode->GetModeStereoWidth();
+ view.height = videomode->GetModeStereoHeight();
+ view.fov = 75;
+ view.fovViewmodel = 75;
+ view.m_flAspectRatio = 1.0f;
+ view.zNear = 4;
+ view.zFar = MAX_COORD_FLOAT;
+ view.zNearViewmodel = 4;
+ view.zFarViewmodel = MAX_COORD_FLOAT;
+
+ int savedeveloper = developer.GetInt();
+ developer.SetValue( 0 );
+
+ start = Sys_FloatTime ();
+ for (i=0 ; i<128 ; i++)
+ {
+ view.angles[1] = i/128.0*360.0;
+ g_ClientDLL->RenderView( view, VIEW_CLEAR_COLOR, RENDERVIEW_DRAWVIEWMODEL | RENDERVIEW_DRAWHUD );
+ Shader_SwapBuffers();
+ }
+
+ materials->Flush( true );
+ Shader_SwapBuffers();
+ stop = Sys_FloatTime ();
+ time = stop-start;
+
+ developer.SetValue( savedeveloper );
+
+ ConMsg ("%f seconds (%f fps)\n", time, 128/time);
+}
+
+ConCommand timerefresh("timerefresh", R_TimeRefresh_f, "Profile the renderer.", FCVAR_CHEAT );
+ConCommand linefile("linefile", Linefile_Read_f, "Parses map leak data from .lin file", FCVAR_CHEAT );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void R_Init (void)
+{
+ extern byte *hunk_base;
+
+ extern void InitMathlib( void );
+
+ InitMathlib();
+
+ UpdateMaterialSystemConfig();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void R_Shutdown( void )
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void R_ResetLightStyles( void )
+{
+ for ( int i=0 ; i<256 ; i++ )
+ {
+ d_lightstylevalue[i] = 264;
+ d_lightstyleframe[i] = r_framecount;
+ }
+}
+
+void R_RemoveAllDecalsFromAllModels();
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CON_COMMAND_F( r_cleardecals, "Usage r_cleardecals <permanent>.", FCVAR_CLIENTCMD_CAN_EXECUTE | FCVAR_SERVER_CAN_EXECUTE )
+{
+ if ( host_state.worldmodel )
+ {
+ bool bPermanent = false;
+ if ( args.ArgC() == 2 )
+ {
+ if ( !Q_stricmp( args[1], "permanent" ) )
+ {
+ bPermanent = true;
+ }
+ }
+
+ R_DecalTerm( host_state.worldmodel->brush.pShared, bPermanent );
+ }
+
+ R_RemoveAllDecalsFromAllModels();
+}
+
+
+//-----------------------------------------------------------------------------
+// Loads world geometry. Called when map changes or dx level changes
+//-----------------------------------------------------------------------------
+void R_LoadWorldGeometry( bool bDXChange )
+{
+ // Recreate the sortinfo arrays ( ack, uses new/delete right now ) because doing it with Hunk_AllocName will
+ // leak through every connect that doesn't wipe the hunk ( "reconnect" )
+ MaterialSystem_DestroySortinfo();
+
+ MaterialSystem_RegisterLightmapSurfaces();
+
+ MaterialSystem_CreateSortinfo();
+
+ // UNDONE: This is a really crappy place to do this - shouldn't this stuff be in the modelloader?
+
+ // If this is the first time we've tried to render this map, create a few one-time data structures
+ // These all get cleared out if Map_UnloadModel is ever called by the modelloader interface ( and that happens
+ // any time we free the Hunk down to the low mark since these things all use the Hunk for their data ).
+ if ( !bDXChange )
+ {
+ if ( !modelloader->Map_GetRenderInfoAllocated() )
+ {
+ // create the displacement surfaces for the map
+ modelloader->Map_LoadDisplacements( host_state.worldmodel, false );
+ //if( !DispInfo_CreateStaticBuffers( host_state.worldmodel, materialSortInfoArray, false ) )
+ // Sys_Error( "Can't create static meshes for displacements" );
+
+ modelloader->Map_SetRenderInfoAllocated( true );
+ }
+ }
+ else
+ {
+ // create the displacement surfaces for the map
+ modelloader->Map_LoadDisplacements( host_state.worldmodel, true );
+ }
+
+ if ( bDXChange )
+ {
+ // Must be done before MarkWaterSurfaces
+ modelloader->RecomputeSurfaceFlags( host_state.worldmodel );
+ }
+
+ Mod_MarkWaterSurfaces( host_state.worldmodel );
+
+ // make sure and rebuild lightmaps when the level gets started.
+ GL_RebuildLightmaps();
+
+ if ( bDXChange )
+ {
+ R_BrushBatchInit();
+ R_DecalReSortMaterials();
+ OverlayMgr()->ReSortMaterials();
+ }
+}
+
+
+/*
+===============
+R_LevelInit
+===============
+*/
+void R_LevelInit( void )
+{
+ ConDMsg( "Initializing renderer...\n" );
+
+ COM_TimestampedLog( "R_LevelInit: Start" );
+
+ Assert( g_ClientDLL );
+
+ r_framecount = 1;
+ R_ResetLightStyles();
+ R_DecalInit();
+ R_LoadSkys();
+ R_InitStudio();
+
+ // FIXME: Is this the best place to initialize the kd tree when we're client-only?
+ if ( !sv.IsActive() )
+ {
+ g_pShadowMgr->LevelShutdown();
+ StaticPropMgr()->LevelShutdown();
+ SpatialPartition()->Init( host_state.worldmodel->mins, host_state.worldmodel->maxs );
+ StaticPropMgr()->LevelInit();
+ g_pShadowMgr->LevelInit( host_state.worldbrush->numsurfaces );
+ }
+
+ // We've fully loaded the new level, unload any models that we don't care about any more
+ modelloader->UnloadUnreferencedModels();
+
+ if ( host_state.worldmodel->brush.pShared->numworldlights == 0 )
+ {
+ ConDMsg( "Level unlit, setting 'mat_fullbright 1'\n" );
+ mat_fullbright.SetValue( 1 );
+ }
+
+ UpdateMaterialSystemConfig();
+
+ // FIXME: E3 2003 HACK
+ if ( IsPC() && mat_levelflush.GetBool() )
+ {
+ bool bOnLevelShutdown = false;
+ materials->ResetTempHWMemory( bOnLevelShutdown );
+ }
+
+ // precache any textures that are used in this map.
+ // this is a no-op for textures that are already cached from the previous map.
+ materials->CacheUsedMaterials();
+
+ // Loads the world geometry
+ R_LoadWorldGeometry();
+
+ R_Surface_LevelInit();
+ R_Areaportal_LevelInit();
+
+ // Build the overlay fragments.
+ OverlayMgr()->CreateFragments();
+
+#ifdef _XBOX
+ extern void CompactTextureHeap();
+ CompactTextureHeap();
+#endif
+
+ COM_TimestampedLog( "R_LevelInit: Finish" );
+}
+
+void R_LevelShutdown()
+{
+ R_Surface_LevelShutdown();
+ R_Areaportal_LevelShutdown();
+ g_DispLightmapSamplePositions.Purge();
+}
+
+
+