From d0e3f5a5de602076b17c4fdae7d72a64586395bf Mon Sep 17 00:00:00 2001
From: BARANGER Emmanuel <embaranger@free.fr>
Date: Thu, 10 Feb 2011 16:51:10 +0100
Subject: [PATCH 1/5] Merge branch 'master' of git://gitorious.org/fg/fgdata


From 639c93e2dfdde19c7b023d06e7a05e573635db1e Mon Sep 17 00:00:00 2001
From: BARANGER Emmanuel <embaranger@free.fr>
Date: Fri, 11 Feb 2011 11:55:54 +0100
Subject: [PATCH 2/5] Merge branch 'master' of git://gitorious.org/fg/fgdata


From 8db0ca44ef787f7a8f78cb94f83dcb9883f4c3d7 Mon Sep 17 00:00:00 2001
From: Gijs de Rooy <gijsrooy@hotmail.com>
Date: Fri, 11 Feb 2011 18:33:53 +0100
Subject: [PATCH 3/5] An initial lightmap shader

---
 Effects/lightmap.eff  | 145 ++++++++++++++++++++++++++++++++++++++++++
 Shaders/lightmap.frag |  52 +++++++++++++++
 Shaders/lightmap.vert |  55 ++++++++++++++++
 3 files changed, 252 insertions(+)
 create mode 100644 Effects/lightmap.eff
 create mode 100644 Shaders/lightmap.frag
 create mode 100644 Shaders/lightmap.vert

diff --git a/Effects/lightmap.eff b/Effects/lightmap.eff
new file mode 100644
index 000000000..d0fa581f9
--- /dev/null
+++ b/Effects/lightmap.eff
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PropertyList>
+  <name>Effects/lightmap</name>
+  <parameters>
+    <texture n ="0">
+      <type>white</type>
+    </texture>
+    <vertex-program-two-side type="bool">false</vertex-program-two-side>
+    <material>
+      <color-mode-uniform>1</color-mode-uniform> <!-- DIFFUSE -->
+    </material>
+  </parameters>
+  <technique n="10">
+    <predicate>
+      <and>
+        <property>/sim/rendering/shader-effects</property>
+        <or>
+          <less-equal>
+            <value type="float">2.0</value>
+            <glversion/>
+          </less-equal>
+          <and>
+            <extension-supported>GL_ARB_shader_objects</extension-supported>
+            <extension-supported>GL_ARB_shading_language_100</extension-supported>
+            <extension-supported>GL_ARB_vertex_shader</extension-supported>
+            <extension-supported>GL_ARB_fragment_shader</extension-supported>
+          </and>
+        </or>
+      </and>
+    </predicate>
+    <pass>
+      <lighting>true</lighting>
+      <material>
+        <active><use>material/active</use></active>
+        <ambient><use>material/ambient</use></ambient>
+        <diffuse><use>material/diffuse</use></diffuse>
+        <specular><use>material/specular</use></specular>
+        <emissive><use>material/emissive</use></emissive>
+        <shininess><use>material/shininess</use></shininess>
+        <color-mode><use>material/color-mode</use></color-mode>
+      </material>
+      <blend>
+        <active><use>blend/active</use></active>
+        <source><use>blend/source</use></source>
+        <destination><use>blend/destination</use></destination>
+      </blend>
+      <shade-model><use>shade-model</use></shade-model>
+      <cull-face><use>cull-face</use></cull-face>
+      <rendering-hint><use>rendering-hint</use></rendering-hint>
+      <texture-unit>
+        <!-- The texture unit is always active because the shaders expect
+             that. -->
+        <unit>0</unit>
+        <!-- If there is a texture, the type in the derived effect
+        will be "2d". -->
+        <type><use>texture[0]/type</use></type>
+        <image><use>texture[0]/image</use></image>
+        <filter><use>texture[0]/filter</use></filter>
+        <wrap-s><use>texture[0]/wrap-s</use></wrap-s>
+        <wrap-t><use>texture[0]/wrap-t</use></wrap-t>
+        <!--
+        <internal-format>
+          <use>texture[0]/internal-format</use>
+        </internal-format>
+        -->
+      </texture-unit>
+	  <texture-unit>
+        <!-- The texture unit is always active because the shaders expect
+             that. -->
+        <unit>1</unit>
+        <!-- If there is a texture, the type in the derived effect
+        will be "2d". -->
+        <type><use>texture[1]/type</use></type>
+        <image><use>texture[1]/image</use></image>
+        <filter>linear-mipmap-linear</filter>
+		<wrap-s>repeat</wrap-s>
+		<wrap-t>repeat</wrap-t>
+      </texture-unit>
+      <vertex-program-two-side>
+        <use>vertex-program-two-side</use>
+      </vertex-program-two-side>
+      <program>
+        <vertex-shader>Shaders/lightmap.vert</vertex-shader>
+        <fragment-shader>Shaders/lightmap.frag</fragment-shader>
+      </program>
+      <uniform>
+        <name>texture</name>
+        <type>sampler-2d</type>
+        <value type="int">0</value>
+      </uniform>
+	  <uniform>
+        <name>lightmap_texture</name>
+        <type>sampler-2d</type>
+        <value type="int">1</value>
+      </uniform>
+      <uniform>
+        <name>colorMode</name>
+        <type>int</type>
+        <value><use>material/color-mode-uniform</use></value>
+      </uniform>
+    </pass>
+  </technique>
+  <technique n="11">
+    <pass>
+      <lighting>true</lighting>
+      <material>
+        <active><use>material/active</use></active>
+        <ambient><use>material/ambient</use></ambient>
+        <diffuse><use>material/diffuse</use></diffuse>
+        <specular><use>material/specular</use></specular>
+        <emissive><use>material/emissive</use></emissive>
+        <shininess><use>material/shininess</use></shininess>
+        <color-mode><use>material/color-mode</use></color-mode>
+      </material>
+      <blend>
+        <active><use>blend/active</use></active>
+        <source><use>blend/source</use></source>
+        <destination><use>blend/destination</use></destination>
+      </blend>
+      <shade-model><use>shade-model</use></shade-model>
+      <cull-face><use>cull-face</use></cull-face>
+      <rendering-hint><use>rendering-hint</use></rendering-hint>
+      <texture-unit>
+        <active><use>texture[0]/active</use></active>
+        <unit>0</unit>
+          <image><use>texture[0]/image</use></image>
+          <filter><use>texture[0]/filter</use></filter>
+          <wrap-s><use>texture[0]/wrap-s</use></wrap-s>
+          <wrap-t><use>texture[0]/wrap-t</use></wrap-t>
+          <!--
+          <internal-format>
+            <use>texture[0]/internal-format</use>
+          </internal-format>
+          -->
+        <environment>
+          <mode>modulate</mode>
+        </environment>
+      </texture-unit>
+      <!-- A two-sided lighting model is set by default near the root
+           of the scene graph. Perhaps that ought to be set in this
+           effect?
+        -->
+    </pass>
+  </technique>
+</PropertyList>
diff --git a/Shaders/lightmap.frag b/Shaders/lightmap.frag
new file mode 100644
index 000000000..740ddcd93
--- /dev/null
+++ b/Shaders/lightmap.frag
@@ -0,0 +1,52 @@
+// -*-C++-*-
+
+// Ambient term comes in gl_Color.rgb.
+varying vec4 diffuse_term;
+varying vec3 normal;
+varying float fogCoord;
+
+uniform sampler2D texture;
+uniform sampler2D lightmap_texture;
+
+float luminance(vec3 color)
+{
+    return dot(vec3(0.212671, 0.715160, 0.072169), color);
+}
+
+void main()
+{
+    vec3 n, halfV;
+    float NdotL, NdotHV, fogFactor;
+    vec4 color = gl_Color;
+    vec3 lightDir = gl_LightSource[0].position.xyz;
+    vec3 halfVector = gl_LightSource[0].halfVector.xyz;
+    vec4 texel;
+    vec4 fragColor;
+    vec4 specular = vec4(0.0);
+    n = normalize(normal);
+    // If gl_Color.a == 0, this is a back-facing polygon and the
+    // normal should be reversed.
+
+    n = (2.0 * gl_Color.a - 1.0) * n;
+    NdotL = max(dot(n, lightDir), 0.0);
+    if (NdotL > 0.0) {
+        color += diffuse_term * NdotL;
+        halfV = halfVector;
+        NdotHV = max(dot(n, halfV), 0.0);
+        if (gl_FrontMaterial.shininess > 0.0)
+            specular.rgb = (gl_FrontMaterial.specular.rgb
+                            * gl_LightSource[0].specular.rgb
+                            * pow(NdotHV, gl_FrontMaterial.shininess));
+    }
+    color.a = diffuse_term.a;
+    // This shouldn't be necessary, but our lighting becomes very
+    // saturated. Clamping the color before modulating by the texture
+    // is closer to what the OpenGL fixed function pipeline does.
+    color = clamp(color, 0.0, 1.0);
+    texel = texture2D(texture, gl_TexCoord[0].st);
+    fragColor = color * texel + specular;
+	vec3 lightmapTexel = texture2D(lightmap_texture, gl_TexCoord[0].st).rgb;
+	fragColor.rgb = max(fragColor.rgb, lightmapTexel*gl_FrontMaterial.diffuse*texel);
+    fogFactor = exp(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord);
+    gl_FragColor = mix(gl_Fog.color, fragColor, fogFactor);
+}
\ No newline at end of file
diff --git a/Shaders/lightmap.vert b/Shaders/lightmap.vert
new file mode 100644
index 000000000..74089f070
--- /dev/null
+++ b/Shaders/lightmap.vert
@@ -0,0 +1,55 @@
+// -*-C++-*-
+
+// Shader that uses OpenGL state values to do per-pixel lighting
+//
+// The only light used is gl_LightSource[0], which is assumed to be
+// directional.
+//
+// Diffuse colors come from the gl_Color, ambient from the material. This is
+// equivalent to osg::Material::DIFFUSE.
+
+#define MODE_OFF 0
+#define MODE_DIFFUSE 1
+#define MODE_AMBIENT_AND_DIFFUSE 2
+
+// The constant term of the lighting equation that doesn't depend on
+// the surface normal is passed in gl_{Front,Back}Color. The alpha
+// component is set to 1 for front, 0 for back in order to work around
+// bugs with gl_FrontFacing in the fragment shader.
+varying vec4 diffuse_term;
+varying vec3 normal;
+varying float fogCoord;
+uniform int colorMode;
+
+void main()
+{
+    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+    gl_Position = ftransform();
+    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+    normal = gl_NormalMatrix * gl_Normal;
+    vec4 ambient_color, diffuse_color;
+    if (colorMode == MODE_DIFFUSE) {
+        diffuse_color = gl_Color;
+        ambient_color = gl_FrontMaterial.ambient;
+    } else if (colorMode == MODE_AMBIENT_AND_DIFFUSE) {
+        diffuse_color = gl_Color;
+        ambient_color = gl_Color;
+    } else {
+        diffuse_color = gl_FrontMaterial.diffuse;
+        ambient_color = gl_FrontMaterial.ambient;
+    }
+    diffuse_term = diffuse_color * gl_LightSource[0].diffuse;
+    vec4 constant_term = gl_FrontMaterial.emission + ambient_color *
+        (gl_LightModel.ambient +  gl_LightSource[0].ambient);
+    // Super hack: if diffuse material alpha is less than 1, assume a
+    // transparency animation is at work
+    if (gl_FrontMaterial.diffuse.a < 1.0)
+        diffuse_term.a = gl_FrontMaterial.diffuse.a;
+    else
+        diffuse_term.a = gl_Color.a;
+    // Another hack for supporting two-sided lighting without using
+    // gl_FrontFacing in the fragment shader.
+    gl_FrontColor.rgb = constant_term.rgb;  gl_FrontColor.a = 1.0;
+    gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0;
+    fogCoord = abs(ecPosition.z / ecPosition.w);
+}

From 4fd862120974ee8c310f9af2d0759254ba6e42eb Mon Sep 17 00:00:00 2001
From: Gijs de Rooy <gijsrooy@hotmail.com>
Date: Fri, 11 Feb 2011 19:35:47 +0100
Subject: [PATCH 4/5] Lightmap: ATI fix by AndersG

---
 Shaders/lightmap.frag | 6 +++++-
 Shaders/lightmap.vert | 3 +++
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/Shaders/lightmap.frag b/Shaders/lightmap.frag
index 740ddcd93..6296c18c0 100644
--- a/Shaders/lightmap.frag
+++ b/Shaders/lightmap.frag
@@ -1,6 +1,10 @@
 // -*-C++-*-
 
 // Ambient term comes in gl_Color.rgb.
+//
+// See http://wiki.flightgear.org/index.php/Howto:_Lightmap for details on 
+// how to use it.
+
 varying vec4 diffuse_term;
 varying vec3 normal;
 varying float fogCoord;
@@ -46,7 +50,7 @@ void main()
     texel = texture2D(texture, gl_TexCoord[0].st);
     fragColor = color * texel + specular;
 	vec3 lightmapTexel = texture2D(lightmap_texture, gl_TexCoord[0].st).rgb;
-	fragColor.rgb = max(fragColor.rgb, lightmapTexel*gl_FrontMaterial.diffuse*texel);
+	fragColor.rgb = max(fragColor.rgb, lightmapTexel * gl_FrontMaterial.diffuse.rgb * texel.rgb);
     fogFactor = exp(-gl_Fog.density * gl_Fog.density * fogCoord * fogCoord);
     gl_FragColor = mix(gl_Fog.color, fragColor, fogFactor);
 }
\ No newline at end of file
diff --git a/Shaders/lightmap.vert b/Shaders/lightmap.vert
index 74089f070..19f1ddc2d 100644
--- a/Shaders/lightmap.vert
+++ b/Shaders/lightmap.vert
@@ -7,6 +7,9 @@
 //
 // Diffuse colors come from the gl_Color, ambient from the material. This is
 // equivalent to osg::Material::DIFFUSE.
+//
+// See http://wiki.flightgear.org/index.php/Howto:_Lightmap for details on 
+// how to use it.
 
 #define MODE_OFF 0
 #define MODE_DIFFUSE 1

From a976dc73109a9f02354c84db7ff1b50b3630f5e2 Mon Sep 17 00:00:00 2001
From: Stuart Buchanan <stuart_d_buchanan@yahoo.co.uk>
Date: Fri, 11 Feb 2011 20:16:49 +0000
Subject: [PATCH 5/5] Stop c172p pitching backwards in a tailwind. Patch from
 Ron JENSEN.

---
 Aircraft/c172p/c172p.xml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/Aircraft/c172p/c172p.xml b/Aircraft/c172p/c172p.xml
index 0eae36b91..21abd27de 100644
--- a/Aircraft/c172p/c172p.xml
+++ b/Aircraft/c172p/c172p.xml
@@ -778,7 +778,9 @@
                     <property>aero/qbar-psf</property>
                     <property>metrics/Sw-sqft</property>
                     <property>metrics/cbarw-ft</property>
-                    <property>aero/alpha-rad</property>
+                    <sin>
+                        <property>aero/alpha-rad</property>
+                    </sin>
                     <value>-1.8000</value>
                 </product>
             </function>