2026-03-19 11:35:38 -05:00

213 lines
8.2 KiB
GDScript

# global_parameters.gd
# This file is part of: SimpleGrassTextured
# Copyright (c) 2023 IcterusGames
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@tool
extends AcceptDialog
const DEFAULT_WIND_DIR := Vector3.RIGHT
const DEFAULT_WIND_STRENGTH := 0.15
const DEFAULT_WIND_TURBULENCE := 1.0
const DEFAULT_WIND_PATTERN := "res://addons/simplegrasstextured/images/wind_pattern.png"
var _wind_dir_x_slider :EditorSpinSlider
var _wind_dir_y_slider :EditorSpinSlider
var _wind_dir_z_slider :EditorSpinSlider
var _wind_strength_slider :EditorSpinSlider
var _wind_turbulence_slider :EditorSpinSlider
var _wind_pattern :EditorResourcePicker
func _ready() -> void:
name = &"SimpleGrassTexturedGlobalParameters"
size = Vector2.ZERO
_wind_dir_x_slider = _create_slider("X", -1, 1, 0.01)
_wind_dir_y_slider = _create_slider("Y", -1, 1, 0.01)
_wind_dir_z_slider = _create_slider("Z", -1, 1, 0.01)
_wind_strength_slider = _create_slider("", 0, 1, 0.001)
_wind_turbulence_slider = _create_slider("", 0, 20, 0.01)
_wind_pattern = EditorResourcePicker.new()
_wind_pattern.base_type = "Texture"
_wind_pattern.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_wind_dir_x_slider.value_changed.connect(_on_wind_dir_x_value_changed)
_wind_dir_y_slider.value_changed.connect(_on_wind_dir_y_value_changed)
_wind_dir_z_slider.value_changed.connect(_on_wind_dir_z_value_changed)
_wind_strength_slider.value_changed.connect(_on_wind_strength_value_changed)
_wind_turbulence_slider.value_changed.connect(_on_wind_turbulence_value_changed)
_wind_pattern.resource_changed.connect(_on_wind_pattern_resource_changed)
%WindDirHbox.add_child(_wind_dir_x_slider)
%WindDirHbox.add_child(_wind_dir_y_slider)
%WindDirHbox.add_child(_wind_dir_z_slider)
%WindStrengthHBox.add_child(_wind_strength_slider)
%WindTurbulenceHBox.add_child(_wind_turbulence_slider)
%WindPatternHBox.add_child(_wind_pattern)
get_ok_button().custom_minimum_size.x = 100
func _create_slider(label :String, min :float, max :float, step :float) -> EditorSpinSlider:
var slider := EditorSpinSlider.new()
slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
slider.step = step;
slider.min_value = min
slider.max_value = max
slider.label = label
slider.custom_minimum_size.x = 80
return slider
func disable_button(button :Button, disabled :bool) -> void:
if disabled:
button.disabled = true
button.modulate.a = 0
button.focus_mode = Control.FOCUS_NONE
else:
button.disabled = false
button.modulate.a = 1
button.focus_mode = Control.FOCUS_ALL
func on_theme_changed() -> void:
%DefaultWindDirButton.icon = get_theme_icon(&"Reload", &"EditorIcons")
%DefaultWindStrengthButton.icon = get_theme_icon(&"Reload", &"EditorIcons")
%DefaultWindTurbulenceButton.icon = get_theme_icon(&"Reload", &"EditorIcons")
%DefaultWindPatternButton.icon = get_theme_icon(&"Reload", &"EditorIcons")
func _on_about_to_popup() -> void:
var windir :Vector3 = ProjectSettings.get_setting("shader_globals/sgt_wind_direction").value
_wind_dir_x_slider.value = windir.x
_wind_dir_y_slider.value = windir.y
_wind_dir_z_slider.value = windir.z
_wind_strength_slider.value = ProjectSettings.get_setting("shader_globals/sgt_wind_strength").value
_wind_turbulence_slider.value = ProjectSettings.get_setting("shader_globals/sgt_wind_turbulence").value
_wind_pattern.edited_resource = load(ProjectSettings.get_setting("shader_globals/sgt_wind_pattern").value)
_on_wind_pattern_resource_changed(_wind_pattern.edited_resource)
on_theme_changed()
func _on_wind_dir_x_value_changed(value :float) -> void:
var windir :Vector3 = ProjectSettings.get_setting("shader_globals/sgt_wind_direction", {"value":Vector3.RIGHT}).value
windir.x = value
ProjectSettings.set_setting("shader_globals/sgt_wind_direction", {
"type": "vec3",
"value": windir
})
RenderingServer.global_shader_parameter_set("sgt_wind_direction", windir)
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindDirButton, windir == DEFAULT_WIND_DIR)
func _on_wind_dir_y_value_changed(value :float) -> void:
var windir :Vector3 = ProjectSettings.get_setting("shader_globals/sgt_wind_direction", {"value":Vector3.RIGHT}).value
windir.y = value
ProjectSettings.set_setting("shader_globals/sgt_wind_direction", {
"type": "vec3",
"value": windir
})
RenderingServer.global_shader_parameter_set("sgt_wind_direction", windir)
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindDirButton, windir == DEFAULT_WIND_DIR)
func _on_wind_dir_z_value_changed(value :float) -> void:
var windir :Vector3 = ProjectSettings.get_setting("shader_globals/sgt_wind_direction", {"value":Vector3.RIGHT}).value
windir.z = value
ProjectSettings.set_setting("shader_globals/sgt_wind_direction", {
"type": "vec3",
"value": windir
})
RenderingServer.global_shader_parameter_set("sgt_wind_direction", windir)
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindDirButton, windir == DEFAULT_WIND_DIR)
func _on_wind_strength_value_changed(value :float) -> void:
ProjectSettings.set_setting("shader_globals/sgt_wind_strength", {
"type": "float",
"value": value
})
RenderingServer.global_shader_parameter_set("sgt_wind_strength", value)
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindStrengthButton, _wind_strength_slider.value == DEFAULT_WIND_STRENGTH)
func _on_wind_turbulence_value_changed(value :float) -> void:
ProjectSettings.set_setting("shader_globals/sgt_wind_turbulence", {
"type": "float",
"value": value
})
RenderingServer.global_shader_parameter_set("sgt_wind_turbulence", value)
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindTurbulenceButton, _wind_turbulence_slider.value == DEFAULT_WIND_TURBULENCE)
func _on_wind_pattern_resource_changed(resource :Resource) -> void:
if resource.resource_path == "":
_wind_pattern.edited_resource = load(DEFAULT_WIND_PATTERN)
_on_wind_pattern_resource_changed(_wind_pattern.edited_resource)
return
ProjectSettings.set_setting("shader_globals/sgt_wind_pattern", {
"type": "sampler2D",
"value": resource.resource_path
})
RenderingServer.global_shader_parameter_set("sgt_wind_pattern", load(resource.resource_path))
$SaveConfigTimer.start()
get_tree().emit_signal(&"sgt_globals_params_changed")
disable_button(%DefaultWindPatternButton, resource.resource_path == DEFAULT_WIND_PATTERN)
func _on_save_config_timer_timeout() -> void:
ProjectSettings.save()
func _on_canceled():
queue_free()
func _on_confirmed() -> void:
ProjectSettings.save()
queue_free()
func _on_default_wind_dir_button_pressed() -> void:
_wind_dir_x_slider.value = DEFAULT_WIND_DIR.x
_wind_dir_y_slider.value = DEFAULT_WIND_DIR.y
_wind_dir_z_slider.value = DEFAULT_WIND_DIR.z
func _on_default_wind_strength_button_pressed() -> void:
_wind_strength_slider.value = DEFAULT_WIND_STRENGTH
func _on_default_wind_turbulence_button_pressed() -> void:
_wind_turbulence_slider.value = DEFAULT_WIND_TURBULENCE
func _on_default_wind_pattern_button_pressed() -> void:
_wind_pattern.edited_resource = load(DEFAULT_WIND_PATTERN)
_on_wind_pattern_resource_changed(_wind_pattern.edited_resource)