From 19abb62586a0210d9e7828fdcbbebf159c9e10c5 Mon Sep 17 00:00:00 2001 From: Philip Goto Date: Sun, 5 Nov 2017 16:08:25 +0100 Subject: [PATCH] Add Smooth NN scaling to OpenGL renderer --- src/openrct2-ui/UiContext.cpp | 6 ++++-- .../engines/HardwareDisplayDrawingEngine.cpp | 7 +------ .../engines/opengl/OpenGLDrawingEngine.cpp | 18 +++++++++++++++++- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index bc45a153c6..5c92cccaa1 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -497,11 +497,13 @@ public: { _scaleQuality = SCALE_QUALITY_NN; } + + sint32 scaleQuality = _scaleQuality; if (_scaleQuality == SCALE_QUALITY_SMOOTH_NN) { - _scaleQuality = SCALE_QUALITY_LINEAR; + scaleQuality = SCALE_QUALITY_LINEAR; } - snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", _scaleQuality); + snprintf(scaleQualityBuffer, sizeof(scaleQualityBuffer), "%u", scaleQuality); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaleQualityBuffer); sint32 width, height; diff --git a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp index ad68d1a365..7a5798c677 100644 --- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp @@ -103,12 +103,7 @@ public: } } - sint32 scaleQuality = gConfigGeneral.scale_quality; - if (gConfigGeneral.use_nn_at_integer_scales && - gConfigGeneral.window_scale == std::floor(gConfigGeneral.window_scale)) - { - scaleQuality = SCALE_QUALITY_NN; - } + sint32 scaleQuality = GetContext()->GetUiContext()->GetScaleQuality(); if (scaleQuality == SCALE_QUALITY_SMOOTH_NN) { scaleQuality = SCALE_QUALITY_LINEAR; diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp index c72cb56da1..2ab5deb49e 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -142,6 +142,7 @@ private: ApplyPaletteShader * _applyPaletteShader = nullptr; OpenGLFramebuffer * _screenFramebuffer = nullptr; OpenGLFramebuffer * _scaleFramebuffer = nullptr; + OpenGLFramebuffer * _smoothScaleFramebuffer = nullptr; public: SDL_Color Palette[256]; @@ -258,7 +259,12 @@ public: _applyPaletteShader->SetTexture(_drawingContext->GetFinalFramebuffer().GetTexture()); _applyPaletteShader->Draw(); - if (_scaleFramebuffer != nullptr) + if (_smoothScaleFramebuffer != nullptr) + { + _smoothScaleFramebuffer->Copy(*_scaleFramebuffer, GL_NEAREST); + _screenFramebuffer->Copy(*_smoothScaleFramebuffer, GL_LINEAR); + } + else if (_scaleFramebuffer != nullptr) { _screenFramebuffer->Copy(*_scaleFramebuffer, GL_LINEAR); } @@ -395,10 +401,20 @@ private: delete _scaleFramebuffer; _scaleFramebuffer = nullptr; } + if (_smoothScaleFramebuffer != nullptr) + { + delete _smoothScaleFramebuffer; + _smoothScaleFramebuffer = nullptr; + } if (GetContext()->GetUiContext()->GetScaleQuality() > 0) { _scaleFramebuffer = new OpenGLFramebuffer(_width, _height, false, false); } + if (GetContext()->GetUiContext()->GetScaleQuality() == SCALE_QUALITY_SMOOTH_NN) + { + uint32 scale = std::ceil(gConfigGeneral.window_scale); + _smoothScaleFramebuffer = new OpenGLFramebuffer(_width * scale, _height * scale, false, false); + } } void Display()