diff --git a/maps/basic_setup.tscn b/maps/basic_setup.tscn index 5bcfa87..dbf556f 100644 --- a/maps/basic_setup.tscn +++ b/maps/basic_setup.tscn @@ -1,6 +1,7 @@ [gd_scene load_steps=22 format=3 uid="uid://b8p2h0rmwy7qn"] [ext_resource type="Material" uid="uid://dpegsmygxcfmv" path="res://maps/materials/basic_ground.material" id="1_lodye"] +[ext_resource type="Shader" path="res://maps/shaders/khanat_sky.gdshader" id="1_mheqi"] [ext_resource type="Texture2D" uid="uid://b5jer2nm17ld" path="res://maps/textures/samayun_tex_001.png" id="1_thm7k"] [ext_resource type="PackedScene" uid="uid://cveshwnu272vf" path="res://maps/objects/ramp-complex.tscn" id="2_4eueh"] [ext_resource type="PackedScene" uid="uid://omess6wwwwcq" path="res://maps/objects/ramp-moving.tscn" id="3_bvbgo"] @@ -16,126 +17,8 @@ [ext_resource type="PackedScene" uid="uid://bfo13c5k8xu0x" path="res://maps/natural_ground.tscn" id="12_r7x73"] [ext_resource type="PackedScene" uid="uid://mdsxnqsijdqv" path="res://maps/dispensaire_01.tscn" id="13_ald41"] -[sub_resource type="Shader" id="Shader_av6ac"] -code = " -// NOTE: Shader automatically converted from Godot Engine 4.0.alpha5's PhysicalSkyMaterial. - -shader_type sky; - -uniform float rayleigh : hint_range(0, 64) = 2.0; -uniform vec4 rayleigh_color : hint_color = vec4(0.3, 0.405, 0.6, 1.0); -uniform float mie : hint_range(0, 1) = 0.005; -uniform float mie_eccentricity : hint_range(-1, 1) = 0.8; -uniform vec4 mie_color : hint_color = vec4(0.69, 0.729, 0.812, 1.0); - -uniform float turbidity : hint_range(0, 1000) = 10.0; -uniform float sun_disk_scale : hint_range(0, 360) = 1.0; -uniform vec4 ground_color : hint_color = vec4(0.1, 0.07, 0.034, 1.0); -uniform float exposure : hint_range(0, 128) = 0.1; -uniform float dither_strength : hint_range(0, 10) = 1.0; - -uniform sampler2D night_sky : hint_black_albedo; - -uniform sampler2D samayun : hint_albedo; -uniform float samayun_scale : hint_range(0, 1.0) = 0.25; -uniform vec3 samayun_position = vec3( 0.0, 0.5, 0.0 ); - -const vec3 UP = vec3( 0.0, 1.0, 0.0 ); - -// Sun constants -const float SUN_ENERGY = 1000.0; - -// Optical length at zenith for molecules. -const float rayleigh_zenith_size = 8.4e3; -const float mie_zenith_size = 1.25e3; - -float henyey_greenstein(float cos_theta, float g) { - const float k = 0.0795774715459; - return k * (1.0 - g * g) / (pow(1.0 + g * g - 2.0 * g * cos_theta, 1.5)); -} - -// From: https://www.shadertoy.com/view/4sfGzS credit to iq -float hash(vec3 p) { - p = fract( p * 0.3183099 + 0.1 ); - p *= 17.0; - return fract(p.x * p.y * p.z * (p.x + p.y + p.z)); -} - - - -void sky() { - if (LIGHT0_ENABLED) { - float zenith_angle = clamp( dot(UP, normalize(LIGHT0_DIRECTION)), -1.0, 1.0 ); - float sun_energy = max(0.0, 1.0 - exp(-((PI * 0.5) - acos(zenith_angle)))) * SUN_ENERGY * LIGHT0_ENERGY; - float sun_fade = 1.0 - clamp(1.0 - exp(LIGHT0_DIRECTION.y), 0.0, 1.0); - - // Rayleigh coefficients. - float rayleigh_coefficient = rayleigh - ( 1.0 * ( 1.0 - sun_fade ) ); - vec3 rayleigh_beta = rayleigh_coefficient * rayleigh_color.rgb * 0.0001; - // mie coefficients from Preetham - vec3 mie_beta = turbidity * mie * mie_color.rgb * 0.000434; - - // Optical length. - float zenith = acos(max(0.0, dot(UP, EYEDIR))); - float optical_mass = 1.0 / (cos(zenith) + 0.15 * pow(93.885 - degrees(zenith), -1.253)); - float rayleigh_scatter = rayleigh_zenith_size * optical_mass; - float mie_scatter = mie_zenith_size * optical_mass; - - // Light extinction based on thickness of atmosphere. - vec3 extinction = exp(-(rayleigh_beta * rayleigh_scatter + mie_beta * mie_scatter)); - - // In scattering. - float cos_theta = dot(EYEDIR, normalize(LIGHT0_DIRECTION)); - - float rayleigh_phase = (3.0 / (16.0 * PI)) * (1.0 + pow(cos_theta * 0.5 + 0.5, 2.0)); - vec3 betaRTheta = rayleigh_beta * rayleigh_phase; - - float mie_phase = henyey_greenstein(cos_theta, mie_eccentricity); - vec3 betaMTheta = mie_beta * mie_phase; - - vec3 Lin = pow(sun_energy * ((betaRTheta + betaMTheta) / (rayleigh_beta + mie_beta)) * (1.0 - extinction), vec3(1.5)); - // Hack from https://github.com/mrdoob/three.js/blob/master/examples/jsm/objects/Sky.js - Lin *= mix(vec3(1.0), pow(sun_energy * ((betaRTheta + betaMTheta) / (rayleigh_beta + mie_beta)) * extinction, vec3(0.5)), clamp(pow(1.0 - zenith_angle, 5.0), 0.0, 1.0)); - - // Hack in the ground color. - Lin *= mix(ground_color.rgb, vec3(1.0), smoothstep(-0.1, 0.1, dot(UP, EYEDIR))); - - // Solar disk and out-scattering. - float sunAngularDiameterCos = cos(LIGHT0_SIZE * sun_disk_scale); - float sunAngularDiameterCos2 = cos(LIGHT0_SIZE * sun_disk_scale*0.5); - float sundisk = smoothstep(sunAngularDiameterCos, sunAngularDiameterCos2, cos_theta); - vec3 L0 = (sun_energy * 1900.0 * extinction) * sundisk * LIGHT0_COLOR; - L0 += texture(night_sky, SKY_COORDS).xyz * extinction; - - vec3 color = (Lin + L0) * 0.04; - COLOR = pow(color, vec3(1.0 / (1.2 + (1.2 * sun_fade)))); - COLOR *= exposure; - // Make optional, eliminates banding. - COLOR += (hash(EYEDIR * 1741.9782) * 0.08 - 0.04) * 0.016 * dither_strength; - } else { - // There is no sun, so display night_sky and nothing else. - COLOR = texture(night_sky, SKY_COORDS).xyz * 0.04; - COLOR *= exposure; - } -// vec2 samayun_uv = uv_moon(samayun_position, samayun_scale, SKY_COORDS); -// COLOR += texture(samayun, samayun_uv).rgb; - if (length(EYEDIR - normalize(samayun_position)) < 0.5 ) { // we are in the area of the sky where samayun is placed - //We define a local plane tangent to the skydome at samayun_position - //We work with everything normalized - vec3 n1 = normalize(cross(samayun_position,vec3(0,1,0))); - vec3 n2 = normalize(cross(samayun_position,n1)); - //We project EYEDIR on this plane - float x = dot(EYEDIR,n1) ; - float y = dot(EYEDIR,n2) ; - - COLOR += texture(samayun, vec2(x,y)+vec2(0.5)).rgb; - //COLOR = mix(COLOR, texture(samayun, vec2(x,y)+vec2(0.5)).rgb, clamp (samayun_position.y, 0.0, 1.0)) ; - } -} -" - [sub_resource type="ShaderMaterial" id="ShaderMaterial_s2q0l"] -shader = SubResource( "Shader_av6ac" ) +shader = ExtResource( "1_mheqi" ) shader_param/rayleigh = 2.0 shader_param/rayleigh_color = Color(0.3, 0.405, 0.6, 1) shader_param/mie = 0.005 @@ -147,7 +30,7 @@ shader_param/ground_color = Color(0.1, 0.07, 0.034, 1) shader_param/exposure = 0.1 shader_param/dither_strength = 1.0 shader_param/samayun_scale = 0.201 -shader_param/samayun_position = Vector3(0.226, 0.161, 0.065) +shader_param/samayun_position = Vector3(1.269, 0.931, -0.345) shader_param/samayun = ExtResource( "1_thm7k" ) [sub_resource type="Sky" id="Sky_fa16p"] diff --git a/maps/shaders/khanat_sky.gdshader b/maps/shaders/khanat_sky.gdshader new file mode 100644 index 0000000..1185fec --- /dev/null +++ b/maps/shaders/khanat_sky.gdshader @@ -0,0 +1,115 @@ + +// NOTE: Shader automatically converted from Godot Engine 4.0.alpha5's PhysicalSkyMaterial. + +shader_type sky; + +uniform float rayleigh : hint_range(0, 64) = 2.0; +uniform vec4 rayleigh_color : hint_color = vec4(0.3, 0.405, 0.6, 1.0); +uniform float mie : hint_range(0, 1) = 0.005; +uniform float mie_eccentricity : hint_range(-1, 1) = 0.8; +uniform vec4 mie_color : hint_color = vec4(0.69, 0.729, 0.812, 1.0); + +uniform float turbidity : hint_range(0, 1000) = 10.0; +uniform float sun_disk_scale : hint_range(0, 360) = 1.0; +uniform vec4 ground_color : hint_color = vec4(0.1, 0.07, 0.034, 1.0); +uniform float exposure : hint_range(0, 128) = 0.1; +uniform float dither_strength : hint_range(0, 10) = 1.0; + +uniform sampler2D night_sky : hint_black_albedo; + +uniform sampler2D samayun : hint_albedo; +uniform float samayun_scale : hint_range(0, 1.0) = 0.25; +uniform vec3 samayun_position = vec3( 0.0, 0.5, 0.0 ); + +const vec3 UP = vec3( 0.0, 1.0, 0.0 ); + +// Sun constants +const float SUN_ENERGY = 1000.0; + +// Optical length at zenith for molecules. +const float rayleigh_zenith_size = 8.4e3; +const float mie_zenith_size = 1.25e3; + +float henyey_greenstein(float cos_theta, float g) { + const float k = 0.0795774715459; + return k * (1.0 - g * g) / (pow(1.0 + g * g - 2.0 * g * cos_theta, 1.5)); +} + +// From: https://www.shadertoy.com/view/4sfGzS credit to iq +float hash(vec3 p) { + p = fract( p * 0.3183099 + 0.1 ); + p *= 17.0; + return fract(p.x * p.y * p.z * (p.x + p.y + p.z)); +} + + + +void sky() { + if (LIGHT0_ENABLED) { + float zenith_angle = clamp( dot(UP, normalize(LIGHT0_DIRECTION)), -1.0, 1.0 ); + float sun_energy = max(0.0, 1.0 - exp(-((PI * 0.5) - acos(zenith_angle)))) * SUN_ENERGY * LIGHT0_ENERGY; + float sun_fade = 1.0 - clamp(1.0 - exp(LIGHT0_DIRECTION.y), 0.0, 1.0); + + // Rayleigh coefficients. + float rayleigh_coefficient = rayleigh - ( 1.0 * ( 1.0 - sun_fade ) ); + vec3 rayleigh_beta = rayleigh_coefficient * rayleigh_color.rgb * 0.0001; + // mie coefficients from Preetham + vec3 mie_beta = turbidity * mie * mie_color.rgb * 0.000434; + + // Optical length. + float zenith = acos(max(0.0, dot(UP, EYEDIR))); + float optical_mass = 1.0 / (cos(zenith) + 0.15 * pow(93.885 - degrees(zenith), -1.253)); + float rayleigh_scatter = rayleigh_zenith_size * optical_mass; + float mie_scatter = mie_zenith_size * optical_mass; + + // Light extinction based on thickness of atmosphere. + vec3 extinction = exp(-(rayleigh_beta * rayleigh_scatter + mie_beta * mie_scatter)); + + // In scattering. + float cos_theta = dot(EYEDIR, normalize(LIGHT0_DIRECTION)); + + float rayleigh_phase = (3.0 / (16.0 * PI)) * (1.0 + pow(cos_theta * 0.5 + 0.5, 2.0)); + vec3 betaRTheta = rayleigh_beta * rayleigh_phase; + + float mie_phase = henyey_greenstein(cos_theta, mie_eccentricity); + vec3 betaMTheta = mie_beta * mie_phase; + + vec3 Lin = pow(sun_energy * ((betaRTheta + betaMTheta) / (rayleigh_beta + mie_beta)) * (1.0 - extinction), vec3(1.5)); + // Hack from https://github.com/mrdoob/three.js/blob/master/examples/jsm/objects/Sky.js + Lin *= mix(vec3(1.0), pow(sun_energy * ((betaRTheta + betaMTheta) / (rayleigh_beta + mie_beta)) * extinction, vec3(0.5)), clamp(pow(1.0 - zenith_angle, 5.0), 0.0, 1.0)); + + // Hack in the ground color. + Lin *= mix(ground_color.rgb, vec3(1.0), smoothstep(-0.1, 0.1, dot(UP, EYEDIR))); + + // Solar disk and out-scattering. + float sunAngularDiameterCos = cos(LIGHT0_SIZE * sun_disk_scale); + float sunAngularDiameterCos2 = cos(LIGHT0_SIZE * sun_disk_scale*0.5); + float sundisk = smoothstep(sunAngularDiameterCos, sunAngularDiameterCos2, cos_theta); + vec3 L0 = (sun_energy * 1900.0 * extinction) * sundisk * LIGHT0_COLOR; + L0 += texture(night_sky, SKY_COORDS).xyz * extinction; + + vec3 color = (Lin + L0) * 0.04; + COLOR = pow(color, vec3(1.0 / (1.2 + (1.2 * sun_fade)))); + COLOR *= exposure; + // Make optional, eliminates banding. + COLOR += (hash(EYEDIR * 1741.9782) * 0.08 - 0.04) * 0.016 * dither_strength; + } else { + // There is no sun, so display night_sky and nothing else. + COLOR = texture(night_sky, SKY_COORDS).xyz * 0.04; + COLOR *= exposure; + } +// vec2 samayun_uv = uv_moon(samayun_position, samayun_scale, SKY_COORDS); +// COLOR += texture(samayun, samayun_uv).rgb; + if (length(EYEDIR - normalize(samayun_position)) < 0.5 ) { // we are in the area of the sky where samayun is placed + //We define a local plane tangent to the skydome at samayun_position + //We work with everything normalized + vec3 n1 = normalize(cross(samayun_position,vec3(0,1,0))); + vec3 n2 = normalize(cross(samayun_position,n1)); + //We project EYEDIR on this plane + float x = dot(EYEDIR,n1) ; + float y = dot(EYEDIR,n2) ; + + COLOR += texture(samayun, vec2(x,y)+vec2(0.5)).rgb * texture(samayun, vec2(x,y)+vec2(0.5)).a; + //COLOR = mix(COLOR, texture(samayun, vec2(x,y)+vec2(0.5)).rgb, clamp (samayun_position.y, 0.0, 1.0)) ; + } +} diff --git a/maps/textures/samayun_tex_001.png b/maps/textures/samayun_tex_001.png new file mode 100644 index 0000000..abfa108 Binary files /dev/null and b/maps/textures/samayun_tex_001.png differ diff --git a/maps/textures/samayun_tex_001.png.import b/maps/textures/samayun_tex_001.png.import new file mode 100644 index 0000000..d120c63 --- /dev/null +++ b/maps/textures/samayun_tex_001.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5jer2nm17ld" +path.s3tc="res://.godot/imported/samayun_tex_001.png-4e3e72c86a1ead24f9cc9afcb2d3aafa.s3tc.ctex" +path.etc2="res://.godot/imported/samayun_tex_001.png-4e3e72c86a1ead24f9cc9afcb2d3aafa.etc2.ctex" +metadata={ +"imported_formats": ["s3tc", "etc2"], +"vram_texture": true +} + +[deps] + +source_file="res://maps/textures/samayun_tex_001.png" +dest_files=["res://.godot/imported/samayun_tex_001.png-4e3e72c86a1ead24f9cc9afcb2d3aafa.s3tc.ctex", "res://.godot/imported/samayun_tex_001.png-4e3e72c86a1ead24f9cc9afcb2d3aafa.etc2.ctex"] + +[params] + +compress/mode=2 +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/bptc_ldr=0 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/size_limit=0 +detect_3d/compress_to=0