fix wind and make compatible wind_decoration
This commit is contained in:
@@ -10,8 +10,17 @@ extends Node3D
|
||||
|
||||
var tempo: float = 0.0
|
||||
var offset_iniziale: float = 0.0
|
||||
var _base_transform: Transform3D
|
||||
var _wind_speed: float = 0.0
|
||||
var _wind_strength: float = 0.0
|
||||
var _wind_fade: float = 0.0
|
||||
var _wind_direction: Vector2 = Vector2.ZERO
|
||||
var _weather_controller: WeatherController
|
||||
|
||||
func _ready() -> void:
|
||||
_base_transform = transform
|
||||
call_deferred("_bind_weather_controller")
|
||||
|
||||
func _ready():
|
||||
if sfasamento_casuale:
|
||||
# Usiamo la posizione nel mondo per dare un ritmo diverso a ogni casa
|
||||
offset_iniziale = global_position.x + global_position.z
|
||||
@@ -19,11 +28,48 @@ func _ready():
|
||||
# Partiamo da un punto casuale del ciclo per spezzare la monotonia
|
||||
tempo = randf_range(0.0, 10.0)
|
||||
|
||||
func _process(delta: float):
|
||||
tempo += delta * velocita
|
||||
|
||||
# Calcoliamo l'angolo usando il seno
|
||||
var angolo = sin(tempo + offset_iniziale) * deg_to_rad(ampiezza_gradi)
|
||||
|
||||
# Applichiamo la rotazione sull'asse X (avanti/indietro)
|
||||
rotation.x = angolo
|
||||
func _process(delta: float) -> void:
|
||||
var wind_direction_3d := Vector3(_wind_direction.x, 0.0, _wind_direction.y)
|
||||
|
||||
if _wind_speed <= 0.0 or _wind_strength <= 0.0 or _wind_fade <= 0.0 or wind_direction_3d.length_squared() <= 0.0:
|
||||
transform = _base_transform
|
||||
return
|
||||
|
||||
tempo += delta * _wind_speed * velocita
|
||||
wind_direction_3d = wind_direction_3d.normalized()
|
||||
|
||||
# Ruota attorno all'asse perpendicolare alla direzione del vento, così il decoro oscilla
|
||||
# nello stesso verso usato dai global shader parameter di foglie/erba.
|
||||
var sway_axis_world := Vector3.UP.cross(wind_direction_3d).normalized()
|
||||
var sway_axis_local := sway_axis_world
|
||||
if get_parent() is Node3D:
|
||||
var parent_node := get_parent() as Node3D
|
||||
sway_axis_local = parent_node.global_basis.orthonormalized().inverse() * sway_axis_world
|
||||
|
||||
var angle := sin(tempo + offset_iniziale) * deg_to_rad(ampiezza_gradi) * _wind_strength * _wind_fade
|
||||
var sway_basis := Basis(sway_axis_local.normalized(), angle)
|
||||
transform = Transform3D(sway_basis * _base_transform.basis, _base_transform.origin)
|
||||
|
||||
func _on_wind_parameters_changed(speed: float, strength: float, fade: float, direction: Vector2) -> void:
|
||||
_wind_speed = speed
|
||||
_wind_strength = strength
|
||||
_wind_fade = fade
|
||||
_wind_direction = direction
|
||||
|
||||
func _bind_weather_controller() -> void:
|
||||
#connect to wind_change_state
|
||||
_weather_controller = get_tree().get_first_node_in_group("weather_controller") as WeatherController
|
||||
if _weather_controller == null:
|
||||
return
|
||||
if not _weather_controller.wind_parameters_changed.is_connected(_on_wind_parameters_changed):
|
||||
_weather_controller.wind_parameters_changed.connect(_on_wind_parameters_changed)
|
||||
|
||||
var wind_direction := Vector2.ZERO
|
||||
if _weather_controller.environment_config != null:
|
||||
wind_direction = _weather_controller.environment_config.wind_direction
|
||||
_on_wind_parameters_changed(
|
||||
_weather_controller.current_wind_speed,
|
||||
_weather_controller.current_wind_strength,
|
||||
_weather_controller.current_wind_fade,
|
||||
wind_direction
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user