mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-04-14 14:13:15 +00:00
Fix sprite rotation crashes.
This commit is contained in:
parent
96609e45ae
commit
5ea43aa023
7 changed files with 28 additions and 6 deletions
|
@ -740,9 +740,7 @@ typedef struct
|
|||
{
|
||||
patch_t *patch[8][ROTANGLES];
|
||||
boolean cached[8];
|
||||
#ifdef HWRENDER
|
||||
aatree_t *hardware_patch[8];
|
||||
#endif
|
||||
} rotsprite_t;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1374,4 +1374,18 @@ void R_FreeSkinRotSprite(size_t skinnum)
|
|||
skinsprites++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// R_FreeAllRotSprite
|
||||
//
|
||||
// Free ALL sprite rotation data from memory.
|
||||
//
|
||||
void R_FreeAllRotSprite(void)
|
||||
{
|
||||
INT32 i;
|
||||
for (i = 0; i < numsprites; i++)
|
||||
R_FreeSingleRotSprite(&sprites[i]);
|
||||
for (i = 0; i < numskins; ++i)
|
||||
R_FreeSkinRotSprite(i);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -69,6 +69,7 @@ void R_ParseSPRTINFOLump(UINT16 wadNum, UINT16 lumpNum);
|
|||
void R_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, spriteframe_t *sprframe, INT32 rot, UINT8 flip);
|
||||
void R_FreeSingleRotSprite(spritedef_t *spritedef);
|
||||
void R_FreeSkinRotSprite(size_t skinnum);
|
||||
void R_FreeAllRotSprite(void);
|
||||
extern fixed_t cosang2rad[ROTANGLES];
|
||||
extern fixed_t sinang2rad[ROTANGLES];
|
||||
#endif
|
||||
|
|
|
@ -125,10 +125,7 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
|||
sprtemp[frame].rotsprite.cached[r] = false;
|
||||
for (ang = 0; ang < ROTANGLES; ang++)
|
||||
sprtemp[frame].rotsprite.patch[r][ang] = NULL;
|
||||
#ifdef HWRENDER
|
||||
if (rendermode == render_opengl)
|
||||
sprtemp[frame].rotsprite.hardware_patch[r] = M_AATreeAlloc(AATREE_ZUSER);
|
||||
#endif // HWRENDER
|
||||
sprtemp[frame].rotsprite.hardware_patch[r] = M_AATreeAlloc(AATREE_ZUSER);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -200,6 +200,7 @@ void SCR_SetMode(void)
|
|||
// Lactozilla: Renderer switching
|
||||
if (setrenderneeded)
|
||||
{
|
||||
Z_PreparePatchFlush();
|
||||
needpatchflush = true;
|
||||
needpatchrecache = true;
|
||||
VID_CheckRenderer();
|
||||
|
|
10
src/z_zone.c
10
src/z_zone.c
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "doomdef.h"
|
||||
#include "doomstat.h"
|
||||
#include "r_patch.h"
|
||||
#include "i_system.h" // I_GetFreeMem
|
||||
#include "i_video.h" // rendermode
|
||||
#include "z_zone.h"
|
||||
|
@ -517,6 +518,15 @@ void Z_FlushCachedPatches(void)
|
|||
Z_FreeTag(PU_HWRPATCHINFO_UNLOCKED);
|
||||
}
|
||||
|
||||
// happens before a renderer switch
|
||||
void Z_PreparePatchFlush(void)
|
||||
{
|
||||
CONS_Debug(DBG_RENDER, "Z_PreparePatchFlush()...\n");
|
||||
#ifdef ROTSPRITE
|
||||
R_FreeAllRotSprite();
|
||||
#endif
|
||||
}
|
||||
|
||||
// starting value of nextcleanup
|
||||
#define CLEANUPCOUNT 2000
|
||||
|
||||
|
|
|
@ -147,5 +147,6 @@ char *Z_StrDup(const char *in);
|
|||
extern boolean needpatchflush;
|
||||
extern boolean needpatchrecache;
|
||||
void Z_FlushCachedPatches(void);
|
||||
void Z_PreparePatchFlush(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue