@meimu/mutracer 0.1.2 → 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 +3429 -3390
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- 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 +1 -1
- 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/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/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 +368 -368
- 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.js +116 -116
- 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/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,13 +30,13 @@ 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
42
|
matData.displacementBias,
|
|
@@ -44,17 +44,17 @@ matData.displacementStepSize,
|
|
|
44
44
|
i32(matData.displacementUvProjection),
|
|
45
45
|
displacementUvProjectionScale,
|
|
46
46
|
${anyHit ? 'true' : 'false'},
|
|
47
|
-
|
|
47
|
+
lq
|
|
48
48
|
);
|
|
49
49
|
`;
|
|
50
50
|
}
|
|
51
51
|
const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
|
|
52
52
|
return /* wgsl */ `
|
|
53
53
|
|
|
54
|
-
let hScale =
|
|
55
|
-
let
|
|
54
|
+
let hScale = oh.w;
|
|
55
|
+
let tn = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
57
|
+
let materialIndex = i32(ae(bitcast<i32>(oh.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' : ''});
|
|
@@ -64,9 +64,9 @@ tri.p0 += n0 * matData.displacementBias;
|
|
|
64
64
|
tri.p1 += n1 * matData.displacementBias;
|
|
65
65
|
tri.p2 += n2 * matData.displacementBias;
|
|
66
66
|
}
|
|
67
|
-
if (abs(hScale) > 0.0 &&
|
|
68
|
-
let minH = f32(
|
|
69
|
-
let maxH = f32(
|
|
67
|
+
if (abs(hScale) > 0.0 && tn > 0) {
|
|
68
|
+
let minH = f32(tn >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(tn & 0xff) / 255.0;
|
|
70
70
|
let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
|
|
71
71
|
let displacementMapIndex = i32(matData.displacementMapIndex);
|
|
72
72
|
|
|
@@ -77,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
|
|
|
77
77
|
|
|
78
78
|
${getPDMDisplacmentCode(anyHit)}
|
|
79
79
|
|
|
80
|
-
if (
|
|
81
|
-
eC =
|
|
80
|
+
if (kO.t < tMax) {
|
|
81
|
+
eC = kO.normal;
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
tMax =
|
|
84
|
+
tMax = kO.t;
|
|
85
85
|
|
|
86
|
-
aB =
|
|
86
|
+
aB = kO.barycentric;
|
|
87
87
|
eU = o + tMax * d;
|
|
88
88
|
|
|
89
89
|
bU = true;
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
qT = true;
|
|
91
|
+
ol = true;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
@@ -112,102 +112,102 @@ f32(value >> 24u)
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
fn
|
|
115
|
+
fn kn(value: u32) -> u32 {
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn nO(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn oi(
|
|
124
124
|
node: i32,
|
|
125
|
-
|
|
125
|
+
tc: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
gx: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
|
-
let i = node +
|
|
131
|
+
let i = node + tc;
|
|
132
132
|
let n2 = bvhBuffer[i + 2];
|
|
133
133
|
let n3 = bvhBuffer[i + 3];
|
|
134
134
|
let n4 = bvhBuffer[i + 4];
|
|
135
135
|
let header = bitcast<u32>(n0.w);
|
|
136
|
-
let
|
|
137
|
-
let
|
|
138
|
-
let
|
|
139
|
-
let
|
|
140
|
-
bitcast<f32>(u32(
|
|
141
|
-
bitcast<f32>(u32(
|
|
142
|
-
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)
|
|
143
|
+
);
|
|
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))
|
|
169
|
+
);
|
|
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))
|
|
143
173
|
);
|
|
144
|
-
let bJ = eV(gv, o);
|
|
145
|
-
let eH = (n0.xyz - o) * gv;
|
|
146
|
-
let da = hG * gv;
|
|
147
|
-
let wm = bp(bitcast<u32>(n2.x));
|
|
148
|
-
let wn = bp(bitcast<u32>(n2.y));
|
|
149
|
-
let wo = bp(bitcast<u32>(n2.z));
|
|
150
|
-
let wp = bp(bitcast<u32>(n2.w));
|
|
151
|
-
let wq = bp(bitcast<u32>(n3.x));
|
|
152
|
-
let wr = bp(bitcast<u32>(n3.y));
|
|
153
|
-
let wg = bp(bitcast<u32>(n3.z));
|
|
154
|
-
let wh = bp(bitcast<u32>(n3.w));
|
|
155
|
-
let wi = bp(bitcast<u32>(n4.x));
|
|
156
|
-
let wj = bp(bitcast<u32>(n4.y));
|
|
157
|
-
let wk = bp(bitcast<u32>(n4.z));
|
|
158
|
-
let wl = bp(bitcast<u32>(n4.w));
|
|
159
174
|
|
|
175
|
+
let vj = ws * da.x + eH.x;
|
|
176
|
+
let vl = wu * da.y + eH.y;
|
|
177
|
+
let vn = ww * da.z + eH.z;
|
|
160
178
|
let vb = wm * da.x + eH.x;
|
|
161
179
|
let vd = wo * da.y + eH.y;
|
|
162
180
|
let vg = wq * da.z + eH.z;
|
|
163
|
-
let
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
let ws = max(
|
|
167
|
-
max((min(vb, uV) - vec4f(bJ.x)), (min(vd, uX) - vec4f(bJ.y))),
|
|
168
|
-
(min(vg, uZ) - vec4f(bJ.z))
|
|
169
|
-
);
|
|
170
|
-
let wa = min(
|
|
171
|
-
min((max(vb, uV) + vec4f(bJ.x)), (max(vd, uX) + vec4f(bJ.y))),
|
|
172
|
-
(max(vg, uZ) + vec4f(bJ.z))
|
|
173
|
-
);
|
|
174
|
-
|
|
175
|
-
let vc = wn * da.x + eH.x;
|
|
176
|
-
let ve = wp * da.y + eH.y;
|
|
177
|
-
let vh = wr * da.z + eH.z;
|
|
178
|
-
let uW = wh * da.x + eH.x;
|
|
179
|
-
let uY = wj * da.y + eH.y;
|
|
180
|
-
let va = wl * da.z + eH.z;
|
|
181
|
-
let wt = max(
|
|
182
|
-
max((min(vc, uW) - vec4f(bJ.x)), (min(ve, uY) - vec4f(bJ.y))),
|
|
183
|
-
(min(vh, va) - vec4f(bJ.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))
|
|
184
184
|
);
|
|
185
|
-
let
|
|
186
|
-
min((max(
|
|
187
|
-
(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))
|
|
188
188
|
);
|
|
189
189
|
|
|
190
|
-
let
|
|
191
|
-
let
|
|
192
|
-
return select(0u, 1u,
|
|
193
|
-
| select(0u, 2u,
|
|
194
|
-
| select(0u, 4u,
|
|
195
|
-
| select(0u, 8u,
|
|
196
|
-
| select(0u, 16u,
|
|
197
|
-
| select(0u, 32u,
|
|
198
|
-
| select(0u, 64u,
|
|
199
|
-
| 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);
|
|
200
200
|
}
|
|
201
201
|
|
|
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 oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(oh.y));
|
|
207
207
|
for (var k = 0; k < bh; k++) {
|
|
208
208
|
let triangleIndex = primitiveOffset + k;
|
|
209
209
|
${skipTriangleCode}
|
|
210
|
-
if (bounces > 0 && triangleIndex ==
|
|
210
|
+
if (bounces > 0 && triangleIndex == hK) {
|
|
211
211
|
continue;
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -218,12 +218,12 @@ attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.x
|
|
|
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 ol = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (ol) {
|
|
227
227
|
${handleHitCode}
|
|
228
228
|
}
|
|
229
229
|
}
|
|
@@ -231,69 +231,69 @@ ${handleHitCode}
|
|
|
231
231
|
return /* wgsl */ `
|
|
232
232
|
var d = ray.d;
|
|
233
233
|
var o = ray.o;
|
|
234
|
-
var
|
|
235
|
-
var
|
|
236
|
-
var
|
|
234
|
+
var lQ: array<i32, TLAS_STACK_SIZE>;
|
|
235
|
+
var jd = -1;
|
|
236
|
+
var gx = eX(d);
|
|
237
237
|
var bU = false;
|
|
238
|
-
var
|
|
238
|
+
var qT = false;
|
|
239
239
|
var eU: vec3f;
|
|
240
240
|
var eC: vec3f;
|
|
241
241
|
var aB: vec3f;
|
|
242
242
|
|
|
243
243
|
|
|
244
|
-
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz,
|
|
245
|
-
|
|
246
|
-
|
|
244
|
+
if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gx, tMax) > 0.0) {
|
|
245
|
+
jd = 0;
|
|
246
|
+
lQ[0] = 0;
|
|
247
247
|
}
|
|
248
|
-
while (
|
|
249
|
-
let
|
|
250
|
-
|
|
248
|
+
while (jd >= 0) {
|
|
249
|
+
let sN = lQ[jd];
|
|
250
|
+
jd--;
|
|
251
251
|
o = ray.o;
|
|
252
252
|
d = ray.d;
|
|
253
|
-
|
|
253
|
+
gx = eX(d);
|
|
254
254
|
|
|
255
|
-
let
|
|
256
|
-
let eR = bitcast<i32>(
|
|
255
|
+
let vX = bvhBuffer[sN];
|
|
256
|
+
let eR = bitcast<i32>(vX.w);
|
|
257
257
|
if (eR >= 0) {
|
|
258
|
-
let left =
|
|
258
|
+
let left = sN + 2;
|
|
259
259
|
let right = eR;
|
|
260
260
|
let d0 = cM(
|
|
261
261
|
o,
|
|
262
262
|
bvhBuffer[left].xyz,
|
|
263
263
|
bvhBuffer[left + 1].xyz,
|
|
264
|
-
|
|
264
|
+
gx,
|
|
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
|
+
gx,
|
|
272
272
|
tMax
|
|
273
273
|
);
|
|
274
274
|
|
|
275
275
|
if (d0 > d1) {
|
|
276
|
-
if (d0 > 0.0) {
|
|
277
|
-
if (d1 > 0.0) {
|
|
276
|
+
if (d0 > 0.0) { jd++; lQ[jd] = left; }
|
|
277
|
+
if (d1 > 0.0) { jd++; lQ[jd] = right; }
|
|
278
278
|
}
|
|
279
279
|
else {
|
|
280
|
-
if (d1 > 0.0) {
|
|
281
|
-
if (d0 > 0.0) {
|
|
280
|
+
if (d1 > 0.0) { jd++; lQ[jd] = right; }
|
|
281
|
+
if (d0 > 0.0) { jd++; lQ[jd] = left; }
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
else {
|
|
285
|
-
let
|
|
285
|
+
let qB = -eR;
|
|
286
286
|
|
|
287
287
|
|
|
288
288
|
for (
|
|
289
|
-
var
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
var ml = qB - 1;
|
|
290
|
+
ml >= 0;
|
|
291
|
+
ml--
|
|
292
292
|
) {
|
|
293
|
-
let
|
|
294
|
-
let cf = bitcast<i32>(
|
|
295
|
-
let
|
|
296
|
-
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}];
|
|
297
297
|
let w2l = mat4x4<f32>(
|
|
298
298
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
299
299
|
instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
@@ -302,212 +302,212 @@ 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
|
+
gx = eX(d);
|
|
306
306
|
ey = maxDimension(abs(d));
|
|
307
|
-
|
|
307
|
+
gL = mj(d, ey);
|
|
308
308
|
|
|
309
|
-
let fG = bitcast<u32>(
|
|
310
|
-
let
|
|
309
|
+
let fG = bitcast<u32>(oh.x);
|
|
310
|
+
let gN = fG >> 30u;
|
|
311
311
|
let blasOffset = i32(fG & 0x3fffffffu);
|
|
312
312
|
let bo = rtUniform.blasOffset;
|
|
313
313
|
|
|
314
314
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
315
|
-
if (
|
|
315
|
+
if (gN == 3u) {
|
|
316
316
|
|
|
317
317
|
|
|
318
318
|
|
|
319
319
|
|
|
320
|
-
var
|
|
321
|
-
var
|
|
322
|
-
var
|
|
323
|
-
var
|
|
320
|
+
var sd: array<vec2u, BLAS_STACK_SIZE>;
|
|
321
|
+
var pe = -1;
|
|
322
|
+
var rP = 0u;
|
|
323
|
+
var kQ = 0u;
|
|
324
324
|
|
|
325
325
|
var ep = 0x80000000u;
|
|
326
|
-
let
|
|
326
|
+
let ul = select(0u, 4u, d.x < 0.0)
|
|
327
327
|
| select(0u, 2u, d.y < 0.0)
|
|
328
328
|
| select(0u, 1u, d.z < 0.0);
|
|
329
|
-
let
|
|
329
|
+
let qd = 7u - ul;
|
|
330
330
|
|
|
331
331
|
|
|
332
332
|
|
|
333
333
|
|
|
334
|
-
while (
|
|
335
|
-
|
|
334
|
+
while (rP < 4096u) {
|
|
335
|
+
rP++;
|
|
336
336
|
|
|
337
337
|
let internalMask = ep & 0xffu;
|
|
338
|
-
let
|
|
339
|
-
|
|
340
|
-
ep &= ~(1u <<
|
|
338
|
+
let pZ =
|
|
339
|
+
kn(ep >> 24u) + 24u;
|
|
340
|
+
ep &= ~(1u << pZ);
|
|
341
341
|
if ((ep & 0xff000000u) != 0u) {
|
|
342
|
-
|
|
342
|
+
pe++;
|
|
343
343
|
|
|
344
|
-
|
|
344
|
+
sd[pe] = vec2u(kQ, ep);
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
-
let slot = (
|
|
348
|
-
let
|
|
349
|
-
let relativeIndex = countOneBits(internalMask &
|
|
350
|
-
let
|
|
351
|
-
let node = blasOffset + i32(
|
|
352
|
-
let
|
|
353
|
-
let
|
|
354
|
-
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
|
|
355
355
|
);
|
|
356
356
|
|
|
357
357
|
|
|
358
358
|
ep = 0u;
|
|
359
|
-
if (
|
|
359
|
+
if (tX != 0u) {
|
|
360
360
|
let fC = bvhBuffer[node + bo + 1];
|
|
361
|
-
let
|
|
362
|
-
var
|
|
363
|
-
var
|
|
364
|
-
while (
|
|
365
|
-
let
|
|
366
|
-
|
|
367
|
-
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(
|
|
368
368
|
bitcast<u32>(fC.z),
|
|
369
369
|
bitcast<u32>(fC.w),
|
|
370
|
-
|
|
370
|
+
rr >= 4u
|
|
371
371
|
);
|
|
372
|
-
let
|
|
373
|
-
(
|
|
374
|
-
let
|
|
375
|
-
let
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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
|
|
379
379
|
);
|
|
380
|
-
let
|
|
381
|
-
|
|
380
|
+
let uH = (sW >> 5u) & 0x7u;
|
|
381
|
+
tl |= uH << uM;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
|
|
385
|
-
ep = (
|
|
386
|
-
let
|
|
387
|
-
var
|
|
388
|
-
while (
|
|
389
|
-
let
|
|
390
|
-
|
|
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);
|
|
391
391
|
let bh = 1;
|
|
392
392
|
let primitiveOffset = bo + blasOffset
|
|
393
|
-
+ i32(
|
|
393
|
+
+ i32(oH + nI);
|
|
394
394
|
${intersectTriangles}
|
|
395
395
|
}
|
|
396
396
|
}
|
|
397
397
|
|
|
398
398
|
if ((ep & 0xff000000u) != 0u) { continue; }
|
|
399
|
-
if (
|
|
400
|
-
let
|
|
401
|
-
|
|
402
|
-
ep =
|
|
403
|
-
|
|
399
|
+
if (pe >= 0) {
|
|
400
|
+
let qe = sd[pe];
|
|
401
|
+
kQ = qe.x;
|
|
402
|
+
ep = qe.y;
|
|
403
|
+
pe--;
|
|
404
404
|
}
|
|
405
405
|
else { break; }
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
408
|
` : ''}
|
|
409
409
|
|
|
410
|
-
var
|
|
410
|
+
var gp: array<i32, BLAS_STACK_SIZE>;
|
|
411
411
|
var dR = -1;
|
|
412
|
-
if (
|
|
412
|
+
if (gN != 3u) {
|
|
413
413
|
dR = 0;
|
|
414
414
|
|
|
415
|
-
|
|
415
|
+
gp[0] = uN;
|
|
416
416
|
}
|
|
417
417
|
|
|
418
418
|
while (dR >= 0) {
|
|
419
419
|
|
|
420
|
-
let node =
|
|
420
|
+
let node = gp[dR];
|
|
421
421
|
dR--;
|
|
422
422
|
var bh = 0;
|
|
423
423
|
var primitiveOffset = 0;
|
|
424
424
|
|
|
425
425
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
426
|
-
if (
|
|
426
|
+
if (gN == 2u) {
|
|
427
427
|
let i = node + bo;
|
|
428
|
-
let
|
|
429
|
-
let
|
|
430
|
-
let
|
|
431
|
-
let
|
|
432
|
-
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));
|
|
433
433
|
if (bh > 0) {
|
|
434
434
|
primitiveOffset = bo + blasOffset
|
|
435
|
-
+ i32(bitcast<u32>(
|
|
435
|
+
+ i32(bitcast<u32>(uU.w));
|
|
436
436
|
}
|
|
437
437
|
else {
|
|
438
|
-
let left = blasOffset + i32(bitcast<u32>(
|
|
439
|
-
let right = blasOffset + i32(bitcast<u32>(
|
|
440
|
-
let
|
|
441
|
-
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
|
|
442
442
|
);
|
|
443
|
-
let
|
|
444
|
-
o,
|
|
443
|
+
let ng = cM(
|
|
444
|
+
o, uT.xyz, uU.xyz, gx, tMax
|
|
445
445
|
);
|
|
446
|
-
if (
|
|
447
|
-
if (
|
|
448
|
-
dR++;
|
|
446
|
+
if (om > ng) {
|
|
447
|
+
if (om > 0.0) {
|
|
448
|
+
dR++; gp[dR] = left;
|
|
449
449
|
}
|
|
450
|
-
if (
|
|
451
|
-
dR++;
|
|
450
|
+
if (ng > 0.0) {
|
|
451
|
+
dR++; gp[dR] = right;
|
|
452
452
|
}
|
|
453
453
|
}
|
|
454
454
|
else {
|
|
455
|
-
if (
|
|
456
|
-
dR++;
|
|
455
|
+
if (ng > 0.0) {
|
|
456
|
+
dR++; gp[dR] = right;
|
|
457
457
|
}
|
|
458
|
-
if (
|
|
459
|
-
dR++;
|
|
458
|
+
if (om > 0.0) {
|
|
459
|
+
dR++; gp[dR] = left;
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
464
|
` : ''}
|
|
465
465
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
466
|
-
if (
|
|
467
|
-
let
|
|
468
|
-
if ((
|
|
469
|
-
bh = i32((
|
|
466
|
+
if (gN == 1u) {
|
|
467
|
+
let hS = bitcast<u32>(node);
|
|
468
|
+
if ((hS & 0x80000000u) != 0u) {
|
|
469
|
+
bh = i32((hS >> 23u) & 0xffu);
|
|
470
470
|
primitiveOffset = bo + blasOffset
|
|
471
|
-
+ i32(
|
|
471
|
+
+ i32(hS & 0x007fffffu);
|
|
472
472
|
}
|
|
473
473
|
else {
|
|
474
474
|
let i = node + bo;
|
|
475
|
-
let
|
|
476
|
-
let
|
|
477
|
-
let
|
|
478
|
-
let
|
|
479
|
-
let nodeMin =
|
|
480
|
-
let ec = vec3f(
|
|
481
|
-
let
|
|
482
|
-
bitcast<u32>(
|
|
483
|
-
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)
|
|
484
484
|
);
|
|
485
|
-
let
|
|
486
|
-
let
|
|
487
|
-
let
|
|
488
|
-
let
|
|
489
|
-
let
|
|
490
|
-
let
|
|
491
|
-
let tx0 = (nodeMin.x +
|
|
492
|
-
let tx1 = (nodeMin.x +
|
|
493
|
-
let ty0 = (nodeMin.y +
|
|
494
|
-
let ty1 = (nodeMin.y +
|
|
495
|
-
let tz0 = (nodeMin.z +
|
|
496
|
-
let tz1 = (nodeMin.z +
|
|
497
|
-
let bJ = eV(
|
|
498
|
-
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(
|
|
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
|
);
|
|
502
|
-
let
|
|
502
|
+
let rM = 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(
|
|
506
|
+
var distance = select(rM, mB, mB > vec4f(0.0));
|
|
507
507
|
distance = select(
|
|
508
508
|
distance,
|
|
509
509
|
vec4f(-1.0),
|
|
510
|
-
|
|
510
|
+
mB > min(rM, vec4f(tMax))
|
|
511
511
|
);
|
|
512
512
|
var fa = 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
|
+
lV[child] != 0u &&
|
|
526
526
|
fa[child] > dX
|
|
527
527
|
) {
|
|
528
528
|
dX = fa[child];
|
|
@@ -530,13 +530,13 @@ el = child;
|
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
532
|
if (el >= 0 && dX > 0.0) {
|
|
533
|
-
let
|
|
534
|
-
var
|
|
535
|
-
if ((
|
|
536
|
-
|
|
533
|
+
let nl = lV[el];
|
|
534
|
+
var jD = bitcast<i32>(nl);
|
|
535
|
+
if ((nl & 0x80000000u) == 0u) {
|
|
536
|
+
jD += blasOffset;
|
|
537
537
|
}
|
|
538
538
|
dR++;
|
|
539
|
-
|
|
539
|
+
gp[dR] = jD;
|
|
540
540
|
fa[el] = -1.0;
|
|
541
541
|
}
|
|
542
542
|
}
|
|
@@ -544,7 +544,7 @@ fa[el] = -1.0;
|
|
|
544
544
|
}
|
|
545
545
|
` : ''}
|
|
546
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
547
|
+
if (gN == 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
|
+
gx,
|
|
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
|
+
gx,
|
|
567
567
|
tMax
|
|
568
568
|
);
|
|
569
569
|
|
|
570
570
|
if (d0 > d1) {
|
|
571
571
|
if (d0 > 0.0) {
|
|
572
|
-
dR++;
|
|
572
|
+
dR++; gp[dR] = left;
|
|
573
573
|
|
|
574
574
|
}
|
|
575
575
|
if (d1 > 0.0) {
|
|
576
|
-
dR++;
|
|
576
|
+
dR++; gp[dR] = right;
|
|
577
577
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
else {
|
|
581
581
|
if (d1 > 0.0) {
|
|
582
|
-
dR++;
|
|
582
|
+
dR++; gp[dR] = right;
|
|
583
583
|
|
|
584
584
|
}
|
|
585
585
|
if (d0 > 0.0) {
|
|
586
|
-
dR++;
|
|
586
|
+
dR++; gp[dR] = left;
|
|
587
587
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
@@ -639,7 +639,7 @@ return t2;
|
|
|
639
639
|
return INF;
|
|
640
640
|
}
|
|
641
641
|
|
|
642
|
-
fn
|
|
642
|
+
fn mU(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
|
|
|
@@ -661,12 +661,12 @@ return INF;
|
|
|
661
661
|
fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
|
|
662
662
|
let aj = distance(origin, center);
|
|
663
663
|
if (aj <= radius) { return INV4PI; }
|
|
664
|
-
let
|
|
665
|
-
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));
|
|
666
666
|
return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
|
|
667
667
|
}
|
|
668
668
|
|
|
669
|
-
fn
|
|
669
|
+
fn mo(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 = mU(pos, u, v, normal, r);
|
|
692
692
|
if (d < 0.0) {
|
|
693
693
|
d = INF;
|
|
694
694
|
}
|
|
@@ -711,9 +711,9 @@ d = INF;
|
|
|
711
711
|
|
|
712
712
|
else if (dO == SPHERE_LIGHT) {
|
|
713
713
|
if (light.radiusOrSpread <= 0.0) {
|
|
714
|
-
let
|
|
715
|
-
let projection = dot(
|
|
716
|
-
let ba =
|
|
714
|
+
let kh = light.position - r.o;
|
|
715
|
+
let projection = dot(kh, r.d);
|
|
716
|
+
let ba = kh - projection * r.d;
|
|
717
717
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
718
718
|
return INF;
|
|
719
719
|
}
|
|
@@ -756,9 +756,9 @@ light.radiusOrSpread <= 0.0
|
|
|
756
756
|
|
|
757
757
|
else if (dO == SPOT_LIGHT) {
|
|
758
758
|
if (light.radiusOrSpread <= 0.0) {
|
|
759
|
-
let
|
|
760
|
-
let projection = dot(
|
|
761
|
-
let ba =
|
|
759
|
+
let kh = light.position - r.o;
|
|
760
|
+
let projection = dot(kh, r.d);
|
|
761
|
+
let ba = kh - projection * r.d;
|
|
762
762
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
763
763
|
return INF;
|
|
764
764
|
}
|
|
@@ -774,9 +774,9 @@ d = ht(light.radiusOrSpread, light.position, r);
|
|
|
774
774
|
(*lightSample).isDelta = false;
|
|
775
775
|
}
|
|
776
776
|
if (d != INF) {
|
|
777
|
-
let
|
|
778
|
-
let
|
|
779
|
-
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; }
|
|
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 * mr * select(
|
|
789
789
|
1.0,
|
|
790
790
|
1.0 / max(d * d, 1e-8),
|
|
791
791
|
light.radiusOrSpread <= 0.0
|
|
@@ -821,44 +821,44 @@ var w20 = m20.y * eZ.z;
|
|
|
821
821
|
var w21 = m21.y * eZ.z;
|
|
822
822
|
var w22 = m22.y * eZ.z;
|
|
823
823
|
|
|
824
|
-
var
|
|
824
|
+
var hg = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
825
825
|
|
|
826
|
-
w00 = w00 /
|
|
827
|
-
w01 = w01 /
|
|
828
|
-
w02 = w02 /
|
|
829
|
-
w10 = w10 /
|
|
830
|
-
w11 = w11 /
|
|
831
|
-
w12 = w12 /
|
|
832
|
-
w20 = w20 /
|
|
833
|
-
w21 = w21 /
|
|
834
|
-
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;
|
|
835
835
|
|
|
836
836
|
let rand = eo(0u);
|
|
837
|
-
var
|
|
837
|
+
var mV: f32;
|
|
838
838
|
if (rand < w00) {
|
|
839
|
-
|
|
839
|
+
mV = m00.x;
|
|
840
840
|
} else if (rand < w01) {
|
|
841
|
-
|
|
841
|
+
mV = m01.x;
|
|
842
842
|
} else if (rand < w02) {
|
|
843
|
-
|
|
843
|
+
mV = m02.x;
|
|
844
844
|
} else if (rand < w10) {
|
|
845
|
-
|
|
845
|
+
mV = m10.x;
|
|
846
846
|
} else if (rand < w11) {
|
|
847
|
-
|
|
847
|
+
mV = m11.x;
|
|
848
848
|
} else if (rand < w12) {
|
|
849
|
-
|
|
849
|
+
mV = m12.x;
|
|
850
850
|
} else if (rand < w20) {
|
|
851
|
-
|
|
851
|
+
mV = m20.x;
|
|
852
852
|
} else if (rand < w21) {
|
|
853
|
-
|
|
853
|
+
mV = m21.x;
|
|
854
854
|
} else {
|
|
855
|
-
|
|
855
|
+
mV = m22.x;
|
|
856
856
|
}
|
|
857
|
-
return i32(
|
|
857
|
+
return i32(mV);
|
|
858
858
|
}
|
|
859
859
|
|
|
860
|
-
fn
|
|
861
|
-
|
|
860
|
+
fn lM(
|
|
861
|
+
oR: i32,
|
|
862
862
|
index: vec3i,
|
|
863
863
|
eZ: vec3f
|
|
864
864
|
) -> i32 {
|
|
@@ -868,31 +868,31 @@ let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisot
|
|
|
868
868
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
869
869
|
return fj(m0, m1, m2, eZ);
|
|
870
870
|
}
|
|
871
|
-
return
|
|
871
|
+
return oR;
|
|
872
872
|
}
|
|
873
873
|
|
|
874
874
|
|
|
875
875
|
|
|
876
876
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
877
|
-
fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f,
|
|
878
|
-
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;
|
|
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 * nT.y - dp2 * nS.y) / determinant;
|
|
885
|
+
let db = (dp2 * nS.x - dp1 * nT.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
|
}
|
|
889
889
|
t -= normal * dot(normal, t);
|
|
890
890
|
if (dot(t, t) < 1e-8) {
|
|
891
|
-
let
|
|
892
|
-
let dW = -1.0 / (
|
|
891
|
+
let ie = select(-1.0, 1.0, normal.z >= 0.0);
|
|
892
|
+
let dW = -1.0 / (ie + normal.z);
|
|
893
893
|
let xy = normal.x * normal.y * dW;
|
|
894
|
-
t = vec3f(1.0 +
|
|
895
|
-
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);
|
|
896
896
|
}
|
|
897
897
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
898
898
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
@@ -915,22 +915,22 @@ let uvProjection = i32(material.uvProjection);
|
|
|
915
915
|
let i0 = index.x;
|
|
916
916
|
let i1 = index.y;
|
|
917
917
|
let i2 = index.z;
|
|
918
|
-
let
|
|
918
|
+
let oP = uvProjection == ${uvProjectionConstants.spherical};
|
|
919
919
|
|
|
920
920
|
var normal: vec3f = (*si).normal;
|
|
921
|
-
var
|
|
921
|
+
var gV: vec3f;
|
|
922
922
|
var n0 = vec3f(0.0);
|
|
923
923
|
var n1 = vec3f(0.0);
|
|
924
924
|
var n2 = vec3f(0.0);
|
|
925
925
|
|
|
926
926
|
|
|
927
|
-
if (!bU ||
|
|
927
|
+
if (!bU || oP) {
|
|
928
928
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
929
929
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
930
930
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
931
|
-
|
|
931
|
+
gV = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
|
|
932
932
|
if (!bU) {
|
|
933
|
-
normal =
|
|
933
|
+
normal = gV;
|
|
934
934
|
}
|
|
935
935
|
}
|
|
936
936
|
|
|
@@ -965,7 +965,7 @@ if (fq >= 0) {
|
|
|
965
965
|
(*si).materialIndex = fq;
|
|
966
966
|
}
|
|
967
967
|
else {
|
|
968
|
-
(*si).materialIndex =
|
|
968
|
+
(*si).materialIndex = lM(
|
|
969
969
|
(*si).materialIndex,
|
|
970
970
|
index,
|
|
971
971
|
eZ
|
|
@@ -974,7 +974,7 @@ eZ
|
|
|
974
974
|
|
|
975
975
|
if (uvProjection > 0) {
|
|
976
976
|
|
|
977
|
-
uv =
|
|
977
|
+
uv = gC(uvProjection, (*si).position, select(normal, gV, oP));
|
|
978
978
|
cX = uv;
|
|
979
979
|
}
|
|
980
980
|
|
|
@@ -1012,21 +1012,21 @@ fU = eD(normal, dp1, dp2, a-c, b-c, select(aU, vec4f(0.0), aU.w == 0.0));
|
|
|
1012
1012
|
(*si).directionBitangent = fU[1];
|
|
1013
1013
|
${hasCoatNormals ? /* wgsl */ `
|
|
1014
1014
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1015
|
-
let
|
|
1016
|
-
var
|
|
1017
|
-
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) {
|
|
1018
1018
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1019
1019
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1020
1020
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1021
|
-
|
|
1021
|
+
lW = eD(normal, dp1, dp2, a-c, b-c,
|
|
1022
1022
|
select(aU, vec4f(0.0), aU.w == 0.0));
|
|
1023
1023
|
}
|
|
1024
1024
|
|
|
1025
1025
|
|
|
1026
|
-
let decoded = sampleMap(
|
|
1026
|
+
let decoded = sampleMap(ku, getMapUvSet(ku, uv,
|
|
1027
1027
|
select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1028
|
-
let mapped =
|
|
1029
|
-
+
|
|
1028
|
+
let mapped = lW[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1029
|
+
+ lW[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1030
1030
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1031
1031
|
}
|
|
1032
1032
|
` : ''}
|
|
@@ -1041,14 +1041,14 @@ if (!bU) {
|
|
|
1041
1041
|
|
|
1042
1042
|
|
|
1043
1043
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1044
|
-
let
|
|
1044
|
+
let kf = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
|
|
1045
1045
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1046
1046
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1047
1047
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1048
1048
|
var h = a * eZ.x * (eZ.x - 1.0)
|
|
1049
1049
|
+ (a + b + c) * eZ.x * eZ.y
|
|
1050
1050
|
+ b * eZ.y * (eZ.y - 1.0);
|
|
1051
|
-
if (dot(
|
|
1051
|
+
if (dot(kf, geometricNormal) > 0.0) {
|
|
1052
1052
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1053
1053
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1054
1054
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1066,17 +1066,17 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1066
1066
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1067
1067
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1068
1068
|
}
|
|
1069
|
-
(*si).shadowOffset =
|
|
1069
|
+
(*si).shadowOffset = kf * h;
|
|
1070
1070
|
}
|
|
1071
1071
|
(*si).uv = uv;
|
|
1072
1072
|
(*si).uv1 = cX;
|
|
1073
1073
|
if (USE_NORMAL_MAPS) {
|
|
1074
1074
|
let dp1 = tri.p0 - tri.p2;
|
|
1075
1075
|
let dp2 = tri.p1 - tri.p2;
|
|
1076
|
-
let
|
|
1077
|
-
let
|
|
1078
|
-
(*si).normal =
|
|
1079
|
-
(*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
|
|
1080
1080
|
);
|
|
1081
1081
|
}
|
|
1082
1082
|
}
|
|
@@ -1090,7 +1090,7 @@ barycentric: vec3f,
|
|
|
1090
1090
|
|
|
1091
1091
|
|
|
1092
1092
|
|
|
1093
|
-
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 {
|
|
1094
1094
|
var ti: eB;
|
|
1095
1095
|
|
|
1096
1096
|
|
|
@@ -1111,9 +1111,9 @@ p2t = p2t.zxy;
|
|
|
1111
1111
|
|
|
1112
1112
|
|
|
1113
1113
|
|
|
1114
|
-
p0t = vec3f(p0t.xy +
|
|
1115
|
-
p1t = vec3f(p1t.xy +
|
|
1116
|
-
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);
|
|
1117
1117
|
|
|
1118
1118
|
|
|
1119
1119
|
var e = vec3f(
|
|
@@ -1125,9 +1125,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1125
1125
|
if (DEPTH_QUERY_MODE) {
|
|
1126
1126
|
|
|
1127
1127
|
|
|
1128
|
-
let
|
|
1128
|
+
let rt = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1129
1129
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1130
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1130
|
+
e = select(e, vec3f(0.0), abs(e) <= rt * 1e-6);
|
|
1131
1131
|
}
|
|
1132
1132
|
|
|
1133
1133
|
|
|
@@ -1138,19 +1138,19 @@ return ti;
|
|
|
1138
1138
|
let det = e.x + e.y + e.z;
|
|
1139
1139
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1140
1140
|
|
|
1141
|
-
p0t.z *=
|
|
1142
|
-
p1t.z *=
|
|
1143
|
-
p2t.z *=
|
|
1144
|
-
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);
|
|
1145
1145
|
|
|
1146
1146
|
|
|
1147
|
-
if (abs(
|
|
1147
|
+
if (abs(rd) > abs(tMax * det)) {
|
|
1148
1148
|
return ti;
|
|
1149
1149
|
}
|
|
1150
1150
|
|
|
1151
|
-
let
|
|
1152
|
-
ti.t =
|
|
1153
|
-
ti.barycentric = e *
|
|
1151
|
+
let sm = 1. / det;
|
|
1152
|
+
ti.t = rd * sm;
|
|
1153
|
+
ti.barycentric = e * sm;
|
|
1154
1154
|
|
|
1155
1155
|
return ti;
|
|
1156
1156
|
}
|
|
@@ -1165,21 +1165,21 @@ if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
|
1165
1165
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1166
1166
|
}
|
|
1167
1167
|
|
|
1168
|
-
fn eV(
|
|
1168
|
+
fn eV(gx: vec3f, o: vec3f) -> vec3f {
|
|
1169
1169
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1170
|
-
return abs(
|
|
1170
|
+
return abs(gx) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1171
1171
|
}
|
|
1172
1172
|
|
|
1173
1173
|
|
|
1174
1174
|
|
|
1175
|
-
fn cM(o: vec3f,
|
|
1176
|
-
let
|
|
1177
|
-
let
|
|
1178
|
-
let bJ = eV(
|
|
1179
|
-
let
|
|
1180
|
-
let
|
|
1181
|
-
let t0 = max(
|
|
1182
|
-
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));
|
|
1183
1183
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1184
1184
|
}
|
|
1185
1185
|
|
|
@@ -1187,7 +1187,7 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1187
1187
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1188
1188
|
}
|
|
1189
1189
|
|
|
1190
|
-
fn
|
|
1190
|
+
fn mj(d: vec3f, ey: i32) -> vec3f {
|
|
1191
1191
|
|
|
1192
1192
|
|
|
1193
1193
|
if (ey == 0) {
|
|
@@ -1199,9 +1199,9 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
|
1199
1199
|
}
|
|
1200
1200
|
}
|
|
1201
1201
|
|
|
1202
|
-
fn
|
|
1202
|
+
fn lX(
|
|
1203
1203
|
si: ptr<function, ad>,
|
|
1204
|
-
|
|
1204
|
+
lp: fu,
|
|
1205
1205
|
aB: vec3f,
|
|
1206
1206
|
hs: vec3i,
|
|
1207
1207
|
bU: bool,
|
|
@@ -1221,7 +1221,7 @@ bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
|
|
|
1221
1221
|
|
|
1222
1222
|
hp(
|
|
1223
1223
|
si,
|
|
1224
|
-
|
|
1224
|
+
lp,
|
|
1225
1225
|
aB,
|
|
1226
1226
|
hs,
|
|
1227
1227
|
bU,
|
|
@@ -1269,7 +1269,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
|
1269
1269
|
|
|
1270
1270
|
|
|
1271
1271
|
|
|
1272
|
-
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) {
|
|
1273
1273
|
|
|
1274
1274
|
(*si).hit = false;
|
|
1275
1275
|
|
|
@@ -1279,24 +1279,24 @@ return;
|
|
|
1279
1279
|
|
|
1280
1280
|
var tMax = RAY_MAX_DISTANCE;
|
|
1281
1281
|
var ey: i32;
|
|
1282
|
-
var
|
|
1282
|
+
var gL: vec3f;
|
|
1283
1283
|
|
|
1284
1284
|
var hs: vec3i;
|
|
1285
|
-
var
|
|
1285
|
+
var lp: fu;
|
|
1286
1286
|
var ao: i32;
|
|
1287
|
-
var
|
|
1287
|
+
var hK: i32 = (*si).triangleIndex;
|
|
1288
1288
|
|
|
1289
1289
|
${getBVHTraverseCode(`
|
|
1290
1290
|
(*si).triangleIndex = triangleIndex;
|
|
1291
|
-
|
|
1291
|
+
lp = tri;
|
|
1292
1292
|
hs = index;
|
|
1293
1293
|
ao = cf;
|
|
1294
1294
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
1295
1295
|
|
|
1296
|
-
if (
|
|
1297
|
-
|
|
1296
|
+
if (qT) {
|
|
1297
|
+
lX(
|
|
1298
1298
|
si,
|
|
1299
|
-
|
|
1299
|
+
lp,
|
|
1300
1300
|
aB,
|
|
1301
1301
|
hs,
|
|
1302
1302
|
bU,
|
|
@@ -1309,7 +1309,7 @@ eU,
|
|
|
1309
1309
|
}
|
|
1310
1310
|
|
|
1311
1311
|
|
|
1312
|
-
fn
|
|
1312
|
+
fn iH(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
|
|
1313
1313
|
(*si).hit = false;
|
|
1314
1314
|
|
|
1315
1315
|
if (rtUniform.isEmpty > 0) {
|
|
@@ -1318,18 +1318,18 @@ return;
|
|
|
1318
1318
|
|
|
1319
1319
|
let bounces = 0;
|
|
1320
1320
|
let doubleSided = true;
|
|
1321
|
-
let
|
|
1321
|
+
let lq = false;
|
|
1322
1322
|
var tMax = maxDistance;
|
|
1323
1323
|
var ey: i32;
|
|
1324
|
-
var
|
|
1324
|
+
var gL: vec3f;
|
|
1325
1325
|
var hs: vec3i;
|
|
1326
|
-
var
|
|
1326
|
+
var lp: fu;
|
|
1327
1327
|
var ao: i32;
|
|
1328
|
-
var
|
|
1328
|
+
var hK: i32 = -1;
|
|
1329
1329
|
|
|
1330
1330
|
${getBVHTraverseCode(`
|
|
1331
1331
|
(*si).triangleIndex = triangleIndex;
|
|
1332
|
-
|
|
1332
|
+
lp = tri;
|
|
1333
1333
|
hs = index;
|
|
1334
1334
|
ao = cf;
|
|
1335
1335
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
@@ -1338,14 +1338,14 @@ continue;
|
|
|
1338
1338
|
}
|
|
1339
1339
|
`)}
|
|
1340
1340
|
|
|
1341
|
-
if (
|
|
1341
|
+
if (qT) {
|
|
1342
1342
|
(*si).instanceIndex = ao;
|
|
1343
1343
|
(*si).normal = eC;
|
|
1344
1344
|
(*si).position = eU;
|
|
1345
1345
|
(*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
1346
1346
|
hp(
|
|
1347
1347
|
si,
|
|
1348
|
-
|
|
1348
|
+
lp,
|
|
1349
1349
|
aB,
|
|
1350
1350
|
hs,
|
|
1351
1351
|
bU,
|
|
@@ -1387,32 +1387,32 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1387
1387
|
}
|
|
1388
1388
|
}
|
|
1389
1389
|
|
|
1390
|
-
fn ex(ray: Ray, lightDistance: f32,
|
|
1390
|
+
fn ex(ray: Ray, lightDistance: f32, jG: i32) -> bool {
|
|
1391
1391
|
if (rtUniform.isEmpty > 0) {
|
|
1392
1392
|
return false;
|
|
1393
1393
|
}
|
|
1394
1394
|
|
|
1395
1395
|
let doubleSided = true;
|
|
1396
|
-
let
|
|
1397
|
-
var tMax =
|
|
1396
|
+
let qg = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1397
|
+
var tMax = qg;
|
|
1398
1398
|
var ey: i32;
|
|
1399
|
-
var
|
|
1399
|
+
var gL: vec3f;
|
|
1400
1400
|
|
|
1401
1401
|
let bounces = 1;
|
|
1402
|
-
var
|
|
1403
|
-
var
|
|
1402
|
+
var lq = false;
|
|
1403
|
+
var hK: i32 = jG;
|
|
1404
1404
|
|
|
1405
1405
|
${getBVHTraverseCode(
|
|
1406
1406
|
/*wgsl */ `
|
|
1407
1407
|
|
|
1408
1408
|
|
|
1409
1409
|
|
|
1410
|
-
var
|
|
1410
|
+
var jn = true;
|
|
1411
1411
|
|
|
1412
|
-
if (
|
|
1412
|
+
if (jn) {
|
|
1413
1413
|
if (HAS_ALPHA) {
|
|
1414
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
1415
|
-
if (!
|
|
1414
|
+
let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
|
|
1415
|
+
if (!nr(
|
|
1416
1416
|
materialIndex,
|
|
1417
1417
|
index,
|
|
1418
1418
|
aB,
|
|
@@ -1420,12 +1420,12 @@ eU,
|
|
|
1420
1420
|
eC
|
|
1421
1421
|
)) {
|
|
1422
1422
|
|
|
1423
|
-
tMax =
|
|
1424
|
-
|
|
1423
|
+
tMax = qg;
|
|
1424
|
+
jn = false;
|
|
1425
1425
|
}
|
|
1426
1426
|
}
|
|
1427
1427
|
}
|
|
1428
|
-
if (
|
|
1428
|
+
if (jn) {
|
|
1429
1429
|
return true;
|
|
1430
1430
|
}
|
|
1431
1431
|
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|