победа над водопадами, шейдеры m2

This commit is contained in:
2026-07-07 10:45:43 +04:00
parent 8738c2495d
commit 44614a79e4
38 changed files with 4820 additions and 192 deletions
+51
View File
@@ -95,11 +95,13 @@ var _active_skybox_node: Node3D
var _last_logged_area_id := -1
var _last_logged_zone_id := -1
var _last_logged_profile_signature := ""
var _last_global_light_signature := ""
func _ready() -> void:
_resolve_nodes()
_prepare_environment()
_ensure_wow_shader_globals()
_loaded = _load_lighting_dbcs()
if _loaded:
print("WowSkyController: loaded %d LightParams profiles, %d area records and %d %s light volumes" % [
@@ -271,6 +273,43 @@ func _apply_sky(delta: float) -> void:
_sun.light_energy = lerpf(_sun.light_energy, clamp(_color_luma(diffuse) * lerpf(0.22, 1.45, sun_elevation), 0.05, 1.6), blend)
_apply_sun_direction(time_hours)
_update_wow_shader_globals(sun_elevation)
func _ensure_wow_shader_globals() -> void:
pass
func _update_wow_shader_globals(sun_elevation: float) -> void:
if not _environment:
return
var light_dir := Vector3(-0.35, 0.82, -0.45).normalized()
if _sun:
light_dir = -_sun.global_transform.basis.z.normalized()
var fog_range := Vector2(_environment.fog_depth_begin, _environment.fog_depth_end)
var raw_light: Color = _sun.light_color if _sun else Color(1.0, 0.91, 0.78, 1.0)
var shader_ambient := _world_shader_color(_environment.ambient_light_color, 0.65, Color(0.72, 0.70, 0.64, 1.0), 0.22)
var shader_light := _world_shader_color(raw_light, 0.45, Color(1.0, 0.92, 0.78, 1.0), 0.16)
var shader_fog := _world_shader_color(_environment.fog_light_color, 0.75, Color(0.62, 0.66, 0.66, 1.0), 0.38)
var density: float = clampf(_environment.fog_density * 2200.0, 0.0, 0.42)
var signature := "%s|%s|%s|%s|%.4f|%.3f" % [
str(shader_ambient),
str(shader_light),
str(light_dir.snapped(Vector3(0.001, 0.001, 0.001))),
str(fog_range.snapped(Vector2(1.0, 1.0))),
density,
sun_elevation]
if signature == _last_global_light_signature:
return
_last_global_light_signature = signature
RenderingServer.global_shader_parameter_set(&"wow_ambient_color", shader_ambient)
RenderingServer.global_shader_parameter_set(&"wow_light_color", shader_light)
RenderingServer.global_shader_parameter_set(&"wow_light_dir", light_dir)
RenderingServer.global_shader_parameter_set(&"wow_fog_color", shader_fog)
RenderingServer.global_shader_parameter_set(&"wow_fog_range", fog_range)
RenderingServer.global_shader_parameter_set(&"wow_fog_density", density)
RenderingServer.global_shader_parameter_set(&"wow_sun_elevation", sun_elevation)
func _load_lighting_dbcs() -> bool:
var base := _res_path(extracted_dir).path_join("DBFilesClient")
@@ -860,6 +899,18 @@ func _color_luma(color: Color) -> float:
return color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722
func _world_shader_color(color: Color, desaturate: float, neutral: Color, neutral_mix: float) -> Color:
var luma := clampf(_color_luma(color), 0.0, 1.25)
var gray := Color(luma, luma, luma, color.a)
var result := color.lerp(gray, clampf(desaturate, 0.0, 1.0))
result = result.lerp(neutral, clampf(neutral_mix, 0.0, 1.0))
return Color(
clampf(result.r, 0.0, 1.25),
clampf(result.g, 0.0, 1.25),
clampf(result.b, 0.0, 1.25),
color.a)
func _get_light_volume_count(id: int) -> int:
return int((_light_volumes_by_map.get(id, []) as Array).size())