diff --git a/Effects/skydome.eff b/Effects/skydome.eff index 412288cfc..997954d72 100644 --- a/Effects/skydome.eff +++ b/Effects/skydome.eff @@ -17,6 +17,7 @@ <aurora_vsize><use>/environment/aurora/vsize</use></aurora_vsize> <aurora_hsize><use>/environment/aurora/hsize</use></aurora_hsize> <aurora_ray_factor><use>/environment/aurora/ray-factor</use></aurora_ray_factor> + <aurora_penetration_factor><use>/environment/aurora/penetration-factor</use></aurora_penetration_factor> <lthickness><use>/environment/ground-haze-thickness-m</use></lthickness> <terminator><use>/environment/terminator-relative-position-m</use></terminator> <terrain_alt><use>/environment/mean-terrain-elevation-m</use></terrain_alt> @@ -172,6 +173,11 @@ <name>aurora_ray_factor</name> <type>float</type> <value><use>aurora_ray_factor</use></value> + </uniform> + <uniform> + <name>aurora_penetration_factor</name> + <type>float</type> + <value><use>aurora_penetration_factor</use></value> </uniform> <uniform> <name>horizon_roughness</name> diff --git a/Nasal/aurora.nas b/Nasal/aurora.nas new file mode 100755 index 000000000..fb75e86ba --- /dev/null +++ b/Nasal/aurora.nas @@ -0,0 +1,226 @@ +########################################################### +# Aurora Borealis manager +# +# this runs once at startup to randomize Aurora appearance +# a little and otherwise simulates detailed Aurora evolution +# only when requested by the user +########################################################### + +var aurora_manager = { + + running_flag : 0, + + storm_probability: 0.1, + storm_flag: 0, + storm_duration: 0, + storm_timer: 0, + + afterglow_flag: 0, + afterglow_timer: 0, + + strength_bg: 0, + strength_target: 0, + strength_current: 0, + strength_rate: 0.015, + + ray_bg: 0, + ray_target: 0, + ray_current: 0, + ray_rate: 0.005, + + glow_bg: 0, + glow_target: 0, + glow_current: 0, + glow_rate: 0.02, + + upper_bg: 0, + upper_target: 0, + upper_current: 0, + upper_rate: 0.025, + + delta_t: 0.1, + + + init: func { + + var rn = rand(); + setprop("/environment/aurora/penetration-factor", rn); + + rn = rand(); + setprop("/environment/aurora/ray-factor", 0.8 * rn); + me.ray_bg = 0.4 * rn; + + rn = rand(); + setprop("/environment/aurora/patchiness", rn); + + rn = rand(); + setprop("/environment/aurora/upper-alt-factor", rn); + me.upper_bg = 0.5 * rn; + + me.strength_bg = 0.4 * rand(); + + me.strength_rate = me.strength_rate * me.delta_t; + me.ray_rate = me.ray_rate * me.delta_t; + me.glow_rate = me.glow_rate * me.delta_t; + me.upper_rate = me.upper_rate * me.delta_t; + + # me.storm_probability = me.storm_probability * me.delta_t; + + + }, + + state: func { + + var state = getprop("/environment/aurora/aurora-manager"); + print("Aurora state manager"); + if (state == 1) {me.start();} + else {me.stop();} + + }, + + start: func { + + if (me.running_flag == 1) {return;} + + print("Starting aurora manager."); + + me.running_flag = 1; + me.ray_target = me.ray_bg; + me.upper_target = me.upper_bg; + me.strength_target = getprop("/environment/aurora/set-strength"); + me.ray_current = me.ray_target; + me.upper_current = me.ray_target; + me.strength_current = me.ray_target; + + + me.update(); + + }, + + stop: func { + + me.running_flag = 0; + print("Stopping aurora manager."); + + + }, + + update: func { + + if (me.running_flag == 0) {return;} + + + if ((rand() < me.storm_probability) and (me.storm_flag == 0) and (me.afterglow_flag == 0))# init auroral storm + { + me.storm_flag = 1; + me.storm_timer = 0; + me.storm_duration = 60.0 + rand() * 120.0; + me.storm_duration *= 0.4; + print("Auroral storm duration: ", me.storm_duration, " s"); + } + + if (me.storm_flag == 1) + { + if (me.storm_timer < me.storm_duration) + { + me.strength_target = 1.0; + me.ray_target = 0.7; + me.upper_target = 1.0; + } + else + { + me.ray_target = me.ray_bg; + me.storm_flag = 0; + me.afterglow_timer = 0; + me.afterglow_flag = 1; + } + + me.storm_timer = me.storm_timer + me.delta_t; + } + if (me.afterglow_flag == 1) + { + if (me.afterglow_timer < 60) + { + me.glow_target = 1.0 - me.strength_bg; + } + else if (me.afterglow_timer < 120) + { + me.upper_target = me.upper_bg; + me.strength_target = me.strength_bg; + me.glow_target = 0.0; + } + else + { + me.afterglow_flag = 0; + } + + me.afterglow_timer = me.afterglow_timer + me.delta_t; + } + + + me.evolve(); + + + settimer (func me.update(), me.delta_t); + + }, + + + evolve: func { + + + if (me.strength_current < me.strength_target) + { + me.strength_current = me.strength_current + me.strength_rate; + if (me.strength_current > me.strength_target) {me.strength_current = me.strength_target;} + } + else if (me.strength_current > me.strength_target) + { + me.strength_current = me.strength_current - me.strength_rate; + if (me.strength_current < me.strength_target) {me.strength_current = me.strength_target;} + } + + if (me.ray_current < me.ray_target) + { + me.ray_current = me.ray_current + me.ray_rate; + if (me.ray_current > me.ray_target) {me.ray_current = me.ray_target;} + } + else if (me.ray_current > me.ray_target) + { + me.ray_current = me.ray_current - me.ray_rate; + if (me.ray_current < me.ray_target) {me.ray_current = me.ray_target;} + } + + if (me.upper_current < me.upper_target) + { + me.upper_current = me.upper_current + me.upper_rate; + if (me.upper_current > me.upper_target) {me.upper_current = me.upper_target;} + } + else if (me.upper_current > me.upper_target) + { + me.upper_current = me.upper_current - me.upper_rate; + if (me.upper_current < me.upper_target) {me.upper_current = me.upper_target;} + } + + if (me.glow_current < me.glow_target) + { + me.glow_current = me.glow_current + me.glow_rate; + if (me.glow_current > me.glow_target) {me.glow_current = me.glow_target;} + } + else if (me.glow_current > me.glow_target) + { + me.glow_current = me.glow_current - me.glow_rate; + if (me.glow_current < me.glow_target) {me.glow_current = me.glow_target;} + } + + setprop("/environment/aurora/set-strength", me.strength_current); + setprop("/environment/aurora/ray-factor", me.ray_current); + setprop("/environment/aurora/upper-alt-factor", me.upper_current); + setprop("/environment/aurora/afterglow", me.glow_current); + + }, + + +}; + +aurora_manager.init(); diff --git a/Shaders/skydome-ALS.frag b/Shaders/skydome-ALS.frag index 069621370..de3489644 100644 --- a/Shaders/skydome-ALS.frag +++ b/Shaders/skydome-ALS.frag @@ -35,6 +35,7 @@ uniform float aurora_strength; uniform float aurora_hsize; uniform float aurora_vsize; uniform float aurora_ray_factor; +uniform float aurora_penetration_factor; uniform float landing_light1_offset; uniform float landing_light2_offset; uniform float landing_light3_offset; @@ -147,14 +148,20 @@ void main() float hArg = dot(nView, direction); - - float aurora_v = smoothstep(0.2 - 0.6 * aurora_vsize * (1.0 - 0.8* aurora_ray_factor) , 0.2 , costheta + hNoiseAurora) * (1.0- smoothstep(0.3, 0.3 + aurora_vsize, costheta + hNoiseAurora)); - aurora_v *= (1.0 + 5.0 * aurora_ray_factor * (1.0 -smoothstep(0.2 - 0.6 * aurora_vsize * (1.0 - 0.8* aurora_ray_factor), 0.3, costheta + hNoiseAurora))); + float aurora_vEdge = 0.2 - 0.6 * aurora_vsize * (1.0 - 0.8* aurora_ray_factor); + float aurora_vArg = costheta + hNoiseAurora; + float aurora_v = smoothstep(aurora_vEdge , 0.2 , costheta + hNoiseAurora) * (1.0- smoothstep(0.3, 0.3 + aurora_vsize, aurora_vArg)); + aurora_v *= (1.0 + 5.0 * aurora_ray_factor * (1.0 -smoothstep(aurora_vEdge, 0.3, aurora_vArg))); float aurora_h = smoothstep(1.0 - aurora_hsize, 1.0, hArg); float aurora_time = 0.01 * osg_SimulationTime; vec3 auroraBaseColor = vec3 (0.0, 0.2, 0.1); + vec3 auroraFringeColor = vec3 (0.4, 0.15, 0.2); + + float fringe_factor = 1.0 - smoothstep(aurora_vEdge, aurora_vEdge + 0.08, aurora_vArg); + fringe_factor *= aurora_strength * aurora_penetration_factor; + auroraBaseColor = mix(auroraBaseColor, auroraFringeColor, fringe_factor ); float aurora_ray = mix(1.0, Noise2D(vec2(cbeta, 0.01 * aurora_time), 0.001), aurora_ray_factor);