Clean up terrain when shutting the Ref down

This commit is contained in:
smallmodel 2024-12-30 16:46:37 +01:00
parent e0dee12578
commit 716a574abe
No known key found for this signature in database
GPG key ID: A96F163ED4891440
7 changed files with 92 additions and 19 deletions

View file

@ -630,8 +630,8 @@ static void ParseFace( dsurface_t *ds, drawVert_t *verts, msurface_t *surf, int
numPoints = LittleLong( ds->numVerts );
if (numPoints > MAX_FACE_POINTS) {
ri.Printf( PRINT_WARNING, "WARNING: MAX_FACE_POINTS exceeded: %i\n", numPoints);
numPoints = MAX_FACE_POINTS;
surf->shader = tr.defaultShader;
numPoints = MAX_FACE_POINTS;
surf->shader = tr.defaultShader;
}
numIndexes = LittleLong( ds->numIndexes );

View file

@ -1754,6 +1754,8 @@ void RE_Shutdown( qboolean destroyWindow ) {
R_ShutdownFont();
R_ShutdownTerrain();
tr.registered = qfalse;
}
@ -1770,6 +1772,8 @@ void RE_BeginRegistration(glconfig_t* glconfigOut) {
R_IssuePendingRenderCommands();
R_LevelMarksFree();
R_TerrainFree();
ri.Hunk_Clear();
*glconfigOut = glConfig;

View file

@ -2182,6 +2182,8 @@ void R_MarkTerrainPatch(cTerraPatchUnpacked_t* pPatch);
void R_AddTerrainSurfaces();
void R_AddTerrainMarkSurfaces();
void R_InitTerrain();
void R_ShutdownTerrain();
void R_TerrainFree();
void R_TerrainPrepareFrame();
qboolean R_TerrainHeightForPoly(cTerraPatchUnpacked_t* pPatch, polyVert_t* pVerts, int nVerts);
void R_SwapTerraPatch(cTerraPatch_t* pPatch);

View file

@ -1490,14 +1490,7 @@ void R_TerrainRestart_f(void)
return;
}
if (g_pVert) {
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
R_TerrainFree();
R_PreTessellateTerrain();
}
@ -1654,6 +1647,37 @@ void R_InitTerrain()
}
}
/*
================
R_ShutdownTerrain
================
*/
void R_ShutdownTerrain()
{
ri.Cmd_RemoveCommand("ter_restart");
R_TerrainFree();
}
/*
================
R_TerrainFree
Frees terrain memory
================
*/
void R_TerrainFree()
{
if (g_pVert) {
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
}
/*
====================
R_SwapTerraPatch

View file

@ -1836,6 +1836,12 @@ void RE_Shutdown( qboolean destroyWindow ) {
Com_Memset( &glState, 0, sizeof( glState ) );
}
//
// OPENMOHAA-specific stuff
//=========================
R_ShutdownTerrain();
//=========================
tr.registered = qfalse;
}
@ -1858,6 +1864,18 @@ void RE_BeginRegistration(glconfig_t* glconfigOut) {
R_ClearFlares();
RE_ClearScene();
//
// OPENMOHAA-specific stuff
//=========================
R_LevelMarksFree();
R_TerrainFree();
R_InitLensFlare();
R_LevelMarksInit();
ri.UI_LoadResource("*124");
//=========================
tr.registered = qtrue;
}
//=========================

View file

@ -3174,6 +3174,8 @@ void R_MarkTerrainPatch(cTerraPatchUnpacked_t* pPatch);
void R_AddTerrainSurfaces();
void R_AddTerrainMarkSurfaces();
void R_InitTerrain();
void R_ShutdownTerrain();
void R_TerrainFree();
void R_TerrainPrepareFrame();
qboolean R_TerrainHeightForPoly(cTerraPatchUnpacked_t* pPatch, polyVert_t* pVerts, int nVerts);
void R_SwapTerraPatch(cTerraPatch_t* pPatch);

View file

@ -1489,15 +1489,8 @@ void R_TerrainRestart_f(void)
if (tr.world->numTerraPatches < 0) {
return;
}
if (g_pVert) {
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
R_TerrainFree();
R_PreTessellateTerrain();
}
@ -1654,6 +1647,36 @@ void R_InitTerrain()
}
}
/*
================
R_ShutdownTerrain
================
*/
void R_ShutdownTerrain()
{
ri.Cmd_RemoveCommand("ter_restart");
R_TerrainFree();
}
/*
================
R_TerrainFree
Frees terrain memory
================
*/
void R_TerrainFree()
{
if (g_pVert) {
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
}
/*
====================
R_SwapTerraPatch