Browse Source

Shader refactoring. Renamed the lit object ubershader as LitSolid; it now handles also deferred rendering.
Reduced max. vertex light count to 4 to prevent excessive shader permutations.

Lasse Öörni 13 years ago
parent
commit
e8d549ef7e
58 changed files with 1061 additions and 1545 deletions
  1. 0 31
      Bin/CoreData/Shaders/GLSL/Ambient.frag
  2. 0 28
      Bin/CoreData/Shaders/GLSL/Ambient.vert
  3. 0 21
      Bin/CoreData/Shaders/GLSL/Ambient.xml
  4. 0 51
      Bin/CoreData/Shaders/GLSL/Deferred.frag
  5. 0 39
      Bin/CoreData/Shaders/GLSL/Deferred.vert
  6. 0 23
      Bin/CoreData/Shaders/GLSL/Deferred.xml
  7. 0 109
      Bin/CoreData/Shaders/GLSL/ForwardLit.frag
  8. 0 96
      Bin/CoreData/Shaders/GLSL/ForwardLit.vert
  9. 0 29
      Bin/CoreData/Shaders/GLSL/ForwardLit.xml
  10. 41 33
      Bin/CoreData/Shaders/GLSL/Lighting.vert
  11. 41 30
      Bin/CoreData/Shaders/GLSL/LitParticle.frag
  12. 35 19
      Bin/CoreData/Shaders/GLSL/LitParticle.vert
  13. 31 8
      Bin/CoreData/Shaders/GLSL/LitParticle.xml
  14. 168 0
      Bin/CoreData/Shaders/GLSL/LitSolid.frag
  15. 120 0
      Bin/CoreData/Shaders/GLSL/LitSolid.vert
  16. 56 0
      Bin/CoreData/Shaders/GLSL/LitSolid.xml
  17. 0 42
      Bin/CoreData/Shaders/GLSL/Material.frag
  18. 0 31
      Bin/CoreData/Shaders/GLSL/Material.vert
  19. 0 21
      Bin/CoreData/Shaders/GLSL/Material.xml
  20. 0 38
      Bin/CoreData/Shaders/GLSL/Prepass.frag
  21. 0 31
      Bin/CoreData/Shaders/GLSL/Prepass.vert
  22. 0 13
      Bin/CoreData/Shaders/GLSL/Prepass.xml
  23. 1 3
      Bin/CoreData/Shaders/GLSL/Shadow.frag
  24. 2 7
      Bin/CoreData/Shaders/GLSL/Shadow.vert
  25. 0 1
      Bin/CoreData/Shaders/GLSL/Shadow.xml
  26. 1 1
      Bin/CoreData/Shaders/GLSL/Uniforms.vert
  27. 0 76
      Bin/CoreData/Shaders/HLSL/Ambient.hlsl
  28. 0 22
      Bin/CoreData/Shaders/HLSL/Ambient.xml
  29. 0 117
      Bin/CoreData/Shaders/HLSL/Deferred.hlsl
  30. 0 26
      Bin/CoreData/Shaders/HLSL/Deferred.xml
  31. 0 216
      Bin/CoreData/Shaders/HLSL/ForwardLit.hlsl
  32. 0 31
      Bin/CoreData/Shaders/HLSL/ForwardLit.xml
  33. 44 35
      Bin/CoreData/Shaders/HLSL/Lighting.hlsl
  34. 69 48
      Bin/CoreData/Shaders/HLSL/LitParticle.hlsl
  35. 31 8
      Bin/CoreData/Shaders/HLSL/LitParticle.xml
  36. 311 0
      Bin/CoreData/Shaders/HLSL/LitSolid.hlsl
  37. 58 0
      Bin/CoreData/Shaders/HLSL/LitSolid.xml
  38. 0 86
      Bin/CoreData/Shaders/HLSL/Material.hlsl
  39. 0 22
      Bin/CoreData/Shaders/HLSL/Material.xml
  40. 0 81
      Bin/CoreData/Shaders/HLSL/Prepass.hlsl
  41. 0 14
      Bin/CoreData/Shaders/HLSL/Prepass.xml
  42. 4 11
      Bin/CoreData/Shaders/HLSL/Shadow.hlsl
  43. 0 1
      Bin/CoreData/Shaders/HLSL/Shadow.xml
  44. 1 1
      Bin/CoreData/Shaders/HLSL/Uniforms.hlsl
  45. 6 6
      Bin/CoreData/Techniques/Diff.xml
  46. 2 2
      Bin/CoreData/Techniques/DiffAlpha.xml
  47. 7 7
      Bin/CoreData/Techniques/DiffAlphaMask.xml
  48. 1 1
      Bin/CoreData/Techniques/DiffLitParticleAlpha.xml
  49. 6 6
      Bin/CoreData/Techniques/DiffNormal.xml
  50. 2 2
      Bin/CoreData/Techniques/DiffNormalAlpha.xml
  51. 7 7
      Bin/CoreData/Techniques/DiffNormalAlphaMask.xml
  52. 6 6
      Bin/CoreData/Techniques/NoTexture.xml
  53. 2 2
      Bin/CoreData/Techniques/NoTextureAlpha.xml
  54. 1 1
      Docs/Reference.dox
  55. 1 1
      Engine/Graphics/Drawable.h
  56. 0 1
      Engine/Graphics/Renderer.cpp
  57. 0 2
      Engine/Graphics/Renderer.h
  58. 6 1
      Tools/ShaderCompiler/ShaderCompiler.cpp

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Ambient.frag

@@ -1,31 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Fog.frag"
-#include "Lighting.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec4 diffColor = cMatDiffColor * diffInput;
-    #else
-        vec4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor;
-    #endif
-
-    vec3 finalColor = vVertexLighting.rgb * diffColor.rgb;
-    gl_FragColor = vec4(GetFog(finalColor, vVertexLighting.a), diffColor.a);
-}

+ 0 - 28
Bin/CoreData/Shaders/GLSL/Ambient.vert

@@ -1,28 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 21
Bin/CoreData/Shaders/GLSL/Ambient.xml

@@ -1,21 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 51
Bin/CoreData/Shaders/GLSL/Deferred.frag

@@ -1,51 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-varying vec4 vVertexLighting;
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        vec3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor.rgb;
-    #endif
-
-    #ifdef NORMALMAP
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord));
-    #else
-        vec3 normal = vNormal;
-    #endif
-
-    #ifdef SPECMAP
-        float specIntensity = cMatSpecColor.g * texture2D(sSpecMap, vTexCoord).g;
-    #else
-        float specIntensity = cMatSpecColor.g;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    gl_FragData[0] = vec4(GetFog(vVertexLighting.rgb * diffColor, vVertexLighting.a), 1.0);
-    gl_FragData[1] = GetFogFactor(vVertexLighting.a) * vec4(diffColor, specIntensity);
-    gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
-    #ifndef HWDEPTH
-        gl_FragData[3] = vec4(EncodeDepth(vVertexLighting.a), 0.0);
-    #endif
-}

+ 0 - 39
Bin/CoreData/Shaders/GLSL/Deferred.vert

@@ -1,39 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    vNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-    #endif
-    
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-    
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 23
Bin/CoreData/Shaders/GLSL/Deferred.xml

@@ -1,23 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="HW" define="HWDEPTH" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 0 - 109
Bin/CoreData/Shaders/GLSL/ForwardLit.frag

@@ -1,109 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Lighting.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vLightVec;
-#ifdef SPECULAR
-    varying vec3 vEyeVec;
-#endif
-#ifndef NORMALMAP
-    varying vec3 vNormal;
-#endif
-#ifdef SHADOW
-    #if defined(DIRLIGHT)
-        varying vec4 vShadowPos[4];
-    #elif defined(SPOTLIGHT)
-        varying vec4 vShadowPos;
-    #else
-        varying vec3 vShadowPos;
-    #endif
-#endif
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
-#endif
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec4 diffColor = cMatDiffColor * diffInput;
-    #else
-        vec4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor;
-    #endif
-
-    vec3 lightColor;
-    vec3 lightDir;
-    vec3 finalColor;
-    float diff;
-
-    #ifdef NORMALMAP
-        vec3 normal = DecodeNormal(texture2D(sNormalMap, vTexCoord));
-    #else
-        vec3 normal = normalize(vNormal);
-    #endif
-
-    #ifdef DIRLIGHT
-        #ifdef NORMALMAP
-            lightDir = normalize(vLightVec.xyz);
-        #else
-            lightDir = vLightVec.xyz;
-        #endif
-        diff = GetDiffuseDir(normal, lightDir);
-    #else
-        diff = GetDiffusePointOrSpot(normal, vLightVec.xyz, lightDir);
-    #endif
-
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            vec4 shadowPos = GetDirShadowPos(vShadowPos, vLightVec.w);
-            diff *= min(GetShadow(shadowPos) + GetShadowFade(vLightVec.w), 1.0);
-        #elif defined(SPOTLIGHT)
-            diff *= GetShadow(vShadowPos);
-        #else
-            diff *= GetCubeShadow(vShadowPos);
-        #endif
-    #endif
-
-    #if defined(SPOTLIGHT)
-        lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
-    #elif defined(CUBEMASK)
-        lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
-    #else
-        lightColor = cLightColor.rgb;
-    #endif
-
-    #ifdef SPECULAR
-        #ifdef SPECMAP
-            vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).g;
-        #else
-            vec3 specColor = cMatSpecColor.rgb;
-        #endif
-        float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecColor.a);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
-    #else
-        finalColor = diff * lightColor * diffColor.rgb;
-    #endif
-
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
-    #else
-        gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
-    #endif
-}

+ 0 - 96
Bin/CoreData/Shaders/GLSL/ForwardLit.vert

@@ -1,96 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vLightVec;
-#ifdef SPECULAR
-    varying vec3 vEyeVec;
-#endif
-#ifndef NORMALMAP
-    varying vec3 vNormal;
-#endif
-#ifdef SHADOW
-    #if defined(DIRLIGHT)
-        varying vec4 vShadowPos[4];
-    #elif defined(SPOTLIGHT)
-        varying vec4 vShadowPos;
-    #else
-        varying vec3 vShadowPos;
-    #endif
-#endif
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        vec3 vNormal;
-        vec3 vTangent;
-        vec3 vBitangent;
-    #endif
-
-    vNormal = GetWorldNormal(modelMatrix);
-    vec4 projWorldPos = vec4(worldPos, 1.0);
-
-    #ifdef SHADOW
-        // Shadow projection: transform from world space to shadow space
-        #if defined(DIRLIGHT)
-            vShadowPos[0] = cLightMatrices[0] * projWorldPos;
-            vShadowPos[1] = cLightMatrices[1] * projWorldPos;
-            vShadowPos[2] = cLightMatrices[2] * projWorldPos;
-            vShadowPos[3] = cLightMatrices[3] * projWorldPos;
-        #elif defined(SPOTLIGHT)
-            vShadowPos = cLightMatrices[1] * projWorldPos;
-        #else
-            vShadowPos = worldPos - cLightPos.xyz;
-        #endif
-    #endif
-
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        vSpotPos = cLightMatrices[0] * projWorldPos;
-    #endif
-
-    #ifdef POINTLIGHT
-        vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * (cLightPos.xyz - worldPos);
-    #endif
-
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        #ifdef DIRLIGHT
-            vLightVec = vec4(cLightDir * tbn, GetDepth(gl_Position));
-        #else
-            vLightVec = vec4((cLightPos.xyz - worldPos) * tbn * cLightPos.w, GetDepth(gl_Position));
-        #endif
-        #ifdef SPECULAR
-            vEyeVec = (cCameraPos - worldPos) * tbn;
-        #endif
-    #else
-        #ifdef DIRLIGHT
-            vLightVec = vec4(cLightDir, GetDepth(gl_Position));
-        #else
-            vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
-        #endif
-        #ifdef SPECULAR
-            vEyeVec = cCameraPos - worldPos;
-        #endif
-    #endif
-}

+ 0 - 29
Bin/CoreData/Shaders/GLSL/ForwardLit.xml

@@ -1,29 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />           
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <option name="LQ" define="LQSHADOW" require="SHADOW" />
-    </shader>
-</shaders>

+ 41 - 33
Bin/CoreData/Shaders/GLSL/Lighting.vert

@@ -13,38 +13,46 @@ float GetVertexLight(int index, vec3 worldPos, vec3 normal)
     float invCutoff = cVertexLights[index * 3 + 2].w;
     float invCutoff = cVertexLights[index * 3 + 2].w;
 
 
     // Directional light
     // Directional light
-    #ifndef BILLBOARD
-        if (invRange == 0.0)
-        {
-            float NdotL = max(dot(normal, lightDir), 0.0);
-            return NdotL;
-        }
-        // Point/spot light
-        else
-        {
-            vec3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            vec3 localDir = lightVec / lightDist;
-            float NdotL = max(dot(normal, localDir), 0.0);
-            float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
-            return NdotL * atten * spotAtten;
-        }
-    #else
-        if (invRange == 0.0)
-            return 1.0;
-        // Point/spot light
-        else
-        {
-            vec3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            vec3 localDir = lightVec / lightDist;
-            float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
-            return atten * spotAtten;
-        }
-    #endif
+    if (invRange == 0.0)
+    {
+        float NdotL = max(dot(normal, lightDir), 0.0);
+        return NdotL;
+    }
+    // Point/spot light
+    else
+    {
+        vec3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        vec3 localDir = lightVec / lightDist;
+        float NdotL = max(dot(normal, localDir), 0.0);
+        float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
+        return NdotL * atten * spotAtten;
+    }
+}
+
+float GetVertexLightVolumetric(int index, vec3 worldPos)
+{
+    vec3 lightDir = cVertexLights[index * 3 + 1].xyz;
+    vec3 lightPos = cVertexLights[index * 3 + 2].xyz;
+    float invRange = cVertexLights[index * 3].w;
+    float cutoff = cVertexLights[index * 3 + 1].w;
+    float invCutoff = cVertexLights[index * 3 + 2].w;
+
+    // Directional light
+    if (invRange == 0.0)
+        return 1.0;
+    // Point/spot light
+    else
+    {
+        vec3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        vec3 localDir = lightVec / lightDist;
+        float atten = clamp(1.0 - lightDist * lightDist, 0.0, 1.0);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = clamp((spotEffect - cutoff) * invCutoff, 0.0, 1.0);
+        return atten * spotAtten;
+    }
 }
 }
 #endif
 #endif

+ 41 - 30
Bin/CoreData/Shaders/GLSL/LitParticle.frag

@@ -7,16 +7,21 @@ varying vec2 vTexCoord;
 #ifdef VERTEXCOLOR
 #ifdef VERTEXCOLOR
     varying vec4 vColor;
     varying vec4 vColor;
 #endif
 #endif
-varying vec4 vLightVec;
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
 #endif
 #endif
 
 
 void main()
 void main()
 {
 {
+    // Get material diffuse albedo
     #ifdef DIFFMAP
     #ifdef DIFFMAP
         vec4 diffInput = texture2D(sDiffMap, vTexCoord);
         vec4 diffInput = texture2D(sDiffMap, vTexCoord);
         #ifdef ALPHAMASK
         #ifdef ALPHAMASK
@@ -32,31 +37,37 @@ void main()
         diffColor *= vColor;
         diffColor *= vColor;
     #endif
     #endif
 
 
-    vec3 lightColor;
-    vec3 lightVec;
-    vec3 finalColor;
-    float diff;
-
-    #ifdef DIRLIGHT
-        diff = GetDiffuseDirVolumetric();
-    #else
-        diff = GetDiffusePointOrSpotVolumetric(vLightVec.xyz);
-    #endif
-
-    #if defined(SPOTLIGHT)
-        lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
-    #elif defined(CUBEMASK)
-        lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
-    #else
-        lightColor = cLightColor.rgb;
-    #endif
-
-    finalColor = diff * lightColor * diffColor.rgb;
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        vec3 lightColor;
+        vec3 finalColor;
+        float diff;
+    
+        #ifdef DIRLIGHT
+            diff = GetDiffuseDirVolumetric();
+        #else
+            diff = GetDiffusePointOrSpotVolumetric(vLightVec.xyz);
+        #endif
     
     
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
+        #if defined(SPOTLIGHT)
+            lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
+        #elif defined(CUBEMASK)
+            lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
+        #else
+            lightColor = cLightColor.rgb;
+        #endif
+    
+        finalColor = diff * lightColor * diffColor.rgb;
+        
+        #ifdef AMBIENT
+            finalColor += cAmbientColor * diffColor.rgb;
+            gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
+        #else
+            gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
+        #endif
     #else
     #else
-        gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
+        // Ambient & per-vertex lighting
+        vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
+        gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
     #endif
     #endif
 }
 }

+ 35 - 19
Bin/CoreData/Shaders/GLSL/LitParticle.vert

@@ -1,16 +1,21 @@
 #include "Uniforms.vert"
 #include "Uniforms.vert"
 #include "Transform.vert"
 #include "Transform.vert"
+#include "Lighting.vert"
 
 
 varying vec2 vTexCoord;
 varying vec2 vTexCoord;
 #ifdef VERTEXCOLOR
 #ifdef VERTEXCOLOR
     varying vec4 vColor;
     varying vec4 vColor;
 #endif
 #endif
-varying vec4 vLightVec;
-#ifdef SPOTLIGHT
-    varying vec4 vSpotPos;
-#endif
-#ifdef POINTLIGHT
-    varying vec3 vCubeMaskVec;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
 #endif
 #endif
 
 
 void main()
 void main()
@@ -24,20 +29,31 @@ void main()
         vColor = iColor;
         vColor = iColor;
     #endif
     #endif
 
 
-    vec4 projWorldPos = vec4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+    #if PERPIXEL
+        // Per-pixel forward lighting
+        vec4 projWorldPos = vec4(worldPos, 1.0);
+    
+        #ifdef DIRLIGHT
+            vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+        #else
+            vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            vSpotPos = cLightMatrices[0] * projWorldPos;
+        #endif
+    
+        #ifdef POINTLIGHT
+            vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * vLightVec.xyz;
+        #endif
     #else
     #else
-        vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
-    #endif
+        // Ambient & per-vertex lighting
+        vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
 
 
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        vSpotPos = cLightMatrices[0] * projWorldPos;
-    #endif
-
-    #ifdef POINTLIGHT
-        vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * vLightVec.xyz;
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                vVertexLight.rgb += GetVertexLightVolumetric(i, worldPos) * cVertexLights[i * 3].rgb;
+        #endif
     #endif
     #endif
 }
 }

+ 31 - 8
Bin/CoreData/Shaders/GLSL/LitParticle.xml

@@ -1,9 +1,23 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
         <option name="VCol" define="VERTEXCOLOR" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
+        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
+        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
+        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <variation name="" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Skinned" define="SKINNED" />
@@ -11,12 +25,21 @@
     </shader>
     </shader>
     <shader type="ps">
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
         <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />           
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
     </shader>
     </shader>
 </shaders>
 </shaders>

+ 168 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.frag

@@ -0,0 +1,168 @@
+#include "Uniforms.frag"
+#include "Samplers.frag"
+#include "Lighting.frag"
+#include "Fog.frag"
+
+varying vec2 vTexCoord;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPECULAR
+        varying vec3 vEyeVec;
+    #endif
+    #ifndef NORMALMAP
+        varying vec3 vNormal;
+    #endif
+    #ifdef SHADOW
+        #if defined(DIRLIGHT)
+            varying vec4 vShadowPos[4];
+        #elif defined(SPOTLIGHT)
+            varying vec4 vShadowPos;
+        #else
+            varying vec3 vShadowPos;
+        #endif
+    #endif
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
+    varying vec3 vNormal;
+    #ifdef NORMALMAP
+        varying vec3 vTangent;
+        varying vec3 vBitangent;
+    #else
+        varying vec4 vScreenPos;
+    #endif
+#endif
+
+void main()
+{
+    // Get material diffuse albedo
+    #ifdef DIFFMAP
+        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
+        #ifdef ALPHAMASK
+            if (diffInput.a < 0.5)
+                discard;
+        #endif
+        vec4 diffColor = cMatDiffColor * diffInput;
+    #else
+        vec4 diffColor = cMatDiffColor;
+    #endif
+    
+    // Get material specular albedo
+    #ifdef SPECMAP
+        vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).rgb;
+    #else
+        vec3 specColor = cMatSpecColor.rgb;
+    #endif
+
+    #if defined(PERPIXEL)
+        // Per-pixel forward lighting
+        vec3 lightColor;
+        vec3 lightDir;
+        vec3 finalColor;
+        float diff;
+
+        #ifdef NORMALMAP
+            vec3 normal = DecodeNormal(texture2D(sNormalMap, vTexCoord));
+        #else
+            vec3 normal = normalize(vNormal);
+        #endif
+    
+        #ifdef DIRLIGHT
+            #ifdef NORMALMAP
+                lightDir = normalize(vLightVec.xyz);
+            #else
+                lightDir = vLightVec.xyz;
+            #endif
+            diff = GetDiffuseDir(normal, lightDir);
+        #else
+            diff = GetDiffusePointOrSpot(normal, vLightVec.xyz, lightDir);
+        #endif
+    
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                vec4 shadowPos = GetDirShadowPos(vShadowPos, vLightVec.w);
+                diff *= min(GetShadow(shadowPos) + GetShadowFade(vLightVec.w), 1.0);
+            #elif defined(SPOTLIGHT)
+                diff *= GetShadow(vShadowPos);
+            #else
+                diff *= GetCubeShadow(vShadowPos);
+            #endif
+        #endif
+    
+        #if defined(SPOTLIGHT)
+            lightColor = vSpotPos.w > 0.0 ? texture2DProj(sLightSpotMap, vSpotPos).rgb * cLightColor.rgb : vec3(0.0, 0.0, 0.0);
+        #elif defined(CUBEMASK)
+            lightColor = textureCube(sLightCubeMap, vCubeMaskVec).rgb * cLightColor.rgb;
+        #else
+            lightColor = cLightColor.rgb;
+        #endif
+    
+        #ifdef SPECULAR
+            float spec = GetSpecular(normal, vEyeVec, lightDir, cMatSpecColor.a);
+            finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
+        #else
+            finalColor = diff * lightColor * diffColor.rgb;
+        #endif
+    
+        #ifdef AMBIENT
+            finalColor += cAmbientColor * diffColor.rgb;
+            gl_FragColor = vec4(GetFog(finalColor, vLightVec.w), diffColor.a);
+        #else
+            gl_FragColor = vec4(GetLitFog(finalColor, vLightVec.w), diffColor.a);
+        #endif
+    #elif defined(PREPASS)
+        // Fill light pre-pass G-Buffer
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord.xy));
+        #else
+            vec3 normal = vNormal;
+        #endif
+    
+        float specPower = cMatSpecColor.a / 255.0;
+    
+        #ifdef HWDEPTH
+            gl_FragColor = vec4(normal * 0.5 + 0.5, specPower);
+        #else
+            gl_FragData[0] = vec4(normal * 0.5 + 0.5, specPower);
+            gl_FragData[1] = vec4(EncodeDepth(vVertexLight.a), 0.0);
+        #endif
+    #elif defined(DEFERRED)
+        // Fill deferred G-buffer
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord));
+        #else
+            vec3 normal = vNormal;
+        #endif
+
+        float specIntensity = specColor.g;
+        float specPower = cMatSpecColor.a / 255.0;
+
+        gl_FragData[0] = vec4(GetFog(vVertexLight.rgb * diffColor.rgb, vVertexLight.a), 1.0);
+        gl_FragData[1] = GetFogFactor(vVertexLight.a) * vec4(diffColor.rgb, specIntensity);
+        gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            gl_FragData[3] = vec4(EncodeDepth(vVertexLight.a), 0.0);
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        vec3 finalColor = vVertexLight.rgb * diffColor.rgb;
+
+        #ifdef MATERIAL
+            // Add light pre-pass accumulation result
+            // Lights are accumulated at half intensity. Bring back to full intensity now
+            vec4 lightInput = 2.0 * texture2DProj(sLightBuffer, vScreenPos);
+            vec3 lightSpecColor = lightInput.a * lightInput.rgb / max(GetIntensity(lightInput.rgb), 0.001);
+
+            finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
+        #endif
+
+        gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
+    #endif
+}

+ 120 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.vert

@@ -0,0 +1,120 @@
+#include "Uniforms.vert"
+#include "Transform.vert"
+#include "ScreenPos.vert"
+#include "Lighting.vert"
+
+varying vec2 vTexCoord;
+#ifdef PERPIXEL
+    varying vec4 vLightVec;
+    #ifdef SPECULAR
+        varying vec3 vEyeVec;
+    #endif
+    #ifndef NORMALMAP
+        varying vec3 vNormal;
+    #endif
+    #ifdef SHADOW
+        #if defined(DIRLIGHT)
+            varying vec4 vShadowPos[4];
+        #elif defined(SPOTLIGHT)
+            varying vec4 vShadowPos;
+        #else
+            varying vec3 vShadowPos;
+        #endif
+    #endif
+    #ifdef SPOTLIGHT
+        varying vec4 vSpotPos;
+    #endif
+    #ifdef POINTLIGHT
+        varying vec3 vCubeMaskVec;
+    #endif
+#else
+    varying vec4 vVertexLight;
+    varying vec3 vNormal;
+    #ifdef NORMALMAP
+        varying vec3 vTangent;
+        varying vec3 vBitangent;
+    #else
+        varying vec4 vScreenPos;
+    #endif
+#endif
+
+void main()
+{
+    mat4 modelMatrix = iModelMatrix;
+    vec3 worldPos = GetWorldPos(modelMatrix);
+    gl_Position = GetClipPos(worldPos);
+    vTexCoord = GetTexCoord(iTexCoord);
+
+    #if defined(PERPIXEL) && defined(NORMALMAP)
+        vec3 vNormal;
+        vec3 vTangent;
+        vec3 vBitangent;
+    #endif
+
+    vNormal = GetWorldNormal(modelMatrix);
+    #ifdef NORMALMAP
+        vTangent = GetWorldTangent(modelMatrix);
+        vBitangent = cross(vTangent, vNormal) * iTangent.w;
+    #endif
+    
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        vec4 projWorldPos = vec4(worldPos, 1.0);
+    
+        #ifdef SHADOW
+            // Shadow projection: transform from world space to shadow space
+            #if defined(DIRLIGHT)
+                vShadowPos[0] = cLightMatrices[0] * projWorldPos;
+                vShadowPos[1] = cLightMatrices[1] * projWorldPos;
+                vShadowPos[2] = cLightMatrices[2] * projWorldPos;
+                vShadowPos[3] = cLightMatrices[3] * projWorldPos;
+            #elif defined(SPOTLIGHT)
+                vShadowPos = cLightMatrices[1] * projWorldPos;
+            #else
+                vShadowPos = worldPos - cLightPos.xyz;
+            #endif
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            vSpotPos = cLightMatrices[0] * projWorldPos;
+        #endif
+    
+        #ifdef POINTLIGHT
+            vCubeMaskVec = mat3(cLightMatrices[0][0].xyz, cLightMatrices[0][1].xyz, cLightMatrices[0][2].xyz) * (cLightPos.xyz - worldPos);
+        #endif
+    
+        #ifdef NORMALMAP
+            mat3 tbn = mat3(vTangent, vBitangent, vNormal);
+            #ifdef DIRLIGHT
+                vLightVec = vec4(cLightDir * tbn, GetDepth(gl_Position));
+            #else
+                vLightVec = vec4((cLightPos.xyz - worldPos) * tbn * cLightPos.w, GetDepth(gl_Position));
+            #endif
+            #ifdef SPECULAR
+                vEyeVec = (cCameraPos - worldPos) * tbn;
+            #endif
+        #else
+            #ifdef DIRLIGHT
+                vLightVec = vec4(cLightDir, GetDepth(gl_Position));
+            #else
+                vLightVec = vec4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(gl_Position));
+            #endif
+            #ifdef SPECULAR
+                vEyeVec = cCameraPos - worldPos;
+            #endif
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        vVertexLight = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
+
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                vVertexLight.rgb += GetVertexLight(i, worldPos, vNormal) * cVertexLights[i * 3].rgb;
+        #endif
+        
+        #ifndef NORMALMAP
+            vScreenPos = GetScreenPos(gl_Position);
+        #endif
+    #endif
+}

+ 56 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.xml

@@ -0,0 +1,56 @@
+<shaders>
+    <shader type="vs">
+        <option name="Normal" define="NORMALMAP" />
+        <variation name="" define="AMBIENT" />
+        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
+        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
+        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
+        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <variation name="" />
+        <variation name="Skinned" define="SKINNED" />
+        <variation name="Billboard" define="BILLBOARD" />
+    </shader>
+    <shader type="ps">
+        <option name="Diff" define="DIFFMAP" />
+        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
+        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
+        <variation name="" define="AMBIENT" />        
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Prepass" define="PREPASS" />
+        <variation name="Material" define="MATERIAL" exclude="Normal" />
+        <variation name="Deferred" define="DEFERRED" />
+        <option name="HW" define="HWDEPTH" require="PREPASS" />
+        <option name="HW" define="HWDEPTH" require="DEFERRED" />
+        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <option name="LQ" define="LQSHADOW" require="SHADOW" />
+    </shader>
+</shaders>

+ 0 - 42
Bin/CoreData/Shaders/GLSL/Material.frag

@@ -1,42 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-#include "Lighting.frag"
-#include "Fog.frag"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec4 vScreenPos;
-
-void main()
-{
-    #ifdef DIFFMAP
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        vec3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        vec3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= vColor.rgb;
-    #endif
-    
-    #ifdef SPECMAP
-        vec3 specColor = cMatSpecColor.rgb * texture2D(sSpecMap, vTexCoord).g;
-    #else
-        vec3 specColor = cMatSpecColor.rgb;
-    #endif
-
-    // Lights are accumulated at half intensity. Bring back to full intensity now
-    vec4 lightInput = 2.0 * texture2DProj(sLightBuffer, vScreenPos);
-    vec3 lightSpecColor = lightInput.a * lightInput.rgb / max(GetIntensity(lightInput.rgb), 0.001);
-
-    vec3 finalColor = (vVertexLighting.rgb + lightInput.rgb) * diffColor + lightSpecColor * specColor;
-    gl_FragColor = vec4(GetFog(finalColor, vVertexLighting.a), 1.0);
-}

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Material.vert

@@ -1,31 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-#include "ScreenPos.vert"
-#include "Lighting.vert"
-
-varying vec2 vTexCoord;
-#ifdef VERTEXCOLOR
-    varying vec4 vColor;
-#endif
-varying vec4 vVertexLighting;
-varying vec4 vScreenPos;
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    vTexCoord = GetTexCoord(iTexCoord);
-    vScreenPos = GetScreenPos(gl_Position);
-
-    vVertexLighting = vec4(GetAmbient(GetZonePos(worldPos)), GetDepth(gl_Position));
-    #ifdef NUMVERTEXLIGHTS
-    vec3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        vVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        vColor = iColor;
-    #endif
-}

+ 0 - 21
Bin/CoreData/Shaders/GLSL/Material.xml

@@ -1,21 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" /> 
-    </shader>
-</shaders>

+ 0 - 38
Bin/CoreData/Shaders/GLSL/Prepass.frag

@@ -1,38 +0,0 @@
-#include "Uniforms.frag"
-#include "Samplers.frag"
-
-#ifdef HWDEPTH
-    varying vec2 vTexCoord;
-#else
-    varying vec3 vTexCoord;
-#endif
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    #ifdef ALPHAMASK
-        vec4 diffInput = texture2D(sDiffMap, vTexCoord.xy);
-        if (diffInput.a < 0.5)
-            discard;
-    #endif
-
-    #ifdef NORMALMAP
-        mat3 tbn = mat3(vTangent, vBitangent, vNormal);
-        vec3 normal = tbn * DecodeNormal(texture2D(sNormalMap, vTexCoord.xy));
-    #else
-        vec3 normal = vNormal;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    #ifdef HWDEPTH
-        gl_FragColor = vec4(normal * 0.5 + 0.5, specPower);
-    #else
-        gl_FragData[0] = vec4(normal * 0.5 + 0.5, specPower);
-        gl_FragData[1] = vec4(EncodeDepth(vTexCoord.z), 0.0);
-    #endif
-}

+ 0 - 31
Bin/CoreData/Shaders/GLSL/Prepass.vert

@@ -1,31 +0,0 @@
-#include "Uniforms.vert"
-#include "Transform.vert"
-
-#ifdef HWDEPTH
-    varying vec2 vTexCoord;
-#else
-    varying vec3 vTexCoord;
-#endif
-varying vec3 vNormal;
-#ifdef NORMALMAP
-    varying vec3 vTangent;
-    varying vec3 vBitangent;
-#endif
-
-void main()
-{
-    mat4 modelMatrix = iModelMatrix;
-    vec3 worldPos = GetWorldPos(modelMatrix);
-    gl_Position = GetClipPos(worldPos);
-    #ifdef HWDEPTH
-        vTexCoord = GetTexCoord(iTexCoord);
-    #else
-        vTexCoord = vec3(GetTexCoord(iTexCoord), GetDepth(gl_Position));
-    #endif
-    
-    vNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        vTangent = GetWorldTangent(modelMatrix);
-        vBitangent = cross(vTangent, vNormal) * iTangent.w;
-    #endif
-}

+ 0 - 13
Bin/CoreData/Shaders/GLSL/Prepass.xml

@@ -1,13 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="HW" define="HWDEPTH" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-    </shader>
-    <shader type="ps">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 1 - 3
Bin/CoreData/Shaders/GLSL/Shadow.frag

@@ -1,9 +1,7 @@
 #include "Uniforms.frag"
 #include "Uniforms.frag"
 #include "Samplers.frag"
 #include "Samplers.frag"
 
 
-#ifdef ALPHAMASK
-    varying vec2 vTexCoord;
-#endif
+varying vec2 vTexCoord;
 
 
 void main()
 void main()
 {
 {

+ 2 - 7
Bin/CoreData/Shaders/GLSL/Shadow.vert

@@ -1,18 +1,13 @@
 #include "Uniforms.vert"
 #include "Uniforms.vert"
 #include "Transform.vert"
 #include "Transform.vert"
 
 
-#ifdef ALPHAMASK
-    varying vec2 vTexCoord;
-#endif
+varying vec2 vTexCoord;
 
 
 void main()
 void main()
 {
 {
     mat4 modelMatrix = iModelMatrix;
     mat4 modelMatrix = iModelMatrix;
     vec3 worldPos = GetWorldPos(modelMatrix);
     vec3 worldPos = GetWorldPos(modelMatrix);
     gl_Position = GetClipPos(worldPos);
     gl_Position = GetClipPos(worldPos);
-
-    #ifdef ALPHAMASK
-        vTexCoord = GetTexCoord(iTexCoord);
-    #endif
+    vTexCoord = GetTexCoord(iTexCoord);
 }
 }
 
 

+ 0 - 1
Bin/CoreData/Shaders/GLSL/Shadow.xml

@@ -1,6 +1,5 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
-        <option name="Mask" define="ALPHAMASK" />
         <variation name="" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Skinned" define="SKINNED" />
     </shader>
     </shader>

+ 1 - 1
Bin/CoreData/Shaders/GLSL/Uniforms.vert

@@ -16,4 +16,4 @@ uniform vec3 cViewUpVector;
 uniform mat4 cZone;
 uniform mat4 cZone;
 uniform mat4 cLightMatrices[4];
 uniform mat4 cLightMatrices[4];
 uniform vec4 cSkinMatrices[64*3];
 uniform vec4 cSkinMatrices[64*3];
-uniform vec4 cVertexLights[6*3];
+uniform vec4 cVertexLights[4*3];

+ 0 - 76
Bin/CoreData/Shaders/HLSL/Ambient.hlsl

@@ -1,76 +0,0 @@
-#pragma warning(disable:3557)
-
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,
-    #ifdef NUMVERTEXLIGHTS
-        float3 iNormal : NORMAL,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    #ifdef BILLBOARD
-        float2 iSize : TEXCOORD1,
-    #endif
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oVertexLighting : TEXCOORD1,
-    #ifdef VERTEXCOLOR
-        out float4 oColor : COLOR0,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    oTexCoord = GetTexCoord(iTexCoord);
-
-    oVertexLighting = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
-    #ifdef NUMVERTEXLIGHTS
-    float3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        oVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iVertexLighting : TEXCOORD1,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float4 diffColor = cMatDiffColor * diffInput;
-    #else
-        float4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor;
-    #endif
-
-    float3 finalColor = iVertexLighting.rgb * diffColor.rgb;
-
-    oColor = float4(GetFog(finalColor, iVertexLighting.a), diffColor.a);
-}

+ 0 - 22
Bin/CoreData/Shaders/HLSL/Ambient.xml

@@ -1,22 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" require="SM3" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 117
Bin/CoreData/Shaders/HLSL/Deferred.hlsl

@@ -1,117 +0,0 @@
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,
-    float3 iNormal : NORMAL,
-    #ifdef NORMALMAP
-        float4 iTangent : TANGENT0,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oVertexLighting : TEXCOORD1,
-    out float3 oNormal : TEXCOORD2,
-    #ifdef NORMALMAP
-        out float3 oTangent : TEXCOORD3,
-        out float3 oBitangent : TEXCOORD4,
-    #endif
-    #ifdef VERTEXCOLOR
-        out float4 oColor : COLOR0,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    oTexCoord = GetTexCoord(iTexCoord);
-
-    oVertexLighting = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
-    #ifdef NUMVERTEXLIGHTS
-    float3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        oVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    oNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        oTangent = GetWorldTangent(modelMatrix);
-        oBitangent = cross(oTangent, oNormal) * iTangent.w;
-    #endif
-    
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-}
-
-void PS(
-    float2 iTexCoord : TEXCOORD0,
-    float4 iVertexLighting : TEXCOORD1,
-    float3 iNormal : TEXCOORD2,
-    #ifdef NORMALMAP
-        float3 iTangent : TEXCOORD3,
-        float3 iBitangent : TEXCOORD4,
-    #endif
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oAlbedo : COLOR1,
-    out float4 oNormal : COLOR2,
-    #ifndef HWDEPTH
-        out float4 oDepth : COLOR3,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        float3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor.rgb;
-    #endif
-
-    #ifdef NORMALMAP
-        float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
-        float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord)), tbn);
-    #else
-        float3 normal = iNormal;
-    #endif
-    
-    // If using SM2, light volume shader may not have instructions left to normalize the normal. Therefore do it here
-    #if !defined(SM3)
-        normal = normalize(normal);
-    #endif
-
-    #ifdef SPECMAP
-        float specIntensity = cMatSpecColor.g * tex2D(sSpecMap, iTexCoord).g;
-    #else
-        float specIntensity = cMatSpecColor.g;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    oColor = float4(GetFog(iVertexLighting.rgb * diffColor, iVertexLighting.a), 1.0);
-    oAlbedo = GetFogFactor(iVertexLighting.a) * float4(diffColor, specIntensity);
-    oNormal = float4(normal * 0.5 + 0.5, specPower);
-    #ifndef HWDEPTH
-        oDepth = iVertexLighting.a;
-    #endif
-}

+ 0 - 26
Bin/CoreData/Shaders/HLSL/Deferred.xml

@@ -1,26 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="HW" define="HWDEPTH" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 0 - 216
Bin/CoreData/Shaders/HLSL/ForwardLit.hlsl

@@ -1,216 +0,0 @@
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,
-    float3 iNormal : NORMAL,
-    #ifdef NORMALMAP
-        float4 iTangent : TANGENT0,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    #ifdef BILLBOARD
-        float2 iSize : TEXCOORD1,
-    #endif
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oLightVec : TEXCOORD1,
-    #ifndef NORMALMAP
-        out float3 oNormal : TEXCOORD2,
-    #endif
-    #ifdef SPECULAR
-        out float3 oEyeVec : TEXCOORD3,
-    #endif
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            out float4 oShadowPos[4] : TEXCOORD4,
-        #elif defined(SPOTLIGHT)
-            out float4 oShadowPos : TEXCOORD4,
-        #else
-            out float3 oShadowPos : TEXCOORD4,
-        #endif
-    #endif
-    #ifdef SPOTLIGHT
-        out float4 oSpotPos : TEXCOORD5,
-    #endif
-    #ifdef POINTLIGHT
-        out float3 oCubeMaskVec : TEXCOORD5,
-    #endif
-    #ifdef VERTEXCOLOR
-        out float4 oColor : COLOR0,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    oTexCoord = GetTexCoord(iTexCoord);
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        float3 oNormal;
-        float3 oTangent;
-        float3 oBitangent;
-    #endif
-
-    oNormal = GetWorldNormal(modelMatrix);
-    float4 projWorldPos = float4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        oLightVec = float4(cLightDir, GetDepth(oPos));
-    #else
-        oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
-    #endif
-
-    #ifdef SHADOW
-        // Shadow projection: transform from world space to shadow space
-        #if defined(DIRLIGHT)
-            oShadowPos[0] = mul(projWorldPos, cLightMatrices[0]);
-            oShadowPos[1] = mul(projWorldPos, cLightMatrices[1]);
-            oShadowPos[2] = mul(projWorldPos, cLightMatrices[2]);
-            oShadowPos[3] = mul(projWorldPos, cLightMatrices[3]);
-        #elif defined(SPOTLIGHT)
-            oShadowPos = mul(projWorldPos, cLightMatrices[1]);
-        #else
-            oShadowPos = worldPos - cLightPos.xyz;
-        #endif
-    #endif
-
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        oSpotPos = mul(projWorldPos, cLightMatrices[0]);
-    #endif
-
-    #ifdef POINTLIGHT
-        oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
-    #endif
-
-    #ifdef NORMALMAP
-        oTangent = GetWorldTangent(modelMatrix);
-        oBitangent = cross(oTangent, oNormal) * iTangent.w;
-        float3x3 tbn = float3x3(oTangent, oBitangent, oNormal);
-        oLightVec.xyz = mul(tbn, oLightVec.xyz);
-        #ifdef SPECULAR
-            oEyeVec = mul(tbn, cCameraPos - worldPos);
-        #endif
-    #elif defined(SPECULAR)
-        oEyeVec = cCameraPos - worldPos;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iLightVec : TEXCOORD1,
-    #ifndef NORMALMAP
-        float3 iNormal : TEXCOORD2,
-    #endif
-    #ifdef SPECULAR
-        float3 iEyeVec : TEXCOORD3,
-    #endif
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            float4 iShadowPos[4] : TEXCOORD4,
-        #elif defined(SPOTLIGHT)
-            float4 iShadowPos : TEXCOORD4,
-        #else
-            float3 iShadowPos : TEXCOORD4,
-        #endif
-    #endif
-    #ifdef SPOTLIGHT
-        float4 iSpotPos : TEXCOORD5,
-    #endif
-    #ifdef CUBEMASK
-        float3 iCubeMaskVec : TEXCOORD5,
-    #endif
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float4 diffColor = cMatDiffColor * diffInput;
-    #else
-        float4 diffColor = cMatDiffColor;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor;
-    #endif
-
-    #ifdef NORMALMAP
-        float3 normal = DecodeNormal(tex2D(sNormalMap, iTexCoord));
-    #else
-        float3 normal = normalize(iNormal);
-    #endif
-
-    float3 lightDir;
-    float3 lightColor;
-    float3 finalColor;
-    float diff;
-
-    #ifdef DIRLIGHT
-        #ifdef NORMALMAP
-            lightDir = normalize(iLightVec.xyz);
-        #else
-            lightDir = iLightVec.xyz;
-        #endif
-        diff = GetDiffuseDir(normal, lightDir);
-    #else
-        diff = GetDiffusePointOrSpot(normal, iLightVec.xyz, lightDir);
-    #endif
-
-    #ifdef SHADOW
-        #if defined(DIRLIGHT)
-            float4 shadowPos = GetDirShadowPos(iShadowPos, iLightVec.w);
-            diff *= saturate(GetShadow(shadowPos) + GetShadowFade(iLightVec.w));
-        #elif defined(SPOTLIGHT)
-            diff *= GetShadow(iShadowPos);
-        #else
-            diff *= GetCubeShadow(iShadowPos);
-        #endif
-    #endif
-
-    #if defined(SPOTLIGHT)
-        lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
-    #elif defined(CUBEMASK)
-        lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
-    #else
-        lightColor = cLightColor.rgb;
-    #endif
-
-    #ifdef SPECULAR
-        #ifdef SPECMAP
-            float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).g;
-        #else
-            float3 specColor = cMatSpecColor.rgb;
-        #endif
-        float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecColor.a);
-        finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
-    #else
-        finalColor = diff * lightColor * diffColor.rgb;
-    #endif
-
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
-    #else
-        oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
-    #endif
-}

+ 0 - 31
Bin/CoreData/Shaders/HLSL/ForwardLit.xml

@@ -1,31 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" require="SM3" />
-        <variation name="Billboard" define="BILLBOARD" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
-        <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
-        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
-        <option name="Spec" define="SPECULAR" />
-        <option name="Shadow" define="SHADOW" />
-        <option name="LQ" define="LQSHADOW" require="HWSHADOW" />
-        <option name="HW" define="HWSHADOW" require="SHADOW" />
-    </shader>
-</shaders>

+ 44 - 35
Bin/CoreData/Shaders/HLSL/Lighting.hlsl

@@ -48,41 +48,50 @@ float GetVertexLight(int index, float3 worldPos, float3 normal)
     float cutoff = cVertexLights[index * 3 + 1].w;
     float cutoff = cVertexLights[index * 3 + 1].w;
     float invCutoff = cVertexLights[index * 3 + 2].w;
     float invCutoff = cVertexLights[index * 3 + 2].w;
 
 
-    #ifndef BILLBOARD
-        // Directional light
-        if (invRange == 0.0)
-        {
-            float NdotL = max(dot(normal, lightDir), 0.0);
-            return NdotL;
-        }
-        // Point/spot light
-        else
-        {
-            float3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            float3 localDir = lightVec / lightDist;
-            float NdotL = max(dot(normal, localDir), 0.0);
-            float atten = saturate(1.0 - lightDist * lightDist);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
-            return NdotL * atten * spotAtten;
-        }
-    #else
-        // Directional light
-        if (invRange == 0.0)
-            return 1.0;
-        // Point/spot light
-        else
-        {
-            float3 lightVec = (lightPos - worldPos) * invRange;
-            float lightDist = length(lightVec);
-            float3 localDir = lightVec / lightDist;
-            float atten = saturate(1.0 - lightDist * lightDist);
-            float spotEffect = dot(localDir, lightDir);
-            float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
-            return atten * spotAtten;
-        }
-    #endif
+    // Directional light
+    if (invRange == 0.0)
+    {
+        float NdotL = max(dot(normal, lightDir), 0.0);
+        return NdotL;
+    }
+    // Point/spot light
+    else
+    {
+        float3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        float3 localDir = lightVec / lightDist;
+        float NdotL = max(dot(normal, localDir), 0.0);
+        float atten = saturate(1.0 - lightDist * lightDist);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
+        return NdotL * atten * spotAtten;
+    }
+}
+
+float GetVertexLightVolumetric(int index, float3 worldPos)
+{
+    float3 lightDir = cVertexLights[index * 3 + 1].xyz;
+    float3 lightPos = cVertexLights[index * 3 + 2].xyz;
+    float invRange = cVertexLights[index * 3].w;
+    float cutoff = cVertexLights[index * 3 + 1].w;
+    float invCutoff = cVertexLights[index * 3 + 2].w;
+
+    // Directional light
+    if (invRange == 0.0)
+    {
+        return 1.0;
+    }
+    // Point/spot light
+    else
+    {
+        float3 lightVec = (lightPos - worldPos) * invRange;
+        float lightDist = length(lightVec);
+        float3 localDir = lightVec / lightDist;
+        float atten = saturate(1.0 - lightDist * lightDist);
+        float spotEffect = dot(localDir, lightDir);
+        float spotAtten = saturate((spotEffect - cutoff) * invCutoff);
+        return atten * spotAtten;
+    }
 }
 }
 #endif
 #endif
 
 

+ 69 - 48
Bin/CoreData/Shaders/HLSL/LitParticle.hlsl

@@ -21,12 +21,16 @@ void VS(float4 iPos : POSITION,
         float2 iSize : TEXCOORD1,
         float2 iSize : TEXCOORD1,
     #endif
     #endif
     out float2 oTexCoord : TEXCOORD0,
     out float2 oTexCoord : TEXCOORD0,
-    out float4 oLightVec : TEXCOORD1,
-    #ifdef SPOTLIGHT
-        out float4 oSpotPos : TEXCOORD2,
-    #endif
-    #ifdef POINTLIGHT
-        out float3 oCubeMaskVec : TEXCOORD2,
+    #if PERPIXEL
+        out float4 oLightVec : TEXCOORD1,
+        #ifdef SPOTLIGHT
+            out float4 oSpotPos : TEXCOORD2,
+        #endif
+        #ifdef POINTLIGHT
+            out float3 oCubeMaskVec : TEXCOORD2,
+        #endif
+    #else
+        out float4 oVertexLight : TEXCOORD1,
     #endif
     #endif
     #ifdef VERTEXCOLOR
     #ifdef VERTEXCOLOR
         out float4 oColor : COLOR0,
         out float4 oColor : COLOR0,
@@ -42,37 +46,53 @@ void VS(float4 iPos : POSITION,
         oColor = iColor;
         oColor = iColor;
     #endif
     #endif
 
 
-    float4 projWorldPos = float4(worldPos, 1.0);
-
-    #ifdef DIRLIGHT
-        oLightVec = float4(cLightDir, GetDepth(oPos));
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        float4 projWorldPos = float4(worldPos, 1.0);
+    
+        #ifdef DIRLIGHT
+            oLightVec = float4(cLightDir, GetDepth(oPos));
+        #else
+            oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
+        #endif
+    
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            oSpotPos = mul(projWorldPos, cLightMatrices[0]);
+        #endif
+    
+        #ifdef POINTLIGHT
+            oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #endif
     #else
     #else
-        oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
-    #endif
+        // Ambient & per-vertex lighting
+        oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
 
 
-    #ifdef SPOTLIGHT
-        // Spotlight projection: transform from world space to projector texture coordinates
-        oSpotPos = mul(projWorldPos, cLightMatrices[0]);
-    #endif
-
-    #ifdef POINTLIGHT
-        oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                oVertexLight.rgb += GetVertexLightVolumetric(i, worldPos) * cVertexLights[i * 3].rgb;
+        #endif
     #endif
     #endif
 }
 }
 
 
 void PS(float2 iTexCoord : TEXCOORD0,
 void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iLightVec : TEXCOORD1,
-    #ifdef SPOTLIGHT
-        float4 iSpotPos : TEXCOORD2,
-    #endif
-    #ifdef CUBEMASK
-        float3 iCubeMaskVec : TEXCOORD2,
+    #ifdef PERPIXEL
+        float4 iLightVec : TEXCOORD1,
+        #ifdef SPOTLIGHT
+            float4 iSpotPos : TEXCOORD2,
+        #endif
+        #ifdef CUBEMASK
+            float3 iCubeMaskVec : TEXCOORD2,
+        #endif
+    #else
+        float4 iVertexLight : TEXCOORD1,
     #endif
     #endif
     #ifdef VERTEXCOLOR
     #ifdef VERTEXCOLOR
         float4 iColor : COLOR0,
         float4 iColor : COLOR0,
     #endif
     #endif
     out float4 oColor : COLOR0)
     out float4 oColor : COLOR0)
 {
 {
+    // Get material diffuse albedo
     #ifdef DIFFMAP
     #ifdef DIFFMAP
         float4 diffInput = tex2D(sDiffMap, iTexCoord);
         float4 diffInput = tex2D(sDiffMap, iTexCoord);
         #ifdef ALPHAMASK
         #ifdef ALPHAMASK
@@ -88,30 +108,31 @@ void PS(float2 iTexCoord : TEXCOORD0,
         diffColor *= iColor;
         diffColor *= iColor;
     #endif
     #endif
 
 
-    float3 lightColor;
-    float3 finalColor;
-    float diff;
-
-    #ifdef DIRLIGHT
-        diff = GetDiffuseDirVolumetric();
-    #else
-        diff = GetDiffusePointOrSpotVolumetric(iLightVec.xyz);
-    #endif
-
-    #if defined(SPOTLIGHT)
-        lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
-    #elif defined(CUBEMASK)
-        lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
-    #else
-        lightColor = cLightColor.rgb;
-    #endif
-
-    finalColor = diff * lightColor * diffColor.rgb;
+    #if PERPIXEL
+        // Per-pixel forward lighting
+        float3 lightColor;
+        float3 finalColor;
+        float diff;
     
     
-    #ifdef AMBIENT
-        finalColor += cAmbientColor * diffColor.rgb;
-        oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
-    #else
+        #ifdef DIRLIGHT
+            diff = GetDiffuseDirVolumetric();
+        #else
+            diff = GetDiffusePointOrSpotVolumetric(iLightVec.xyz);
+        #endif
+    
+        #if defined(SPOTLIGHT)
+            lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
+        #elif defined(CUBEMASK)
+            lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
+        #else
+            lightColor = cLightColor.rgb;
+        #endif
+    
+        finalColor = diff * lightColor * diffColor.rgb;
         oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
         oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
+    #else
+        // Ambient & per-vertex lighting
+        float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+        oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
     #endif
     #endif
 }
 }

+ 31 - 8
Bin/CoreData/Shaders/HLSL/LitParticle.xml

@@ -1,9 +1,23 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
         <option name="VCol" define="VERTEXCOLOR" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
+        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
+        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
+        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <option name="" /> <!-- Dummy option to separate the two variation groups -->
         <variation name="" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Skinned" define="SKINNED" />
@@ -12,12 +26,21 @@
     </shader>
     </shader>
     <shader type="ps">
     <shader type="ps">
         <option name="Diff" define="DIFFMAP" />
         <option name="Diff" define="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="VCol" define="VERTEXCOLOR" />
         <option name="VCol" define="VERTEXCOLOR" />
-        <option name="Ambient" define="AMBIENT" />
-        <variation name="Dir" define="DIRLIGHT" />
-        <variation name="Spot" define="SPOTLIGHT" />
-        <variation name="Point" define="POINTLIGHT" />
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
         <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
     </shader>
     </shader>
 </shaders>
 </shaders>

+ 311 - 0
Bin/CoreData/Shaders/HLSL/LitSolid.hlsl

@@ -0,0 +1,311 @@
+#include "Uniforms.hlsl"
+#include "Samplers.hlsl"
+#include "Transform.hlsl"
+#include "ScreenPos.hlsl"
+#include "Lighting.hlsl"
+#include "Fog.hlsl"
+
+void VS(float4 iPos : POSITION,
+    float3 iNormal : NORMAL,
+    float2 iTexCoord : TEXCOORD0,
+    #ifdef NORMALMAP
+        float4 iTangent : TANGENT,
+    #endif
+    #ifdef SKINNED
+        float4 iBlendWeights : BLENDWEIGHT,
+        int4 iBlendIndices : BLENDINDICES,
+    #endif
+    #ifdef INSTANCED
+        float4x3 iModelInstance : TEXCOORD2,
+    #endif
+    #ifdef BILLBOARD
+        float2 iSize : TEXCOORD1,
+    #endif
+    out float2 oTexCoord : TEXCOORD0,
+    #ifdef PERPIXEL
+        out float4 oLightVec : TEXCOORD1,
+        #ifndef NORMALMAP
+            out float3 oNormal : TEXCOORD2,
+        #endif
+        #ifdef SPECULAR
+            out float3 oEyeVec : TEXCOORD3,
+        #endif
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                out float4 oShadowPos[4] : TEXCOORD4,
+            #elif defined(SPOTLIGHT)
+                out float4 oShadowPos : TEXCOORD4,
+            #else
+                out float3 oShadowPos : TEXCOORD4,
+            #endif
+        #endif
+        #ifdef SPOTLIGHT
+            out float4 oSpotPos : TEXCOORD5,
+        #endif
+        #ifdef POINTLIGHT
+            out float3 oCubeMaskVec : TEXCOORD5,
+        #endif
+    #else
+        out float4 oVertexLight : TEXCOORD1,
+        out float3 oNormal : TEXCOORD2,
+        #ifdef NORMALMAP
+            out float3 oTangent : TEXCOORD3,
+            out float3 oBitangent : TEXCOORD4,
+        #else
+            out float4 oScreenPos : TEXCOORD3,
+        #endif
+    #endif
+    #ifdef VERTEXCOLOR
+        out float4 oColor : COLOR0,
+    #endif
+    out float4 oPos : POSITION)
+{
+    float4x3 modelMatrix = iModelMatrix;
+    float3 worldPos = GetWorldPos(modelMatrix);
+    oPos = GetClipPos(worldPos);
+    oTexCoord = GetTexCoord(iTexCoord);
+
+    #if defined(PERPIXEL) && defined(NORMALMAP)
+        float3 oNormal;
+        float3 oTangent;
+        float3 oBitangent;
+    #endif
+
+    oNormal = GetWorldNormal(modelMatrix);
+    #ifdef NORMALMAP
+        oTangent = GetWorldTangent(modelMatrix);
+        oBitangent = cross(oTangent, oNormal) * iTangent.w;
+    #endif
+
+    #ifdef PERPIXEL
+        // Per-pixel forward lighting
+        float4 projWorldPos = float4(worldPos, 1.0);
+
+        #ifdef DIRLIGHT
+            oLightVec = float4(cLightDir, GetDepth(oPos));
+        #else
+            oLightVec = float4((cLightPos.xyz - worldPos) * cLightPos.w, GetDepth(oPos));
+        #endif
+    
+        #ifdef SHADOW
+            // Shadow projection: transform from world space to shadow space
+            #if defined(DIRLIGHT)
+                oShadowPos[0] = mul(projWorldPos, cLightMatrices[0]);
+                oShadowPos[1] = mul(projWorldPos, cLightMatrices[1]);
+                oShadowPos[2] = mul(projWorldPos, cLightMatrices[2]);
+                oShadowPos[3] = mul(projWorldPos, cLightMatrices[3]);
+            #elif defined(SPOTLIGHT)
+                oShadowPos = mul(projWorldPos, cLightMatrices[1]);
+            #else
+                oShadowPos = worldPos - cLightPos.xyz;
+            #endif
+        #endif
+
+        #ifdef SPOTLIGHT
+            // Spotlight projection: transform from world space to projector texture coordinates
+            oSpotPos = mul(projWorldPos, cLightMatrices[0]);
+        #endif
+
+        #ifdef POINTLIGHT
+            oCubeMaskVec = mul(oLightVec.xyz, (float3x3)cLightMatrices[0]);
+        #endif
+
+        #ifdef NORMALMAP
+            float3x3 tbn = float3x3(oTangent, oBitangent, oNormal);
+            oLightVec.xyz = mul(tbn, oLightVec.xyz);
+            #ifdef SPECULAR
+                oEyeVec = mul(tbn, cCameraPos - worldPos);
+            #endif
+        #elif defined(SPECULAR)
+            oEyeVec = cCameraPos - worldPos;
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        oVertexLight = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
+
+        #ifdef NUMVERTEXLIGHTS
+            for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
+                oVertexLight.rgb += GetVertexLight(i, worldPos, oNormal) * cVertexLights[i * 3].rgb;
+        #endif
+        
+        #ifndef NORMALMAP
+            oScreenPos = GetScreenPos(oPos);
+        #endif
+    #endif
+}
+
+void PS(float2 iTexCoord : TEXCOORD0,
+    #ifdef PERPIXEL
+        float4 iLightVec : TEXCOORD1,
+        #ifndef NORMALMAP
+            float3 iNormal : TEXCOORD2,
+        #endif
+        #ifdef SPECULAR
+            float3 iEyeVec : TEXCOORD3,
+        #endif
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                float4 iShadowPos[4] : TEXCOORD4,
+            #elif defined(SPOTLIGHT)
+                float4 iShadowPos : TEXCOORD4,
+            #else
+                float3 iShadowPos : TEXCOORD4,
+            #endif
+        #endif
+        #ifdef SPOTLIGHT
+            float4 iSpotPos : TEXCOORD5,
+        #endif
+        #ifdef CUBEMASK
+            float3 iCubeMaskVec : TEXCOORD5,
+        #endif
+    #else
+        float4 iVertexLight : TEXCOORD1,
+        float3 iNormal : TEXCOORD2,
+        #ifdef NORMALMAP
+            float3 iTangent : TEXCOORD3,
+            float3 iBitangent : TEXCOORD4,
+        #else
+            float4 iScreenPos : TEXCOORD3,
+        #endif
+    #endif
+    #if defined(PREPASS) && !defined(HWDEPTH)
+        out float4 oDepth : COLOR1,
+    #endif
+    #ifdef DEFERRED
+        out float4 oAlbedo : COLOR1,
+        out float4 oNormal : COLOR2,
+        #ifndef HWDEPTH
+            out float4 oDepth : COLOR3,
+        #endif
+    #endif
+    out float4 oColor : COLOR0)
+{
+    // Get material diffuse albedo
+    #ifdef DIFFMAP
+        float4 diffInput = tex2D(sDiffMap, iTexCoord);
+        #ifdef ALPHAMASK
+            if (diffInput.a < 0.5)
+                discard;
+        #endif
+        float4 diffColor = cMatDiffColor * diffInput;
+    #else
+        float4 diffColor = cMatDiffColor;
+    #endif
+    
+    // Get material specular albedo
+    #ifdef SPECMAP
+        float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).rgb;
+    #else
+        float3 specColor = cMatSpecColor.rgb;
+    #endif
+
+    #if defined(PERPIXEL)
+        // Per-pixel forward lighting
+        float3 lightDir;
+        float3 lightColor;
+        float3 finalColor;
+        float diff;
+
+        #ifdef NORMALMAP
+            float3 normal = DecodeNormal(tex2D(sNormalMap, iTexCoord));
+        #else
+            float3 normal = normalize(iNormal);
+        #endif
+
+        #ifdef DIRLIGHT
+            #ifdef NORMALMAP
+                lightDir = normalize(iLightVec.xyz);
+            #else
+                lightDir = iLightVec.xyz;
+            #endif
+            diff = GetDiffuseDir(normal, lightDir);
+        #else
+            diff = GetDiffusePointOrSpot(normal, iLightVec.xyz, lightDir);
+        #endif
+    
+        #ifdef SHADOW
+            #if defined(DIRLIGHT)
+                float4 shadowPos = GetDirShadowPos(iShadowPos, iLightVec.w);
+                diff *= saturate(GetShadow(shadowPos) + GetShadowFade(iLightVec.w));
+            #elif defined(SPOTLIGHT)
+                diff *= GetShadow(iShadowPos);
+            #else
+                diff *= GetCubeShadow(iShadowPos);
+            #endif
+        #endif
+    
+        #if defined(SPOTLIGHT)
+            lightColor = iSpotPos.w > 0.0 ? tex2Dproj(sLightSpotMap, iSpotPos).rgb * cLightColor.rgb : 0.0;
+        #elif defined(CUBEMASK)
+            lightColor = texCUBE(sLightCubeMap, iCubeMaskVec).rgb * cLightColor.rgb;
+        #else
+            lightColor = cLightColor.rgb;
+        #endif
+    
+        #ifdef SPECULAR
+            float spec = GetSpecular(normal, iEyeVec, lightDir, cMatSpecColor.a);
+            finalColor = diff * lightColor * (diffColor.rgb + spec * specColor * cLightColor.a);
+        #else
+            finalColor = diff * lightColor * diffColor.rgb;
+        #endif
+    
+        #ifdef AMBIENT
+            finalColor += cAmbientColor * diffColor.rgb;
+            oColor = float4(GetFog(finalColor, iLightVec.w), diffColor.a);
+        #else
+            oColor = float4(GetLitFog(finalColor, iLightVec.w), diffColor.a);
+        #endif
+    #elif defined(PREPASS)
+        // Fill light pre-pass G-Buffer
+        #ifdef NORMALMAP
+            float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
+            float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord.xy)), tbn);
+        #else
+            float3 normal = iNormal;
+        #endif
+
+        float specPower = cMatSpecColor.a / 255.0;
+
+        oColor = float4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            oDepth = iVertexLight.a;
+        #endif
+    #elif defined(DEFERRED)
+        // Fill deferred G-buffer
+        #ifdef NORMALMAP
+            float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
+            float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord)), tbn);
+        #else
+            float3 normal = iNormal;
+        #endif
+
+        // If using SM2, light volume shader may not have instructions left to normalize the normal. Therefore do it here
+        #if !defined(SM3)
+            normal = normalize(normal);
+        #endif
+
+        float specIntensity = specColor.g;
+        float specPower = cMatSpecColor.a / 255.0;
+
+        oColor = float4(GetFog(iVertexLight.rgb * diffColor.rgb, iVertexLight.a), 1.0);
+        oAlbedo = GetFogFactor(iVertexLight.a) * float4(diffColor.rgb, specIntensity);
+        oNormal = float4(normal * 0.5 + 0.5, specPower);
+        #ifndef HWDEPTH
+            oDepth = iVertexLight.a;
+        #endif
+    #else
+        // Ambient & per-vertex lighting
+        float3 finalColor = iVertexLight.rgb * diffColor.rgb;
+
+        #ifdef MATERIAL
+            // Add light pre-pass accumulation result
+            // Lights are accumulated at half intensity. Bring back to full intensity now
+            float4 lightInput = 2.0 * tex2Dproj(sLightBuffer, iScreenPos);
+            float3 lightSpecColor = lightInput.a * (lightInput.rgb / GetIntensity(lightInput.rgb));
+
+            finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
+        #endif
+
+        oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
+    #endif
+}

+ 58 - 0
Bin/CoreData/Shaders/HLSL/LitSolid.xml

@@ -0,0 +1,58 @@
+<shaders>
+    <shader type="vs">
+        <option name="Normal" define="NORMALMAP" />
+        <variation name="" define="AMBIENT" />
+        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
+        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
+        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
+        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <variation name="" />
+        <variation name="Skinned" define="SKINNED" />
+        <variation name="Instanced" define="INSTANCED" require="SM3" />
+        <variation name="Billboard" define="BILLBOARD" />
+    </shader>
+    <shader type="ps">
+        <option name="Diff" define="DIFFMAP" />
+        <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
+        <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
+        <variation name="" define="AMBIENT" />        
+        <variation name="Dir">
+            <define name="DIRLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Spot">
+            <define name="SPOTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Point">
+            <define name="POINTLIGHT" />
+            <define name="PERPIXEL" />
+        </variation>
+        <variation name="Prepass" define="PREPASS" />
+        <variation name="Material" define="MATERIAL" exclude="Normal" />
+        <variation name="Deferred" define="DEFERRED" />
+        <option name="HW" define="HWDEPTH" require="PREPASS" />
+        <option name="HW" define="HWDEPTH" require="DEFERRED" />
+        <option name="Mask" define="CUBEMASK" require="POINTLIGHT" />
+        <option name="Spec" define="SPECULAR" require="PERPIXEL" />
+        <option name="Shadow" define="SHADOW" require="PERPIXEL" />
+        <option name="LQ" define="LQSHADOW" require="HWSHADOW" />
+        <option name="HW" define="HWSHADOW" require="SHADOW" />
+    </shader>
+</shaders>

+ 0 - 86
Bin/CoreData/Shaders/HLSL/Material.hlsl

@@ -1,86 +0,0 @@
-#pragma warning(disable:3557)
-
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-#include "ScreenPos.hlsl"
-#include "Lighting.hlsl"
-#include "Fog.hlsl"
-
-void VS(float4 iPos : POSITION,   
-    #ifdef NUMVERTEXLIGHTS
-        float3 iNormal : NORMAL,
-    #endif
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    out float2 oTexCoord : TEXCOORD0,
-    out float4 oVertexLighting : TEXCOORD1,
-    out float4 oScreenPos : TEXCOORD2,
-    #ifdef VERTEXCOLOR
-        out float4 oColor : COLOR0,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    oTexCoord = GetTexCoord(iTexCoord);
-    oScreenPos = GetScreenPos(oPos);
-
-    oVertexLighting = float4(GetAmbient(GetZonePos(worldPos)), GetDepth(oPos));
-    #ifdef NUMVERTEXLIGHTS
-    float3 normal = GetWorldNormal(modelMatrix);
-    for (int i = 0; i < NUMVERTEXLIGHTS; ++i)
-        oVertexLighting.rgb += GetVertexLight(i, worldPos, normal) * cVertexLights[i * 3].rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        oColor = iColor;
-    #endif
-}
-
-void PS(float2 iTexCoord : TEXCOORD0,
-    float4 iVertexLighting : TEXCOORD1,
-    float4 iScreenPos : TEXCOORD2,
-    #ifdef VERTEXCOLOR
-        float4 iColor : COLOR0,
-    #endif
-    out float4 oColor : COLOR0)
-{
-    #ifdef DIFFMAP
-        float4 diffInput = tex2D(sDiffMap, iTexCoord);
-        #ifdef ALPHAMASK
-            if (diffInput.a < 0.5)
-                discard;
-        #endif
-        float3 diffColor = cMatDiffColor.rgb * diffInput.rgb;
-    #else
-        float3 diffColor = cMatDiffColor.rgb;
-    #endif
-
-    #ifdef VERTEXCOLOR
-        diffColor *= iColor.rgb;
-    #endif
-
-    #ifdef SPECMAP
-        float3 specColor = cMatSpecColor.rgb * tex2D(sSpecMap, iTexCoord).g;
-    #else
-        float3 specColor = cMatSpecColor.rgb;
-    #endif
-
-    // Lights are accumulated at half intensity. Bring back to full intensity now
-    float4 lightInput = 2.0 * tex2Dproj(sLightBuffer, iScreenPos);
-    float3 lightSpecColor = lightInput.a * (lightInput.rgb / GetIntensity(lightInput.rgb));
-
-    float3 finalColor = (iVertexLighting.rgb + lightInput.rgb) * diffColor + lightSpecColor * specColor;
-    oColor = float4(GetFog(finalColor, iVertexLighting.a), 1.0);
-}

+ 0 - 22
Bin/CoreData/Shaders/HLSL/Material.xml

@@ -1,22 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="VCol" define="VERTEXCOLOR" />
-        <variation name="" />
-        <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
-        <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
-        <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
-        <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="5VL" define="NUMVERTEXLIGHTS=5" />
-        <variation name="6VL" define="NUMVERTEXLIGHTS=6" />
-        <option name="" /> <!-- Dummy option to separate the two variation groups -->
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" />
-    </shader>
-    <shader type="ps">
-        <option name="Diff" define="DIFFMAP" />
-        <option name="SpecMap" define="SPECMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" include="Diff" />
-        <option name="VCol" define="VERTEXCOLOR" />
-    </shader>
-</shaders>

+ 0 - 81
Bin/CoreData/Shaders/HLSL/Prepass.hlsl

@@ -1,81 +0,0 @@
-#include "Uniforms.hlsl"
-#include "Samplers.hlsl"
-#include "Transform.hlsl"
-
-void VS(float4 iPos : POSITION,
-    float3 iNormal : NORMAL,
-    #ifdef NORMALMAP
-        float4 iTangent : TANGENT0,
-    #endif
-    float2 iTexCoord : TEXCOORD0,
-    #ifdef SKINNED
-        float4 iBlendWeights : BLENDWEIGHT,
-        int4 iBlendIndices : BLENDINDICES,
-    #endif
-    #ifdef INSTANCED
-        float4x3 iModelInstance : TEXCOORD2,
-    #endif
-    #ifdef HWDEPTH
-        out float2 oTexCoord : TEXCOORD0,
-    #else
-        out float3 oTexCoord : TEXCOORD0,
-    #endif
-    out float3 oNormal : TEXCOORD1,
-    #ifdef NORMALMAP
-        out float3 oTangent : TEXCOORD2,
-        out float3 oBitangent : TEXCOORD3,
-    #endif
-    out float4 oPos : POSITION)
-{
-    float4x3 modelMatrix = iModelMatrix;
-    float3 worldPos = GetWorldPos(modelMatrix);
-    oPos = GetClipPos(worldPos);
-    #ifdef HWDEPTH
-        oTexCoord = GetTexCoord(iTexCoord);
-    #else
-        oTexCoord = float3(GetTexCoord(iTexCoord), GetDepth(oPos));
-    #endif
-
-    oNormal = GetWorldNormal(modelMatrix);
-    #ifdef NORMALMAP
-        oTangent = GetWorldTangent(modelMatrix);
-        oBitangent = cross(oTangent, oNormal) * iTangent.w;
-    #endif
-}
-
-void PS(
-    #ifdef HWDEPTH
-        float2 iTexCoord : TEXCOORD0,
-    #else
-        float3 iTexCoord : TEXCOORD0,
-    #endif
-    float3 iNormal : TEXCOORD1,
-    #ifdef NORMALMAP
-        float3 iTangent : TEXCOORD2,
-        float3 iBitangent : TEXCOORD3,
-    #endif
-    #ifndef HWDEPTH
-        out float4 oDepth : COLOR1,
-    #endif
-    out float4 oNormal : COLOR0)
-{
-    #ifdef ALPHAMASK
-        float4 diffInput = tex2D(sDiffMap, iTexCoord.xy);
-        if (diffInput.a < 0.5)
-            discard;
-    #endif
-
-    #ifdef NORMALMAP
-        float3x3 tbn = float3x3(iTangent, iBitangent, iNormal);
-        float3 normal = mul(DecodeNormal(tex2D(sNormalMap, iTexCoord.xy)), tbn);
-    #else
-        float3 normal = iNormal;
-    #endif
-
-    float specPower = cMatSpecColor.a / 255.0;
-
-    oNormal = float4(normal * 0.5 + 0.5, specPower);
-    #ifndef HWDEPTH
-        oDepth = iTexCoord.z;
-    #endif
-}

+ 0 - 14
Bin/CoreData/Shaders/HLSL/Prepass.xml

@@ -1,14 +0,0 @@
-<shaders>
-    <shader type="vs">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="HW" define="HWDEPTH" />
-        <variation name="" />
-        <variation name="Skinned" define="SKINNED" />
-        <variation name="Instanced" define="INSTANCED" />
-    </shader>
-    <shader type="ps">
-        <option name="Normal" define="NORMALMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" />
-        <option name="HW" define="HWDEPTH" />
-    </shader>
-</shaders>

+ 4 - 11
Bin/CoreData/Shaders/HLSL/Shadow.hlsl

@@ -10,25 +10,18 @@ void VS(float4 iPos : POSITION,
     #ifdef INSTANCED
     #ifdef INSTANCED
         float4x3 iModelInstance : TEXCOORD2,
         float4x3 iModelInstance : TEXCOORD2,
     #endif
     #endif
-    #ifdef ALPHAMASK
-        float2 iTexCoord : TEXCOORD0,
-        out float2 oTexCoord : TEXCOORD0,
-    #endif
+    float2 iTexCoord : TEXCOORD0,
+    out float2 oTexCoord : TEXCOORD0,
     out float4 oPos : POSITION)
     out float4 oPos : POSITION)
 {
 {
     float4x3 modelMatrix = iModelMatrix;
     float4x3 modelMatrix = iModelMatrix;
     float3 worldPos = GetWorldPos(modelMatrix);
     float3 worldPos = GetWorldPos(modelMatrix);
     oPos = GetClipPos(worldPos);
     oPos = GetClipPos(worldPos);
-
-    #ifdef ALPHAMASK
-        oTexCoord = GetTexCoord(iTexCoord);
-    #endif
+    oTexCoord = GetTexCoord(iTexCoord);
 }
 }
 
 
 void PS(
 void PS(
-    #ifdef ALPHAMASK
-        float2 iTexCoord : TEXCOORD0,
-    #endif
+    float2 iTexCoord : TEXCOORD0,
     out float4 oColor : COLOR0)
     out float4 oColor : COLOR0)
 {
 {
     #ifdef ALPHAMASK
     #ifdef ALPHAMASK

+ 0 - 1
Bin/CoreData/Shaders/HLSL/Shadow.xml

@@ -1,6 +1,5 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
-        <option name="Mask" define="ALPHAMASK" />
         <variation name="" />
         <variation name="" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Skinned" define="SKINNED" />
         <variation name="Instanced" define="INSTANCED" require="SM3" />
         <variation name="Instanced" define="INSTANCED" require="SM3" />

+ 1 - 1
Bin/CoreData/Shaders/HLSL/Uniforms.hlsl

@@ -17,7 +17,7 @@ uniform float3 cViewUpVector;
 uniform float4x3 cZone;
 uniform float4x3 cZone;
 uniform float4x4 cLightMatrices[4];
 uniform float4x4 cLightMatrices[4];
 uniform float4x3 cSkinMatrices[64];
 uniform float4x3 cSkinMatrices[64];
-uniform float4 cVertexLights[6*3];
+uniform float4 cVertexLights[4*3];
 
 
 // Pixel shader uniforms
 // Pixel shader uniforms
 uniform float3 cAmbientColor;
 uniform float3 cAmbientColor;

+ 6 - 6
Bin/CoreData/Techniques/Diff.xml

@@ -1,9 +1,9 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_DiffAmbient" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_Diff" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_DiffAmbient" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_DiffPrepass" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_DiffDeferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass" ps="Prepass" />
-    <pass name="material" vs="Material" ps="Material_Diff" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred" ps="Deferred_Diff" />
 </technique>
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/DiffAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_Diff" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>
 </technique>

+ 7 - 7
Bin/CoreData/Techniques/DiffAlphaMask.xml

@@ -1,9 +1,9 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_DiffAlphaMask" alphamask="true" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_DiffAlphaMaskAmbient" alphamask="true" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit_DiffAlphaMask"  depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
-    <pass name="shadow" vs="Shadow_Mask" ps="Shadow_AlphaMask" alphamask="true" />
-    <pass name="prepass" vs="Prepass" ps="Prepass_AlphaMask" alphamask="true" />
-    <pass name="material" vs="Material" ps="Material_DiffAlphaMask" depthtest="equal" depthwrite="false" alphamask="true" />
-    <pass name="deferred" vs="Deferred" ps="Deferred_DiffAlphaMask" alphamask="true" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_DiffAlphaMask" alphamask="true" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_DiffAlphaMaskAmbient" alphamask="true" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_DiffAlphaMask"  depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_DiffAlphaMaskPrepass" alphamask="true" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffAlphaMaskMaterial" depthtest="equal" depthwrite="false" alphamask="true" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_DiffAlphaMaskDeferred" alphamask="true" />
+    <pass name="shadow" vs="Shadow" ps="Shadow_AlphaMask" alphamask="true" />
 </technique>
 </technique>

+ 1 - 1
Bin/CoreData/Techniques/DiffLitParticleAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
+    <pass name="base" vs="LitParticle" ps="LitParticle_Diff" depthwrite="false" blend="alpha" />
     <pass name="light" vs="LitParticle" ps="LitParticle_Diff" depthwrite="false" blend="addalpha" />
     <pass name="light" vs="LitParticle" ps="LitParticle_Diff" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>
 </technique>

+ 6 - 6
Bin/CoreData/Techniques/DiffNormal.xml

@@ -1,9 +1,9 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" />
-    <pass name="litbase" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAmbient" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormal" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" />
+    <pass name="litbase" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAmbient" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPrepass" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalDeferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass_Normal" ps="Prepass_Normal" />
-    <pass name="material" vs="Material" ps="Material_Diff" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred_Normal" ps="Deferred_DiffNormal" />
 </technique>
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/DiffNormalAlpha.xml

@@ -1,5 +1,5 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_Diff" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormal" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthwrite="false" blend="addalpha" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
 </technique>
 </technique>

+ 7 - 7
Bin/CoreData/Techniques/DiffNormalAlphaMask.xml

@@ -1,9 +1,9 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient_DiffAlphaMask" alphamask="true" />
-    <pass name="litbase" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAlphaMaskAmbient" alphamask="true" />
-    <pass name="light" vs="ForwardLit_Normal" ps="ForwardLit_DiffNormalAlphaMask" depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
-    <pass name="shadow" vs="Shadow_Mask" ps="Shadow_AlphaMask" alphamask="true" />
-    <pass name="prepass" vs="Prepass_Normal" ps="Prepass_NormalAlphaMask" alphamask="true" />
-    <pass name="material" vs="Material" ps="Material_DiffAlphaMask" depthtest="equal" depthwrite="false" alphamask="true" />
-    <pass name="deferred" vs="Deferred_Normal" ps="Deferred_DiffNormalAlphaMask" alphamask="true" />
+    <pass name="base" vs="LitSolid" ps="LitSolid_DiffAlphaMask" alphamask="true" />
+    <pass name="litbase" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMaskAmbient" alphamask="true" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMask" depthtest="equal" depthwrite="false" blend="add" alphamask="true" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_NormalAlphaMaskPrepass" alphamask="true" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_DiffAlphaMaskMaterial" depthtest="equal" depthwrite="false" alphamask="true" />
+    <pass name="deferred" vs="LitSolid_Normal" ps="LitSolid_DiffNormalAlphaMaskDeferred" alphamask="true" />
+    <pass name="shadow" vs="Shadow" ps="Shadow_AlphaMask" alphamask="true" />
 </technique>
 </technique>

+ 6 - 6
Bin/CoreData/Techniques/NoTexture.xml

@@ -1,9 +1,9 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient" />
-    <pass name="litbase" vs="ForwardLit" ps="ForwardLit_Ambient" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="base" vs="LitSolid" ps="LitSolid" />
+    <pass name="litbase" vs="LitSolid" ps="LitSolid_Ambient" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_Prepass" />
+    <pass name="material" vs="LitSolid" ps="LitSolid_Material" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid" ps="LitSolid_Deferred" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
     <pass name="shadow" vs="Shadow" ps="Shadow" />
-    <pass name="prepass" vs="Prepass" ps="Prepass" />
-    <pass name="material" vs="Material" ps="Material" depthtest="equal" depthwrite="false" />
-    <pass name="deferred" vs="Deferred" ps="Deferred" />
 </technique>
 </technique>

+ 2 - 2
Bin/CoreData/Techniques/NoTextureAlpha.xml

@@ -1,4 +1,4 @@
 <technique>
 <technique>
-    <pass name="base" vs="Ambient" ps="Ambient" depthwrite="false" blend="alpha" />
-    <pass name="light" vs="ForwardLit" ps="ForwardLit" depthwrite="false" blend="addalpha" />
+    <pass name="base" vs="LitSolid" ps="LitSolid" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthwrite="false" blend="addalpha" />
 </technique>
 </technique>

+ 1 - 1
Docs/Reference.dox

@@ -618,7 +618,7 @@ The purposes of the different passes are:
 
 
 By default draw calls within passes are sorted by render state, but transparent base and light passes, as well as the postalpha pass, are sorted by distance back to front.
 By default draw calls within passes are sorted by render state, but transparent base and light passes, as well as the postalpha pass, are sorted by distance back to front.
 
 
-Note that the technique does not need to enumerate shaders used for different geometry types (non-skinned, skinned, instanced, billboard) and different per-vertex and per-pixel light combinations. Instead specific hardcoded shader variations are assumed to exist. See the files Ambient.xml and ForwardLit.xml in either Bin/CoreData/Shaders/HLSL or Bin/CoreData/Shaders/GLSL to see which variations are required.
+Note that the technique does not need to enumerate shaders used for different geometry types (non-skinned, skinned, instanced, billboard) and different per-vertex and per-pixel light combinations. Instead specific hardcoded shader variations are assumed to exist. See the file LitSolid.xml in either Bin/CoreData/Shaders/HLSL or Bin/CoreData/Shaders/GLSL to see which variations are required.
 
 
 The optional "litbase" pass reduces draw call count by combining ambient lighting with the first per-pixel light affecting an object. However, it has intentional limitations to not require too many shader permutations: there must be no vertex lights affecting the object, and the ambient lighting can not have a gradient. In case of excessive overdraw, it is possibly better not to define it, but instead allow the base pass (which is computationally very lightweight) to run first, initializing the Z buffer for later passes.
 The optional "litbase" pass reduces draw call count by combining ambient lighting with the first per-pixel light affecting an object. However, it has intentional limitations to not require too many shader permutations: there must be no vertex lights affecting the object, and the ambient lighting can not have a gradient. In case of excessive overdraw, it is possibly better not to define it, but instead allow the base pass (which is computationally very lightweight) to run first, initializing the Z buffer for later passes.
 
 

+ 1 - 1
Engine/Graphics/Drawable.h

@@ -37,7 +37,7 @@ static const unsigned DEFAULT_LIGHTMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_SHADOWMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_SHADOWMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_ZONEMASK = M_MAX_UNSIGNED;
 static const unsigned DEFAULT_ZONEMASK = M_MAX_UNSIGNED;
 static const int DRAWABLES_PER_WORK_ITEM = 16;
 static const int DRAWABLES_PER_WORK_ITEM = 16;
-static const int MAX_VERTEX_LIGHTS = 6;
+static const int MAX_VERTEX_LIGHTS = 4;
 
 
 class Camera;
 class Camera;
 class Geometry;
 class Geometry;

+ 0 - 1
Engine/Graphics/Renderer.cpp

@@ -1556,7 +1556,6 @@ void Renderer::LoadPassShaders(Technique* tech, PassType type, bool allowShadows
     if (type == PASS_PREPASS || type == PASS_DEFERRED)
     if (type == PASS_PREPASS || type == PASS_DEFERRED)
     {
     {
         unsigned hwDepth = graphics_->GetHardwareDepthSupport() ? 1 : 0;
         unsigned hwDepth = graphics_->GetHardwareDepthSupport() ? 1 : 0;
-        vertexShaderName += hwVariations[hwDepth];
         pixelShaderName += hwVariations[hwDepth];
         pixelShaderName += hwVariations[hwDepth];
     }
     }
     
     

+ 0 - 2
Engine/Graphics/Renderer.h

@@ -78,8 +78,6 @@ enum VertexLightVSVariation
     VLVS_2LIGHTS,
     VLVS_2LIGHTS,
     VLVS_3LIGHTS,
     VLVS_3LIGHTS,
     VLVS_4LIGHTS,
     VLVS_4LIGHTS,
-    VLVS_5LIGHTS,
-    VLVS_6LIGHTS,
     MAX_VERTEXLIGHT_VS_VARIATIONS
     MAX_VERTEXLIGHT_VS_VARIATIONS
 };
 };
 
 

+ 6 - 1
Tools/ShaderCompiler/ShaderCompiler.cpp

@@ -389,7 +389,12 @@ void CompileShader(const String& fileName)
     for (List<CompiledVariation>::Iterator i = variations_.Begin(); i != variations_.End(); ++i)
     for (List<CompiledVariation>::Iterator i = variations_.Begin(); i != variations_.End(); ++i)
     {
     {
         if (!i->errorMsg_.Empty())
         if (!i->errorMsg_.Empty())
-            ErrorExit("Failed to compile shader " + i->name_ + ": " + i->errorMsg_);
+        {
+            if (i->type_ == VS)
+                ErrorExit("Failed to compile vertex shader " + i->name_ + ": " + i->errorMsg_);
+            else
+                ErrorExit("Failed to compile pixel shader " + i->name_ + ": " + i->errorMsg_);
+        }
     }
     }
 }
 }