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:
@@ -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 #
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user