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 ); numPoints = LittleLong( ds->numVerts );
if (numPoints > MAX_FACE_POINTS) { if (numPoints > MAX_FACE_POINTS) {
ri.Printf( PRINT_WARNING, "WARNING: MAX_FACE_POINTS exceeded: %i\n", numPoints); ri.Printf( PRINT_WARNING, "WARNING: MAX_FACE_POINTS exceeded: %i\n", numPoints);
numPoints = MAX_FACE_POINTS; numPoints = MAX_FACE_POINTS;
surf->shader = tr.defaultShader; surf->shader = tr.defaultShader;
} }
numIndexes = LittleLong( ds->numIndexes ); numIndexes = LittleLong( ds->numIndexes );

View file

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

View file

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

View file

@ -1490,14 +1490,7 @@ void R_TerrainRestart_f(void)
return; return;
} }
if (g_pVert) { R_TerrainFree();
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
R_PreTessellateTerrain(); 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 R_SwapTerraPatch

View file

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

View file

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

View file

@ -1489,15 +1489,8 @@ void R_TerrainRestart_f(void)
if (tr.world->numTerraPatches < 0) { if (tr.world->numTerraPatches < 0) {
return; return;
} }
if (g_pVert) { R_TerrainFree();
ri.Free(g_pVert);
g_pVert = NULL;
}
if (g_pTris) {
ri.Free(g_pTris);
g_pTris = NULL;
}
R_PreTessellateTerrain(); 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 R_SwapTerraPatch