From 3706ac1b4376e996737f6e0e6b53340054b73db3 Mon Sep 17 00:00:00 2001 From: terminx Date: Sat, 8 Jul 2017 19:42:11 +0000 Subject: [PATCH] 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 --- source/build/include/build.h | 2 +- source/build/src/engine.cpp | 12 +++++++----- source/build/src/polymer.cpp | 6 +++--- source/build/src/polymost.cpp | 6 +++--- source/duke3d/src/game.cpp | 10 +++++----- source/duke3d/src/gamedef.cpp | 3 +++ source/duke3d/src/gamedef.h | 1 + source/duke3d/src/gamestructures.cpp | 2 ++ source/duke3d/src/gamevars.cpp | 1 + source/duke3d/src/m32exec.cpp | 2 +- 10 files changed, 27 insertions(+), 18 deletions(-) diff --git a/source/build/include/build.h b/source/build/include/build.h index d55be245b..ca36962ec 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -675,7 +675,7 @@ EXTERN uint8_t paletteloaded; EXTERN char *blendtable[MAXBLENDTABS]; EXTERN uint8_t whitecol, redcol; -int32_t maxspritesonscreen; +EXTERN int32_t maxspritesonscreen; enum { PALETTE_MAIN = 1<<0, diff --git a/source/build/src/engine.cpp b/source/build/src/engine.cpp index 651819cc6..ea8028316 100644 --- a/source/build/src/engine.cpp +++ b/source/build/src/engine.cpp @@ -838,7 +838,7 @@ static void yax_copytsprites() } } - if (spritesortcnt >= MAXSPRITESONSCREEN) + if (spritesortcnt >= maxspritesonscreen) break; Bmemcpy(&tsprite[spritesortcnt], spr, sizeof(spritetype)); @@ -1492,7 +1492,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum) if (numyaxbunches==0) { #endif - if (spritesortcnt >= MAXSPRITESONSCREEN) + if (spritesortcnt >= maxspritesonscreen) return 1; 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]; - if (*sortcnt >= MAXSPRITESONSCREEN) + if (*sortcnt >= maxspritesonscreen) return 1; 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) { sortcnt = &yax_spritesortcnt[yax_globallev-1]; - if (*sortcnt < MAXSPRITESONSCREEN) + if (*sortcnt < maxspritesonscreen) { yax_tsprite[yax_globallev-1][*sortcnt] = z|MAXSPRITES; (*sortcnt)++; @@ -1544,7 +1544,7 @@ int32_t engine_addtsprite(int16_t z, int16_t sectnum) if (fb>=0 && spr->z+spzofs > sector[sectnum].floorz) { sortcnt = &yax_spritesortcnt[yax_globallev+1]; - if (*sortcnt < MAXSPRITESONSCREEN) + if (*sortcnt < maxspritesonscreen) { yax_tsprite[yax_globallev+1][*sortcnt] = z|(MAXSPRITES<<1); (*sortcnt)++; @@ -7732,6 +7732,8 @@ int32_t initengine(void) g_visibility = 512; parallaxvisibility = 512; + maxspritesonscreen = MAXSPRITESONSCREEN; + loadpalette(); #ifdef USE_OPENGL diff --git a/source/build/src/polymer.cpp b/source/build/src/polymer.cpp index da59f35f4..181a15d5c 100644 --- a/source/build/src/polymer.cpp +++ b/source/build/src/polymer.cpp @@ -3827,7 +3827,7 @@ static inline void polymer_scansprites(int16_t sectnum, uspritetype* localtspri spr = &sprite[i]; if ((((spr->cstat&0x8000) == 0) || (showinvisibility)) && (spr->xrepeat > 0) && (spr->yrepeat > 0) && - (*localspritesortcnt < MAXSPRITESONSCREEN)) + (*localspritesortcnt < maxspritesonscreen)) { // this function's localtsprite is either the tsprite global or // polymer_drawroom's locattsprite, so no aliasing @@ -4358,7 +4358,7 @@ static void polymer_drawmdsprite(uspritetype *tspr) polymer_loadmodelvbos(m); // Hackish, but that means it's a model drawn by rotatesprite. - if (tspriteptr[MAXSPRITESONSCREEN] == tspr) { + if (tspriteptr[maxspritesonscreen] == tspr) { float x, y, z; spos[0] = fglobalposy; @@ -4397,7 +4397,7 @@ static void polymer_drawmdsprite(uspritetype *tspr) scale *= m->bscale; } - if (tspriteptr[MAXSPRITESONSCREEN] == tspr) { + if (tspriteptr[maxspritesonscreen] == tspr) { float playerang, radplayerang, cosminusradplayerang, sinminusradplayerang, hudzoom; playerang = (globalang & 2047) * (360.f/2048.f) - 90.0f; diff --git a/source/build/src/polymost.cpp b/source/build/src/polymost.cpp index 33cb82821..77fa6196c 100644 --- a/source/build/src/polymost.cpp +++ b/source/build/src/polymost.cpp @@ -2455,7 +2455,7 @@ void polymost_editorfunc(void) if (preview_mouseaim) { - if (spritesortcnt == MAXSPRITESONSCREEN) + if (spritesortcnt == maxspritesonscreen) 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; - tspriteptr[MAXSPRITESONSCREEN] = &tspr; + tspriteptr[maxspritesonscreen] = &tspr; bglEnable(GL_ALPHA_TEST); 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_drawsprite(MAXSPRITESONSCREEN); + polymer_drawsprite(maxspritesonscreen); polymer_setaspect(pr_fov); diff --git a/source/duke3d/src/game.cpp b/source/duke3d/src/game.cpp index a7cdde954..a7391627f 100644 --- a/source/duke3d/src/game.cpp +++ b/source/duke3d/src/game.cpp @@ -417,7 +417,7 @@ static void G_OROR_DupeSprites(const spritetype *sp) for (SPRITES_OF_SECT(sp->sectnum, k)) { - if (spritesortcnt >= MAXSPRITESONSCREEN) + if (spritesortcnt >= maxspritesonscreen) break; 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... #if 0 - if (spritesortcnt < MAXSPRITESONSCREEN) + if (spritesortcnt < maxspritesonscreen) { 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 (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]; 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++; } - 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; @@ -4191,7 +4191,7 @@ skip: if (actor[i].flags & SFLAG_NOFLOORSHADOW) 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 || pSprite->statnum == STAT_MISC || pSprite->picnum == DRONE || pSprite->picnum == COMMANDER) diff --git a/source/duke3d/src/gamedef.cpp b/source/duke3d/src/gamedef.cpp index 022fad1b1..3f5ce406f 100644 --- a/source/duke3d/src/gamedef.cpp +++ b/source/duke3d/src/gamedef.cpp @@ -1198,6 +1198,7 @@ const memberlabel_t UserdefsLabels[]= { "gametext_tracking", USERDEFS_GAMETEXT_TRACKING, 0, 0 }, { "mgametext_tracking", USERDEFS_MGAMETEXT_TRACKING, 0, 0 }, { "menutext_tracking", USERDEFS_MENUTEXT_TRACKING, 0, 0 }, + { "maxspritesonscreen", USERDEFS_MAXSPRITESONSCREEN, 0, 0 }, { "", -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("GAMEARRAY_RESTORE", GAMEARRAY_RESTORE, LABEL_DEFINE); + + C_AddDefinition("MAXSPRITESONSCREEN", MAXSPRITESONSCREEN, LABEL_DEFINE); } #endif diff --git a/source/duke3d/src/gamedef.h b/source/duke3d/src/gamedef.h index afb5795eb..66a59f7e3 100644 --- a/source/duke3d/src/gamedef.h +++ b/source/duke3d/src/gamedef.h @@ -523,6 +523,7 @@ enum UserdefsLabel_t USERDEFS_GAMETEXT_TRACKING, USERDEFS_MGAMETEXT_TRACKING, USERDEFS_MENUTEXT_TRACKING, + USERDEFS_MAXSPRITESONSCREEN, USERDEFS_END }; diff --git a/source/duke3d/src/gamestructures.cpp b/source/duke3d/src/gamestructures.cpp index 92c493828..c3167c93e 100644 --- a/source/duke3d/src/gamestructures.cpp +++ b/source/duke3d/src/gamestructures.cpp @@ -172,6 +172,7 @@ int32_t __fastcall VM_GetUserdef(int32_t labelNum) case USERDEFS_GAMETEXT_TRACKING: labelNum = MF_BluefontGame.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_MAXSPRITESONSCREEN: labelNum = maxspritesonscreen; 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_MGAMETEXT_TRACKING: MF_BluefontRed.between.x = MF_Bluefont.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; } } diff --git a/source/duke3d/src/gamevars.cpp b/source/duke3d/src/gamevars.cpp index dc9ad809d..b1c8d804b 100644 --- a/source/duke3d/src/gamevars.cpp +++ b/source/duke3d/src/gamevars.cpp @@ -1539,6 +1539,7 @@ static void Gv_AddSystemVars(void) Gv_NewVar("Numsprites",(intptr_t)&Numsprites, GAMEVAR_SYSTEM | GAMEVAR_INTPTR | GAMEVAR_READONLY); Gv_NewVar("lastsavepos",(intptr_t)&g_lastSaveSlot, GAMEVAR_SYSTEM | GAMEVAR_INTPTR); + # ifdef USE_OPENGL Gv_NewVar("rendmode",(intptr_t)&rendmode, GAMEVAR_READONLY | GAMEVAR_INTPTR | GAMEVAR_SYSTEM); # else diff --git a/source/duke3d/src/m32exec.cpp b/source/duke3d/src/m32exec.cpp index 4c6ed4249..8982a20dd 100644 --- a/source/duke3d/src/m32exec.cpp +++ b/source/duke3d/src/m32exec.cpp @@ -1725,7 +1725,7 @@ badindex: M32_ERROR("Tried to duplicate nonexistent sprite %d", ospritenum); } if ((tw==CON_DUPSPRITE && Numsprites >= MAXSPRITES) || - (tw==CON_DUPSPRITE && spritesortcnt >= MAXSPRITESONSCREEN)) + (tw==CON_DUPSPRITE && spritesortcnt >= maxspritesonscreen)) { M32_ERROR("Maximum number of sprites reached."); }