From 721d3f071695ef86a20effb7d9207ef95555dc5c Mon Sep 17 00:00:00 2001 From: anyreso Date: Thu, 19 Feb 2026 13:36:22 -0500 Subject: [PATCH] upgrade sky_3d --- .../sky_3d/assets/textures/SkyIcon.png.import | 6 + .../sky_3d/assets/textures/noise.jpg.import | 6 + .../sky_3d/assets/textures/noise2.png.import | 6 + .../assets/textures/noiseClouds.png.import | 6 + .../textures/milkyway/Milkyway.jpg.import | 6 + .../textures/milkyway/StarField.jpg.import | 6 + .../textures/moon/MoonMap.png.import | 6 + addons/sky_3d/shaders/AtmFog.gdshader.uid | 2 +- addons/sky_3d/shaders/CloudsCumulus.gdshader | 8 +- .../sky_3d/shaders/CloudsCumulus.gdshader.uid | 2 +- addons/sky_3d/shaders/PerVertexSky.gdshader | 18 +- .../sky_3d/shaders/PerVertexSky.gdshader.uid | 2 +- addons/sky_3d/shaders/SimpleMoon.gdshader.uid | 2 +- addons/sky_3d/shaders/Sky.gdshader | 64 ++- addons/sky_3d/shaders/Sky.gdshader.uid | 2 +- addons/sky_3d/src/DateTimeUtil.gd.uid | 2 +- addons/sky_3d/src/OrbitalElements.gd.uid | 2 +- addons/sky_3d/src/Plugin.gd.uid | 2 +- addons/sky_3d/src/ScatterLib.gd.uid | 2 +- addons/sky_3d/src/Sky3D.gd | 440 ++++++------------ addons/sky_3d/src/Sky3D.gd.uid | 2 +- addons/sky_3d/src/Skydome.gd | 316 ++++++------- addons/sky_3d/src/Skydome.gd.uid | 2 +- addons/sky_3d/src/TOD_Math.gd | 2 +- addons/sky_3d/src/TOD_Math.gd.uid | 2 +- addons/sky_3d/src/TimeOfDay.gd | 300 ++++++------ addons/sky_3d/src/TimeOfDay.gd.uid | 2 +- 27 files changed, 561 insertions(+), 655 deletions(-) diff --git a/addons/sky_3d/assets/textures/SkyIcon.png.import b/addons/sky_3d/assets/textures/SkyIcon.png.import index 5e9c96c..54fd5db 100644 --- a/addons/sky_3d/assets/textures/SkyIcon.png.import +++ b/addons/sky_3d/assets/textures/SkyIcon.png.import @@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/SkyIcon.png-7b3cbfa68354965cdbfdba8b95dacf67. compress/mode=0 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 @@ -25,6 +27,10 @@ mipmaps/generate=false 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 diff --git a/addons/sky_3d/assets/textures/noise.jpg.import b/addons/sky_3d/assets/textures/noise.jpg.import index 0b2a782..33403cd 100644 --- a/addons/sky_3d/assets/textures/noise.jpg.import +++ b/addons/sky_3d/assets/textures/noise.jpg.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/noise.jpg-b47d5d36d9abfdaec2a09c140a78ba24.s3 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 @@ -26,6 +28,10 @@ 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 diff --git a/addons/sky_3d/assets/textures/noise2.png.import b/addons/sky_3d/assets/textures/noise2.png.import index cfdee0a..2b7a396 100644 --- a/addons/sky_3d/assets/textures/noise2.png.import +++ b/addons/sky_3d/assets/textures/noise2.png.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/noise2.png-37a5cbd5451b4b9c2c18ab32099e6965.s 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 @@ -26,6 +28,10 @@ mipmaps/generate=false 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 diff --git a/addons/sky_3d/assets/textures/noiseClouds.png.import b/addons/sky_3d/assets/textures/noiseClouds.png.import index 75c7159..075e11f 100644 --- a/addons/sky_3d/assets/textures/noiseClouds.png.import +++ b/addons/sky_3d/assets/textures/noiseClouds.png.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/noiseClouds.png-07511094ef8b72a49cc860b35c60d 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 @@ -26,6 +28,10 @@ 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 diff --git a/addons/sky_3d/assets/thirdparty/textures/milkyway/Milkyway.jpg.import b/addons/sky_3d/assets/thirdparty/textures/milkyway/Milkyway.jpg.import index 45c6d1d..087ec05 100644 --- a/addons/sky_3d/assets/thirdparty/textures/milkyway/Milkyway.jpg.import +++ b/addons/sky_3d/assets/thirdparty/textures/milkyway/Milkyway.jpg.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/Milkyway.jpg-a06044e407cf6953ab6e46a2f0f17f3a 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 @@ -26,6 +28,10 @@ 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 diff --git a/addons/sky_3d/assets/thirdparty/textures/milkyway/StarField.jpg.import b/addons/sky_3d/assets/thirdparty/textures/milkyway/StarField.jpg.import index 4053f5c..43ee13a 100644 --- a/addons/sky_3d/assets/thirdparty/textures/milkyway/StarField.jpg.import +++ b/addons/sky_3d/assets/thirdparty/textures/milkyway/StarField.jpg.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/StarField.jpg-9d224e20fcbe8fdc7ff5028dae26983 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 @@ -26,6 +28,10 @@ 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 diff --git a/addons/sky_3d/assets/thirdparty/textures/moon/MoonMap.png.import b/addons/sky_3d/assets/thirdparty/textures/moon/MoonMap.png.import index cff29f1..337c3ba 100644 --- a/addons/sky_3d/assets/thirdparty/textures/moon/MoonMap.png.import +++ b/addons/sky_3d/assets/thirdparty/textures/moon/MoonMap.png.import @@ -19,6 +19,8 @@ dest_files=["res://.godot/imported/MoonMap.png-81d542c3fafff4e5b235a177af6f3221. 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 @@ -26,6 +28,10 @@ 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 diff --git a/addons/sky_3d/shaders/AtmFog.gdshader.uid b/addons/sky_3d/shaders/AtmFog.gdshader.uid index fa57e61..f4a771f 100644 --- a/addons/sky_3d/shaders/AtmFog.gdshader.uid +++ b/addons/sky_3d/shaders/AtmFog.gdshader.uid @@ -1 +1 @@ -uid://bw2jsmvl58av6 +uid://dloe2lwoavad0 diff --git a/addons/sky_3d/shaders/CloudsCumulus.gdshader b/addons/sky_3d/shaders/CloudsCumulus.gdshader index 34d511a..fb679f0 100644 --- a/addons/sky_3d/shaders/CloudsCumulus.gdshader +++ b/addons/sky_3d/shaders/CloudsCumulus.gdshader @@ -15,8 +15,8 @@ uniform float _clouds_noise_freq; uniform float _clouds_sky_tint_fade; uniform float _clouds_intensity; uniform float _clouds_size; -uniform float _clouds_speed; -uniform vec3 _clouds_direction; +uniform float _clouds_offset_speed; +uniform vec3 _clouds_offset; uniform sampler2D _clouds_texture; uniform vec4 _clouds_day_color: source_color; @@ -88,7 +88,7 @@ float remap(float value, float fromMin, float fromMax, float toMin, float toMax) } float cloudsDensity(vec3 p, vec3 offset, float t){ - vec3 pos = p * 0.0212242 - offset; + vec3 pos = p * 0.0212242 + offset; float dens = noiseCloudsFBM(pos, _clouds_noise_freq); dens += dens; @@ -131,7 +131,7 @@ float miePhase(float mu, vec3 partial){ vec4 renderClouds2(vec3 ro, vec3 rd, float tm, float am){ vec4 ret = vec4(0, 0, 0, 0); - vec3 wind = _clouds_direction * (tm * _clouds_speed); + vec3 wind = _clouds_offset * (tm * _clouds_offset_speed); float a = 0.0; // n and tt doesnt need to be initialized since it would be set by IntersectSphere diff --git a/addons/sky_3d/shaders/CloudsCumulus.gdshader.uid b/addons/sky_3d/shaders/CloudsCumulus.gdshader.uid index ca6875b..ccb1b81 100644 --- a/addons/sky_3d/shaders/CloudsCumulus.gdshader.uid +++ b/addons/sky_3d/shaders/CloudsCumulus.gdshader.uid @@ -1 +1 @@ -uid://cpurajoc7on7d +uid://bfhgghs02klx1 diff --git a/addons/sky_3d/shaders/PerVertexSky.gdshader b/addons/sky_3d/shaders/PerVertexSky.gdshader index 91e0d3a..c0bdcf5 100644 --- a/addons/sky_3d/shaders/PerVertexSky.gdshader +++ b/addons/sky_3d/shaders/PerVertexSky.gdshader @@ -64,8 +64,8 @@ uniform float _clouds_sky_tint_fade; uniform float _clouds_intensity; uniform float _clouds_size; uniform vec2 _clouds_uv; -uniform float _clouds_speed; -uniform vec2 _clouds_direction; +uniform float _clouds_offset_speed; +uniform vec2 _clouds_offset; uniform vec4 _clouds_day_color: source_color; uniform vec4 _clouds_horizon_light_color: source_color; uniform vec4 _clouds_night_color: source_color; @@ -186,11 +186,8 @@ vec3 atmosphericScattering(float sr, float sm, vec2 mu, vec3 mult){ // Clouds //------------------------------------------------------------------------------ float noiseClouds(vec2 coords, vec2 offset){ - float speed = TIME * _clouds_speed * .5; // .5 matches cumulus clouds - vec2 wind = offset * speed; - vec2 wind2 = (offset + offset) * speed; - float a = textureLod(_clouds_texture, coords.xy * _clouds_uv - wind, 0.0).r; - float b = textureLod(_clouds_texture, coords.xy * _clouds_uv - wind2, 0.0).r; + float a = textureLod(_clouds_texture, coords.xy * _clouds_uv + offset.x, 0.0).r; + float b = textureLod(_clouds_texture, coords.xy * _clouds_uv + offset.y, 0.0).r; return ((a + b) * 0.5); } @@ -201,10 +198,11 @@ float cloudsDensity(vec2 p, vec2 offset){ return saturate(d); } -vec4 renderClouds(vec3 pos){ +vec4 renderClouds(vec3 pos, float tm){ pos.xy = pos.xz / pos.y; pos *= _clouds_size; - float density = cloudsDensity(pos.xy, _clouds_direction); + vec2 wind = _clouds_offset.xy * (tm * _clouds_offset_speed); + float density = cloudsDensity(pos.xy, wind); float sh = saturate(exp(-_clouds_absorption * density)); float a = saturate(density * _clouds_thickness); return vec4(vec3(density*sh) * _clouds_intensity, a); @@ -284,7 +282,7 @@ void fragment(){ col.rgb += deepSpace.rgb * horizonBlend; // Clouds - vec4 clouds = renderClouds(cloudsPos); + vec4 clouds = renderClouds(cloudsPos, TIME); clouds.a = saturate(clouds.a); clouds.rgb *= mix(mix(_clouds_day_color.rgb, _clouds_horizon_light_color.rgb, angle_mult.x), _clouds_night_color.rgb, angle_mult.w); diff --git a/addons/sky_3d/shaders/PerVertexSky.gdshader.uid b/addons/sky_3d/shaders/PerVertexSky.gdshader.uid index 59b36b6..ae4d801 100644 --- a/addons/sky_3d/shaders/PerVertexSky.gdshader.uid +++ b/addons/sky_3d/shaders/PerVertexSky.gdshader.uid @@ -1 +1 @@ -uid://byx8tkkv3yf4f +uid://dmdpvegai5hc5 diff --git a/addons/sky_3d/shaders/SimpleMoon.gdshader.uid b/addons/sky_3d/shaders/SimpleMoon.gdshader.uid index 4cf7b9b..baf6078 100644 --- a/addons/sky_3d/shaders/SimpleMoon.gdshader.uid +++ b/addons/sky_3d/shaders/SimpleMoon.gdshader.uid @@ -1 +1 @@ -uid://beedso8sc7lef +uid://cnea1xaudqctw diff --git a/addons/sky_3d/shaders/Sky.gdshader b/addons/sky_3d/shaders/Sky.gdshader index 6c04706..6e75890 100644 --- a/addons/sky_3d/shaders/Sky.gdshader +++ b/addons/sky_3d/shaders/Sky.gdshader @@ -64,8 +64,8 @@ uniform float _clouds_sky_tint_fade; uniform float _clouds_intensity; uniform float _clouds_size; uniform vec2 _clouds_uv; -uniform float _clouds_speed; -uniform vec2 _clouds_direction; +uniform float _clouds_offset_speed; +uniform vec2 _clouds_offset; uniform vec4 _clouds_day_color: source_color; uniform vec4 _clouds_horizon_light_color: source_color; uniform vec4 _clouds_night_color: source_color; @@ -149,11 +149,11 @@ void simpleOpticalDepth(float y, out float sr, out float sm){ void opticalDepth(float y, out float sr, out float sm){ y = max(0.0, y); y = saturate(y * _atm_level_params.x); - + float zenith = acos(y); zenith = cos(zenith) + 0.15 * pow(93.885 - ((zenith * 180.0) / kPI), -1.253); zenith = 1.0 / (zenith + _atm_level_params.y); - + sr = zenith * RAYLEIGH_ZENITH_LENGTH; sm = zenith * MIE_ZENITH_LENGTH; } @@ -161,36 +161,33 @@ void opticalDepth(float y, out float sr, out float sm){ vec3 atmosphericScattering(float sr, float sm, vec2 mu, vec3 mult){ vec3 betaMie = _atm_beta_mie; vec3 betaRay = _atm_beta_ray * _atm_thickness; - + vec3 extcFactor = saturateRGB(exp(-(betaRay * sr + betaMie * sm))); - + float extcFF = mix(saturate(_atm_thickness * 0.5), 1.0, mult.x); vec3 finalExtcFactor = mix(1.0 - extcFactor, (1.0 - extcFactor) * extcFactor, extcFF); float rayleighPhase = rayleighPhase(mu.x); vec3 BRT = betaRay * rayleighPhase; vec3 BMT = betaMie * miePhase(mu.x, _atm_sun_partial_mie_phase); BMT *= _atm_sun_mie_intensity * _atm_sun_mie_tint.rgb; - + vec3 BRMT = (BRT + BMT) / (betaRay + betaMie); vec3 scatter = _atm_sun_intensity * (BRMT * finalExtcFactor) * _atm_day_tint.rgb * mult.y; scatter = mix(scatter, scatter * (1.0 - extcFactor), _atm_darkness); - + vec3 lcol = mix(_atm_day_tint.rgb, _atm_horizon_light_tint.rgb, mult.x); vec3 nscatter = (1.0 - extcFactor) * _atm_night_tint.rgb; - nscatter += miePhase(mu.y, _atm_moon_partial_mie_phase) * + nscatter += miePhase(mu.y, _atm_moon_partial_mie_phase) * _atm_moon_mie_tint.rgb * _atm_moon_mie_intensity * 0.005; - + return (scatter * lcol) + nscatter; } // Clouds //------------------------------------------------------------------------------ float noiseClouds(vec2 coords, vec2 offset){ - float speed = TIME * _clouds_speed * .5; // .5 matches cumulus clouds - vec2 wind = offset * speed; - vec2 wind2 = (offset + offset) * speed; - float a = textureLod(_clouds_texture, coords.xy * _clouds_uv - wind, 0.0).r; - float b = textureLod(_clouds_texture, coords.xy * _clouds_uv - wind2, 0.0).r; + float a = textureLod(_clouds_texture, coords.xy * _clouds_uv + offset.x, 0.0).r; + float b = textureLod(_clouds_texture, coords.xy * _clouds_uv + offset.y, 0.0).r; return ((a + b) * 0.5); } @@ -202,10 +199,11 @@ float cloudsDensity(vec2 p, vec2 offset){ return saturate(d); } -vec4 renderClouds(vec3 pos){ +vec4 renderClouds(vec3 pos, float tm){ pos.xy = pos.xz / pos.y; pos *= _clouds_size; - float density = cloudsDensity(pos.xy, _clouds_direction); + vec2 wind = _clouds_offset.xy * (tm * _clouds_offset_speed); + float density = cloudsDensity(pos.xy, wind); float sh = saturate(exp(-_clouds_absorption * density)); float a = saturate(density * _clouds_thickness); return vec4(vec3(density*sh) * _clouds_intensity, a); @@ -222,12 +220,12 @@ void vertex(){ vec4 vert = vec4(VERTEX, 0.0); POSITION = PROJECTION_MATRIX * MODELVIEW_MATRIX * vert; POSITION.z = 0.00000001; - + world_pos = MODEL_MATRIX * vert; moon_coords.xyz = (_moon_matrix * VERTEX) / _moon_size + 0.5; moon_coords.w = dot(world_pos.xyz, _moon_direction.xyz); deep_space_coords.xyz = (_deep_space_matrix * VERTEX).xyz; - + angle_mult.x = saturate(1.0 - _sun_direction.y); angle_mult.y = saturate(_sun_direction.y + 0.45); angle_mult.z = saturate(-_sun_direction.y + 0.30); @@ -238,7 +236,7 @@ void fragment(){ vec3 col = vec3(0.0); vec3 worldPos = normalize(world_pos).xyz; vec3 cloudsPos = worldPos; - + // Atmosphere vec2 mu = vec2(dot(_sun_direction, worldPos), dot(_moon_direction, worldPos)); float sr, sm; @@ -246,16 +244,16 @@ void fragment(){ worldPos.y += _horizon_level; float horizonBlend = saturate((worldPos.y - 0.03) * 3.0); - + vec3 scatter = atmosphericScattering(sr, sm, mu.xy, angle_mult.xyz); col.rgb += scatter.rgb; - + // Near Space vec3 nearSpace = vec3(0.0); - vec3 sunDisk = disk(worldPos, _sun_direction, _sun_disk_size) * + vec3 sunDisk = disk(worldPos, _sun_direction, _sun_disk_size) * _sun_disk_color.rgb * scatter.rgb; sunDisk *= _sun_disk_intensity; - + // Moon vec4 moon = texture(_moon_texture, vec2(-moon_coords.x+1.0, moon_coords.y)); moon.rgb = contrastLevel(moon.rgb * _moon_color.rgb, _moon_color.a); @@ -263,37 +261,37 @@ void fragment(){ float moonMask = saturate(1.0 - moon.a); nearSpace = moon.rgb + (sunDisk.rgb * moonMask); col.rgb += nearSpace; - + vec3 deepSpace = vec3(0.0); vec2 deepSpaceUV = equirectUV(normalize(deep_space_coords)); - + // Background vec3 deepSpaceBackground = textureLod(_background_texture, deepSpaceUV, 0.0).rgb; deepSpaceBackground *= _background_color.rgb; deepSpaceBackground = contrastLevel(deepSpaceBackground, _background_color.a); deepSpace.rgb += deepSpaceBackground.rgb * moonMask; - + // Stars Field float starsScintillation = textureLod(_noise_tex, UV + (TIME * _stars_scintillation_speed), 0.0).r; starsScintillation = mix(1.0, starsScintillation * 1.5, _stars_scintillation); - + vec3 starsField = textureLod(_stars_field_texture, deepSpaceUV, 0.0).rgb * _stars_field_color.rgb; starsField = saturateRGB(mix(starsField.rgb, starsField.rgb * starsScintillation, _stars_scintillation)); //deepSpace.rgb -= saturate(starsField.r*10.0); deepSpace.rgb += starsField.rgb * moonMask; deepSpace.rgb *= angle_mult.z; col.rgb += deepSpace.rgb * horizonBlend; - + // Clouds - vec4 clouds = renderClouds(cloudsPos); + vec4 clouds = renderClouds(cloudsPos, TIME); clouds.a = saturate(clouds.a); - clouds.rgb *= mix(mix(_clouds_day_color.rgb, _clouds_horizon_light_color.rgb, angle_mult.x), + clouds.rgb *= mix(mix(_clouds_day_color.rgb, _clouds_horizon_light_color.rgb, angle_mult.x), _clouds_night_color.rgb, angle_mult.w); - + clouds.a = mix(0.0, clouds.a, horizonBlend); col.rgb = mix(col.rgb, clouds.rgb + mix(vec3(0.0), scatter, _clouds_sky_tint_fade), clouds.a); col.rgb = mix(col.rgb, _ground_color.rgb * scatter, saturate((-worldPos.y - _atm_level_params.z)*100.0)); - + col.rgb = tonemapPhoto(col.rgb, _color_correction_params.y, _color_correction_params.x); ALBEDO = col.rgb; } diff --git a/addons/sky_3d/shaders/Sky.gdshader.uid b/addons/sky_3d/shaders/Sky.gdshader.uid index aad809f..41b3c7a 100644 --- a/addons/sky_3d/shaders/Sky.gdshader.uid +++ b/addons/sky_3d/shaders/Sky.gdshader.uid @@ -1 +1 @@ -uid://bfkqn51cwum1e +uid://dhalpj5qcbhqv diff --git a/addons/sky_3d/src/DateTimeUtil.gd.uid b/addons/sky_3d/src/DateTimeUtil.gd.uid index 426993a..6ed348a 100644 --- a/addons/sky_3d/src/DateTimeUtil.gd.uid +++ b/addons/sky_3d/src/DateTimeUtil.gd.uid @@ -1 +1 @@ -uid://bnhhva7vjswff +uid://c6rq15l1wbln diff --git a/addons/sky_3d/src/OrbitalElements.gd.uid b/addons/sky_3d/src/OrbitalElements.gd.uid index 713b268..84ac74c 100644 --- a/addons/sky_3d/src/OrbitalElements.gd.uid +++ b/addons/sky_3d/src/OrbitalElements.gd.uid @@ -1 +1 @@ -uid://d12q65vakvuiy +uid://gfdyln804ke1 diff --git a/addons/sky_3d/src/Plugin.gd.uid b/addons/sky_3d/src/Plugin.gd.uid index 66bdf5e..5012946 100644 --- a/addons/sky_3d/src/Plugin.gd.uid +++ b/addons/sky_3d/src/Plugin.gd.uid @@ -1 +1 @@ -uid://dt7ysnnp1ni0s +uid://ctqkwsldd7mof diff --git a/addons/sky_3d/src/ScatterLib.gd.uid b/addons/sky_3d/src/ScatterLib.gd.uid index d09ea37..c6ef0f2 100644 --- a/addons/sky_3d/src/ScatterLib.gd.uid +++ b/addons/sky_3d/src/ScatterLib.gd.uid @@ -1 +1 @@ -uid://belj7tgs6u7yl +uid://dp024lqmrvjwu diff --git a/addons/sky_3d/src/Sky3D.gd b/addons/sky_3d/src/Sky3D.gd index eacecf3..c3a2bc1 100644 --- a/addons/sky_3d/src/Sky3D.gd +++ b/addons/sky_3d/src/Sky3D.gd @@ -1,63 +1,69 @@ # Copyright (c) 2023-2025 Cory Petkovsek and Contributors # Copyright (c) 2021 J. Cuellar -## Sky3D is an Atmosphereic Day/Night Cycle for Godot 4. -## -## It manages time, moving the sun, moon, and stars, and consolidates environmental lighting controls. -## To use it, remove any WorldEnvironment node from you scene, then add a new Sky3D node. -## Explore and configure the settings in the Sky3D, SunLight, MoonLight, TimeOfDay, and Skydome nodes. - @tool class_name Sky3D extends WorldEnvironment -## Emitted when the environment variable has changed. signal environment_changed -## The Sun DirectionalLight. var sun: DirectionalLight3D -## The Moon DirectionalLight. var moon: DirectionalLight3D -## The TimeOfDay node. var tod: TimeOfDay -## The Skydome node. var sky: Skydome -## Enables all rendering and time tracking. +func _enter_tree() -> void: + initialize() + + +func _ready() -> void: + # Reapply current settings once attached to the tree + sky_enabled = sky_enabled + lights_enabled = lights_enabled + fog_enabled = fog_enabled + clouds_enabled = clouds_enabled + show_physical_sky = show_physical_sky + current_time = current_time + + tod.time_changed.connect(_on_timeofday_updated) + + +## Visibility + @export var sky3d_enabled: bool = true : set = set_sky3d_enabled +@export_group("Visibility") +@export var sky_enabled: bool = true : set = set_sky_enabled +@export var lights_enabled: bool = true : set = set_lights_enabled +@export var fog_enabled: bool = true : set = set_fog_enabled +@export var clouds_enabled: bool = true : set = set_clouds_enabled +@export var show_physical_sky: bool = false : set = set_show_physical_sky +var _default_sun_energy: float +var _default_moon_energy: float + + func set_sky3d_enabled(value: bool) -> void: sky3d_enabled = value + sky_enabled = value + fog_enabled = value + clouds_enabled = value if value: - show_sky() resume() else: - hide_sky() pause() -##################### -## Visibility -##################### - -@export_group("Visibility") - - -## Enables the sky shader. Disable sky, lights, fog for a black sky or call hide_sky(). -@export var sky_enabled: bool = true : set = set_sky_enabled - func set_sky_enabled(value: bool) -> void: sky_enabled = value if not sky: return sky.sky_visible = value - sky.clouds_cumulus_visible = clouds_enabled and value + sky.clouds_cumulus_visible = value + sky.sun_light_energy = _default_sun_energy if value else 0 + sky.moon_light_energy = _default_moon_energy if value else 0 -## Enables the Sun and Moon DirectionalLights. -@export var lights_enabled: bool = true : set = set_lights_enabled - func set_lights_enabled(value: bool) -> void: lights_enabled = value if not sky: @@ -65,342 +71,207 @@ func set_lights_enabled(value: bool) -> void: sky.sun_light_enable = value sky.moon_light_enable = value sky.__sun_light_node.visible = value && sky.__sun_light_node.light_energy > 0 - sky.__moon_light_node.visible = value && sky.__moon_light_node.light_energy > 0 + sky.__moon_light_node.visible = ! value && sky.__moon_light_node.light_energy > 0 -## Enables the screen space fog shader. -@export var fog_enabled: bool = true : set = set_fog_enabled - func set_fog_enabled(value: bool) -> void: fog_enabled = value if sky: sky.fog_visible = value -## Enables the 2D and cumulus cloud layers. -@export var clouds_enabled: bool = true : set = set_clouds_enabled - func set_clouds_enabled(value: bool) -> void: clouds_enabled = value if not sky: return sky.clouds_cumulus_visible = value sky.clouds_thickness = float(value) * 1.7 - # TODO should create an on/off in skydome so disabling this doesn't change the enabled value -## Disables rendering of sky, fog, and lights -func hide_sky() -> void: - sky_enabled = false - lights_enabled = false - fog_enabled = false +func set_show_physical_sky(value: bool) -> void: + show_physical_sky = value + if not sky: + return + sky.sky_visible = !value -## Enables rendering of sky, fog, and lights -func show_sky() -> void: - sky_enabled = true - lights_enabled = true - fog_enabled = true - - -##################### ## Time -##################### @export_group("Time") - - -## Move time forward in the editor. @export var enable_editor_time: bool = true : set = set_editor_time_enabled +@export var enable_game_time: bool = true : set = set_game_time_enabled +@export_range(0.0, 24.0) var current_time: float = 8.0 : set = set_current_time +@export_range(-1440,1440,1) var minutes_per_day: float = 15.0 : set = set_minutes_per_day +@export_range(0.016, 10.0) var update_interval: float = 0.1 : set = set_update_interval +var _is_day: bool = true -func set_editor_time_enabled(value: bool) -> void: + +func pause() -> void: + $TimeOfDay.pause() + + +func resume() -> void: + $TimeOfDay.resume() + + +func is_day() -> bool: + return _is_day + + +func is_night() -> bool: + return not _is_day + + +func set_editor_time_enabled(value:bool) -> void: enable_editor_time = value if tod: tod.update_in_editor = value -## Move time forward in game. -@export var enable_game_time: bool = true : set = set_game_time_enabled - -func set_game_time_enabled(value: bool) -> void: +func set_game_time_enabled(value:bool) -> void: enable_game_time = value if tod: tod.update_in_game = value -## The time right now in hours, 0-23.99. Larger and smaller values will wrap -@export_range(0.0, 23.99, .01, "or_greater", "or_less") var current_time: float = 8.0 : set = set_current_time - -func set_current_time(value: float) -> void: +func set_current_time(value:float) -> void: current_time = value if tod and tod.total_hours != current_time: tod.total_hours = value -## The length of a full day in real minutes. +/-1440 (24 hours), forward or backwards. -@export_range(-1440,1440,.1) var minutes_per_day: float = 15.0 : set = set_minutes_per_day - func set_minutes_per_day(value): minutes_per_day = value if tod: tod.total_cycle_in_minutes = value -## Frequency of updates. Set to 0.016 for 60fps. -@export_range(0.016, 10.0) var update_interval: float = 0.1 : set = set_update_interval - -func set_update_interval(value: float) -> void: +func set_update_interval(value:float) -> void: update_interval = value if tod: tod.update_interval = value -## Tracks if the sun is above the horizon. -var _is_day: bool = true - - -## Returns true if the sun is above the horizon. -func is_day() -> bool: - return _is_day - - -## Returns true if the sun is below the horizon. -func is_night() -> bool: - return not _is_day - - -## Pauses time calculation. -func pause() -> void: - if tod: - tod.pause() - - -## Resumes time calculation. -func resume() -> void: - if tod: - tod.resume() - - func _on_timeofday_updated(time: float) -> void: - if tod: + if tod and Engine.is_editor_hint(): minutes_per_day = tod.total_cycle_in_minutes current_time = tod.total_hours update_interval = tod.update_interval - update_day_night() + + if night_ambient: + if abs(sky.sun_altitude) > 87 and _is_day: + _is_day = false + var tween: Tween = get_tree().create_tween() + tween.set_parallel(true) + tween.tween_property(environment, "ambient_light_sky_contribution", minf(night_ambient_min, sky_contribution), 3) + tween.tween_property(environment.sky.sky_material, "energy_multiplier", 1., 3) + elif abs(sky.sun_altitude) <= 87 and not _is_day: + _is_day = true + var tween: Tween = get_tree().create_tween() + tween.set_parallel(true) + tween.tween_property(environment, "ambient_light_sky_contribution", sky_contribution, 3) + tween.tween_property(environment.sky.sky_material, "energy_multiplier", reflected_energy, 3) -## Recalculates if it's currently day or night. Adjusts night ambient light if changing state or forced. -func update_day_night(force: bool = false) -> void: - if not (sky and environment): - return +## Exposure - # If day transitioning to night - if abs(sky.sun_altitude) > 87 and (_is_day or force): - _is_day = false - var tween: Tween = get_tree().create_tween() - tween.set_parallel(true) - var contrib: float = minf(night_ambient_min, sky_contribution) if night_ambient else sky_contribution - tween.tween_property(environment, "ambient_light_sky_contribution", contrib, ambient_tween_time) - tween.tween_property(environment.sky.sky_material, "energy_multiplier", 1., ambient_tween_time) - - # Else if night transitioning to day - elif abs(sky.sun_altitude) <= 87 and (not _is_day or force): - _is_day = true - var tween: Tween = get_tree().create_tween() - tween.set_parallel(true) - tween.tween_property(environment, "ambient_light_sky_contribution", sky_contribution, ambient_tween_time) - tween.tween_property(environment.sky.sky_material, "energy_multiplier", reflected_energy, ambient_tween_time) - - -##################### -## Lighting -##################### - -@export_group("Lighting") - - -## Exposure used for the tonemapper. See Evironment.tonemap_exposure -@export_range(0,16,.005) var tonemap_exposure: float = 1.0: set = set_tonemap_exposure - -func set_tonemap_exposure(value: float) -> void: - if environment: - tonemap_exposure = value - environment.tonemap_exposure = value - - -## Strength of skydome and fog. +@export_group("Exposure") +@export_range(0,1,.005) var sky_contribution: float = 1.0: set = set_sky_contribution +@export_range(0,16,.005) var ambient_energy: float = 1.0: set = set_ambient_energy +@export var night_ambient: bool = true: set = set_night_ambient +@export_range(0,1,.005) var night_ambient_min: float = .7 +@export_range(0,128,.005) var reflected_energy: float = 1.0: set = set_reflected_energy @export_range(0,16,.005) var skydome_energy: float = 1.3: set = set_skydome_energy - -func set_skydome_energy(value: float) -> void: - if sky: - skydome_energy = value - sky.exposure = value - sky.clouds_cumulus_intensity = value * .769 # (1/1.3 default sun energy) - - -## Exposure of camera connected to Environment.camera_attributes. +@export_range(0,16,.005) var tonemap_exposure: float = 1.0: set = set_tonemap_exposure @export_range(0,16,.005) var camera_exposure: float = 1.0: set = set_camera_exposure -func set_camera_exposure(value: float) -> void: - if camera_attributes: - camera_exposure = value - camera_attributes.exposure_multiplier = value +@export_subgroup("Auto Exposure") +@export var auto_exposure: bool = false: set = set_auto_exposure_enabled +@export_range(0.01,16,.005) var auto_exposure_scale: float = 0.2: set = set_auto_exposure_scale +@export_range(0,1600,.5) var auto_exposure_min: float = 0.0: set = set_auto_exposure_min +@export_range(30,64000,.5) var auto_exposure_max: float = 800.0: set = set_auto_exposure_max +@export_range(0.1,64,.1) var auto_exposure_speed: float = 0.5: set = set_auto_exposure_speed -## Maximum strength of Sun DirectionalLight, visible during the day. -@export_range(0,16,.005) var sun_energy: float = 1.0: set = set_sun_energy - -func set_sun_energy(value: float) -> void: - sun_energy = value - if sky: - sky.sun_light_energy = value +func set_sky_contribution(value:float) -> void: + if environment: + sky_contribution = value + environment.ambient_light_sky_contribution = value -## Opacity of Sun DirectionalLight shadow. -@export_range(0,1,.005) var sun_shadow_opacity: float = 1.0: set = set_sun_shadow_opacity +func set_ambient_energy(value:float) -> void: + if environment: + ambient_energy = value + environment.ambient_light_energy = value -func set_sun_shadow_opacity(value: float) -> void: - sun_shadow_opacity = value - if sun: - sun.shadow_opacity = value - -## Strength of refelcted light from the PhysicalSky. See PhysicalSkyMaterial.energy_multiplier -@export_range(0,128,.005) var reflected_energy: float = 1.0: set = set_reflected_energy +func set_night_ambient(value: bool) -> void: + night_ambient = value + if night_ambient: + _on_timeofday_updated(tod.total_hours) + else: + set_sky_contribution(sky_contribution) -func set_reflected_energy(value: float) -> void: + +func set_reflected_energy(value:float) -> void: if environment: reflected_energy = value if environment.sky: environment.sky.sky_material.energy_multiplier = value - -## Ratio of ambient light to sky light. See Environment.ambient_light_sky_contribution. -@export_range(0,1,.005) var sky_contribution: float = 1.0: set = set_sky_contribution -func set_sky_contribution(value: float) -> void: +func set_skydome_energy(value:float) -> void: + if sky: + skydome_energy = value + sky.exposure = value + + +func set_tonemap_exposure(value:float) -> void: if environment: - sky_contribution = value - environment.ambient_light_sky_contribution = value - update_day_night(true) + tonemap_exposure = value + environment.tonemap_exposure = value -## Strength of ambient light. Works outside of Reflection Probe / GI volumes and sky_contribution < 1. -## See Environment.ambient_light_energy. -@export_range(0,16,.005) var ambient_energy: float = 1.0: set = set_ambient_energy - -func set_ambient_energy(value: float) -> void: - if environment: - ambient_energy = value - environment.ambient_light_energy = value - update_day_night(true) +func set_camera_exposure(value:float) -> void: + if camera_attributes: + camera_exposure = value + camera_attributes.exposure_multiplier = value -@export_subgroup("Auto Exposure") - - -## Enables CameraAttributes.auto_exposure_enabled. -@export var auto_exposure: bool = false: set = set_auto_exposure_enabled - -func set_auto_exposure_enabled(value: bool) -> void: +func set_auto_exposure_enabled(value:bool) -> void: if camera_attributes: auto_exposure = value camera_attributes.auto_exposure_enabled = value -## Sets CameraAttributes.auto_exposure_scale. -@export_range(0.01,16,.005) var auto_exposure_scale: float = 0.2: set = set_auto_exposure_scale - -func set_auto_exposure_scale(value: float) -> void: +func set_auto_exposure_scale(value:float) -> void: if camera_attributes: auto_exposure_scale = value camera_attributes.auto_exposure_scale = value -## Sets CameraAttributesPractical.auto_exposure_min_sensitivity. -@export_range(0,1600,.5) var auto_exposure_min: float = 0.0: set = set_auto_exposure_min - -func set_auto_exposure_min(value: float) -> void: +func set_auto_exposure_min(value:float) -> void: if camera_attributes: auto_exposure_min = value camera_attributes.auto_exposure_min_sensitivity = value -## Sets CameraAttributesPractical.auto_exposure_max_sensitivity. -@export_range(30,64000,.5) var auto_exposure_max: float = 800.0: set = set_auto_exposure_max - -func set_auto_exposure_max(value: float) -> void: +func set_auto_exposure_max(value:float) -> void: if camera_attributes: auto_exposure_max = value camera_attributes.auto_exposure_max_sensitivity = value -## Sets CameraAttributes.auto_exposure_speed. -@export_range(0.1,64,.1) var auto_exposure_speed: float = 0.5: set = set_auto_exposure_speed - -func set_auto_exposure_speed(value: float) -> void: +func set_auto_exposure_speed(value:float) -> void: if camera_attributes: auto_exposure_speed = value camera_attributes.auto_exposure_speed = value -@export_subgroup("Night") - - -## Maximum strength of Moon DirectionalLight, visible at night. -@export_range(0,16,.005) var moon_energy: float = .3: set = set_moon_energy - -func set_moon_energy(value: float) -> void: - moon_energy = value - if moon: - sky.moon_light_energy = value - - -## Opacity of Moon DirectionalLight shadow. -@export_range(0,1,.005) var moon_shadow_opacity: float = 1.0: set = set_moon_shadow_opacity - -func set_moon_shadow_opacity(value: float) -> void: - moon_shadow_opacity = value - if moon: - moon.shadow_opacity = value - - -## Enables a different ambient light setting at night. -@export var night_ambient: bool = true: set = set_night_ambient - -func set_night_ambient(value: bool) -> void: - night_ambient = value - update_day_night(true) - - -## Strength of ambient light at night. Sky_contribution must be < 1. See Environment.ambient_light_energy. -@export_range(0,1,.005) var night_ambient_min: float = .7: set = set_night_ambient_min - -func set_night_ambient_min(value: float) -> void: - night_ambient_min = value - if night_ambient: - update_day_night(true) - - -## Transition time for ambient light change, typically transitioning between day and night. -@export_range(0,30,.05) var ambient_tween_time: float = 3.: set = set_ambient_tween_time - -func set_ambient_tween_time(value: float) -> void: - ambient_tween_time = value - - -##################### ## Setup -##################### -func _notification(what: int) -> void: - # Must be after _init and before _enter_tree to properly set vars like 'sky' for setters - if what in [ NOTIFICATION_SCENE_INSTANTIATED, NOTIFICATION_ENTER_TREE ]: - _initialize() - - -func _initialize() -> void: +func initialize() -> void: # Create default environment if environment == null: environment = Environment.new() @@ -415,35 +286,37 @@ func _initialize() -> void: environment.tonemap_mode = Environment.TONE_MAPPER_ACES environment.tonemap_white = 6 emit_signal("environment_changed", environment) - + # Create default camera attributes if camera_attributes == null: camera_attributes = CameraAttributesPractical.new() - # Assign children nodes - - if has_node("SunLight"): + # Create children nodes + if get_child_count() > 0: + tod = $TimeOfDay + sky = $Skydome + sky.environment = environment sun = $SunLight - elif is_inside_tree(): + moon = $MoonLight + else: sun = DirectionalLight3D.new() sun.name = "SunLight" add_child(sun, true) sun.owner = get_tree().edited_scene_root sun.shadow_enabled = true - - if has_node("MoonLight"): - moon = $MoonLight - elif is_inside_tree(): + moon = DirectionalLight3D.new() moon.name = "MoonLight" add_child(moon, true) moon.owner = get_tree().edited_scene_root moon.shadow_enabled = true - if has_node("Skydome"): - sky = $Skydome - sky.environment = environment - elif is_inside_tree(): + tod = TimeOfDay.new() + tod.name = "TimeOfDay" + add_child(tod, true) + tod.owner = get_tree().edited_scene_root + tod.dome_path = "../Skydome" + sky = Skydome.new() sky.name = "Skydome" add_child(sky, true) @@ -452,20 +325,8 @@ func _initialize() -> void: sky.moon_light_path = "../MoonLight" sky.environment = environment - if has_node("TimeOfDay"): - tod = $TimeOfDay - elif is_inside_tree(): - tod = TimeOfDay.new() - tod.name = "TimeOfDay" - add_child(tod, true) - tod.owner = get_tree().edited_scene_root - tod.dome_path = "../Skydome" - if tod and not tod.time_changed.is_connected(_on_timeofday_updated): - tod.time_changed.connect(_on_timeofday_updated) - - -func _enter_tree() -> void: - update_day_night(true) + _default_sun_energy = $Skydome.sun_light_energy + _default_moon_energy = $Skydome.moon_light_energy func _set(property: StringName, value: Variant) -> bool: @@ -478,9 +339,7 @@ func _set(property: StringName, value: Variant) -> bool: return false -##################### ## Constants -##################### # Node names const SKY_INSTANCE:= "_SkyMeshI" @@ -507,6 +366,7 @@ const _clouds_texture: Texture2D = preload("res://addons/sky_3d/assets/resources const _clouds_cumulus_texture: Texture2D = preload("res://addons/sky_3d/assets/textures/noiseClouds.png") # Skydome +const MAX_EXTRA_CULL_MARGIN: float = 16384.0 const DEFAULT_POSITION:= Vector3(0.0000001, 0.0000001, 0.0000001) # Coords @@ -576,8 +436,8 @@ const CLOUDS_SIZE:= "_clouds_size" const CLOUDS_NOISE_FREQ:= "_clouds_noise_freq" const CLOUDS_UV:= "_clouds_uv" -const CLOUDS_DIRECTION:= "_clouds_direction" -const CLOUDS_SPEED:= "_clouds_speed" +const CLOUDS_OFFSET:= "_clouds_offset" +const CLOUDS_OFFSET_SPEED:= "_clouds_offset_speed" const CLOUDS_TEXTURE:= "_clouds_texture" const CLOUDS_DAY_COLOR:= "_clouds_day_color" diff --git a/addons/sky_3d/src/Sky3D.gd.uid b/addons/sky_3d/src/Sky3D.gd.uid index 3b82567..9b89aa0 100644 --- a/addons/sky_3d/src/Sky3D.gd.uid +++ b/addons/sky_3d/src/Sky3D.gd.uid @@ -1 +1 @@ -uid://dwixjbv25mxyj +uid://f17ekdbdmfty diff --git a/addons/sky_3d/src/Skydome.gd b/addons/sky_3d/src/Skydome.gd index 00e2f30..eca66a7 100644 --- a/addons/sky_3d/src/Skydome.gd +++ b/addons/sky_3d/src/Skydome.gd @@ -30,7 +30,7 @@ var moon_render: Node var clouds_cumulus_mesh: MeshInstance3D var fog_mesh: MeshInstance3D -@export var sky_material: Material +var sky_material: Material var moon_material: Material var clouds_cumulus_material: Material var fog_material: Material @@ -39,7 +39,7 @@ var fog_material: Material func _ready() -> void: build_scene() - # Update properties + # Update properties # General update_sky_visible() update_dome_radius() @@ -48,11 +48,11 @@ func _ready() -> void: update_sky_layers() update_sky_render_priority() update_horizon_level() - + # Coords update_sun_coords() update_moon_coords() - + # Atmosphere update_atm_quality() update_beta_ray() @@ -70,7 +70,7 @@ func _ready() -> void: update_atm_moon_mie_tint() update_atm_moon_mie_intensity() update_atm_moon_mie_anisotropy() - + # Fog update_fog_visible() update_fog_atm_level_params_offset() @@ -82,7 +82,7 @@ func _ready() -> void: update_fog_falloff() update_fog_layers() update_fog_render_priority() - + # Near space update_sun_light_path() update_sun_disk_color() @@ -100,7 +100,7 @@ func _ready() -> void: update_sun_light_energy() update_moon_light_color() update_moon_light_energy() - + # Deep space update_deep_space_basis() set_set_background_texture(set_background_texture) @@ -111,7 +111,7 @@ func _ready() -> void: update_stars_field_texture() update_stars_scintillation() update_stars_scintillation_speed() - + # Clouds update_clouds_thickness() update_clouds_coverage() @@ -120,11 +120,11 @@ func _ready() -> void: update_clouds_intensity() update_clouds_size() update_clouds_uv() - update_clouds_direction() - update_clouds_speed() + update_clouds_offset() + update_clouds_offset_speed() set_set_clouds_texture(set_clouds_texture) update_clouds_texture() - + # Clouds cumulus update_clouds_cumulus_visible() update_clouds_cumulus_day_color() @@ -138,11 +138,11 @@ func _ready() -> void: update_clouds_cumulus_mie_intensity() update_clouds_cumulus_mie_anisotropy() update_clouds_cumulus_size() - update_clouds_cumulus_direction() - update_clouds_cumulus_speed() + update_clouds_cumulus_offset() + update_clouds_cumulus_offset_speed() set_set_clouds_cumulus_texture(set_clouds_cumulus_texture) update_clouds_cumulus_texture() - + # Environment __update_environment() @@ -162,14 +162,14 @@ func build_scene() -> void: sky_mesh.material_override = sky_material __setup_mesh_instance(sky_mesh, Sky3D.DEFAULT_POSITION) add_child(sky_mesh) - + # Moon Render moon_render = Sky3D._moon_render.instantiate() moon_render.name = Sky3D.MOON_INSTANCE var moon_mesh = moon_render.get_node("MoonTransform/Camera3D/Mesh") as MeshInstance3D moon_material = moon_mesh.material_override add_child(moon_render) - + # Clouds Cumulus Mesh clouds_cumulus_mesh = MeshInstance3D.new() clouds_cumulus_mesh.name = Sky3D.CLOUDS_C_INSTANCE @@ -182,7 +182,7 @@ func build_scene() -> void: clouds_cumulus_mesh.material_override = clouds_cumulus_material __setup_mesh_instance(clouds_cumulus_mesh, Sky3D.DEFAULT_POSITION) add_child(clouds_cumulus_mesh) - + fog_mesh = MeshInstance3D.new() fog_mesh.name = Sky3D.FOG_INSTANCE var fog_screen_quad = QuadMesh.new() @@ -199,12 +199,12 @@ func build_scene() -> void: add_child(fog_mesh) is_scene_built = true - + func __setup_mesh_instance(target: MeshInstance3D, origin: Vector3) -> void: target.transform.origin = origin + target.extra_cull_margin = Sky3D.MAX_EXTRA_CULL_MARGIN target.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF - target.custom_aabb = AABB(Vector3(-1e31, -1e31, -1e31), Vector3(2e31, 2e31, 2e31)) ##################### @@ -220,14 +220,14 @@ var sky_layers: int = 4: set = set_sky_layers var sky_render_priority: int = -128: set = set_sky_render_priority var horizon_level: float = 0.0: set = set_horizon_level - + func set_sky_visible(value: bool) -> void: if value == sky_visible: return - sky_visible = value + sky_visible = value update_sky_visible() - + func update_sky_visible() -> void: if !is_scene_built: return @@ -239,14 +239,14 @@ func set_dome_radius(value: float) -> void: return dome_radius = value update_dome_radius() - + func update_dome_radius() -> void: if !is_scene_built: return sky_mesh.scale = dome_radius * Vector3.ONE clouds_cumulus_mesh.scale = dome_radius * Vector3.ONE - + func set_tonemap_level(value: float) -> void: if value == tonemap_level: @@ -254,14 +254,14 @@ func set_tonemap_level(value: float) -> void: tonemap_level = value update_color_correction_params() - + func set_exposure(value: float) -> void: if value == exposure: return exposure = value update_color_correction_params() - - + + func update_color_correction_params() -> void: if !is_scene_built: return @@ -284,7 +284,7 @@ func update_ground_color() -> void: if !is_scene_built: return sky_material.set_shader_parameter(Sky3D.GROUND_COLOR_P, ground_color) - + func set_sky_layers(value: int) -> void: if sky_layers == value: @@ -298,21 +298,21 @@ func update_sky_layers() -> void: return sky_mesh.layers = sky_layers clouds_cumulus_mesh.layers = sky_layers - + func set_sky_render_priority(value: int) -> void: if value == sky_render_priority: return sky_render_priority = value update_sky_render_priority() - + func update_sky_render_priority() -> void: if !is_scene_built: return sky_material.render_priority = sky_render_priority clouds_cumulus_material.render_priority = sky_render_priority + 1 - + func set_horizon_level(value: float) -> void: if value == horizon_level: @@ -342,7 +342,7 @@ func set_sun_azimuth(value: float) -> void: return sun_azimuth = value update_sun_coords() - + func set_sun_altitude(value: float) -> void: if value == sun_altitude: @@ -362,32 +362,32 @@ func sun_direction() -> Vector3: func update_sun_coords() -> void: if !is_scene_built: return - + var azimuth: float = sun_azimuth * TOD_Math.DEG_TO_RAD var altitude: float = sun_altitude * TOD_Math.DEG_TO_RAD - + __finish_set_sun_pos = false if not __finish_set_sun_pos: __sun_transform.origin = TOD_Math.to_orbit(altitude, azimuth) __finish_set_sun_pos = true - + if __finish_set_sun_pos: __sun_transform = __sun_transform.looking_at(Sky3D.DEFAULT_POSITION, Vector3.LEFT) - + __set_day_state(altitude) emit_signal("sun_transform_changed", __sun_transform) emit_signal("sun_transform_changed", sun_direction()) - + sky_material.set_shader_parameter(Sky3D.SUN_DIR_P, sun_direction()) fog_material.set_shader_parameter(Sky3D.SUN_DIR_P, sun_direction()) moon_material.set_shader_parameter(Sky3D.SUN_DIR_P, sun_direction()) clouds_cumulus_material.set_shader_parameter(Sky3D.SUN_DIR_P, sun_direction()) - + if __sun_light_node != null: #if __sun_light_node.light_energy > 0.0 && (abs(sun_altitude) < 90.0 if __sun_light_node.light_energy > 0.0: __sun_light_node.transform = __sun_transform - + update_night_intensity() update_sun_light_color() update_sun_light_energy() @@ -410,14 +410,14 @@ func set_moon_azimuth(value: float) -> void: return moon_azimuth = value update_moon_coords() - + func set_moon_altitude(value: float) -> void: if value == moon_altitude: return moon_altitude = value update_moon_coords() - + func get_moon_transform() -> Transform3D: return __moon_transform @@ -430,37 +430,37 @@ func moon_direction() -> Vector3: func update_moon_coords() -> void: if !is_scene_built: return - + var azimuth: float = moon_azimuth * TOD_Math.DEG_TO_RAD var altitude: float = moon_altitude * TOD_Math.DEG_TO_RAD - + __finish_set_moon_pos = false if not __finish_set_moon_pos: __moon_transform.origin = TOD_Math.to_orbit(altitude, azimuth) __finish_set_moon_pos = true - + if __finish_set_moon_pos: __moon_transform = __moon_transform.looking_at(Sky3D.DEFAULT_POSITION, Vector3.LEFT) - + emit_signal("moon_transform_changed", __moon_transform) emit_signal("moon_direction_changed", moon_direction()) - + sky_material.set_shader_parameter(Sky3D.MOON_DIR_P, moon_direction()) fog_material.set_shader_parameter(Sky3D.MOON_DIR_P, moon_direction()) moon_material.set_shader_parameter(Sky3D.MOON_DIR_P, moon_direction()) clouds_cumulus_material.set_shader_parameter(Sky3D.MOON_DIR_P, moon_direction()) sky_material.set_shader_parameter(Sky3D.MOON_MATRIX, __moon_transform.basis.inverse()) - + var moon_instance_transform = moon_render.get_node("MoonTransform") as Node3D moon_instance_transform.transform = __moon_transform - + if __moon_light_node != null: #if __moon_light_node.light_energy > 0.0 && (abs(moon_altitude) < 90.0): if __moon_light_node.light_energy > 0.0: __moon_light_node.transform = __moon_transform - + __moon_light_altitude_mult = TOD_Math.saturate(moon_direction().y) - + update_night_intensity() set_moon_light_color(moon_light_color) update_moon_light_energy() @@ -516,7 +516,7 @@ func set_atm_wavelenghts(value : Vector3) -> void: return atm_wavelenghts = value update_beta_ray() - + func update_beta_ray() -> void: if !is_scene_built: @@ -528,14 +528,14 @@ func update_beta_ray() -> void: sky_material.set_shader_parameter(Sky3D.ATM_BETA_RAY_P, betaRay) fog_material.set_shader_parameter(Sky3D.ATM_BETA_RAY_P, betaRay) - + func set_atm_darkness(value: float) -> void: if value == atm_darkness: return atm_darkness = value update_atm_darkness() - + func update_atm_darkness() -> void: if !is_scene_built: return @@ -549,7 +549,7 @@ func set_atm_sun_intensity(value: float) -> void: atm_sun_intensity = value update_atm_sun_intensity() - + func update_atm_sun_intensity() -> void: if !is_scene_built: return @@ -563,7 +563,7 @@ func set_atm_day_tint(value: Color) -> void: atm_day_tint = value update_atm_day_tint() - + func update_atm_day_tint() -> void: if !is_scene_built: return @@ -606,7 +606,7 @@ func update_night_intensity() -> void: var tint: Color = atm_night_tint * atm_night_intensity() sky_material.set_shader_parameter(Sky3D.ATM_NIGHT_TINT_P, tint) fog_material.set_shader_parameter(Sky3D.ATM_NIGHT_TINT_P, atm_night_tint * fog_atm_night_intensity()) - + set_atm_moon_mie_intensity(atm_moon_mie_intensity) @@ -616,7 +616,7 @@ func set_atm_level_params(value: Vector3) -> void: atm_level_params = value update_atm_level_params() - + func update_atm_level_params() -> void: if !is_scene_built: return @@ -696,7 +696,7 @@ func set_atm_sun_mie_anisotropy(value: float) -> void: atm_sun_mie_anisotropy = value update_atm_sun_mie_anisotropy() - + func update_atm_sun_mie_anisotropy() -> void: if !is_scene_built: return @@ -711,7 +711,7 @@ func set_atm_moon_mie_tint(value: Color) -> void: atm_moon_mie_tint = value update_atm_moon_mie_tint() - + func update_atm_moon_mie_tint() -> void: if !is_scene_built: return @@ -726,7 +726,7 @@ func set_atm_moon_mie_intensity(value: float) -> void: atm_moon_mie_intensity = value update_atm_sun_mie_intensity() - + func update_atm_moon_mie_intensity() -> void: if !is_scene_built: return @@ -739,7 +739,7 @@ func set_atm_moon_mie_anisotropy(value: float) -> void: return atm_moon_mie_anisotropy = value update_atm_moon_mie_anisotropy() - + func update_atm_moon_mie_anisotropy() -> void: if !is_scene_built: @@ -795,13 +795,13 @@ func update_fog_visible() -> void: return fog_mesh.visible = fog_visible - + func set_fog_atm_level_params_offset(value: Vector3) -> void: if value == fog_atm_level_params_offset: return fog_atm_level_params_offset = value update_fog_atm_level_params_offset() - + func update_fog_atm_level_params_offset() -> void: if !is_scene_built: @@ -814,7 +814,7 @@ func set_fog_density(value: float) -> void: return fog_density = value update_fog_density() - + func update_fog_density() -> void: if !is_scene_built: @@ -833,14 +833,14 @@ func update_fog_start() -> void: if !is_scene_built: return fog_material.set_shader_parameter(Sky3D.ATM_FOG_START, fog_start) - + func set_fog_end(value: float) -> void: if value == fog_end: return fog_end = value update_fog_end() - + func update_fog_end() -> void: if !is_scene_built: @@ -853,7 +853,7 @@ func set_fog_rayleigh_depth(value: float) -> void: return fog_rayleigh_depth = value update_fog_rayleigh_depth() - + func update_fog_rayleigh_depth() -> void: if !is_scene_built: @@ -866,7 +866,7 @@ func set_fog_mie_depth(value: float) -> void: return fog_mie_depth = value update_fog_mie_depth() - + func update_fog_mie_depth() -> void: if !is_scene_built: @@ -879,7 +879,7 @@ func set_fog_falloff(value: float) -> void: return fog_falloff = value update_fog_falloff() - + func update_fog_falloff() -> void: if !is_scene_built: @@ -892,7 +892,7 @@ func set_fog_layers(value: int) -> void: return fog_layers = value update_fog_layers() - + func update_fog_layers() -> void: if !is_scene_built: @@ -905,7 +905,7 @@ func set_fog_render_priority(value: int) -> void: return fog_render_priority = value update_fog_render_priority() - + func update_fog_render_priority() -> void: if !is_scene_built: @@ -932,7 +932,7 @@ func set_sun_disk_color(value: Color) -> void: return sun_disk_color = value update_sun_disk_color() - + func update_sun_disk_color() -> void: if !is_scene_built: @@ -945,7 +945,7 @@ func set_sun_disk_intensity(value: float) -> void: return sun_disk_intensity = value update_sun_disk_intensity() - + func update_sun_disk_intensity() -> void: if !is_scene_built: @@ -958,7 +958,7 @@ func set_sun_disk_size(value: float) -> void: return sun_disk_size = value update_sun_disk_size() - + func update_sun_disk_size() -> void: if !is_scene_built: @@ -971,7 +971,7 @@ func set_moon_color(value: Color) -> void: return moon_color = value update_moon_color() - + func update_moon_color() -> void: if !is_scene_built: @@ -984,8 +984,8 @@ func set_moon_size(value: float) -> void: return moon_size = value update_moon_size() - - + + func update_moon_size() -> void: if !is_scene_built: return @@ -997,14 +997,14 @@ func set_enable_set_moon_texture(value: bool) -> void: if not value: set_moon_texture(Sky3D._moon_texture) notify_property_list_changed() - + func set_moon_texture(value: Texture2D) -> void: if value == moon_texture: return moon_texture = value update_moon_texture() - + func update_moon_texture() -> void: if !is_scene_built: @@ -1030,7 +1030,7 @@ func update_moon_resolution() -> void: MoonResolution.R1024: moon_render.size = Vector2.ONE * 1024 sky_material.set_shader_parameter(Sky3D.MOON_TEXTURE_P, moon_render.get_texture()) - + ##################### ## Sun ##################### @@ -1039,7 +1039,7 @@ func update_moon_resolution() -> void: # Original sun horizon (1.0, 0.384314, 0.243137, 1.0) @export var sun_light_enable: bool = true -var sun_light_color:= Color.WHITE : set = set_sun_light_color +var sun_light_color:= Color.WHITE : set = set_sun_light_color var sun_horizon_light_color:= Color(.98, 0.523, 0.294, 1.0): set = set_sun_horizon_light_color var sun_light_energy: float = 1.0: set = set_sun_light_energy var __sun_light_node: DirectionalLight3D = null @@ -1051,7 +1051,7 @@ func set_sun_light_color(value: Color) -> void: return sun_light_color = value update_sun_light_color() - + func update_sun_light_color() -> void: if __sun_light_node == null: @@ -1065,14 +1065,14 @@ func set_sun_horizon_light_color(value: Color) -> void: return sun_horizon_light_color = value update_sun_light_color() - + func set_sun_light_energy(value: float) -> void: if value == sun_light_energy: return sun_light_energy = value update_sun_light_energy() - + func update_sun_light_energy() -> void: if __sun_light_node != null: @@ -1087,7 +1087,7 @@ func set_sun_light_path(value: NodePath) -> void: update_sun_light_path() update_sun_coords() - + func update_sun_light_path() -> void: if sun_light_path != null: __sun_light_node = get_node_or_null(sun_light_path) as DirectionalLight3D @@ -1112,13 +1112,13 @@ func set_moon_light_color(value: Color) -> void: return moon_light_color = value update_moon_light_color() - + func update_moon_light_color() -> void: if __moon_light_node == null: return __moon_light_node.light_color = moon_light_color - + func set_moon_light_energy(value: float) -> void: moon_light_energy = value @@ -1128,10 +1128,10 @@ func set_moon_light_energy(value: float) -> void: func update_moon_light_energy() -> void: if __moon_light_node == null: return - + var l: float = TOD_Math.lerp_f(0.0, moon_light_energy, __moon_light_altitude_mult) l*= atm_moon_phases_mult() - + var fade = (1.0 - sun_direction().y) * 0.5 __moon_light_node.light_energy = l * Sky3D._sun_moon_curve_fade.sample_baked(fade) @@ -1207,7 +1207,7 @@ func set_set_background_texture(value: bool) -> void: if not value: _set_background_texture(Sky3D._background_texture) notify_property_list_changed() - + func update_background_texture() -> void: if !is_scene_built: @@ -1220,7 +1220,7 @@ func _set_background_texture(value: Texture2D) -> void: return background_texture = value update_background_texture() - + func update_stars_field_color() -> void: if !is_scene_built: @@ -1233,14 +1233,14 @@ func set_stars_field_color(value: Color) -> void: return stars_field_color = value update_stars_field_color() - + func set_set_stars_field_texture(value: bool) -> void: set_stars_field_texture = value if not value: _set_stars_field_texture(Sky3D._stars_field_texture) notify_property_list_changed() - + func update_stars_field_texture() -> void: if !is_scene_built: @@ -1295,8 +1295,8 @@ var clouds_sky_tint_fade: float = 0.5: set = set_clouds_sky_tint_fade var clouds_intensity: float = 10.0: set = set_clouds_intensity var clouds_size: float = 2.0: set = set_clouds_size var clouds_uv:= Vector2(0.16, 0.11): set = set_clouds_uv -var clouds_direction:= Vector2(0.25, 0.25): set = set_clouds_direction -var clouds_speed: float = 0.07: set = set_clouds_speed +var clouds_offset:= Vector2(0.21, 0.175): set = set_clouds_offset +var clouds_offset_speed: float = 0.01: set = set_clouds_offset_speed var set_clouds_texture: bool = false: set = set_set_clouds_texture var clouds_texture: Texture2D = null: set = _set_clouds_texture @@ -1358,7 +1358,7 @@ func set_clouds_intensity(value: float) -> void: return clouds_intensity = value update_clouds_intensity() - + func update_clouds_intensity() -> void: if !is_scene_built: @@ -1371,7 +1371,7 @@ func set_clouds_size(value: float) -> void: return clouds_size = value update_clouds_size() - + func update_clouds_size() -> void: if !is_scene_built: @@ -1392,30 +1392,30 @@ func update_clouds_uv() -> void: sky_material.set_shader_parameter(Sky3D.CLOUDS_UV, clouds_uv) -func set_clouds_direction(value: Vector2) -> void: - if value == clouds_direction: +func set_clouds_offset(value: Vector2) -> void: + if value == clouds_offset: return - clouds_direction = value - update_clouds_direction() + clouds_offset = value + update_clouds_offset() + - -func update_clouds_direction() -> void: +func update_clouds_offset() -> void: if !is_scene_built: return - sky_material.set_shader_parameter(Sky3D.CLOUDS_DIRECTION, clouds_direction) + sky_material.set_shader_parameter(Sky3D.CLOUDS_OFFSET, clouds_offset) -func set_clouds_speed(value: float) -> void: - if value == clouds_speed: +func set_clouds_offset_speed(value: float) -> void: + if value == clouds_offset_speed: return - clouds_speed = value - update_clouds_speed() + clouds_offset_speed = value + update_clouds_offset_speed() + - -func update_clouds_speed() -> void: +func update_clouds_offset_speed() -> void: if !is_scene_built: return - sky_material.set_shader_parameter(Sky3D.CLOUDS_SPEED, clouds_speed) + sky_material.set_shader_parameter(Sky3D.CLOUDS_OFFSET_SPEED, clouds_offset_speed) func set_set_clouds_texture(value: bool) -> void: @@ -1423,7 +1423,7 @@ func set_set_clouds_texture(value: bool) -> void: if not value: _set_clouds_texture(Sky3D._clouds_texture) notify_property_list_changed() - + func _set_clouds_texture(value: Texture2D) -> void: if value == clouds_texture: @@ -1454,8 +1454,8 @@ var clouds_cumulus_intensity: float = 1.0: set = set_clouds_cumulus_intensity var clouds_cumulus_mie_intensity: float = 1.0: set = set_clouds_cumulus_mie_intensity var clouds_cumulus_mie_anisotropy: float = 0.206: set = set_clouds_cumulus_mie_anisotropy var clouds_cumulus_size: float = 0.5: set = set_clouds_cumulus_size -var clouds_cumulus_direction:= Vector3(0.25, 0.1, 0.25): set = set_clouds_cumulus_direction -var clouds_cumulus_speed: float = 0.05: set = set_clouds_cumulus_speed +var clouds_cumulus_offset:= Vector3(0.64, 0.522, 0.128): set = set_clouds_cumulus_offset +var clouds_cumulus_offset_speed: float = 0.005: set = set_clouds_cumulus_offset_speed var set_clouds_cumulus_texture: bool = false: set = set_set_clouds_cumulus_texture var clouds_cumulus_texture: Texture2D = null: set = _set_clouds_cumulus_texture @@ -1465,7 +1465,7 @@ func set_clouds_cumulus_visible(value: bool) -> void: return clouds_cumulus_visible = value update_clouds_cumulus_visible() - + func update_clouds_cumulus_visible() -> void: if !is_scene_built: @@ -1478,7 +1478,7 @@ func set_clouds_cumulus_day_color(value: Color) -> void: return clouds_cumulus_day_color = value update_clouds_cumulus_day_color() - + func update_clouds_cumulus_day_color() -> void: if !is_scene_built: @@ -1620,30 +1620,30 @@ func update_clouds_cumulus_size() -> void: clouds_cumulus_material.set_shader_parameter(Sky3D.CLOUDS_SIZE, clouds_cumulus_size) -func set_clouds_cumulus_direction(value: Vector3) -> void: - if value == clouds_cumulus_direction: +func set_clouds_cumulus_offset(value: Vector3) -> void: + if value == clouds_cumulus_offset: return - clouds_cumulus_direction = value - update_clouds_cumulus_direction() + clouds_cumulus_offset = value + update_clouds_cumulus_offset() -func update_clouds_cumulus_direction() -> void: +func update_clouds_cumulus_offset() -> void: if !is_scene_built: return - clouds_cumulus_material.set_shader_parameter(Sky3D.CLOUDS_DIRECTION, clouds_cumulus_direction) + clouds_cumulus_material.set_shader_parameter(Sky3D.CLOUDS_OFFSET, clouds_cumulus_offset) -func set_clouds_cumulus_speed(value: float) -> void: - if value == clouds_cumulus_speed: +func set_clouds_cumulus_offset_speed(value: float) -> void: + if value == clouds_cumulus_offset_speed: return - clouds_cumulus_speed = value - update_clouds_cumulus_speed() + clouds_cumulus_offset_speed = value + update_clouds_cumulus_offset_speed() -func update_clouds_cumulus_speed() -> void: +func update_clouds_cumulus_offset_speed() -> void: if !is_scene_built: return - clouds_cumulus_material.set_shader_parameter(Sky3D.CLOUDS_SPEED, clouds_cumulus_speed) + clouds_cumulus_material.set_shader_parameter(Sky3D.CLOUDS_OFFSET_SPEED, clouds_cumulus_offset_speed) func set_set_clouds_cumulus_texture(value: bool) -> void: @@ -1651,14 +1651,14 @@ func set_set_clouds_cumulus_texture(value: bool) -> void: if not value: _set_clouds_cumulus_texture(Sky3D._clouds_cumulus_texture) notify_property_list_changed() - + func _set_clouds_cumulus_texture(value: Texture2D) -> void: if value == clouds_cumulus_texture: return clouds_cumulus_texture = value update_clouds_cumulus_texture() - + func update_clouds_cumulus_texture() -> void: if !is_scene_built: @@ -1689,7 +1689,7 @@ func __update_environment() -> void: col.a = 1. col.v = clamp(col.v, .35, 1.) environment.ambient_light_color = col - + ##################### @@ -1711,7 +1711,7 @@ func __set_day_state(v: float, threshold: float = 1.80) -> void: elif __day == false and abs(v) <= threshold: __day = true emit_signal("day_night_changed", __day) - + # Adjust lights and signal. Happens at a different time from "day time" above if __sun_light_node and __moon_light_node: if sun_light_enable and not __sun_light_node.visible and __sun_light_node.light_energy > 0.0: @@ -1725,9 +1725,9 @@ func __set_day_state(v: float, threshold: float = 1.80) -> void: func _get_property_list() -> Array: - var ret:= Array() + var ret:= Array() ret.push_back({name = "Skydome", type = TYPE_NIL, usage = PROPERTY_USAGE_CATEGORY}) - + # Global ret.push_back({name = "Global", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "sky_visible", type = TYPE_BOOL}) @@ -1738,19 +1738,19 @@ func _get_property_list() -> Array: ret.push_back({name = "sky_layers", type = TYPE_INT, hint = PROPERTY_HINT_LAYERS_3D_RENDER}) ret.push_back({name = "sky_render_priority", type = TYPE_INT, hint = PROPERTY_HINT_RANGE, hint_string = "-128, 127"}) ret.push_back({name = "horizon_level", type = TYPE_FLOAT}) - + # Sun ret.push_back({name = "Sun", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "sun_altitude", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "-180.0, 180.0"}) ret.push_back({name = "sun_azimuth", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "-180.0, 180.0"}) ret.push_back({name = "sun_disk_color", type = TYPE_COLOR}) - ret.push_back({name = "sun_disk_intensity", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 100.0"}) + ret.push_back({name = "sun_disk_intensity", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 2.0"}) # Clamped 2.0 for prevent reflection probe artifacts. ret.push_back({name = "sun_disk_size", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 0.5"}) ret.push_back({name = "sun_light_path", type = TYPE_NODE_PATH}) ret.push_back({name = "sun_light_color", type = TYPE_COLOR}) ret.push_back({name = "sun_horizon_light_color", type = TYPE_COLOR}) ret.push_back({name = "sun_light_energy", type = TYPE_FLOAT}) - + # Moon ret.push_back({name = "Moon", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "moon_altitude", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "-180.0, 180.0"}) @@ -1758,34 +1758,34 @@ func _get_property_list() -> Array: ret.push_back({name = "moon_color", type = TYPE_COLOR}) ret.push_back({name = "moon_size", type = TYPE_FLOAT}) ret.push_back({name = "enable_set_moon_texture", type = TYPE_BOOL}) - + if enable_set_moon_texture: ret.push_back({name = "moon_texture", type = TYPE_OBJECT, hint = PROPERTY_HINT_FILE, hint_string = "Texture2D"}) - + ret.push_back({name = "moon_resolution", type = TYPE_INT, hint = PROPERTY_HINT_ENUM, hint_string = "64, 128, 256, 512, 1024"}) ret.push_back({name = "moon_light_path", type = TYPE_NODE_PATH}) - + ret.push_back({name = "moon_light_color", type = TYPE_COLOR}) ret.push_back({name = "moon_light_energy", type = TYPE_FLOAT}) - + # Deep space ret.push_back({name = "DeepSpace", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "deep_space_euler", type = TYPE_VECTOR3}) ret.push_back({name = "background_color", type = TYPE_COLOR}) ret.push_back({name = "set_background_texture", type = TYPE_BOOL}) - + if set_background_texture: ret.push_back({name = "background_texture", type = TYPE_OBJECT, hint = PROPERTY_HINT_GLOBAL_FILE, hint_string = "Texture2D"}) - + ret.push_back({name = "stars_field_color", type = TYPE_COLOR}) ret.push_back({name = "set_stars_field_texture", type = TYPE_BOOL}) - + if set_stars_field_texture: ret.push_back({name = "stats_field_texture", type = TYPE_OBJECT, hint = PROPERTY_HINT_FILE, hint_string = "Texture2D"}) - + ret.push_back({name = "stars_scintillation", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 1.0"}) ret.push_back({name = "stars_scintillation_speed", type = TYPE_FLOAT}) - + # Atmosphere ret.push_back({name = "Atmosphere", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP, hint_string = "atm_"}) ret.push_back({name = "atm_quality", type = TYPE_INT, hint = PROPERTY_HINT_ENUM, hint_string = "PerPixel,PerVertex"}) @@ -1803,11 +1803,11 @@ func _get_property_list() -> Array: ret.push_back({name = "atm_sun_mie_tint", type = TYPE_COLOR}) ret.push_back({name = "atm_sun_mie_intensity", type = TYPE_FLOAT}) ret.push_back({name = "atm_sun_mie_anisotropy", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 0.9999999"}) - + ret.push_back({name = "atm_moon_mie_tint", type = TYPE_COLOR}) ret.push_back({name = "atm_moon_mie_intensity", type = TYPE_FLOAT}) ret.push_back({name = "atm_moon_mie_anisotropy", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 0.9999999"}) - + # Fog ret.push_back({name = "Fog", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP, hint_string = "fog_"}) ret.push_back({name = "fog_visible", type = TYPE_BOOL}) @@ -1820,7 +1820,7 @@ func _get_property_list() -> Array: ret.push_back({name = "fog_end", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 5000.0"}) ret.push_back({name = "fog_layers", type = TYPE_INT, hint = PROPERTY_HINT_LAYERS_3D_RENDER}) ret.push_back({name = "fog_render_priority", type = TYPE_INT}) - + # 2D Clouds ret.push_back({name = "2D Clouds", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "clouds_thickness", type = TYPE_FLOAT}) @@ -1830,13 +1830,13 @@ func _get_property_list() -> Array: ret.push_back({name = "clouds_intensity", type = TYPE_FLOAT}) ret.push_back({name = "clouds_size", type = TYPE_FLOAT}) ret.push_back({name = "clouds_uv", type = TYPE_VECTOR2}) - ret.push_back({name = "clouds_direction", type = TYPE_VECTOR2}) - ret.push_back({name = "clouds_speed", type = TYPE_FLOAT}) + ret.push_back({name = "clouds_offset", type = TYPE_VECTOR2}) + ret.push_back({name = "clouds_offset_speed", type = TYPE_FLOAT}) ret.push_back({name = "set_clouds_texture", type = TYPE_BOOL}) - + if set_clouds_texture: ret.push_back({name = "clouds_texture", type = TYPE_OBJECT, hint = PROPERTY_HINT_FILE, hint_string = "Texture2D"}) - + # Clouds cumulus ret.push_back({name = "Clouds Cumulus", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "clouds_cumulus_visible", type = TYPE_BOOL}) @@ -1851,15 +1851,15 @@ func _get_property_list() -> Array: ret.push_back({name = "clouds_cumulus_mie_intensity", type = TYPE_FLOAT}) ret.push_back({name = "clouds_cumulus_mie_anisotropy", type = TYPE_FLOAT, hint = PROPERTY_HINT_RANGE, hint_string = "0.0, 0.999999"}) ret.push_back({name = "clouds_cumulus_size", type = TYPE_FLOAT}) - ret.push_back({name = "clouds_cumulus_direction", type = TYPE_VECTOR3}) - ret.push_back({name = "clouds_cumulus_speed", type = TYPE_FLOAT}) + ret.push_back({name = "clouds_cumulus_offset", type = TYPE_VECTOR3}) + ret.push_back({name = "clouds_cumulus_offset_speed", type = TYPE_FLOAT}) ret.push_back({name = "set_clouds_cumulus_texture", type = TYPE_BOOL}) - + if set_clouds_cumulus_texture: ret.push_back({name = "clouds_cumulus_texture", type = TYPE_OBJECT, hint = PROPERTY_HINT_FILE, hint_string = "Texture2D"}) - + # Lighting ret.push_back({name = "Lighting", type = TYPE_NIL, usage = PROPERTY_USAGE_GROUP}) ret.push_back({name = "environment", type = TYPE_OBJECT, hint = PROPERTY_HINT_RESOURCE_TYPE, hint_string = "Resource"}) - + return ret diff --git a/addons/sky_3d/src/Skydome.gd.uid b/addons/sky_3d/src/Skydome.gd.uid index 5519a3a..14bedc5 100644 --- a/addons/sky_3d/src/Skydome.gd.uid +++ b/addons/sky_3d/src/Skydome.gd.uid @@ -1 +1 @@ -uid://dlome35s3xvcj +uid://cosn35lbnkhme diff --git a/addons/sky_3d/src/TOD_Math.gd b/addons/sky_3d/src/TOD_Math.gd index 29c8dc4..a8aedb1 100644 --- a/addons/sky_3d/src/TOD_Math.gd +++ b/addons/sky_3d/src/TOD_Math.gd @@ -48,7 +48,7 @@ static func plerp_vec3(from: Vector3, to: Vector3, t: float) -> Vector3: static func plerp_color(from: Color, to: Color, t: float) -> Color: var ret: Color ret.r = (1 - t) * from.r + t * to.r - ret.g = (1 - t) * from.g + t * to.g + ret.g = (1 - t) * from.g + t * to.b ret.b = (1 - t) * from.b + t * to.b ret.a = (1 - t) * from.a + t * to.a return ret diff --git a/addons/sky_3d/src/TOD_Math.gd.uid b/addons/sky_3d/src/TOD_Math.gd.uid index b19f9e7..a111cbf 100644 --- a/addons/sky_3d/src/TOD_Math.gd.uid +++ b/addons/sky_3d/src/TOD_Math.gd.uid @@ -1 +1 @@ -uid://qhe8d8o4yhda +uid://c6hxtcwmtbhij diff --git a/addons/sky_3d/src/TimeOfDay.gd b/addons/sky_3d/src/TimeOfDay.gd index a5bc790..8ebf187 100644 --- a/addons/sky_3d/src/TimeOfDay.gd +++ b/addons/sky_3d/src/TimeOfDay.gd @@ -65,14 +65,22 @@ func _ready() -> void: func _on_timeout() -> void: - if system_sync: - __get_date_time_os() - else: - var delta: float = .001 * (Time.get_ticks_msec() - _last_update) - __progress_time(delta) - __update_celestial_coords() - _last_update = Time.get_ticks_msec() + var delta: float = .001 * (Time.get_ticks_msec() - _last_update) + if not system_sync: + __time_process(delta) + __repeat_full_cycle() + __check_cycle() + else: + __get_date_time_os() + + __celestials_update_timer += delta; + if __celestials_update_timer > celestials_update_time: + __set_celestial_coords() + __celestials_update_timer = 0.0 + + _last_update = Time.get_ticks_msec() + func pause() -> void: if is_instance_valid(_update_timer): @@ -101,9 +109,9 @@ func set_dome_path(value: NodePath) -> void: dome_path = value if value != null: __dome = get_node_or_null(value) as Skydome - + __dome_found = false if __dome == null else true - __update_celestial_coords() + __set_celestial_coords() ##################### @@ -120,49 +128,31 @@ var year: int = 2025: set = set_year func set_total_hours(value: float) -> void: - if total_hours != value: - total_hours = value - while total_hours > 23.9999: - total_hours -= 24 - day += 1 - while total_hours < 0.0000: - total_hours += 24 - day -= 1 - emit_signal("time_changed", total_hours) - __update_celestial_coords() + total_hours = value + emit_signal("time_changed", value) + if Engine.is_editor_hint(): + __set_celestial_coords() func set_day(value: int) -> void: - if day != value: - day = value - while day > max_days_per_month(): - day -= max_days_per_month() - month += 1 - while day < 1: - month -= 1 - day += max_days_per_month() - emit_signal("day_changed", day) - __update_celestial_coords() + day = value + emit_signal("day_changed", value) + if Engine.is_editor_hint(): + __set_celestial_coords() func set_month(value: int) -> void: - if month != value: - month = value - while month > 12: - month -= 12 - year += 1 - while month < 1: - month += 12 - year -= 1 - emit_signal("month_changed", month) - __update_celestial_coords() + month = value + emit_signal("month_changed", value) + if Engine.is_editor_hint(): + __set_celestial_coords() func set_year(value: int) -> void: - if year != value: - year = value - emit_signal("year_changed", year) - __update_celestial_coords() + year = value + emit_signal("year_changed", value) + if Engine.is_editor_hint(): + __set_celestial_coords() func is_learp_year() -> bool: @@ -176,7 +166,7 @@ func max_days_per_month() -> int: 2: return 29 if is_learp_year() else 28 return 30 - + func time_cycle_duration() -> float: return total_cycle_in_minutes * 60.0 @@ -203,13 +193,15 @@ var celestials_calculations: int = 1: set = set_celestials_calculations var latitude: float = 16.0: set = set_latitude var longitude: float = 108.0: set = set_longitude var utc: float = 7.0: set = set_utc +var celestials_update_time: float = 0.0 +var __celestials_update_timer: float = 0.0 var compute_moon_coords: bool = true: set = set_compute_moon_coords var compute_deep_space_coords: bool = true: set = set_compute_deep_space_coords var moon_coords_offset := Vector2(0.0, 0.0): set = set_moon_coords_offset var __sun_coords := Vector2.ZERO var __moon_coords := Vector2.ZERO var __sun_distance: float -var __true_sun_longitude: float +var __true_sun_longitude: float var __mean_sun_longitude: float var __sideral_time: float var __local_sideral_time: float @@ -219,39 +211,46 @@ var __moon_orbital_elements := OrbitalElements.new() func set_celestials_calculations(value: int) -> void: celestials_calculations = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() notify_property_list_changed() - + func set_latitude(value: float) -> void: latitude = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() func set_longitude(value: float) -> void: longitude = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() func set_utc(value: float) -> void: utc = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() func set_compute_moon_coords(value: bool) -> void: compute_moon_coords = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() notify_property_list_changed() - + func set_compute_deep_space_coords(value: bool) -> void: compute_deep_space_coords = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() func set_moon_coords_offset(value: Vector2) -> void: moon_coords_offset = value - __update_celestial_coords() + if Engine.is_editor_hint(): + __set_celestial_coords() func __get_latitude_rad() -> float: @@ -280,35 +279,8 @@ func set_time(hour: int, minute: int, second: int) -> void: set_total_hours(DateTimeUtil.hours_to_total_hours(hour, minute, second)) -func set_from_datetime_dict(datetime_dict: Dictionary) -> void: - set_year(datetime_dict.year) - set_month(datetime_dict.month) - set_day(datetime_dict.day) - set_time(datetime_dict.hour, datetime_dict.minute, datetime_dict.second) - - -func get_datetime_dict() -> Dictionary: - var datetime_dict := { - "year": year, - "month": month, - "day": day, - "hour": floor(total_hours), - "minute": floor(fmod(total_hours, 1.0) * 60.0), - "second": floor(fmod(total_hours * 60.0, 1.0) * 60.0) - } - return datetime_dict - - -func set_from_unix_timestamp(timestamp: int) -> void: - set_from_datetime_dict(Time.get_datetime_dict_from_unix_time(timestamp)) - - -func get_unix_timestamp() -> int: - return Time.get_unix_time_from_datetime_dict(get_datetime_dict()) - - -func __progress_time(delta: float) -> void: - if not is_zero_approx(time_cycle_duration()): +func __time_process(delta: float) -> void: + if time_cycle_duration() != 0.0: set_total_hours(total_hours + delta / time_cycle_duration() * DateTimeUtil.TOTAL_HOURS) @@ -320,12 +292,47 @@ func __get_date_time_os() -> void: set_year(date_time_os.year) +func __repeat_full_cycle() -> void: + if is_end_of_time() && total_hours >= 23.9999: + set_year(1); set_month(1); set_day(1) + set_total_hours(0.0) + + if is_begin_of_time() && total_hours < 0.0: + set_year(9999); set_month(12); set_day(31) + set_total_hours(23.9999) + + +func __check_cycle() -> void: + if total_hours > 23.9999: + set_day(day + 1) + set_total_hours(0.0) + if total_hours < 0.0000: + set_day(day - 1) + set_total_hours(23.9999) + + if day > max_days_per_month(): + set_month(month + 1) + set_day(1) + + if day < 1: + set_month(month - 1) + set_day(31) + + if month > 12: + set_year(year + 1) + set_month(1) + + if month < 1: + set_year(year - 1) + set_month(12) + + ##################### ## Planetary ##################### -func __update_celestial_coords() -> void: +func __set_celestial_coords() -> void: if not __dome_found: return @@ -338,24 +345,24 @@ func __update_celestial_coords() -> void: __compute_simple_moon_coords() __dome.moon_altitude = __moon_coords.y __dome.moon_azimuth = __moon_coords.x - + if compute_deep_space_coords: var x = Quaternion.from_euler(Vector3( (90 + latitude) * TOD_Math.DEG_TO_RAD, 0.0, 0.0)) var y = Quaternion.from_euler(Vector3(0.0, 0.0, __sun_coords.y * TOD_Math.DEG_TO_RAD)) __dome.deep_space_quat = x * y - + CelestialCalculationsMode.Realistic: __compute_realistic_sun_coords() - __dome.sun_altitude = -__sun_coords.y * TOD_Math.RAD_TO_DEG - __dome.sun_azimuth = -__sun_coords.x * TOD_Math.RAD_TO_DEG + __dome.sun_altitude = __sun_coords.y * TOD_Math.RAD_TO_DEG + __dome.sun_azimuth = __sun_coords.x * TOD_Math.RAD_TO_DEG if compute_moon_coords: __compute_realistic_moon_coords() - __dome.moon_altitude = -__moon_coords.y * TOD_Math.RAD_TO_DEG - __dome.moon_azimuth = -__moon_coords.x * TOD_Math.RAD_TO_DEG - + __dome.moon_altitude = __moon_coords.y * TOD_Math.RAD_TO_DEG + __dome.moon_azimuth = __moon_coords.x * TOD_Math.RAD_TO_DEG + if compute_deep_space_coords: var x = Quaternion.from_euler(Vector3( (90 + latitude) * TOD_Math.DEG_TO_RAD, 0.0, 0.0) ) - var y = Quaternion.from_euler(Vector3(0.0, 0.0, (180.0 - __local_sideral_time * TOD_Math.RAD_TO_DEG) * TOD_Math.DEG_TO_RAD)) + var y = Quaternion.from_euler(Vector3(0.0, 0.0, (180.0 - __local_sideral_time * TOD_Math.RAD_TO_DEG) * TOD_Math.DEG_TO_RAD)) __dome.deep_space_quat = x * y @@ -374,83 +381,83 @@ func __compute_realistic_sun_coords() -> void: # Orbital Elements __sun_orbital_elements.get_orbital_elements(0, __get_time_scale()) __sun_orbital_elements.M = TOD_Math.rev(__sun_orbital_elements.M) - + # Mean anomaly in radians var MRad: float = TOD_Math.DEG_TO_RAD * __sun_orbital_elements.M - + # Eccentric Anomaly var E: float = __sun_orbital_elements.M + TOD_Math.RAD_TO_DEG * __sun_orbital_elements.e *\ sin(MRad) * (1 + __sun_orbital_elements.e * cos(MRad)) - + var ERad: float = E * TOD_Math.DEG_TO_RAD - + # Rectangular coordinates of the sun in the plane of the ecliptic var xv: float = cos(ERad) - __sun_orbital_elements.e var yv: float = sin(ERad) * sqrt(1 - __sun_orbital_elements.e * __sun_orbital_elements.e) - + # Distance and true anomaly # Convert to distance and true anomaly(r = radians, v = degrees) var r: float = sqrt(xv * xv + yv * yv) var v: float = TOD_Math.RAD_TO_DEG * atan2(yv, xv) __sun_distance = r - + # True longitude var lonSun: float = v + __sun_orbital_elements.w lonSun = TOD_Math.rev(lonSun) - + var lonSunRad = TOD_Math.DEG_TO_RAD * lonSun __true_sun_longitude = lonSunRad - + ## Ecliptic and ecuatorial coords - + # Ecliptic rectangular coords var xs: float = r * cos(lonSunRad) var ys: float = r * sin(lonSunRad) - + # Ecliptic rectangular coordinates rotate these to equatorial coordinates var obleclCos: float = cos(__get_oblecl()) var obleclSin: float = sin(__get_oblecl()) - - var xe: float = xs + + var xe: float = xs var ye: float = ys * obleclCos - 0.0 * obleclSin var ze: float = ys * obleclSin + 0.0 * obleclCos - + # Ascencion and declination var RA: float = TOD_Math.RAD_TO_DEG * atan2(ye, xe) / 15 # right ascension. var decl: float = atan2(ze, sqrt(xe * xe + ye * ye)) # declination - + # Mean longitude var L: float = __sun_orbital_elements.w + __sun_orbital_elements.M L = TOD_Math.rev(L) - + __mean_sun_longitude = L - + # Sideral time and hour angle var GMST0: float = ((L/15) + 12) __sideral_time = GMST0 + __get_total_hours_utc() + longitude / 15 # +15/15 __local_sideral_time = TOD_Math.DEG_TO_RAD * __sideral_time * 15 - + var HA: float = (__sideral_time - RA) * 15 var HARAD: float = TOD_Math.DEG_TO_RAD * HA - + # Hour angle and declination in rectangular coords # HA and Decl in rectangular coords var declCos: float = cos(decl) var x = cos(HARAD) * declCos # X Axis points to the celestial equator in the south. var y = sin(HARAD) * declCos # Y axis points to the horizon in the west. var z = sin(decl) # Z axis points to the north celestial pole. - + # Rotate the rectangualar coordinates system along of the Y axis var sinLat: float = sin(latitude * TOD_Math.DEG_TO_RAD) var cosLat: float = cos(latitude * TOD_Math.DEG_TO_RAD) var xhor: float = x * sinLat - z * cosLat - var yhor: float = y + var yhor: float = y var zhor: float = x * cosLat + z * sinLat - + # Azimuth and altitude __sun_coords.x = atan2(yhor, xhor) + PI __sun_coords.y = (PI * 0.5) - asin(zhor) # atan2(zhor, sqrt(xhor * xhor + yhor * yhor)) - + func __compute_realistic_moon_coords() -> void: # Orbital Elements @@ -458,119 +465,119 @@ func __compute_realistic_moon_coords() -> void: __moon_orbital_elements.N = TOD_Math.rev(__moon_orbital_elements.N) __moon_orbital_elements.w = TOD_Math.rev(__moon_orbital_elements.w) __moon_orbital_elements.M = TOD_Math.rev(__moon_orbital_elements.M) - + var NRad: float = TOD_Math.DEG_TO_RAD * __moon_orbital_elements.N var IRad: float = TOD_Math.DEG_TO_RAD * __moon_orbital_elements.i var MRad: float = TOD_Math.DEG_TO_RAD * __moon_orbital_elements.M - + # Eccentric anomaly var E: float = __moon_orbital_elements.M + TOD_Math.RAD_TO_DEG * __moon_orbital_elements.e * sin(MRad) *\ (1 + __sun_orbital_elements.e * cos(MRad)) - + var ERad = TOD_Math.DEG_TO_RAD * E - + # Rectangular coords and true anomaly # Rectangular coordinates of the sun in the plane of the ecliptic var xv: float = __moon_orbital_elements.a * (cos(ERad) - __moon_orbital_elements.e) var yv: float = __moon_orbital_elements.a * (sin(ERad) * sqrt(1 - __moon_orbital_elements.e * \ __moon_orbital_elements.e)) * sin(ERad) - + # Convert to distance and true anomaly(r = radians, v = degrees) var r: float = sqrt(xv * xv + yv * yv) var v: float = TOD_Math.RAD_TO_DEG * atan2(yv, xv) v = TOD_Math.rev(v) - + var l: float = TOD_Math.DEG_TO_RAD * v + __moon_orbital_elements.w - + var cosL: float = cos(l) var sinL: float = sin(l) var cosNRad: float = cos(NRad) var sinNRad: float = sin(NRad) var cosIRad: float = cos(IRad) - + var xeclip: float = r * (cosNRad * cosL - sinNRad * sinL * cosIRad) var yeclip: float = r * (sinNRad * cosL + cosNRad * sinL * cosIRad) var zeclip: float = r * (sinL * sin(IRad)) - + # Geocentric coords # Geocentric position for the moon and Heliocentric position for the planets var lonecl: float = TOD_Math.RAD_TO_DEG * atan2(yeclip, xeclip) lonecl = TOD_Math.rev(lonecl) - + var latecl: float = TOD_Math.RAD_TO_DEG * atan2(zeclip, sqrt(xeclip * xeclip + yeclip * yeclip)) - + # Get true sun longitude var lonsun: float = __true_sun_longitude - + # Ecliptic longitude and latitude in radians var loneclRad: float = TOD_Math.DEG_TO_RAD * lonecl var lateclRad: float = TOD_Math.DEG_TO_RAD * latecl - + var nr: float = 1.0 var xh: float = nr * cos(loneclRad) * cos(lateclRad) var yh: float = nr * sin(loneclRad) * cos(lateclRad) var zh: float = nr * sin(lateclRad) - + # Geocentric coords var xs: float = 0.0 var ys: float = 0.0 - + # Convert the geocentric position to heliocentric position var xg: float = xh + xs var yg: float = yh + ys var zg: float = zh - + # Ecuatorial coords # Cobert xg, yg un equatorial coords var obleclCos: float = cos(__get_oblecl()) var obleclSin: float = sin(__get_oblecl()) - - var xe: float = xg + + var xe: float = xg var ye: float = yg * obleclCos - zg * obleclSin var ze: float = yg * obleclSin + zg * obleclCos - + # Right ascention var RA: float = TOD_Math.RAD_TO_DEG * atan2(ye, xe) RA = TOD_Math.rev(RA) - + # Declination var decl: float = TOD_Math.RAD_TO_DEG * atan2(ze, sqrt(xe * xe + ye * ye)) var declRad: float = TOD_Math.DEG_TO_RAD * decl - + # Sideral time and hour angle var HA: float = ((__sideral_time * 15) - RA) HA = TOD_Math.rev(HA) var HARAD: float = TOD_Math.DEG_TO_RAD * HA - + # HA y Decl in rectangular coordinates var declCos: float = cos(declRad) var xr: float = cos(HARAD) * declCos var yr: float = sin(HARAD) * declCos var zr: float = sin(declRad) - + # Rotate the rectangualar coordinates system along of the Y axis(radians) var sinLat: float = sin(__get_latitude_rad()) var cosLat: float = cos(__get_latitude_rad()) - + var xhor: float = xr * sinLat - zr * cosLat - var yhor: float = yr + var yhor: float = yr var zhor: float = xr * cosLat + zr * sinLat - + # Azimuth and altitude __moon_coords.x = atan2(yhor, xhor) + PI __moon_coords.y = (PI *0.5) - atan2(zhor, sqrt(xhor * xhor + yhor * yhor)) # Mathf.Asin(zhor) func _get_property_list() -> Array: - var ret: Array + var ret: Array ret.push_back({name = "Time Of Day", type=TYPE_NIL, usage=PROPERTY_USAGE_CATEGORY}) - + ret.push_back({name = "Target", type=TYPE_NIL, usage=PROPERTY_USAGE_GROUP}) ret.push_back({name = "dome_path", type=TYPE_NODE_PATH}) - + ret.push_back({name = "DateTime", type=TYPE_NIL, usage=PROPERTY_USAGE_GROUP}) ret.push_back({name = "system_sync", type=TYPE_BOOL}) - + ret.push_back({name = "total_cycle_in_minutes", type=TYPE_FLOAT}) ret.push_back({name = "total_hours", type=TYPE_FLOAT, hint=PROPERTY_HINT_RANGE, hint_string="0.0, 24.0"}) ret.push_back({name = "day", type=TYPE_INT, hint=PROPERTY_HINT_RANGE, hint_string="0, 31"}) @@ -583,10 +590,11 @@ func _get_property_list() -> Array: if celestials_calculations == 0 && compute_moon_coords: ret.push_back({name = "moon_coords_offset", type=TYPE_VECTOR2}) - + ret.push_back({name = "compute_deep_space_coords", type=TYPE_BOOL}) ret.push_back({name = "latitude", type=TYPE_FLOAT, hint=PROPERTY_HINT_RANGE, hint_string="-90.0, 90.0"}) ret.push_back({name = "longitude", type=TYPE_FLOAT, hint=PROPERTY_HINT_RANGE, hint_string="-180.0, 180.0"}) ret.push_back({name = "utc", type=TYPE_FLOAT, hint=PROPERTY_HINT_RANGE, hint_string="-12.0, 12.0"}) - + ret.push_back({name = "celestials_update_time", type=TYPE_FLOAT}) + return ret diff --git a/addons/sky_3d/src/TimeOfDay.gd.uid b/addons/sky_3d/src/TimeOfDay.gd.uid index 4474982..bc25ddf 100644 --- a/addons/sky_3d/src/TimeOfDay.gd.uid +++ b/addons/sky_3d/src/TimeOfDay.gd.uid @@ -1 +1 @@ -uid://blrv2g077uvcq +uid://bviswil7dda20