mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-30 23:15:32 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --Minetest
 | |
| --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
 | |
| --the Free Software Foundation; either version 2.1 of the License, or
 | |
| --(at your option) any later version.
 | |
| --
 | |
| --This program is distributed in the hope that it will be useful,
 | |
| --but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| --MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| --GNU Lesser General Public License for more details.
 | |
| --
 | |
| --You should have received a copy of the GNU Lesser General Public License along
 | |
| --with this program; if not, write to the Free Software Foundation, Inc.,
 | |
| --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | |
| 
 | |
| 
 | |
| local shadow_levels_labels = {
 | |
| 	fgettext("Disabled"),
 | |
| 	fgettext("Very Low"),
 | |
| 	fgettext("Low"),
 | |
| 	fgettext("Medium"),
 | |
| 	fgettext("High"),
 | |
| 	fgettext("Very High"),
 | |
| 	fgettext("Custom"),
 | |
| }
 | |
| local PRESET_DISABLED = 1
 | |
| local PRESET_CUSTOM = #shadow_levels_labels
 | |
| 
 | |
| 
 | |
| -- max distance, texture size, texture_32bit, filters, map color
 | |
| local shadow_presets = {
 | |
| 	[2] = { 62,  512,  true, 0, false },
 | |
| 	[3] = { 93,  1024, true, 0, false },
 | |
| 	[4] = { 140, 2048, true, 1, false },
 | |
| 	[5] = { 210, 4096, true, 2,  true },
 | |
| 	[6] = { 300, 8192, true, 2,  true },
 | |
| }
 | |
| 
 | |
| 
 | |
| local function detect_mapping_idx()
 | |
| 	if not core.settings:get_bool("enable_dynamic_shadows", false) then
 | |
| 		return PRESET_DISABLED
 | |
| 	end
 | |
| 
 | |
| 	local shadow_map_max_distance = tonumber(core.settings:get("shadow_map_max_distance"))
 | |
| 	local shadow_map_texture_size = tonumber(core.settings:get("shadow_map_texture_size"))
 | |
| 	local shadow_map_texture_32bit = core.settings:get_bool("shadow_map_texture_32bit", false)
 | |
| 	local shadow_filters = tonumber(core.settings:get("shadow_filters"))
 | |
| 	local shadow_map_color = core.settings:get_bool("shadow_map_color", false)
 | |
| 
 | |
| 	for i = 2, 6 do
 | |
| 		local preset = shadow_presets[i]
 | |
| 		if preset[1] == shadow_map_max_distance and
 | |
| 				preset[2] == shadow_map_texture_size and
 | |
| 				preset[3] == shadow_map_texture_32bit and
 | |
| 				preset[4] == shadow_filters and
 | |
| 				preset[5] == shadow_map_color then
 | |
| 			return i
 | |
| 		end
 | |
| 	end
 | |
| 	return PRESET_CUSTOM
 | |
| end
 | |
| 
 | |
| 
 | |
| local function apply_preset(preset)
 | |
| 	if preset then
 | |
| 		core.settings:set_bool("enable_dynamic_shadows", true)
 | |
| 		core.settings:set("shadow_map_max_distance", preset[1])
 | |
| 		core.settings:set("shadow_map_texture_size", preset[2])
 | |
| 		core.settings:set_bool("shadow_map_texture_32bit", preset[3])
 | |
| 		core.settings:set("shadow_filters", preset[4])
 | |
| 		core.settings:set_bool("shadow_map_color", preset[5])
 | |
| 	else
 | |
| 		core.settings:set_bool("enable_dynamic_shadows", false)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| 
 | |
| return {
 | |
| 	query_text = "Shadows",
 | |
| 	requires = {
 | |
| 		shaders = true,
 | |
| 		opengl = true,
 | |
| 	},
 | |
| 	get_formspec = function(self, avail_w)
 | |
| 		local labels = table.copy(shadow_levels_labels)
 | |
| 		local idx = detect_mapping_idx()
 | |
| 
 | |
| 		-- Remove "custom" if not already selected
 | |
| 		if idx ~= PRESET_CUSTOM then
 | |
| 			table.remove(labels, PRESET_CUSTOM)
 | |
| 		end
 | |
| 
 | |
| 		local fs =
 | |
| 			"label[0,0.2;" .. fgettext("Dynamic shadows") .. "]" ..
 | |
| 			"dropdown[0,0.4;3,0.8;dd_shadows;" .. table.concat(labels, ",") .. ";" .. idx .. ";true]" ..
 | |
| 			"label[0,1.5;" .. core.colorize("#bbb", fgettext("(The game will need to enable shadows as well)")) .. "]"
 | |
| 		return fs, 1.8
 | |
| 	end,
 | |
| 	on_submit = function(self, fields)
 | |
| 		if fields.dd_shadows then
 | |
| 			local old_shadow_level_idx = detect_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
 | |
| 
 | |
| 			if shadow_level_idx == PRESET_CUSTOM then
 | |
| 				core.settings:set_bool("enable_dynamic_shadows", true)
 | |
| 				return true
 | |
| 			end
 | |
| 
 | |
| 			local preset = shadow_presets[shadow_level_idx]
 | |
| 			apply_preset(preset)
 | |
| 			return true
 | |
| 		end
 | |
| 	end,
 | |
| }
 |