MaterialDef Phong Lighting {

    MaterialParameters {

        // Compute vertex lighting in the shader
        // For better performance
        Boolean VertexLighting

        // Use more efficent algorithms to improve performance
        Boolean LowQuality

        // Improve quality at the cost of performance
        Boolean HighQuality

        // Output alpha from the diffuse map
        Boolean UseAlpha

        // Alpha threshold for fragment discarding
        Float AlphaDiscardThreshold (AlphaTestFallOff)

        // Normal map is in BC5/ATI2n/LATC/3Dc compression format
        Boolean LATC

        // Use the provided ambient, diffuse, and specular colors
        Boolean UseMaterialColors

        // Activate shading along the tangent, instead of the normal
        // Requires tangent data to be available on the model.
        Boolean VTangent

        // Use minnaert diffuse instead of lambert
        Boolean Minnaert

        // Use ward specular instead of phong
        Boolean WardIso

        // Use vertex color as an additional diffuse color.
        Boolean UseVertexColor

        // Ambient color
        Color Ambient (MaterialAmbient)

        // Diffuse color
        Color Diffuse (MaterialDiffuse)

        // Specular color
        Color Specular (MaterialSpecular)

        // Specular power/shininess
        Float Shininess (MaterialShininess) : 1

        // Diffuse map
        Texture2D DiffuseMap

        // Normal map
        Texture2D NormalMap

        // Specular/gloss map
        Texture2D SpecularMap

        // Parallax/height map
        Texture2D ParallaxMap

        //Set to true is parallax map is stored in the alpha channel of the normal map
        Boolean PackedNormalParallax   

        //Sets the relief height for parallax mapping
        Float ParallaxHeight : 0.05       

        //Set to true to activate Steep Parallax mapping
        Boolean SteepParallax

        // Texture that specifies alpha values
        Texture2D AlphaMap

        // Color ramp, will map diffuse and specular values through it.
        Texture2D ColorRamp

        // Texture of the glowing parts of the material
        Texture2D GlowMap

        // Set to Use Lightmap
        Texture2D LightMap

        // Set to use TexCoord2 for the lightmap sampling
        Boolean SeparateTexCoord

        // The glow color of the object
        Color GlowColor

        // Parameters for fresnel
        // X = bias
        // Y = scale
        // Z = power
        Vector3 FresnelParams

        // Env Map for reflection
        TextureCubeMap EnvMap

        // the env map is a spheremap and not a cube map
        Boolean EnvMapAsSphereMap

        //shadows
         Int FilterMode
        Boolean HardwareShadows

        Texture2D ShadowMap0
        Texture2D ShadowMap1
        Texture2D ShadowMap2
        Texture2D ShadowMap3
        //pointLights
        Texture2D ShadowMap4
        Texture2D ShadowMap5
        
        Float ShadowIntensity
        Vector4 Splits
        Vector2 FadeInfo

        Matrix4 LightViewProjectionMatrix0
        Matrix4 LightViewProjectionMatrix1
        Matrix4 LightViewProjectionMatrix2
        Matrix4 LightViewProjectionMatrix3
        //pointLight
        Matrix4 LightViewProjectionMatrix4
        Matrix4 LightViewProjectionMatrix5   
        Vector3 LightPos
        Vector3 LightDir

        Float PCFEdge
        Float ShadowMapSize

        // For hardware skinning
        Int NumberOfBones
        Matrix4Array BoneMatrices
    }

    Technique {

        LightMode MultiPass

        VertexShader GLSL100:   Common/MatDefs/Light/Lighting.vert
        FragmentShader GLSL100: Common/MatDefs/Light/Lighting.frag

        WorldParameters {
            WorldViewProjectionMatrix
            NormalMatrix
            WorldViewMatrix
            ViewMatrix
            CameraPosition
            WorldMatrix
        }

        Defines {
            LATC : LATC
            VERTEX_COLOR : UseVertexColor
            VERTEX_LIGHTING : VertexLighting
            ATTENUATION : Attenuation
            MATERIAL_COLORS : UseMaterialColors
            V_TANGENT : VTangent
            MINNAERT  : Minnaert
            WARDISO   : WardIso
            LOW_QUALITY : LowQuality
            HQ_ATTENUATION : HighQuality

            DIFFUSEMAP : DiffuseMap
            NORMALMAP : NormalMap
            SPECULARMAP : SpecularMap
            PARALLAXMAP : ParallaxMap
            NORMALMAP_PARALLAX : PackedNormalParallax
            STEEP_PARALLAX : SteepParallax
            ALPHAMAP : AlphaMap
            COLORRAMP : ColorRamp
            LIGHTMAP : LightMap
            SEPARATE_TEXCOORD : SeparateTexCoord

            USE_REFLECTION : EnvMap
            SPHERE_MAP : SphereMap  

            NUM_BONES : NumberOfBones
        }
    }

    Technique PreShadow {

        VertexShader GLSL100 :   Common/MatDefs/Shadow/PreShadow.vert
        FragmentShader GLSL100 : Common/MatDefs/Shadow/PreShadow.frag

        WorldParameters {
            WorldViewProjectionMatrix
            WorldViewMatrix
        }

        Defines {
            COLOR_MAP : ColorMap
            DISCARD_ALPHA : AlphaDiscardThreshold
            NUM_BONES : NumberOfBones
        }

        ForcedRenderState {
            FaceCull Off
            DepthTest On
            DepthWrite On
            PolyOffset 5 3
            ColorWrite Off
        }

    }


    Technique PostShadow15{
        VertexShader GLSL150:   Common/MatDefs/Shadow/PostShadow15.vert
        FragmentShader GLSL150: Common/MatDefs/Shadow/PostShadow15.frag

        WorldParameters {
            WorldViewProjectionMatrix
            WorldMatrix
        }

        Defines {
            HARDWARE_SHADOWS : HardwareShadows
            FILTER_MODE : FilterMode
            PCFEDGE : PCFEdge
            DISCARD_ALPHA : AlphaDiscardThreshold           
            COLOR_MAP : ColorMap
            SHADOWMAP_SIZE : ShadowMapSize
            FADE : FadeInfo
            PSSM : Splits
            POINTLIGHT : LightViewProjectionMatrix5
            NUM_BONES : NumberOfBones
        }

        ForcedRenderState {
            Blend Modulate
            DepthWrite Off                 
            PolyOffset -0.1 0
        }
    }

    Technique PostShadow{
        VertexShader GLSL100:   Common/MatDefs/Shadow/PostShadow.vert
        FragmentShader GLSL100: Common/MatDefs/Shadow/PostShadow.frag

        WorldParameters {
            WorldViewProjectionMatrix
            WorldMatrix
        }

        Defines {
            HARDWARE_SHADOWS : HardwareShadows
            FILTER_MODE : FilterMode
            PCFEDGE : PCFEdge
            DISCARD_ALPHA : AlphaDiscardThreshold           
            COLOR_MAP : ColorMap
            SHADOWMAP_SIZE : ShadowMapSize
            FADE : FadeInfo
            PSSM : Splits
            POINTLIGHT : LightViewProjectionMatrix5
            NUM_BONES : NumberOfBones
        }

        ForcedRenderState {
            Blend Modulate
            DepthWrite Off   
            PolyOffset -0.1 0  
        }
    }

  Technique PreNormalPass {

        VertexShader GLSL100 :   Common/MatDefs/SSAO/normal.vert
        FragmentShader GLSL100 : Common/MatDefs/SSAO/normal.frag

        WorldParameters {
            WorldViewProjectionMatrix
            WorldViewMatrix
            NormalMatrix
        }

        Defines {
            DIFFUSEMAP_ALPHA : DiffuseMap
            NUM_BONES : NumberOfBones
        }

    }

    Technique GBuf {

        VertexShader GLSL100:   Common/MatDefs/Light/GBuf.vert
        FragmentShader GLSL100: Common/MatDefs/Light/GBuf.frag

        WorldParameters {
            WorldViewProjectionMatrix
            NormalMatrix
            WorldViewMatrix
            WorldMatrix
        }

        Defines {
            VERTEX_COLOR : UseVertexColor
            MATERIAL_COLORS : UseMaterialColors
            V_TANGENT : VTangent
            MINNAERT  : Minnaert
            WARDISO   : WardIso

            DIFFUSEMAP : DiffuseMap
            NORMALMAP : NormalMap
            SPECULARMAP : SpecularMap
            PARALLAXMAP : ParallaxMap
        }
    }

    Technique {
        LightMode FixedPipeline
    }

    Technique Glow {

        VertexShader GLSL100:   Common/MatDefs/Misc/Unshaded.vert
        FragmentShader GLSL100: Common/MatDefs/Light/Glow.frag

        WorldParameters {
            WorldViewProjectionMatrix
        }

        Defines {
            NEED_TEXCOORD1
            HAS_GLOWMAP : GlowMap
            HAS_GLOWCOLOR : GlowColor

            NUM_BONES : NumberOfBones
        }
    }

}