#include "Macros.fxh"

BEGIN_CONSTANTS

    float4x4 ViewProjection    _vs(c4)             _cb(c4);

    float3 LightPosition                 _ps(c0)   _cb(c8);
    float FarPlane                       _ps(c1)   _cb(c9);

END_CONSTANTS

struct VertexShaderInput
{
    float4 Position : POSITION;
};

struct VertexShaderOutput
{
    float4 Position : SV_Position;
    float3 PositionWorld : TEXCOORD0;
};

VertexShaderOutput instanced_vs(VertexShaderInput input, float3 Translation : TEXCOORD2)
{
    VertexShaderOutput output;

    float4x4 world = float4x4(
        float4(1, 0, 0, 0),
        float4(0, 1, 0, 0),
        float4(0, 0, 1, 0),
        float4(Translation.x, Translation.y, Translation.z, 1)
    );

    float4x4 worldViewProjection = mul(world, ViewProjection);
    output.Position = mul(input.Position, worldViewProjection);
    output.Position.x *= -1; // otherwise cube map render will be horizontally flipped
    output.PositionWorld = mul(input.Position, world);
    return output;
}

float4 main_ps(VertexShaderOutput input) : SV_TARGET0
{
    float lightDistance = length(input.PositionWorld - LightPosition);
    lightDistance /= FarPlane;
    return float4(lightDistance, 0.0, 0.0, 0.0);
}

Technique SimpleDepth
{
    Pass
    {
        VertexShader = compile vs_3_0 instanced_vs();
        PixelShader  = compile ps_3_0 main_ps();
    }
}