1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-23 15:52:55 +01:00

Allow user to use NN scaling at integer scales

While linear/anisotropic filtering introduces in previous commit looks
good at non-integer scales, using it at integer scales may make screen
look unnecessarily blurry. This commit introduces an option to use NN
scaling at integer values of scale.
This commit is contained in:
Michał Janiszewski
2016-01-31 17:58:09 +01:00
parent 18ec2238a2
commit 80ad302087
6 changed files with 25 additions and 8 deletions

View File

@@ -4029,13 +4029,13 @@ STR_5723 :Heavy Rain
STR_5724 :Thunderstorm STR_5724 :Thunderstorm
STR_5725 :{BLACK}Force weather: STR_5725 :{BLACK}Force weather:
STR_5726 :{SMALLFONT}{BLACK}Sets the current weather in park STR_5726 :{SMALLFONT}{BLACK}Sets the current weather in park
STR_5727 :Scaling quality STR_5727 :Scaling quality
STR_5728 :Requires hardware display option STR_5728 :Requires hardware display option
STR_5729 :{SMALLFONT}{BLACK}Requires hardware display option STR_5729 :{SMALLFONT}{BLACK}Requires hardware display option
STR_5730 :Nearest neighbour STR_5730 :Nearest neighbour
STR_5731 :Linear STR_5731 :Linear
STR_5732 :Anisotropic STR_5732 :Anisotropic
STR_5733 :Use NN scaling at integer scales
############# #############
# Scenarios # # Scenarios #

View File

@@ -206,6 +206,7 @@ config_property_definition _generalDefinitions[] = {
{ offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL },
{ offsetof(general_configuration, window_scale), "window_scale", CONFIG_VALUE_TYPE_FLOAT, { .value_float = 1.0f }, NULL }, { offsetof(general_configuration, window_scale), "window_scale", CONFIG_VALUE_TYPE_FLOAT, { .value_float = 1.0f }, NULL },
{ offsetof(general_configuration, scale_quality), "scale_quality", CONFIG_VALUE_TYPE_UINT8, 1, NULL }, { offsetof(general_configuration, scale_quality), "scale_quality", CONFIG_VALUE_TYPE_UINT8, 1, NULL },
{ offsetof(general_configuration, use_nn_at_integer_scales), "use_nn_at_integer_scales", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL },
{ offsetof(general_configuration, show_fps), "show_fps", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, show_fps), "show_fps", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },
{ offsetof(general_configuration, trap_cursor), "trap_cursor", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, trap_cursor), "trap_cursor", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },
{ offsetof(general_configuration, auto_open_shops), "auto_open_shops", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, { offsetof(general_configuration, auto_open_shops), "auto_open_shops", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL },

View File

@@ -178,6 +178,7 @@ typedef struct {
uint8 steam_overlay_pause; uint8 steam_overlay_pause;
float window_scale; float window_scale;
uint8 scale_quality; uint8 scale_quality;
uint8 use_nn_at_integer_scales;
uint8 show_fps; uint8 show_fps;
uint8 trap_cursor; uint8 trap_cursor;
uint8 auto_open_shops; uint8 auto_open_shops;

View File

@@ -2328,6 +2328,7 @@ enum {
STR_SCALING_QUALITY_NN = 5730, STR_SCALING_QUALITY_NN = 5730,
STR_SCALING_QUALITY_LINEAR = 5731, STR_SCALING_QUALITY_LINEAR = 5731,
STR_SCALING_QUALITY_ANISOTROPIC = 5732, STR_SCALING_QUALITY_ANISOTROPIC = 5732,
STR_USE_NN_AT_INTEGER_SCALE = 5733,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768 STR_COUNT = 32768

View File

@@ -360,9 +360,13 @@ static void platform_resize(int width, int height)
*/ */
void platform_trigger_resize() void platform_trigger_resize()
{ {
char scale_quality[4]; // just to make sure we can hold whole uint8 char scale_quality_buffer[4]; // just to make sure we can hold whole uint8
snprintf(scale_quality, sizeof(scale_quality), "%u", gConfigGeneral.scale_quality); uint8 scale_quality = gConfigGeneral.scale_quality;
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scale_quality); if (gConfigGeneral.use_nn_at_integer_scales && gConfigGeneral.window_scale == floor(gConfigGeneral.window_scale)) {
scale_quality = 0;
}
snprintf(scale_quality_buffer, sizeof(scale_quality_buffer), "%u", scale_quality);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scale_quality_buffer);
int w, h; int w, h;
SDL_GetWindowSize(gWindow, &w, &h); SDL_GetWindowSize(gWindow, &w, &h);

View File

@@ -88,6 +88,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
WIDX_SCALE_DOWN, WIDX_SCALE_DOWN,
WIDX_SCALE_QUALITY, WIDX_SCALE_QUALITY,
WIDX_SCALE_QUALITY_DROPDOWN, WIDX_SCALE_QUALITY_DROPDOWN,
WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX,
WIDX_RENDERING_GROUP, WIDX_RENDERING_GROUP,
WIDX_TILE_SMOOTHING_CHECKBOX, WIDX_TILE_SMOOTHING_CHECKBOX,
WIDX_GRIDLINES_CHECKBOX, WIDX_GRIDLINES_CHECKBOX,
@@ -167,7 +168,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
}; };
#define WW 310 #define WW 310
#define WH 317 #define WH 332
#define MAIN_OPTIONS_WIDGETS \ #define MAIN_OPTIONS_WIDGETS \
{ WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \ { WWT_FRAME, 0, 0, WW-1, 0, WH-1, STR_NONE, STR_NONE }, \
@@ -183,7 +184,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
static rct_widget window_options_display_widgets[] = { static rct_widget window_options_display_widgets[] = {
MAIN_OPTIONS_WIDGETS, MAIN_OPTIONS_WIDGETS,
{ WWT_GROUPBOX, 1, 5, 304, 53, 190, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group { WWT_GROUPBOX, 1, 5, 304, 53, 205, STR_HARDWARE_GROUP, STR_NONE }, // Hardware group
{ WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution { WWT_DROPDOWN, 1, 155, 299, 68, 79, STR_RESOLUTION_X_BY_Y, STR_NONE }, // resolution
{ WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 69, 78, STR_DROPDOWN_GLYPH, STR_NONE },
{ WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen { WWT_DROPDOWN, 1, 155, 299, 83, 94, 871, STR_NONE }, // fullscreen
@@ -198,8 +199,9 @@ static rct_widget window_options_display_widgets[] = {
{ WWT_DROPDOWN_BUTTON, 1, 288, 298, 165, 169, STR_NUMERIC_DOWN, STR_NONE }, // scale spinner down { WWT_DROPDOWN_BUTTON, 1, 288, 298, 165, 169, STR_NUMERIC_DOWN, STR_NONE }, // scale spinner down
{ WWT_DROPDOWN, 1, 155, 299, 174, 185, STR_NONE, STR_REQUIRES_HW_DISPLAY }, // scaling quality hint { WWT_DROPDOWN, 1, 155, 299, 174, 185, STR_NONE, STR_REQUIRES_HW_DISPLAY }, // scaling quality hint
{ WWT_DROPDOWN_BUTTON, 1, 288, 298, 175, 184, STR_DROPDOWN_GLYPH, STR_REQUIRES_HW_DISPLAY_TIP }, { WWT_DROPDOWN_BUTTON, 1, 288, 298, 175, 184, STR_DROPDOWN_GLYPH, STR_REQUIRES_HW_DISPLAY_TIP },
{ WWT_CHECKBOX, 1, 10, 290, 189, 200, STR_USE_NN_AT_INTEGER_SCALE, STR_NONE }, // use nn scaling at integer scales
#define FRAME_RENDERING_START 194 #define FRAME_RENDERING_START 209
{ WWT_GROUPBOX, 1, 5, 304, FRAME_RENDERING_START + 0, FRAME_RENDERING_START + 91, STR_RENDERING_GROUP, STR_NONE }, // Rendering group { WWT_GROUPBOX, 1, 5, 304, FRAME_RENDERING_START + 0, FRAME_RENDERING_START + 91, STR_RENDERING_GROUP, STR_NONE }, // Rendering group
{ WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 15, FRAME_RENDERING_START + 26, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 15, FRAME_RENDERING_START + 26, STR_TILE_SMOOTHING, STR_TILE_SMOOTHING_TIP }, // landscape smoothing
{ WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 30, FRAME_RENDERING_START + 41, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines { WWT_CHECKBOX, 1, 10, 290, FRAME_RENDERING_START + 30, FRAME_RENDERING_START + 41, STR_GRIDLINES, STR_GRIDLINES_TIP }, // gridlines
@@ -392,9 +394,10 @@ static uint32 window_options_page_enabled_widgets[] = {
(1 << WIDX_SCALE_DOWN) | (1 << WIDX_SCALE_DOWN) |
(1 << WIDX_SCALE_QUALITY) | (1 << WIDX_SCALE_QUALITY) |
(1 << WIDX_SCALE_QUALITY_DROPDOWN) | (1 << WIDX_SCALE_QUALITY_DROPDOWN) |
(1 << WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX) |
(1 << WIDX_CONSTRUCTION_MARKER) | (1 << WIDX_CONSTRUCTION_MARKER) |
(1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) | (1 << WIDX_CONSTRUCTION_MARKER_DROPDOWN) |
(1 << WIDX_DAY_NIGHT_CHECKBOX) | (1u << WIDX_DAY_NIGHT_CHECKBOX) |
(1u << WIDX_UPPER_CASE_BANNERS_CHECKBOX), (1u << WIDX_UPPER_CASE_BANNERS_CHECKBOX),
MAIN_OPTIONS_ENABLED_WIDGETS | MAIN_OPTIONS_ENABLED_WIDGETS |
@@ -564,6 +567,12 @@ static void window_options_mouseup(rct_window *w, int widgetIndex)
config_save_default(); config_save_default();
window_invalidate(w); window_invalidate(w);
break; break;
case WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX:
gConfigGeneral.use_nn_at_integer_scales ^= 1;
config_save_default();
gfx_invalidate_screen();
platform_trigger_resize();
break;
case WIDX_DAY_NIGHT_CHECKBOX: case WIDX_DAY_NIGHT_CHECKBOX:
gConfigGeneral.day_night_cycle ^= 1; gConfigGeneral.day_night_cycle ^= 1;
config_save_default(); config_save_default();
@@ -1277,6 +1286,7 @@ static void window_options_invalidate(rct_window *w)
widget_set_checkbox_value(w, WIDX_SHOW_FPS_CHECKBOX, gConfigGeneral.show_fps); widget_set_checkbox_value(w, WIDX_SHOW_FPS_CHECKBOX, gConfigGeneral.show_fps);
widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss); widget_set_checkbox_value(w, WIDX_MINIMIZE_FOCUS_LOSS, gConfigGeneral.minimize_fullscreen_focus_loss);
widget_set_checkbox_value(w, WIDX_STEAM_OVERLAY_PAUSE, gConfigGeneral.steam_overlay_pause); widget_set_checkbox_value(w, WIDX_STEAM_OVERLAY_PAUSE, gConfigGeneral.steam_overlay_pause);
widget_set_checkbox_value(w, WIDX_SCALE_USE_NN_AT_INTEGER_SCALES_CHECKBOX, gConfigGeneral.use_nn_at_integer_scales);
widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle); widget_set_checkbox_value(w, WIDX_DAY_NIGHT_CHECKBOX, gConfigGeneral.day_night_cycle);
widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners); widget_set_checkbox_value(w, WIDX_UPPER_CASE_BANNERS_CHECKBOX, gConfigGeneral.upper_case_banners);