From c4768441b4f20fa4847009d50953abc5d4f5065e Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sun, 8 Apr 2018 15:49:06 +0200 Subject: [PATCH] - Fix playersprite offset being wrong in softpoly - Remove DFrameBuffer::GetCanvas as it always returned null --- src/polyrenderer/poly_renderer.cpp | 2 +- src/polyrenderer/scene/poly_playersprite.cpp | 15 +++++++++------ src/swrenderer/scene/r_scene.cpp | 5 ++++- src/swrenderer/things/r_playersprite.cpp | 12 ++++++++---- src/swrenderer/viewport/r_viewport.cpp | 2 +- src/swrenderer/viewport/r_viewport.h | 3 +-- src/v_video.h | 1 - 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 056629412..093a0dee5 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -89,7 +89,7 @@ void PolyRenderer::RenderViewToCanvas(AActor *actor, DCanvas *canvas, int x, int Threads.MainThread()->FlushDrawQueue(); DrawerThreads::WaitForWorkers(); - RenderTarget = screen->GetCanvas(); + RenderTarget = nullptr; RenderToCanvas = false; R_ExecuteSetViewSize(Viewpoint, Viewwindow); float trueratio; diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index 62173c1ac..ac843300c 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -218,6 +218,11 @@ void RenderPolyPlayerSprites::RenderSprite(PolyRenderThread *thread, DPSprite *p const auto &viewwindow = PolyRenderer::Instance()->Viewwindow; DCanvas *renderTarget = PolyRenderer::Instance()->RenderTarget; + // Force it to use software rendering. + // To do: Fix that Draw2D() is never called by SWSceneDrawer::RenderView. Make sure to adjust the similar comment in r_playersprite.cpp + bool renderToCanvas = true; + //bool renderToCanvas = PolyRenderer::Instance()->RenderToCanvas; + sprframe = &SpriteFrames[sprdef->spriteframes + pspr->GetFrame()]; picnum = sprframe->Texture[0]; @@ -288,16 +293,14 @@ void RenderPolyPlayerSprites::RenderSprite(PolyRenderThread *thread, DPSprite *p vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->GetTopOffsetPo(); - auto screencanvas = screen->GetCanvas(); - - if (viewpoint.camera->player && (renderTarget != screencanvas || + if (viewpoint.camera->player && (renderToCanvas || viewheight == renderTarget->GetHeight() || (renderTarget->GetWidth() > (BASEXCENTER * 2)))) { // Adjust PSprite for fullscreen views AWeapon *weapon = dyn_cast(pspr->GetCaller()); if (weapon != nullptr && weapon->YAdjust != 0) { - if (renderTarget != screencanvas || viewheight == renderTarget->GetHeight()) + if (renderToCanvas || viewheight == renderTarget->GetHeight()) { vis.texturemid -= weapon->YAdjust; } @@ -412,7 +415,7 @@ void RenderPolyPlayerSprites::RenderSprite(PolyRenderThread *thread, DPSprite *p // Check for hardware-assisted 2D. If it's available, and this sprite is not // fuzzy, don't draw it until after the switch to 2D mode. - if (!noaccel && renderTarget == screencanvas) + if (!noaccel && !renderToCanvas) { FRenderStyle style = vis.RenderStyle; style.CheckFuzz(); @@ -500,7 +503,7 @@ void PolyNoAccelPlayerSprite::Render(PolyRenderThread *thread) y1 = centerY - texturemid * yscale; y2 = y1 + pic->GetHeight() * yscale; } - args.Draw(thread, x1, x2, y1, y2, 0.0f, 1.0f, 0.0f, 1.0f); + args.Draw(thread, viewwindowx + x1, viewwindowx + x2, viewwindowy + y1, viewwindowy + y2, 0.0f, 1.0f, 0.0f, 1.0f); } ///////////////////////////////////////////////////////////////////////////// diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index f11b6f486..1f406d424 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -91,6 +91,7 @@ namespace swrenderer { auto viewport = MainThread()->Viewport.get(); viewport->RenderTarget = target; + viewport->RenderingToCanvas = false; int width = SCREENWIDTH; int height = SCREENHEIGHT; @@ -339,6 +340,7 @@ namespace swrenderer viewwidth = width; viewport->RenderTarget = canvas; + viewport->RenderingToCanvas = true; R_SetWindow(MainThread()->Viewport->viewpoint, MainThread()->Viewport->viewwindow, 12, width, height, height, true); viewwindowx = x; @@ -351,7 +353,8 @@ namespace swrenderer DrawerThreads::WaitForWorkers(); DrawerWaitCycles.Unclock(); - viewport->RenderTarget = screen->GetCanvas(); + viewport->RenderTarget = nullptr; + viewport->RenderingToCanvas = false; R_ExecuteSetViewSize(MainThread()->Viewport->viewpoint, MainThread()->Viewport->viewwindow); float trueratio; diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index 30ef2a359..03e60c511 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -289,15 +289,19 @@ namespace swrenderer vis.texturemid = (BASEYCENTER - sy) * tex->Scale.Y + tex->GetTopOffset(0); - auto screencanvas = screen->GetCanvas(); - if (Thread->Viewport->viewpoint.camera->player && (viewport->RenderTarget != screencanvas || + // Force it to use software rendering. + // To do: Fix that Draw2D() is never called by SWSceneDrawer::RenderView. Also make sure to adjust the similar comment in poly_playersprite.cpp + bool renderToCanvas = true; + //bool renderToCanvas = viewport->RenderingToCanvas; + + if (Thread->Viewport->viewpoint.camera->player && (renderToCanvas || viewheight == viewport->RenderTarget->GetHeight() || (viewport->RenderTarget->GetWidth() > (BASEXCENTER * 2)))) { // Adjust PSprite for fullscreen views AWeapon *weapon = dyn_cast(pspr->GetCaller()); if (weapon != nullptr && weapon->YAdjust != 0) { - if (viewport->RenderTarget != screencanvas || viewheight == viewport->RenderTarget->GetHeight()) + if (renderToCanvas || viewheight == viewport->RenderTarget->GetHeight()) { vis.texturemid -= weapon->YAdjust; } @@ -414,7 +418,7 @@ namespace swrenderer // Check for hardware-assisted 2D. If it's available, and this sprite is not // fuzzy, don't draw it until after the switch to 2D mode. - if (!noaccel && viewport->RenderTarget == screencanvas) + if (!noaccel && !renderToCanvas) { FRenderStyle style = vis.RenderStyle; style.CheckFuzz(); diff --git a/src/swrenderer/viewport/r_viewport.cpp b/src/swrenderer/viewport/r_viewport.cpp index 36381f711..e10d4c04e 100644 --- a/src/swrenderer/viewport/r_viewport.cpp +++ b/src/swrenderer/viewport/r_viewport.cpp @@ -74,7 +74,7 @@ namespace swrenderer { int virtheight, virtwidth, virtwidth2, virtheight2; - if (!RenderingToCanvas()) + if (!RenderingToCanvas) { // Set r_viewsize cvar to reflect the current view size UCVarValue value; char temp[16]; diff --git a/src/swrenderer/viewport/r_viewport.h b/src/swrenderer/viewport/r_viewport.h index 534680bcd..7c80fe9dd 100644 --- a/src/swrenderer/viewport/r_viewport.h +++ b/src/swrenderer/viewport/r_viewport.h @@ -27,6 +27,7 @@ namespace swrenderer TriMatrix WorldToClip; DCanvas *RenderTarget = nullptr; + bool RenderingToCanvas = false; FViewWindow viewwindow; FRenderViewpoint viewpoint; @@ -52,8 +53,6 @@ namespace swrenderer uint8_t *GetDest(int x, int y); - bool RenderingToCanvas() const { return RenderTarget != screen->GetCanvas(); } - DVector3 PointWorldToView(const DVector3 &worldPos) const; DVector3 PointWorldToScreen(const DVector3 &worldPos) const; DVector3 PointViewToScreen(const DVector3 &viewPos) const; diff --git a/src/v_video.h b/src/v_video.h index cd3f78e06..030fba56f 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -309,7 +309,6 @@ public: inline int GetWidth() const { return Width; } inline int GetHeight() const { return Height; } - virtual DCanvas *GetCanvas() { return nullptr; } // Make the surface visible. virtual void Update () = 0;