@ -0,0 +1,5 @@ | |||
[gd_resource type="Gradient" format=3 uid="uid://bgsedjexjylfr"] | |||
[resource] | |||
offsets = PackedFloat32Array(0) | |||
colors = PackedColorArray(0.301961, 0.266667, 0.823529, 1) |
@ -0,0 +1,5 @@ | |||
[gd_resource type="Curve" format=3 uid="uid://cmmbliff4tja2"] | |||
[resource] | |||
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(0.25, 0), 0.0, 0.0, 0, 0, Vector2(0.75, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] | |||
point_count = 4 |
@ -0,0 +1,5 @@ | |||
[gd_resource type="Gradient" format=3 uid="uid://dvpnjt66dtk46"] | |||
[resource] | |||
offsets = PackedFloat32Array(0.1, 0.25, 0.401515, 0.6, 0.75, 0.9) | |||
colors = PackedColorArray(0.317647, 0.333333, 0.65098, 1, 0.87451, 0.521569, 0.407843, 1, 0.584314, 0.980392, 0.980392, 1, 0.584314, 0.980392, 0.980392, 1, 0.87451, 0.521569, 0.407843, 1, 0.317647, 0.333333, 0.65098, 1) |
@ -0,0 +1,5 @@ | |||
[gd_resource type="Gradient" format=3 uid="uid://d0cpq2rok3jsi"] | |||
[resource] | |||
offsets = PackedFloat32Array(0.1, 0.4, 0.6, 0.9) | |||
colors = PackedColorArray(0.317647, 0.333333, 0.65098, 1, 0.583728, 0.979416, 0.978736, 1, 0.584314, 0.980392, 0.980392, 1, 0.317647, 0.333333, 0.65098, 1) |
@ -0,0 +1,5 @@ | |||
[gd_resource type="Gradient" format=3 uid="uid://chetnl1mrww83"] | |||
[resource] | |||
offsets = PackedFloat32Array(0, 0.3, 0.7, 1) | |||
colors = PackedColorArray(1, 0.584314, 0.262745, 1, 0.968627, 0.921569, 0.858824, 1, 0.968627, 0.921569, 0.858824, 1, 1, 0.584314, 0.262745, 1) |
@ -0,0 +1,5 @@ | |||
[gd_resource type="Curve" format=3 uid="uid://ds0dqy41plskw"] | |||
[resource] | |||
_data = [Vector2(0.2, 0), 0.0, 0.0, 0, 0, Vector2(0.3, 1), 0.0, 0.0, 0, 0, Vector2(0.7, 1), 0.0, 0.0, 0, 0, Vector2(0.8, 0), 0.0, 0.0, 0, 0] | |||
point_count = 4 |
@ -0,0 +1,89 @@ | |||
extends Node3D | |||
signal end_of_day | |||
signal pause_time | |||
signal resume_time | |||
signal set_day_length(length_in_seconds: float) | |||
signal set_rate_of_time(rate: float) ## 2.0 for 2x | |||
signal set_time(time: float) ## Time should be between 0 and 1 | |||
@export var day_length: float = 60.0 ## Day length in seconds | |||
@export var start_time: float = 0.3 ## Between 0-1 (0.3 is morning, 0.5 noon) | |||
@export var time_paused: bool = false | |||
@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: | |||
if time_paused: return | |||
time += tick_rate * delta | |||
if time >= 1.0: | |||
time = 0.0 | |||
end_of_day.emit() | |||
# 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)) | |||
func _ready() -> void: | |||
pause_time.connect(_on_pause_time) | |||
resume_time.connect(_on_resume_time) | |||
set_day_length.connect(_on_set_day_length) | |||
set_rate_of_time.connect(_on_set_rate_of_time) | |||
func update_tick_rate(new_rate: float = 1.0) -> void: | |||
tick_rate = new_rate / day_length | |||
func _on_pause_time() -> void: | |||
time_paused = true | |||
func _on_resume_time() -> void: | |||
time_paused = true | |||
func _on_set_day_length(seconds: float) -> void: | |||
day_length = seconds | |||
update_tick_rate() | |||
func _on_set_rate_of_time(new_rate: float) -> void: | |||
update_tick_rate(new_rate) | |||
func _on_set_time(new_time: float) -> void: | |||
time = new_time |
@ -0,0 +1 @@ | |||
uid://odh7sbmaku32 |
@ -0,0 +1,44 @@ | |||
[gd_scene load_steps=11 format=3 uid="uid://58cvwtpnkq8r"] | |||
[ext_resource type="Script" uid="uid://odh7sbmaku32" path="res://scenes/world/day_night_cycle_component.gd" id="1_xc0aj"] | |||
[ext_resource type="Gradient" uid="uid://bgsedjexjylfr" path="res://resources/world/moon_color_gradient.tres" id="2_65gyo"] | |||
[ext_resource type="Curve" uid="uid://cmmbliff4tja2" path="res://resources/world/moon_intensity_curve.tres" id="3_bdvt6"] | |||
[ext_resource type="Gradient" uid="uid://chetnl1mrww83" path="res://resources/world/sun_color_gradient.tres" id="4_yeijk"] | |||
[ext_resource type="Curve" uid="uid://ds0dqy41plskw" path="res://resources/world/sun_intensity_curve.tres" id="5_wylv2"] | |||
[ext_resource type="Gradient" uid="uid://d0cpq2rok3jsi" path="res://resources/world/sky_top_color_gradient.tres" id="6_ckt1h"] | |||
[ext_resource type="Gradient" uid="uid://dvpnjt66dtk46" path="res://resources/world/sky_horizon_color_gradient.tres" id="7_03v7x"] | |||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_4rhad"] | |||
[sub_resource type="Sky" id="Sky_dphjl"] | |||
sky_material = SubResource("ProceduralSkyMaterial_4rhad") | |||
[sub_resource type="Environment" id="Environment_sl2e5"] | |||
background_mode = 2 | |||
sky = SubResource("Sky_dphjl") | |||
tonemap_mode = 2 | |||
glow_enabled = true | |||
[node name="DayNightCycleComponent" type="Node3D" node_paths=PackedStringArray("environment", "sun", "moon")] | |||
script = ExtResource("1_xc0aj") | |||
moon_color = ExtResource("2_65gyo") | |||
moon_intensity = ExtResource("3_bdvt6") | |||
sun_color = ExtResource("4_yeijk") | |||
sun_intensity = ExtResource("5_wylv2") | |||
sky_top_color = ExtResource("6_ckt1h") | |||
sky_horizon_color = ExtResource("7_03v7x") | |||
ground_bottom_color = ExtResource("6_ckt1h") | |||
ground_horizon_color = ExtResource("7_03v7x") | |||
environment = NodePath("WorldEnvironment") | |||
sun = NodePath("Sun") | |||
moon = NodePath("Moon") | |||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."] | |||
environment = SubResource("Environment_sl2e5") | |||
[node name="Sun" type="DirectionalLight3D" parent="."] | |||
shadow_enabled = true | |||
[node name="Moon" type="DirectionalLight3D" parent="."] | |||
shadow_enabled = true | |||
sky_mode = 1 |