diff --git a/Aircraft/Generic/WalkView/walkview.nas b/Aircraft/Generic/WalkView/walkview.nas
index 33df1e082..c44467216 100644
--- a/Aircraft/Generic/WalkView/walkview.nas
+++ b/Aircraft/Generic/WalkView/walkview.nas
@@ -12,6 +12,8 @@
# Global API. Automatically selects the right walker for the current view.
# NOTE: Coordinates are always 3 component lists: [x, y, z].
+# The coordinate system is the same as the main 3d model one.
+# X - back, Y - right and Z - up.
# Set the forward speed of the active walker.
# speed - walker speed in m/sec
@@ -39,6 +41,17 @@ var side_step = func (speed) {
}
}
+# Get the currently active walker.
+# Returns the active walker object or nil otherwise.
+var active_walker = func {
+ var cv = view.current.getPath();
+ if (contains(walkers, cv)) {
+ return walkers[cv];
+ } else {
+ return nil;
+ }
+}
+
###############################################################################
# The walker class.
# ==============================================================================
@@ -77,6 +90,10 @@ var side_step = func (speed) {
# [19.5, 0.3, -8.85]);
# var walker = walkview.walker.new("Passenger View", constraint);
#
+# NOTES:
+# Currently there can only be one view manager per view so the
+# walk view should not have any other view manager.
+#
var walker = {
new : func (view_name, constraints = nil) {
var obj = { parents : [walker] };
diff --git a/Effects/cloud.eff b/Effects/cloud.eff
index bb6d3c31e..c1f5c4183 100644
--- a/Effects/cloud.eff
+++ b/Effects/cloud.eff
@@ -36,7 +36,7 @@
false
- 10
+ 9
DepthSortedBin
diff --git a/Shaders/contrail.frag b/Shaders/contrail.frag
new file mode 100644
index 000000000..2a9636cfd
--- /dev/null
+++ b/Shaders/contrail.frag
@@ -0,0 +1,15 @@
+uniform sampler2D baseTexture;
+
+varying float fogFactor;
+varying float distanceFactor;
+varying vec2 texCoord;
+
+
+void main(void)
+{
+ vec4 base = texture2D( baseTexture, gl_TexCoord[0].st);
+ vec4 finalColor = base * gl_Color;
+ gl_FragColor.rgb = mix(gl_Fog.color.rgb, finalColor.rgb, fogFactor);
+ gl_FragColor.a = mix(0.0, finalColor.a, distanceFactor);
+}
+
diff --git a/Shaders/contrail.vert b/Shaders/contrail.vert
new file mode 100644
index 000000000..7f4e86439
--- /dev/null
+++ b/Shaders/contrail.vert
@@ -0,0 +1,99 @@
+// -*-C++-*-
+#version 120
+
+varying float fogFactor;
+varying float distanceFactor;
+
+uniform sampler3D Noise;
+
+uniform float scale_x;
+uniform float scale_y;
+uniform float scale_z;
+
+uniform float offset_x;
+uniform float offset_y;
+uniform float offset_z;
+
+uniform float fade_max;
+uniform float fade_min;
+
+void main(void)
+{
+ vec4 rawpos = gl_Vertex;
+
+ float shade = 0.9;
+ float cloud_height = 30000.0;
+
+ // map noise vectors
+ vec4 noisevec = texture3D(Noise, rawpos.xyz);
+ float noise0 = (noisevec.r * 2) - 1;
+ float noise1 =(noisevec.g * 2) - 1;
+ vec2 noise2 = noisevec.xy;
+
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+ //gl_TexCoord[0] = gl_MultiTexCoord0 + vec4(textureIndexX, textureIndexY, 0.0, 0.0);
+ vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+ vec4 l = gl_ModelViewMatrixInverse * vec4(0.0,0.0,1.0,1.0);
+ vec3 u = normalize(ep.xyz - l.xyz);
+
+ // Find a rotation matrix that rotates 1,0,0 into u. u, r and w are
+ // the columns of that matrix.
+ vec3 absu = abs(u);
+ vec3 r = normalize(vec3(-u.y, u.x, 0));
+ vec3 w = cross(u, r);
+
+ // Do the matrix multiplication by [ u r w pos]. Scale
+ // the x component first
+ gl_Position = vec4(gl_Vertex.x * scale_x, 0.0, 0.0, 1.0);
+ gl_Position.xyz += gl_Vertex.x * u;
+ gl_Position.xyz += gl_Vertex.y * r * scale_y;
+ gl_Position.xyz += gl_Vertex.z * w * scale_z;
+
+ // Adjust the position post-rotation and scaling
+ gl_Position.yz -= 3/2;
+
+ // Offset in y and z directions using a random noise factor
+ float offset_Y = (noise0 * offset_y) + offset_y/2;
+ float offset_Z = (noise0 * offset_z) + offset_z/2;
+
+ distanceFactor = 1.0 - clamp(abs(noise0), fade_min, fade_max);
+// distanceFactor = 0.5;
+
+ gl_Position.y += offset_Y;
+ gl_Position.z += offset_Z;
+
+ gl_Position.xyz += gl_Color.xyz;
+
+ // Determine a lighting normal based on the vertex position from the
+ // center of the cloud, so that sprite on the opposite side of the cloud to the sun are darker.
+ float n = dot(normalize(-gl_LightSource[0].position.xyz),
+ normalize(mat3x3(gl_ModelViewMatrix) * (- gl_Position.xyz)));;
+
+ // Determine the position - used for fog and shading calculations
+ vec3 ecPosition = vec3(gl_ModelViewMatrix * gl_Position);
+ float fogCoord = abs(ecPosition.z);
+ float fract = smoothstep(0.0, cloud_height, gl_Position.z + cloud_height);
+
+ // Final position of the sprite
+ gl_Position = gl_ModelViewProjectionMatrix * gl_Position;
+
+ // Calculate the total offset distance in the yx plane, normalised
+ /*float distance = normalize(sqrt(pow(gl_Position.y, 2) + pow(gl_Position.z, 2)));
+ distanceFactor = 1.0 - clamp(distance, 0.5, 1.0);*/
+ // Determine the shading of the sprite based on its vertical position and position relative to the sun.
+ n = min(smoothstep(-0.5, 0.0, n), fract);
+
+ // Determine the shading based on a mixture from the backlight to the front
+ vec4 backlight = gl_LightSource[0].diffuse * shade;
+
+ gl_FrontColor = mix(backlight, gl_LightSource[0].diffuse, n);
+ gl_FrontColor += gl_FrontLightModelProduct.sceneColor;
+
+ // As we get within 100m of the sprite, it is faded out. Equally at large distances it also fades out.
+ gl_FrontColor.a = min(smoothstep(10.0, 100.0, fogCoord), 1 - smoothstep(30000.0, 40000.0, fogCoord));
+ gl_BackColor = gl_FrontColor;
+
+ // Fog doesn't affect clouds as much as other objects.
+ fogFactor = exp( -gl_Fog.density * fogCoord);
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+}
diff --git a/gui/dialogs/rendering.xml b/gui/dialogs/rendering.xml
index 8dae4d4c2..114f1f0ca 100644
--- a/gui/dialogs/rendering.xml
+++ b/gui/dialogs/rendering.xml
@@ -270,6 +270,15 @@
dialog-apply
+
+
+ left
+
+ /sim/rendering/contrail-shader
+
+ dialog-apply
+
+
diff --git a/materials.xml b/materials.xml
index 5239fe2d2..8e41fbfd9 100644
--- a/materials.xml
+++ b/materials.xml
@@ -2935,7 +2935,7 @@ Shared parameters for various materials.
0.92157
0.92157
0.76471
- 1
+ 1.0
@@ -2945,7 +2945,7 @@ Shared parameters for various materials.
0.92157
0.92157
0.76471
- 1
+ 1.0
@@ -2955,7 +2955,7 @@ Shared parameters for various materials.
0.92157
0.92157
0.76471
- 1
+ 1.0
@@ -2985,7 +2985,7 @@ Shared parameters for various materials.
0.92157
0.92157
0.76471
- 1
+ 1.0
@@ -2995,7 +2995,7 @@ Shared parameters for various materials.
0.92157
0.92157
0.76471
- 1
+ 1.0
@@ -3005,7 +3005,7 @@ Shared parameters for various materials.
0.92157
0.84314
0.078431
- 1
+ 1.0
@@ -3035,7 +3035,7 @@ Shared parameters for various materials.
0.92157
0.35294
0.35294
- 1
+ 1.0
@@ -3065,7 +3065,7 @@ Shared parameters for various materials.
0.078431
0.92157
0.078431
- 1
+ 1.0
diff --git a/preferences.xml b/preferences.xml
index 38dc73a39..df40e2f90 100644
--- a/preferences.xml
+++ b/preferences.xml
@@ -58,6 +58,7 @@ Started September 2000 by David Megginson, david@megginson.com
false
5
8
+ AutomaticSelection
1500
9000
@@ -137,9 +138,11 @@ Started September 2000 by David Megginson, david@megginson.com
0
0
0
+ 0
2000.0
0.0
-
+
+
120
@@ -783,6 +786,22 @@ Started September 2000 by David Megginson, david@megginson.com
1.3
+
+ 30000
+ 330
+ 50
+ 35
+ 1.3
+
+
+
+ 40000
+ 340
+ 70
+ 35
+ 1.3
+
+
@@ -790,14 +809,14 @@ Started September 2000 by David Megginson, david@megginson.com
true
- scattered
+ clear
4000
600
150
40000
- cirrus
+ clear
19500
65
25