Allow scripts to change MAXSPRITESONSCREEN before calls to drawrooms() and friends

git-svn-id: https://svn.eduke32.com/eduke32@6347 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2017-07-08 19:42:11 +00:00
parent 4c981137be
commit 3706ac1b43
10 changed files with 27 additions and 18 deletions

View file

@ -675,7 +675,7 @@ EXTERN uint8_t paletteloaded;
EXTERN char *blendtable[MAXBLENDTABS]; EXTERN char *blendtable[MAXBLENDTABS];
EXTERN uint8_t whitecol, redcol; EXTERN uint8_t whitecol, redcol;
int32_t maxspritesonscreen; EXTERN int32_t maxspritesonscreen;
enum { enum {
PALETTE_MAIN = 1<<0, PALETTE_MAIN = 1<<0,

View file

@ -838,7 +838,7 @@ static void yax_copytsprites()
} }
} }
if (spritesortcnt >= MAXSPRITESONSCREEN) if (spritesortcnt >= maxspritesonscreen)
break; break;
Bmemcpy(&tsprite[spritesortcnt], spr, sizeof(spritetype)); Bmemcpy(&tsprite[spritesortcnt], spr, sizeof(spritetype));
@ -1492,7 +1492,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum)
if (numyaxbunches==0) if (numyaxbunches==0)
{ {
#endif #endif
if (spritesortcnt >= MAXSPRITESONSCREEN) if (spritesortcnt >= maxspritesonscreen)
return 1; return 1;
Bmemcpy(&tsprite[spritesortcnt], spr, sizeof(spritetype)); Bmemcpy(&tsprite[spritesortcnt], spr, sizeof(spritetype));
@ -1507,7 +1507,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum)
{ {
int16_t *sortcnt = &yax_spritesortcnt[yax_globallev]; int16_t *sortcnt = &yax_spritesortcnt[yax_globallev];
if (*sortcnt >= MAXSPRITESONSCREEN) if (*sortcnt >= maxspritesonscreen)
return 1; return 1;
yax_tsprite[yax_globallev][*sortcnt] = z; yax_tsprite[yax_globallev][*sortcnt] = z;
@ -1535,7 +1535,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum)
if (cb>=0 && spr->z+spzofs-spheight < sector[sectnum].ceilingz) if (cb>=0 && spr->z+spzofs-spheight < sector[sectnum].ceilingz)
{ {
sortcnt = &yax_spritesortcnt[yax_globallev-1]; sortcnt = &yax_spritesortcnt[yax_globallev-1];
if (*sortcnt < MAXSPRITESONSCREEN) if (*sortcnt < maxspritesonscreen)
{ {
yax_tsprite[yax_globallev-1][*sortcnt] = z|MAXSPRITES; yax_tsprite[yax_globallev-1][*sortcnt] = z|MAXSPRITES;
(*sortcnt)++; (*sortcnt)++;
@ -1544,7 +1544,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum)
if (fb>=0 && spr->z+spzofs > sector[sectnum].floorz) if (fb>=0 && spr->z+spzofs > sector[sectnum].floorz)
{ {
sortcnt = &yax_spritesortcnt[yax_globallev+1]; sortcnt = &yax_spritesortcnt[yax_globallev+1];
if (*sortcnt < MAXSPRITESONSCREEN) if (*sortcnt < maxspritesonscreen)
{ {
yax_tsprite[yax_globallev+1][*sortcnt] = z|(MAXSPRITES<<1); yax_tsprite[yax_globallev+1][*sortcnt] = z|(MAXSPRITES<<1);
(*sortcnt)++; (*sortcnt)++;
@ -7732,6 +7732,8 @@ int32_t initengine(void)
g_visibility = 512; g_visibility = 512;
parallaxvisibility = 512; parallaxvisibility = 512;
maxspritesonscreen = MAXSPRITESONSCREEN;
loadpalette(); loadpalette();
#ifdef USE_OPENGL #ifdef USE_OPENGL

View file

@ -3827,7 +3827,7 @@ static inline void polymer_scansprites(int16_t sectnum, uspritetype* localtspri
spr = &sprite[i]; spr = &sprite[i];
if ((((spr->cstat&0x8000) == 0) || (showinvisibility)) && if ((((spr->cstat&0x8000) == 0) || (showinvisibility)) &&
(spr->xrepeat > 0) && (spr->yrepeat > 0) && (spr->xrepeat > 0) && (spr->yrepeat > 0) &&
(*localspritesortcnt < MAXSPRITESONSCREEN)) (*localspritesortcnt < maxspritesonscreen))
{ {
// this function's localtsprite is either the tsprite global or // this function's localtsprite is either the tsprite global or
// polymer_drawroom's locattsprite, so no aliasing // polymer_drawroom's locattsprite, so no aliasing
@ -4358,7 +4358,7 @@ static void polymer_drawmdsprite(uspritetype *tspr)
polymer_loadmodelvbos(m); polymer_loadmodelvbos(m);
// Hackish, but that means it's a model drawn by rotatesprite. // Hackish, but that means it's a model drawn by rotatesprite.
if (tspriteptr[MAXSPRITESONSCREEN] == tspr) { if (tspriteptr[maxspritesonscreen] == tspr) {
float x, y, z; float x, y, z;
spos[0] = fglobalposy; spos[0] = fglobalposy;
@ -4397,7 +4397,7 @@ static void polymer_drawmdsprite(uspritetype *tspr)
scale *= m->bscale; scale *= m->bscale;
} }
if (tspriteptr[MAXSPRITESONSCREEN] == tspr) { if (tspriteptr[maxspritesonscreen] == tspr) {
float playerang, radplayerang, cosminusradplayerang, sinminusradplayerang, hudzoom; float playerang, radplayerang, cosminusradplayerang, sinminusradplayerang, hudzoom;
playerang = (globalang & 2047) * (360.f/2048.f) - 90.0f; playerang = (globalang & 2047) * (360.f/2048.f) - 90.0f;

View file

@ -2455,7 +2455,7 @@ void polymost_editorfunc(void)
if (preview_mouseaim) if (preview_mouseaim)
{ {
if (spritesortcnt == MAXSPRITESONSCREEN) if (spritesortcnt == maxspritesonscreen)
spritesortcnt--; spritesortcnt--;
uspritetype *tsp = &tsprite[spritesortcnt]; uspritetype *tsp = &tsprite[spritesortcnt];
@ -5134,7 +5134,7 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
{ {
int32_t fov; int32_t fov;
tspriteptr[MAXSPRITESONSCREEN] = &tspr; tspriteptr[maxspritesonscreen] = &tspr;
bglEnable(GL_ALPHA_TEST); bglEnable(GL_ALPHA_TEST);
bglEnable(GL_BLEND); bglEnable(GL_BLEND);
@ -5152,7 +5152,7 @@ void polymost_dorotatespritemodel(int32_t sx, int32_t sy, int32_t z, int16_t a,
polymer_setaspect(fov); polymer_setaspect(fov);
polymer_drawsprite(MAXSPRITESONSCREEN); polymer_drawsprite(maxspritesonscreen);
polymer_setaspect(pr_fov); polymer_setaspect(pr_fov);

View file

@ -417,7 +417,7 @@ static void G_OROR_DupeSprites(const spritetype *sp)
for (SPRITES_OF_SECT(sp->sectnum, k)) for (SPRITES_OF_SECT(sp->sectnum, k))
{ {
if (spritesortcnt >= MAXSPRITESONSCREEN) if (spritesortcnt >= maxspritesonscreen)
break; break;
if (sprite[k].picnum != SECTOREFFECTOR && sprite[k].z >= sp->z) if (sprite[k].picnum != SECTOREFFECTOR && sprite[k].z >= sp->z)
@ -3800,7 +3800,7 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
{ {
// this exposes a sprite sorting issue which needs to be debugged further... // this exposes a sprite sorting issue which needs to be debugged further...
#if 0 #if 0
if (spritesortcnt < MAXSPRITESONSCREEN) if (spritesortcnt < maxspritesonscreen)
{ {
spritetype *const newt = &tsprite[spritesortcnt++]; spritetype *const newt = &tsprite[spritesortcnt++];
@ -3903,7 +3903,7 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
if ((g_netServer || ud.multimode > 1) && (display_mirror || screenpeek != playerNum || pSprite->owner == -1)) if ((g_netServer || ud.multimode > 1) && (display_mirror || screenpeek != playerNum || pSprite->owner == -1))
{ {
if (ud.showweapons && sprite[g_player[playerNum].ps->i].extra > 0 && g_player[playerNum].ps->curr_weapon > 0 if (ud.showweapons && sprite[g_player[playerNum].ps->i].extra > 0 && g_player[playerNum].ps->curr_weapon > 0
&& spritesortcnt < MAXSPRITESONSCREEN) && spritesortcnt < maxspritesonscreen)
{ {
uspritetype *const newTspr = &tsprite[spritesortcnt]; uspritetype *const newTspr = &tsprite[spritesortcnt];
int const currentWeapon = g_player[playerNum].ps->curr_weapon; int const currentWeapon = g_player[playerNum].ps->curr_weapon;
@ -3920,7 +3920,7 @@ void G_DoSpriteAnimations(int32_t ourx, int32_t oury, int32_t oura, int32_t smoo
spritesortcnt++; spritesortcnt++;
} }
if (g_player[playerNum].inputBits->extbits & (1 << 7) && !ud.pause_on && spritesortcnt < MAXSPRITESONSCREEN) if (g_player[playerNum].inputBits->extbits & (1 << 7) && !ud.pause_on && spritesortcnt < maxspritesonscreen)
{ {
uspritetype *const playerTyping = t; uspritetype *const playerTyping = t;
@ -4191,7 +4191,7 @@ skip:
if (actor[i].flags & SFLAG_NOFLOORSHADOW) if (actor[i].flags & SFLAG_NOFLOORSHADOW)
continue; continue;
if (ud.shadows && spritesortcnt < (MAXSPRITESONSCREEN-2) && getrendermode() != REND_POLYMER) if (ud.shadows && spritesortcnt < (maxspritesonscreen-2) && getrendermode() != REND_POLYMER)
{ {
int const shadowZ = ((sector[sect].lotag & 0xff) > 2 || pSprite->statnum == STAT_PROJECTILE || int const shadowZ = ((sector[sect].lotag & 0xff) > 2 || pSprite->statnum == STAT_PROJECTILE ||
pSprite->statnum == STAT_MISC || pSprite->picnum == DRONE || pSprite->picnum == COMMANDER) pSprite->statnum == STAT_MISC || pSprite->picnum == DRONE || pSprite->picnum == COMMANDER)

View file

@ -1198,6 +1198,7 @@ const memberlabel_t UserdefsLabels[]=
{ "gametext_tracking", USERDEFS_GAMETEXT_TRACKING, 0, 0 }, { "gametext_tracking", USERDEFS_GAMETEXT_TRACKING, 0, 0 },
{ "mgametext_tracking", USERDEFS_MGAMETEXT_TRACKING, 0, 0 }, { "mgametext_tracking", USERDEFS_MGAMETEXT_TRACKING, 0, 0 },
{ "menutext_tracking", USERDEFS_MENUTEXT_TRACKING, 0, 0 }, { "menutext_tracking", USERDEFS_MENUTEXT_TRACKING, 0, 0 },
{ "maxspritesonscreen", USERDEFS_MAXSPRITESONSCREEN, 0, 0 },
{ "", -1, 0, 0 } // END OF LIST { "", -1, 0, 0 } // END OF LIST
}; };
@ -6244,6 +6245,8 @@ static void C_AddDefaultDefinitions(void)
C_AddDefinition("PROJ_YREPEAT", PROJ_YREPEAT, LABEL_DEFINE); C_AddDefinition("PROJ_YREPEAT", PROJ_YREPEAT, LABEL_DEFINE);
C_AddDefinition("GAMEARRAY_RESTORE", GAMEARRAY_RESTORE, LABEL_DEFINE); C_AddDefinition("GAMEARRAY_RESTORE", GAMEARRAY_RESTORE, LABEL_DEFINE);
C_AddDefinition("MAXSPRITESONSCREEN", MAXSPRITESONSCREEN, LABEL_DEFINE);
} }
#endif #endif

View file

@ -523,6 +523,7 @@ enum UserdefsLabel_t
USERDEFS_GAMETEXT_TRACKING, USERDEFS_GAMETEXT_TRACKING,
USERDEFS_MGAMETEXT_TRACKING, USERDEFS_MGAMETEXT_TRACKING,
USERDEFS_MENUTEXT_TRACKING, USERDEFS_MENUTEXT_TRACKING,
USERDEFS_MAXSPRITESONSCREEN,
USERDEFS_END USERDEFS_END
}; };

View file

@ -172,6 +172,7 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum)
case USERDEFS_GAMETEXT_TRACKING: labelNum = MF_BluefontGame.between.x; break; case USERDEFS_GAMETEXT_TRACKING: labelNum = MF_BluefontGame.between.x; break;
case USERDEFS_MGAMETEXT_TRACKING: labelNum = MF_Bluefont.between.x; break; case USERDEFS_MGAMETEXT_TRACKING: labelNum = MF_Bluefont.between.x; break;
case USERDEFS_MENUTEXT_TRACKING: labelNum = MF_Redfont.between.x; break; case USERDEFS_MENUTEXT_TRACKING: labelNum = MF_Redfont.between.x; break;
case USERDEFS_MAXSPRITESONSCREEN: labelNum = maxspritesonscreen; break;
default: labelNum = -1; break; default: labelNum = -1; break;
} }
@ -294,6 +295,7 @@ void __fastcall VM_SetUserdef(int32_t const labelNum, int32_t const iSet)
case USERDEFS_GAMETEXT_TRACKING: MF_BluefontGame.between.x = iSet; break; case USERDEFS_GAMETEXT_TRACKING: MF_BluefontGame.between.x = iSet; break;
case USERDEFS_MGAMETEXT_TRACKING: MF_BluefontRed.between.x = MF_Bluefont.between.x = iSet; break; case USERDEFS_MGAMETEXT_TRACKING: MF_BluefontRed.between.x = MF_Bluefont.between.x = iSet; break;
case USERDEFS_MENUTEXT_TRACKING: MF_Redfont.between.x = iSet; break; case USERDEFS_MENUTEXT_TRACKING: MF_Redfont.between.x = iSet; break;
case USERDEFS_MAXSPRITESONSCREEN: maxspritesonscreen = clamp(iSet, MAXSPRITESONSCREEN>>2, MAXSPRITESONSCREEN); break;
default: break; default: break;
} }
} }

View file

@ -1539,6 +1539,7 @@ static void Gv_AddSystemVars(void)
Gv_NewVar("Numsprites",(intptr_t)&Numsprites, GAMEVAR_SYSTEM | GAMEVAR_INTPTR | GAMEVAR_READONLY); Gv_NewVar("Numsprites",(intptr_t)&Numsprites, GAMEVAR_SYSTEM | GAMEVAR_INTPTR | GAMEVAR_READONLY);
Gv_NewVar("lastsavepos",(intptr_t)&g_lastSaveSlot, GAMEVAR_SYSTEM | GAMEVAR_INTPTR); Gv_NewVar("lastsavepos",(intptr_t)&g_lastSaveSlot, GAMEVAR_SYSTEM | GAMEVAR_INTPTR);
# ifdef USE_OPENGL # ifdef USE_OPENGL
Gv_NewVar("rendmode",(intptr_t)&rendmode, GAMEVAR_READONLY | GAMEVAR_INTPTR | GAMEVAR_SYSTEM); Gv_NewVar("rendmode",(intptr_t)&rendmode, GAMEVAR_READONLY | GAMEVAR_INTPTR | GAMEVAR_SYSTEM);
# else # else

View file

@ -1725,7 +1725,7 @@ badindex:
M32_ERROR("Tried to duplicate nonexistent sprite %d", ospritenum); M32_ERROR("Tried to duplicate nonexistent sprite %d", ospritenum);
} }
if ((tw==CON_DUPSPRITE && Numsprites >= MAXSPRITES) || if ((tw==CON_DUPSPRITE && Numsprites >= MAXSPRITES) ||
(tw==CON_DUPSPRITE && spritesortcnt >= MAXSPRITESONSCREEN)) (tw==CON_DUPSPRITE && spritesortcnt >= maxspritesonscreen))
{ {
M32_ERROR("Maximum number of sprites reached."); M32_ERROR("Maximum number of sprites reached.");
} }