#ifndef _PATHTRACING_STOCHASTICLIGHTMAPSAMPLING_HLSL_
#define _PATHTRACING_STOCHASTICLIGHTMAPSAMPLING_HLSL_

#include "PathTracingCommon.hlsl"

UnifiedRT::Ray MakeUVRay(float2 origin)
{
    UnifiedRT::Ray uvRay;
    uvRay.direction = float3(0.0, 0.0, 1.0);
    uvRay.tMax = 0.0002;
    uvRay.tMin = 0.0;
    uvRay.origin = float3(origin, -0.0001);
    return uvRay;
};

UnifiedRT::Hit LightmapSampleTexelOffset(
    float2 texelPos,
    float2 texelOffset,
    float2 resolution,
    float2 instanceScale,
    UnifiedRT::DispatchInfo dispatchInfo,
    UnifiedRT::RayTracingAccelStruct uvAccelStruct,
    half2 uvFallback)
{
    // No valid uv data for this texel?
    if (uvFallback.x < 0)
        return UnifiedRT::Hit::Invalid();

    // select a random point in the texel
    const float2 scaledResolution = resolution * instanceScale;
    const float2 texelSample = (texelPos + texelOffset) / scaledResolution;

    // shoot a random ray towards the texel
    const UnifiedRT::Ray uvRay = MakeUVRay(texelSample);
    UnifiedRT::Hit randomUVHit = UnifiedRT::TraceRayClosestHit(dispatchInfo, uvAccelStruct, 0xFFFFFFFF, uvRay, 0);
    if (randomUVHit.IsValid())
    {
        return randomUVHit;
    }
    else
    {
        // use fallback uv
        const float2 fallbackUvSample = (texelPos + uvFallback) / scaledResolution;
        const UnifiedRT::Ray uvRay = MakeUVRay(fallbackUvSample);
        return UnifiedRT::TraceRayClosestHit(dispatchInfo, uvAccelStruct, 0xFFFFFFFF, uvRay, 0);
    }
    return UnifiedRT::Hit::Invalid();
}

#endif