rt: recreate sprite model on every map

This is a workaround for inconsistent memory management: some subsystems completely clear their memories and start allocating from zero. This leads to overwriting long lived sprite model with garbage.

TODO FIXME
This commit is contained in:
Ivan 'provod' Avdeev 2023-05-31 10:15:27 -07:00
parent 8b50ebb035
commit dd8f06ae60
3 changed files with 25 additions and 7 deletions

View File

@ -127,6 +127,8 @@ static void loadBrushModels( void ) {
static void loadMap(const model_t* const map) {
mapLoadBegin(map);
R_SpriteNewMapFIXME();
// Load light entities and patch data prior to loading map brush model
XVK_ParseMapEntities();

View File

@ -113,18 +113,31 @@ static qboolean createQuadModel(void) {
});
}
qboolean R_SpriteInit(void) {
R_SpeedsRegisterMetric(&g_sprite.stats.sprites, "sprites_count", kSpeedsMetricCount);
return createQuadModel();
}
void R_SpriteShutdown(void) {
static void destroyQuadModel(void) {
if (g_sprite.quad.model.num_geometries)
VK_RenderModelDestroy(&g_sprite.quad.model);
if (g_sprite.quad.geom.block_handle.size)
R_GeometryRangeFree(&g_sprite.quad.geom);
g_sprite.quad.model.num_geometries = 0;
g_sprite.quad.geom.block_handle.size = 0;
}
qboolean R_SpriteInit(void) {
R_SpeedsRegisterMetric(&g_sprite.stats.sprites, "sprites_count", kSpeedsMetricCount);
return true;
//return createQuadModel();
}
void R_SpriteShutdown(void) {
destroyQuadModel();
}
void R_SpriteNewMapFIXME(void) {
destroyQuadModel();
ASSERT(createQuadModel());
}
static mspriteframe_t *R_GetSpriteFrame( const model_t *pModel, int frame, float yaw )

View File

@ -11,3 +11,6 @@ void R_VkSpriteDrawModel( cl_entity_t *e, float blend );
qboolean R_SpriteInit(void);
void R_SpriteShutdown(void);
// FIXME needed to recreate the sprite quad model, otherwise its memory will be freed, reused and corrupted
void R_SpriteNewMapFIXME(void);