Use some rendering code from durrr
This commit is contained in:
parent
3d7afcb77f
commit
57c4cc6df1
9 changed files with 329 additions and 390 deletions
|
|
@ -250,6 +250,8 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|||
target_compile_options(SRB2SDL2 PRIVATE -mno-ms-bitfields)
|
||||
endif()
|
||||
|
||||
target_compile_options(SRB2SDL2 PRIVATE -O3)
|
||||
|
||||
# Compiler warnings configuration
|
||||
target_compile_options(SRB2SDL2 PRIVATE
|
||||
# Using generator expressions to handle per-language compile options
|
||||
|
|
|
|||
190
src/r_bsp.cpp
190
src/r_bsp.cpp
|
|
@ -1,8 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
@ -22,6 +23,8 @@
|
|||
#include "r_local.h"
|
||||
#include "r_state.h"
|
||||
#include "r_portal.h" // Add seg portals
|
||||
#include "r_fps.h"
|
||||
#include "r_main.h"
|
||||
|
||||
#include "r_splats.h"
|
||||
#include "p_local.h" // camera
|
||||
|
|
@ -31,11 +34,7 @@
|
|||
|
||||
#include "k_terrain.h"
|
||||
|
||||
extern "C" {
|
||||
#include "qs22j.h"
|
||||
}
|
||||
extern "C" consvar_t cv_debugfinishline;
|
||||
extern "C" consvar_t cv_debugfinishline, cv_debugrender_freezebsp;
|
||||
extern consvar_t cv_debugfinishline, cv_debugrender_freezebsp;
|
||||
|
||||
seg_t *curline;
|
||||
side_t *sidedef;
|
||||
|
|
@ -65,16 +64,7 @@ boolean R_NoEncore(sector_t *sector, levelflat_t *flat, boolean ceiling)
|
|||
const boolean invertEncore = (sector->flags & MSF_INVERTENCORE);
|
||||
const terrain_t *terrain = (flat != NULL ? flat->terrain : NULL);
|
||||
|
||||
if ((terrain == NULL) || (terrain->flags & TRF_REMAP)
|
||||
|| (terrain->pogoSpring <= 0
|
||||
&& terrain->speedPad <= 0
|
||||
&& !(terrain->flags & TRF_SNEAKERPANEL)))
|
||||
{
|
||||
return invertEncore;
|
||||
}
|
||||
|
||||
if ((!(sector->special & (1<<8)) || (sector->special & ((4|8)<<8))) // spring panel
|
||||
&& GETSECSPECIAL(sector->special, 4) != 6) // sneaker panel
|
||||
if ((terrain == NULL) || (terrain->flags & TRF_REMAP))
|
||||
{
|
||||
return invertEncore;
|
||||
}
|
||||
|
|
@ -143,7 +133,7 @@ void R_CrunchWallSegment(cliprange_t *start, cliprange_t *next)
|
|||
|
||||
// NO MORE CRASHING!
|
||||
if (newend - solidsegs > MAXSEGS)
|
||||
I_Error("R_ClipSolidWallSegment: Solid Segs overflow!\n");
|
||||
I_Error("R_CrunchWallSegment: Solid Segs overflow!\n");
|
||||
}
|
||||
|
||||
template <ClipType Type>
|
||||
|
|
@ -293,18 +283,11 @@ sector_t *R_FakeFlat(sector_t *sec, sector_t *tempsec, INT32 *floorlightlevel,
|
|||
mobj_t *viewmobj = viewplayer->mo;
|
||||
INT32 heightsec;
|
||||
boolean underwater;
|
||||
UINT8 i;
|
||||
UINT8 i = R_GetViewNumber();
|
||||
|
||||
for (i = 0; i <= r_splitscreen; i++)
|
||||
{
|
||||
if (viewplayer == &players[displayplayers[i]] && camera[i].chase)
|
||||
{
|
||||
heightsec = R_PointInSubsector(camera[i].x, camera[i].y)->sector->heightsec;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i > r_splitscreen && viewmobj)
|
||||
if (camera[i].chase)
|
||||
heightsec = R_PointInSubsector(camera[i].x, camera[i].y)->sector->heightsec;
|
||||
else if (i > r_splitscreen && viewmobj)
|
||||
heightsec = R_PointInSubsector(viewmobj->x, viewmobj->y)->sector->heightsec;
|
||||
else
|
||||
return sec;
|
||||
|
|
@ -439,6 +422,7 @@ boolean R_IsDebugLine(seg_t *line)
|
|||
{
|
||||
case 2001: // Ring Racers: Finish Line
|
||||
case 2003: // Ring Racers: Respawn Line
|
||||
case 2005: // Ring Racers: Dismount flying object Line
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -554,31 +538,21 @@ static void R_AddLine(seg_t *line)
|
|||
|
||||
doorclosed = 0;
|
||||
|
||||
if (udmf)
|
||||
{
|
||||
if (backsector->ceilingpic == skyflatnum && frontsector->ceilingpic == skyflatnum)
|
||||
bothceilingssky = true;
|
||||
if (backsector->floorpic == skyflatnum && frontsector->floorpic == skyflatnum)
|
||||
bothfloorssky = true;
|
||||
|
||||
if (bothceilingssky && bothfloorssky) // everything's sky? let's save us a bit of time then
|
||||
{
|
||||
if (!R_IsDebugLine(line) &&
|
||||
!line->polyseg &&
|
||||
!line->sidedef->midtexture
|
||||
&& ((!frontsector->ffloors && !backsector->ffloors)
|
||||
|| Tag_Compare(&frontsector->tags, &backsector->tags)))
|
||||
|| Tag_Compare(&frontsector->tags, &backsector->tags)))
|
||||
return; // line is empty, don't even bother
|
||||
|
||||
if (backsector->ceilingpic == skyflatnum && frontsector->ceilingpic == skyflatnum)
|
||||
bothceilingssky = true;
|
||||
if (backsector->floorpic == skyflatnum && frontsector->floorpic == skyflatnum)
|
||||
bothfloorssky = true;
|
||||
|
||||
if (bothceilingssky && bothfloorssky) // everything's sky? let's save us a bit of time then
|
||||
{
|
||||
if (!line->polyseg &&
|
||||
!line->sidedef->midtexture
|
||||
&& ((!frontsector->ffloors && !backsector->ffloors)
|
||||
|| Tag_Compare(&frontsector->tags, &backsector->tags)))
|
||||
return; // line is empty, don't even bother
|
||||
|
||||
goto clippass; // treat like wide open window instead
|
||||
}
|
||||
goto clippass; // treat like wide open window instead
|
||||
}
|
||||
|
||||
// Closed door.
|
||||
|
|
@ -595,35 +569,19 @@ static void R_AddLine(seg_t *line)
|
|||
SLOPEPARAMS( backsector->f_slope, backf1, backf2, backsector-> floorheight)
|
||||
SLOPEPARAMS( backsector->c_slope, backc1, backc2, backsector->ceilingheight)
|
||||
#undef SLOPEPARAMS
|
||||
|
||||
|
||||
if (udmf || (!udmf && viewsector != backsector && viewsector != frontsector))
|
||||
// if both ceilings are skies, consider it always "open"
|
||||
// same for floors
|
||||
if (!bothceilingssky && !bothfloorssky)
|
||||
{
|
||||
// if both ceilings are skies, consider it always "open"
|
||||
// same for floors
|
||||
if (!bothceilingssky && !bothfloorssky)
|
||||
{
|
||||
if ((backc1 <= frontf1 && backc2 <= frontf2)
|
||||
|| (backf1 >= frontc1 && backf2 >= frontc2))
|
||||
{
|
||||
goto clipsolid;
|
||||
}
|
||||
doorclosed = (backc1 <= frontf1 && backc2 <= frontf2)
|
||||
|| (backf1 >= frontc1 && backf2 >= frontc2)
|
||||
// Check for automap fix. Store in doorclosed for r_segs.c
|
||||
|| (backc1 <= backf1 && backc2 <= backf2
|
||||
&& ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture)
|
||||
&& ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture));
|
||||
|
||||
// Check for automap fix. Store in doorclosed for r_segs.c
|
||||
if (udmf)
|
||||
// Check for automap fix. Store in doorclosed for r_segs.c
|
||||
doorclosed = (backc1 <= backf1 && backc2 <= backf2
|
||||
&& ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture)
|
||||
&& ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture));
|
||||
else
|
||||
doorclosed = (backc1 <= backf1 && backc2 <= backf2
|
||||
&& ((backc1 >= frontc1 && backc2 >= frontc2) || curline->sidedef->toptexture)
|
||||
&& ((backf1 <= frontf1 && backf2 >= frontf2) || curline->sidedef->bottomtexture)
|
||||
&& (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum));
|
||||
|
||||
if (doorclosed)
|
||||
goto clipsolid;
|
||||
}
|
||||
if (doorclosed)
|
||||
goto clipsolid;
|
||||
}
|
||||
|
||||
// Window.
|
||||
|
|
@ -636,49 +594,37 @@ static void R_AddLine(seg_t *line)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (udmf || (!udmf && viewsector != backsector && viewsector != frontsector))
|
||||
// if both ceilings are skies, consider it always "open"
|
||||
// same for floors
|
||||
if (!bothceilingssky && !bothfloorssky)
|
||||
{
|
||||
// if both ceilings are skies, consider it always "open"
|
||||
// same for floors
|
||||
if (!bothceilingssky && !bothfloorssky)
|
||||
{
|
||||
if (backsector->ceilingheight <= frontsector->floorheight
|
||||
|| backsector->floorheight >= frontsector->ceilingheight)
|
||||
{
|
||||
goto clipsolid;
|
||||
}
|
||||
doorclosed = backsector->ceilingheight <= frontsector->floorheight
|
||||
|| backsector->floorheight >= frontsector->ceilingheight
|
||||
// Check for automap fix. Store in doorclosed for r_segs.c
|
||||
//
|
||||
// This is used to fix the automap bug which
|
||||
// showed lines behind closed doors simply because the door had a dropoff.
|
||||
//
|
||||
// It assumes that Doom has already ruled out a door being closed because
|
||||
// of front-back closure (e.g. front floor is taller than back ceiling).
|
||||
//
|
||||
// if door is closed because back is shut:
|
||||
|| (backsector->ceilingheight <= backsector->floorheight
|
||||
// preserve a kind of transparent door/lift special effect:
|
||||
&& (backsector->ceilingheight >= frontsector->ceilingheight || curline->sidedef->toptexture)
|
||||
&& (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture));
|
||||
|
||||
// Check for automap fix. Store in doorclosed for r_segs.c
|
||||
//
|
||||
// This is used to fix the automap bug which
|
||||
// showed lines behind closed doors simply because the door had a dropoff.
|
||||
//
|
||||
// It assumes that Doom has already ruled out a door being closed because
|
||||
// of front-back closure (e.g. front floor is taller than back ceiling).
|
||||
//
|
||||
// if door is closed because back is shut:
|
||||
if (udmf)
|
||||
doorclosed = backsector->ceilingheight <= backsector->floorheight
|
||||
&& (backsector->ceilingheight >= frontsector->ceilingheight || curline->sidedef->toptexture)
|
||||
&& (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture); // preserve a kind of transparent door/lift special effect:
|
||||
else
|
||||
doorclosed = (backsector->ceilingheight <= backsector->floorheight
|
||||
&& (backsector->ceilingheight >= frontsector->ceilingheight || curline->sidedef->toptexture)
|
||||
&& (backsector->floorheight <= frontsector->floorheight || curline->sidedef->bottomtexture)
|
||||
&& (backsector->ceilingpic != skyflatnum || frontsector->ceilingpic != skyflatnum));
|
||||
|
||||
if (doorclosed)
|
||||
goto clipsolid;
|
||||
}
|
||||
|
||||
// Window.
|
||||
if (!bothceilingssky) // ceilings are always the "same" when sky
|
||||
if (backsector->ceilingheight != frontsector->ceilingheight)
|
||||
goto clippass;
|
||||
if (!bothfloorssky) // floors are always the "same" when sky
|
||||
if (backsector->floorheight != frontsector->floorheight)
|
||||
goto clippass;
|
||||
if (doorclosed)
|
||||
goto clipsolid;
|
||||
}
|
||||
|
||||
// Window.
|
||||
if (!bothceilingssky) // ceilings are always the "same" when sky
|
||||
if (backsector->ceilingheight != frontsector->ceilingheight)
|
||||
goto clippass;
|
||||
if (!bothfloorssky) // floors are always the "same" when sky
|
||||
if (backsector->floorheight != frontsector->floorheight)
|
||||
goto clippass;
|
||||
}
|
||||
|
||||
// Reject empty lines used for triggers and special events.
|
||||
|
|
@ -834,7 +780,7 @@ void R_SortPolyObjects(subsector_t *sub)
|
|||
// 03/10/06: only bother if there are actually polys to sort
|
||||
if (numpolys >= 2)
|
||||
{
|
||||
qs22j(po_ptrs, numpolys, sizeof(polyobj_t *),
|
||||
qsort(po_ptrs, numpolys, sizeof(polyobj_t *),
|
||||
R_PolyobjCompare);
|
||||
}
|
||||
}
|
||||
|
|
@ -937,7 +883,7 @@ static void R_AddPolyObjects(subsector_t *sub)
|
|||
// render polyobjects
|
||||
for (i = 0; i < numpolys; ++i)
|
||||
{
|
||||
qs22j(po_ptrs[i]->segs, po_ptrs[i]->segCount, sizeof(seg_t *), R_PolysegCompare);
|
||||
qsort(po_ptrs[i]->segs, po_ptrs[i]->segCount, sizeof(seg_t *), R_PolysegCompare);
|
||||
for (j = 0; j < po_ptrs[i]->segCount; ++j)
|
||||
R_AddLine(po_ptrs[i]->segs[j]);
|
||||
}
|
||||
|
|
@ -965,14 +911,12 @@ static void R_Subsector(size_t num)
|
|||
|
||||
ZoneScoped;
|
||||
|
||||
#ifdef RANGECHECK
|
||||
if (num >= numsubsectors)
|
||||
I_Error("R_Subsector: ss %s with numss = %s\n", sizeu1(num), sizeu2(numsubsectors));
|
||||
#endif
|
||||
|
||||
// subsectors added at run-time
|
||||
if (num >= numsubsectors)
|
||||
{
|
||||
CONS_Debug(DBG_RENDER, "R_Subsector: ss %s with numss = %s\n", sizeu1(num), sizeu2(numsubsectors));
|
||||
return;
|
||||
}
|
||||
|
||||
sub = &subsectors[num];
|
||||
frontsector = sub->sector;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
@ -15,6 +16,8 @@
|
|||
/// not the architecture of the frame buffer.
|
||||
/// The frame buffer is a linear one, and we need only the base address.
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "doomdef.h"
|
||||
#include "doomstat.h"
|
||||
#include "r_local.h"
|
||||
|
|
@ -125,6 +128,7 @@ INT32 dc_numlights = 0, dc_maxlights;
|
|||
// =========================================================================
|
||||
// SPAN DRAWING CODE STUFF
|
||||
// =========================================================================
|
||||
|
||||
// Vectors for Software's tilted slope drawers
|
||||
floatv3_t *ds_su, *ds_sv, *ds_sz;
|
||||
float focallengthf[MAXSPLITSCREENPLAYERS];
|
||||
|
|
@ -141,7 +145,13 @@ float zeroheight;
|
|||
#define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4)
|
||||
#define BLINK_TT_CACHE_INDEX (MAXSKINS + 5)
|
||||
#define DASHMODE_TT_CACHE_INDEX (MAXSKINS + 6)
|
||||
#define TT_CACHE_SIZE (MAXSKINS + 8)
|
||||
#define HITLAG_TT_CACHE_INDEX (MAXSKINS + 7)
|
||||
#define INTERMISSION_TT_CACHE_INDEX (MAXSKINS + 8)
|
||||
#define TT_CACHE_SIZE (MAXSKINS + 9)
|
||||
|
||||
#define SKIN_RAMP_LENGTH 16
|
||||
#define DEFAULT_STARTTRANSCOLOR 96
|
||||
#define NUM_PALETTE_ENTRIES 256
|
||||
|
||||
static UINT8 **translationtablecache[TT_CACHE_SIZE] = {NULL};
|
||||
UINT8 skincolor_modified[MAXSKINCOLORS];
|
||||
|
|
@ -301,7 +311,7 @@ void R_GenerateTranslucencyTable(UINT8 *table, RGBA_t* sourcepal, int style, UIN
|
|||
}
|
||||
}
|
||||
|
||||
#define ClipTransLevel(trans) std::max(std::min((trans), NUMTRANSMAPS-2), 0)
|
||||
#define ClipTransLevel(trans) std::clamp<INT32>(trans, 0, NUMTRANSMAPS-2)
|
||||
|
||||
UINT8 *R_GetTranslucencyTable(INT32 alphalevel)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2021 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
@ -105,12 +107,10 @@ static void R_DrawColumnTemplate(drawcolumndata_t *dc)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef RANGECHECK
|
||||
if ((unsigned)dc->x >= (unsigned)vid.width || dc->yl < 0 || dc->yh >= vid.height)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if constexpr (Type & DrawColumnType::DC_LIGHTLIST)
|
||||
{
|
||||
|
|
@ -341,10 +341,8 @@ void R_DrawFogColumn(drawcolumndata_t *dc)
|
|||
if (count < 0)
|
||||
return;
|
||||
|
||||
#ifdef RANGECHECK
|
||||
if ((unsigned)dc->x >= (unsigned)vid.width || dc->yl < 0 || dc->yh >= vid.height)
|
||||
return;
|
||||
#endif
|
||||
|
||||
// Framebuffer destination address.
|
||||
// Use ylookup LUT to avoid multiply with ScreenWidth.
|
||||
|
|
@ -408,10 +406,8 @@ void R_DrawColumn_Flat(drawcolumndata_t *dc)
|
|||
if (count < 0) // Zero length, column does not exceed a pixel.
|
||||
return;
|
||||
|
||||
#ifdef RANGECHECK
|
||||
if ((unsigned)dc->x >= (unsigned)vid.width || dc->yl < 0 || dc->yh >= vid.height)
|
||||
return;
|
||||
#endif
|
||||
|
||||
// Framebuffer destination address.
|
||||
// Use ylookup LUT to avoid multiply with ScreenWidth.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2021 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2021 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
@ -18,10 +19,10 @@
|
|||
#include "command.h"
|
||||
#include "doomdef.h"
|
||||
#include "console.h"
|
||||
#include "m_easing.h" // For Easing_InOutSine, used in R_UpdatePlaneRipple
|
||||
#include "g_game.h"
|
||||
#include "p_setup.h" // levelflats
|
||||
#include "p_slopes.h"
|
||||
#include "r_fps.h"
|
||||
#include "r_data.h"
|
||||
#include "r_textures.h"
|
||||
#include "r_local.h"
|
||||
|
|
@ -31,6 +32,7 @@
|
|||
#include "r_portal.h"
|
||||
#include "core/thread_pool.h"
|
||||
#include "r_fps.h"
|
||||
#include "r_debug.hpp"
|
||||
|
||||
#include "v_video.h"
|
||||
#include "w_wad.h"
|
||||
|
|
@ -235,7 +237,10 @@ static void R_MapTiltedPlane(drawspandata_t *ds, void(*spanfunc)(drawspandata_t*
|
|||
{
|
||||
ds->bgofs = R_CalculateRippleOffset(ds, y);
|
||||
|
||||
R_SetTiltedSpan(ds, CLAMP(y, 0, viewheight));
|
||||
R_SetTiltedSpan(ds, std::min(y, std::max(0, viewheight)));
|
||||
|
||||
R_CalculatePlaneRipple(ds, ds->currentplane->viewangle + ds->currentplane->plangle);
|
||||
R_SetSlopePlaneVectors(ds, ds->currentplane, y, (ds->xoffs + ds->planeripple.xfrac), (ds->yoffs + ds->planeripple.yfrac));
|
||||
|
||||
ds->bgofs >>= FRACBITS;
|
||||
|
||||
|
|
@ -573,6 +578,7 @@ void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop)
|
|||
|
||||
static void R_MakeSpans(void (*mapfunc)(drawspandata_t* ds, void(*spanfunc)(drawspandata_t*), INT32, INT32, INT32, boolean), spandrawfunc_t* spanfunc, drawspandata_t* ds, INT32 x, INT32 t1, INT32 b1, INT32 t2, INT32 b2, boolean allow_parallel)
|
||||
{
|
||||
ZoneScoped;
|
||||
// Alam: from r_splats's R_RasterizeFloorSplat
|
||||
if (t1 >= vid.height) t1 = vid.height-1;
|
||||
if (b1 >= vid.height) b1 = vid.height-1;
|
||||
|
|
@ -887,11 +893,11 @@ d.z = (v1.x * v2.y) - (v1.y * v2.x)
|
|||
void R_SetTiltedSpan(drawspandata_t* ds, INT32 span)
|
||||
{
|
||||
if (ds_su == NULL)
|
||||
ds_su = static_cast<floatv3_t*>(Z_Malloc(sizeof(*ds_su) * vid.height, PU_STATIC, NULL));
|
||||
ds_su = static_cast<floatv3_t*>(Z_Calloc(sizeof(*ds_su) * vid.height, PU_STATIC, NULL));
|
||||
if (ds_sv == NULL)
|
||||
ds_sv = static_cast<floatv3_t*>(Z_Malloc(sizeof(*ds_sv) * vid.height, PU_STATIC, NULL));
|
||||
ds_sv = static_cast<floatv3_t*>(Z_Calloc(sizeof(*ds_sv) * vid.height, PU_STATIC, NULL));
|
||||
if (ds_sz == NULL)
|
||||
ds_sz = static_cast<floatv3_t*>(Z_Malloc(sizeof(*ds_sz) * vid.height, PU_STATIC, NULL));
|
||||
ds_sz = static_cast<floatv3_t*>(Z_Calloc(sizeof(*ds_sz) * vid.height, PU_STATIC, NULL));
|
||||
|
||||
ds->sup = ds_su[span];
|
||||
ds->svp = ds_sv[span];
|
||||
|
|
@ -1103,9 +1109,9 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle
|
|||
|
||||
// No idea if this works
|
||||
VID_BlitLinearScreen(screens[0] + offset,
|
||||
screens[1] + (top*vid.width), // intentionally not +offset
|
||||
viewwidth, bottom-top,
|
||||
vid.width, vid.width);
|
||||
screens[1] + (top*vid.width), // intentionally not +offset
|
||||
viewwidth, bottom-top,
|
||||
vid.width, vid.width);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1274,11 +1280,11 @@ INT16 R_PlaneIsHighlighted(const visplane_t *pl)
|
|||
{
|
||||
switch (pl->damage)
|
||||
{
|
||||
case SD_DEATHPIT:
|
||||
case SD_INSTAKILL:
|
||||
return 35; // red
|
||||
case SD_DEATHPIT:
|
||||
case SD_INSTAKILL:
|
||||
return 35; // red
|
||||
|
||||
default:
|
||||
return -1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
327
src/r_segs.cpp
327
src/r_segs.cpp
|
|
@ -1,8 +1,9 @@
|
|||
// SONIC ROBO BLAST 2
|
||||
// DR. ROBOTNIK'S RING RACERS
|
||||
//-----------------------------------------------------------------------------
|
||||
// Copyright (C) 1993-1996 by id Software, Inc.
|
||||
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2024 by Kart Krew.
|
||||
// Copyright (C) 2020 by Sonic Team Junior.
|
||||
// Copyright (C) 2000 by DooM Legacy Team.
|
||||
// Copyright (C) 1996 by id Software, Inc.
|
||||
//
|
||||
// This program is free software distributed under the
|
||||
// terms of the GNU General Public License, version 2.
|
||||
|
|
@ -32,9 +33,10 @@
|
|||
#include "console.h" // con_clipviewtop
|
||||
#include "taglist.h"
|
||||
#include "r_draw.h"
|
||||
#include "k_terrain.h"
|
||||
#include "core/memory.h"
|
||||
#include "core/thread_pool.h"
|
||||
#include "k_terrain.h"
|
||||
#include "r_debug.hpp"
|
||||
|
||||
extern "C" consvar_t cv_debugfinishline;
|
||||
|
||||
|
|
@ -194,7 +196,7 @@ static inline boolean R_OverflowTest(drawcolumndata_t* dc)
|
|||
return false;
|
||||
}
|
||||
|
||||
static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT32 x1, INT32 x2, INT32 texnum, void (*colfunc_2s)(drawcolumndata_t*, column_t *, column_t *, INT32))
|
||||
static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT32 x1, INT32 x2, INT32 texnum, INT32 basetexnum, void (*colfunc_2s)(drawcolumndata_t*, column_t *, column_t *, INT32))
|
||||
{
|
||||
size_t pindex;
|
||||
column_t *col, *bmCol = NULL;
|
||||
|
|
@ -203,17 +205,17 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
lightlist_t *light;
|
||||
r_lightlist_t *rlight;
|
||||
line_t *ldef;
|
||||
INT32 range;
|
||||
sector_t *front, *back;
|
||||
INT32 times, repeats;
|
||||
boolean tripwire;
|
||||
boolean brightmapped = R_TextureHasBrightmap(texnum);
|
||||
boolean remap = encoremap && R_TextureCanRemap(texnum);
|
||||
INT32 range;
|
||||
boolean remap = encoremap && R_TextureCanRemap(basetexnum);
|
||||
|
||||
ldef = curline->linedef;
|
||||
tripwire = P_IsLineTripWire(ldef);
|
||||
|
||||
range = std::max(drawseg->x2-drawseg->x1, 1);
|
||||
range = std::max<INT32>(drawseg->x2-drawseg->x1, 1);
|
||||
|
||||
// Setup lighting based on the presence/lack-of 3D floors.
|
||||
dc->numlights = 0;
|
||||
|
|
@ -278,22 +280,18 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
{
|
||||
if ((R_CheckColumnFunc(COLDRAWFUNC_FUZZY) == false)
|
||||
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||
{
|
||||
lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT);
|
||||
}
|
||||
else
|
||||
{
|
||||
lightnum = LIGHTLEVELS - 1;
|
||||
|
||||
if ((R_CheckColumnFunc(COLDRAWFUNC_FOG) == true)
|
||||
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||
|| (frontsector->extra_colormap && (frontsector->extra_colormap->flags & CMF_FOG)))
|
||||
;
|
||||
else if (P_ApplyLightOffset(lightnum, frontsector))
|
||||
lightnum += curline->lightOffset;
|
||||
}
|
||||
}
|
||||
|
||||
lightnum = R_AdjustLightLevel(lightnum);
|
||||
lightnum = R_AdjustLightLevel(lightnum);
|
||||
}
|
||||
|
||||
if (lightnum < 0)
|
||||
walllights = scalelight[0];
|
||||
|
|
@ -303,11 +301,6 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
walllights = scalelight[lightnum];
|
||||
}
|
||||
|
||||
maskedtexturecol = drawseg->maskedtexturecol;
|
||||
|
||||
mfloorclip = drawseg->sprbottomclip;
|
||||
mceilingclip = drawseg->sprtopclip;
|
||||
|
||||
if (frontsector->heightsec != -1)
|
||||
front = §ors[frontsector->heightsec];
|
||||
else
|
||||
|
|
@ -405,13 +398,10 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
bmCol = (column_t *)((UINT8 *)R_GetBrightmapColumn(texnum, maskedtexturecol[dc->x]) - 3);
|
||||
}
|
||||
|
||||
for (i = 0; i < dc->numlights; i++)
|
||||
auto set_light_vars = [&](INT32 i)
|
||||
{
|
||||
rlight = &dc->lightlist[i];
|
||||
|
||||
if ((rlight->flags & FOF_NOSHADE))
|
||||
continue;
|
||||
|
||||
lightnum = R_AdjustLightLevel(rlight->lightnum);
|
||||
|
||||
if (lightnum < 0)
|
||||
|
|
@ -430,20 +420,38 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
rlight->rcolormap = rlight->extra_colormap->colormap + (xwalllights[pindex] - colormaps);
|
||||
else
|
||||
rlight->rcolormap = xwalllights[pindex];
|
||||
};
|
||||
|
||||
auto set_colormap_below_light = [&]
|
||||
{
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (remap && !(ldef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
};
|
||||
|
||||
// Use the base sector's light level above the first FOF.
|
||||
// You can imagine it as the sky casting its light on top of the highest FOF.
|
||||
set_light_vars(0);
|
||||
set_colormap_below_light();
|
||||
|
||||
for (i = 0; i < dc->numlights; i++)
|
||||
{
|
||||
if ((dc->lightlist[i].flags & FOF_NOSHADE))
|
||||
continue;
|
||||
|
||||
set_light_vars(i);
|
||||
|
||||
height = rlight->height;
|
||||
rlight->height += rlight->heightstep;
|
||||
|
||||
if (height <= windowtop)
|
||||
{
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (encoremap && !(ldef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
set_colormap_below_light();
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -462,14 +470,7 @@ static void R_RenderMaskedSegLoop(drawcolumndata_t* dc, drawseg_t *drawseg, INT3
|
|||
}
|
||||
colfunc_2s(dc, col, bmCol, -1);
|
||||
windowtop = windowbottom + 1;
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (remap && !(ldef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
set_colormap_below_light();
|
||||
}
|
||||
windowbottom = realbot;
|
||||
if (windowtop < windowbottom)
|
||||
|
|
@ -600,18 +601,12 @@ static void R_RenderMaskedSegLoopDebug(drawcolumndata_t* dc, drawseg_t *ds, INT3
|
|||
|
||||
static INT32 R_GetTwoSidedMidTexture(seg_t *line)
|
||||
{
|
||||
INT32 texture;
|
||||
|
||||
if (R_IsDebugLine(line))
|
||||
{
|
||||
texture = g_texturenum_dbgline;
|
||||
}
|
||||
else
|
||||
{
|
||||
texture = line->sidedef->midtexture;
|
||||
return g_texturenum_dbgline;
|
||||
}
|
||||
|
||||
return R_GetTextureNum(texture);
|
||||
return line->sidedef->midtexture;
|
||||
}
|
||||
|
||||
static boolean R_CheckBlendMode(drawcolumndata_t* dc, const line_t *ldef, boolean brightmapped)
|
||||
|
|
@ -663,7 +658,7 @@ static boolean R_CheckBlendMode(drawcolumndata_t* dc, const line_t *ldef, boolea
|
|||
|
||||
void R_RenderMaskedSegRange(drawseg_t *drawseg, INT32 x1, INT32 x2)
|
||||
{
|
||||
INT32 texnum;
|
||||
INT32 texnum, basetexnum;
|
||||
void (*colfunc_2s)(drawcolumndata_t*, column_t *, column_t *, INT32);
|
||||
line_t *ldef;
|
||||
const boolean debug = R_IsDebugLine(drawseg->curline);
|
||||
|
|
@ -677,7 +672,8 @@ void R_RenderMaskedSegRange(drawseg_t *drawseg, INT32 x1, INT32 x2)
|
|||
|
||||
frontsector = curline->frontsector;
|
||||
backsector = curline->backsector;
|
||||
texnum = R_GetTwoSidedMidTexture(curline);
|
||||
basetexnum = R_GetTwoSidedMidTexture(curline);
|
||||
texnum = R_GetTextureNum(basetexnum);
|
||||
windowbottom = windowtop = sprbotscreen = INT32_MAX;
|
||||
|
||||
ldef = curline->linedef;
|
||||
|
|
@ -727,7 +723,7 @@ void R_RenderMaskedSegRange(drawseg_t *drawseg, INT32 x1, INT32 x2)
|
|||
}
|
||||
else
|
||||
{
|
||||
R_RenderMaskedSegLoop(dc, drawseg, x1, x2, texnum, colfunc_2s);
|
||||
R_RenderMaskedSegLoop(dc, drawseg, x1, x2, texnum, basetexnum, colfunc_2s);
|
||||
}
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC, false);
|
||||
|
|
@ -768,7 +764,6 @@ static constexpr T saturating_mul(T x, T y) noexcept
|
|||
// Loop through R_DrawMaskedColumn calls
|
||||
static void R_DrawRepeatMaskedColumn(drawcolumndata_t* dc, column_t *col, column_t *bm, INT32 baseclip)
|
||||
{
|
||||
INT64 z;
|
||||
while (sprtopscreen < sprbotscreen)
|
||||
{
|
||||
R_DrawMaskedColumn(dc, col, bm, baseclip);
|
||||
|
|
@ -802,10 +797,10 @@ static boolean R_IsFFloorTranslucent(visffloor_t *pfloor)
|
|||
// Renders all the thick sides in the given range.
|
||||
void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
||||
{
|
||||
size_t pindex;
|
||||
size_t pindex = 0;
|
||||
column_t * col, *bmCol = NULL;
|
||||
INT32 lightnum;
|
||||
INT32 texnum;
|
||||
INT32 texnum, basetexnum;
|
||||
sector_t tempsec;
|
||||
INT32 templight;
|
||||
INT32 i, p;
|
||||
|
|
@ -837,19 +832,21 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
curline = ds->curline;
|
||||
backsector = pfloor->target;
|
||||
frontsector = curline->frontsector == pfloor->target ? curline->backsector : curline->frontsector;
|
||||
texnum = R_GetTextureNum(sides[pfloor->master->sidenum[0]].midtexture);
|
||||
basetexnum = sides[pfloor->master->sidenum[0]].midtexture;
|
||||
|
||||
R_CheckDebugHighlight(SW_HI_FOFSIDES);
|
||||
|
||||
if (pfloor->master->flags & ML_TFERLINE)
|
||||
{
|
||||
size_t linenum = std::min(curline->linedef-backsector->lines[0], (long int)pfloor->master->frontsector->linecount);
|
||||
size_t linenum = curline->linedef-backsector->lines[0];
|
||||
newline = pfloor->master->frontsector->lines[0] + linenum;
|
||||
texnum = R_GetTextureNum(sides[newline->sidenum[0]].midtexture);
|
||||
basetexnum = sides[newline->sidenum[0]].midtexture;
|
||||
}
|
||||
|
||||
texnum = R_GetTextureNum(basetexnum);
|
||||
|
||||
boolean brightmapped = R_TextureHasBrightmap(texnum);
|
||||
boolean remap = encoremap && R_TextureCanRemap(texnum);
|
||||
boolean remap = encoremap && R_TextureCanRemap(basetexnum);
|
||||
|
||||
R_SetColumnFunc(BASEDRAWFUNC, brightmapped);
|
||||
|
||||
|
|
@ -877,7 +874,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
R_SetColumnFunc(COLDRAWFUNC_FOG, brightmapped);
|
||||
}
|
||||
|
||||
range = std::max(ds->x2-ds->x1, 1);
|
||||
range = std::max<INT32>(ds->x2-ds->x1, 1);
|
||||
//SoM: Moved these up here so they are available for my lightlist calculations
|
||||
rw_scalestep = ds->scalestep;
|
||||
spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
|
||||
|
|
@ -1170,7 +1167,57 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
fixed_t height;
|
||||
fixed_t bheight = 0;
|
||||
INT32 solid = 0;
|
||||
INT32 lighteffect = 0;
|
||||
|
||||
auto set_light_vars = [&](INT32 i)
|
||||
{
|
||||
rlight = &dc->lightlist[i];
|
||||
|
||||
lightnum = R_AdjustLightLevel(rlight->lightnum);
|
||||
|
||||
if (lightnum < 0)
|
||||
xwalllights = scalelight[0];
|
||||
else if (lightnum >= LIGHTLEVELS)
|
||||
xwalllights = scalelight[LIGHTLEVELS-1];
|
||||
else
|
||||
xwalllights = scalelight[lightnum];
|
||||
|
||||
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
||||
if (pfloor->fofflags & FOF_FOG)
|
||||
{
|
||||
if (pfloor->master->frontsector->extra_colormap)
|
||||
rlight->rcolormap = pfloor->master->frontsector->extra_colormap->colormap + (xwalllights[pindex] - colormaps);
|
||||
else
|
||||
rlight->rcolormap = xwalllights[pindex];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rlight->extra_colormap)
|
||||
rlight->rcolormap = rlight->extra_colormap->colormap + (xwalllights[pindex] - colormaps);
|
||||
else
|
||||
rlight->rcolormap = xwalllights[pindex];
|
||||
}
|
||||
};
|
||||
|
||||
auto set_colormap_below_light = [&]
|
||||
{
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (remap && !(curline->linedef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
};
|
||||
|
||||
// Use the base sector's light level above the first FOF.
|
||||
// You can imagine it as the sky casting its light on top of the highest FOF.
|
||||
set_light_vars(0);
|
||||
set_colormap_below_light();
|
||||
|
||||
for (i = 0; i < dc->numlights; i++)
|
||||
{
|
||||
|
|
@ -1178,36 +1225,7 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
rlight = &dc->lightlist[i];
|
||||
xwalllights = NULL;
|
||||
if (!(dc->lightlist[i].flags & FOF_NOSHADE))
|
||||
{
|
||||
lightnum = R_AdjustLightLevel(rlight->lightnum);
|
||||
|
||||
if (lightnum < 0)
|
||||
xwalllights = scalelight[0];
|
||||
else if (lightnum >= LIGHTLEVELS)
|
||||
xwalllights = scalelight[LIGHTLEVELS-1];
|
||||
else
|
||||
xwalllights = scalelight[lightnum];
|
||||
|
||||
pindex = FixedMul(spryscale, LIGHTRESOLUTIONFIX)>>LIGHTSCALESHIFT;
|
||||
|
||||
if (pindex >= MAXLIGHTSCALE)
|
||||
pindex = MAXLIGHTSCALE-1;
|
||||
|
||||
if (pfloor->fofflags & FOF_FOG)
|
||||
{
|
||||
if (pfloor->master->frontsector->extra_colormap)
|
||||
rlight->rcolormap = pfloor->master->frontsector->extra_colormap->colormap + (xwalllights[pindex] - colormaps);
|
||||
else
|
||||
rlight->rcolormap = xwalllights[pindex];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (rlight->extra_colormap)
|
||||
rlight->rcolormap = rlight->extra_colormap->colormap + (xwalllights[pindex] - colormaps);
|
||||
else
|
||||
rlight->rcolormap = xwalllights[pindex];
|
||||
}
|
||||
}
|
||||
set_light_vars(i);
|
||||
|
||||
solid = 0; // don't carry over solid-cutting flag from the previous light
|
||||
|
||||
|
|
@ -1240,17 +1258,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
|
||||
if (height <= windowtop)
|
||||
{
|
||||
if (lighteffect)
|
||||
{
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (remap && !(curline->linedef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
}
|
||||
if (xwalllights)
|
||||
set_colormap_below_light();
|
||||
if (solid && windowtop < bheight)
|
||||
windowtop = bheight;
|
||||
continue;
|
||||
|
|
@ -1277,17 +1286,8 @@ void R_RenderThickSideRange(drawseg_t *ds, INT32 x1, INT32 x2, ffloor_t *pfloor)
|
|||
windowtop = bheight;
|
||||
else
|
||||
windowtop = windowbottom + 1;
|
||||
if (lighteffect)
|
||||
{
|
||||
dc->colormap = rlight->rcolormap;
|
||||
dc->lightmap = xwalllights[pindex];
|
||||
dc->fullbright = colormaps;
|
||||
if (remap && !(curline->linedef->flags & ML_TFERLINE))
|
||||
{
|
||||
dc->colormap += COLORMAP_REMAPOFFSET;
|
||||
dc->fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
}
|
||||
if (xwalllights)
|
||||
set_colormap_below_light();
|
||||
}
|
||||
windowbottom = sprbotscreen;
|
||||
// draw the texture, if there is any space left
|
||||
|
|
@ -1385,12 +1385,6 @@ static void R_DrawWallColumn(drawcolumndata_t* dc, INT32 yl, INT32 yh, fixed_t m
|
|||
coldrawfunc_t* colfunccopy = colfunc;
|
||||
drawcolumndata_t dc_copy = *dc;
|
||||
colfunccopy(const_cast<drawcolumndata_t*>(&dc_copy));
|
||||
|
||||
if (remap)
|
||||
{
|
||||
//dc_copy.colormap += COLORMAP_REMAPOFFSET;
|
||||
//dc_copy.fullbright += COLORMAP_REMAPOFFSET;
|
||||
}
|
||||
}
|
||||
|
||||
static void R_RenderSegLoop (drawcolumndata_t* dc)
|
||||
|
|
@ -1569,7 +1563,8 @@ static void R_RenderSegLoop (drawcolumndata_t* dc)
|
|||
//SoM: Calculate offsets for Thick fake floors.
|
||||
// calculate texture offset
|
||||
angle = (rw_centerangle + xtoviewangle[viewssnum][rw_x])>>ANGLETOFINESHIFT;
|
||||
texturecolumn = rw_offset-FixedMul(FINETANGENT(angle),rw_distance);
|
||||
// Mask 4095 to guarantee this index is within bounds
|
||||
texturecolumn = rw_offset-FixedMul(FINETANGENT(angle & 4095),rw_distance);
|
||||
|
||||
if (oldtexturecolumn != -1) {
|
||||
rw_bottomtexturemid += FixedMul(rw_bottomtextureslide, oldtexturecolumn-texturecolumn);
|
||||
|
|
@ -1829,12 +1824,10 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
vertex_t segleft, segright;
|
||||
fixed_t ceilingfrontslide, floorfrontslide, ceilingbackslide, floorbackslide;
|
||||
static size_t maxdrawsegs = 0;
|
||||
const INT32 twosidedmidtexture = R_GetTwoSidedMidTexture(curline);
|
||||
const boolean wantremap = encoremap && !(curline->linedef->flags & ML_TFERLINE);
|
||||
const INT32 twosidedmidtexture = R_GetTextureNum(R_GetTwoSidedMidTexture(curline));
|
||||
const bool wantremap = encoremap && !(curline->linedef->flags & ML_TFERLINE);
|
||||
drawcolumndata_t dc {0};
|
||||
|
||||
//ZoneScoped;
|
||||
|
||||
ZoneScoped;
|
||||
|
||||
maskedtextureheight = NULL;
|
||||
|
|
@ -2073,7 +2066,13 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
auto get_flat_tex = [](INT32 texnum)
|
||||
{
|
||||
texnum = R_GetTextureNum(texnum);
|
||||
return textures[texnum]->holes ? 0 : texnum; // R_DrawWallColumn cannot render holey textures
|
||||
if (textures[texnum]->holes)
|
||||
{
|
||||
//srb2::r_debug::add_texture_to_frame_list(texnum);
|
||||
// R_DrawWallColumn cannot render holey textures
|
||||
return R_GetTextureNum(R_CheckTextureNumForName("TRANSER1"));
|
||||
}
|
||||
return texnum;
|
||||
};
|
||||
|
||||
if (!backsector)
|
||||
|
|
@ -2082,7 +2081,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
// single sided line
|
||||
midtexture = get_flat_tex(sidedef->midtexture);
|
||||
midbrightmapped = R_TextureHasBrightmap(midtexture);
|
||||
midremap = wantremap && R_TextureCanRemap(midtexture);
|
||||
midremap = wantremap && R_TextureCanRemap(sidedef->midtexture);
|
||||
texheight = textureheight[midtexture];
|
||||
// a single sided line is terminal, so it must mark ends
|
||||
markfloor = markceiling = true;
|
||||
|
|
@ -2129,13 +2128,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
if (frontsector->ceilingpic == skyflatnum
|
||||
&& backsector->ceilingpic == skyflatnum)
|
||||
{
|
||||
if (udmf)
|
||||
bothceilingssky = true;
|
||||
else
|
||||
{
|
||||
worldtopslope = worldhighslope =
|
||||
worldtop = worldhigh;
|
||||
}
|
||||
bothceilingssky = true;
|
||||
}
|
||||
|
||||
// likewise, but for floors and upper textures
|
||||
|
|
@ -2148,7 +2141,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
ds_p->sprtopclip = ds_p->sprbottomclip = NULL;
|
||||
ds_p->silhouette = 0;
|
||||
|
||||
if (!bothfloorssky || !udmf)
|
||||
if (!bothfloorssky)
|
||||
{
|
||||
if (worldbottomslope > worldlowslope || worldbottom > worldlow)
|
||||
{
|
||||
|
|
@ -2187,24 +2180,15 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
//SoM: 3/25/2000: This code fixes an automap bug that didn't check
|
||||
// frontsector->ceiling and backsector->floor to see if a door was closed.
|
||||
// Without the following code, sprites get displayed behind closed doors.
|
||||
if ((!bothceilingssky && !bothfloorssky) || !udmf)
|
||||
if (doorclosed)
|
||||
{
|
||||
if (udmf || (!udmf && viewsector != frontsector && viewsector != backsector))
|
||||
{
|
||||
if (doorclosed || (worldhigh <= worldbottom && worldhighslope <= worldbottomslope))
|
||||
{
|
||||
ds_p->sprbottomclip = negonearray;
|
||||
ds_p->bsilheight = INT32_MAX;
|
||||
ds_p->silhouette |= SIL_BOTTOM;
|
||||
}
|
||||
ds_p->sprbottomclip = negonearray;
|
||||
ds_p->bsilheight = INT32_MAX;
|
||||
ds_p->silhouette |= SIL_BOTTOM;
|
||||
|
||||
if (doorclosed || (worldlow >= worldtop && worldlowslope >= worldtopslope))
|
||||
{
|
||||
ds_p->sprtopclip = screenheightarray;
|
||||
ds_p->tsilheight = INT32_MIN;
|
||||
ds_p->silhouette |= SIL_TOP;
|
||||
}
|
||||
}
|
||||
ds_p->sprtopclip = screenheightarray;
|
||||
ds_p->tsilheight = INT32_MIN;
|
||||
ds_p->silhouette |= SIL_TOP;
|
||||
}
|
||||
|
||||
if (bothfloorssky)
|
||||
|
|
@ -2213,7 +2197,8 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
// this is the same but for upside down thok barriers where the floor is sky and the ceiling is normal
|
||||
markfloor = false;
|
||||
}
|
||||
else if (worldlow != worldbottom
|
||||
else if (doorclosed
|
||||
|| worldlow != worldbottom
|
||||
|| worldlowslope != worldbottomslope
|
||||
|| backsector->f_slope != frontsector->f_slope
|
||||
|| backsector->floorpic != frontsector->floorpic
|
||||
|
|
@ -2250,7 +2235,8 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
// so we can see the floor of thok barriers always regardless of sector properties
|
||||
markceiling = false;
|
||||
}
|
||||
else if (worldhigh != worldtop
|
||||
else if (doorclosed
|
||||
|| worldhigh != worldtop
|
||||
|| worldhighslope != worldtopslope
|
||||
|| backsector->c_slope != frontsector->c_slope
|
||||
|| backsector->ceilingpic != frontsector->ceilingpic
|
||||
|
|
@ -2280,25 +2266,15 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
markceiling = false;
|
||||
}
|
||||
|
||||
if ((!bothceilingssky && !bothfloorssky) || !udmf)
|
||||
{
|
||||
if (((worldhigh <= worldbottom && worldhighslope <= worldbottomslope)
|
||||
|| (worldlow >= worldtop && worldlowslope >= worldtopslope)) || (!udmf && (backsector->ceilingheight <= frontsector->floorheight ||
|
||||
backsector->floorheight >= frontsector->ceilingheight)))
|
||||
{
|
||||
// closed door
|
||||
markceiling = markfloor = true;
|
||||
}
|
||||
}
|
||||
|
||||
// check TOP TEXTURE
|
||||
if (!bothceilingssky && (worldhigh < worldtop || worldhighslope < worldtopslope)) // never draw the top texture if on
|
||||
if (!bothceilingssky // never draw the top texture if on
|
||||
&& (worldhigh < worldtop || worldhighslope < worldtopslope))
|
||||
{
|
||||
fixed_t texheight;
|
||||
// top texture
|
||||
toptexture = get_flat_tex(sidedef->toptexture);
|
||||
topbrightmapped = R_TextureHasBrightmap(toptexture);
|
||||
topremap = wantremap && R_TextureCanRemap(toptexture);
|
||||
topremap = wantremap && R_TextureCanRemap(sidedef->toptexture);
|
||||
texheight = textureheight[toptexture];
|
||||
|
||||
if (!(linedef->flags & ML_SKEWTD))
|
||||
|
|
@ -2322,12 +2298,13 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
}
|
||||
}
|
||||
// check BOTTOM TEXTURE
|
||||
if ((!bothfloorssky || !udmf) && (worldlow > worldbottom || worldlowslope > worldbottomslope)) // never draw the top texture if on
|
||||
if (!bothfloorssky // never draw the bottom texture if on
|
||||
&& (worldlow > worldbottom || worldlowslope > worldbottomslope)) // Only if VISIBLE!!!
|
||||
{
|
||||
// bottom texture
|
||||
bottomtexture = get_flat_tex(sidedef->bottomtexture);
|
||||
bottombrightmapped = R_TextureHasBrightmap(bottomtexture);
|
||||
bottomremap = wantremap && R_TextureCanRemap(bottomtexture);
|
||||
bottomremap = wantremap && R_TextureCanRemap(sidedef->bottomtexture);
|
||||
|
||||
if (!(linedef->flags & ML_SKEWTD))
|
||||
{
|
||||
|
|
@ -2382,7 +2359,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
if (!(rover->fofflags & FOF_RENDERSIDES) || !(rover->fofflags & FOF_EXISTS))
|
||||
continue;
|
||||
if ((udmf && !(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES) || (!udmf && rover->fofflags & FOF_INVERTSIDES))
|
||||
if (!(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES)
|
||||
continue;
|
||||
|
||||
if (rover->norender == leveltime)
|
||||
|
|
@ -2440,7 +2417,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
if (!(rover->fofflags & FOF_RENDERSIDES) || !(rover->fofflags & FOF_EXISTS))
|
||||
continue;
|
||||
if ((udmf && !(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES) || (!udmf && rover->fofflags & FOF_INVERTSIDES))
|
||||
if (!(rover->fofflags & FOF_ALLSIDES || rover->fofflags & FOF_INVERTSIDES))
|
||||
continue;
|
||||
|
||||
if (rover->norender == leveltime)
|
||||
|
|
@ -2500,7 +2477,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
if (!(rover->fofflags & FOF_RENDERSIDES) || !(rover->fofflags & FOF_EXISTS))
|
||||
continue;
|
||||
if ((udmf && !(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES) || (!udmf && rover->fofflags & FOF_INVERTSIDES))
|
||||
if (!(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES)
|
||||
continue;
|
||||
if (rover->norender == leveltime)
|
||||
continue;
|
||||
|
|
@ -2522,7 +2499,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
{
|
||||
if (!(rover->fofflags & FOF_RENDERSIDES) || !(rover->fofflags & FOF_EXISTS))
|
||||
continue;
|
||||
if ((udmf && !(rover->fofflags & FOF_ALLSIDES) && rover->fofflags & FOF_INVERTSIDES) || (!udmf && rover->fofflags & FOF_INVERTSIDES))
|
||||
if (!(rover->fofflags & FOF_ALLSIDES || rover->fofflags & FOF_INVERTSIDES))
|
||||
continue;
|
||||
if (rover->norender == leveltime)
|
||||
continue;
|
||||
|
|
@ -2857,7 +2834,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
|
||||
if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) &&
|
||||
(roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) &&
|
||||
((viewz < planevistest && ((udmf && rover->fofflags & FOF_BOTHPLANES) || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
((viewz < planevistest && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
(viewz > planevistest && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
||||
{
|
||||
//ffloor[i].slope = *rover->b_slope;
|
||||
|
|
@ -2880,7 +2857,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
|
||||
if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) &&
|
||||
(roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) &&
|
||||
((viewz > planevistest && ((udmf && rover->fofflags & FOF_BOTHPLANES) || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
((viewz > planevistest && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
(viewz < planevistest && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
||||
{
|
||||
//ffloor[i].slope = *rover->t_slope;
|
||||
|
|
@ -2914,7 +2891,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
|
||||
if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) &&
|
||||
(roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) &&
|
||||
((viewz < planevistest && ((udmf && rover->fofflags & FOF_BOTHPLANES) || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
((viewz < planevistest && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
(viewz > planevistest && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
||||
{
|
||||
//ffloor[i].slope = *rover->b_slope;
|
||||
|
|
@ -2937,7 +2914,7 @@ void R_StoreWallRange(INT32 start, INT32 stop)
|
|||
|
||||
if ((roverleft>>4 <= worldhigh || roverright>>4 <= worldhighslope) &&
|
||||
(roverleft>>4 >= worldlow || roverright>>4 >= worldlowslope) &&
|
||||
((viewz > planevistest && ((udmf && rover->fofflags & FOF_BOTHPLANES) || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
((viewz > planevistest && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) ||
|
||||
(viewz < planevistest && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES))))
|
||||
{
|
||||
//ffloor[i].slope = *rover->t_slope;
|
||||
|
|
|
|||
114
src/r_things.cpp
114
src/r_things.cpp
|
|
@ -937,21 +937,21 @@ static void R_DrawVisSprite(vissprite_t *vis)
|
|||
}
|
||||
else if (!(vis->cut & SC_PRECIP) &&
|
||||
R_ThingIsFlashing(vis->mobj)) // Bosses "flash"
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS, false); // translate certain pixels to white
|
||||
}
|
||||
else if (vis->transmap && dc.translation) // Color mapping
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANSTRANS, false);
|
||||
dc.transmap = vis->transmap;
|
||||
}
|
||||
else if (vis->transmap)
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, false);
|
||||
dc.transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
||||
}
|
||||
else if (dc.translation) // translate green skin to another color
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS, false);
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS, false); // translate certain pixels to white
|
||||
}
|
||||
else if (vis->transmap && dc.translation) // Color mapping
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANSTRANS, false);
|
||||
dc.transmap = vis->transmap;
|
||||
}
|
||||
else if (vis->transmap)
|
||||
{
|
||||
R_SetColumnFunc(COLDRAWFUNC_FUZZY, false);
|
||||
dc.transmap = vis->transmap; //Fab : 29-04-98: translucency table
|
||||
}
|
||||
else if (dc.translation) // translate green skin to another color
|
||||
R_SetColumnFunc(COLDRAWFUNC_TRANS, false);
|
||||
|
||||
if (vis->extra_colormap && !(vis->cut & SC_FULLBRIGHT) && !(vis->renderflags & RF_NOCOLORMAPS))
|
||||
{
|
||||
|
|
@ -1181,10 +1181,11 @@ static void R_DrawPrecipitationVisSprite(vissprite_t *vis)
|
|||
{
|
||||
texturecolumn = frac>>FRACBITS;
|
||||
|
||||
#ifdef RANGECHECK
|
||||
if (texturecolumn < 0 || texturecolumn >= patch->width)
|
||||
I_Error("R_DrawPrecipitationSpriteRange: bad texturecolumn");
|
||||
#endif
|
||||
{
|
||||
CONS_Debug(DBG_RENDER, "R_DrawPrecipitationSpriteRange: bad texturecolumn\n");
|
||||
break;
|
||||
}
|
||||
|
||||
column = (column_t *)((UINT8 *)patch->columns + (patch->columnofs[texturecolumn]));
|
||||
|
||||
|
|
@ -3335,7 +3336,7 @@ void R_ClipVisSprite(vissprite_t *spr, INT32 x1, INT32 x2, portal_t* portal)
|
|||
INT32 silhouette;
|
||||
INT32 xclip;
|
||||
|
||||
if (cv_debugrender_spriteclip.value)
|
||||
if (/*(spr->renderflags & RF_ALWAYSONTOP) ||*/ cv_debugrender_spriteclip.value)
|
||||
{
|
||||
for (x = x1; x <= x2; x++)
|
||||
{
|
||||
|
|
@ -3379,30 +3380,30 @@ void R_ClipVisSprite(vissprite_t *spr, INT32 x1, INT32 x2, portal_t* portal)
|
|||
if (ds->portalpass > 0 && ds->portalpass <= portalrender)
|
||||
continue; // is a portal
|
||||
|
||||
if (ds->scale1 > ds->scale2)
|
||||
{
|
||||
lowscale = ds->scale2;
|
||||
scale = ds->scale1;
|
||||
}
|
||||
else
|
||||
{
|
||||
lowscale = ds->scale1;
|
||||
scale = ds->scale2;
|
||||
}
|
||||
if (ds->scale1 > ds->scale2)
|
||||
{
|
||||
lowscale = ds->scale2;
|
||||
scale = ds->scale1;
|
||||
}
|
||||
else
|
||||
{
|
||||
lowscale = ds->scale1;
|
||||
scale = ds->scale2;
|
||||
}
|
||||
|
||||
if (scale < spr->sortscale ||
|
||||
(lowscale < spr->sortscale &&
|
||||
!R_PointOnSegSide (spr->gx, spr->gy, ds->curline)))
|
||||
{
|
||||
// masked mid texture?
|
||||
/*
|
||||
if (ds->maskedtexturecol)
|
||||
R_RenderMaskedSegRange (ds, r1, r2);
|
||||
*/
|
||||
if (scale < spr->sortscale ||
|
||||
(lowscale < spr->sortscale &&
|
||||
!R_PointOnSegSide (spr->gx, spr->gy, ds->curline)))
|
||||
{
|
||||
// masked mid texture?
|
||||
/*
|
||||
* if (ds->maskedtexturecol)
|
||||
* R_RenderMaskedSegRange (ds, r1, r2);
|
||||
*/
|
||||
|
||||
// seg is behind sprite
|
||||
continue;
|
||||
}
|
||||
// seg is behind sprite
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
r1 = ds->x1 < x1 ? x1 : ds->x1;
|
||||
|
|
@ -3588,7 +3589,7 @@ void R_ClipSprites(drawseg_t* dsstart, portal_t* portal)
|
|||
drawsegs_xranges[i].items = static_cast<drawseg_xrange_item_t*>(Z_Realloc(
|
||||
drawsegs_xranges[i].items,
|
||||
drawsegs_xrange_size * sizeof(drawsegs_xranges[i].items[0]),
|
||||
PU_STATIC, NULL
|
||||
PU_STATIC, NULL
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
@ -3604,15 +3605,15 @@ void R_ClipSprites(drawseg_t* dsstart, portal_t* portal)
|
|||
// e6y: ~13% of speed improvement on sunder.wad map10
|
||||
if (ds->x1 < cx)
|
||||
{
|
||||
drawsegs_xranges[1].items[drawsegs_xranges[1].count] =
|
||||
drawsegs_xranges[0].items[drawsegs_xranges[0].count];
|
||||
drawsegs_xranges[1].items[drawsegs_xranges[1].count] =
|
||||
drawsegs_xranges[0].items[drawsegs_xranges[0].count];
|
||||
drawsegs_xranges[1].count++;
|
||||
}
|
||||
|
||||
if (ds->x2 >= cx)
|
||||
{
|
||||
drawsegs_xranges[2].items[drawsegs_xranges[2].count] =
|
||||
drawsegs_xranges[0].items[drawsegs_xranges[0].count];
|
||||
drawsegs_xranges[2].items[drawsegs_xranges[2].count] =
|
||||
drawsegs_xranges[0].items[drawsegs_xranges[0].count];
|
||||
drawsegs_xranges[2].count++;
|
||||
}
|
||||
|
||||
|
|
@ -3751,10 +3752,11 @@ static void R_DrawMaskedList (drawnode_t* head)
|
|||
R_DoneWithNode(r2);
|
||||
r2 = next;
|
||||
}
|
||||
else if (r2->seg)
|
||||
else if (r2->seg && r2->seg->maskedtexturecol != NULL)
|
||||
{
|
||||
next = r2->prev;
|
||||
R_RenderMaskedSegRange(r2->seg, r2->seg->x1, r2->seg->x2);
|
||||
r2->seg->maskedtexturecol = NULL;
|
||||
R_DoneWithNode(r2);
|
||||
r2 = next;
|
||||
}
|
||||
|
|
@ -3783,18 +3785,18 @@ static void R_DrawMaskedList (drawnode_t* head)
|
|||
vissprite_t *ds = r2->sprite->linkdraw;
|
||||
|
||||
for (;
|
||||
(ds != NULL && r2->sprite->dispoffset > ds->dispoffset);
|
||||
(ds != NULL && r2->sprite->dispoffset > ds->dispoffset);
|
||||
ds = ds->next)
|
||||
{
|
||||
R_DrawSprite(ds);
|
||||
}
|
||||
{
|
||||
R_DrawSprite(ds);
|
||||
}
|
||||
|
||||
R_DrawSprite(r2->sprite);
|
||||
R_DrawSprite(r2->sprite);
|
||||
|
||||
for (; ds != NULL; ds = ds->next)
|
||||
{
|
||||
R_DrawSprite(ds);
|
||||
}
|
||||
for (; ds != NULL; ds = ds->next)
|
||||
{
|
||||
R_DrawSprite(ds);
|
||||
}
|
||||
}
|
||||
|
||||
R_DoneWithNode(r2);
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ void R_SetColumnFunc(size_t id, boolean brightmapped)
|
|||
|
||||
void R_SetSpanFunc(size_t id, boolean npo2, boolean brightmapped)
|
||||
{
|
||||
I_Assert(id < COLDRAWFUNC_MAX);
|
||||
I_Assert(id < SPANDRAWFUNC_MAX);
|
||||
|
||||
if (debugrender_highlight != 0 && R_SetSpanFuncFlat(id))
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue