add snow management for materials
This commit is contained in:
@@ -23,8 +23,8 @@ uniform float fade_start : hint_range(10.0, 1000.0) = 150.0;
|
||||
uniform float fade_end : hint_range(50.0, 2000.0) = 300.0;
|
||||
|
||||
group_uniforms Fade_Height;
|
||||
uniform float height_fade_start : hint_range(0.0, 500.0) = 10.0; // Inizia a svanire sopra i 10 metri
|
||||
uniform float height_fade_end : hint_range(0.0, 1000.0) = 50.0; // Scompare del tutto a 50 metri di altezza
|
||||
uniform float height_fade_start : hint_range(0.0, 500.0) = 10.0; // Start fade over 10m
|
||||
uniform float height_fade_end : hint_range(0.0, 1000.0) = 50.0; // Disappear over 50m
|
||||
|
||||
void vertex() {
|
||||
POSITION = vec4(VERTEX.xy, 1.0, 1.0);
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
[ext_resource type="Shader" uid="uid://cq4vlcj8cuvge" path="res://core/daynight/fog.gdshader" id="2_r4tfj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dyxvcf2l8ba5x" path="res://core/daynight/god_ray.tscn" id="5_411rw"]
|
||||
[ext_resource type="Shader" uid="uid://bb1jjwe31fl7o" path="res://core/daynight/wind.gdshader" id="5_djqkg"]
|
||||
[ext_resource type="Shader" uid="uid://bwf4wjp802x8j" path="res://core/daynight/environment_dust.gdshader" id="7_ik86e"]
|
||||
[ext_resource type="Material" uid="uid://codq5gx71rj4o" path="res://core/daynight/environment_dust_material.tres" id="8_amaf0"]
|
||||
[ext_resource type="Shader" uid="uid://bkn6eqgbn37jx" path="res://core/daynight/blur.gdshader" id="9_amaf0"]
|
||||
[ext_resource type="Shader" uid="uid://b5wa82soyhsqm" path="res://core/daynight/environment_shadows.gdshader" id="10_tuauy"]
|
||||
@@ -113,6 +112,10 @@ point_count = 3
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cer0u"]
|
||||
render_priority = 0
|
||||
shader = ExtResource("5_djqkg")
|
||||
shader_parameter/wave_frequency = 1.0
|
||||
shader_parameter/base_amplitude = 0.5
|
||||
shader_parameter/secondary_ratio = 0.6
|
||||
shader_parameter/time_scale_base = 3.0
|
||||
|
||||
[sub_resource type="TubeTrailMesh" id="TubeTrailMesh_vo82p"]
|
||||
material = SubResource("ShaderMaterial_cer0u")
|
||||
@@ -123,8 +126,8 @@ section_length = 2.0
|
||||
curve = SubResource("Curve_b5atu")
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_b5atu"]
|
||||
offsets = PackedFloat32Array(0, 0.49019608, 1)
|
||||
colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0)
|
||||
offsets = PackedFloat32Array(0, 0.1, 0.9, 1)
|
||||
colors = PackedColorArray(1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
|
||||
|
||||
[sub_resource type="GradientTexture1D" id="GradientTexture1D_ruhh7"]
|
||||
gradient = SubResource("Gradient_b5atu")
|
||||
@@ -182,17 +185,6 @@ particles_anim_loop = false
|
||||
material = SubResource("StandardMaterial3D_ruhh7")
|
||||
size = Vector2(0.05, 0.8)
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_ik86e"]
|
||||
shader = ExtResource("7_ik86e")
|
||||
shader_parameter/dust_color = Color(1, 0.9, 0.7, 0.6)
|
||||
shader_parameter/wind_velocity = Vector2(-0.2, 0.05)
|
||||
shader_parameter/wind_oscillation = 0.3
|
||||
shader_parameter/dust_speed = 0.15
|
||||
shader_parameter/size_min = 0.02
|
||||
shader_parameter/size_max = 0.2
|
||||
shader_parameter/dust_density = 1.0
|
||||
shader_parameter/solid_core = 0.1
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_kavln"]
|
||||
shader = ExtResource("9_amaf0")
|
||||
shader_parameter/blur_amount = 0.70000003325
|
||||
@@ -227,15 +219,15 @@ shader_parameter/height_fade_end = 50.0
|
||||
[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "fog_overlay", "environment_dust", "blur", "environment_shadows")]
|
||||
script = ExtResource("1_wecen")
|
||||
environment_config = SubResource("Resource_r4tfj")
|
||||
godray = ExtResource("5_411rw")
|
||||
particles_wind = NodePath("Particles_Wind")
|
||||
particles_snow = NodePath("Particles_Snow")
|
||||
particles_fireflies = NodePath("Particles_Fireflies")
|
||||
particles_rain = NodePath("Particles_Rain")
|
||||
fog_overlay = NodePath("FogOverlay")
|
||||
godray = ExtResource("5_411rw")
|
||||
fog_overlay = NodePath("")
|
||||
environment_dust = NodePath("EnvironmentDust")
|
||||
blur = NodePath("Blur")
|
||||
environment_shadows = NodePath("EnvironmentShadows")
|
||||
environment_shadows = NodePath("EnvironmentCloudsShadows")
|
||||
|
||||
[node name="Particles_Fireflies" type="GPUParticles3D" parent="." unique_id=947538133]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0)
|
||||
@@ -256,6 +248,7 @@ draw_pass_1 = SubResource("TubeTrailMesh_vo82p")
|
||||
|
||||
[node name="Particles_Snow" type="GPUParticles3D" parent="." unique_id=1877039876]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 30, 0)
|
||||
extra_cull_margin = 16384.0
|
||||
emitting = false
|
||||
amount = 2000
|
||||
lifetime = 4.0
|
||||
@@ -272,15 +265,6 @@ lifetime = 1.5
|
||||
process_material = SubResource("ParticleProcessMaterial_b5atu")
|
||||
draw_pass_1 = SubResource("QuadMesh_cer0u")
|
||||
|
||||
[node name="FogOverlay" type="ColorRect" parent="." unique_id=1694754918]
|
||||
material = SubResource("ShaderMaterial_ik86e")
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="EnvironmentDust" type="ColorRect" parent="." unique_id=1245348005]
|
||||
material = ExtResource("8_amaf0")
|
||||
anchors_preset = 15
|
||||
@@ -299,7 +283,7 @@ grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="EnvironmentShadows" type="MeshInstance3D" parent="." unique_id=159549433]
|
||||
[node name="EnvironmentCloudsShadows" type="MeshInstance3D" parent="." unique_id=159549433]
|
||||
extra_cull_margin = 16384.0
|
||||
mesh = SubResource("QuadMesh_sxgg7")
|
||||
surface_material_override/0 = SubResource("ShaderMaterial_oqt1s")
|
||||
|
||||
@@ -29,6 +29,11 @@ var day_time: float = 0.0
|
||||
|
||||
func _ready() -> void:
|
||||
|
||||
#set noise texture 2d to materials in special group
|
||||
ApplyWindNoiseToMaterials()
|
||||
#set snow shader to materials in special group
|
||||
ApplySnowShaderToMaterials()
|
||||
|
||||
if day_night_controller == null:
|
||||
day_night_controller = DayNightController.new(
|
||||
environment_config
|
||||
@@ -56,6 +61,24 @@ func _ready() -> void:
|
||||
weather_controller.name = "WeatherController"
|
||||
add_child(weather_controller)
|
||||
|
||||
func ApplyWindNoiseToMaterials():
|
||||
var noise_tex = preload("res://core/daynight/noise.tres")
|
||||
for node in get_tree().get_nodes_in_group("wind_materials"):
|
||||
if node is GeometryInstance3D:
|
||||
node.material_override.set_shader_parameter("wind_noise", noise_tex)
|
||||
|
||||
func ApplySnowShaderToMaterials():
|
||||
var snow_shader = preload("res://core/daynight/snow_overlay.tres")
|
||||
|
||||
#apply to node and childs
|
||||
for node in get_tree().get_nodes_in_group("snow_materials"):
|
||||
if node is GeometryInstance3D:
|
||||
node.material_overlay = snow_shader
|
||||
else:
|
||||
for child in node.get_children():
|
||||
if child is GeometryInstance3D:
|
||||
child.material_overlay = snow_shader
|
||||
|
||||
func select_day_time(normalized_time: float) -> void:
|
||||
# 0.0→0.25 = alba: day_time 1.0→2.0 (night colors → morning colors)
|
||||
# 0.25→0.5 = giorno: day_time 2.0→2.0 (stays morning/afternoon)
|
||||
|
||||
11
core/daynight/noise.tres
Normal file
11
core/daynight/noise.tres
Normal file
@@ -0,0 +1,11 @@
|
||||
[gd_resource type="NoiseTexture2D" format=3 uid="uid://bpswbjh4jj1ou"]
|
||||
|
||||
[sub_resource type="FastNoiseLite" id="FastNoiseLite_xa3jw"]
|
||||
noise_type = 3
|
||||
seed = 1
|
||||
frequency = 0.0158
|
||||
metadata/_preview_in_3d_space_ = true
|
||||
|
||||
[resource]
|
||||
noise = SubResource("FastNoiseLite_xa3jw")
|
||||
seamless = true
|
||||
@@ -1,19 +1,30 @@
|
||||
shader_type spatial;
|
||||
render_mode blend_mix, depth_draw_opaque;
|
||||
render_mode blend_mix, depth_draw_never;
|
||||
|
||||
global uniform float global_snow_amount;
|
||||
|
||||
uniform vec4 snow_color : source_color = vec4(0.95, 0.98, 1.0, 1.0);
|
||||
global uniform float global_snow_start_time = -1.0;
|
||||
global uniform float global_snow_accumulation_speed = 0.1;
|
||||
global uniform float global_snow_melt_time = -1.0;
|
||||
global uniform float global_snow_melt_speed = 0.1;
|
||||
global uniform float global_snow_threshold = 0.5;
|
||||
global uniform vec4 global_snow_color = vec4(0.92, 0.96, 1.0, 1.0);
|
||||
|
||||
void fragment() {
|
||||
vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
|
||||
float up_dot = dot(world_normal, vec3(0.0, 1.0, 0.0));
|
||||
float snow_mask = smoothstep(1.0 - global_snow_amount, 1.1 - global_snow_amount, up_dot);
|
||||
snow_mask *= step(0.01, global_snow_amount);
|
||||
float snow_amount = 0.0;
|
||||
if (global_snow_start_time >= 0.0) {
|
||||
snow_amount = clamp((TIME - global_snow_start_time) * global_snow_accumulation_speed, 0.0, 1.0);
|
||||
}
|
||||
|
||||
ALBEDO = snow_color.rgb;
|
||||
ALPHA = snow_mask;
|
||||
|
||||
ROUGHNESS = 0.3;
|
||||
SPECULAR = 0.5;
|
||||
}
|
||||
if (global_snow_melt_time >= 0.0) {
|
||||
float melt = clamp((TIME - global_snow_melt_time) * global_snow_melt_speed, 0.0, 1.0);
|
||||
snow_amount = snow_amount * (1.0 - melt);
|
||||
}
|
||||
|
||||
vec3 world_normal = (INV_VIEW_MATRIX * vec4(NORMAL, 0.0)).xyz;
|
||||
float facing_up = clamp(world_normal.y, 0.0, 1.0);
|
||||
float snow_factor = smoothstep(global_snow_threshold, 1.0, facing_up) * snow_amount;
|
||||
|
||||
ALBEDO = global_snow_color.rgb;
|
||||
ROUGHNESS = 0.15;
|
||||
METALLIC = 0.0;
|
||||
ALPHA = snow_factor;
|
||||
}
|
||||
|
||||
7
core/daynight/snow_overlay.tres
Normal file
7
core/daynight/snow_overlay.tres
Normal file
@@ -0,0 +1,7 @@
|
||||
[gd_resource type="ShaderMaterial" format=3 uid="uid://bn4onuaqif5q3"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://cjd72g8cgjear" path="res://core/daynight/snow.gdshader" id="1_vwtmf"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_vwtmf")
|
||||
@@ -136,6 +136,11 @@ func _process(delta: float) -> void:
|
||||
var final_sky_horizon = base_sky_horizon.lerp(base_sky_horizon * environment_config.rain_mode_color, rain_intensity)
|
||||
var final_fog_color = base_fog_color.lerp(base_fog_color * environment_config.rain_mode_color, rain_intensity)
|
||||
var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, rain_intensity)
|
||||
|
||||
final_tint = final_tint.lerp(final_tint * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_sky_top = final_sky_top.lerp(final_sky_top * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_sky_horizon = final_sky_horizon.lerp(final_sky_horizon * environment_config.snow_mode_color, actual_snow_amount)
|
||||
final_fog_color = final_fog_color.lerp(final_fog_color * environment_config.snow_mode_color, actual_snow_amount)
|
||||
|
||||
#Shader parameters for global trunk_shader
|
||||
var final_grad_top = base_grad_top.lerp(base_grad_top * environment_config.rain_mode_color, rain_intensity)
|
||||
@@ -257,6 +262,13 @@ func set_wind():
|
||||
|
||||
if environment_config:
|
||||
_apply_cloud_config()
|
||||
_apply_wind_config()
|
||||
|
||||
func _apply_wind_config() -> void:
|
||||
RenderingServer.global_shader_parameter_set("global_wind_speed", environment_config.wind_speed)
|
||||
RenderingServer.global_shader_parameter_set("global_wind_direction", environment_config.wind_direction)
|
||||
RenderingServer.global_shader_parameter_set("global_wind_scale", environment_config.wind_scale)
|
||||
RenderingServer.global_shader_parameter_set("global_wind_strength", environment_config.wind_strength)
|
||||
|
||||
func _apply_cloud_config() -> void:
|
||||
var dir = environment_config.wind_direction
|
||||
@@ -272,10 +284,16 @@ func _apply_cloud_config() -> void:
|
||||
sky_mat.set_shader_parameter("cloud_scale", cloud_scale)
|
||||
sky_mat.set_shader_parameter("cloud_speed", cloud_speed)
|
||||
|
||||
if environment_shadows and environment_shadows.material_override:
|
||||
environment_shadows.material_override.set_shader_parameter("direction", dir)
|
||||
environment_shadows.material_override.set_shader_parameter("cloud_scale", cloud_scale * envshadows_scale_rate)
|
||||
environment_shadows.material_override.set_shader_parameter("cloud_speed", cloud_speed * envshadows_speed_rate)
|
||||
var env_shadow_mat = environment_shadows.get_surface_override_material(0) if environment_shadows else null
|
||||
if env_shadow_mat:
|
||||
env_shadow_mat.set_shader_parameter("direction", dir)
|
||||
env_shadow_mat.set_shader_parameter("cloud_scale", cloud_scale * envshadows_scale_rate)
|
||||
env_shadow_mat.set_shader_parameter("cloud_speed", cloud_speed * envshadows_speed_rate)
|
||||
|
||||
if environment_config.material_clouds:
|
||||
environment_config.material_clouds.set_shader_parameter("direction", dir)
|
||||
environment_config.material_clouds.set_shader_parameter("cloud_scale", cloud_scale * envshadows_scale_rate)
|
||||
environment_config.material_clouds.set_shader_parameter("cloud_speed", cloud_speed * envshadows_speed_rate)
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -444,51 +462,55 @@ func toggle_snow(value: bool):
|
||||
particles_snow.emitting = true
|
||||
snow_particles_tween = create_tween()
|
||||
snow_particles_tween.tween_property(particles_snow, "amount_ratio", 1.0, environment_config.snow_fade_time)
|
||||
|
||||
start_snow_accumulation()
|
||||
else:
|
||||
snow_particles_tween = create_tween()
|
||||
snow_particles_tween.tween_property(particles_snow, "amount_ratio", 0.0, environment_config.snow_fade_time)
|
||||
snow_particles_tween.tween_callback(func():
|
||||
particles_snow.emitting = false)
|
||||
|
||||
# Accumulo neve sulle superfici
|
||||
var target_snow: float = 1.0 if is_snowing else 0.0
|
||||
start_snow_melt()
|
||||
|
||||
var target_snow_amount: float = 1.0 if is_snowing else 0.0
|
||||
if snow_tween and snow_tween.is_valid():
|
||||
snow_tween.kill()
|
||||
snow_tween = create_tween()
|
||||
snow_tween.tween_method(set_snow_amount, actual_snow_amount, target_snow, environment_config.snow_transaction_time)
|
||||
|
||||
if fog_overlay and fog_overlay.material:
|
||||
var target_opacity: float = 0.5 if is_snowing else 0.1
|
||||
var target_radius: float = 0.350 if is_snowing else 0.465
|
||||
|
||||
if cold_tween and cold_tween.is_valid():
|
||||
cold_tween.kill()
|
||||
|
||||
cold_tween = create_tween()
|
||||
cold_tween.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
|
||||
cold_tween.set_parallel(true)
|
||||
cold_tween.tween_property(fog_overlay.material, "shader_parameter/max_opacity", target_opacity, 4.0)
|
||||
cold_tween.tween_property(fog_overlay.material, "shader_parameter/clear_center_radius", target_radius, 4.0)
|
||||
snow_tween.tween_method(set_snow_amount, actual_snow_amount, target_snow_amount, environment_config.snow_transaction_time)
|
||||
|
||||
#disable snow and set default values and shader
|
||||
func set_snow(value: float = 0.0):
|
||||
actual_snow_amount = value
|
||||
actual_snow_amount = value
|
||||
RenderingServer.global_shader_parameter_set("global_snow_amount", value)
|
||||
|
||||
if particles_snow:
|
||||
particles_snow.emitting = false
|
||||
particles_snow.amount = environment_config.snow_amount
|
||||
|
||||
if environment_config:
|
||||
RenderingServer.global_shader_parameter_set("global_snow_threshold", environment_config.snow_threshold)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_color", environment_config.snow_color)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_accumulation_speed", environment_config.snow_accumulation_speed)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_speed", environment_config.snow_melt_speed)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_start_time", -1.0)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_time", -1.0)
|
||||
|
||||
func set_snow_amount(value: float):
|
||||
actual_snow_amount = value
|
||||
actual_snow_amount = value
|
||||
RenderingServer.global_shader_parameter_set("global_snow_amount", value)
|
||||
|
||||
func start_snow_accumulation() -> void:
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_time", -1.0)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_start_time", Time.get_ticks_msec() / 1000.0)
|
||||
|
||||
func start_snow_melt() -> void:
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_time", Time.get_ticks_msec() / 1000.0)
|
||||
RenderingServer.global_shader_parameter_set("global_snow_melt_speed", environment_config.snow_melt_speed)
|
||||
|
||||
#endregion
|
||||
|
||||
#region Post-Process
|
||||
|
||||
func toggle_fog_overlay(value: bool) -> void:
|
||||
if fog_overlay:
|
||||
fog_overlay.visible = value
|
||||
pass
|
||||
|
||||
func toggle_dust(value: bool) -> void:
|
||||
if environment_dust:
|
||||
|
||||
@@ -1,18 +1,31 @@
|
||||
shader_type spatial;
|
||||
render_mode unshaded;
|
||||
/*
|
||||
uniform float time_scale = 3.0;
|
||||
uniform float wave_amplitude = 0.5;
|
||||
uniform float wave_frequency = 1.0;
|
||||
|
||||
global uniform float global_wind_speed = 1.0; //0.0 = calm, 1.0 = normal, 2.0+ = strong
|
||||
global uniform vec2 global_wind_direction = vec2(1.0, 0.0);
|
||||
|
||||
uniform float wave_frequency = 1.0;
|
||||
uniform float base_amplitude = 0.5;
|
||||
uniform float secondary_ratio = 0.6;
|
||||
uniform float time_scale_base = 3.0;
|
||||
|
||||
void vertex() {
|
||||
float random_seed_offset = INSTANCE_CUSTOM.x * 100.0;
|
||||
float scaled_time = (TIME + random_seed_offset) * time_scale;
|
||||
|
||||
VERTEX.x += sin(VERTEX.y * wave_frequency + scaled_time) * wave_amplitude;
|
||||
float random_seed_offset = INSTANCE_CUSTOM.x * 100.0;
|
||||
float scaled_time = (TIME + random_seed_offset) * (time_scale_base * global_wind_speed);
|
||||
float amplitude = base_amplitude * global_wind_speed;
|
||||
|
||||
vec2 wind_dir = normalize(global_wind_direction);
|
||||
vec2 wind_perp = vec2(-wind_dir.y, wind_dir.x); //90° perpendicular
|
||||
|
||||
float primary_sway = sin(VERTEX.y * wave_frequency + scaled_time) * amplitude;
|
||||
float secondary_sway = sin(VERTEX.y * wave_frequency * 1.3 + scaled_time * 0.7 + 1.57)
|
||||
* (amplitude * secondary_ratio);
|
||||
|
||||
VERTEX.x += primary_sway * wind_dir.x + secondary_sway * wind_perp.x;
|
||||
VERTEX.z += primary_sway * wind_dir.y + secondary_sway * wind_perp.y;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
ALBEDO = COLOR.rgb;
|
||||
ALPHA = COLOR.a;
|
||||
}*/
|
||||
}
|
||||
@@ -60,7 +60,7 @@ extends Resource
|
||||
@export var glow_night: float = 2.0
|
||||
|
||||
@export_group("Post Process")
|
||||
@export var enable_fog_overlay: bool = true
|
||||
@export var enable_fog_overlay: bool = false
|
||||
@export var enable_dust: bool = true
|
||||
@export var enable_blur: bool = true
|
||||
@export var enable_environment_shadows: bool = true
|
||||
@@ -94,18 +94,26 @@ extends Resource
|
||||
@export var godray_scale: Vector3 = Vector3(2.0, 6.0, 2.0)
|
||||
|
||||
@export_group("Snow")
|
||||
@export var snow_amount: int = 2000
|
||||
@export var snow_amount: float = 0.0
|
||||
@export var snow_transaction_time: float = 10.0
|
||||
@export var snow_fade_time: float = 5.0
|
||||
@export var snow_threshold: float = 0.6
|
||||
@export var snow_accumulation_speed: float = 0.05 #0.1 -> accumulation time 10secs; 0.05 -> accumulation time 20secs; realistic; 0.2 -> accumulation time 5secs;
|
||||
@export var snow_melt_speed: float = 0.1
|
||||
@export var snow_color: Color = Color(0.9, 0.95, 1.0)
|
||||
@export var snow_mode_color: Color = Color(0.7, 0.75, 0.8, 1.0)
|
||||
|
||||
@export_group("Wind")
|
||||
@export var wind_amount: int = 100
|
||||
@export var wind_spawn_ray: float = 25.0
|
||||
@export var wind_spawn_height: float = 5.0
|
||||
@export var wind_direction: Vector2 = Vector2(0.5, 0.2)
|
||||
@export var wind_direction: Vector2 = Vector2(0.5, 0.4)
|
||||
@export var wind_speed: float = 0.2
|
||||
@export var wind_scale: float = 0.025
|
||||
@export var wind_strength: float = 0.6
|
||||
@export var cloud_scale: float = 0.5
|
||||
@export var cloud_speed: float = 0.05
|
||||
@export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.14
|
||||
@export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.01
|
||||
@export_range(0.01, 1.0) var cloud_speed_envshadows_rate: float = 0.5
|
||||
|
||||
@export_group("Fireflies")
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
[ext_resource type="Script" uid="uid://brcimd12tx3dm" path="res://core/daynight/edge_detection_compositor.gd" id="5_jgh18"]
|
||||
[ext_resource type="Script" uid="uid://cx2tlvxhvatj5" path="res://docs/museums/daynight/control.gd" id="6_q52t1"]
|
||||
[ext_resource type="Script" uid="uid://ccdd52apoh4ir" path="res://docs/museums/daynight/camera_3d.gd" id="7_p2t1d"]
|
||||
[ext_resource type="PackedScene" uid="uid://bonjxfjcdnntt" path="res://docs/museums/daynight/scenes/grain_test/grain_test.tscn" id="7_w3se4"]
|
||||
|
||||
[sub_resource type="FastNoiseLite" id="FastNoiseLite_jiovi"]
|
||||
fractal_lacunarity = 1.915
|
||||
@@ -207,20 +208,6 @@ offset_bottom = 190.0
|
||||
max_value = 1.0
|
||||
step = 0.01
|
||||
|
||||
[node name="FogOverlay" type="CheckButton" parent="Control" unique_id=1209829342]
|
||||
layout_mode = 0
|
||||
offset_left = 21.0
|
||||
offset_top = 222.0
|
||||
offset_right = 160.0
|
||||
offset_bottom = 253.0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_focus_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_hover_color = Color(0, 0, 0, 1)
|
||||
theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
|
||||
button_pressed = true
|
||||
text = "Fog Overlay"
|
||||
|
||||
[node name="Dust" type="CheckButton" parent="Control" unique_id=2023312048]
|
||||
layout_mode = 0
|
||||
offset_left = 21.0
|
||||
@@ -276,13 +263,17 @@ theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
|
||||
button_pressed = true
|
||||
text = "Shadows"
|
||||
|
||||
[node name="Scene" type="Node" parent="." unique_id=701973010]
|
||||
|
||||
[node name="Grain" parent="Scene" unique_id=838519336 instance=ExtResource("7_w3se4")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5548749, 0)
|
||||
|
||||
[connection signal="toggled" from="Control/Snow" to="Control" method="_on_snow_toggled"]
|
||||
[connection signal="toggled" from="Control/Rain" to="Control" method="_on_rain_toggled"]
|
||||
[connection signal="toggled" from="Control/Wind" to="Control" method="_on_wind_toggled"]
|
||||
[connection signal="toggled" from="Control/Fireflies" to="Control" method="_on_fireflies_toggled"]
|
||||
[connection signal="toggled" from="Control/Storm" to="Control" method="_on_storm_toggled"]
|
||||
[connection signal="value_changed" from="Control/DayTimeSlider" to="Control" method="_on_day_time_slider_value_changed"]
|
||||
[connection signal="toggled" from="Control/FogOverlay" to="Control" method="_on_fog_overlay_toggled"]
|
||||
[connection signal="toggled" from="Control/Dust" to="Control" method="_on_dust_toggled"]
|
||||
[connection signal="toggled" from="Control/Blur" to="Control" method="_on_blur_toggled"]
|
||||
[connection signal="toggled" from="Control/Pause" to="Control" method="_on_pause_toggled"]
|
||||
|
||||
23
docs/museums/daynight/scenes/grain_test/grain.tres
Normal file
23
docs/museums/daynight/scenes/grain_test/grain.tres
Normal file
@@ -0,0 +1,23 @@
|
||||
[gd_resource type="ShaderMaterial" format=3 uid="uid://2p8yqqg44ci3"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://cs0xl7pc6e26h" path="res://docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader" id="1_etun4"]
|
||||
[ext_resource type="Texture2D" uid="uid://c0lkmyonx88hc" path="res://docs/museums/daynight/scenes/grain_test/grass_thin.png" id="2_grain"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_etun4")
|
||||
shader_parameter/billboard_enabled = false
|
||||
shader_parameter/wind_enabled = true
|
||||
shader_parameter/base_color = Color(0.85, 0.75, 0.25, 1)
|
||||
shader_parameter/alpha_texture = ExtResource("2_grain")
|
||||
shader_parameter/leaves_scale = 1.0
|
||||
shader_parameter/rotation_degrees = 0.0
|
||||
shader_parameter/texture_offset = Vector2(0, 0)
|
||||
shader_parameter/opacity = 1.0
|
||||
shader_parameter/height_min = 0.0
|
||||
shader_parameter/height_max = 5.0
|
||||
shader_parameter/shadow_intensity = 0.5
|
||||
shader_parameter/highlight_intensity = 0.3
|
||||
shader_parameter/light_steps = 4.0
|
||||
shader_parameter/random_mix = 0.3
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
40
docs/museums/daynight/scenes/grain_test/grain_test.tscn
Normal file
40
docs/museums/daynight/scenes/grain_test/grain_test.tscn
Normal file
File diff suppressed because one or more lines are too long
BIN
docs/museums/daynight/scenes/grain_test/grass_thin.png
Normal file
BIN
docs/museums/daynight/scenes/grain_test/grass_thin.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,41 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c0lkmyonx88hc"
|
||||
path.s3tc="res://.godot/imported/grass_thin.png-bbc8bfd78fe08207b1371627bbac389f.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/museums/daynight/scenes/grain_test/grass_thin.png"
|
||||
dest_files=["res://.godot/imported/grass_thin.png-bbc8bfd78fe08207b1371627bbac389f.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
BIN
docs/museums/daynight/scenes/grain_test/leaf_test.png
Normal file
BIN
docs/museums/daynight/scenes/grain_test/leaf_test.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 185 KiB |
41
docs/museums/daynight/scenes/grain_test/leaf_test.png.import
Normal file
41
docs/museums/daynight/scenes/grain_test/leaf_test.png.import
Normal file
@@ -0,0 +1,41 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c3grftlmap4q5"
|
||||
path.s3tc="res://.godot/imported/leaf_test.png-d1eaefb043387a8e84dcfdb0070f4094.s3tc.ctex"
|
||||
metadata={
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/museums/daynight/scenes/grain_test/leaf_test.png"
|
||||
dest_files=["res://.godot/imported/leaf_test.png-d1eaefb043387a8e84dcfdb0070f4094.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=0
|
||||
24
docs/museums/daynight/scenes/grain_test/leaves2_mat.tres
Normal file
24
docs/museums/daynight/scenes/grain_test/leaves2_mat.tres
Normal file
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="ShaderMaterial" format=3 uid="uid://b1ej1sak6omli"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://co2jw3fnyc6aa" path="res://docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader" id="1_2uy3m"]
|
||||
[ext_resource type="Texture2D" uid="uid://b7sqjhecpoyoh" path="res://docs/museums/daynight/scenes/grain_test/leaf_test.png" id="2_2uy3m"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_2uy3m")
|
||||
shader_parameter/billboard_enabled = true
|
||||
shader_parameter/wind_enabled = true
|
||||
shader_parameter/base_color = Color(0.9549616, 0.54784274, 0.71385026, 1)
|
||||
shader_parameter/alpha_texture = ExtResource("2_2uy3m")
|
||||
shader_parameter/leaves_scale = 1.375
|
||||
shader_parameter/rotation_degrees = 180.0
|
||||
shader_parameter/texture_offset = Vector2(0, 0)
|
||||
shader_parameter/opacity = 1.0
|
||||
shader_parameter/snow_color = Color(0.85, 0.9, 0.95, 1)
|
||||
shader_parameter/height_min = 6.0
|
||||
shader_parameter/height_max = 11.0
|
||||
shader_parameter/shadow_intensity = 0.800000038
|
||||
shader_parameter/highlight_intensity = 0.0
|
||||
shader_parameter/light_steps = 10.0
|
||||
shader_parameter/random_mix = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.0
|
||||
24
docs/museums/daynight/scenes/grain_test/legno.tres
Normal file
24
docs/museums/daynight/scenes/grain_test/legno.tres
Normal file
@@ -0,0 +1,24 @@
|
||||
[gd_resource type="ShaderMaterial" format=3 uid="uid://b2lg2y1k7grmo"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://docs/museums/daynight/scenes/grain_test/trunk_shader.gdshader" id="1_yna88"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_yna88")
|
||||
shader_parameter/albedo_color = Color(0.46921068, 0.28503138, 0.05139889, 1)
|
||||
shader_parameter/use_texture = false
|
||||
shader_parameter/uv_scale = Vector2(1, 1)
|
||||
shader_parameter/palette_shift_y = 0.0
|
||||
shader_parameter/gradient_start_y = 0.0
|
||||
shader_parameter/gradient_end_y = 5.0
|
||||
shader_parameter/light_steps = 3.0
|
||||
shader_parameter/step_softness = 0.1
|
||||
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
|
||||
shader_parameter/shadow_offset = 0.0
|
||||
shader_parameter/cast_shadow_strength = 0.6
|
||||
shader_parameter/use_ghibli_glint = true
|
||||
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
|
||||
shader_parameter/glint_intensity = 1.0
|
||||
shader_parameter/glint_sharpness = 32.0
|
||||
shader_parameter/emission_color = Color(0, 0, 0, 1)
|
||||
shader_parameter/emission_energy = 0.0
|
||||
89
docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader
Normal file
89
docs/museums/daynight/scenes/grain_test/tree_leaves.gdshader
Normal file
@@ -0,0 +1,89 @@
|
||||
shader_type spatial;
|
||||
render_mode specular_disabled, cull_disabled, ambient_light_disabled;
|
||||
|
||||
global uniform float global_wind_speed;
|
||||
global uniform vec2 global_wind_direction;
|
||||
global uniform float global_wind_scale;
|
||||
global uniform float global_wind_strength;
|
||||
|
||||
uniform sampler2D wind_noise : filter_linear_mipmap;
|
||||
uniform bool billboard_enabled = true;
|
||||
uniform bool wind_enabled = true;
|
||||
uniform vec4 base_color : source_color = vec4(0.2, 0.6, 0.3, 1.0);
|
||||
uniform sampler2D alpha_texture : source_color, filter_nearest;
|
||||
uniform float leaves_scale = 1.0;
|
||||
uniform float rotation_degrees = 0.0;
|
||||
uniform vec2 texture_offset = vec2(0.0, 0.0);
|
||||
uniform float opacity : hint_range(0.0, 1.0) = 1.0;
|
||||
uniform float height_min = 0.0;
|
||||
uniform float height_max = 5.0;
|
||||
uniform float shadow_intensity : hint_range(0.0, 1.0) = 0.5;
|
||||
uniform float highlight_intensity : hint_range(0.0, 1.0) = 0.3;
|
||||
uniform float light_steps : hint_range(1.0, 10.0) = 4.0;
|
||||
uniform float random_mix : hint_range(0.0, 1.0) = 0.3;
|
||||
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
|
||||
|
||||
varying vec3 v_final_color;
|
||||
|
||||
float hash(vec3 p) {
|
||||
p = fract(p * 0.1031);
|
||||
p += dot(p, p.yzx + 33.33);
|
||||
return fract((p.x + p.y) * p.z);
|
||||
}
|
||||
|
||||
void vertex() {
|
||||
vec3 instance_pos = MODEL_MATRIX[3].xyz;
|
||||
|
||||
float total_angle = radians(rotation_degrees);
|
||||
if (wind_enabled) {
|
||||
float time = TIME * global_wind_speed;
|
||||
vec2 noise_uv = (instance_pos.xz * global_wind_scale) + (time * global_wind_direction * 0.5);
|
||||
float noise_val = textureLod(wind_noise, noise_uv, 2.0).r;
|
||||
float sway = sin(time + (noise_val * 10.0));
|
||||
total_angle += (sway * global_wind_strength);
|
||||
}
|
||||
|
||||
float h_factor = clamp((instance_pos.y - height_min) / (height_max - height_min), 0.0, 1.0);
|
||||
float leaf_rand = hash(instance_pos);
|
||||
float combined_factor = mix(h_factor, leaf_rand, random_mix);
|
||||
combined_factor = ceil(combined_factor * light_steps) / light_steps;
|
||||
|
||||
vec3 dark_color = base_color.rgb * (1.0 - shadow_intensity);
|
||||
vec3 light_color = base_color.rgb + (vec3(1.0) - base_color.rgb) * highlight_intensity;
|
||||
v_final_color = mix(dark_color, light_color, combined_factor);
|
||||
|
||||
if (billboard_enabled) {
|
||||
vec3 view_pos_origin = (VIEW_MATRIX * vec4(instance_pos, 1.0)).xyz;
|
||||
vec2 offset = (UV - 0.5) * leaves_scale;
|
||||
float c = cos(total_angle);
|
||||
float s = sin(total_angle);
|
||||
vec2 rotated_offset = vec2(offset.x * c - offset.y * s, offset.x * s + offset.y * c);
|
||||
|
||||
vec3 final_pos = view_pos_origin + vec3(rotated_offset.x, rotated_offset.y, 0.0);
|
||||
MODELVIEW_MATRIX = mat4(1.0);
|
||||
MODELVIEW_MATRIX[3].xyz = final_pos;
|
||||
VERTEX = vec3(0.0);
|
||||
} else {
|
||||
float c = cos(total_angle);
|
||||
float s = sin(total_angle);
|
||||
vec2 local_v = VERTEX.xy * leaves_scale;
|
||||
VERTEX.x = local_v.x * c - local_v.y * s;
|
||||
VERTEX.y = local_v.x * s + local_v.y * c;
|
||||
}
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
vec2 shifted_uv = UV + texture_offset;
|
||||
vec4 tex = texture(alpha_texture, shifted_uv);
|
||||
|
||||
ALBEDO = v_final_color;
|
||||
ALPHA = tex.r * opacity;
|
||||
ALPHA_SCISSOR_THRESHOLD = 0.5;
|
||||
ROUGHNESS = 0.02;
|
||||
}
|
||||
|
||||
void light() {
|
||||
float shadow_factor = mix(1.0 - cast_shadow_strength, 1.0, ATTENUATION);
|
||||
float cutoff_mask = smoothstep(0.0, 0.05, ATTENUATION);
|
||||
DIFFUSE_LIGHT += (shadow_factor * LIGHT_COLOR) * cutoff_mask;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://cs0xl7pc6e26h
|
||||
BIN
docs/museums/daynight/scenes/grain_test/tree_v1.fbx
Normal file
BIN
docs/museums/daynight/scenes/grain_test/tree_v1.fbx
Normal file
Binary file not shown.
44
docs/museums/daynight/scenes/grain_test/tree_v1.fbx.import
Normal file
44
docs/museums/daynight/scenes/grain_test/tree_v1.fbx.import
Normal file
@@ -0,0 +1,44 @@
|
||||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://e1an0215p6k2"
|
||||
path="res://.godot/imported/tree_v1.fbx-c4b0f4368c15e2a509a5e472fe4c861e.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://docs/museums/daynight/scenes/grain_test/tree_v1.fbx"
|
||||
dest_files=["res://.godot/imported/tree_v1.fbx-c4b0f4368c15e2a509a5e472fe4c861e.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/root_script=null
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
nodes/import_as_skeleton_bones=false
|
||||
nodes/use_name_suffixes=true
|
||||
nodes/use_node_type_suffixes=true
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=true
|
||||
animation/remove_immutable_tracks=true
|
||||
animation/import_rest_as_RESET=false
|
||||
import_script/path=""
|
||||
materials/extract=0
|
||||
materials/extract_format=0
|
||||
materials/extract_path=""
|
||||
_subresources={}
|
||||
fbx/importer=0
|
||||
fbx/allow_geometry_helper_nodes=false
|
||||
fbx/embedded_image_handling=1
|
||||
fbx/naming_version=2
|
||||
50
docs/museums/daynight/scenes/grain_test/tree_v1.tscn
Normal file
50
docs/museums/daynight/scenes/grain_test/tree_v1.tscn
Normal file
File diff suppressed because one or more lines are too long
103
docs/museums/daynight/scenes/grain_test/trunk_shader.gdshader
Normal file
103
docs/museums/daynight/scenes/grain_test/trunk_shader.gdshader
Normal file
@@ -0,0 +1,103 @@
|
||||
shader_type spatial;
|
||||
|
||||
render_mode diffuse_toon, specular_disabled, ambient_light_disabled;
|
||||
|
||||
group_uniforms Albedo_Settings;
|
||||
uniform vec4 albedo_color : source_color = vec4(1.0);
|
||||
uniform sampler2D albedo_texture : source_color, filter_nearest;
|
||||
uniform bool use_texture = true;
|
||||
uniform vec2 uv_scale = vec2(1.0, 1.0);
|
||||
uniform float palette_shift_y : hint_range(0.0, 1.0) = 0.0;
|
||||
|
||||
group_uniforms Height_Gradient;
|
||||
global uniform vec4 global_gradient_color_top;
|
||||
global uniform vec4 global_gradient_color_bot;
|
||||
global uniform float global_gradient_intensity;
|
||||
|
||||
uniform float gradient_start_y = 0.0;
|
||||
uniform float gradient_end_y = 10.0;
|
||||
|
||||
group_uniforms Toon_Lighting;
|
||||
uniform float light_steps : hint_range(1.0, 10.0, 1.0) = 3.0;
|
||||
uniform float step_softness : hint_range(0.01, 1.0) = 0.1;
|
||||
uniform vec4 shadow_color : source_color = vec4(0.4, 0.4, 0.6, 1.0);
|
||||
uniform float shadow_offset : hint_range(-1.0, 1.0) = 0.0;
|
||||
uniform float cast_shadow_strength : hint_range(0.0, 1.0) = 0.6;
|
||||
|
||||
// ---> NUOVO SISTEMA: GHIBLI DIRECTIONAL GLINT <---
|
||||
group_uniforms Ghibli_Directional_Glint;
|
||||
uniform bool use_ghibli_glint = true;
|
||||
// Colore del bagliore (consigliato: panna caldo o albicocca desaturato)
|
||||
uniform vec4 glint_color : source_color = vec4(1.0, 0.95, 0.85, 1.0);
|
||||
// Quanta luce extra vogliamo (es: 1.0 = colora, >1.0 = fa brillare, ideale per Bloom)
|
||||
uniform float glint_intensity : hint_range(0.0, 10.0) = 1.0;
|
||||
// DEFINIZIONE DELL'ANGOLO: Più è alto, più la fascia di luce è stretta e netta (HArd Step)
|
||||
uniform float glint_sharpness : hint_range(1.0, 128.0) = 32.0;
|
||||
|
||||
group_uniforms Emission_Settings;
|
||||
uniform vec4 emission_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
uniform float emission_energy : hint_range(0.0, 16.0) = 0.0;
|
||||
|
||||
varying float world_y;
|
||||
|
||||
void vertex() {
|
||||
world_y = (MODEL_MATRIX * vec4(VERTEX, 1.0)).y;
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
vec2 final_uv = (UV * uv_scale) + vec2(0.0, palette_shift_y);
|
||||
vec4 tex = texture(albedo_texture, final_uv);
|
||||
|
||||
vec3 base_color = albedo_color.rgb;
|
||||
if (use_texture) base_color *= tex.rgb;
|
||||
|
||||
float grad_factor = smoothstep(gradient_start_y, gradient_end_y, world_y);
|
||||
vec3 current_gradient_color = mix(global_gradient_color_bot.rgb, global_gradient_color_top.rgb, grad_factor);
|
||||
base_color = mix(base_color, current_gradient_color, global_gradient_intensity);
|
||||
|
||||
ALBEDO = base_color;
|
||||
EMISSION = emission_color.rgb * emission_energy;
|
||||
}
|
||||
|
||||
void light() {
|
||||
// GESTIONE ATTENUAZIONE E OMBRE (Anti-frittura con dither)
|
||||
float shadow_factor = mix(1.0 - cast_shadow_strength, 1.0, ATTENUATION);
|
||||
float cutoff_mask = smoothstep(0.0, 0.1, ATTENUATION);
|
||||
|
||||
float n_dot_l = dot(NORMAL, LIGHT);
|
||||
|
||||
// Anti-frittura dither
|
||||
float dither = fract(sin(dot(FRAGCOORD.xy, vec2(12.9898, 78.233))) * 43758.5453);
|
||||
float intensity = (clamp(n_dot_l, 0.0, 1.0) * shadow_factor) + (dither - 0.5) * 0.02;
|
||||
|
||||
float raw_step = (intensity + shadow_offset) * light_steps;
|
||||
float lower_step = floor(raw_step);
|
||||
float fract_step = fract(raw_step);
|
||||
float soft_lerp = smoothstep(0.5 - step_softness, 0.5 + step_softness, fract_step);
|
||||
float stepped_intensity = (lower_step + soft_lerp) / light_steps;
|
||||
|
||||
// Colori finali Toon
|
||||
vec3 light_color_final = mix(shadow_color.rgb, vec3(1.1), clamp(stepped_intensity, 0.0, 1.0));
|
||||
DIFFUSE_LIGHT += (light_color_final * LIGHT_COLOR) * cutoff_mask;
|
||||
|
||||
// ---> GHIBLI DIRECTIONAL GLINT (Il segreto dei tetti) <---
|
||||
// Sfrutta solo la direzione del sole e la normale dell'oggetto, NON la telecamera.
|
||||
if (use_ghibli_glint) {
|
||||
// Calcoliamo un'area di "massima luce" molto aggressiva rivolta perpendicolarmente al sole
|
||||
// Più 'glint_sharpness' è alto, più la fascia si stringe e diventa selettiva
|
||||
float glint_raw = pow(max(0.0, n_dot_l), glint_sharpness);
|
||||
|
||||
// Toon-ifichiamo l'area con un taglio netto ma pulito
|
||||
float glint_mask = smoothstep(0.5 - step_softness*0.5, 0.5 + step_softness*0.5, glint_raw);
|
||||
|
||||
// Mascheriamo per evitare che appaia nelle ombre proiettate dagli alberi (ATTENUATION)
|
||||
// e puliamo i bordi laterali (cutoff a 0.0)
|
||||
glint_mask *= smoothstep(0.0, 0.1, n_dot_l);
|
||||
|
||||
// Calcoliamo la luce extra finale
|
||||
vec3 extra_sun_glint = glint_mask * glint_color.rgb * LIGHT_COLOR * glint_intensity * ATTENUATION;
|
||||
|
||||
// Aggiungiamo questa "botta" di luce extra direzionale
|
||||
DIFFUSE_LIGHT += extra_sun_glint;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://d0ch5ofrgf7y6
|
||||
@@ -26,6 +26,11 @@ window/size/viewport_height=1080
|
||||
window/stretch/mode="canvas_items"
|
||||
window/stretch/aspect="expand"
|
||||
|
||||
[global_group]
|
||||
|
||||
wind_materials="Materials to apply wind"
|
||||
snow_materials=""
|
||||
|
||||
[physics]
|
||||
|
||||
3d/physics_engine="Jolt Physics"
|
||||
@@ -54,3 +59,43 @@ global_snow_amount={
|
||||
"type": "float",
|
||||
"value": 0.0
|
||||
}
|
||||
global_wind_speed={
|
||||
"type": "float",
|
||||
"value": 0.075
|
||||
}
|
||||
global_wind_direction={
|
||||
"type": "vec2",
|
||||
"value": Vector2(0.5, 0.2)
|
||||
}
|
||||
global_wind_scale={
|
||||
"type": "float",
|
||||
"value": 0.025
|
||||
}
|
||||
global_wind_strength={
|
||||
"type": "float",
|
||||
"value": 0.8
|
||||
}
|
||||
global_snow_threshold={
|
||||
"type": "float",
|
||||
"value": 0.0
|
||||
}
|
||||
global_snow_color={
|
||||
"type": "color",
|
||||
"value": Color(0.9309246, 0.95468724, 0.9776916, 1)
|
||||
}
|
||||
global_snow_start_time={
|
||||
"type": "float",
|
||||
"value": -1.0
|
||||
}
|
||||
global_snow_accumulation_speed={
|
||||
"type": "float",
|
||||
"value": 0.05
|
||||
}
|
||||
global_snow_melt_time={
|
||||
"type": "float",
|
||||
"value": -1.0
|
||||
}
|
||||
global_snow_melt_speed={
|
||||
"type": "float",
|
||||
"value": 0.0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user