From 7aceefa90456e800aea1c3d0916b85da9084d670 Mon Sep 17 00:00:00 2001 From: Nep2Disk Date: Tue, 16 Sep 2025 01:59:15 +0000 Subject: [PATCH] Add support for terrain floorClip and RF_ALWAYSONTOP in legacyGL --- src/hardware/hw_main.c | 18 +++++++++++++++++- src/hardware/hw_md2.c | 4 +++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 085769040..232082bbc 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -3415,6 +3415,11 @@ static void HWR_SplitSprite(gl_vissprite_t *spr) return; // cap blend = HWR_SurfaceBlend(blendmode, trans, &Surf); + + // if sprite has PF_ALWAYSONTOP, draw on top of everything. + if (cv_debugrender_spriteclip.value || spr->mobj->renderflags & RF_ALWAYSONTOP) + blend |= PF_NoDepthTest; + if (!trans && !blendmode) { // BP: i agree that is little better in environement but it don't @@ -3896,6 +3901,11 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) return; // cap blend = HWR_SurfaceBlend(blendmode, trans, &Surf); + + // if sprite has PF_ALWAYSONTOP, draw on top of everything. + if (cv_debugrender_spriteclip.value || spr->mobj->renderflags & RF_ALWAYSONTOP) + blend |= PF_NoDepthTest; + if (!trans && !blendmode) { // BP: i agree that is little better in environement but it don't @@ -3921,7 +3931,10 @@ static void HWR_DrawSprite(gl_vissprite_t *spr) if (HWR_UseShader()) { - shader = (R_ThingIsPaperSprite(spr->mobj) || R_ThingIsFloorSprite(spr->mobj)) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK;; + shader = (R_ThingIsPaperSprite(spr->mobj) + || R_ThingIsFloorSprite(spr->mobj) + || (spr->mobj->terrain && spr->mobj->terrain->floorClip) + ) ? SHADER_SPRITE : SHADER_SPRITECLIPHACK; blend |= PF_ColorMapped; } @@ -5007,6 +5020,9 @@ static void HWR_ProjectSprite(mobj_t *thing) x1 = tr_x + x1 * rightcos; x2 = tr_x - x2 * rightcos; + if (thing->terrain && thing->terrain->floorClip) + spr_topoffset -= thing->terrain->floorClip; + if (vflip) { gz = FIXED_TO_FLOAT(interp.z + thing->height) - (FIXED_TO_FLOAT(spr_topoffset) * this_yscale); diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 01b42140a..81a7d9a49 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1723,6 +1723,8 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) HWD.pfnSetShader(SHADER_MODEL); // model shader { float this_scale = FIXED_TO_FLOAT(spr->mobj->scale); + fixed_t floorClip = spr->mobj->terrain ? spr->mobj->terrain->floorClip : 0; + float finalfloorClip = FIXED_TO_FLOAT(FixedMul(floorClip, mapobjectscale)*P_MobjFlip(spr->mobj)); float xs = this_scale * FIXED_TO_FLOAT(spr->mobj->spritexscale); float ys = this_scale * FIXED_TO_FLOAT(spr->mobj->spriteyscale); @@ -1733,7 +1735,7 @@ boolean HWR_DrawModel(gl_vissprite_t *spr) // offset perpendicular to the camera angle p.x -= ox * gl_viewsin; p.y += ox * gl_viewcos; - p.z += oy; + p.z += oy - finalfloorClip; if (R_ThingIsUsingBakedOffsets(spr->mobj)) {