Pass
{
    Tags
    {
        $splice(BaseGenName)
        $splice(BaseGenTexFormat)
        $splice(BaseGenTexSize)
        $splice(BaseGenEmptyColor)
    }

    // Render State
    $splice(RenderState)

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

    HLSLPROGRAM

    // Pragmas
    $splice(PassPragmas)

    // Keywords
    $splice(PassKeywords)
    $splice(GraphKeywords)

    $NormalDropOffTS: #define _NORMAL_DROPOFF_TS 1
    $NormalDropOffOS: #define _NORMAL_DROPOFF_OS 1
    $NormalDropOffWS: #define _NORMAL_DROPOFF_WS 1
    $Attributes.normalOS: #define ATTRIBUTES_NEED_NORMAL
    $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
    $Attributes.vertexID: #define ATTRIBUTES_NEED_VERTEXID
    $Varyings.positionWS: #define VARYINGS_NEED_POSITION_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.elementToWorld0:  #define VARYINGS_NEED_ELEMENT_TO_WORLD
    $Varyings.worldToElement0:  #define VARYINGS_NEED_WORLD_TO_ELEMENT
    $Varyings.bitangentWS: #define VARYINGS_NEED_BITANGENT_WS
    $Varyings.screenPosition: #define VARYINGS_NEED_SCREENPOSITION
    $Varyings.fogFactorAndVertexLight: #define VARYINGS_NEED_FOG_AND_VERTEX_LIGHT
    $Varyings.shadowCoord: #define VARYINGS_NEED_SHADOW_COORD
    $Varyings.cullFace: #define VARYINGS_NEED_CULLFACE
    $features.graphVertex: #define FEATURES_GRAPH_VERTEX
    $Universal.UseLegacySpriteBlocks: #define UNIVERSAL_USELEGACYSPRITEBLOCKS
    $splice(PassInstancing)
    $splice(GraphDefines)
    $splice(DotsInstancingVars)

    // Includes
    $splice(PreGraphIncludes)

    // Specific Terrain Define
    $include("TerrainPassDefine.template.hlsl")

    // --------------------------------------------------
    // Structs and Packing

    // custom interpolators pre packing
    $splice(CustomInterpolatorPrePacking)

    $splice(PassStructs)

    $splice(InterpolatorPack)

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

    // Graph Properties
    $splice(GraphProperties)

    // Graph Includes
    $splice(GraphIncludes)

    // Graph Functions
    $splice(GraphFunctions)

    // Graph Vertex
    $splice(GraphVertex)

    // Graph Pixel
    $splice(GraphPixel)

    // --------------------------------------------------
    // Build Graph Inputs
    $features.graphVertex: $include("BuildTerrainVertexDescriptionInputs.template.hlsl")
    $features.graphPixel: $include("BuildTerrainSurfaceDescriptionInputs.template.hlsl")

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

    $include("TerrainBaseMapGenPass.hlsl")

    ENDHLSL
}