#ifndef _UNIFIEDRAYTRACING_COMMONSTRUCTS_HLSL_
#define _UNIFIEDRAYTRACING_COMMONSTRUCTS_HLSL_

namespace UnifiedRT {

static const uint kRayFlagNone = 0x0;
static const uint kRayFlagForceOpaque = 0x01;
static const uint kRayFlagForceNonOpaque = 0x02;
static const uint kRayFlagAcceptFirstHitAndEndSearch = 0x04;
static const uint kRayFlagSkipClosestHit = 0x08;
static const uint kRayFlagCullBackFacingTriangles = 0x10;
static const uint kRayFlagCullFrontFacingTriangles = 0x20;
static const uint kRayFlagCullOpaque = 0x40;
static const uint kRayFlagCullNonOpaque = 0x80;

static const uint kIgnoreHit = 0;
static const uint kAcceptHit = 1;
static const uint kAcceptHitAndEndSearch = 2;

struct Ray
{
    float3 origin;
    float  tMin;
    float3 direction;
    float  tMax;
};

struct Hit
{
    uint instanceID;
    uint primitiveIndex;
    float2 uvBarycentrics;
    float hitDistance;
    bool isFrontFace;

    bool IsValid()
    {
        return instanceID != -1;
    }

    static Hit Invalid()
    {
        Hit hit = (Hit)0;
        hit.instanceID = -1;
        return hit;
    }
};


struct InstanceData
{
    float4x4 localToWorld;
    float4x4 previousLocalToWorld;
    float4x4 localToWorldNormals;
    uint renderingLayerMask;
    uint instanceMask;
    uint userMaterialID;
    uint geometryIndex;
};

struct DispatchInfo
{
    uint3 dispatchThreadID;
    uint localThreadIndex;
    uint3 dispatchDimensionsInThreads;
    uint globalThreadIndex;
};

} // namespace UnifiedRT

#endif // _UNIFIEDRAYTRACING_COMMONSTRUCTS_HLSL_