From 67cb6e63b57e52fb95e31e5802f3ed7758ff2449 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 29 Apr 2018 20:15:19 +0200 Subject: [PATCH] - cleanup of the 2D interface. Lots of this was still laid out for DirectDraw. This removes most of Begin2D so that it can be done more cleanlz. Note that this commit renders weapon sprites and screen blends incorrectly. Those will be fixed in an upcoming commit. --- src/d_main.cpp | 8 +++--- src/gl/renderer/gl_renderer.cpp | 44 ++++++++++++++++++++----------- src/gl/renderer/gl_renderer.h | 4 +-- src/gl/scene/gl_scene.cpp | 5 +--- src/gl/scene/gl_swscene.cpp | 1 - src/gl/system/gl_framebuffer.cpp | 33 +++-------------------- src/gl/system/gl_framebuffer.h | 2 +- src/intermission/intermission.cpp | 1 - src/v_video.cpp | 27 ------------------- src/v_video.h | 6 ++--- 10 files changed, 42 insertions(+), 89 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index d9bc89206..20db4fdb0 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -753,13 +753,15 @@ void D_Display () screen->FrameTime = I_msTimeFS(); TexMan.UpdateAnimations(screen->FrameTime); R_UpdateSky(screen->FrameTime); + screen->BeginFrame(); + screen->ClearClipRect(); switch (gamestate) { case GS_FULLCONSOLE: - screen->SetBlendingRect(0,0,0,0); screen->Begin2D(false); C_DrawConsole (); M_Drawer (); + screen->End2D(); screen->Update (); return; @@ -775,6 +777,7 @@ void D_Display () //E_RenderFrame(); // screen->RenderView(&players[consoleplayer]); + screen->Begin2D(false); // returns with 2S mode set. if (automapactive) { @@ -820,21 +823,18 @@ void D_Display () break; case GS_INTERMISSION: - screen->SetBlendingRect(0,0,0,0); screen->Begin2D(false); WI_Drawer (); CT_Drawer (); break; case GS_FINALE: - screen->SetBlendingRect(0,0,0,0); screen->Begin2D(false); F_Drawer (); CT_Drawer (); break; case GS_DEMOSCREEN: - screen->SetBlendingRect(0,0,0,0); screen->Begin2D(false); D_PageDrawer (); CT_Drawer (); diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index f3dd00aa5..9d6833dcf 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -356,21 +356,6 @@ void FGLRenderer::SetupLevel() mVBO->CreateVBO(); } -void FGLRenderer::Begin2D() -{ - if (mBuffers->Setup(mScreenViewport.width, mScreenViewport.height, mSceneViewport.width, mSceneViewport.height)) - { - if (mDrawingScene2D) - mBuffers->BindSceneFB(false); - else - mBuffers->BindCurrentFB(); - } - glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); - glScissor(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); - - gl_RenderState.EnableFog(false); -} - //=========================================================================== // // @@ -533,6 +518,12 @@ void FGLRenderer::WriteSavePic(player_t *player, FileWriter *file, int width, in drawer.WriteSavePic(player, file, width, height); } +void FGLRenderer::BeginFrame() +{ + buffersActive = GLRenderer->mBuffers->Setup(GLRenderer->mScreenViewport.width, GLRenderer->mScreenViewport.height, GLRenderer->mSceneViewport.width, GLRenderer->mSceneViewport.height); +} + + void gl_FillScreen() { @@ -721,9 +712,31 @@ public: void LegacyColorOverlay(F2DDrawer *drawer, F2DDrawer::RenderCommand & cmd); int LegacyDesaturation(F2DDrawer::RenderCommand &cmd); +CVAR(Bool, gl_aalines, false, CVAR_ARCHIVE) void FGLRenderer::Draw2D(F2DDrawer *drawer) { + if (buffersActive) + { + mBuffers->BindCurrentFB(); + } + glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height); + + gl_RenderState.mViewMatrix.loadIdentity(); + gl_RenderState.mProjectionMatrix.ortho(0, screen->GetWidth(), screen->GetHeight(), 0, -1.0f, 1.0f); + gl_RenderState.ApplyMatrices(); + + glDisable(GL_DEPTH_TEST); + + // Korshun: ENABLE AUTOMAP ANTIALIASING!!! + if (gl_aalines) + glEnable(GL_LINE_SMOOTH); + else + { + glDisable(GL_MULTISAMPLE); + glDisable(GL_LINE_SMOOTH); + glLineWidth(1.0); + } auto &vertices = drawer->mVertices; @@ -741,6 +754,7 @@ void FGLRenderer::Draw2D(F2DDrawer *drawer) vb->UploadData(&vertices[0], vertices.Size(), &indices[0], indices.Size()); gl_RenderState.SetVertexBuffer(vb); gl_RenderState.SetFixedColormap(CM_DEFAULT); + gl_RenderState.EnableFog(false); for(auto &cmd : commands) { diff --git a/src/gl/renderer/gl_renderer.h b/src/gl/renderer/gl_renderer.h index 19f58836d..0126c3619 100644 --- a/src/gl/renderer/gl_renderer.h +++ b/src/gl/renderer/gl_renderer.h @@ -152,6 +152,7 @@ public: GL_IRECT mSceneViewport; GL_IRECT mOutputLetterbox; bool mDrawingScene2D = false; + bool buffersActive = false; float mSceneClearColor[3]; @@ -166,7 +167,6 @@ public: void Initialize(int width, int height); - void Begin2D(); void ClearBorders(); void FlushTextures(); @@ -193,7 +193,7 @@ public: void WriteSavePic(player_t *player, FileWriter *file, int width, int height); void RenderView(player_t *player); void DrawBlend(sector_t * viewsector, bool FixedColormap, bool docolormap, bool in2d = false); - + void BeginFrame(); bool StartOffscreen(); void EndOffscreen(); diff --git a/src/gl/scene/gl_scene.cpp b/src/gl/scene/gl_scene.cpp index 1997344d5..593d496cf 100644 --- a/src/gl/scene/gl_scene.cpp +++ b/src/gl/scene/gl_scene.cpp @@ -134,7 +134,7 @@ void GLSceneDrawer::Reset3DViewport() void GLSceneDrawer::Set3DViewport(bool mainview) { - if (mainview && GLRenderer->mBuffers->Setup(GLRenderer->mScreenViewport.width, GLRenderer->mScreenViewport.height, GLRenderer->mSceneViewport.width, GLRenderer->mSceneViewport.height)) + if (mainview && GLRenderer->buffersActive) { bool useSSAO = (gl_ssao != 0); GLRenderer->mBuffers->BindSceneFB(useSSAO); @@ -526,8 +526,6 @@ void GLSceneDrawer::EndDrawScene(sector_t * viewsector) glDisable(GL_STENCIL_TEST); - GLRenderer->framebuffer->Begin2D(false); - Reset3DViewport(); // Delay drawing psprites until after bloom has been applied, if enabled. @@ -776,7 +774,6 @@ void GLSceneDrawer::WriteSavePic (player_t *player, FileWriter *file, int width, glDisable(GL_STENCIL_TEST); gl_RenderState.SetFixedColormap(CM_DEFAULT); gl_RenderState.SetSoftLightLevel(-1); - screen->Begin2D(false); if (!FGLRenderBuffers::IsEnabled()) { DrawBlend(viewsector); diff --git a/src/gl/scene/gl_swscene.cpp b/src/gl/scene/gl_swscene.cpp index 965a2f8dd..86915eec2 100644 --- a/src/gl/scene/gl_swscene.cpp +++ b/src/gl/scene/gl_swscene.cpp @@ -119,7 +119,6 @@ void SWSceneDrawer::RenderView(player_t *player) FBTexture->SystemTexture[0]->CreateTexture(nullptr, screen->GetWidth(), screen->GetHeight(), 0, false, 0, "swbuffer"); auto map = swrenderer::CameraLight::Instance()->ShaderColormap(); - screen->Begin2D(false); screen->DrawTexture(FBTexture, 0, 0, DTA_SpecialColormap, map, TAG_DONE); SWRenderer->DrawRemainingPlayerSprites(); GLRenderer->DrawBlend(r_viewpoint.sector, !!map, V_IsTrueColor(), true); diff --git a/src/gl/system/gl_framebuffer.cpp b/src/gl/system/gl_framebuffer.cpp index 2ebac1b76..65879e9ff 100644 --- a/src/gl/system/gl_framebuffer.cpp +++ b/src/gl/system/gl_framebuffer.cpp @@ -44,8 +44,6 @@ EXTERN_CVAR (Bool, vid_vsync) -CVAR(Bool, gl_aalines, false, CVAR_ARCHIVE) - FGLRenderer *GLRenderer; void gl_LoadExtensions(); @@ -140,7 +138,6 @@ void OpenGLFrameBuffer::InitializeState() GLRenderer->Initialize(GetWidth(), GetHeight()); GLRenderer->SetOutputViewport(nullptr); - Begin2D(false); } //========================================================================== @@ -157,8 +154,6 @@ void OpenGLFrameBuffer::Update() return; } - Begin2D(false); - DrawRateStuff(); GLRenderer->Flush(); @@ -442,32 +437,10 @@ void OpenGLFrameBuffer::SetClearColor(int color) } -//========================================================================== -// -// -// -//========================================================================== -void OpenGLFrameBuffer::Begin2D(bool copy3d) +void OpenGLFrameBuffer::BeginFrame() { - Super::Begin2D(copy3d); - gl_RenderState.mViewMatrix.loadIdentity(); - gl_RenderState.mProjectionMatrix.ortho(0, GetWidth(), GetHeight(), 0, -1.0f, 1.0f); - gl_RenderState.ApplyMatrices(); - - glDisable(GL_DEPTH_TEST); - - // Korshun: ENABLE AUTOMAP ANTIALIASING!!! - if (gl_aalines) - glEnable(GL_LINE_SMOOTH); - else - { - glDisable(GL_MULTISAMPLE); - glDisable(GL_LINE_SMOOTH); - glLineWidth(1.0); - } - - if (GLRenderer != NULL) - GLRenderer->Begin2D(); + if (GLRenderer != nullptr) + GLRenderer->BeginFrame(); } //=========================================================================== diff --git a/src/gl/system/gl_framebuffer.h b/src/gl/system/gl_framebuffer.h index e82bcee03..22d5f6e63 100644 --- a/src/gl/system/gl_framebuffer.h +++ b/src/gl/system/gl_framebuffer.h @@ -31,7 +31,6 @@ public: PalEntry *GetPalette () override; bool SetFlash(PalEntry rgb, int amount) override; void GetFlash(PalEntry &rgb, int &amount) override; - void Begin2D(bool copy3d) override; void GameRestart() override; void InitForLevel() override; void SetClearColor(int color) override; @@ -46,6 +45,7 @@ public: void FlushTextures() override; void TextureFilterChanged() override; void ResetFixedColormap() override; + void BeginFrame() override; // Retrieves a buffer containing image data for a screenshot. // Hint: Pitch can be negative for upside-down images, in which case buffer diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 115084637..30ef3fa40 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -229,7 +229,6 @@ void DIntermissionScreenFader::Drawer () if (mType == FADE_In) factor = 1.0 - factor; int color = MAKEARGB(int(factor*255), 0,0,0); - screen->Begin2D(false); screen->DrawTexture (TexMan[mBackground], 0, 0, DTA_Fullscreen, true, DTA_ColorOverlay, color, TAG_DONE); for (unsigned i=0; i < mOverlays.Size(); i++) { diff --git a/src/v_video.cpp b/src/v_video.cpp index c0da989d5..0cb424d2c 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -839,33 +839,6 @@ void DFrameBuffer::NewRefreshRate () { } -//========================================================================== -// -// DFrameBuffer :: SetBlendingRect -// -// Defines the area of the screen containing the 3D view. -// -//========================================================================== - -void DFrameBuffer::SetBlendingRect (int x1, int y1, int x2, int y2) -{ -} - -//========================================================================== -// -// DFrameBuffer :: Begin2D -// -// Signal that 3D rendering is complete, and the rest of the operations on -// the canvas until Unlock() will be 2D ones. -// -//========================================================================== - -void DFrameBuffer::Begin2D (bool copy3d) -{ - isIn2D = true; - ClearClipRect(); -} - //========================================================================== // // DFrameBuffer :: WipeStartScreen diff --git a/src/v_video.h b/src/v_video.h index f7b2f20c8..98903413f 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -372,9 +372,6 @@ public: // Tells the device to recreate itself with the new setting from vid_refreshrate. virtual void NewRefreshRate (); - // Set the rect defining the area affected by blending. - virtual void SetBlendingRect (int x1, int y1, int x2, int y2); - // Delete any resources that need to be deleted after restarting with a different IWAD virtual void CleanForRestart() {} virtual void SetTextureFilterMode() {} @@ -384,10 +381,11 @@ public: virtual void FlushTextures() {} virtual void TextureFilterChanged() {} virtual void ResetFixedColormap() {} + virtual void BeginFrame() {} // Begin 2D drawing operations. // Returns true if hardware-accelerated 2D has been entered, false if not. - virtual void Begin2D(bool copy3d); + void Begin2D(bool copy3d) { isIn2D = true; } void End2D() { isIn2D = false; } // Returns true if Begin2D has been called and 2D drawing is now active