победа над водопадами, шейдеры m2
This commit is contained in:
@@ -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())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user