﻿Pass
{
    $splice(PassName)
    Tags 
    { 
        $splice(LightMode)
    }
   
    // Render State
    $splice(Blending)
    $splice(Culling)
    $splice(ZTest)
    $splice(ZWrite)
    $splice(ColorMask)
    $splice(Stencil)

    HLSLPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    // Debug
    $splice(Debug)

    // --------------------------------------------------
    // Pass

    // Pragmas
    $splice(PassPragmas)

    // Keywords
    $splice(PassKeywords)
    $splice(GraphKeywords)
    
    // Defines
    $SurfaceType.Transparent:           #define _SURFACE_TYPE_TRANSPARENT 1
    $AlphaClip:                         #define _AlphaClip 1
    $SpecularColor:                     #define _SPECULAR_COLOR 1
    $Normal:                            #define _NORMALMAP 1
    $BlendMode.Add:                     #define _BLENDMODE_ADD 1
    $BlendMode.Premultiply:             #define _ALPHAPREMULTIPLY_ON 1
    $features.NormalDropOffTS:			#define _NORMAL_DROPOFF_TS 1
    $features.NormalDropOffOS:			#define _NORMAL_DROPOFF_OS 1
    $features.NormalDropOffWS:			#define _NORMAL_DROPOFF_WS 1
    $Attributes.normalOS:               #define ATTRIBUTES_NEED_NORMAL
    $Attributes.tangentOS:              #define ATTRIBUTES_NEED_TANGENT
    $Attributes.uv0:                    #define ATTRIBUTES_NEED_TEXCOORD0
    $Attributes.uv1:                    #define ATTRIBUTES_NEED_TEXCOORD1
    $Attributes.uv2:                    #define ATTRIBUTES_NEED_TEXCOORD2
    $Attributes.uv3:                    #define ATTRIBUTES_NEED_TEXCOORD3
    $Attributes.color:                  #define ATTRIBUTES_NEED_COLOR
    $Varyings.positionWS:               #define VARYINGS_NEED_POSITION_WS
    $Varyings.positionPredisplacementWS:    #define VARYINGS_NEED_POSITIONPREDISPLACEMENT_WS
    $Varyings.normalWS:                 #define VARYINGS_NEED_NORMAL_WS
    $Varyings.tangentWS:                #define VARYINGS_NEED_TANGENT_WS
    $Varyings.texCoord0:                #define VARYINGS_NEED_TEXCOORD0
    $Varyings.texCoord1:                #define VARYINGS_NEED_TEXCOORD1
    $Varyings.texCoord2:                #define VARYINGS_NEED_TEXCOORD2
    $Varyings.texCoord3:                #define VARYINGS_NEED_TEXCOORD3
    $Varyings.color:                    #define VARYINGS_NEED_COLOR
    $Varyings.viewDirectionWS:          #define VARYINGS_NEED_VIEWDIRECTION_WS
    $Varyings.bitangentWS:              #define VARYINGS_NEED_BITANGENT_WS
    $Varyings.screenPosition:           #define VARYINGS_NEED_SCREENPOSITION
    $Varyings.fogFactorAndVertexLight:  #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
    $Varyings.cullFace:                 #define VARYINGS_NEED_CULLFACE
    $features.graphVertex:              #define FEATURES_GRAPH_VERTEX
    $splice(PassInstancing)
    $splice(GraphDefines)
    $splice(DotsInstancingVars)

    // Includes
    $splice(CustomInterpolatorPreInclude)
    
    $splice(PassIncludes)

    // --------------------------------------------------
    // Graph

    // Graph Properties
    $splice(GraphProperties)
    
    // Graph Includes
    $splice(GraphIncludes)
        
    // -- Property used by ScenePickingPass
    #ifdef SCENEPICKINGPASS
        float4 _SelectionID;
    #endif
    
    // -- Properties used by SceneSelectionPass
    #ifdef SCENESELECTIONPASS
        int _ObjectId;
        int _PassValue;
    #endif


    // Graph Functions
    $splice(GraphFunctions)
    
    $splice(CustomInterpolatorPreVertex)

    // Graph Vertex
    $splice(GraphVertex)
    
    $splice(CustomInterpolatorPreSurface)
    
    // Graph Pixel
    $splice(GraphPixel)

    // --------------------------------------------------
    // Structs and Packing
    
    $splice(CustomInterpolatorPrePacking)

    $buildType(Attributes)

    $buildType(Varyings)

    // --------------------------------------------------
    // Build Graph Inputs

    $features.graphVertex:  $include("BuildVertexDescriptionInputs.template.hlsl")
    $features.graphPixel:   $include("BuildSurfaceDescriptionInputs.template.hlsl")

    // --------------------------------------------------
    // Main

    $splice(MainInclude)

    ENDHLSL
}
