Fix sprite rotation crashes.
This commit is contained in:
parent
96609e45ae
commit
5ea43aa023
|
@ -740,9 +740,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
patch_t *patch[8][ROTANGLES];
|
patch_t *patch[8][ROTANGLES];
|
||||||
boolean cached[8];
|
boolean cached[8];
|
||||||
#ifdef HWRENDER
|
|
||||||
aatree_t *hardware_patch[8];
|
aatree_t *hardware_patch[8];
|
||||||
#endif
|
|
||||||
} rotsprite_t;
|
} rotsprite_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1374,4 +1374,18 @@ void R_FreeSkinRotSprite(size_t skinnum)
|
||||||
skinsprites++;
|
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
|
#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_CacheRotSprite(spritenum_t sprnum, UINT8 frame, spriteinfo_t *sprinfo, spriteframe_t *sprframe, INT32 rot, UINT8 flip);
|
||||||
void R_FreeSingleRotSprite(spritedef_t *spritedef);
|
void R_FreeSingleRotSprite(spritedef_t *spritedef);
|
||||||
void R_FreeSkinRotSprite(size_t skinnum);
|
void R_FreeSkinRotSprite(size_t skinnum);
|
||||||
|
void R_FreeAllRotSprite(void);
|
||||||
extern fixed_t cosang2rad[ROTANGLES];
|
extern fixed_t cosang2rad[ROTANGLES];
|
||||||
extern fixed_t sinang2rad[ROTANGLES];
|
extern fixed_t sinang2rad[ROTANGLES];
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -125,10 +125,7 @@ static void R_InstallSpriteLump(UINT16 wad, // graphics patch
|
||||||
sprtemp[frame].rotsprite.cached[r] = false;
|
sprtemp[frame].rotsprite.cached[r] = false;
|
||||||
for (ang = 0; ang < ROTANGLES; ang++)
|
for (ang = 0; ang < ROTANGLES; ang++)
|
||||||
sprtemp[frame].rotsprite.patch[r][ang] = NULL;
|
sprtemp[frame].rotsprite.patch[r][ang] = NULL;
|
||||||
#ifdef HWRENDER
|
sprtemp[frame].rotsprite.hardware_patch[r] = M_AATreeAlloc(AATREE_ZUSER);
|
||||||
if (rendermode == render_opengl)
|
|
||||||
sprtemp[frame].rotsprite.hardware_patch[r] = M_AATreeAlloc(AATREE_ZUSER);
|
|
||||||
#endif // HWRENDER
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -200,6 +200,7 @@ void SCR_SetMode(void)
|
||||||
// Lactozilla: Renderer switching
|
// Lactozilla: Renderer switching
|
||||||
if (setrenderneeded)
|
if (setrenderneeded)
|
||||||
{
|
{
|
||||||
|
Z_PreparePatchFlush();
|
||||||
needpatchflush = true;
|
needpatchflush = true;
|
||||||
needpatchrecache = true;
|
needpatchrecache = true;
|
||||||
VID_CheckRenderer();
|
VID_CheckRenderer();
|
||||||
|
|
10
src/z_zone.c
10
src/z_zone.c
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "doomdef.h"
|
#include "doomdef.h"
|
||||||
#include "doomstat.h"
|
#include "doomstat.h"
|
||||||
|
#include "r_patch.h"
|
||||||
#include "i_system.h" // I_GetFreeMem
|
#include "i_system.h" // I_GetFreeMem
|
||||||
#include "i_video.h" // rendermode
|
#include "i_video.h" // rendermode
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
|
@ -517,6 +518,15 @@ void Z_FlushCachedPatches(void)
|
||||||
Z_FreeTag(PU_HWRPATCHINFO_UNLOCKED);
|
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
|
// starting value of nextcleanup
|
||||||
#define CLEANUPCOUNT 2000
|
#define CLEANUPCOUNT 2000
|
||||||
|
|
||||||
|
|
|
@ -147,5 +147,6 @@ char *Z_StrDup(const char *in);
|
||||||
extern boolean needpatchflush;
|
extern boolean needpatchflush;
|
||||||
extern boolean needpatchrecache;
|
extern boolean needpatchrecache;
|
||||||
void Z_FlushCachedPatches(void);
|
void Z_FlushCachedPatches(void);
|
||||||
|
void Z_PreparePatchFlush(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue