diff --git a/Effects/thrust-flame.eff b/Effects/thrust-flame.eff
index f6bc85473..67fe892cd 100644
--- a/Effects/thrust-flame.eff
+++ b/Effects/thrust-flame.eff
@@ -4,22 +4,32 @@
Effects/thrust-flame
-
- white
+
+ white
- 0.1
- 0.5
- 0.5
- 0.2
- 0.1
+
+ 0.1
+ 0.5
+ 1.0
+ 0.5
+ 0.2
+ 0.1
0.95
0.55
0.0
1.0
0.8
0.3
+ 1.0
+ 0.8
+ 0.3
1
1
+
+
+
+
+
@@ -95,6 +105,11 @@
float
+
+ base_flame_density
+ float
+
+
shock_frequency
float
@@ -140,6 +155,21 @@
float
+
+ base_flame_r
+ float
+
+
+
+ base_flame_g
+ float
+
+
+
+ base_flame_b
+ float
+
+
diff --git a/Shaders/thrustflame-ALS.frag b/Shaders/thrustflame-ALS.frag
index 952003174..22de204ad 100644
--- a/Shaders/thrustflame-ALS.frag
+++ b/Shaders/thrustflame-ALS.frag
@@ -1,5 +1,6 @@
// -*-C++-*-
+#version 120
varying vec3 vertex;
varying vec3 viewDir;
@@ -7,6 +8,7 @@ varying vec3 viewDir;
uniform float osg_SimulationTime;
uniform float thrust_collimation;
uniform float thrust_density;
+uniform float base_flame_density;
uniform float shock_frequency;
uniform float noise_strength;
uniform float noise_scale;
@@ -19,56 +21,61 @@ uniform float flame_color_high_r;
uniform float flame_color_high_g;
uniform float flame_color_high_b;
+uniform float base_flame_r;
+uniform float base_flame_g;
+uniform float base_flame_b;
+
uniform int use_shocks;
uniform int use_noise;
float Noise3D(in vec3 coord, in float wavelength);
float Noise2D(in vec2 coord, in float wavelength);
-const int n_steps = 100;
+const int n_steps = 15;
float spherical_smoothstep (in vec3 pos)
{
-float noise = Noise3D(vec3(pos.x - osg_SimulationTime * 5.0 , pos.y, pos.z), 0.3);
+float l = length(vec3 (pos.x/2.0, pos.y,pos.z) );
-pos *=4.0;
+return 10.0 * thrust_density * base_flame_density * (1.0 - smoothstep(0.1, 0.2, l));
-pos.x *=0.5;
-float d = length(pos);
-
-
-
-return 3.0 * (1.0 - smoothstep(0.3, 0.7, d)) /float(n_steps)* (0.5 + 0.5 * noise);
}
-float spherical_smoothstep1 (in vec3 pos)
-{
-pos.x *=0.2;
-float d = length(pos);
-return 1.0 * (1.0 - smoothstep(0.3, 0.7, d)) /float(n_steps);
-}
float thrust_flame (in vec3 pos)
{
//float noise = Noise3D(vec3(pos.x - osg_SimulationTime * 20.0 , pos.y, pos.z), 0.3);
-float noise = Noise2D(vec2(pos.x - osg_SimulationTime * 30.0 , length(pos.yz)), noise_scale);
+float noise = 0.0;
-float d = 1.0 - pos.x/2.5 ;
-float radius = 0.2 + thrust_collimation * 1.4 * pow((pos.x+0.1),0.5);
+float d_rad = length(pos.yz);
+//float longFade = smoothstep(0.0, 5.0, pos.x) ;
+float longFade = pos.x/5.0;
-d *= (1.0 - smoothstep(0.125, radius, length(pos.yz))) * (1.0 - noise_strength + noise_strength* noise);
+float density = 1.0 - longFade;
+float radius = 0.2 + thrust_collimation * 1.2 * pow((pos.x+0.1),0.5);
+
+if (d_rad > radius) {return 0.0;}
+
+
+if (use_noise ==1)
+ {
+ noise = Noise2D(vec2(pos.x - osg_SimulationTime * 30.0 , d_rad), noise_scale);
+ }
+
+density *= (1.0 - smoothstep(0.125, radius, d_rad)) * (1.0 - noise_strength + noise_strength* noise);
if (use_shocks == 1)
{
- float shock = sin(pos.x * 20.0 * shock_frequency);
- d += shock * shock * shock * shock * (1.0 - pos.x/2.5) * (1.0 - smoothstep(0.05, 0.1, length(pos.yz))) * (1.0 - smoothstep(0.0, 1.0, thrust_collimation));
+ float shock = sin(pos.x * 10.0 * shock_frequency);
+ density += shock * shock * shock * shock * (1.0 - longFade) * (1.0 - smoothstep(0.05, 0.1, d_rad)) * (1.0 - smoothstep(0.0, 1.0, thrust_collimation));
}
-return 10.0 * thrust_density * d / (radius/0.2);
+
+return 10.0 * thrust_density * density / (radius/0.2);
}
@@ -76,14 +83,21 @@ return 10.0 * thrust_density * d / (radius/0.2);
void main()
{
-float t_x = 2.0 * abs(vertex.x) / max(viewDir.x, 0.0001);
-float t_y = 2.0 * abs(vertex.y) / max(viewDir.y, 0.0001);
-float t_z = 2.0 * abs(vertex.z) / max(viewDir.z, 0.0001);
+vec3 vDir = normalize(viewDir);
+
+float x_E, y_E, z_E;
+
+if (vDir.x > 0.0) {x_E = 5.0;} else {x_E = 0.0;}
+if (vDir.y > 0.0) {y_E = 1.0;} else {y_E = -1.0;}
+if (vDir.z > 0.0) {z_E = 1.0;} else {z_E = -1.0;}
+
+float t_x = (x_E - vertex.x) / vDir.x;
+float t_y = (y_E - vertex.y) / vDir.y;
+float t_z = (z_E - vertex.z) / vDir.z;
float t_min = min(t_x, t_y);
t_min = min(t_min, t_z);
-t_min = 5.0;
float dt = t_min / float(n_steps);
@@ -98,11 +112,7 @@ float density2 = 0.0;
for (int i = 0; i < n_steps; i++)
{
pos = pos + step;
- if ((pos.x > 5.0) || (pos.x <0.0)) {break;}
- if ((pos.y > 1.0) || (pos.y <-1.0)) {break;}
- if ((pos.z > 1.0) || (pos.z <-1.0)) {break;}
- //density1 += spherical_smoothstep(pos);
- //density2 += spherical_smoothstep1(pos);
+ density1 += spherical_smoothstep(pos) * dt;
density2 += thrust_flame(pos) * dt;
}
@@ -110,13 +120,18 @@ for (int i = 0; i < n_steps; i++)
float density = density1 + density2;
-density = clamp(density,0.0,1.0);
+//density = clamp(density,0.0,1.0);
+density = 1.0 - exp(-density);
+
+density1 = 1.0 - exp(-density1);
+density2 = 1.0 - exp(-density2);
vec3 flame_color_low = vec3 (flame_color_low_r, flame_color_low_g, flame_color_low_b);
vec3 flame_color_high = vec3 (flame_color_high_r, flame_color_high_g, flame_color_high_b);
-vec3 color = mix(flame_color_low, flame_color_high, density2+density1);
+vec3 color = mix(flame_color_low, flame_color_high, density2);
+color = mix(color, vec3(0.8, 1.0, 1.0), density1);
vec4 finalColor = vec4 (color.rgb, density);
diff --git a/Shaders/thrustflame-ALS.vert b/Shaders/thrustflame-ALS.vert
index c0668e3ca..0d2e38e4a 100644
--- a/Shaders/thrustflame-ALS.vert
+++ b/Shaders/thrustflame-ALS.vert
@@ -1,5 +1,7 @@
// -*-C++-*-
+#version 120
+
varying vec3 vertex;
varying vec3 viewDir;