diff --git a/src/r_bsp.cpp b/src/r_bsp.cpp index 2b5340f87..d5a4f62bf 100644 --- a/src/r_bsp.cpp +++ b/src/r_bsp.cpp @@ -13,6 +13,9 @@ #include +//#include + +#include "command.h" #include "doomdef.h" #include "g_game.h" #include "r_local.h" @@ -30,6 +33,7 @@ extern "C" { #include "qs22j.h" } +extern "C" consvar_t cv_debugfinishline; seg_t *curline; side_t *sidedef; @@ -418,7 +422,8 @@ boolean R_IsEmptyLine(seg_t *line, sector_t *front, sector_t *back) // Consider colormaps && back->extra_colormap == front->extra_colormap && ((!front->ffloors && !back->ffloors) - || Tag_Compare(&front->tags, &back->tags))); + || Tag_Compare(&front->tags, &back->tags)) + && (!cv_debugfinishline.value || back->damagetype == front->damagetype)); } boolean R_IsDebugLine(seg_t *line) @@ -1013,6 +1018,11 @@ static void R_Subsector(size_t num) ceilingcolormap = *frontsector->lightlist[light].extra_colormap; } + auto sector_damage = [](sector_t* s) { return static_cast(s->damagetype); }; + + auto floor_damage = [&](sector_t* s) { return s->flags & MSF_FLIPSPECIAL_FLOOR ? sector_damage(s) : SD_NONE; }; + auto ceiling_damage = [&](sector_t* s) { return s->flags & MSF_FLIPSPECIAL_CEILING ? sector_damage(s) : SD_NONE; }; + sub->sector->extra_colormap = frontsector->extra_colormap; if (P_GetSectorFloorZAt(frontsector, viewx, viewy) < viewz @@ -1025,7 +1035,7 @@ static void R_Subsector(size_t num) floorcolormap, NULL, NULL, frontsector->f_slope, R_NoEncore(frontsector, &levelflats[frontsector->floorpic], false), R_IsRipplePlane(frontsector, NULL, false), - false, frontsector + false, frontsector, floor_damage(frontsector) ); } else @@ -1041,7 +1051,7 @@ static void R_Subsector(size_t num) ceilingcolormap, NULL, NULL, frontsector->c_slope, R_NoEncore(frontsector, &levelflats[frontsector->ceilingpic], true), R_IsRipplePlane(frontsector, NULL, true), - true, frontsector + true, frontsector, ceiling_damage(frontsector) ); } else @@ -1055,9 +1065,20 @@ static void R_Subsector(size_t num) { fixed_t heightcheck, planecenterz; + auto fof_damage = [&](auto& f) + { + sector_t* s = rover->master->frontsector; + return rover->fofflags & FOF_BLOCKPLAYER ? f(s) : sector_damage(s); + }; + + auto fof_top_damage = [&] { return fof_damage(floor_damage); }; + auto fof_bottom_damage = [&] { return fof_damage(ceiling_damage); }; + for (rover = frontsector->ffloors; rover && numffloors < MAXFFLOORS; rover = rover->next) { - if (!(rover->fofflags & FOF_EXISTS) || !(rover->fofflags & FOF_RENDERPLANES)) + bool visible = rover->fofflags & FOF_RENDERPLANES; + + if (!(rover->fofflags & FOF_EXISTS) || (!cv_debugfinishline.value && !visible)) continue; if (frontsector->cullheight) @@ -1080,6 +1101,14 @@ static void R_Subsector(size_t num) && ((viewz < heightcheck && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) || (viewz > heightcheck && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES)))) { + sectordamage_t damage = fof_bottom_damage(); + + if (!damage && !visible) + { + rover->norender = leveltime; // Tell R_StoreWallRange to skip this + continue; + } + light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck); @@ -1089,7 +1118,7 @@ static void R_Subsector(size_t num) *rover->bottomyoffs, *rover->bottomangle, *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->b_slope, R_NoEncore(rover->master->frontsector, &levelflats[*rover->bottompic], true), R_IsRipplePlane(rover->master->frontsector, rover, true), - true, frontsector + true, frontsector, damage ); ffloor[numffloors].slope = *rover->b_slope; @@ -1115,6 +1144,14 @@ static void R_Subsector(size_t num) && ((viewz > heightcheck && (rover->fofflags & FOF_BOTHPLANES || !(rover->fofflags & FOF_INVERTPLANES))) || (viewz < heightcheck && (rover->fofflags & FOF_BOTHPLANES || rover->fofflags & FOF_INVERTPLANES)))) { + sectordamage_t damage = fof_top_damage(); + + if (!damage && !visible) + { + rover->norender = leveltime; // Tell R_StoreWallRange to skip this + continue; + } + light = R_GetPlaneLight(frontsector, planecenterz, viewz < heightcheck); ffloor[numffloors].plane = R_FindPlane( @@ -1123,7 +1160,7 @@ static void R_Subsector(size_t num) *frontsector->lightlist[light].extra_colormap, rover, NULL, *rover->t_slope, R_NoEncore(rover->master->frontsector, &levelflats[*rover->toppic], false), R_IsRipplePlane(rover->master->frontsector, rover, false), - false, frontsector + false, frontsector, damage ); ffloor[numffloors].slope = *rover->t_slope; @@ -1145,6 +1182,10 @@ static void R_Subsector(size_t num) polyobj_t *po = sub->polyList; sector_t *polysec; + auto poly_damage = [&](auto& f) { return polysec->flags & POF_SOLID ? f(polysec) : sector_damage(polysec); }; + auto poly_top_damage = [&] { return poly_damage(floor_damage); }; + auto poly_bottom_damage = [&] { return poly_damage(ceiling_damage); }; + while (po) { if (numffloors >= MAXFFLOORS) @@ -1173,7 +1214,7 @@ static void R_Subsector(size_t num) NULL, // will ffloors be slopable eventually? R_NoEncore(polysec, &levelflats[polysec->floorpic], false), false, /* TODO: wet polyobjects? */ - true, frontsector + true, frontsector, poly_bottom_damage() ); ffloor[numffloors].height = polysec->floorheight; @@ -1202,7 +1243,7 @@ static void R_Subsector(size_t num) NULL, // will ffloors be slopable eventually? R_NoEncore(polysec, &levelflats[polysec->ceilingpic], true), false, /* TODO: wet polyobjects? */ - false, frontsector + false, frontsector, poly_top_damage() ); ffloor[numffloors].polyobj = po; diff --git a/src/r_draw.c b/src/r_draw.c index 63af42fa9..09f28e104 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -117,6 +117,7 @@ INT32 ds_y, ds_x1, ds_x2; lighttable_t *ds_colormap; lighttable_t *ds_fullbright; lighttable_t *ds_translation; // Lactozilla: Sprite splat drawer +lighttable_t *ds_flatlighting; fixed_t ds_xfrac, ds_yfrac, ds_xstep, ds_ystep; INT32 ds_waterofs, ds_bgofs; diff --git a/src/r_draw.h b/src/r_draw.h index 4936674e6..b1d312bf8 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -67,6 +67,7 @@ extern INT32 ds_y, ds_x1, ds_x2; extern lighttable_t *ds_colormap; extern lighttable_t *ds_fullbright; extern lighttable_t *ds_translation; +extern lighttable_t *ds_flatlighting; extern fixed_t ds_xfrac, ds_yfrac, ds_xstep, ds_ystep; extern INT32 ds_waterofs, ds_bgofs; @@ -78,8 +79,6 @@ extern UINT8 *ds_source; extern UINT8 *ds_brightmap; extern UINT8 *ds_transmap; -extern UINT8 ds_flatcolor; - struct floatv3_t { float x, y, z; }; diff --git a/src/r_plane.cpp b/src/r_plane.cpp index d2b36bed7..f84448d58 100644 --- a/src/r_plane.cpp +++ b/src/r_plane.cpp @@ -13,6 +13,9 @@ /// while maintaining a per column clipping list only. /// Moreover, the sky areas have to be determined. +//#include + +#include "command.h" #include "doomdef.h" #include "console.h" #include "m_easing.h" // For Easing_InOutSine, used in R_UpdatePlaneRipple @@ -32,6 +35,8 @@ #include "z_zone.h" #include "p_tick.h" +extern "C" consvar_t cv_debugfinishline; + // // opening // @@ -210,21 +215,29 @@ static void R_MapPlane(INT32 y, INT32 x1, INT32 x2) ds_bgofs >>= FRACBITS; } - pindex = distance >> LIGHTZSHIFT; - if (pindex >= MAXLIGHTZ) - pindex = MAXLIGHTZ - 1; - ds_colormap = planezlight[pindex]; - - if (!debugrender_highlight) + if (ds_flatlighting) { - if (currentplane->extra_colormap) - ds_colormap = currentplane->extra_colormap->colormap + (ds_colormap - colormaps); + ds_colormap = ds_flatlighting; + } + else + { + pindex = distance >> LIGHTZSHIFT; + if (pindex >= MAXLIGHTZ) + pindex = MAXLIGHTZ - 1; - ds_fullbright = colormaps; - if (encoremap && !currentplane->noencore) + ds_colormap = planezlight[pindex]; + + if (!debugrender_highlight) { - ds_colormap += COLORMAP_REMAPOFFSET; - ds_fullbright += COLORMAP_REMAPOFFSET; + if (currentplane->extra_colormap) + ds_colormap = currentplane->extra_colormap->colormap + (ds_colormap - colormaps); + + ds_fullbright = colormaps; + if (encoremap && !currentplane->noencore) + { + ds_colormap += COLORMAP_REMAPOFFSET; + ds_fullbright += COLORMAP_REMAPOFFSET; + } } } @@ -359,11 +372,17 @@ static visplane_t *new_visplane(unsigned hash) visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap, ffloor_t *pfloor, polyobj_t *polyobj, pslope_t *slope, boolean noencore, - boolean ripple, boolean reverseLight, const sector_t *lighting_sector) + boolean ripple, boolean reverseLight, const sector_t *lighting_sector, + sectordamage_t damage) { visplane_t *check; unsigned hash; + if (!cv_debugfinishline.value) + { + damage = SD_NONE; + } + if (!slope) // Don't mess with this right now if a slope is involved { if (plangle != 0) @@ -442,7 +461,8 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, && check->plangle == plangle && check->slope == slope && check->noencore == noencore - && check->ripple == ripple) + && check->ripple == ripple + && check->damage == damage) { return check; } @@ -473,6 +493,7 @@ visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, check->slope = slope; check->noencore = noencore; check->ripple = ripple; + check->damage = damage; memset(check->top, 0xff, sizeof (check->top)); memset(check->bottom, 0x00, sizeof (check->bottom)); @@ -551,6 +572,7 @@ visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop) new_pl->slope = pl->slope; new_pl->noencore = pl->noencore; new_pl->ripple = pl->ripple; + new_pl->damage = pl->damage; pl = new_pl; pl->minx = start; pl->maxx = stop; @@ -858,6 +880,7 @@ void R_DrawSinglePlane(visplane_t *pl) debugrender_highlight_t debug = debugrender_highlight_t::SW_HI_PLANES; void (*mapfunc)(INT32, INT32, INT32) = R_MapPlane; + bool highlight = R_PlaneIsHighlighted(pl); if (!(pl->minx <= pl->maxx)) return; @@ -865,7 +888,22 @@ void R_DrawSinglePlane(visplane_t *pl) // sky flat if (pl->picnum == skyflatnum) { - R_DrawSkyPlane(pl); + if (highlight) + { + r8_flatcolor = 35; // red + dc_lightmap = colormaps; + + for (dc_x = pl->minx; dc_x <= pl->maxx; ++dc_x) + { + dc_yl = pl->top[dc_x]; + dc_yh = pl->bottom[dc_x]; + R_DrawColumn_Flat_8(); + } + } + else + { + R_DrawSkyPlane(pl); + } return; } @@ -918,6 +956,7 @@ void R_DrawSinglePlane(visplane_t *pl) // Hacked up support for alpha value in software mode Tails 09-24-2002 // ...unhacked by toaster 04-01-2021 + if (!highlight) { INT32 trans = (10*((256+12) - pl->ffloor->alpha))/255; if (trans >= 10) @@ -1119,11 +1158,20 @@ void R_DrawSinglePlane(visplane_t *pl) planezlight = zlight[light]; } + if (highlight && R_SetSpanFuncFlat(BASEDRAWFUNC)) + { + r8_flatcolor = 35; // red + ds_flatlighting = colormaps; + } + else + { + R_CheckDebugHighlight(debug); - R_CheckDebugHighlight(debug); + // Use the correct span drawer depending on the powers-of-twoness + R_SetSpanFunc(spanfunctype, !ds_powersoftwo, ds_brightmap != NULL); - // Use the correct span drawer depending on the powers-of-twoness - R_SetSpanFunc(spanfunctype, !ds_powersoftwo, ds_brightmap != NULL); + ds_flatlighting = NULL; + } // set the maximum value for unsigned pl->top[pl->maxx+1] = 0xffff; @@ -1226,3 +1274,8 @@ void R_PlaneBounds(visplane_t *plane) plane->high = hi; plane->low = low; } + +boolean R_PlaneIsHighlighted(const visplane_t *pl) +{ + return pl->damage == SD_DEATHPIT || pl->damage == SD_INSTAKILL; +} diff --git a/src/r_plane.h b/src/r_plane.h index 2a77dcfea..2d2f5b04e 100644 --- a/src/r_plane.h +++ b/src/r_plane.h @@ -20,6 +20,7 @@ extern "C" { #include "screen.h" // needs MAXVIDWIDTH/MAXVIDHEIGHT #include "r_data.h" +#include "r_defs.h" #include "r_textures.h" #include "p_polyobj.h" @@ -60,6 +61,7 @@ struct visplane_t boolean noencore; boolean ripple; + sectordamage_t damage; }; extern visplane_t *visplanes[MAXVISPLANES]; @@ -88,7 +90,7 @@ void R_ClearFFloorClips (void); void R_DrawPlanes(void); visplane_t *R_FindPlane(fixed_t height, INT32 picnum, INT32 lightlevel, fixed_t xoff, fixed_t yoff, angle_t plangle, extracolormap_t *planecolormap, ffloor_t *ffloor, polyobj_t *polyobj, pslope_t *slope, boolean noencore, - boolean ripple, boolean reverseLight, const sector_t *lighting_sector); + boolean ripple, boolean reverseLight, const sector_t *lighting_sector, sectordamage_t damage); visplane_t *R_CheckPlane(visplane_t *pl, INT32 start, INT32 stop); void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop); void R_PlaneBounds(visplane_t *plane); @@ -108,6 +110,8 @@ void R_CalculateSlopeVectors(void); // Sets the slope vector pointers for the current tilted span. void R_SetTiltedSpan(INT32 span); +boolean R_PlaneIsHighlighted(const visplane_t *pl); + struct visffloor_t { visplane_t *plane; diff --git a/src/r_portal.c b/src/r_portal.c index d40bd39d1..0a4a645e1 100644 --- a/src/r_portal.c +++ b/src/r_portal.c @@ -301,7 +301,7 @@ void Portal_AddSkyboxPortals (void) { for (pl = visplanes[i]; pl; pl = pl->next) { - if (pl->picnum == skyflatnum) + if (pl->picnum == skyflatnum && !pl->damage) { Portal_AddSkybox(pl); diff --git a/src/r_segs.cpp b/src/r_segs.cpp index 89b215808..27c25ce7d 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -11,6 +11,9 @@ /// \file r_segs.c /// \brief All the clipping: columns, horizontal spans, sky columns +//#include + +#include "command.h" #include "doomdef.h" #include "r_local.h" #include "r_sky.h" @@ -29,6 +32,8 @@ #include "r_draw.h" #include "k_terrain.h" +extern "C" consvar_t cv_debugfinishline; + #define HEIGHTBITS 12 #define HEIGHTUNIT (1<extra_colormap != backsector->extra_colormap || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags)) // Portals block traversal behind them - || g_portal) + || g_portal + // Highlighting death pits + || (cv_debugfinishline.value && frontsector->damagetype != backsector->damagetype)) { markfloor = true; } @@ -2283,7 +2290,9 @@ void R_StoreWallRange(INT32 start, INT32 stop) || frontsector->extra_colormap != backsector->extra_colormap || (frontsector->ffloors != backsector->ffloors && !Tag_Compare(&frontsector->tags, &backsector->tags)) // Portals block traversal behind them - || g_portal) + || g_portal + // Highlighting death pits + || (cv_debugfinishline.value && frontsector->damagetype != backsector->damagetype)) { markceiling = true; } @@ -2860,7 +2869,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) { for (rover = backsector->ffloors; rover && i < MAXFFLOORS; rover = rover->next) { - if (!(rover->fofflags & FOF_EXISTS) || !(rover->fofflags & FOF_RENDERPLANES)) + if (!(rover->fofflags & FOF_EXISTS) || (!cv_debugfinishline.value && !(rover->fofflags & FOF_RENDERPLANES))) continue; if (rover->norender == leveltime) continue; @@ -2917,7 +2926,7 @@ void R_StoreWallRange(INT32 start, INT32 stop) { for (rover = frontsector->ffloors; rover && i < MAXFFLOORS; rover = rover->next) { - if (!(rover->fofflags & FOF_EXISTS) || !(rover->fofflags & FOF_RENDERPLANES)) + if (!(rover->fofflags & FOF_EXISTS) || (!cv_debugfinishline.value && !(rover->fofflags & FOF_RENDERPLANES))) continue; if (rover->norender == leveltime) continue; diff --git a/src/screen.c b/src/screen.c index 21a6ad00e..1fcbc6d36 100644 --- a/src/screen.c +++ b/src/screen.c @@ -258,11 +258,12 @@ void R_SetSpanFunc(size_t id, boolean npo2, boolean brightmapped) { I_Assert(id < COLDRAWFUNC_MAX); - if (spanfuncs_flat[id] != NULL && debugrender_highlight != 0) + if (debugrender_highlight != 0 && R_SetSpanFuncFlat(id)) { - spanfunc = spanfuncs_flat[id]; + return; } - else if (spanfuncs_npo2[id] != NULL && npo2 == true) + + if (spanfuncs_npo2[id] != NULL && npo2 == true) { spanfunc = spanfuncs_npo2[id]; } @@ -278,6 +279,20 @@ void R_SetSpanFunc(size_t id, boolean npo2, boolean brightmapped) } } +boolean R_SetSpanFuncFlat(size_t id) +{ + I_Assert(id < SPANDRAWFUNC_MAX); + + if (spanfuncs_flat[id] == NULL) + { + return false; + } + + spanfunc = spanfuncs_flat[id]; + + return true; +} + boolean R_CheckColumnFunc(size_t id) { size_t i; diff --git a/src/screen.h b/src/screen.h index 70455885f..f8ab2dc1b 100644 --- a/src/screen.h +++ b/src/screen.h @@ -225,6 +225,7 @@ void SCR_SetDrawFuncs(void); // Set current column / span drawers void R_SetColumnFunc(size_t id, boolean brightmapped); void R_SetSpanFunc(size_t id, boolean npo2, boolean brightmapped); +boolean R_SetSpanFuncFlat(size_t id); // flat color // Compare current column drawer boolean R_CheckColumnFunc(size_t id);