From e293e0bc78b40b499f10dcfd52c6315815939941 Mon Sep 17 00:00:00 2001 From: Oni Date: Mon, 25 Sep 2023 00:16:52 +0000 Subject: [PATCH] Merge branch 'clamp-sprite-column' into 'master' Always clamp texturecolumn in sprite draw See merge request KartKrew/Kart!1527 --- src/r_plane.cpp | 114 ++++++++++++++++++++++++----------------------- src/r_plane.h | 2 +- src/r_things.cpp | 5 +++ 3 files changed, 65 insertions(+), 56 deletions(-) diff --git a/src/r_plane.cpp b/src/r_plane.cpp index b73850a28..e1907c714 100644 --- a/src/r_plane.cpp +++ b/src/r_plane.cpp @@ -30,6 +30,7 @@ #include "r_sky.h" #include "r_portal.h" #include "core/thread_pool.h" +#include "r_fps.h" #include "v_video.h" #include "w_wad.h" @@ -942,20 +943,22 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle INT32 type, spanfunctype = BASEDRAWFUNC; debugrender_highlight_t debug = debugrender_highlight_t::SW_HI_PLANES; void (*mapfunc)(drawspandata_t*, void(*)(drawspandata_t*), INT32, INT32, INT32, boolean) = R_MapPlane; - bool highlight = R_PlaneIsHighlighted(pl); + INT16 highlight = R_PlaneIsHighlighted(pl); if (!(pl->minx <= pl->maxx)) return; ZoneScoped; + R_UpdatePlaneRipple(ds); + // sky flat if (pl->picnum == skyflatnum) { - if (highlight) + if (highlight != -1) { drawcolumndata_t dc = {}; - dc.r8_flatcolor = 35; // red + dc.r8_flatcolor = highlight; dc.lightmap = colormaps; for (dc.x = pl->minx; dc.x <= pl->maxx; ++dc.x) @@ -981,13 +984,13 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle // Hacked up support for alpha value in software mode Tails 09-24-2002 (sidenote: ported to polys 10-15-2014, there was no time travel involved -Red) if (pl->polyobj->translucency >= NUMTRANSMAPS) return; // Don't even draw it - else if (pl->polyobj->translucency > 0) - { - spanfunctype = (pl->polyobj->flags & POF_SPLAT) ? SPANDRAWFUNC_TRANSSPLAT : SPANDRAWFUNC_TRANS; - ds->transmap = R_GetTranslucencyTable(pl->polyobj->translucency); - } - else if (pl->polyobj->flags & POF_SPLAT) // Opaque, but allow transparent flat pixels - spanfunctype = SPANDRAWFUNC_SPLAT; + else if (pl->polyobj->translucency > 0) + { + spanfunctype = (pl->polyobj->flags & POF_SPLAT) ? SPANDRAWFUNC_TRANSSPLAT : SPANDRAWFUNC_TRANS; + ds->transmap = R_GetTranslucencyTable(pl->polyobj->translucency); + } + else if (pl->polyobj->flags & POF_SPLAT) // Opaque, but allow transparent flat pixels + spanfunctype = SPANDRAWFUNC_SPLAT; if (pl->polyobj->translucency == 0 || (pl->extra_colormap && (pl->extra_colormap->flags & CMF_FOG))) light = (pl->lightlevel >> LIGHTSEGSHIFT); @@ -1021,7 +1024,7 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle // Hacked up support for alpha value in software mode Tails 09-24-2002 // ...unhacked by toaster 04-01-2021 - if (!highlight) + if (highlight == -1) { INT32 trans = (10*((256+12) - pl->ffloor->alpha))/255; if (trans >= 10) @@ -1051,7 +1054,7 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle debug = SW_HI_PLANES; } -#ifndef NOWATER + #ifndef NOWATER if (pl->ripple) { INT32 top, bottom; @@ -1059,8 +1062,6 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle ds->planeripple.active = true; if (spanfunctype == SPANDRAWFUNC_TRANS) { - UINT8 i; - spanfunctype = SPANDRAWFUNC_WATER; // Copy the current scene, ugh @@ -1073,46 +1074,41 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle bottom = viewheight; // Only copy the part of the screen we need - for (i = 0; i <= r_splitscreen; i++) + UINT8 i = R_GetViewNumber(); + INT32 scrx = 0; + INT32 scry = top; + INT32 offset; + + if (r_splitscreen == 1) { - if (viewplayer == &players[displayplayers[i]]) + if (i & 1) { - INT32 scrx = 0; - INT32 scry = top; - INT32 offset; - - if (r_splitscreen == 1) - { - if (i & 1) - { - scry += viewheight; - } - } - else - { - if (i & 1) - { - scrx += viewwidth; - } - - if (i / 2) - { - scry += viewheight; - } - } - - offset = (scry*vid.width) + scrx; - - // 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); + scry += viewheight; } } + else + { + if (i & 1) + { + scrx += viewwidth; + } + + if (i / 2) + { + scry += viewheight; + } + } + + offset = (scry*vid.width) + scrx; + + // 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); } } -#endif + #endif } ds->currentplane = pl; @@ -1134,9 +1130,9 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle ds->source = (UINT8 *)R_GetLevelFlat(ds, levelflat); if (!ds->source) return; - // Check if this texture or patch has power-of-two dimensions. - if (R_CheckPowersOfTwo(ds)) - R_CheckFlatLength(ds, ds->flatwidth * ds->flatheight); + // Check if this texture or patch has power-of-two dimensions. + if (R_CheckPowersOfTwo(ds)) + R_CheckFlatLength(ds, ds->flatwidth * ds->flatheight); } if (type == LEVELFLAT_TEXTURE) @@ -1228,9 +1224,9 @@ void R_DrawSinglePlane(drawspandata_t *ds, visplane_t *pl, boolean allow_paralle ds->planezlight = zlight[light]; } - if (highlight && R_SetSpanFuncFlat(BASEDRAWFUNC)) + if (highlight != -1 && R_SetSpanFuncFlat(BASEDRAWFUNC)) { - ds->r8_flatcolor = 35; // red + ds->r8_flatcolor = highlight; ds->flatlighting = colormaps; } else @@ -1274,7 +1270,15 @@ void R_PlaneBounds(visplane_t *plane) plane->low = low; } -boolean R_PlaneIsHighlighted(const visplane_t *pl) +INT16 R_PlaneIsHighlighted(const visplane_t *pl) { - return pl->damage == SD_DEATHPIT || pl->damage == SD_INSTAKILL; + switch (pl->damage) + { + case SD_DEATHPIT: + case SD_INSTAKILL: + return 35; // red + + default: + return -1; + } } diff --git a/src/r_plane.h b/src/r_plane.h index 6f116b0c1..93313ce97 100644 --- a/src/r_plane.h +++ b/src/r_plane.h @@ -105,7 +105,7 @@ void R_CalculateSlopeVectors(drawspandata_t* ds); // Sets the slope vector pointers for the current tilted span. void R_SetTiltedSpan(drawspandata_t* ds, INT32 span); -boolean R_PlaneIsHighlighted(const visplane_t *pl); +INT16 R_PlaneIsHighlighted(const visplane_t *pl); struct visffloor_t { diff --git a/src/r_things.cpp b/src/r_things.cpp index 0b6c4a887..73fd9cbbd 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -828,6 +828,11 @@ boolean R_ThingIsFlashing(mobj_t *thing) UINT8 *R_GetSpriteTranslation(vissprite_t *vis) { + if (!(vis->cut & SC_PRECIP) && + R_ThingIsFlashing(vis->mobj)) + { + return R_GetTranslationColormap(TC_RAINBOW, static_cast(0), GTC_CACHE); + } /* else if (R_SpriteIsFlashing(vis)) // Bosses "flash" {