Merge branch 'next' into platform-fixes

This commit is contained in:
lachwright 2020-02-01 13:34:04 +08:00
commit d67388ece0
13 changed files with 151 additions and 130 deletions

View file

@ -2695,8 +2695,18 @@ static void F_FigureActiveTtScale(void)
SINT8 newttscale = max(1, min(6, vid.dupx)); SINT8 newttscale = max(1, min(6, vid.dupx));
SINT8 oldttscale = activettscale; SINT8 oldttscale = activettscale;
if (needpatchrecache)
ttloaded[0] = ttloaded[1] = ttloaded[2] = ttloaded[3] = ttloaded[4] = ttloaded[5] = 0;
else
{
if (newttscale == testttscale) if (newttscale == testttscale)
return; return;
// We have a new ttscale, so load gfx
if(oldttscale > 0)
F_UnloadAlacroixGraphics(oldttscale);
}
testttscale = newttscale; testttscale = newttscale;
// If ttscale is unavailable: look for lower scales, then higher scales. // If ttscale is unavailable: look for lower scales, then higher scales.
@ -2714,10 +2724,6 @@ static void F_FigureActiveTtScale(void)
activettscale = (newttscale >= 1 && newttscale <= 6) ? newttscale : 0; activettscale = (newttscale >= 1 && newttscale <= 6) ? newttscale : 0;
// We have a new ttscale, so load gfx
if(oldttscale > 0)
F_UnloadAlacroixGraphics(oldttscale);
if(activettscale > 0) if(activettscale > 0)
F_LoadAlacroixGraphics(activettscale); F_LoadAlacroixGraphics(activettscale);
} }
@ -2759,12 +2765,6 @@ void F_TitleScreenDrawer(void)
return; return;
#endif #endif
if (needpatchrecache && (curttmode == TTMODE_ALACROIX))
{
ttloaded[0] = ttloaded[1] = ttloaded[2] = ttloaded[3] = ttloaded[4] = ttloaded[5] = 0;
F_LoadAlacroixGraphics(activettscale);
}
switch(curttmode) switch(curttmode)
{ {
case TTMODE_OLD: case TTMODE_OLD:
@ -3630,7 +3630,6 @@ void F_StartContinue(void)
} }
wipestyleflags = WSF_FADEOUT; wipestyleflags = WSF_FADEOUT;
F_TryColormapFade(31);
G_SetGamestate(GS_CONTINUING); G_SetGamestate(GS_CONTINUING);
gameaction = ga_nothing; gameaction = ga_nothing;

View file

@ -1941,6 +1941,10 @@ boolean G_IsTitleCardAvailable(void)
if (gametyperules & GTR_NOTITLECARD) if (gametyperules & GTR_NOTITLECARD)
return false; return false;
// The current level has no name.
if (!mapheaderinfo[gamemap-1]->lvlttl[0])
return false;
// The title card is available. // The title card is available.
return true; return true;
} }

View file

@ -5325,7 +5325,7 @@ static void HWR_AddSprites(sector_t *sec)
#ifdef HWPRECIP #ifdef HWPRECIP
precipmobj_t *precipthing; precipmobj_t *precipthing;
#endif #endif
fixed_t approx_dist, limit_dist, hoop_limit_dist; fixed_t limit_dist, hoop_limit_dist;
// BSP is traversed by subsector. // BSP is traversed by subsector.
// A sector might have been split into several // A sector might have been split into several
@ -5344,34 +5344,9 @@ static void HWR_AddSprites(sector_t *sec)
// If a limit exists, handle things a tiny bit different. // If a limit exists, handle things a tiny bit different.
limit_dist = (fixed_t)(cv_drawdist.value) << FRACBITS; limit_dist = (fixed_t)(cv_drawdist.value) << FRACBITS;
hoop_limit_dist = (fixed_t)(cv_drawdist_nights.value) << FRACBITS; hoop_limit_dist = (fixed_t)(cv_drawdist_nights.value) << FRACBITS;
if (limit_dist || hoop_limit_dist)
{
for (thing = sec->thinglist; thing; thing = thing->snext) for (thing = sec->thinglist; thing; thing = thing->snext)
{ {
if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) if (R_ThingVisibleWithinDist(thing, limit_dist, hoop_limit_dist))
continue;
approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y);
if (thing->sprite == SPR_HOOP)
{
if (hoop_limit_dist && approx_dist > hoop_limit_dist)
continue;
}
else
{
if (limit_dist && approx_dist > limit_dist)
continue;
}
HWR_ProjectSprite(thing);
}
}
else
{
// Draw everything in sector, no checks
for (thing = sec->thinglist; thing; thing = thing->snext)
if (!(thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW))
HWR_ProjectSprite(thing); HWR_ProjectSprite(thing);
} }
@ -5381,14 +5356,7 @@ static void HWR_AddSprites(sector_t *sec)
{ {
for (precipthing = sec->preciplist; precipthing; precipthing = precipthing->snext) for (precipthing = sec->preciplist; precipthing; precipthing = precipthing->snext)
{ {
if (precipthing->precipflags & PCF_INVISIBLE) if (R_PrecipThingVisible(precipthing, limit_dist))
continue;
approx_dist = P_AproxDistance(viewx-precipthing->x, viewy-precipthing->y);
if (approx_dist > limit_dist)
continue;
HWR_ProjectPrecipitationSprite(precipthing); HWR_ProjectPrecipitationSprite(precipthing);
} }
} }
@ -5643,7 +5611,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
if ((thing->flags2 & MF2_LINKDRAW) && thing->tracer) if ((thing->flags2 & MF2_LINKDRAW) && thing->tracer)
{ {
// bodge support - not nearly as comprehensive as r_things.c, but better than nothing // bodge support - not nearly as comprehensive as r_things.c, but better than nothing
if (thing->tracer->sprite == SPR_NULL || thing->tracer->flags2 & MF2_DONTDRAW) if (! R_ThingVisible(thing->tracer))
return; return;
} }

View file

@ -1437,7 +1437,7 @@ static void HU_drawMiniChat(void)
for (; i>0; i--) for (; i>0; i--)
{ {
const char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i-1]); char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i-1]);
size_t j = 0; size_t j = 0;
INT32 linescount = 0; INT32 linescount = 0;
@ -1479,6 +1479,9 @@ static void HU_drawMiniChat(void)
dy = 0; dy = 0;
dx = 0; dx = 0;
msglines += linescount+1; msglines += linescount+1;
if (msg)
Z_Free(msg);
} }
y = chaty - charheight*(msglines+1); y = chaty - charheight*(msglines+1);
@ -1501,7 +1504,7 @@ static void HU_drawMiniChat(void)
INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below... INT32 timer = ((cv_chattime.value*TICRATE)-chat_timers[i]) - cv_chattime.value*TICRATE+9; // see below...
INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one. INT32 transflag = (timer >= 0 && timer <= 9) ? (timer*V_10TRANS) : 0; // you can make bad jokes out of this one.
size_t j = 0; size_t j = 0;
const char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it. char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_mini[i]); // get the current message, and word wrap it.
UINT8 *colormap = NULL; UINT8 *colormap = NULL;
while(msg[j]) // iterate through msg while(msg[j]) // iterate through msg
@ -1547,6 +1550,9 @@ static void HU_drawMiniChat(void)
} }
dy += charheight; dy += charheight;
dx = 0; dx = 0;
if (msg)
Z_Free(msg);
} }
// decrement addy and make that shit smooth: // decrement addy and make that shit smooth:
@ -1598,7 +1604,7 @@ static void HU_drawChatLog(INT32 offset)
{ {
INT32 clrflag = 0; INT32 clrflag = 0;
INT32 j = 0; INT32 j = 0;
const char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it. char *msg = CHAT_WordWrap(x+2, boxw-(charwidth*2), V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_ALLOWLOWERCASE, chat_log[i]); // get the current message, and word wrap it.
UINT8 *colormap = NULL; UINT8 *colormap = NULL;
while(msg[j]) // iterate through msg while(msg[j]) // iterate through msg
{ {
@ -1638,6 +1644,9 @@ static void HU_drawChatLog(INT32 offset)
} }
dy += charheight; dy += charheight;
dx = 0; dx = 0;
if (msg)
Z_Free(msg);
} }

View file

@ -6487,10 +6487,10 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
24*FRACUNIT, // radius 24*FRACUNIT, // radius
24*FRACUNIT, // height 24*FRACUNIT, // height
0, // display offset 0, // display offset
0, // mass DMG_FIRE, // mass
1, // damage 1, // damage
sfx_None, // activesound sfx_None, // activesound
MF_NOBLOCKMAP|MF_MISSILE|MF_NOGRAVITY, // flags MF_NOBLOCKMAP|MF_MISSILE|MF_PAIN|MF_NOGRAVITY, // flags
S_NULL // raisestate S_NULL // raisestate
}, },

View file

@ -5602,7 +5602,8 @@ static void M_DrawNightsAttackMountains(void)
static INT32 bgscrollx; static INT32 bgscrollx;
INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy);
patch_t *background = W_CachePatchName(curbgname, PU_PATCH); patch_t *background = W_CachePatchName(curbgname, PU_PATCH);
INT32 x = FixedInt(bgscrollx) % SHORT(background->width); INT16 w = SHORT(background->width);
INT32 x = FixedInt(-bgscrollx) % w;
INT32 y = BASEVIDHEIGHT - SHORT(background->height)*2; INT32 y = BASEVIDHEIGHT - SHORT(background->height)*2;
if (vid.height != BASEVIDHEIGHT * dupz) if (vid.height != BASEVIDHEIGHT * dupz)
@ -5610,11 +5611,13 @@ static void M_DrawNightsAttackMountains(void)
V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31); V_DrawFill(0, y+50, vid.width, BASEVIDHEIGHT, V_SNAPTOLEFT|31);
V_DrawScaledPatch(x, y, V_SNAPTOLEFT, background); V_DrawScaledPatch(x, y, V_SNAPTOLEFT, background);
x += SHORT(background->width); x += w;
if (x < BASEVIDWIDTH) if (x < BASEVIDWIDTH)
V_DrawScaledPatch(x, y, V_SNAPTOLEFT, background); V_DrawScaledPatch(x, y, V_SNAPTOLEFT, background);
bgscrollx -= (FRACUNIT/2); bgscrollx += (FRACUNIT/2);
if (bgscrollx > w<<FRACBITS)
bgscrollx &= 0xFFFF;
} }
// NiGHTS Attack foreground. // NiGHTS Attack foreground.

View file

@ -3684,7 +3684,6 @@ boolean P_LoadLevel(boolean fromnetsave)
return true; return true;
// If so... // If so...
if ((!(mapheaderinfo[gamemap-1]->levelflags & LF_NOTITLECARD)) && (*mapheaderinfo[gamemap-1]->lvlttl != '\0'))
G_PreLevelTitleCard(); G_PreLevelTitleCard();
return true; return true;

View file

@ -11043,10 +11043,21 @@ static void P_MinecartThink(player_t *player)
if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG)) if (angdiff + minecart->angle != player->mo->angle && (!demoplayback || P_ControlStyle(player) == CS_LMAOGALOG))
{ {
angle_t *ang = NULL;
if (player == &players[consoleplayer]) if (player == &players[consoleplayer])
localangle = player->mo->angle; ang = &localangle;
else if (player == &players[secondarydisplayplayer]) else if (player == &players[secondarydisplayplayer])
localangle2 = player->mo->angle; ang = &localangle2;
if (ang)
{
angdiff = *ang - minecart->angle;
if (angdiff < ANGLE_180 && angdiff > MINECARTCONEMAX)
*ang = minecart->angle + MINECARTCONEMAX;
else if (angdiff > ANGLE_180 && angdiff < InvAngle(MINECARTCONEMAX))
*ang = minecart->angle - MINECARTCONEMAX;
}
} }
} }

View file

@ -71,6 +71,7 @@ angle_t viewangle, aimingangle;
fixed_t viewcos, viewsin; fixed_t viewcos, viewsin;
sector_t *viewsector; sector_t *viewsector;
player_t *viewplayer; player_t *viewplayer;
mobj_t *r_viewmobj;
// //
// precalculated math tables // precalculated math tables
@ -742,8 +743,6 @@ subsector_t *R_PointInSubsectorOrNull(fixed_t x, fixed_t y)
// R_SetupFrame // R_SetupFrame
// //
static mobj_t *viewmobj;
// WARNING: a should be unsigned but to add with 2048, it isn't! // WARNING: a should be unsigned but to add with 2048, it isn't!
#define AIMINGTODY(a) FixedDiv((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)>>FRACBITS, fovtan) #define AIMINGTODY(a) FixedDiv((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)>>FRACBITS, fovtan)
@ -800,16 +799,16 @@ void R_SetupFrame(player_t *player)
if (player->awayviewtics) if (player->awayviewtics)
{ {
// cut-away view stuff // cut-away view stuff
viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN r_viewmobj = player->awayviewmobj; // should be a MT_ALTVIEWMAN
I_Assert(viewmobj != NULL); I_Assert(r_viewmobj != NULL);
viewz = viewmobj->z + 20*FRACUNIT; viewz = r_viewmobj->z + 20*FRACUNIT;
aimingangle = player->awayviewaiming; aimingangle = player->awayviewaiming;
viewangle = viewmobj->angle; viewangle = r_viewmobj->angle;
} }
else if (!player->spectator && chasecam) else if (!player->spectator && chasecam)
// use outside cam view // use outside cam view
{ {
viewmobj = NULL; r_viewmobj = NULL;
viewz = thiscam->z + (thiscam->height>>1); viewz = thiscam->z + (thiscam->height>>1);
aimingangle = thiscam->aiming; aimingangle = thiscam->aiming;
viewangle = thiscam->angle; viewangle = thiscam->angle;
@ -819,11 +818,11 @@ void R_SetupFrame(player_t *player)
{ {
viewz = player->viewz; viewz = player->viewz;
viewmobj = player->mo; r_viewmobj = player->mo;
I_Assert(viewmobj != NULL); I_Assert(r_viewmobj != NULL);
aimingangle = player->aiming; aimingangle = player->aiming;
viewangle = viewmobj->angle; viewangle = r_viewmobj->angle;
if (!demoplayback && player->playerstate != PST_DEAD) if (!demoplayback && player->playerstate != PST_DEAD)
{ {
@ -857,13 +856,13 @@ void R_SetupFrame(player_t *player)
} }
else else
{ {
viewx = viewmobj->x; viewx = r_viewmobj->x;
viewy = viewmobj->y; viewy = r_viewmobj->y;
viewx += quake.x; viewx += quake.x;
viewy += quake.y; viewy += quake.y;
if (viewmobj->subsector) if (r_viewmobj->subsector)
viewsector = viewmobj->subsector->sector; viewsector = r_viewmobj->subsector->sector;
else else
viewsector = R_PointInSubsector(viewx, viewy)->sector; viewsector = R_PointInSubsector(viewx, viewy)->sector;
} }
@ -885,12 +884,12 @@ void R_SkyboxFrame(player_t *player)
thiscam = &camera; thiscam = &camera;
// cut-away view stuff // cut-away view stuff
viewmobj = skyboxmo[0]; r_viewmobj = skyboxmo[0];
#ifdef PARANOIA #ifdef PARANOIA
if (!viewmobj) if (!r_viewmobj)
{ {
const size_t playeri = (size_t)(player - players); const size_t playeri = (size_t)(player - players);
I_Error("R_SkyboxFrame: viewmobj null (player %s)", sizeu1(playeri)); I_Error("R_SkyboxFrame: r_viewmobj null (player %s)", sizeu1(playeri));
} }
#endif #endif
if (player->awayviewtics) if (player->awayviewtics)
@ -921,13 +920,13 @@ void R_SkyboxFrame(player_t *player)
} }
} }
} }
viewangle += viewmobj->angle; viewangle += r_viewmobj->angle;
viewplayer = player; viewplayer = player;
viewx = viewmobj->x; viewx = r_viewmobj->x;
viewy = viewmobj->y; viewy = r_viewmobj->y;
viewz = viewmobj->z; // 26/04/17: use actual Z position instead of spawnpoint angle! viewz = r_viewmobj->z; // 26/04/17: use actual Z position instead of spawnpoint angle!
if (mapheaderinfo[gamemap-1]) if (mapheaderinfo[gamemap-1])
{ {
@ -967,29 +966,29 @@ void R_SkyboxFrame(player_t *player)
else if (mh->skybox_scaley < 0) else if (mh->skybox_scaley < 0)
y = (campos.y - skyboxmo[1]->y) * -mh->skybox_scaley; y = (campos.y - skyboxmo[1]->y) * -mh->skybox_scaley;
if (viewmobj->angle == 0) if (r_viewmobj->angle == 0)
{ {
viewx += x; viewx += x;
viewy += y; viewy += y;
} }
else if (viewmobj->angle == ANGLE_90) else if (r_viewmobj->angle == ANGLE_90)
{ {
viewx -= y; viewx -= y;
viewy += x; viewy += x;
} }
else if (viewmobj->angle == ANGLE_180) else if (r_viewmobj->angle == ANGLE_180)
{ {
viewx -= x; viewx -= x;
viewy -= y; viewy -= y;
} }
else if (viewmobj->angle == ANGLE_270) else if (r_viewmobj->angle == ANGLE_270)
{ {
viewx += y; viewx += y;
viewy -= x; viewy -= x;
} }
else else
{ {
angle_t ang = viewmobj->angle>>ANGLETOFINESHIFT; angle_t ang = r_viewmobj->angle>>ANGLETOFINESHIFT;
viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang)); viewx += FixedMul(x,FINECOSINE(ang)) - FixedMul(y, FINESINE(ang));
viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang)); viewy += FixedMul(x, FINESINE(ang)) + FixedMul(y,FINECOSINE(ang));
} }
@ -1000,8 +999,8 @@ void R_SkyboxFrame(player_t *player)
viewz += campos.z * -mh->skybox_scalez; viewz += campos.z * -mh->skybox_scalez;
} }
if (viewmobj->subsector) if (r_viewmobj->subsector)
viewsector = viewmobj->subsector->sector; viewsector = r_viewmobj->subsector->sector;
else else
viewsector = R_PointInSubsector(viewx, viewy)->sector; viewsector = R_PointInSubsector(viewx, viewy)->sector;

View file

@ -86,6 +86,7 @@ extern fixed_t viewx, viewy, viewz;
extern angle_t viewangle, aimingangle; extern angle_t viewangle, aimingangle;
extern sector_t *viewsector; extern sector_t *viewsector;
extern player_t *viewplayer; extern player_t *viewplayer;
extern mobj_t *r_viewmobj;
extern consvar_t cv_allowmlook; extern consvar_t cv_allowmlook;
extern consvar_t cv_maxportals; extern consvar_t cv_maxportals;

View file

@ -1695,7 +1695,7 @@ static void R_ProjectSprite(mobj_t *thing)
thing = thing->tracer; thing = thing->tracer;
if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) if (! R_ThingVisible(thing))
return; return;
tr_x = thing->x - viewx; tr_x = thing->x - viewx;
@ -2098,7 +2098,7 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel)
mobj_t *thing; mobj_t *thing;
precipmobj_t *precipthing; // Tails 08-25-2002 precipmobj_t *precipthing; // Tails 08-25-2002
INT32 lightnum; INT32 lightnum;
fixed_t approx_dist, limit_dist, hoop_limit_dist; fixed_t limit_dist, hoop_limit_dist;
if (rendermode != render_soft) if (rendermode != render_soft)
return; return;
@ -2131,34 +2131,9 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel)
// If a limit exists, handle things a tiny bit different. // If a limit exists, handle things a tiny bit different.
limit_dist = (fixed_t)(cv_drawdist.value) << FRACBITS; limit_dist = (fixed_t)(cv_drawdist.value) << FRACBITS;
hoop_limit_dist = (fixed_t)(cv_drawdist_nights.value) << FRACBITS; hoop_limit_dist = (fixed_t)(cv_drawdist_nights.value) << FRACBITS;
if (limit_dist || hoop_limit_dist)
{
for (thing = sec->thinglist; thing; thing = thing->snext) for (thing = sec->thinglist; thing; thing = thing->snext)
{ {
if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) if (R_ThingVisibleWithinDist(thing, limit_dist, hoop_limit_dist))
continue;
approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y);
if (thing->sprite == SPR_HOOP)
{
if (hoop_limit_dist && approx_dist > hoop_limit_dist)
continue;
}
else
{
if (limit_dist && approx_dist > limit_dist)
continue;
}
R_ProjectSprite(thing);
}
}
else
{
// Draw everything in sector, no checks
for (thing = sec->thinglist; thing; thing = thing->snext)
if (!(thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW))
R_ProjectSprite(thing); R_ProjectSprite(thing);
} }
@ -2167,14 +2142,7 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel)
{ {
for (precipthing = sec->preciplist; precipthing; precipthing = precipthing->snext) for (precipthing = sec->preciplist; precipthing; precipthing = precipthing->snext)
{ {
if (precipthing->precipflags & PCF_INVISIBLE) if (R_PrecipThingVisible(precipthing, limit_dist))
continue;
approx_dist = P_AproxDistance(viewx-precipthing->x, viewy-precipthing->y);
if (approx_dist > limit_dist)
continue;
R_ProjectPrecipitationSprite(precipthing); R_ProjectPrecipitationSprite(precipthing);
} }
} }
@ -2877,6 +2845,55 @@ void R_ClipSprites(drawseg_t* dsstart, portal_t* portal)
} }
} }
/* Check if thing may be drawn from our current view. */
boolean R_ThingVisible (mobj_t *thing)
{
return (!(
thing->sprite == SPR_NULL ||
( thing->flags2 & (MF2_DONTDRAW) ) ||
thing == r_viewmobj
));
}
boolean R_ThingVisibleWithinDist (mobj_t *thing,
fixed_t limit_dist,
fixed_t hoop_limit_dist)
{
fixed_t approx_dist;
if (! R_ThingVisible(thing))
return false;
approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y);
if (thing->sprite == SPR_HOOP)
{
if (hoop_limit_dist && approx_dist > hoop_limit_dist)
return false;
}
else
{
if (limit_dist && approx_dist > limit_dist)
return false;
}
return true;
}
/* Check if precipitation may be drawn from our current view. */
boolean R_PrecipThingVisible (precipmobj_t *precipthing,
fixed_t limit_dist)
{
fixed_t approx_dist;
if (( precipthing->precipflags & PCF_INVISIBLE ))
return false;
approx_dist = P_AproxDistance(viewx-precipthing->x, viewy-precipthing->y);
return ( approx_dist <= limit_dist );
}
// //
// R_DrawMasked // R_DrawMasked
// //

View file

@ -59,6 +59,15 @@ void R_InitSprites(void);
void R_ClearSprites(void); void R_ClearSprites(void);
void R_ClipSprites(drawseg_t* dsstart, portal_t* portal); void R_ClipSprites(drawseg_t* dsstart, portal_t* portal);
boolean R_ThingVisible (mobj_t *thing);
boolean R_ThingVisibleWithinDist (mobj_t *thing,
fixed_t draw_dist,
fixed_t nights_draw_dist);
boolean R_PrecipThingVisible (precipmobj_t *precipthing,
fixed_t precip_draw_dist);
/** Used to count the amount of masked elements /** Used to count the amount of masked elements
* per portal to later group them in separate * per portal to later group them in separate
* drawnode lists. * drawnode lists.

View file

@ -1278,13 +1278,15 @@ void ST_preDrawTitleCard(void)
// //
void ST_runTitleCard(void) void ST_runTitleCard(void)
{ {
boolean run = !(paused || P_AutoPause());
if (!G_IsTitleCardAvailable()) if (!G_IsTitleCardAvailable())
return; return;
if (lt_ticker >= (lt_endtime + TICRATE)) if (lt_ticker >= (lt_endtime + TICRATE))
return; return;
if (!(paused || P_AutoPause())) if (run || (lt_ticker < PRELEVELTIME))
{ {
// tick // tick
lt_ticker++; lt_ticker++;