From cb9f2e2eb07196da13d2f290726bb7fe4c00015b Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Fri, 10 Mar 2017 00:18:20 -0500 Subject: [PATCH 1/4] - fixed: P_AlignFlat's y-offset data was ignored when calculating plane offsets for the final render --- src/swrenderer/plane/r_flatplane.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index b3c695c78..a086cd323 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -69,7 +69,7 @@ namespace swrenderer { double cosine = cos(planeang), sine = sin(planeang); pviewx = pl->xform.xOffs + ViewPos.X * cosine - ViewPos.Y * sine; - pviewy = pl->xform.yOffs - ViewPos.X * sine - ViewPos.Y * cosine; + pviewy = pl->xform.yOffs + pl->xform.baseyOffs - ViewPos.X * sine - ViewPos.Y * cosine; } else { From 2f2dcaf5fee174c0caa555f7492cb8b4ca7d3bd5 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 10 Mar 2017 15:40:15 +0100 Subject: [PATCH 2/4] Fix crash when vid_hw2d is off --- src/swrenderer/r_swcanvas.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/swrenderer/r_swcanvas.cpp b/src/swrenderer/r_swcanvas.cpp index aa817e707..82f34313f 100644 --- a/src/swrenderer/r_swcanvas.cpp +++ b/src/swrenderer/r_swcanvas.cpp @@ -110,6 +110,13 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms) double centeryback = viewport->CenterY; viewport->CenterY = 0; + int oldviewwindowx = 0; + int oldviewwindowy = 0; + oldviewwindowx = viewwindowx; + oldviewwindowy = viewwindowy; + viewwindowx = 0; + viewwindowy = 0; + // There is not enough precision in the drawing routines to keep the full // precision for y0. :( double sprtopscreen; @@ -187,6 +194,8 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms) } viewport->CenterY = centeryback; + viewwindowx = oldviewwindowx; + viewwindowy = oldviewwindowy; } viewport->RenderTarget->Unlock(); From 1996c1bc0b61c0374d4123089bbcb80c6d6063d7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 10 Mar 2017 15:40:33 +0100 Subject: [PATCH 3/4] Fix crash HOM effect when vid_hw2d is off --- src/gl/system/gl_swframebuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gl/system/gl_swframebuffer.cpp b/src/gl/system/gl_swframebuffer.cpp index a0fc6e716..c721af665 100644 --- a/src/gl/system/gl_swframebuffer.cpp +++ b/src/gl/system/gl_swframebuffer.cpp @@ -1076,7 +1076,7 @@ void OpenGLSWFrameBuffer::CalcFullscreenCoords(FBVERTEX verts[4], bool viewarea_ int OpenGLSWFrameBuffer::GetPageCount() { - return 1; + return 2; } //========================================================================== From d637ee5624f6c1c421afb515855b62a0dfc2deec Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 10 Mar 2017 16:23:16 +0100 Subject: [PATCH 4/4] Fix span dynamic light rendering glitch --- src/swrenderer/plane/r_flatplane.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index a086cd323..c7cadfbab 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -209,19 +209,27 @@ namespace swrenderer drawerargs.dc_viewpos.Z = (float)((viewport->CenterY - y - 0.5) / viewport->InvZtoScale * zspan); drawerargs.dc_viewpos_step.X = (float)(zspan / viewport->CenterX); - static DrawerLight lightbuffer[64 * 1024]; - static int nextlightindex = 0; - // Plane normal drawerargs.dc_normal.X = 0.0f; drawerargs.dc_normal.Y = 0.0f; drawerargs.dc_normal.Z = (y >= viewport->CenterY) ? 1.0f : -1.0f; - // Setup lights for row - drawerargs.dc_num_lights = 0; - drawerargs.dc_lights = lightbuffer + nextlightindex; + // Calculate max lights that can touch the row so we can allocate memory for the list + int max_lights = 0; VisiblePlaneLight *cur_node = light_list; - while (cur_node && nextlightindex < 64 * 1024) + while (cur_node) + { + if (!(cur_node->lightsource->flags2&MF2_DORMANT)) + max_lights++; + cur_node = cur_node->next; + } + + drawerargs.dc_num_lights = 0; + drawerargs.dc_lights = Thread->FrameMemory->AllocMemory(max_lights); + + // Setup lights for row + cur_node = light_list; + while (cur_node) { double lightX = cur_node->lightsource->X() - ViewPos.X; double lightY = cur_node->lightsource->Y() - ViewPos.Y; @@ -244,7 +252,6 @@ namespace swrenderer uint32_t green = cur_node->lightsource->GetGreen(); uint32_t blue = cur_node->lightsource->GetBlue(); - nextlightindex++; auto &light = drawerargs.dc_lights[drawerargs.dc_num_lights++]; light.x = lx; light.y = lconstant; @@ -255,9 +262,6 @@ namespace swrenderer cur_node = cur_node->next; } - - if (nextlightindex == 64 * 1024) - nextlightindex = 0; } else {