diff --git a/builtin/mainmenu/settings/shader_component.lua b/builtin/mainmenu/settings/shader_component.lua index a1a48b03b..3db18dbc4 100644 --- a/builtin/mainmenu/settings/shader_component.lua +++ b/builtin/mainmenu/settings/shader_component.lua @@ -1,5 +1,7 @@ --Minetest ---Copyright (C) 2022 rubenwardy +--Copyright (C) 2013 sapier +--Copyright (C) 2021-2 x2048 +--Copyright (C) 2022-3 rubenwardy -- --This program is free software; you can redistribute it and/or modify --it under the terms of the GNU Lesser General Public License as published by @@ -26,23 +28,21 @@ local shadow_levels_labels = { } -local shadow_levels_options = { - table.concat(shadow_levels_labels, ","), - { "0", "1", "2", "3", "4", "5" } -} - - -local function get_shadow_mapping_id() - local shadow_setting = core.settings:get("shadow_levels") - for i = 1, #shadow_levels_options[2] do - if shadow_setting == shadow_levels_options[2][i] then - return i - end +local function get_shadow_mapping_idx() + local level = tonumber(core.settings:get("shadow_levels")) + if level and level >= 0 and level < #shadow_levels_labels then + return level + 1 end return 1 end +local function set_shadow_mapping_idx(v) + assert(v >= 1 and v <= #shadow_levels_labels) + core.settings:set("shadow_levels", tostring(v - 1)) +end + + return { query_text = "Shaders", get_formspec = function(self, avail_w) @@ -81,7 +81,8 @@ return { if video_driver == "opengl" then fs = fs .. "label[0,2.2;" .. fgettext("Dynamic shadows") .. "]" .. - "dropdown[0,2.4;3,0.8;dd_shadows;" .. shadow_levels_options[1] .. ";" .. get_shadow_mapping_id() .. "]" .. + "dropdown[0,2.4;3,0.8;dd_shadows;" .. table.concat(shadow_levels_labels, ",") .. ";" .. + get_shadow_mapping_idx() .. ";true]" .. "label[0,3.5;" .. core.colorize("#bbb", fgettext("(The game will need to enable shadows as well)")) .. "]" else fs = fs .. @@ -129,15 +130,15 @@ return { return true end - for i = 1, #shadow_levels_labels do - if fields.dd_shadows == shadow_levels_labels[i] then - core.settings:set("shadow_levels", shadow_levels_options[2][i]) + if fields.dd_shadows then + local old_shadow_level_idx = get_shadow_mapping_idx() + local shadow_level_idx = tonumber(fields.dd_shadows) + if shadow_level_idx == nil or shadow_level_idx == old_shadow_level_idx then + return false end - end - if fields.dd_shadows == shadow_levels_labels[1] then - core.settings:set("enable_dynamic_shadows", "false") - else + set_shadow_mapping_idx(shadow_level_idx) + local shadow_presets = { [2] = { 62, 512, "true", 0, "false" }, [3] = { 93, 1024, "true", 0, "false" }, @@ -145,15 +146,18 @@ return { [5] = { 210, 4096, "true", 2, "true" }, [6] = { 300, 8192, "true", 2, "true" }, } - local s = shadow_presets[table.indexof(shadow_levels_labels, fields.dd_shadows)] - if s then + local preset = shadow_presets[shadow_level_idx] + if preset then core.settings:set("enable_dynamic_shadows", "true") - core.settings:set("shadow_map_max_distance", s[1]) - core.settings:set("shadow_map_texture_size", s[2]) - core.settings:set("shadow_map_texture_32bit", s[3]) - core.settings:set("shadow_filters", s[4]) - core.settings:set("shadow_map_color", s[5]) + core.settings:set("shadow_map_max_distance", preset[1]) + core.settings:set("shadow_map_texture_size", preset[2]) + core.settings:set("shadow_map_texture_32bit", preset[3]) + core.settings:set("shadow_filters", preset[4]) + core.settings:set("shadow_map_color", preset[5]) + else + core.settings:set("enable_dynamic_shadows", "false") end + return true end end, }