1617a3babSopenharmony_ci#version 460
2617a3babSopenharmony_ci#extension GL_NV_ray_tracing : enable
3617a3babSopenharmony_ci#extension GL_EXT_ray_query : enable
4617a3babSopenharmony_ci
5617a3babSopenharmony_cistruct Ray
6617a3babSopenharmony_ci{
7617a3babSopenharmony_ci    vec3 pos;
8617a3babSopenharmony_ci    float tmin;
9617a3babSopenharmony_ci    vec3 dir;
10617a3babSopenharmony_ci    float tmax;
11617a3babSopenharmony_ci};
12617a3babSopenharmony_ci
13617a3babSopenharmony_cilayout(std430, set = 0, binding = 0) buffer Log
14617a3babSopenharmony_ci{
15617a3babSopenharmony_ci    uint x;
16617a3babSopenharmony_ci    uint y;
17617a3babSopenharmony_ci};
18617a3babSopenharmony_ci
19617a3babSopenharmony_cilayout(binding = 1, set = 0) uniform accelerationStructureEXT rtas;
20617a3babSopenharmony_cilayout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
21617a3babSopenharmony_ci
22617a3babSopenharmony_civoid doSomething()
23617a3babSopenharmony_ci{
24617a3babSopenharmony_ci    x = 0;
25617a3babSopenharmony_ci    y = 0;
26617a3babSopenharmony_ci}
27617a3babSopenharmony_ci
28617a3babSopenharmony_ciRay makeRayDesc()
29617a3babSopenharmony_ci{
30617a3babSopenharmony_ci    Ray ray;
31617a3babSopenharmony_ci    ray.pos= vec3(0,0,0);
32617a3babSopenharmony_ci    ray.dir = vec3(1,0,0);
33617a3babSopenharmony_ci    ray.tmin = 0.0f;
34617a3babSopenharmony_ci    ray.tmax = 9999.0;
35617a3babSopenharmony_ci    return ray;
36617a3babSopenharmony_ci}
37617a3babSopenharmony_ci
38617a3babSopenharmony_civoid main()
39617a3babSopenharmony_ci{
40617a3babSopenharmony_ci    Ray ray = makeRayDesc();
41617a3babSopenharmony_ci    rayQueryEXT rayQuery;
42617a3babSopenharmony_ci    rayQueryInitializeEXT(rayQuery, rtas, gl_RayFlagsNoneEXT, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
43617a3babSopenharmony_ci
44617a3babSopenharmony_ci    mat4x3 _mat4x3;
45617a3babSopenharmony_ci    mat3x4 _mat3x4;
46617a3babSopenharmony_ci
47617a3babSopenharmony_ci    while (rayQueryProceedEXT(rayQuery) == 1)
48617a3babSopenharmony_ci    {
49617a3babSopenharmony_ci        int candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
50617a3babSopenharmony_ci        switch(candidateType)
51617a3babSopenharmony_ci        {
52617a3babSopenharmony_ci            case gl_RayQueryCandidateIntersectionTriangleEXT:
53617a3babSopenharmony_ci
54617a3babSopenharmony_ci                rayQueryTerminateEXT(rayQuery);
55617a3babSopenharmony_ci                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
56617a3babSopenharmony_ci                _mat3x4 = transpose(_mat4x3);
57617a3babSopenharmony_ci                rayQueryConfirmIntersectionEXT(rayQuery);
58617a3babSopenharmony_ci
59617a3babSopenharmony_ci                if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true) == 1)
60617a3babSopenharmony_ci                {
61617a3babSopenharmony_ci                    doSomething();
62617a3babSopenharmony_ci                }
63617a3babSopenharmony_ci
64617a3babSopenharmony_ci                if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true) == 0)
65617a3babSopenharmony_ci                {
66617a3babSopenharmony_ci                    doSomething();
67617a3babSopenharmony_ci                }
68617a3babSopenharmony_ci
69617a3babSopenharmony_ci                if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true))
70617a3babSopenharmony_ci                {
71617a3babSopenharmony_ci                    doSomething();
72617a3babSopenharmony_ci                }
73617a3babSopenharmony_ci
74617a3babSopenharmony_ci                if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true))
75617a3babSopenharmony_ci                {
76617a3babSopenharmony_ci                    doSomething();
77617a3babSopenharmony_ci                }
78617a3babSopenharmony_ci
79617a3babSopenharmony_ci                if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true) > 0)
80617a3babSopenharmony_ci                {
81617a3babSopenharmony_ci                    doSomething();
82617a3babSopenharmony_ci                }
83617a3babSopenharmony_ci
84617a3babSopenharmony_ci                if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true) > 0)
85617a3babSopenharmony_ci                {
86617a3babSopenharmony_ci                    doSomething();
87617a3babSopenharmony_ci                }
88617a3babSopenharmony_ci
89617a3babSopenharmony_ci                if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true))
90617a3babSopenharmony_ci                {
91617a3babSopenharmony_ci                    doSomething();
92617a3babSopenharmony_ci                }
93617a3babSopenharmony_ci
94617a3babSopenharmony_ci                if (rayQueryGetIntersectionTEXT(rayQuery, true))
95617a3babSopenharmony_ci                {
96617a3babSopenharmony_ci                    doSomething();
97617a3babSopenharmony_ci                }
98617a3babSopenharmony_ci
99617a3babSopenharmony_ci                if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true))
100617a3babSopenharmony_ci                {
101617a3babSopenharmony_ci                    doSomething();
102617a3babSopenharmony_ci                }
103617a3babSopenharmony_ci                break;
104617a3babSopenharmony_ci
105617a3babSopenharmony_ci            case gl_RayQueryCandidateIntersectionAABBEXT:
106617a3babSopenharmony_ci            {
107617a3babSopenharmony_ci                _mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
108617a3babSopenharmony_ci                _mat3x4 = transpose(_mat4x3);
109617a3babSopenharmony_ci                if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
110617a3babSopenharmony_ci                {
111617a3babSopenharmony_ci                    doSomething();
112617a3babSopenharmony_ci                }
113617a3babSopenharmony_ci
114617a3babSopenharmony_ci                int t = 1;
115617a3babSopenharmony_ci                rayQueryGenerateIntersectionEXT(rayQuery, t);
116617a3babSopenharmony_ci                rayQueryTerminateEXT(rayQuery);
117617a3babSopenharmony_ci                break;
118617a3babSopenharmony_ci            }
119617a3babSopenharmony_ci        }
120617a3babSopenharmony_ci    }
121617a3babSopenharmony_ci
122617a3babSopenharmony_ci    if(_mat3x4[0][0] == _mat4x3[0][0])
123617a3babSopenharmony_ci    {
124617a3babSopenharmony_ci        doSomething();
125617a3babSopenharmony_ci    }
126617a3babSopenharmony_ci
127617a3babSopenharmony_ci    int committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
128617a3babSopenharmony_ci
129617a3babSopenharmony_ci    switch(committedStatus)
130617a3babSopenharmony_ci    {
131617a3babSopenharmony_ci        case gl_RayQueryCommittedIntersectionNoneEXT :
132617a3babSopenharmony_ci            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
133617a3babSopenharmony_ci            _mat3x4 = transpose(_mat4x3);
134617a3babSopenharmony_ci            break;
135617a3babSopenharmony_ci
136617a3babSopenharmony_ci        case gl_RayQueryCommittedIntersectionTriangleEXT :
137617a3babSopenharmony_ci            _mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
138617a3babSopenharmony_ci            _mat3x4 = transpose(_mat4x3);
139617a3babSopenharmony_ci
140617a3babSopenharmony_ci            if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
141617a3babSopenharmony_ci            {
142617a3babSopenharmony_ci                doSomething();
143617a3babSopenharmony_ci            }
144617a3babSopenharmony_ci
145617a3babSopenharmony_ci            if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true) == 0)
146617a3babSopenharmony_ci            {
147617a3babSopenharmony_ci                doSomething();
148617a3babSopenharmony_ci            }
149617a3babSopenharmony_ci            break;
150617a3babSopenharmony_ci
151617a3babSopenharmony_ci        case gl_RayQueryCommittedIntersectionGeneratedEXT :
152617a3babSopenharmony_ci
153617a3babSopenharmony_ci            if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
154617a3babSopenharmony_ci            {
155617a3babSopenharmony_ci                doSomething();
156617a3babSopenharmony_ci            }
157617a3babSopenharmony_ci
158617a3babSopenharmony_ci            if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true))
159617a3babSopenharmony_ci            {
160617a3babSopenharmony_ci                doSomething();
161617a3babSopenharmony_ci            }
162617a3babSopenharmony_ci
163617a3babSopenharmony_ci            if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true))
164617a3babSopenharmony_ci            {
165617a3babSopenharmony_ci                doSomething();
166617a3babSopenharmony_ci            }
167617a3babSopenharmony_ci
168617a3babSopenharmony_ci            if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true) > 0)
169617a3babSopenharmony_ci            {
170617a3babSopenharmony_ci                doSomething();
171617a3babSopenharmony_ci            }
172617a3babSopenharmony_ci
173617a3babSopenharmony_ci            if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true) > 0)
174617a3babSopenharmony_ci            {
175617a3babSopenharmony_ci                doSomething();
176617a3babSopenharmony_ci            }
177617a3babSopenharmony_ci
178617a3babSopenharmony_ci            if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true))
179617a3babSopenharmony_ci            {
180617a3babSopenharmony_ci                doSomething();
181617a3babSopenharmony_ci            }
182617a3babSopenharmony_ci
183617a3babSopenharmony_ci            if(rayQueryGetIntersectionTEXT(rayQuery, true))
184617a3babSopenharmony_ci            {
185617a3babSopenharmony_ci                doSomething();
186617a3babSopenharmony_ci            }
187617a3babSopenharmony_ci            break;
188617a3babSopenharmony_ci    }
189617a3babSopenharmony_ci
190617a3babSopenharmony_ci    if (_mat3x4[0][0] == _mat4x3[0][0])
191617a3babSopenharmony_ci    {
192617a3babSopenharmony_ci        doSomething();
193617a3babSopenharmony_ci    }
194617a3babSopenharmony_ci
195617a3babSopenharmony_ci    if (rayQueryGetRayFlagsEXT(rayQuery))
196617a3babSopenharmony_ci    {
197617a3babSopenharmony_ci        doSomething();
198617a3babSopenharmony_ci    }
199617a3babSopenharmony_ci
200617a3babSopenharmony_ci    if (rayQueryGetRayTMinEXT(rayQuery))
201617a3babSopenharmony_ci    {
202617a3babSopenharmony_ci        doSomething();
203617a3babSopenharmony_ci    }
204617a3babSopenharmony_ci
205617a3babSopenharmony_ci    vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
206617a3babSopenharmony_ci    vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
207617a3babSopenharmony_ci
208617a3babSopenharmony_ci    if (o.x == d.z)
209617a3babSopenharmony_ci    {
210617a3babSopenharmony_ci        doSomething();
211617a3babSopenharmony_ci    }
212617a3babSopenharmony_ci}
213