From b1d33d1bbafa26f81452c516667d88af73e3f2a6 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 5 Apr 2018 01:40:58 +0200 Subject: [PATCH] - Fix mid texture rendering for self-referencing sector lines --- src/swrenderer/line/r_renderdrawsegment.cpp | 40 +++++++++++++-------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/swrenderer/line/r_renderdrawsegment.cpp index f46fbc133..f21c9e79f 100644 --- a/src/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/swrenderer/line/r_renderdrawsegment.cpp @@ -264,28 +264,40 @@ namespace swrenderer WallC.sx1 = ds->sx1; WallC.sx2 = ds->sx2; - double top, bot; - GetMaskedWallTopBottom(ds, top, bot); - top -= Thread->Viewport->viewpoint.Pos.Z; - bot -= Thread->Viewport->viewpoint.Pos.Z; + // Unclipped vanilla Doom range for the wall. Relies on ceiling/floor clip to clamp the wall in range. + double ceilZ = textop; + double floorZ = textop - texheight; + // The 3D Floors implementation destroys the ceiling clip when doing its height passes.. + if (m3DFloor.clipTop || m3DFloor.clipBottom) + { + // Use the actual correct wall range for the midtexture. + // This doesn't work for self-referenced sectors, which is why we only do it if we have 3D floors. + + double top, bot; + GetMaskedWallTopBottom(ds, top, bot); + top -= Thread->Viewport->viewpoint.Pos.Z; + bot -= Thread->Viewport->viewpoint.Pos.Z; + + ceilZ = MIN(ceilZ, top); + floorZ = MAX(floorZ, bot); + } + + // Clip wall by the current 3D floor render range. if (m3DFloor.clipTop) { - wallupper.Project(Thread->Viewport.get(), textop < m3DFloor.sclipTop - Thread->Viewport->viewpoint.Pos.Z ? textop : m3DFloor.sclipTop - Thread->Viewport->viewpoint.Pos.Z, &WallC); - } - else - { - wallupper.Project(Thread->Viewport.get(), MIN(textop, top), &WallC); + double clipZ = m3DFloor.sclipTop - Thread->Viewport->viewpoint.Pos.Z; + ceilZ = MIN(ceilZ, clipZ); } if (m3DFloor.clipBottom) { - walllower.Project(Thread->Viewport.get(), textop - texheight > m3DFloor.sclipBottom - Thread->Viewport->viewpoint.Pos.Z ? textop - texheight : m3DFloor.sclipBottom - Thread->Viewport->viewpoint.Pos.Z, &WallC); - } - else - { - walllower.Project(Thread->Viewport.get(), MAX(textop - texheight, bot), &WallC); + double clipZ = m3DFloor.sclipBottom - Thread->Viewport->viewpoint.Pos.Z; + floorZ = MAX(floorZ, clipZ); } + wallupper.Project(Thread->Viewport.get(), ceilZ, &WallC); + walllower.Project(Thread->Viewport.get(), floorZ, &WallC); + for (int i = x1; i < x2; i++) { if (wallupper.ScreenY[i] < mceilingclip[i])