A Minecraft style clone in Godot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

50 lines
1.7 KiB

extends Node3D
@export var day_length: float = 10.0 ## Day length in seconds
@export var start_time: float = 0.3 ## Between 0-1 (0.3 is morning, 0.5 noon)
@export_group("Colors and Intensity")
@export var moon_color: Gradient
@export var moon_intensity: Curve
@export var sun_color: Gradient
@export var sun_intensity: Curve
@export var sky_top_color: Gradient
@export var sky_horizon_color: Gradient
@export var ground_bottom_color: Gradient
@export var ground_horizon_color: Gradient
@export_group("Node Exports")
@export var environment: WorldEnvironment
@export var sun: DirectionalLight3D
@export var moon: DirectionalLight3D
@onready var tick_rate: float = 1.0 / day_length
@onready var time: float = start_time ## Between 0-1 (0.5 - noon)
func _process(delta: float) -> void:
time += tick_rate * delta
if time >= 1.0:
time = 0.0
# 90 to fix alignment
sun.rotation_degrees.x = time * 360 + 90
sun.light_color = sun_color.sample(time)
sun.light_energy = sun_intensity.sample(time)
# 90 to fix alignment
moon.rotation_degrees.x = time * 360 + 90 + 180 # 180 for opposite of sun
moon.light_color = moon_color.sample(time)
moon.light_energy = moon_intensity.sample(time)
# Show / Hide Sun and Moon
sun.visible = sun.light_energy > 0
moon.visible = moon.light_energy > 0
# Sky and Ground Colors
environment.environment.sky.sky_material.set("sky_top_color", sky_top_color.sample(time))
environment.environment.sky.sky_material.set("sky_horizon_color", sky_horizon_color.sample(time))
environment.environment.sky.sky_material.set("ground_bottom_color", ground_bottom_color.sample(time))
environment.environment.sky.sky_material.set("ground_horizon_color", ground_horizon_color.sample(time))