#version 460
#extension GL_EXT_ray_query : enable
#extension GL_EXT_ray_flags_primitive_culling : enable

layout(primitive_culling);
struct Ray
{
    vec3 pos;
    float tmin;
    vec3 dir;
    float tmax;
};

layout(std430, set = 0, binding = 0) buffer Log
{
    uint x;
    uint y;
};

layout(binding = 1, set = 0) uniform accelerationStructureEXT rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };

void doSomething()
{
    x = 0;
    y = 0;
}

Ray makeRayDesc()
{
    Ray ray;
    ray.pos= vec3(0,0,0);
    ray.dir = vec3(1,0,0);
    ray.tmin = 0.0f;
    ray.tmax = 9999.0;
    return ray;
}

void main()
{
    Ray ray = makeRayDesc();
    rayQueryEXT rayQuery;
    rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);

    mat4x3 _mat4x3;
    mat3x4 _mat3x4;

    while (rayQueryProceedEXT(rayQuery))
    {
        uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
        switch(candidateType)
        {
            case gl_RayQueryCandidateIntersectionTriangleEXT:

                rayQueryTerminateEXT(rayQuery);
                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
                _mat3x4 = transpose(_mat4x3);
                rayQueryConfirmIntersectionEXT(rayQuery);

                if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
                {
                    doSomething();
                }

                if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0)
                {
                    doSomething();
                }
                break;

            case gl_RayQueryCandidateIntersectionAABBEXT:
            {
                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
                _mat3x4 = transpose(_mat4x3);
                if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
                {
                    doSomething();
                }

                float t = 0.5;
                rayQueryGenerateIntersectionEXT(rayQuery, t);
                rayQueryTerminateEXT(rayQuery);
                break;
            }
        }
    }

    if(_mat3x4[0][0] == _mat4x3[0][0])
    {
        doSomething();
    }

    uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);

    switch(committedStatus)
    {
        case gl_RayQueryCommittedIntersectionNoneEXT :
            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
            _mat3x4 = transpose(_mat4x3);
            break;

        case gl_RayQueryCommittedIntersectionTriangleEXT :
            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
            _mat3x4 = transpose(_mat4x3);

            if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
            {
                doSomething();
            }

            if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0)
            {
                doSomething();
            }
            break;

        case gl_RayQueryCommittedIntersectionGeneratedEXT :

            if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
            {
                doSomething();
            }

            if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
            {
                doSomething();
            }
            break;
    }

    if (_mat3x4[0][0] == _mat4x3[0][0])
    {
        doSomething();
    }

    if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT)
    {
        doSomething();
    }

    if (rayQueryGetRayTMinEXT(rayQuery) > 0.0)
    {
        doSomething();
    }

    vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
    vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);

    if (o.x == d.z)
    {
        doSomething();
    }
}
