1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 19:13:07 +01:00

Add Smooth NN scaling to OpenGL renderer

This commit is contained in:
Philip Goto
2017-11-05 16:08:25 +01:00
committed by Michał Janiszewski
parent 360cd813b7
commit 19abb62586
3 changed files with 22 additions and 9 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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()