@meimu/mutracer 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +3525 -3484
- package/docs/materials.md +27 -7
- package/docs/threejs.md +13 -2
- package/docs/viewer.md +53 -0
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +2 -1
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
- package/lib/renderer/WGPURayTraceOutput.js +14 -12
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.js +2 -2
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +20 -18
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.js +3 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
- package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
- package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +128 -128
- package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
- package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
- package/lib/renderer/lightsUtil.js +1 -1
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +5 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/materialLayout.js +2 -1
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +4 -2
- package/lib/renderer/prepareMeshBVH.js +44 -20
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +4 -2
- package/lib/scene/OpenPBRMaterial.js +4 -2
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/openPbrSchema.d.ts +7 -2
- package/lib/scene/openPbrSchema.js +2 -1
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +1 -0
- package/lib/util/fromTHREE.js +24 -6
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -4
|
@@ -8,21 +8,21 @@ import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
|
|
|
8
8
|
const displacementWgsl = pdm_displacementWgsl;
|
|
9
9
|
const flatIntersectCode = function () {
|
|
10
10
|
return /* wgsl */ `
|
|
11
|
-
let hit = fI(o, d, tri, ey,
|
|
11
|
+
let hit = fI(o, d, tri, ey, gL, tMax);
|
|
12
12
|
if (hit.t > 0.0) {
|
|
13
13
|
let e1 = tri.p1 - tri.p0;
|
|
14
14
|
let e2 = tri.p2 - tri.p0;
|
|
15
15
|
eC = normalize(cross(e1, e2));
|
|
16
|
-
let
|
|
17
|
-
let
|
|
18
|
-
if (!doubleSided && !
|
|
16
|
+
let kd = i32(ae(bitcast<i32>(oh.z)).x);
|
|
17
|
+
let iI = materialsBuffer[kd].doubleSided > 0.5;
|
|
18
|
+
if (!doubleSided && !iI && dot(eC, d) > 0.0) {
|
|
19
19
|
eC = vec3f(0.0);
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
qT = true;
|
|
25
|
+
ol = true;
|
|
26
26
|
eU = o + tMax * d;
|
|
27
27
|
aB = hit.barycentric;
|
|
28
28
|
}
|
|
@@ -30,46 +30,43 @@ aB = hit.barycentric;
|
|
|
30
30
|
};
|
|
31
31
|
function getPDMDisplacmentCode(anyHit) {
|
|
32
32
|
return /*wgsl */ `
|
|
33
|
-
let
|
|
33
|
+
let kO = oT(
|
|
34
34
|
o, d, tMax,
|
|
35
35
|
tri.p0, tri.p1, tri.p2,
|
|
36
36
|
n0, n1, n2,
|
|
37
37
|
uv0, uv1, uv2,
|
|
38
38
|
displacementMapIndex,
|
|
39
|
-
|
|
39
|
+
oa(displacementMapIndex),
|
|
40
40
|
minH, maxH,
|
|
41
41
|
hScale,
|
|
42
|
+
matData.displacementBias,
|
|
42
43
|
matData.displacementStepSize,
|
|
43
44
|
i32(matData.displacementUvProjection),
|
|
44
45
|
displacementUvProjectionScale,
|
|
45
46
|
${anyHit ? 'true' : 'false'},
|
|
46
|
-
|
|
47
|
+
lq
|
|
47
48
|
);
|
|
48
49
|
`;
|
|
49
50
|
}
|
|
50
51
|
const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
|
|
51
52
|
return /* wgsl */ `
|
|
52
53
|
|
|
53
|
-
let hScale =
|
|
54
|
-
let
|
|
55
|
-
if (abs(hScale) > 0.0 && th > 0) {
|
|
54
|
+
let hScale = oh.w;
|
|
55
|
+
let tn = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
+
let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
|
|
58
|
+
let matData = materialsBuffer[materialIndex];
|
|
57
59
|
let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
58
60
|
let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
59
61
|
let n2 = normalize(attrBuffers[index.z * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let
|
|
67
|
-
let
|
|
68
|
-
let pE = tri.p1 + n1 * hScale * maxH;
|
|
69
|
-
let pF = tri.p2 + n2 * hScale * maxH;
|
|
70
|
-
|
|
71
|
-
let materialIndex = i32(ae(bitcast<i32>(od.z)).x);
|
|
72
|
-
let matData = materialsBuffer[materialIndex];
|
|
62
|
+
if (matData.displacementMapIndex >= 0.0 && matData.displacementBias != 0.0) {
|
|
63
|
+
tri.p0 += n0 * matData.displacementBias;
|
|
64
|
+
tri.p1 += n1 * matData.displacementBias;
|
|
65
|
+
tri.p2 += n2 * matData.displacementBias;
|
|
66
|
+
}
|
|
67
|
+
if (abs(hScale) > 0.0 && tn > 0) {
|
|
68
|
+
let minH = f32(tn >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(tn & 0xff) / 255.0;
|
|
73
70
|
let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
|
|
74
71
|
let displacementMapIndex = i32(matData.displacementMapIndex);
|
|
75
72
|
|
|
@@ -80,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
|
|
|
80
77
|
|
|
81
78
|
${getPDMDisplacmentCode(anyHit)}
|
|
82
79
|
|
|
83
|
-
if (
|
|
84
|
-
eC =
|
|
80
|
+
if (kO.t < tMax) {
|
|
81
|
+
eC = kO.normal;
|
|
85
82
|
|
|
86
83
|
|
|
87
|
-
tMax =
|
|
84
|
+
tMax = kO.t;
|
|
88
85
|
|
|
89
|
-
aB =
|
|
86
|
+
aB = kO.barycentric;
|
|
90
87
|
eU = o + tMax * d;
|
|
91
88
|
|
|
92
89
|
bU = true;
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
qT = true;
|
|
91
|
+
ol = true;
|
|
95
92
|
}
|
|
96
93
|
}
|
|
97
94
|
else {
|
|
@@ -115,102 +112,102 @@ f32(value >> 24u)
|
|
|
115
112
|
|
|
116
113
|
|
|
117
114
|
|
|
118
|
-
fn
|
|
115
|
+
fn kn(value: u32) -> u32 {
|
|
119
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
120
117
|
}
|
|
121
118
|
|
|
122
|
-
fn
|
|
119
|
+
fn nO(value: u32) -> u32 {
|
|
123
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
124
121
|
}
|
|
125
122
|
|
|
126
|
-
fn
|
|
123
|
+
fn oi(
|
|
127
124
|
node: i32,
|
|
128
|
-
|
|
125
|
+
tc: i32,
|
|
129
126
|
n0: vec4f,
|
|
130
127
|
o: vec3f,
|
|
131
|
-
|
|
128
|
+
gx: vec3f,
|
|
132
129
|
tMax: f32
|
|
133
130
|
) -> u32 {
|
|
134
|
-
let i = node +
|
|
131
|
+
let i = node + tc;
|
|
135
132
|
let n2 = bvhBuffer[i + 2];
|
|
136
133
|
let n3 = bvhBuffer[i + 3];
|
|
137
134
|
let n4 = bvhBuffer[i + 4];
|
|
138
135
|
let header = bitcast<u32>(n0.w);
|
|
139
|
-
let
|
|
140
|
-
let
|
|
141
|
-
let
|
|
142
|
-
let
|
|
143
|
-
bitcast<f32>(u32(
|
|
144
|
-
bitcast<f32>(u32(
|
|
145
|
-
bitcast<f32>(u32(
|
|
136
|
+
let rv = bitcast<i32>((header & 0xffu) << 24u) >> 24;
|
|
137
|
+
let rw = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
|
|
138
|
+
let rA = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
|
|
139
|
+
let hF = vec3f(
|
|
140
|
+
bitcast<f32>(u32(rv + 127) << 23u),
|
|
141
|
+
bitcast<f32>(u32(rw + 127) << 23u),
|
|
142
|
+
bitcast<f32>(u32(rA + 127) << 23u)
|
|
146
143
|
);
|
|
147
|
-
let bJ = eV(
|
|
148
|
-
let eH = (n0.xyz - o) *
|
|
149
|
-
let da =
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
let
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
let
|
|
157
|
-
let
|
|
158
|
-
let
|
|
159
|
-
let
|
|
160
|
-
let
|
|
161
|
-
let
|
|
162
|
-
|
|
163
|
-
let
|
|
164
|
-
let
|
|
165
|
-
let
|
|
166
|
-
let
|
|
167
|
-
let
|
|
168
|
-
let
|
|
169
|
-
let
|
|
170
|
-
max((min(
|
|
171
|
-
(min(
|
|
144
|
+
let bJ = eV(gx, o);
|
|
145
|
+
let eH = (n0.xyz - o) * gx;
|
|
146
|
+
let da = hF * gx;
|
|
147
|
+
let wr = bp(bitcast<u32>(n2.x));
|
|
148
|
+
let ws = bp(bitcast<u32>(n2.y));
|
|
149
|
+
let wt = bp(bitcast<u32>(n2.z));
|
|
150
|
+
let wu = bp(bitcast<u32>(n2.w));
|
|
151
|
+
let wv = bp(bitcast<u32>(n3.x));
|
|
152
|
+
let ww = bp(bitcast<u32>(n3.y));
|
|
153
|
+
let wl = bp(bitcast<u32>(n3.z));
|
|
154
|
+
let wm = bp(bitcast<u32>(n3.w));
|
|
155
|
+
let wn = bp(bitcast<u32>(n4.x));
|
|
156
|
+
let wo = bp(bitcast<u32>(n4.y));
|
|
157
|
+
let wp = bp(bitcast<u32>(n4.z));
|
|
158
|
+
let wq = bp(bitcast<u32>(n4.w));
|
|
159
|
+
|
|
160
|
+
let vh = wr * da.x + eH.x;
|
|
161
|
+
let vk = wt * da.y + eH.y;
|
|
162
|
+
let vm = wv * da.z + eH.z;
|
|
163
|
+
let va = wl * da.x + eH.x;
|
|
164
|
+
let vc = wn * da.y + eH.y;
|
|
165
|
+
let ve = wp * da.z + eH.z;
|
|
166
|
+
let wx = max(
|
|
167
|
+
max((min(vh, va) - vec4f(bJ.x)), (min(vk, vc) - vec4f(bJ.y))),
|
|
168
|
+
(min(vm, ve) - vec4f(bJ.z))
|
|
172
169
|
);
|
|
173
|
-
let
|
|
174
|
-
min((max(
|
|
175
|
-
(max(
|
|
170
|
+
let wg = min(
|
|
171
|
+
min((max(vh, va) + vec4f(bJ.x)), (max(vk, vc) + vec4f(bJ.y))),
|
|
172
|
+
(max(vm, ve) + vec4f(bJ.z))
|
|
176
173
|
);
|
|
177
174
|
|
|
178
|
-
let
|
|
179
|
-
let
|
|
180
|
-
let
|
|
181
|
-
let
|
|
182
|
-
let
|
|
183
|
-
let
|
|
184
|
-
let
|
|
185
|
-
max((min(
|
|
186
|
-
(min(
|
|
175
|
+
let vj = ws * da.x + eH.x;
|
|
176
|
+
let vl = wu * da.y + eH.y;
|
|
177
|
+
let vn = ww * da.z + eH.z;
|
|
178
|
+
let vb = wm * da.x + eH.x;
|
|
179
|
+
let vd = wo * da.y + eH.y;
|
|
180
|
+
let vg = wq * da.z + eH.z;
|
|
181
|
+
let wy = max(
|
|
182
|
+
max((min(vj, vb) - vec4f(bJ.x)), (min(vl, vd) - vec4f(bJ.y))),
|
|
183
|
+
(min(vn, vg) - vec4f(bJ.z))
|
|
187
184
|
);
|
|
188
|
-
let
|
|
189
|
-
min((max(
|
|
190
|
-
(max(
|
|
185
|
+
let wh = min(
|
|
186
|
+
min((max(vj, vb) + vec4f(bJ.x)), (max(vl, vd) + vec4f(bJ.y))),
|
|
187
|
+
(max(vn, vg) + vec4f(bJ.z))
|
|
191
188
|
);
|
|
192
189
|
|
|
193
|
-
let
|
|
194
|
-
let
|
|
195
|
-
return select(0u, 1u,
|
|
196
|
-
| select(0u, 2u,
|
|
197
|
-
| select(0u, 4u,
|
|
198
|
-
| select(0u, 8u,
|
|
199
|
-
| select(0u, 16u,
|
|
200
|
-
| select(0u, 32u,
|
|
201
|
-
| select(0u, 64u,
|
|
202
|
-
| select(0u, 128u,
|
|
190
|
+
let uD = (wx <= min(wg, vec4f(tMax))) & (wg > vec4f(0.0));
|
|
191
|
+
let uE = (wy <= min(wh, vec4f(tMax))) & (wh > vec4f(0.0));
|
|
192
|
+
return select(0u, 1u, uD.x)
|
|
193
|
+
| select(0u, 2u, uD.y)
|
|
194
|
+
| select(0u, 4u, uD.z)
|
|
195
|
+
| select(0u, 8u, uD.w)
|
|
196
|
+
| select(0u, 16u, uE.x)
|
|
197
|
+
| select(0u, 32u, uE.y)
|
|
198
|
+
| select(0u, 64u, uE.z)
|
|
199
|
+
| select(0u, 128u, uE.w);
|
|
203
200
|
}
|
|
204
201
|
|
|
205
202
|
`;
|
|
206
203
|
function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
|
|
207
204
|
const intersectTriangles = /* wgsl */ `
|
|
208
|
-
let
|
|
209
|
-
let vertexOffset = vec3i(bitcast<i32>(
|
|
205
|
+
let oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(oh.y));
|
|
210
207
|
for (var k = 0; k < bh; k++) {
|
|
211
208
|
let triangleIndex = primitiveOffset + k;
|
|
212
209
|
${skipTriangleCode}
|
|
213
|
-
if (bounces > 0 && triangleIndex ==
|
|
210
|
+
if (bounces > 0 && triangleIndex == hK) {
|
|
214
211
|
continue;
|
|
215
212
|
}
|
|
216
213
|
|
|
@@ -221,12 +218,12 @@ attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.x
|
|
|
221
218
|
attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
|
|
222
219
|
attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
|
|
223
220
|
);
|
|
224
|
-
var
|
|
221
|
+
var ol = false;
|
|
225
222
|
|
|
226
223
|
${hasDisplacement
|
|
227
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
228
225
|
: flatIntersectCode()}
|
|
229
|
-
if (
|
|
226
|
+
if (ol) {
|
|
230
227
|
${handleHitCode}
|
|
231
228
|
}
|
|
232
229
|
}
|
|
@@ -234,69 +231,69 @@ ${handleHitCode}
|
|
|
234
231
|
return /* wgsl */ `
|
|
235
232
|
var d = ray.d;
|
|
236
233
|
var o = ray.o;
|
|
237
|
-
var
|
|
238
|
-
var
|
|
239
|
-
var
|
|
234
|
+
var lQ: array<i32, TLAS_STACK_SIZE>;
|
|
235
|
+
var jd = -1;
|
|
236
|
+
var gx = eX(d);
|
|
240
237
|
var bU = false;
|
|
241
|
-
var
|
|
238
|
+
var qT = false;
|
|
242
239
|
var eU: vec3f;
|
|
243
240
|
var eC: vec3f;
|
|
244
241
|
var aB: vec3f;
|
|
245
242
|
|
|
246
243
|
|
|
247
|
-
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz,
|
|
248
|
-
|
|
249
|
-
|
|
244
|
+
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gx, tMax) > 0.0) {
|
|
245
|
+
jd = 0;
|
|
246
|
+
lQ[0] = 0;
|
|
250
247
|
}
|
|
251
|
-
while (
|
|
252
|
-
let
|
|
253
|
-
|
|
248
|
+
while (jd >= 0) {
|
|
249
|
+
let sN = lQ[jd];
|
|
250
|
+
jd--;
|
|
254
251
|
o = ray.o;
|
|
255
252
|
d = ray.d;
|
|
256
|
-
|
|
253
|
+
gx = eX(d);
|
|
257
254
|
|
|
258
|
-
let
|
|
259
|
-
let eR = bitcast<i32>(
|
|
255
|
+
let vX = bvhBuffer[sN];
|
|
256
|
+
let eR = bitcast<i32>(vX.w);
|
|
260
257
|
if (eR >= 0) {
|
|
261
|
-
let left =
|
|
258
|
+
let left = sN + 2;
|
|
262
259
|
let right = eR;
|
|
263
260
|
let d0 = cM(
|
|
264
261
|
o,
|
|
265
262
|
bvhBuffer[left].xyz,
|
|
266
263
|
bvhBuffer[left + 1].xyz,
|
|
267
|
-
|
|
264
|
+
gx,
|
|
268
265
|
tMax
|
|
269
266
|
);
|
|
270
267
|
let d1 = cM(
|
|
271
268
|
o,
|
|
272
269
|
bvhBuffer[right].xyz,
|
|
273
270
|
bvhBuffer[right + 1].xyz,
|
|
274
|
-
|
|
271
|
+
gx,
|
|
275
272
|
tMax
|
|
276
273
|
);
|
|
277
274
|
|
|
278
275
|
if (d0 > d1) {
|
|
279
|
-
if (d0 > 0.0) {
|
|
280
|
-
if (d1 > 0.0) {
|
|
276
|
+
if (d0 > 0.0) { jd++; lQ[jd] = left; }
|
|
277
|
+
if (d1 > 0.0) { jd++; lQ[jd] = right; }
|
|
281
278
|
}
|
|
282
279
|
else {
|
|
283
|
-
if (d1 > 0.0) {
|
|
284
|
-
if (d0 > 0.0) {
|
|
280
|
+
if (d1 > 0.0) { jd++; lQ[jd] = right; }
|
|
281
|
+
if (d0 > 0.0) { jd++; lQ[jd] = left; }
|
|
285
282
|
}
|
|
286
283
|
}
|
|
287
284
|
else {
|
|
288
|
-
let
|
|
285
|
+
let qB = -eR;
|
|
289
286
|
|
|
290
287
|
|
|
291
288
|
for (
|
|
292
|
-
var
|
|
293
|
-
|
|
294
|
-
|
|
289
|
+
var ml = qB - 1;
|
|
290
|
+
ml >= 0;
|
|
291
|
+
ml--
|
|
295
292
|
) {
|
|
296
|
-
let
|
|
297
|
-
let cf = bitcast<i32>(
|
|
298
|
-
let
|
|
299
|
-
let
|
|
293
|
+
let pq = bvhBuffer[sN + 2 + ml];
|
|
294
|
+
let cf = bitcast<i32>(pq.x);
|
|
295
|
+
let uN = bitcast<i32>(pq.y);
|
|
296
|
+
let oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
300
297
|
let w2l = mat4x4<f32>(
|
|
301
298
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
302
299
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
@@ -305,212 +302,212 @@ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
|
305
302
|
);
|
|
306
303
|
o = (w2l * vec4f(ray.o, 1.0)).xyz;
|
|
307
304
|
d = (w2l * vec4f(ray.d, 0.0)).xyz;
|
|
308
|
-
|
|
305
|
+
gx = eX(d);
|
|
309
306
|
ey = maxDimension(abs(d));
|
|
310
|
-
|
|
307
|
+
gL = mj(d, ey);
|
|
311
308
|
|
|
312
|
-
let fG = bitcast<u32>(
|
|
313
|
-
let
|
|
309
|
+
let fG = bitcast<u32>(oh.x);
|
|
310
|
+
let gN = fG >> 30u;
|
|
314
311
|
let blasOffset = i32(fG & 0x3fffffffu);
|
|
315
312
|
let bo = rtUniform.blasOffset;
|
|
316
313
|
|
|
317
314
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
318
|
-
if (
|
|
315
|
+
if (gN == 3u) {
|
|
319
316
|
|
|
320
317
|
|
|
321
318
|
|
|
322
319
|
|
|
323
|
-
var
|
|
324
|
-
var
|
|
325
|
-
var
|
|
326
|
-
var
|
|
320
|
+
var sd: array<vec2u, BLAS_STACK_SIZE>;
|
|
321
|
+
var pe = -1;
|
|
322
|
+
var rP = 0u;
|
|
323
|
+
var kQ = 0u;
|
|
327
324
|
|
|
328
325
|
var ep = 0x80000000u;
|
|
329
|
-
let
|
|
326
|
+
let ul = select(0u, 4u, d.x < 0.0)
|
|
330
327
|
| select(0u, 2u, d.y < 0.0)
|
|
331
328
|
| select(0u, 1u, d.z < 0.0);
|
|
332
|
-
let
|
|
329
|
+
let qd = 7u - ul;
|
|
333
330
|
|
|
334
331
|
|
|
335
332
|
|
|
336
333
|
|
|
337
|
-
while (
|
|
338
|
-
|
|
334
|
+
while (rP < 4096u) {
|
|
335
|
+
rP++;
|
|
339
336
|
|
|
340
337
|
let internalMask = ep & 0xffu;
|
|
341
|
-
let
|
|
342
|
-
|
|
343
|
-
ep &= ~(1u <<
|
|
338
|
+
let pZ =
|
|
339
|
+
kn(ep >> 24u) + 24u;
|
|
340
|
+
ep &= ~(1u << pZ);
|
|
344
341
|
if ((ep & 0xff000000u) != 0u) {
|
|
345
|
-
|
|
342
|
+
pe++;
|
|
346
343
|
|
|
347
|
-
|
|
344
|
+
sd[pe] = vec2u(kQ, ep);
|
|
348
345
|
}
|
|
349
346
|
|
|
350
|
-
let slot = (
|
|
351
|
-
let
|
|
352
|
-
let relativeIndex = countOneBits(internalMask &
|
|
353
|
-
let
|
|
354
|
-
let node = blasOffset + i32(
|
|
355
|
-
let
|
|
356
|
-
let
|
|
357
|
-
node, bo,
|
|
347
|
+
let slot = (pZ - 24u) ^ qd;
|
|
348
|
+
let ne = (1u << slot) - 1u;
|
|
349
|
+
let relativeIndex = countOneBits(internalMask & ne);
|
|
350
|
+
let sb = kQ + relativeIndex;
|
|
351
|
+
let node = blasOffset + i32(sb * 5u);
|
|
352
|
+
let ju = bvhBuffer[node + bo];
|
|
353
|
+
let tX = oi(
|
|
354
|
+
node, bo, ju, o, gx, tMax
|
|
358
355
|
);
|
|
359
356
|
|
|
360
357
|
|
|
361
358
|
ep = 0u;
|
|
362
|
-
if (
|
|
359
|
+
if (tX != 0u) {
|
|
363
360
|
let fC = bvhBuffer[node + bo + 1];
|
|
364
|
-
let
|
|
365
|
-
var
|
|
366
|
-
var
|
|
367
|
-
while (
|
|
368
|
-
let
|
|
369
|
-
|
|
370
|
-
let
|
|
361
|
+
let rG = bitcast<u32>(ju.w) >> 24u;
|
|
362
|
+
var tl = 0u;
|
|
363
|
+
var jZ = tX;
|
|
364
|
+
while (jZ != 0u) {
|
|
365
|
+
let rr = kn(jZ);
|
|
366
|
+
jZ &= ~(1u << rr);
|
|
367
|
+
let su = select(
|
|
371
368
|
bitcast<u32>(fC.z),
|
|
372
369
|
bitcast<u32>(fC.w),
|
|
373
|
-
|
|
370
|
+
rr >= 4u
|
|
374
371
|
);
|
|
375
|
-
let
|
|
376
|
-
(
|
|
377
|
-
let
|
|
378
|
-
let
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
372
|
+
let sW =
|
|
373
|
+
(su >> ((rr & 3u) * 8u)) & 0xffu;
|
|
374
|
+
let jw = sW & 0x1fu;
|
|
375
|
+
let uM = select(
|
|
376
|
+
jw,
|
|
377
|
+
jw ^ qd,
|
|
378
|
+
jw >= 24u
|
|
382
379
|
);
|
|
383
|
-
let
|
|
384
|
-
|
|
380
|
+
let uH = (sW >> 5u) & 0x7u;
|
|
381
|
+
tl |= uH << uM;
|
|
385
382
|
}
|
|
386
383
|
|
|
387
|
-
|
|
388
|
-
ep = (
|
|
389
|
-
let
|
|
390
|
-
var
|
|
391
|
-
while (
|
|
392
|
-
let
|
|
393
|
-
|
|
384
|
+
kQ = bitcast<u32>(fC.x);
|
|
385
|
+
ep = (tl & 0xff000000u) | rG;
|
|
386
|
+
let oH = bitcast<u32>(fC.y);
|
|
387
|
+
var oI = tl & 0x00ffffffu;
|
|
388
|
+
while (oI != 0u) {
|
|
389
|
+
let nI = nO(oI);
|
|
390
|
+
oI &= ~(1u << nI);
|
|
394
391
|
let bh = 1;
|
|
395
392
|
let primitiveOffset = bo + blasOffset
|
|
396
|
-
+ i32(
|
|
393
|
+
+ i32(oH + nI);
|
|
397
394
|
${intersectTriangles}
|
|
398
395
|
}
|
|
399
396
|
}
|
|
400
397
|
|
|
401
398
|
if ((ep & 0xff000000u) != 0u) { continue; }
|
|
402
|
-
if (
|
|
403
|
-
let
|
|
404
|
-
|
|
405
|
-
ep =
|
|
406
|
-
|
|
399
|
+
if (pe >= 0) {
|
|
400
|
+
let qe = sd[pe];
|
|
401
|
+
kQ = qe.x;
|
|
402
|
+
ep = qe.y;
|
|
403
|
+
pe--;
|
|
407
404
|
}
|
|
408
405
|
else { break; }
|
|
409
406
|
}
|
|
410
407
|
}
|
|
411
408
|
` : ''}
|
|
412
409
|
|
|
413
|
-
var
|
|
410
|
+
var gp: array<i32, BLAS_STACK_SIZE>;
|
|
414
411
|
var dR = -1;
|
|
415
|
-
if (
|
|
412
|
+
if (gN != 3u) {
|
|
416
413
|
dR = 0;
|
|
417
414
|
|
|
418
|
-
|
|
415
|
+
gp[0] = uN;
|
|
419
416
|
}
|
|
420
417
|
|
|
421
418
|
while (dR >= 0) {
|
|
422
419
|
|
|
423
|
-
let node =
|
|
420
|
+
let node = gp[dR];
|
|
424
421
|
dR--;
|
|
425
422
|
var bh = 0;
|
|
426
423
|
var primitiveOffset = 0;
|
|
427
424
|
|
|
428
425
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
429
|
-
if (
|
|
426
|
+
if (gN == 2u) {
|
|
430
427
|
let i = node + bo;
|
|
431
|
-
let
|
|
432
|
-
let
|
|
433
|
-
let
|
|
434
|
-
let
|
|
435
|
-
bh = i32(bitcast<u32>(
|
|
428
|
+
let uR = bvhBuffer[i];
|
|
429
|
+
let uS = bvhBuffer[i + 1];
|
|
430
|
+
let uT = bvhBuffer[i + 2];
|
|
431
|
+
let uU = bvhBuffer[i + 3];
|
|
432
|
+
bh = i32(bitcast<u32>(uT.w));
|
|
436
433
|
if (bh > 0) {
|
|
437
434
|
primitiveOffset = bo + blasOffset
|
|
438
|
-
+ i32(bitcast<u32>(
|
|
435
|
+
+ i32(bitcast<u32>(uU.w));
|
|
439
436
|
}
|
|
440
437
|
else {
|
|
441
|
-
let left = blasOffset + i32(bitcast<u32>(
|
|
442
|
-
let right = blasOffset + i32(bitcast<u32>(
|
|
443
|
-
let
|
|
444
|
-
o,
|
|
438
|
+
let left = blasOffset + i32(bitcast<u32>(uR.w) * 4u);
|
|
439
|
+
let right = blasOffset + i32(bitcast<u32>(uS.w) * 4u);
|
|
440
|
+
let om = cM(
|
|
441
|
+
o, uR.xyz, uS.xyz, gx, tMax
|
|
445
442
|
);
|
|
446
|
-
let
|
|
447
|
-
o,
|
|
443
|
+
let ng = cM(
|
|
444
|
+
o, uT.xyz, uU.xyz, gx, tMax
|
|
448
445
|
);
|
|
449
|
-
if (
|
|
450
|
-
if (
|
|
451
|
-
dR++;
|
|
446
|
+
if (om > ng) {
|
|
447
|
+
if (om > 0.0) {
|
|
448
|
+
dR++; gp[dR] = left;
|
|
452
449
|
}
|
|
453
|
-
if (
|
|
454
|
-
dR++;
|
|
450
|
+
if (ng > 0.0) {
|
|
451
|
+
dR++; gp[dR] = right;
|
|
455
452
|
}
|
|
456
453
|
}
|
|
457
454
|
else {
|
|
458
|
-
if (
|
|
459
|
-
dR++;
|
|
455
|
+
if (ng > 0.0) {
|
|
456
|
+
dR++; gp[dR] = right;
|
|
460
457
|
}
|
|
461
|
-
if (
|
|
462
|
-
dR++;
|
|
458
|
+
if (om > 0.0) {
|
|
459
|
+
dR++; gp[dR] = left;
|
|
463
460
|
}
|
|
464
461
|
}
|
|
465
462
|
}
|
|
466
463
|
}
|
|
467
464
|
` : ''}
|
|
468
465
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
469
|
-
if (
|
|
470
|
-
let
|
|
471
|
-
if ((
|
|
472
|
-
bh = i32((
|
|
466
|
+
if (gN == 1u) {
|
|
467
|
+
let hS = bitcast<u32>(node);
|
|
468
|
+
if ((hS & 0x80000000u) != 0u) {
|
|
469
|
+
bh = i32((hS >> 23u) & 0xffu);
|
|
473
470
|
primitiveOffset = bo + blasOffset
|
|
474
|
-
+ i32(
|
|
471
|
+
+ i32(hS & 0x007fffffu);
|
|
475
472
|
}
|
|
476
473
|
else {
|
|
477
474
|
let i = node + bo;
|
|
478
|
-
let
|
|
479
|
-
let
|
|
480
|
-
let
|
|
481
|
-
let
|
|
482
|
-
let nodeMin =
|
|
483
|
-
let ec = vec3f(
|
|
484
|
-
let
|
|
485
|
-
bitcast<u32>(
|
|
486
|
-
bitcast<u32>(
|
|
475
|
+
let ub = bvhBuffer[i];
|
|
476
|
+
let rf = bvhBuffer[i + 1];
|
|
477
|
+
let rh = bvhBuffer[i + 2];
|
|
478
|
+
let ri = bvhBuffer[i + 3];
|
|
479
|
+
let nodeMin = ub.xyz;
|
|
480
|
+
let ec = vec3f(ub.w, rf.x, rf.y);
|
|
481
|
+
let lV = array<u32, 4>(
|
|
482
|
+
bitcast<u32>(rf.z), bitcast<u32>(rf.w),
|
|
483
|
+
bitcast<u32>(rh.x), bitcast<u32>(rh.y)
|
|
487
484
|
);
|
|
488
|
-
let
|
|
489
|
-
let
|
|
490
|
-
let
|
|
491
|
-
let
|
|
492
|
-
let
|
|
493
|
-
let
|
|
494
|
-
let tx0 = (nodeMin.x +
|
|
495
|
-
let tx1 = (nodeMin.x +
|
|
496
|
-
let ty0 = (nodeMin.y +
|
|
497
|
-
let ty1 = (nodeMin.y +
|
|
498
|
-
let tz0 = (nodeMin.z +
|
|
499
|
-
let tz1 = (nodeMin.z +
|
|
500
|
-
let bJ = eV(
|
|
501
|
-
let
|
|
485
|
+
let ro = unpack4x8unorm(bitcast<u32>(rh.z));
|
|
486
|
+
let rp = unpack4x8unorm(bitcast<u32>(rh.w));
|
|
487
|
+
let rq = unpack4x8unorm(bitcast<u32>(ri.x));
|
|
488
|
+
let rl = unpack4x8unorm(bitcast<u32>(ri.y));
|
|
489
|
+
let rm = unpack4x8unorm(bitcast<u32>(ri.z));
|
|
490
|
+
let rn = unpack4x8unorm(bitcast<u32>(ri.w));
|
|
491
|
+
let tx0 = (nodeMin.x + ro * ec.x - o.x) * gx.x;
|
|
492
|
+
let tx1 = (nodeMin.x + rl * ec.x - o.x) * gx.x;
|
|
493
|
+
let ty0 = (nodeMin.y + rp * ec.y - o.y) * gx.y;
|
|
494
|
+
let ty1 = (nodeMin.y + rm * ec.y - o.y) * gx.y;
|
|
495
|
+
let tz0 = (nodeMin.z + rq * ec.z - o.z) * gx.z;
|
|
496
|
+
let tz1 = (nodeMin.z + rn * ec.z - o.z) * gx.z;
|
|
497
|
+
let bJ = eV(gx, o);
|
|
498
|
+
let mB = max(
|
|
502
499
|
max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
|
|
503
500
|
(min(tz0, tz1) - vec4f(bJ.z))
|
|
504
501
|
);
|
|
505
|
-
let
|
|
502
|
+
let rM = min(
|
|
506
503
|
min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
|
|
507
504
|
(max(tz0, tz1) + vec4f(bJ.z))
|
|
508
505
|
);
|
|
509
|
-
var distance = select(
|
|
506
|
+
var distance = select(rM, mB, mB > vec4f(0.0));
|
|
510
507
|
distance = select(
|
|
511
508
|
distance,
|
|
512
509
|
vec4f(-1.0),
|
|
513
|
-
|
|
510
|
+
mB > min(rM, vec4f(tMax))
|
|
514
511
|
);
|
|
515
512
|
var fa = array<f32, 4>(
|
|
516
513
|
distance.x,
|
|
@@ -525,7 +522,7 @@ var dX = -1.0;
|
|
|
525
522
|
var el = -1;
|
|
526
523
|
for (var child = 0; child < 4; child++) {
|
|
527
524
|
if (
|
|
528
|
-
|
|
525
|
+
lV[child] != 0u &&
|
|
529
526
|
fa[child] > dX
|
|
530
527
|
) {
|
|
531
528
|
dX = fa[child];
|
|
@@ -533,13 +530,13 @@ el = child;
|
|
|
533
530
|
}
|
|
534
531
|
}
|
|
535
532
|
if (el >= 0 && dX > 0.0) {
|
|
536
|
-
let
|
|
537
|
-
var
|
|
538
|
-
if ((
|
|
539
|
-
|
|
533
|
+
let nl = lV[el];
|
|
534
|
+
var jD = bitcast<i32>(nl);
|
|
535
|
+
if ((nl & 0x80000000u) == 0u) {
|
|
536
|
+
jD += blasOffset;
|
|
540
537
|
}
|
|
541
538
|
dR++;
|
|
542
|
-
|
|
539
|
+
gp[dR] = jD;
|
|
543
540
|
fa[el] = -1.0;
|
|
544
541
|
}
|
|
545
542
|
}
|
|
@@ -547,7 +544,7 @@ fa[el] = -1.0;
|
|
|
547
544
|
}
|
|
548
545
|
` : ''}
|
|
549
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
550
|
-
if (
|
|
547
|
+
if (gN == 0u) {
|
|
551
548
|
let i = node + bo;
|
|
552
549
|
let r1 = bvhBuffer[i];
|
|
553
550
|
let bb = bitcast<i32>(r1.w);
|
|
@@ -559,34 +556,34 @@ let d0 = cM(
|
|
|
559
556
|
o,
|
|
560
557
|
bvhBuffer[left + bo].xyz,
|
|
561
558
|
bvhBuffer[left + 1 + bo].xyz,
|
|
562
|
-
|
|
559
|
+
gx,
|
|
563
560
|
tMax
|
|
564
561
|
);
|
|
565
562
|
let d1 = cM(
|
|
566
563
|
o,
|
|
567
564
|
bvhBuffer[right + bo].xyz,
|
|
568
565
|
bvhBuffer[right + 1 + bo].xyz,
|
|
569
|
-
|
|
566
|
+
gx,
|
|
570
567
|
tMax
|
|
571
568
|
);
|
|
572
569
|
|
|
573
570
|
if (d0 > d1) {
|
|
574
571
|
if (d0 > 0.0) {
|
|
575
|
-
dR++;
|
|
572
|
+
dR++; gp[dR] = left;
|
|
576
573
|
|
|
577
574
|
}
|
|
578
575
|
if (d1 > 0.0) {
|
|
579
|
-
dR++;
|
|
576
|
+
dR++; gp[dR] = right;
|
|
580
577
|
|
|
581
578
|
}
|
|
582
579
|
}
|
|
583
580
|
else {
|
|
584
581
|
if (d1 > 0.0) {
|
|
585
|
-
dR++;
|
|
582
|
+
dR++; gp[dR] = right;
|
|
586
583
|
|
|
587
584
|
}
|
|
588
585
|
if (d0 > 0.0) {
|
|
589
|
-
dR++;
|
|
586
|
+
dR++; gp[dR] = left;
|
|
590
587
|
|
|
591
588
|
}
|
|
592
589
|
}
|
|
@@ -642,7 +639,7 @@ return t2;
|
|
|
642
639
|
return INF;
|
|
643
640
|
}
|
|
644
641
|
|
|
645
|
-
fn
|
|
642
|
+
fn mU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
646
643
|
let dt: f32 = dot(r.d, n);
|
|
647
644
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
648
645
|
|
|
@@ -664,12 +661,12 @@ return INF;
|
|
|
664
661
|
fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
|
|
665
662
|
let aj = distance(origin, center);
|
|
666
663
|
if (aj <= radius) { return INV4PI; }
|
|
667
|
-
let
|
|
668
|
-
let cosThetaMax = sqrt(max(0.0, 1.0 -
|
|
664
|
+
let jp = min(1.0, radius * radius / (aj * aj));
|
|
665
|
+
let cosThetaMax = sqrt(max(0.0, 1.0 - jp));
|
|
669
666
|
return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
670
667
|
}
|
|
671
668
|
|
|
672
|
-
fn
|
|
669
|
+
fn mo(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
673
670
|
|
|
674
671
|
|
|
675
672
|
var d: f32 = INF;
|
|
@@ -691,7 +688,7 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
691
688
|
return INF;
|
|
692
689
|
}
|
|
693
690
|
|
|
694
|
-
d =
|
|
691
|
+
d = mU(pos, u, v, normal, r);
|
|
695
692
|
if (d < 0.0) {
|
|
696
693
|
d = INF;
|
|
697
694
|
}
|
|
@@ -714,9 +711,9 @@ d = INF;
|
|
|
714
711
|
|
|
715
712
|
else if (dO == SPHERE_LIGHT) {
|
|
716
713
|
if (light.radiusOrSpread <= 0.0) {
|
|
717
|
-
let
|
|
718
|
-
let projection = dot(
|
|
719
|
-
let ba =
|
|
714
|
+
let kh = light.position - r.o;
|
|
715
|
+
let projection = dot(kh, r.d);
|
|
716
|
+
let ba = kh - projection * r.d;
|
|
720
717
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
721
718
|
return INF;
|
|
722
719
|
}
|
|
@@ -759,9 +756,9 @@ light.radiusOrSpread <= 0.0
|
|
|
759
756
|
|
|
760
757
|
else if (dO == SPOT_LIGHT) {
|
|
761
758
|
if (light.radiusOrSpread <= 0.0) {
|
|
762
|
-
let
|
|
763
|
-
let projection = dot(
|
|
764
|
-
let ba =
|
|
759
|
+
let kh = light.position - r.o;
|
|
760
|
+
let projection = dot(kh, r.d);
|
|
761
|
+
let ba = kh - projection * r.d;
|
|
765
762
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
766
763
|
return INF;
|
|
767
764
|
}
|
|
@@ -777,9 +774,9 @@ d = ht(light.radiusOrSpread, light.position, r);
|
|
|
777
774
|
(*lightSample).isDelta = false;
|
|
778
775
|
}
|
|
779
776
|
if (d != INF) {
|
|
780
|
-
let
|
|
781
|
-
let
|
|
782
|
-
if (
|
|
777
|
+
let uX = r.o + d * r.d;
|
|
778
|
+
let mr = bL(light, normalize(r.o - uX));
|
|
779
|
+
if (mr <= 0.0) { return INF; }
|
|
783
780
|
if (light.radiusOrSpread > 0.0) {
|
|
784
781
|
(*lightSample).direction = r.d;
|
|
785
782
|
(*lightSample).dist = d;
|
|
@@ -788,7 +785,7 @@ r.o + r.d * d - light.position
|
|
|
788
785
|
);
|
|
789
786
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
790
787
|
}
|
|
791
|
-
(*lightSample).emission = light.emission *
|
|
788
|
+
(*lightSample).emission = light.emission * mr * select(
|
|
792
789
|
1.0,
|
|
793
790
|
1.0 / max(d * d, 1e-8),
|
|
794
791
|
light.radiusOrSpread <= 0.0
|
|
@@ -824,44 +821,44 @@ var w20 = m20.y * eZ.z;
|
|
|
824
821
|
var w21 = m21.y * eZ.z;
|
|
825
822
|
var w22 = m22.y * eZ.z;
|
|
826
823
|
|
|
827
|
-
var
|
|
824
|
+
var hg = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
828
825
|
|
|
829
|
-
w00 = w00 /
|
|
830
|
-
w01 = w01 /
|
|
831
|
-
w02 = w02 /
|
|
832
|
-
w10 = w10 /
|
|
833
|
-
w11 = w11 /
|
|
834
|
-
w12 = w12 /
|
|
835
|
-
w20 = w20 /
|
|
836
|
-
w21 = w21 /
|
|
837
|
-
w22 = w22 /
|
|
826
|
+
w00 = w00 / hg;
|
|
827
|
+
w01 = w01 / hg + w00;
|
|
828
|
+
w02 = w02 / hg + w01;
|
|
829
|
+
w10 = w10 / hg + w02;
|
|
830
|
+
w11 = w11 / hg + w10;
|
|
831
|
+
w12 = w12 / hg + w11;
|
|
832
|
+
w20 = w20 / hg + w12;
|
|
833
|
+
w21 = w21 / hg + w20;
|
|
834
|
+
w22 = w22 / hg + w21;
|
|
838
835
|
|
|
839
836
|
let rand = eo(0u);
|
|
840
|
-
var
|
|
837
|
+
var mV: f32;
|
|
841
838
|
if (rand < w00) {
|
|
842
|
-
|
|
839
|
+
mV = m00.x;
|
|
843
840
|
} else if (rand < w01) {
|
|
844
|
-
|
|
841
|
+
mV = m01.x;
|
|
845
842
|
} else if (rand < w02) {
|
|
846
|
-
|
|
843
|
+
mV = m02.x;
|
|
847
844
|
} else if (rand < w10) {
|
|
848
|
-
|
|
845
|
+
mV = m10.x;
|
|
849
846
|
} else if (rand < w11) {
|
|
850
|
-
|
|
847
|
+
mV = m11.x;
|
|
851
848
|
} else if (rand < w12) {
|
|
852
|
-
|
|
849
|
+
mV = m12.x;
|
|
853
850
|
} else if (rand < w20) {
|
|
854
|
-
|
|
851
|
+
mV = m20.x;
|
|
855
852
|
} else if (rand < w21) {
|
|
856
|
-
|
|
853
|
+
mV = m21.x;
|
|
857
854
|
} else {
|
|
858
|
-
|
|
855
|
+
mV = m22.x;
|
|
859
856
|
}
|
|
860
|
-
return i32(
|
|
857
|
+
return i32(mV);
|
|
861
858
|
}
|
|
862
859
|
|
|
863
|
-
fn
|
|
864
|
-
|
|
860
|
+
fn lM(
|
|
861
|
+
oR: i32,
|
|
865
862
|
index: vec3i,
|
|
866
863
|
eZ: vec3f
|
|
867
864
|
) -> i32 {
|
|
@@ -871,31 +868,31 @@ let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisot
|
|
|
871
868
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
872
869
|
return fj(m0, m1, m2, eZ);
|
|
873
870
|
}
|
|
874
|
-
return
|
|
871
|
+
return oR;
|
|
875
872
|
}
|
|
876
873
|
|
|
877
874
|
|
|
878
875
|
|
|
879
876
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
880
|
-
fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f,
|
|
881
|
-
let determinant =
|
|
877
|
+
fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f, nS: vec2f, nT: vec2f, input: vec4f) -> mat2x3f {
|
|
878
|
+
let determinant = nS.x * nT.y - nS.y * nT.x;
|
|
882
879
|
var t = input.xyz;
|
|
883
880
|
var b = vec3f(0.0);
|
|
884
881
|
|
|
885
882
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
886
883
|
if (abs(determinant) > 1e-12) {
|
|
887
|
-
let dt = (dp1 *
|
|
888
|
-
let db = (dp2 *
|
|
884
|
+
let dt = (dp1 * nT.y - dp2 * nS.y) / determinant;
|
|
885
|
+
let db = (dp2 * nS.x - dp1 * nT.x) / determinant;
|
|
889
886
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
890
887
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
891
888
|
}
|
|
892
889
|
t -= normal * dot(normal, t);
|
|
893
890
|
if (dot(t, t) < 1e-8) {
|
|
894
|
-
let
|
|
895
|
-
let dW = -1.0 / (
|
|
891
|
+
let ie = select(-1.0, 1.0, normal.z >= 0.0);
|
|
892
|
+
let dW = -1.0 / (ie + normal.z);
|
|
896
893
|
let xy = normal.x * normal.y * dW;
|
|
897
|
-
t = vec3f(1.0 +
|
|
898
|
-
b = vec3f(xy,
|
|
894
|
+
t = vec3f(1.0 + ie * normal.x * normal.x * dW, ie * xy, -ie * normal.x);
|
|
895
|
+
b = vec3f(xy, ie + normal.y * normal.y * dW, -normal.y);
|
|
899
896
|
}
|
|
900
897
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
901
898
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
@@ -918,22 +915,22 @@ let uvProjection = i32(material.uvProjection);
|
|
|
918
915
|
let i0 = index.x;
|
|
919
916
|
let i1 = index.y;
|
|
920
917
|
let i2 = index.z;
|
|
921
|
-
let
|
|
918
|
+
let oP = uvProjection == ${uvProjectionConstants.spherical};
|
|
922
919
|
|
|
923
920
|
var normal: vec3f = (*si).normal;
|
|
924
|
-
var
|
|
921
|
+
var gV: vec3f;
|
|
925
922
|
var n0 = vec3f(0.0);
|
|
926
923
|
var n1 = vec3f(0.0);
|
|
927
924
|
var n2 = vec3f(0.0);
|
|
928
925
|
|
|
929
926
|
|
|
930
|
-
if (!bU ||
|
|
927
|
+
if (!bU || oP) {
|
|
931
928
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
932
929
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
933
930
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
934
|
-
|
|
931
|
+
gV = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
|
|
935
932
|
if (!bU) {
|
|
936
|
-
normal =
|
|
933
|
+
normal = gV;
|
|
937
934
|
}
|
|
938
935
|
}
|
|
939
936
|
|
|
@@ -968,7 +965,7 @@ if (fq >= 0) {
|
|
|
968
965
|
(*si).materialIndex = fq;
|
|
969
966
|
}
|
|
970
967
|
else {
|
|
971
|
-
(*si).materialIndex =
|
|
968
|
+
(*si).materialIndex = lM(
|
|
972
969
|
(*si).materialIndex,
|
|
973
970
|
index,
|
|
974
971
|
eZ
|
|
@@ -977,7 +974,7 @@ eZ
|
|
|
977
974
|
|
|
978
975
|
if (uvProjection > 0) {
|
|
979
976
|
|
|
980
|
-
uv =
|
|
977
|
+
uv = gC(uvProjection, (*si).position, select(normal, gV, oP));
|
|
981
978
|
cX = uv;
|
|
982
979
|
}
|
|
983
980
|
|
|
@@ -1015,21 +1012,21 @@ fU = eD(normal, dp1, dp2, a-c, b-c, select(aU, vec4f(0.0), aU.w == 0.0));
|
|
|
1015
1012
|
(*si).directionBitangent = fU[1];
|
|
1016
1013
|
${hasCoatNormals ? /* wgsl */ `
|
|
1017
1014
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1018
|
-
let
|
|
1019
|
-
var
|
|
1020
|
-
if (USE_UV1 && mapInfo[
|
|
1015
|
+
let ku = i32(directionMaterial.coatNormalMapIndex);
|
|
1016
|
+
var lW = eP;
|
|
1017
|
+
if (USE_UV1 && mapInfo[ku + NUM_MAPS * 2].x > 0.5) {
|
|
1021
1018
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1022
1019
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1023
1020
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1024
|
-
|
|
1021
|
+
lW = eD(normal, dp1, dp2, a-c, b-c,
|
|
1025
1022
|
select(aU, vec4f(0.0), aU.w == 0.0));
|
|
1026
1023
|
}
|
|
1027
1024
|
|
|
1028
1025
|
|
|
1029
|
-
let decoded = sampleMap(
|
|
1026
|
+
let decoded = sampleMap(ku, getMapUvSet(ku, uv,
|
|
1030
1027
|
select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1031
|
-
let mapped =
|
|
1032
|
-
+
|
|
1028
|
+
let mapped = lW[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1029
|
+
+ lW[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1033
1030
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1034
1031
|
}
|
|
1035
1032
|
` : ''}
|
|
@@ -1044,14 +1041,14 @@ if (!bU) {
|
|
|
1044
1041
|
|
|
1045
1042
|
|
|
1046
1043
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1047
|
-
let
|
|
1044
|
+
let kf = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
|
|
1048
1045
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1049
1046
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1050
1047
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1051
1048
|
var h = a * eZ.x * (eZ.x - 1.0)
|
|
1052
1049
|
+ (a + b + c) * eZ.x * eZ.y
|
|
1053
1050
|
+ b * eZ.y * (eZ.y - 1.0);
|
|
1054
|
-
if (dot(
|
|
1051
|
+
if (dot(kf, geometricNormal) > 0.0) {
|
|
1055
1052
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1056
1053
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1057
1054
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1069,17 +1066,17 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1069
1066
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1070
1067
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1071
1068
|
}
|
|
1072
|
-
(*si).shadowOffset =
|
|
1069
|
+
(*si).shadowOffset = kf * h;
|
|
1073
1070
|
}
|
|
1074
1071
|
(*si).uv = uv;
|
|
1075
1072
|
(*si).uv1 = cX;
|
|
1076
1073
|
if (USE_NORMAL_MAPS) {
|
|
1077
1074
|
let dp1 = tri.p0 - tri.p2;
|
|
1078
1075
|
let dp2 = tri.p1 - tri.p2;
|
|
1079
|
-
let
|
|
1080
|
-
let
|
|
1081
|
-
(*si).normal =
|
|
1082
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1076
|
+
let nS = uv0 - uv2;
|
|
1077
|
+
let nT = uv1 - uv2;
|
|
1078
|
+
(*si).normal = ob(
|
|
1079
|
+
(*si).materialIndex, uv, normal, dp1, dp2, nS, nT
|
|
1083
1080
|
);
|
|
1084
1081
|
}
|
|
1085
1082
|
}
|
|
@@ -1093,7 +1090,7 @@ barycentric: vec3f,
|
|
|
1093
1090
|
|
|
1094
1091
|
|
|
1095
1092
|
|
|
1096
|
-
fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32,
|
|
1093
|
+
fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32, gL: vec3f, tMax: f32) -> eB {
|
|
1097
1094
|
var ti: eB;
|
|
1098
1095
|
|
|
1099
1096
|
|
|
@@ -1114,9 +1111,9 @@ p2t = p2t.zxy;
|
|
|
1114
1111
|
|
|
1115
1112
|
|
|
1116
1113
|
|
|
1117
|
-
p0t = vec3f(p0t.xy +
|
|
1118
|
-
p1t = vec3f(p1t.xy +
|
|
1119
|
-
p2t = vec3f(p2t.xy +
|
|
1114
|
+
p0t = vec3f(p0t.xy + gL.xy * p0t.z, p0t.z);
|
|
1115
|
+
p1t = vec3f(p1t.xy + gL.xy * p1t.z, p1t.z);
|
|
1116
|
+
p2t = vec3f(p2t.xy + gL.xy * p2t.z, p2t.z);
|
|
1120
1117
|
|
|
1121
1118
|
|
|
1122
1119
|
var e = vec3f(
|
|
@@ -1128,9 +1125,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1128
1125
|
if (DEPTH_QUERY_MODE) {
|
|
1129
1126
|
|
|
1130
1127
|
|
|
1131
|
-
let
|
|
1128
|
+
let rt = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1132
1129
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1133
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1130
|
+
e = select(e, vec3f(0.0), abs(e) <= rt * 1e-6);
|
|
1134
1131
|
}
|
|
1135
1132
|
|
|
1136
1133
|
|
|
@@ -1141,19 +1138,19 @@ return ti;
|
|
|
1141
1138
|
let det = e.x + e.y + e.z;
|
|
1142
1139
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1143
1140
|
|
|
1144
|
-
p0t.z *=
|
|
1145
|
-
p1t.z *=
|
|
1146
|
-
p2t.z *=
|
|
1147
|
-
let
|
|
1141
|
+
p0t.z *= gL.z;
|
|
1142
|
+
p1t.z *= gL.z;
|
|
1143
|
+
p2t.z *= gL.z;
|
|
1144
|
+
let rd = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1148
1145
|
|
|
1149
1146
|
|
|
1150
|
-
if (abs(
|
|
1147
|
+
if (abs(rd) > abs(tMax * det)) {
|
|
1151
1148
|
return ti;
|
|
1152
1149
|
}
|
|
1153
1150
|
|
|
1154
|
-
let
|
|
1155
|
-
ti.t =
|
|
1156
|
-
ti.barycentric = e *
|
|
1151
|
+
let sm = 1. / det;
|
|
1152
|
+
ti.t = rd * sm;
|
|
1153
|
+
ti.barycentric = e * sm;
|
|
1157
1154
|
|
|
1158
1155
|
return ti;
|
|
1159
1156
|
}
|
|
@@ -1168,21 +1165,21 @@ if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
|
1168
1165
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1169
1166
|
}
|
|
1170
1167
|
|
|
1171
|
-
fn eV(
|
|
1168
|
+
fn eV(gx: vec3f, o: vec3f) -> vec3f {
|
|
1172
1169
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1173
|
-
return abs(
|
|
1170
|
+
return abs(gx) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1174
1171
|
}
|
|
1175
1172
|
|
|
1176
1173
|
|
|
1177
1174
|
|
|
1178
|
-
fn cM(o: vec3f,
|
|
1179
|
-
let
|
|
1180
|
-
let
|
|
1181
|
-
let bJ = eV(
|
|
1182
|
-
let
|
|
1183
|
-
let
|
|
1184
|
-
let t0 = max(
|
|
1185
|
-
let t1 = min(
|
|
1175
|
+
fn cM(o: vec3f, vD: vec3f, vC: vec3f, gx: vec3f, tMax: f32) -> f32 {
|
|
1176
|
+
let uK = (vD - o) * gx;
|
|
1177
|
+
let uL = (vC - o) * gx;
|
|
1178
|
+
let bJ = eV(gx, o);
|
|
1179
|
+
let mB = min(uK, uL) - bJ;
|
|
1180
|
+
let rM = max(uK, uL) + bJ;
|
|
1181
|
+
let t0 = max(mB.x, max(mB.y, mB.z));
|
|
1182
|
+
let t1 = min(rM.x, min(rM.y, rM.z));
|
|
1186
1183
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1187
1184
|
}
|
|
1188
1185
|
|
|
@@ -1190,7 +1187,7 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1190
1187
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1191
1188
|
}
|
|
1192
1189
|
|
|
1193
|
-
fn
|
|
1190
|
+
fn mj(d: vec3f, ey: i32) -> vec3f {
|
|
1194
1191
|
|
|
1195
1192
|
|
|
1196
1193
|
if (ey == 0) {
|
|
@@ -1202,9 +1199,9 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
|
1202
1199
|
}
|
|
1203
1200
|
}
|
|
1204
1201
|
|
|
1205
|
-
fn
|
|
1202
|
+
fn lX(
|
|
1206
1203
|
si: ptr<function, ad>,
|
|
1207
|
-
|
|
1204
|
+
lp: fu,
|
|
1208
1205
|
aB: vec3f,
|
|
1209
1206
|
hs: vec3i,
|
|
1210
1207
|
bU: bool,
|
|
@@ -1224,7 +1221,7 @@ bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
|
|
|
1224
1221
|
|
|
1225
1222
|
hp(
|
|
1226
1223
|
si,
|
|
1227
|
-
|
|
1224
|
+
lp,
|
|
1228
1225
|
aB,
|
|
1229
1226
|
hs,
|
|
1230
1227
|
bU,
|
|
@@ -1272,7 +1269,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
|
1272
1269
|
|
|
1273
1270
|
|
|
1274
1271
|
|
|
1275
|
-
fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool,
|
|
1272
|
+
fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lq: bool) {
|
|
1276
1273
|
|
|
1277
1274
|
(*si).hit = false;
|
|
1278
1275
|
|
|
@@ -1282,24 +1279,24 @@ return;
|
|
|
1282
1279
|
|
|
1283
1280
|
var tMax = RAY_MAX_DISTANCE;
|
|
1284
1281
|
var ey: i32;
|
|
1285
|
-
var
|
|
1282
|
+
var gL: vec3f;
|
|
1286
1283
|
|
|
1287
1284
|
var hs: vec3i;
|
|
1288
|
-
var
|
|
1285
|
+
var lp: fu;
|
|
1289
1286
|
var ao: i32;
|
|
1290
|
-
var
|
|
1287
|
+
var hK: i32 = (*si).triangleIndex;
|
|
1291
1288
|
|
|
1292
1289
|
${getBVHTraverseCode(`
|
|
1293
1290
|
(*si).triangleIndex = triangleIndex;
|
|
1294
|
-
|
|
1291
|
+
lp = tri;
|
|
1295
1292
|
hs = index;
|
|
1296
1293
|
ao = cf;
|
|
1297
1294
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
1298
1295
|
|
|
1299
|
-
if (
|
|
1300
|
-
|
|
1296
|
+
if (qT) {
|
|
1297
|
+
lX(
|
|
1301
1298
|
si,
|
|
1302
|
-
|
|
1299
|
+
lp,
|
|
1303
1300
|
aB,
|
|
1304
1301
|
hs,
|
|
1305
1302
|
bU,
|
|
@@ -1312,7 +1309,7 @@ eU,
|
|
|
1312
1309
|
}
|
|
1313
1310
|
|
|
1314
1311
|
|
|
1315
|
-
fn
|
|
1312
|
+
fn iH(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
|
|
1316
1313
|
(*si).hit = false;
|
|
1317
1314
|
|
|
1318
1315
|
if (rtUniform.isEmpty > 0) {
|
|
@@ -1321,18 +1318,18 @@ return;
|
|
|
1321
1318
|
|
|
1322
1319
|
let bounces = 0;
|
|
1323
1320
|
let doubleSided = true;
|
|
1324
|
-
let
|
|
1321
|
+
let lq = false;
|
|
1325
1322
|
var tMax = maxDistance;
|
|
1326
1323
|
var ey: i32;
|
|
1327
|
-
var
|
|
1324
|
+
var gL: vec3f;
|
|
1328
1325
|
var hs: vec3i;
|
|
1329
|
-
var
|
|
1326
|
+
var lp: fu;
|
|
1330
1327
|
var ao: i32;
|
|
1331
|
-
var
|
|
1328
|
+
var hK: i32 = -1;
|
|
1332
1329
|
|
|
1333
1330
|
${getBVHTraverseCode(`
|
|
1334
1331
|
(*si).triangleIndex = triangleIndex;
|
|
1335
|
-
|
|
1332
|
+
lp = tri;
|
|
1336
1333
|
hs = index;
|
|
1337
1334
|
ao = cf;
|
|
1338
1335
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
@@ -1341,14 +1338,14 @@ continue;
|
|
|
1341
1338
|
}
|
|
1342
1339
|
`)}
|
|
1343
1340
|
|
|
1344
|
-
if (
|
|
1341
|
+
if (qT) {
|
|
1345
1342
|
(*si).instanceIndex = ao;
|
|
1346
1343
|
(*si).normal = eC;
|
|
1347
1344
|
(*si).position = eU;
|
|
1348
1345
|
(*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
1349
1346
|
hp(
|
|
1350
1347
|
si,
|
|
1351
|
-
|
|
1348
|
+
lp,
|
|
1352
1349
|
aB,
|
|
1353
1350
|
hs,
|
|
1354
1351
|
bU,
|
|
@@ -1390,32 +1387,32 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1390
1387
|
}
|
|
1391
1388
|
}
|
|
1392
1389
|
|
|
1393
|
-
fn ex(ray: Ray, lightDistance: f32,
|
|
1390
|
+
fn ex(ray: Ray, lightDistance: f32, jG: i32) -> bool {
|
|
1394
1391
|
if (rtUniform.isEmpty > 0) {
|
|
1395
1392
|
return false;
|
|
1396
1393
|
}
|
|
1397
1394
|
|
|
1398
1395
|
let doubleSided = true;
|
|
1399
|
-
let
|
|
1400
|
-
var tMax =
|
|
1396
|
+
let qg = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1397
|
+
var tMax = qg;
|
|
1401
1398
|
var ey: i32;
|
|
1402
|
-
var
|
|
1399
|
+
var gL: vec3f;
|
|
1403
1400
|
|
|
1404
1401
|
let bounces = 1;
|
|
1405
|
-
var
|
|
1406
|
-
var
|
|
1402
|
+
var lq = false;
|
|
1403
|
+
var hK: i32 = jG;
|
|
1407
1404
|
|
|
1408
1405
|
${getBVHTraverseCode(
|
|
1409
1406
|
/*wgsl */ `
|
|
1410
1407
|
|
|
1411
1408
|
|
|
1412
1409
|
|
|
1413
|
-
var
|
|
1410
|
+
var jn = true;
|
|
1414
1411
|
|
|
1415
|
-
if (
|
|
1412
|
+
if (jn) {
|
|
1416
1413
|
if (HAS_ALPHA) {
|
|
1417
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
1418
|
-
if (!
|
|
1414
|
+
let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
|
|
1415
|
+
if (!nr(
|
|
1419
1416
|
materialIndex,
|
|
1420
1417
|
index,
|
|
1421
1418
|
aB,
|
|
@@ -1423,12 +1420,12 @@ eU,
|
|
|
1423
1420
|
eC
|
|
1424
1421
|
)) {
|
|
1425
1422
|
|
|
1426
|
-
tMax =
|
|
1427
|
-
|
|
1423
|
+
tMax = qg;
|
|
1424
|
+
jn = false;
|
|
1428
1425
|
}
|
|
1429
1426
|
}
|
|
1430
1427
|
}
|
|
1431
|
-
if (
|
|
1428
|
+
if (jn) {
|
|
1432
1429
|
return true;
|
|
1433
1430
|
}
|
|
1434
1431
|
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|