@meimu/mutracer 0.1.4 → 0.1.5
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 +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.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 +1 -1
|
@@ -8,12 +8,12 @@ import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
|
|
|
8
8
|
const displacementWgsl = pdm_displacementWgsl;
|
|
9
9
|
const flatIntersectCode = function () {
|
|
10
10
|
return /* wgsl */ `
|
|
11
|
-
let hit =
|
|
11
|
+
let hit = fM(o, d, tri, ey, gQ, 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
|
eD = normalize(cross(e1, e2));
|
|
16
|
-
let kk = i32(ae(bitcast<i32>(
|
|
16
|
+
let kk = i32(ae(bitcast<i32>(ot.z)).x);
|
|
17
17
|
let iN = materialsBuffer[kk].doubleSided > 0.5;
|
|
18
18
|
if (!doubleSided && !iN && dot(eD, d) > 0.0) {
|
|
19
19
|
eD = vec3f(0.0);
|
|
@@ -22,7 +22,7 @@ continue;
|
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
24
|
rb = true;
|
|
25
|
-
|
|
25
|
+
ow = true;
|
|
26
26
|
eY = o + tMax * d;
|
|
27
27
|
aB = hit.barycentric;
|
|
28
28
|
}
|
|
@@ -44,17 +44,17 @@ matData.displacementStepSize,
|
|
|
44
44
|
i32(matData.displacementUvProjection),
|
|
45
45
|
displacementUvProjectionScale,
|
|
46
46
|
${anyHit ? 'true' : 'false'},
|
|
47
|
-
|
|
47
|
+
lC
|
|
48
48
|
);
|
|
49
49
|
`;
|
|
50
50
|
}
|
|
51
51
|
const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
|
|
52
52
|
return /* wgsl */ `
|
|
53
53
|
|
|
54
|
-
let hScale =
|
|
54
|
+
let hScale = ot.w;
|
|
55
55
|
let tA = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
57
|
+
let materialIndex = i32(ae(bitcast<i32>(ot.z)).x);
|
|
58
58
|
let matData = materialsBuffer[materialIndex];
|
|
59
59
|
let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
60
60
|
let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
@@ -88,7 +88,7 @@ eY = o + tMax * d;
|
|
|
88
88
|
|
|
89
89
|
bU = true;
|
|
90
90
|
rb = true;
|
|
91
|
-
|
|
91
|
+
ow = true;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
@@ -116,16 +116,16 @@ fn kx(value: u32) -> u32 {
|
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn nY(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn ou(
|
|
124
124
|
node: i32,
|
|
125
125
|
tk: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
gE: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
131
|
let i = node + tk;
|
|
@@ -141,9 +141,9 @@ bitcast<f32>(u32(rG + 127) << 23u),
|
|
|
141
141
|
bitcast<f32>(u32(rH + 127) << 23u),
|
|
142
142
|
bitcast<f32>(u32(rI + 127) << 23u)
|
|
143
143
|
);
|
|
144
|
-
let bJ = eZ(
|
|
145
|
-
let eI = (n0.xyz - o) *
|
|
146
|
-
let dc = hJ *
|
|
144
|
+
let bJ = eZ(gE, o);
|
|
145
|
+
let eI = (n0.xyz - o) * gE;
|
|
146
|
+
let dc = hJ * gE;
|
|
147
147
|
let wy = bp(bitcast<u32>(n2.x));
|
|
148
148
|
let wB = bp(bitcast<u32>(n2.y));
|
|
149
149
|
let wC = bp(bitcast<u32>(n2.z));
|
|
@@ -202,8 +202,8 @@ return select(0u, 1u, uK.x)
|
|
|
202
202
|
`;
|
|
203
203
|
function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
|
|
204
204
|
const intersectTriangles = /* wgsl */ `
|
|
205
|
-
let
|
|
206
|
-
let vertexOffset = vec3i(bitcast<i32>(
|
|
205
|
+
let ot = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(ot.y));
|
|
207
207
|
for (var k = 0; k < bh; k++) {
|
|
208
208
|
let triangleIndex = primitiveOffset + k;
|
|
209
209
|
${skipTriangleCode}
|
|
@@ -213,17 +213,17 @@ continue;
|
|
|
213
213
|
|
|
214
214
|
let r3 = bvhBuffer[triangleIndex];
|
|
215
215
|
let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
|
|
216
|
-
var tri =
|
|
216
|
+
var tri = fB(
|
|
217
217
|
attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
|
|
218
218
|
attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
|
|
219
219
|
attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
|
|
220
220
|
);
|
|
221
|
-
var
|
|
221
|
+
var ow = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (ow) {
|
|
227
227
|
${handleHitCode}
|
|
228
228
|
}
|
|
229
229
|
}
|
|
@@ -231,9 +231,9 @@ ${handleHitCode}
|
|
|
231
231
|
return /* wgsl */ `
|
|
232
232
|
var d = ray.d;
|
|
233
233
|
var o = ray.o;
|
|
234
|
-
var
|
|
234
|
+
var lZ: array<i32, TLAS_STACK_SIZE>;
|
|
235
235
|
var jh = -1;
|
|
236
|
-
var
|
|
236
|
+
var gE = fb(d);
|
|
237
237
|
var bU = false;
|
|
238
238
|
var rb = false;
|
|
239
239
|
var eY: vec3f;
|
|
@@ -241,16 +241,16 @@ var eD: vec3f;
|
|
|
241
241
|
var aB: vec3f;
|
|
242
242
|
|
|
243
243
|
|
|
244
|
-
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz,
|
|
244
|
+
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gE, tMax) > 0.0) {
|
|
245
245
|
jh = 0;
|
|
246
|
-
|
|
246
|
+
lZ[0] = 0;
|
|
247
247
|
}
|
|
248
248
|
while (jh >= 0) {
|
|
249
|
-
let sV =
|
|
249
|
+
let sV = lZ[jh];
|
|
250
250
|
jh--;
|
|
251
251
|
o = ray.o;
|
|
252
252
|
d = ray.d;
|
|
253
|
-
|
|
253
|
+
gE = fb(d);
|
|
254
254
|
|
|
255
255
|
let wf = bvhBuffer[sV];
|
|
256
256
|
let eV = bitcast<i32>(wf.w);
|
|
@@ -261,24 +261,24 @@ let d0 = cM(
|
|
|
261
261
|
o,
|
|
262
262
|
bvhBuffer[left].xyz,
|
|
263
263
|
bvhBuffer[left + 1].xyz,
|
|
264
|
-
|
|
264
|
+
gE,
|
|
265
265
|
tMax
|
|
266
266
|
);
|
|
267
267
|
let d1 = cM(
|
|
268
268
|
o,
|
|
269
269
|
bvhBuffer[right].xyz,
|
|
270
270
|
bvhBuffer[right + 1].xyz,
|
|
271
|
-
|
|
271
|
+
gE,
|
|
272
272
|
tMax
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
if (d0 > d1) {
|
|
276
|
-
if (d0 > 0.0) { jh++;
|
|
277
|
-
if (d1 > 0.0) { jh++;
|
|
276
|
+
if (d0 > 0.0) { jh++; lZ[jh] = left; }
|
|
277
|
+
if (d1 > 0.0) { jh++; lZ[jh] = right; }
|
|
278
278
|
}
|
|
279
279
|
else {
|
|
280
|
-
if (d1 > 0.0) { jh++;
|
|
281
|
-
if (d0 > 0.0) { jh++;
|
|
280
|
+
if (d1 > 0.0) { jh++; lZ[jh] = right; }
|
|
281
|
+
if (d0 > 0.0) { jh++; lZ[jh] = left; }
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
else {
|
|
@@ -286,14 +286,14 @@ let qJ = -eV;
|
|
|
286
286
|
|
|
287
287
|
|
|
288
288
|
for (
|
|
289
|
-
var
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
var mw = qJ - 1;
|
|
290
|
+
mw >= 0;
|
|
291
|
+
mw--
|
|
292
292
|
) {
|
|
293
|
-
let pI = bvhBuffer[sV + 2 +
|
|
293
|
+
let pI = bvhBuffer[sV + 2 + mw];
|
|
294
294
|
let cf = bitcast<i32>(pI.x);
|
|
295
295
|
let uU = bitcast<i32>(pI.y);
|
|
296
|
-
let
|
|
296
|
+
let ot = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
297
297
|
let w2l = mat4x4<f32>(
|
|
298
298
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
299
299
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
@@ -302,17 +302,17 @@ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
|
302
302
|
);
|
|
303
303
|
o = (w2l * vec4f(ray.o, 1.0)).xyz;
|
|
304
304
|
d = (w2l * vec4f(ray.d, 0.0)).xyz;
|
|
305
|
-
|
|
305
|
+
gE = fb(d);
|
|
306
306
|
ey = maxDimension(abs(d));
|
|
307
|
-
|
|
307
|
+
gQ = mu(d, ey);
|
|
308
308
|
|
|
309
|
-
let
|
|
310
|
-
let
|
|
311
|
-
let blasOffset = i32(
|
|
309
|
+
let fK = bitcast<u32>(ot.x);
|
|
310
|
+
let gS = fK >> 30u;
|
|
311
|
+
let blasOffset = i32(fK & 0x3fffffffu);
|
|
312
312
|
let bo = rtUniform.blasOffset;
|
|
313
313
|
|
|
314
314
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
315
|
-
if (
|
|
315
|
+
if (gS == 3u) {
|
|
316
316
|
|
|
317
317
|
|
|
318
318
|
|
|
@@ -345,19 +345,19 @@ sm[pn] = vec2u(kZ, ep);
|
|
|
345
345
|
}
|
|
346
346
|
|
|
347
347
|
let slot = (qh - 24u) ^ ql;
|
|
348
|
-
let
|
|
349
|
-
let relativeIndex = countOneBits(internalMask &
|
|
348
|
+
let nr = (1u << slot) - 1u;
|
|
349
|
+
let relativeIndex = countOneBits(internalMask & nr);
|
|
350
350
|
let sk = kZ + relativeIndex;
|
|
351
351
|
let node = blasOffset + i32(sk * 5u);
|
|
352
352
|
let jA = bvhBuffer[node + bo];
|
|
353
|
-
let ue =
|
|
354
|
-
node, bo, jA, o,
|
|
353
|
+
let ue = ou(
|
|
354
|
+
node, bo, jA, o, gE, tMax
|
|
355
355
|
);
|
|
356
356
|
|
|
357
357
|
|
|
358
358
|
ep = 0u;
|
|
359
359
|
if (ue != 0u) {
|
|
360
|
-
let
|
|
360
|
+
let fG = bvhBuffer[node + bo + 1];
|
|
361
361
|
let rO = bitcast<u32>(jA.w) >> 24u;
|
|
362
362
|
var tv = 0u;
|
|
363
363
|
var kg = ue;
|
|
@@ -365,8 +365,8 @@ while (kg != 0u) {
|
|
|
365
365
|
let rC = kx(kg);
|
|
366
366
|
kg &= ~(1u << rC);
|
|
367
367
|
let sE = select(
|
|
368
|
-
bitcast<u32>(
|
|
369
|
-
bitcast<u32>(
|
|
368
|
+
bitcast<u32>(fG.z),
|
|
369
|
+
bitcast<u32>(fG.w),
|
|
370
370
|
rC >= 4u
|
|
371
371
|
);
|
|
372
372
|
let td =
|
|
@@ -381,16 +381,16 @@ let uO = (td >> 5u) & 0x7u;
|
|
|
381
381
|
tv |= uO << uT;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
kZ = bitcast<u32>(
|
|
384
|
+
kZ = bitcast<u32>(fG.x);
|
|
385
385
|
ep = (tv & 0xff000000u) | rO;
|
|
386
|
-
let
|
|
387
|
-
var
|
|
388
|
-
while (
|
|
389
|
-
let
|
|
390
|
-
|
|
386
|
+
let oP = bitcast<u32>(fG.y);
|
|
387
|
+
var oQ = tv & 0x00ffffffu;
|
|
388
|
+
while (oQ != 0u) {
|
|
389
|
+
let nS = nY(oQ);
|
|
390
|
+
oQ &= ~(1u << nS);
|
|
391
391
|
let bh = 1;
|
|
392
392
|
let primitiveOffset = bo + blasOffset
|
|
393
|
-
+ i32(
|
|
393
|
+
+ i32(oP + nS);
|
|
394
394
|
${intersectTriangles}
|
|
395
395
|
}
|
|
396
396
|
}
|
|
@@ -407,23 +407,23 @@ else { break; }
|
|
|
407
407
|
}
|
|
408
408
|
` : ''}
|
|
409
409
|
|
|
410
|
-
var
|
|
410
|
+
var gu: array<i32, BLAS_STACK_SIZE>;
|
|
411
411
|
var dS = -1;
|
|
412
|
-
if (
|
|
412
|
+
if (gS != 3u) {
|
|
413
413
|
dS = 0;
|
|
414
414
|
|
|
415
|
-
|
|
415
|
+
gu[0] = uU;
|
|
416
416
|
}
|
|
417
417
|
|
|
418
418
|
while (dS >= 0) {
|
|
419
419
|
|
|
420
|
-
let node =
|
|
420
|
+
let node = gu[dS];
|
|
421
421
|
dS--;
|
|
422
422
|
var bh = 0;
|
|
423
423
|
var primitiveOffset = 0;
|
|
424
424
|
|
|
425
425
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
426
|
-
if (
|
|
426
|
+
if (gS == 2u) {
|
|
427
427
|
let i = node + bo;
|
|
428
428
|
let uY = bvhBuffer[i];
|
|
429
429
|
let uZ = bvhBuffer[i + 1];
|
|
@@ -437,33 +437,33 @@ primitiveOffset = bo + blasOffset
|
|
|
437
437
|
else {
|
|
438
438
|
let left = blasOffset + i32(bitcast<u32>(uY.w) * 4u);
|
|
439
439
|
let right = blasOffset + i32(bitcast<u32>(uZ.w) * 4u);
|
|
440
|
-
let
|
|
441
|
-
o, uY.xyz, uZ.xyz,
|
|
440
|
+
let ox = cM(
|
|
441
|
+
o, uY.xyz, uZ.xyz, gE, tMax
|
|
442
442
|
);
|
|
443
|
-
let
|
|
444
|
-
o, va.xyz, vb.xyz,
|
|
443
|
+
let nt = cM(
|
|
444
|
+
o, va.xyz, vb.xyz, gE, tMax
|
|
445
445
|
);
|
|
446
|
-
if (
|
|
447
|
-
if (
|
|
448
|
-
dS++;
|
|
446
|
+
if (ox > nt) {
|
|
447
|
+
if (ox > 0.0) {
|
|
448
|
+
dS++; gu[dS] = left;
|
|
449
449
|
}
|
|
450
|
-
if (
|
|
451
|
-
dS++;
|
|
450
|
+
if (nt > 0.0) {
|
|
451
|
+
dS++; gu[dS] = right;
|
|
452
452
|
}
|
|
453
453
|
}
|
|
454
454
|
else {
|
|
455
|
-
if (
|
|
456
|
-
dS++;
|
|
455
|
+
if (nt > 0.0) {
|
|
456
|
+
dS++; gu[dS] = right;
|
|
457
457
|
}
|
|
458
|
-
if (
|
|
459
|
-
dS++;
|
|
458
|
+
if (ox > 0.0) {
|
|
459
|
+
dS++; gu[dS] = left;
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
464
|
` : ''}
|
|
465
465
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
466
|
-
if (
|
|
466
|
+
if (gS == 1u) {
|
|
467
467
|
let hW = bitcast<u32>(node);
|
|
468
468
|
if ((hW & 0x80000000u) != 0u) {
|
|
469
469
|
bh = i32((hW >> 23u) & 0xffu);
|
|
@@ -478,7 +478,7 @@ let rp = bvhBuffer[i + 2];
|
|
|
478
478
|
let rq = bvhBuffer[i + 3];
|
|
479
479
|
let nodeMin = ui.xyz;
|
|
480
480
|
let ec = vec3f(ui.w, ro.x, ro.y);
|
|
481
|
-
let
|
|
481
|
+
let mg = array<u32, 4>(
|
|
482
482
|
bitcast<u32>(ro.z), bitcast<u32>(ro.w),
|
|
483
483
|
bitcast<u32>(rp.x), bitcast<u32>(rp.y)
|
|
484
484
|
);
|
|
@@ -488,14 +488,14 @@ let rB = unpack4x8unorm(bitcast<u32>(rq.x));
|
|
|
488
488
|
let rt = unpack4x8unorm(bitcast<u32>(rq.y));
|
|
489
489
|
let ru = unpack4x8unorm(bitcast<u32>(rq.z));
|
|
490
490
|
let rv = unpack4x8unorm(bitcast<u32>(rq.w));
|
|
491
|
-
let tx0 = (nodeMin.x + rw * ec.x - o.x) *
|
|
492
|
-
let tx1 = (nodeMin.x + rt * ec.x - o.x) *
|
|
493
|
-
let ty0 = (nodeMin.y + rA * ec.y - o.y) *
|
|
494
|
-
let ty1 = (nodeMin.y + ru * ec.y - o.y) *
|
|
495
|
-
let tz0 = (nodeMin.z + rB * ec.z - o.z) *
|
|
496
|
-
let tz1 = (nodeMin.z + rv * ec.z - o.z) *
|
|
497
|
-
let bJ = eZ(
|
|
498
|
-
let
|
|
491
|
+
let tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
|
|
492
|
+
let tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
|
|
493
|
+
let ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
|
|
494
|
+
let ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
|
|
495
|
+
let tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
|
|
496
|
+
let tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
|
|
497
|
+
let bJ = eZ(gE, o);
|
|
498
|
+
let mK = max(
|
|
499
499
|
max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
|
|
500
500
|
(min(tz0, tz1) - vec4f(bJ.z))
|
|
501
501
|
);
|
|
@@ -503,11 +503,11 @@ let rU = min(
|
|
|
503
503
|
min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
|
|
504
504
|
(max(tz0, tz1) + vec4f(bJ.z))
|
|
505
505
|
);
|
|
506
|
-
var distance = select(rU,
|
|
506
|
+
var distance = select(rU, mK, mK > vec4f(0.0));
|
|
507
507
|
distance = select(
|
|
508
508
|
distance,
|
|
509
509
|
vec4f(-1.0),
|
|
510
|
-
|
|
510
|
+
mK > min(rU, vec4f(tMax))
|
|
511
511
|
);
|
|
512
512
|
var fd = array<f32, 4>(
|
|
513
513
|
distance.x,
|
|
@@ -522,7 +522,7 @@ var dX = -1.0;
|
|
|
522
522
|
var el = -1;
|
|
523
523
|
for (var child = 0; child < 4; child++) {
|
|
524
524
|
if (
|
|
525
|
-
|
|
525
|
+
mg[child] != 0u &&
|
|
526
526
|
fd[child] > dX
|
|
527
527
|
) {
|
|
528
528
|
dX = fd[child];
|
|
@@ -530,13 +530,13 @@ el = child;
|
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
532
|
if (el >= 0 && dX > 0.0) {
|
|
533
|
-
let
|
|
534
|
-
var jI = bitcast<i32>(
|
|
535
|
-
if ((
|
|
533
|
+
let nC = mg[el];
|
|
534
|
+
var jI = bitcast<i32>(nC);
|
|
535
|
+
if ((nC & 0x80000000u) == 0u) {
|
|
536
536
|
jI += blasOffset;
|
|
537
537
|
}
|
|
538
538
|
dS++;
|
|
539
|
-
|
|
539
|
+
gu[dS] = jI;
|
|
540
540
|
fd[el] = -1.0;
|
|
541
541
|
}
|
|
542
542
|
}
|
|
@@ -544,7 +544,7 @@ fd[el] = -1.0;
|
|
|
544
544
|
}
|
|
545
545
|
` : ''}
|
|
546
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
547
|
+
if (gS == 0u) {
|
|
548
548
|
let i = node + bo;
|
|
549
549
|
let r1 = bvhBuffer[i];
|
|
550
550
|
let bb = bitcast<i32>(r1.w);
|
|
@@ -556,34 +556,34 @@ let d0 = cM(
|
|
|
556
556
|
o,
|
|
557
557
|
bvhBuffer[left + bo].xyz,
|
|
558
558
|
bvhBuffer[left + 1 + bo].xyz,
|
|
559
|
-
|
|
559
|
+
gE,
|
|
560
560
|
tMax
|
|
561
561
|
);
|
|
562
562
|
let d1 = cM(
|
|
563
563
|
o,
|
|
564
564
|
bvhBuffer[right + bo].xyz,
|
|
565
565
|
bvhBuffer[right + 1 + bo].xyz,
|
|
566
|
-
|
|
566
|
+
gE,
|
|
567
567
|
tMax
|
|
568
568
|
);
|
|
569
569
|
|
|
570
570
|
if (d0 > d1) {
|
|
571
571
|
if (d0 > 0.0) {
|
|
572
|
-
dS++;
|
|
572
|
+
dS++; gu[dS] = left;
|
|
573
573
|
|
|
574
574
|
}
|
|
575
575
|
if (d1 > 0.0) {
|
|
576
|
-
dS++;
|
|
576
|
+
dS++; gu[dS] = right;
|
|
577
577
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
else {
|
|
581
581
|
if (d1 > 0.0) {
|
|
582
|
-
dS++;
|
|
582
|
+
dS++; gu[dS] = right;
|
|
583
583
|
|
|
584
584
|
}
|
|
585
585
|
if (d0 > 0.0) {
|
|
586
|
-
dS++;
|
|
586
|
+
dS++; gu[dS] = left;
|
|
587
587
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
@@ -610,7 +610,7 @@ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirecti
|
|
|
610
610
|
${hasDisplacement ? displacementWgsl : ''}
|
|
611
611
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
612
612
|
|
|
613
|
-
struct
|
|
613
|
+
struct fB {
|
|
614
614
|
p0: vec3f,
|
|
615
615
|
p1: vec3f,
|
|
616
616
|
p2: vec3f,
|
|
@@ -639,7 +639,7 @@ return t2;
|
|
|
639
639
|
return INF;
|
|
640
640
|
}
|
|
641
641
|
|
|
642
|
-
fn
|
|
642
|
+
fn nh(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
643
643
|
let dt: f32 = dot(r.d, n);
|
|
644
644
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
645
645
|
|
|
@@ -666,7 +666,7 @@ let cosThetaMax = sqrt(max(0.0, 1.0 - jv));
|
|
|
666
666
|
return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
667
667
|
}
|
|
668
668
|
|
|
669
|
-
fn
|
|
669
|
+
fn my(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
670
670
|
|
|
671
671
|
|
|
672
672
|
var d: f32 = INF;
|
|
@@ -688,7 +688,7 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
688
688
|
return INF;
|
|
689
689
|
}
|
|
690
690
|
|
|
691
|
-
d =
|
|
691
|
+
d = nh(pos, u, v, normal, r);
|
|
692
692
|
if (d < 0.0) {
|
|
693
693
|
d = INF;
|
|
694
694
|
}
|
|
@@ -775,8 +775,8 @@ d = hx(light.radiusOrSpread, light.position, r);
|
|
|
775
775
|
}
|
|
776
776
|
if (d != INF) {
|
|
777
777
|
let ve = r.o + d * r.d;
|
|
778
|
-
let
|
|
779
|
-
if (
|
|
778
|
+
let mB = bL(light, normalize(r.o - ve));
|
|
779
|
+
if (mB <= 0.0) { return INF; }
|
|
780
780
|
if (light.radiusOrSpread > 0.0) {
|
|
781
781
|
(*lightSample).direction = r.d;
|
|
782
782
|
(*lightSample).dist = d;
|
|
@@ -785,7 +785,7 @@ r.o + r.d * d - light.position
|
|
|
785
785
|
);
|
|
786
786
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
787
787
|
}
|
|
788
|
-
(*lightSample).emission = light.emission *
|
|
788
|
+
(*lightSample).emission = light.emission * mB * select(
|
|
789
789
|
1.0,
|
|
790
790
|
1.0 / max(d * d, 1e-8),
|
|
791
791
|
light.radiusOrSpread <= 0.0
|
|
@@ -834,30 +834,30 @@ w21 = w21 / hk + w20;
|
|
|
834
834
|
w22 = w22 / hk + w21;
|
|
835
835
|
|
|
836
836
|
let rand = eo(0u);
|
|
837
|
-
var
|
|
837
|
+
var ni: f32;
|
|
838
838
|
if (rand < w00) {
|
|
839
|
-
|
|
839
|
+
ni = m00.x;
|
|
840
840
|
} else if (rand < w01) {
|
|
841
|
-
|
|
841
|
+
ni = m01.x;
|
|
842
842
|
} else if (rand < w02) {
|
|
843
|
-
|
|
843
|
+
ni = m02.x;
|
|
844
844
|
} else if (rand < w10) {
|
|
845
|
-
|
|
845
|
+
ni = m10.x;
|
|
846
846
|
} else if (rand < w11) {
|
|
847
|
-
|
|
847
|
+
ni = m11.x;
|
|
848
848
|
} else if (rand < w12) {
|
|
849
|
-
|
|
849
|
+
ni = m12.x;
|
|
850
850
|
} else if (rand < w20) {
|
|
851
|
-
|
|
851
|
+
ni = m20.x;
|
|
852
852
|
} else if (rand < w21) {
|
|
853
|
-
|
|
853
|
+
ni = m21.x;
|
|
854
854
|
} else {
|
|
855
|
-
|
|
855
|
+
ni = m22.x;
|
|
856
856
|
}
|
|
857
|
-
return i32(
|
|
857
|
+
return i32(ni);
|
|
858
858
|
}
|
|
859
859
|
|
|
860
|
-
fn
|
|
860
|
+
fn lV(
|
|
861
861
|
pa: i32,
|
|
862
862
|
index: vec3i,
|
|
863
863
|
eK: vec3f
|
|
@@ -874,15 +874,15 @@ return pa;
|
|
|
874
874
|
|
|
875
875
|
|
|
876
876
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
877
|
-
fn eE(normal: vec3f, dp1: vec3f, dp2: vec3f,
|
|
878
|
-
let determinant =
|
|
877
|
+
fn eE(normal: vec3f, dp1: vec3f, dp2: vec3f, oc: vec2f, od: vec2f, input: vec4f) -> mat2x3f {
|
|
878
|
+
let determinant = oc.x * od.y - oc.y * od.x;
|
|
879
879
|
var t = input.xyz;
|
|
880
880
|
var b = vec3f(0.0);
|
|
881
881
|
|
|
882
882
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
883
883
|
if (abs(determinant) > 1e-12) {
|
|
884
|
-
let dt = (dp1 *
|
|
885
|
-
let db = (dp2 *
|
|
884
|
+
let dt = (dp1 * od.y - dp2 * oc.y) / determinant;
|
|
885
|
+
let db = (dp2 * oc.x - dp1 * od.x) / determinant;
|
|
886
886
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
887
887
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
888
888
|
}
|
|
@@ -901,11 +901,11 @@ return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
|
901
901
|
` : /* wgsl */ ``}
|
|
902
902
|
fn ht(
|
|
903
903
|
si: ptr<function, ad>,
|
|
904
|
-
tri:
|
|
904
|
+
tri: fB,
|
|
905
905
|
eK: vec3f,
|
|
906
906
|
index: vec3i,
|
|
907
907
|
bU: bool,
|
|
908
|
-
|
|
908
|
+
fw: i32
|
|
909
909
|
) {
|
|
910
910
|
(*si).hit = true;
|
|
911
911
|
|
|
@@ -924,7 +924,7 @@ if (USE_VERTEX_COLOR) {
|
|
|
924
924
|
let oY = uvProjection == ${uvProjectionConstants.spherical};
|
|
925
925
|
|
|
926
926
|
var normal: vec3f = (*si).normal;
|
|
927
|
-
var
|
|
927
|
+
var ha: vec3f;
|
|
928
928
|
var n0 = vec3f(0.0);
|
|
929
929
|
var n1 = vec3f(0.0);
|
|
930
930
|
var n2 = vec3f(0.0);
|
|
@@ -934,9 +934,9 @@ if (!bU || oY) {
|
|
|
934
934
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
935
935
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
936
936
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
937
|
-
|
|
937
|
+
ha = normalize(eK.x * n0 + eK.y * n1 + eK.z * n2);
|
|
938
938
|
if (!bU) {
|
|
939
|
-
normal =
|
|
939
|
+
normal = ha;
|
|
940
940
|
}
|
|
941
941
|
}
|
|
942
942
|
|
|
@@ -967,11 +967,11 @@ let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ?
|
|
|
967
967
|
(*si).tangent = normalize(eK.x * t0 + eK.y * t1 + eK.z * t2);
|
|
968
968
|
}
|
|
969
969
|
|
|
970
|
-
if (
|
|
971
|
-
(*si).materialIndex =
|
|
970
|
+
if (fw >= 0) {
|
|
971
|
+
(*si).materialIndex = fw;
|
|
972
972
|
}
|
|
973
973
|
else {
|
|
974
|
-
(*si).materialIndex =
|
|
974
|
+
(*si).materialIndex = lV(
|
|
975
975
|
(*si).materialIndex,
|
|
976
976
|
index,
|
|
977
977
|
eK
|
|
@@ -980,7 +980,7 @@ eK
|
|
|
980
980
|
|
|
981
981
|
if (uvProjection > 0) {
|
|
982
982
|
|
|
983
|
-
uv =
|
|
983
|
+
uv = gI(uvProjection, (*si).position, select(normal, ha, oY));
|
|
984
984
|
cX = uv;
|
|
985
985
|
}
|
|
986
986
|
|
|
@@ -995,7 +995,7 @@ uv = fract(uv);
|
|
|
995
995
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
996
996
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normal;` : ''}
|
|
997
997
|
let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
998
|
-
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " ||
|
|
998
|
+
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
|
|
999
999
|
let dp1 = tri.p0 - tri.p2;
|
|
1000
1000
|
let dp2 = tri.p1 - tri.p2;
|
|
1001
1001
|
var aT = vec4f(0.0);
|
|
@@ -1007,32 +1007,32 @@ aT = eK.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
|
|
|
1007
1007
|
let eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
1008
1008
|
(*si).geometryTangent = eS[0];
|
|
1009
1009
|
(*si).geometryBitangent = eS[1];
|
|
1010
|
-
var
|
|
1010
|
+
var fZ = eS;
|
|
1011
1011
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1012
1012
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1013
1013
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1014
1014
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1015
|
-
|
|
1015
|
+
fZ = eE(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1016
1016
|
}
|
|
1017
|
-
(*si).directionTangent =
|
|
1018
|
-
(*si).directionBitangent =
|
|
1017
|
+
(*si).directionTangent = fZ[0];
|
|
1018
|
+
(*si).directionBitangent = fZ[1];
|
|
1019
1019
|
${hasCoatNormals ? /* wgsl */ `
|
|
1020
1020
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1021
1021
|
let kC = i32(directionMaterial.coatNormalMapIndex);
|
|
1022
|
-
var
|
|
1022
|
+
var mh = eS;
|
|
1023
1023
|
if (USE_UV1 && mapInfo[kC + NUM_MAPS * 2].x > 0.5) {
|
|
1024
1024
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1025
1025
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1026
1026
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1027
|
-
|
|
1027
|
+
mh = eE(normal, dp1, dp2, a-c, b-c,
|
|
1028
1028
|
select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1029
1029
|
}
|
|
1030
1030
|
|
|
1031
1031
|
|
|
1032
1032
|
let decoded = sampleMap(kC, getMapUvSet(kC, uv,
|
|
1033
1033
|
select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1034
|
-
let mapped =
|
|
1035
|
-
+
|
|
1034
|
+
let mapped = mh[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1035
|
+
+ mh[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1036
1036
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1037
1037
|
}
|
|
1038
1038
|
` : ''}
|
|
@@ -1079,10 +1079,10 @@ h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
|
1079
1079
|
if (USE_NORMAL_MAPS) {
|
|
1080
1080
|
let dp1 = tri.p0 - tri.p2;
|
|
1081
1081
|
let dp2 = tri.p1 - tri.p2;
|
|
1082
|
-
let
|
|
1083
|
-
let
|
|
1084
|
-
(*si).normal =
|
|
1085
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1082
|
+
let oc = uv0 - uv2;
|
|
1083
|
+
let od = uv1 - uv2;
|
|
1084
|
+
(*si).normal = ol(
|
|
1085
|
+
(*si).materialIndex, uv, normal, dp1, dp2, oc, od
|
|
1086
1086
|
);
|
|
1087
1087
|
}
|
|
1088
1088
|
}
|
|
@@ -1096,7 +1096,7 @@ barycentric: vec3f,
|
|
|
1096
1096
|
|
|
1097
1097
|
|
|
1098
1098
|
|
|
1099
|
-
fn
|
|
1099
|
+
fn fM(o: vec3f, d: vec3f, tri: fB, ey: i32, gQ: vec3f, tMax: f32) -> eC {
|
|
1100
1100
|
var ti: eC;
|
|
1101
1101
|
|
|
1102
1102
|
|
|
@@ -1117,9 +1117,9 @@ p2t = p2t.zxy;
|
|
|
1117
1117
|
|
|
1118
1118
|
|
|
1119
1119
|
|
|
1120
|
-
p0t = vec3f(p0t.xy +
|
|
1121
|
-
p1t = vec3f(p1t.xy +
|
|
1122
|
-
p2t = vec3f(p2t.xy +
|
|
1120
|
+
p0t = vec3f(p0t.xy + gQ.xy * p0t.z, p0t.z);
|
|
1121
|
+
p1t = vec3f(p1t.xy + gQ.xy * p1t.z, p1t.z);
|
|
1122
|
+
p2t = vec3f(p2t.xy + gQ.xy * p2t.z, p2t.z);
|
|
1123
1123
|
|
|
1124
1124
|
|
|
1125
1125
|
var e = vec3f(
|
|
@@ -1144,9 +1144,9 @@ return ti;
|
|
|
1144
1144
|
let det = e.x + e.y + e.z;
|
|
1145
1145
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1146
1146
|
|
|
1147
|
-
p0t.z *=
|
|
1148
|
-
p1t.z *=
|
|
1149
|
-
p2t.z *=
|
|
1147
|
+
p0t.z *= gQ.z;
|
|
1148
|
+
p1t.z *= gQ.z;
|
|
1149
|
+
p2t.z *= gQ.z;
|
|
1150
1150
|
let rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1151
1151
|
|
|
1152
1152
|
|
|
@@ -1171,20 +1171,20 @@ if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
|
1171
1171
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1172
1172
|
}
|
|
1173
1173
|
|
|
1174
|
-
fn eZ(
|
|
1174
|
+
fn eZ(gE: vec3f, o: vec3f) -> vec3f {
|
|
1175
1175
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1176
|
-
return abs(
|
|
1176
|
+
return abs(gE) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1177
1177
|
}
|
|
1178
1178
|
|
|
1179
1179
|
|
|
1180
1180
|
|
|
1181
|
-
fn cM(o: vec3f, vK: vec3f, vJ: vec3f,
|
|
1182
|
-
let uR = (vK - o) *
|
|
1183
|
-
let uS = (vJ - o) *
|
|
1184
|
-
let bJ = eZ(
|
|
1185
|
-
let
|
|
1181
|
+
fn cM(o: vec3f, vK: vec3f, vJ: vec3f, gE: vec3f, tMax: f32) -> f32 {
|
|
1182
|
+
let uR = (vK - o) * gE;
|
|
1183
|
+
let uS = (vJ - o) * gE;
|
|
1184
|
+
let bJ = eZ(gE, o);
|
|
1185
|
+
let mK = min(uR, uS) - bJ;
|
|
1186
1186
|
let rU = max(uR, uS) + bJ;
|
|
1187
|
-
let t0 = max(
|
|
1187
|
+
let t0 = max(mK.x, max(mK.y, mK.z));
|
|
1188
1188
|
let t1 = min(rU.x, min(rU.y, rU.z));
|
|
1189
1189
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1190
1190
|
}
|
|
@@ -1193,7 +1193,7 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1193
1193
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1194
1194
|
}
|
|
1195
1195
|
|
|
1196
|
-
fn
|
|
1196
|
+
fn mu(d: vec3f, ey: i32) -> vec3f {
|
|
1197
1197
|
|
|
1198
1198
|
|
|
1199
1199
|
if (ey == 0) {
|
|
@@ -1205,16 +1205,16 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
|
1205
1205
|
}
|
|
1206
1206
|
}
|
|
1207
1207
|
|
|
1208
|
-
fn
|
|
1208
|
+
fn mi(
|
|
1209
1209
|
si: ptr<function, ad>,
|
|
1210
|
-
|
|
1210
|
+
lB: fB,
|
|
1211
1211
|
aB: vec3f,
|
|
1212
1212
|
hw: vec3i,
|
|
1213
1213
|
bU: bool,
|
|
1214
1214
|
ao: i32,
|
|
1215
1215
|
eD: vec3f,
|
|
1216
1216
|
eY: vec3f,
|
|
1217
|
-
|
|
1217
|
+
fw: i32
|
|
1218
1218
|
) {
|
|
1219
1219
|
(*si).instanceIndex = ao;
|
|
1220
1220
|
(*si).barycentrics = aB.xy;
|
|
@@ -1227,11 +1227,11 @@ bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
|
|
|
1227
1227
|
|
|
1228
1228
|
ht(
|
|
1229
1229
|
si,
|
|
1230
|
-
|
|
1230
|
+
lB,
|
|
1231
1231
|
aB,
|
|
1232
1232
|
hw,
|
|
1233
1233
|
bU,
|
|
1234
|
-
|
|
1234
|
+
fw
|
|
1235
1235
|
);
|
|
1236
1236
|
|
|
1237
1237
|
let l2w = mat4x4<f32>(
|
|
@@ -1275,7 +1275,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
|
1275
1275
|
|
|
1276
1276
|
|
|
1277
1277
|
|
|
1278
|
-
fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool,
|
|
1278
|
+
fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lC: bool) {
|
|
1279
1279
|
|
|
1280
1280
|
(*si).hit = false;
|
|
1281
1281
|
|
|
@@ -1285,24 +1285,24 @@ return;
|
|
|
1285
1285
|
|
|
1286
1286
|
var tMax = RAY_MAX_DISTANCE;
|
|
1287
1287
|
var ey: i32;
|
|
1288
|
-
var
|
|
1288
|
+
var gQ: vec3f;
|
|
1289
1289
|
|
|
1290
1290
|
var hw: vec3i;
|
|
1291
|
-
var
|
|
1291
|
+
var lB: fB;
|
|
1292
1292
|
var ao: i32;
|
|
1293
1293
|
var hO: i32 = (*si).triangleIndex;
|
|
1294
1294
|
|
|
1295
1295
|
${getBVHTraverseCode(`
|
|
1296
1296
|
(*si).triangleIndex = triangleIndex;
|
|
1297
|
-
|
|
1297
|
+
lB = tri;
|
|
1298
1298
|
hw = index;
|
|
1299
1299
|
ao = cf;
|
|
1300
1300
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
1301
1301
|
|
|
1302
1302
|
if (rb) {
|
|
1303
|
-
|
|
1303
|
+
mi(
|
|
1304
1304
|
si,
|
|
1305
|
-
|
|
1305
|
+
lB,
|
|
1306
1306
|
aB,
|
|
1307
1307
|
hw,
|
|
1308
1308
|
bU,
|
|
@@ -1324,18 +1324,18 @@ return;
|
|
|
1324
1324
|
|
|
1325
1325
|
let bounces = 0;
|
|
1326
1326
|
let doubleSided = true;
|
|
1327
|
-
let
|
|
1327
|
+
let lC = false;
|
|
1328
1328
|
var tMax = maxDistance;
|
|
1329
1329
|
var ey: i32;
|
|
1330
|
-
var
|
|
1330
|
+
var gQ: vec3f;
|
|
1331
1331
|
var hw: vec3i;
|
|
1332
|
-
var
|
|
1332
|
+
var lB: fB;
|
|
1333
1333
|
var ao: i32;
|
|
1334
1334
|
var hO: i32 = -1;
|
|
1335
1335
|
|
|
1336
1336
|
${getBVHTraverseCode(`
|
|
1337
1337
|
(*si).triangleIndex = triangleIndex;
|
|
1338
|
-
|
|
1338
|
+
lB = tri;
|
|
1339
1339
|
hw = index;
|
|
1340
1340
|
ao = cf;
|
|
1341
1341
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
@@ -1351,7 +1351,7 @@ if (rb) {
|
|
|
1351
1351
|
(*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
1352
1352
|
ht(
|
|
1353
1353
|
si,
|
|
1354
|
-
|
|
1354
|
+
lB,
|
|
1355
1355
|
aB,
|
|
1356
1356
|
hw,
|
|
1357
1357
|
bU,
|
|
@@ -1402,10 +1402,10 @@ let doubleSided = true;
|
|
|
1402
1402
|
let qo = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1403
1403
|
var tMax = qo;
|
|
1404
1404
|
var ey: i32;
|
|
1405
|
-
var
|
|
1405
|
+
var gQ: vec3f;
|
|
1406
1406
|
|
|
1407
1407
|
let bounces = 1;
|
|
1408
|
-
var
|
|
1408
|
+
var lC = false;
|
|
1409
1409
|
var hO: i32 = jL;
|
|
1410
1410
|
|
|
1411
1411
|
${getBVHTraverseCode(
|
|
@@ -1417,8 +1417,8 @@ var jt = true;
|
|
|
1417
1417
|
|
|
1418
1418
|
if (jt) {
|
|
1419
1419
|
if (HAS_ALPHA) {
|
|
1420
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
1421
|
-
if (!
|
|
1420
|
+
let materialIndex = i32(ae(bitcast<i32>(ot.z)).x);
|
|
1421
|
+
if (!nF(
|
|
1422
1422
|
materialIndex,
|
|
1423
1423
|
index,
|
|
1424
1424
|
aB,
|