@meimu/mutracer 0.1.3 → 0.1.4
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 +4114 -4015
- package/docs/api.md +11 -9
- package/docs/threejs.md +30 -4
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- 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 +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +12 -6
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +7 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
- 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 +40 -39
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +78 -78
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +93 -59
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- 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 +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- 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 +1 -1
|
@@ -8,35 +8,35 @@ 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 = fL(o, d, tri, ey, gP, 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
|
-
|
|
16
|
-
let
|
|
17
|
-
let
|
|
18
|
-
if (!doubleSided && !
|
|
19
|
-
|
|
15
|
+
eD = normalize(cross(e1, e2));
|
|
16
|
+
let kk = i32(ae(bitcast<i32>(ou.z)).x);
|
|
17
|
+
let iN = materialsBuffer[kk].doubleSided > 0.5;
|
|
18
|
+
if (!doubleSided && !iN && dot(eD, d) > 0.0) {
|
|
19
|
+
eD = vec3f(0.0);
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
rb = true;
|
|
25
|
+
ox = true;
|
|
26
|
+
eY = o + tMax * d;
|
|
27
27
|
aB = hit.barycentric;
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
};
|
|
31
31
|
function getPDMDisplacmentCode(anyHit) {
|
|
32
32
|
return /*wgsl */ `
|
|
33
|
-
let
|
|
33
|
+
let kX = pc(
|
|
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
|
+
kJ(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
|
+
lD
|
|
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 = ou.w;
|
|
55
|
+
let tA = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
57
|
+
let materialIndex = i32(ae(bitcast<i32>(ou.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 && tA > 0) {
|
|
68
|
+
let minH = f32(tA >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(tA & 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
|
-
|
|
80
|
+
if (kX.t < tMax) {
|
|
81
|
+
eD = kX.normal;
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
tMax =
|
|
84
|
+
tMax = kX.t;
|
|
85
85
|
|
|
86
|
-
aB =
|
|
87
|
-
|
|
86
|
+
aB = kX.barycentric;
|
|
87
|
+
eY = o + tMax * d;
|
|
88
88
|
|
|
89
89
|
bU = true;
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
rb = true;
|
|
91
|
+
ox = true;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
@@ -112,118 +112,118 @@ f32(value >> 24u)
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
fn
|
|
115
|
+
fn kx(value: u32) -> u32 {
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn nZ(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn ov(
|
|
124
124
|
node: i32,
|
|
125
|
-
|
|
125
|
+
tk: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
gC: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
|
-
let i = node +
|
|
131
|
+
let i = node + tk;
|
|
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 rG = bitcast<i32>((header & 0xffu) << 24u) >> 24;
|
|
137
|
+
let rH = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
|
|
138
|
+
let rI = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
|
|
139
|
+
let hJ = vec3f(
|
|
140
|
+
bitcast<f32>(u32(rG + 127) << 23u),
|
|
141
|
+
bitcast<f32>(u32(rH + 127) << 23u),
|
|
142
|
+
bitcast<f32>(u32(rI + 127) << 23u)
|
|
143
143
|
);
|
|
144
|
-
let bJ =
|
|
145
|
-
let
|
|
146
|
-
let
|
|
147
|
-
let
|
|
148
|
-
let
|
|
149
|
-
let
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
let
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
let
|
|
157
|
-
let
|
|
158
|
-
let
|
|
159
|
-
|
|
160
|
-
let
|
|
161
|
-
let
|
|
162
|
-
let
|
|
163
|
-
let
|
|
164
|
-
let
|
|
165
|
-
let
|
|
166
|
-
let
|
|
167
|
-
max((min(
|
|
168
|
-
(min(
|
|
144
|
+
let bJ = eZ(gC, o);
|
|
145
|
+
let eI = (n0.xyz - o) * gC;
|
|
146
|
+
let dc = hJ * gC;
|
|
147
|
+
let wy = bp(bitcast<u32>(n2.x));
|
|
148
|
+
let wB = bp(bitcast<u32>(n2.y));
|
|
149
|
+
let wC = bp(bitcast<u32>(n2.z));
|
|
150
|
+
let wE = bp(bitcast<u32>(n2.w));
|
|
151
|
+
let wF = bp(bitcast<u32>(n3.x));
|
|
152
|
+
let wG = bp(bitcast<u32>(n3.y));
|
|
153
|
+
let ws = bp(bitcast<u32>(n3.z));
|
|
154
|
+
let wt = bp(bitcast<u32>(n3.w));
|
|
155
|
+
let wu = bp(bitcast<u32>(n4.x));
|
|
156
|
+
let wv = bp(bitcast<u32>(n4.y));
|
|
157
|
+
let ww = bp(bitcast<u32>(n4.z));
|
|
158
|
+
let wx = bp(bitcast<u32>(n4.w));
|
|
159
|
+
|
|
160
|
+
let vp = wy * dc.x + eI.x;
|
|
161
|
+
let vs = wC * dc.y + eI.y;
|
|
162
|
+
let vu = wF * dc.z + eI.z;
|
|
163
|
+
let vj = ws * dc.x + eI.x;
|
|
164
|
+
let vl = wu * dc.y + eI.y;
|
|
165
|
+
let vn = ww * dc.z + eI.z;
|
|
166
|
+
let wI = max(
|
|
167
|
+
max((min(vp, vj) - vec4f(bJ.x)), (min(vs, vl) - vec4f(bJ.y))),
|
|
168
|
+
(min(vu, vn) - vec4f(bJ.z))
|
|
169
169
|
);
|
|
170
|
-
let
|
|
171
|
-
min((max(
|
|
172
|
-
(max(
|
|
170
|
+
let wn = min(
|
|
171
|
+
min((max(vp, vj) + vec4f(bJ.x)), (max(vs, vl) + vec4f(bJ.y))),
|
|
172
|
+
(max(vu, vn) + vec4f(bJ.z))
|
|
173
173
|
);
|
|
174
174
|
|
|
175
|
-
let
|
|
176
|
-
let
|
|
177
|
-
let
|
|
178
|
-
let
|
|
179
|
-
let
|
|
180
|
-
let
|
|
181
|
-
let
|
|
182
|
-
max((min(
|
|
183
|
-
(min(
|
|
175
|
+
let vq = wB * dc.x + eI.x;
|
|
176
|
+
let vt = wE * dc.y + eI.y;
|
|
177
|
+
let vw = wG * dc.z + eI.z;
|
|
178
|
+
let vk = wt * dc.x + eI.x;
|
|
179
|
+
let vm = wv * dc.y + eI.y;
|
|
180
|
+
let vo = wx * dc.z + eI.z;
|
|
181
|
+
let wJ = max(
|
|
182
|
+
max((min(vq, vk) - vec4f(bJ.x)), (min(vt, vm) - vec4f(bJ.y))),
|
|
183
|
+
(min(vw, vo) - vec4f(bJ.z))
|
|
184
184
|
);
|
|
185
|
-
let
|
|
186
|
-
min((max(
|
|
187
|
-
(max(
|
|
185
|
+
let wo = min(
|
|
186
|
+
min((max(vq, vk) + vec4f(bJ.x)), (max(vt, vm) + vec4f(bJ.y))),
|
|
187
|
+
(max(vw, vo) + 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 uK = (wI <= min(wn, vec4f(tMax))) & (wn > vec4f(0.0));
|
|
191
|
+
let uL = (wJ <= min(wo, vec4f(tMax))) & (wo > vec4f(0.0));
|
|
192
|
+
return select(0u, 1u, uK.x)
|
|
193
|
+
| select(0u, 2u, uK.y)
|
|
194
|
+
| select(0u, 4u, uK.z)
|
|
195
|
+
| select(0u, 8u, uK.w)
|
|
196
|
+
| select(0u, 16u, uL.x)
|
|
197
|
+
| select(0u, 32u, uL.y)
|
|
198
|
+
| select(0u, 64u, uL.z)
|
|
199
|
+
| select(0u, 128u, uL.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 ou = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(ou.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 == hO) {
|
|
211
211
|
continue;
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
let r3 = bvhBuffer[triangleIndex];
|
|
215
215
|
let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
|
|
216
|
-
var tri =
|
|
216
|
+
var tri = fA(
|
|
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 ox = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (ox) {
|
|
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 mb: array<i32, TLAS_STACK_SIZE>;
|
|
235
|
+
var jh = -1;
|
|
236
|
+
var gC = fb(d);
|
|
237
237
|
var bU = false;
|
|
238
|
-
var
|
|
239
|
-
var
|
|
240
|
-
var
|
|
238
|
+
var rb = false;
|
|
239
|
+
var eY: vec3f;
|
|
240
|
+
var eD: 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, gC, tMax) > 0.0) {
|
|
245
|
+
jh = 0;
|
|
246
|
+
mb[0] = 0;
|
|
247
247
|
}
|
|
248
|
-
while (
|
|
249
|
-
let
|
|
250
|
-
|
|
248
|
+
while (jh >= 0) {
|
|
249
|
+
let sV = mb[jh];
|
|
250
|
+
jh--;
|
|
251
251
|
o = ray.o;
|
|
252
252
|
d = ray.d;
|
|
253
|
-
|
|
253
|
+
gC = fb(d);
|
|
254
254
|
|
|
255
|
-
let
|
|
256
|
-
let
|
|
257
|
-
if (
|
|
258
|
-
let left =
|
|
259
|
-
let right =
|
|
255
|
+
let wf = bvhBuffer[sV];
|
|
256
|
+
let eV = bitcast<i32>(wf.w);
|
|
257
|
+
if (eV >= 0) {
|
|
258
|
+
let left = sV + 2;
|
|
259
|
+
let right = eV;
|
|
260
260
|
let d0 = cM(
|
|
261
261
|
o,
|
|
262
262
|
bvhBuffer[left].xyz,
|
|
263
263
|
bvhBuffer[left + 1].xyz,
|
|
264
|
-
|
|
264
|
+
gC,
|
|
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
|
+
gC,
|
|
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) { jh++; mb[jh] = left; }
|
|
277
|
+
if (d1 > 0.0) { jh++; mb[jh] = right; }
|
|
278
278
|
}
|
|
279
279
|
else {
|
|
280
|
-
if (d1 > 0.0) {
|
|
281
|
-
if (d0 > 0.0) {
|
|
280
|
+
if (d1 > 0.0) { jh++; mb[jh] = right; }
|
|
281
|
+
if (d0 > 0.0) { jh++; mb[jh] = left; }
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
else {
|
|
285
|
-
let
|
|
285
|
+
let qJ = -eV;
|
|
286
286
|
|
|
287
287
|
|
|
288
288
|
for (
|
|
289
|
-
var
|
|
290
|
-
|
|
291
|
-
|
|
289
|
+
var mx = qJ - 1;
|
|
290
|
+
mx >= 0;
|
|
291
|
+
mx--
|
|
292
292
|
) {
|
|
293
|
-
let
|
|
294
|
-
let cf = bitcast<i32>(
|
|
295
|
-
let
|
|
296
|
-
let
|
|
293
|
+
let pI = bvhBuffer[sV + 2 + mx];
|
|
294
|
+
let cf = bitcast<i32>(pI.x);
|
|
295
|
+
let uU = bitcast<i32>(pI.y);
|
|
296
|
+
let ou = 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,214 +302,214 @@ 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
|
+
gC = fb(d);
|
|
306
306
|
ey = maxDimension(abs(d));
|
|
307
|
-
|
|
307
|
+
gP = mv(d, ey);
|
|
308
308
|
|
|
309
|
-
let
|
|
310
|
-
let
|
|
311
|
-
let blasOffset = i32(
|
|
309
|
+
let fJ = bitcast<u32>(ou.x);
|
|
310
|
+
let gR = fJ >> 30u;
|
|
311
|
+
let blasOffset = i32(fJ & 0x3fffffffu);
|
|
312
312
|
let bo = rtUniform.blasOffset;
|
|
313
313
|
|
|
314
314
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
315
|
-
if (
|
|
315
|
+
if (gR == 3u) {
|
|
316
316
|
|
|
317
317
|
|
|
318
318
|
|
|
319
319
|
|
|
320
|
-
var
|
|
321
|
-
var
|
|
322
|
-
var
|
|
323
|
-
var
|
|
320
|
+
var sm: array<vec2u, BLAS_STACK_SIZE>;
|
|
321
|
+
var pn = -1;
|
|
322
|
+
var rX = 0u;
|
|
323
|
+
var kZ = 0u;
|
|
324
324
|
|
|
325
325
|
var ep = 0x80000000u;
|
|
326
|
-
let
|
|
326
|
+
let ut = 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 ql = 7u - ut;
|
|
330
330
|
|
|
331
331
|
|
|
332
332
|
|
|
333
333
|
|
|
334
|
-
while (
|
|
335
|
-
|
|
334
|
+
while (rX < 4096u) {
|
|
335
|
+
rX++;
|
|
336
336
|
|
|
337
337
|
let internalMask = ep & 0xffu;
|
|
338
|
-
let
|
|
339
|
-
|
|
340
|
-
ep &= ~(1u <<
|
|
338
|
+
let qh =
|
|
339
|
+
kx(ep >> 24u) + 24u;
|
|
340
|
+
ep &= ~(1u << qh);
|
|
341
341
|
if ((ep & 0xff000000u) != 0u) {
|
|
342
|
-
|
|
342
|
+
pn++;
|
|
343
343
|
|
|
344
|
-
|
|
344
|
+
sm[pn] = vec2u(kZ, 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 = (qh - 24u) ^ ql;
|
|
348
|
+
let ns = (1u << slot) - 1u;
|
|
349
|
+
let relativeIndex = countOneBits(internalMask & ns);
|
|
350
|
+
let sk = kZ + relativeIndex;
|
|
351
|
+
let node = blasOffset + i32(sk * 5u);
|
|
352
|
+
let jA = bvhBuffer[node + bo];
|
|
353
|
+
let ue = ov(
|
|
354
|
+
node, bo, jA, o, gC, tMax
|
|
355
355
|
);
|
|
356
356
|
|
|
357
357
|
|
|
358
358
|
ep = 0u;
|
|
359
|
-
if (
|
|
360
|
-
let
|
|
361
|
-
let
|
|
362
|
-
var
|
|
363
|
-
var
|
|
364
|
-
while (
|
|
365
|
-
let
|
|
366
|
-
|
|
367
|
-
let
|
|
368
|
-
bitcast<u32>(
|
|
369
|
-
bitcast<u32>(
|
|
370
|
-
|
|
359
|
+
if (ue != 0u) {
|
|
360
|
+
let fF = bvhBuffer[node + bo + 1];
|
|
361
|
+
let rO = bitcast<u32>(jA.w) >> 24u;
|
|
362
|
+
var tv = 0u;
|
|
363
|
+
var kg = ue;
|
|
364
|
+
while (kg != 0u) {
|
|
365
|
+
let rC = kx(kg);
|
|
366
|
+
kg &= ~(1u << rC);
|
|
367
|
+
let sE = select(
|
|
368
|
+
bitcast<u32>(fF.z),
|
|
369
|
+
bitcast<u32>(fF.w),
|
|
370
|
+
rC >= 4u
|
|
371
371
|
);
|
|
372
|
-
let
|
|
373
|
-
(
|
|
374
|
-
let
|
|
375
|
-
let
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
372
|
+
let td =
|
|
373
|
+
(sE >> ((rC & 3u) * 8u)) & 0xffu;
|
|
374
|
+
let jC = td & 0x1fu;
|
|
375
|
+
let uT = select(
|
|
376
|
+
jC,
|
|
377
|
+
jC ^ ql,
|
|
378
|
+
jC >= 24u
|
|
379
379
|
);
|
|
380
|
-
let
|
|
381
|
-
|
|
380
|
+
let uO = (td >> 5u) & 0x7u;
|
|
381
|
+
tv |= uO << uT;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
|
|
385
|
-
ep = (
|
|
386
|
-
let
|
|
387
|
-
var
|
|
388
|
-
while (
|
|
389
|
-
let
|
|
390
|
-
|
|
384
|
+
kZ = bitcast<u32>(fF.x);
|
|
385
|
+
ep = (tv & 0xff000000u) | rO;
|
|
386
|
+
let oQ = bitcast<u32>(fF.y);
|
|
387
|
+
var oR = tv & 0x00ffffffu;
|
|
388
|
+
while (oR != 0u) {
|
|
389
|
+
let nT = nZ(oR);
|
|
390
|
+
oR &= ~(1u << nT);
|
|
391
391
|
let bh = 1;
|
|
392
392
|
let primitiveOffset = bo + blasOffset
|
|
393
|
-
+ i32(
|
|
393
|
+
+ i32(oQ + nT);
|
|
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 (pn >= 0) {
|
|
400
|
+
let qm = sm[pn];
|
|
401
|
+
kZ = qm.x;
|
|
402
|
+
ep = qm.y;
|
|
403
|
+
pn--;
|
|
404
404
|
}
|
|
405
405
|
else { break; }
|
|
406
406
|
}
|
|
407
407
|
}
|
|
408
408
|
` : ''}
|
|
409
409
|
|
|
410
|
-
var
|
|
411
|
-
var
|
|
412
|
-
if (
|
|
413
|
-
|
|
410
|
+
var gt: array<i32, BLAS_STACK_SIZE>;
|
|
411
|
+
var dS = -1;
|
|
412
|
+
if (gR != 3u) {
|
|
413
|
+
dS = 0;
|
|
414
414
|
|
|
415
|
-
|
|
415
|
+
gt[0] = uU;
|
|
416
416
|
}
|
|
417
417
|
|
|
418
|
-
while (
|
|
418
|
+
while (dS >= 0) {
|
|
419
419
|
|
|
420
|
-
let node =
|
|
421
|
-
|
|
420
|
+
let node = gt[dS];
|
|
421
|
+
dS--;
|
|
422
422
|
var bh = 0;
|
|
423
423
|
var primitiveOffset = 0;
|
|
424
424
|
|
|
425
425
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
426
|
-
if (
|
|
426
|
+
if (gR == 2u) {
|
|
427
427
|
let i = node + bo;
|
|
428
|
-
let
|
|
429
|
-
let
|
|
430
|
-
let
|
|
431
|
-
let
|
|
432
|
-
bh = i32(bitcast<u32>(
|
|
428
|
+
let uY = bvhBuffer[i];
|
|
429
|
+
let uZ = bvhBuffer[i + 1];
|
|
430
|
+
let va = bvhBuffer[i + 2];
|
|
431
|
+
let vb = bvhBuffer[i + 3];
|
|
432
|
+
bh = i32(bitcast<u32>(va.w));
|
|
433
433
|
if (bh > 0) {
|
|
434
434
|
primitiveOffset = bo + blasOffset
|
|
435
|
-
+ i32(bitcast<u32>(
|
|
435
|
+
+ i32(bitcast<u32>(vb.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>(uY.w) * 4u);
|
|
439
|
+
let right = blasOffset + i32(bitcast<u32>(uZ.w) * 4u);
|
|
440
|
+
let oy = cM(
|
|
441
|
+
o, uY.xyz, uZ.xyz, gC, tMax
|
|
442
442
|
);
|
|
443
|
-
let
|
|
444
|
-
o,
|
|
443
|
+
let nu = cM(
|
|
444
|
+
o, va.xyz, vb.xyz, gC, tMax
|
|
445
445
|
);
|
|
446
|
-
if (
|
|
447
|
-
if (
|
|
448
|
-
|
|
446
|
+
if (oy > nu) {
|
|
447
|
+
if (oy > 0.0) {
|
|
448
|
+
dS++; gt[dS] = left;
|
|
449
449
|
}
|
|
450
|
-
if (
|
|
451
|
-
|
|
450
|
+
if (nu > 0.0) {
|
|
451
|
+
dS++; gt[dS] = right;
|
|
452
452
|
}
|
|
453
453
|
}
|
|
454
454
|
else {
|
|
455
|
-
if (
|
|
456
|
-
|
|
455
|
+
if (nu > 0.0) {
|
|
456
|
+
dS++; gt[dS] = right;
|
|
457
457
|
}
|
|
458
|
-
if (
|
|
459
|
-
|
|
458
|
+
if (oy > 0.0) {
|
|
459
|
+
dS++; gt[dS] = 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 (gR == 1u) {
|
|
467
|
+
let hW = bitcast<u32>(node);
|
|
468
|
+
if ((hW & 0x80000000u) != 0u) {
|
|
469
|
+
bh = i32((hW >> 23u) & 0xffu);
|
|
470
470
|
primitiveOffset = bo + blasOffset
|
|
471
|
-
+ i32(
|
|
471
|
+
+ i32(hW & 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 ui = bvhBuffer[i];
|
|
476
|
+
let ro = bvhBuffer[i + 1];
|
|
477
|
+
let rp = bvhBuffer[i + 2];
|
|
478
|
+
let rq = bvhBuffer[i + 3];
|
|
479
|
+
let nodeMin = ui.xyz;
|
|
480
|
+
let ec = vec3f(ui.w, ro.x, ro.y);
|
|
481
|
+
let mh = array<u32, 4>(
|
|
482
|
+
bitcast<u32>(ro.z), bitcast<u32>(ro.w),
|
|
483
|
+
bitcast<u32>(rp.x), bitcast<u32>(rp.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 =
|
|
498
|
-
let
|
|
485
|
+
let rw = unpack4x8unorm(bitcast<u32>(rp.z));
|
|
486
|
+
let rA = unpack4x8unorm(bitcast<u32>(rp.w));
|
|
487
|
+
let rB = unpack4x8unorm(bitcast<u32>(rq.x));
|
|
488
|
+
let rt = unpack4x8unorm(bitcast<u32>(rq.y));
|
|
489
|
+
let ru = unpack4x8unorm(bitcast<u32>(rq.z));
|
|
490
|
+
let rv = unpack4x8unorm(bitcast<u32>(rq.w));
|
|
491
|
+
let tx0 = (nodeMin.x + rw * ec.x - o.x) * gC.x;
|
|
492
|
+
let tx1 = (nodeMin.x + rt * ec.x - o.x) * gC.x;
|
|
493
|
+
let ty0 = (nodeMin.y + rA * ec.y - o.y) * gC.y;
|
|
494
|
+
let ty1 = (nodeMin.y + ru * ec.y - o.y) * gC.y;
|
|
495
|
+
let tz0 = (nodeMin.z + rB * ec.z - o.z) * gC.z;
|
|
496
|
+
let tz1 = (nodeMin.z + rv * ec.z - o.z) * gC.z;
|
|
497
|
+
let bJ = eZ(gC, o);
|
|
498
|
+
let mL = 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 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(
|
|
506
|
+
var distance = select(rU, mL, mL > vec4f(0.0));
|
|
507
507
|
distance = select(
|
|
508
508
|
distance,
|
|
509
509
|
vec4f(-1.0),
|
|
510
|
-
|
|
510
|
+
mL > min(rU, vec4f(tMax))
|
|
511
511
|
);
|
|
512
|
-
var
|
|
512
|
+
var fd = array<f32, 4>(
|
|
513
513
|
distance.x,
|
|
514
514
|
distance.y,
|
|
515
515
|
distance.z,
|
|
@@ -522,29 +522,29 @@ var dX = -1.0;
|
|
|
522
522
|
var el = -1;
|
|
523
523
|
for (var child = 0; child < 4; child++) {
|
|
524
524
|
if (
|
|
525
|
-
|
|
526
|
-
|
|
525
|
+
mh[child] != 0u &&
|
|
526
|
+
fd[child] > dX
|
|
527
527
|
) {
|
|
528
|
-
dX =
|
|
528
|
+
dX = fd[child];
|
|
529
529
|
el = child;
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
532
|
if (el >= 0 && dX > 0.0) {
|
|
533
|
-
let
|
|
534
|
-
var
|
|
535
|
-
if ((
|
|
536
|
-
|
|
533
|
+
let nD = mh[el];
|
|
534
|
+
var jI = bitcast<i32>(nD);
|
|
535
|
+
if ((nD & 0x80000000u) == 0u) {
|
|
536
|
+
jI += blasOffset;
|
|
537
537
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
538
|
+
dS++;
|
|
539
|
+
gt[dS] = jI;
|
|
540
|
+
fd[el] = -1.0;
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
` : ''}
|
|
546
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
547
|
+
if (gR == 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
|
+
gC,
|
|
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
|
+
gC,
|
|
567
567
|
tMax
|
|
568
568
|
);
|
|
569
569
|
|
|
570
570
|
if (d0 > d1) {
|
|
571
571
|
if (d0 > 0.0) {
|
|
572
|
-
|
|
572
|
+
dS++; gt[dS] = left;
|
|
573
573
|
|
|
574
574
|
}
|
|
575
575
|
if (d1 > 0.0) {
|
|
576
|
-
|
|
576
|
+
dS++; gt[dS] = right;
|
|
577
577
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
else {
|
|
581
581
|
if (d1 > 0.0) {
|
|
582
|
-
|
|
582
|
+
dS++; gt[dS] = right;
|
|
583
583
|
|
|
584
584
|
}
|
|
585
585
|
if (d0 > 0.0) {
|
|
586
|
-
|
|
586
|
+
dS++; gt[dS] = left;
|
|
587
587
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
@@ -610,13 +610,13 @@ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirecti
|
|
|
610
610
|
${hasDisplacement ? displacementWgsl : ''}
|
|
611
611
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
612
612
|
|
|
613
|
-
struct
|
|
613
|
+
struct fA {
|
|
614
614
|
p0: vec3f,
|
|
615
615
|
p1: vec3f,
|
|
616
616
|
p2: vec3f,
|
|
617
617
|
};
|
|
618
618
|
|
|
619
|
-
fn
|
|
619
|
+
fn hx(rad: f32, pos: vec3f, r: Ray) -> f32 {
|
|
620
620
|
let op: vec3f = pos - r.o;
|
|
621
621
|
let eps: f32 = 0.001;
|
|
622
622
|
let b: f32 = dot(op, r.d);
|
|
@@ -639,7 +639,7 @@ return t2;
|
|
|
639
639
|
return INF;
|
|
640
640
|
}
|
|
641
641
|
|
|
642
|
-
fn
|
|
642
|
+
fn ni(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 jv = min(1.0, radius * radius / (aj * aj));
|
|
665
|
+
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 mz(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
670
670
|
|
|
671
671
|
|
|
672
672
|
var d: f32 = INF;
|
|
@@ -678,9 +678,9 @@ var d: f32 = INF;
|
|
|
678
678
|
(*lightSample).isDelta = false;
|
|
679
679
|
var u = light.u;
|
|
680
680
|
var v = light.v;
|
|
681
|
-
var
|
|
681
|
+
var dP = i32(light.litType);
|
|
682
682
|
|
|
683
|
-
if (
|
|
683
|
+
if (dP == RECT_LIGHT) {
|
|
684
684
|
|
|
685
685
|
var pos = light.position - u * 0.5 - v * 0.5;
|
|
686
686
|
var normal = normalize(cross(u, v));
|
|
@@ -688,7 +688,7 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
688
688
|
return INF;
|
|
689
689
|
}
|
|
690
690
|
|
|
691
|
-
d =
|
|
691
|
+
d = ni(pos, u, v, normal, r);
|
|
692
692
|
if (d < 0.0) {
|
|
693
693
|
d = INF;
|
|
694
694
|
}
|
|
@@ -709,11 +709,11 @@ d = INF;
|
|
|
709
709
|
}
|
|
710
710
|
}
|
|
711
711
|
|
|
712
|
-
else if (
|
|
712
|
+
else if (dP == SPHERE_LIGHT) {
|
|
713
713
|
if (light.radiusOrSpread <= 0.0) {
|
|
714
|
-
let
|
|
715
|
-
let projection = dot(
|
|
716
|
-
let ba =
|
|
714
|
+
let ko = light.position - r.o;
|
|
715
|
+
let projection = dot(ko, r.d);
|
|
716
|
+
let ba = ko - projection * r.d;
|
|
717
717
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
718
718
|
return INF;
|
|
719
719
|
}
|
|
@@ -725,7 +725,7 @@ d = projection;
|
|
|
725
725
|
(*lightSample).isDelta = true;
|
|
726
726
|
}
|
|
727
727
|
else {
|
|
728
|
-
d =
|
|
728
|
+
d = hx(light.radiusOrSpread, light.position, r);
|
|
729
729
|
(*lightSample).isDelta = false;
|
|
730
730
|
if (d > 0.0 && d != INF) {
|
|
731
731
|
(*lightSample).direction = r.d;
|
|
@@ -754,11 +754,11 @@ light.radiusOrSpread <= 0.0
|
|
|
754
754
|
}
|
|
755
755
|
}
|
|
756
756
|
|
|
757
|
-
else if (
|
|
757
|
+
else if (dP == SPOT_LIGHT) {
|
|
758
758
|
if (light.radiusOrSpread <= 0.0) {
|
|
759
|
-
let
|
|
760
|
-
let projection = dot(
|
|
761
|
-
let ba =
|
|
759
|
+
let ko = light.position - r.o;
|
|
760
|
+
let projection = dot(ko, r.d);
|
|
761
|
+
let ba = ko - projection * r.d;
|
|
762
762
|
if (projection <= EPS || dot(ba, ba) > 1e-8) {
|
|
763
763
|
return INF;
|
|
764
764
|
}
|
|
@@ -770,13 +770,13 @@ d = projection;
|
|
|
770
770
|
(*lightSample).isDelta = true;
|
|
771
771
|
}
|
|
772
772
|
else {
|
|
773
|
-
d =
|
|
773
|
+
d = hx(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 ve = r.o + d * r.d;
|
|
778
|
+
let mC = bL(light, normalize(r.o - ve));
|
|
779
|
+
if (mC <= 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 * mC * select(
|
|
789
789
|
1.0,
|
|
790
790
|
1.0 / max(d * d, 1e-8),
|
|
791
791
|
light.radiusOrSpread <= 0.0
|
|
@@ -793,7 +793,7 @@ light.radiusOrSpread <= 0.0
|
|
|
793
793
|
}
|
|
794
794
|
}
|
|
795
795
|
|
|
796
|
-
else if (
|
|
796
|
+
else if (dP != RECT_LIGHT && dP != SPHERE_LIGHT && dP != SPOT_LIGHT) {
|
|
797
797
|
|
|
798
798
|
d = INF;
|
|
799
799
|
}
|
|
@@ -801,7 +801,7 @@ d = INF;
|
|
|
801
801
|
return d;
|
|
802
802
|
}
|
|
803
803
|
|
|
804
|
-
fn
|
|
804
|
+
fn fm(m0: vec3i, m1: vec3i, m2: vec3i, eK: vec3f) -> i32 {
|
|
805
805
|
let m00 = ae(m0.x);
|
|
806
806
|
let m01 = ae(m0.y);
|
|
807
807
|
let m02 = ae(m0.z);
|
|
@@ -811,101 +811,101 @@ let m12 = ae(m1.z);
|
|
|
811
811
|
let m20 = ae(m2.x);
|
|
812
812
|
let m21 = ae(m2.y);
|
|
813
813
|
let m22 = ae(m2.z);
|
|
814
|
-
var w00 = m00.y *
|
|
815
|
-
var w01 = m01.y *
|
|
816
|
-
var w02 = m02.y *
|
|
817
|
-
var w10 = m10.y *
|
|
818
|
-
var w11 = m11.y *
|
|
819
|
-
var w12 = m12.y *
|
|
820
|
-
var w20 = m20.y *
|
|
821
|
-
var w21 = m21.y *
|
|
822
|
-
var w22 = m22.y *
|
|
823
|
-
|
|
824
|
-
var
|
|
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 /
|
|
814
|
+
var w00 = m00.y * eK.x;
|
|
815
|
+
var w01 = m01.y * eK.x;
|
|
816
|
+
var w02 = m02.y * eK.x;
|
|
817
|
+
var w10 = m10.y * eK.y;
|
|
818
|
+
var w11 = m11.y * eK.y;
|
|
819
|
+
var w12 = m12.y * eK.y;
|
|
820
|
+
var w20 = m20.y * eK.z;
|
|
821
|
+
var w21 = m21.y * eK.z;
|
|
822
|
+
var w22 = m22.y * eK.z;
|
|
823
|
+
|
|
824
|
+
var hk = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
825
|
+
|
|
826
|
+
w00 = w00 / hk;
|
|
827
|
+
w01 = w01 / hk + w00;
|
|
828
|
+
w02 = w02 / hk + w01;
|
|
829
|
+
w10 = w10 / hk + w02;
|
|
830
|
+
w11 = w11 / hk + w10;
|
|
831
|
+
w12 = w12 / hk + w11;
|
|
832
|
+
w20 = w20 / hk + w12;
|
|
833
|
+
w21 = w21 / hk + w20;
|
|
834
|
+
w22 = w22 / hk + w21;
|
|
835
835
|
|
|
836
836
|
let rand = eo(0u);
|
|
837
|
-
var
|
|
837
|
+
var nj: f32;
|
|
838
838
|
if (rand < w00) {
|
|
839
|
-
|
|
839
|
+
nj = m00.x;
|
|
840
840
|
} else if (rand < w01) {
|
|
841
|
-
|
|
841
|
+
nj = m01.x;
|
|
842
842
|
} else if (rand < w02) {
|
|
843
|
-
|
|
843
|
+
nj = m02.x;
|
|
844
844
|
} else if (rand < w10) {
|
|
845
|
-
|
|
845
|
+
nj = m10.x;
|
|
846
846
|
} else if (rand < w11) {
|
|
847
|
-
|
|
847
|
+
nj = m11.x;
|
|
848
848
|
} else if (rand < w12) {
|
|
849
|
-
|
|
849
|
+
nj = m12.x;
|
|
850
850
|
} else if (rand < w20) {
|
|
851
|
-
|
|
851
|
+
nj = m20.x;
|
|
852
852
|
} else if (rand < w21) {
|
|
853
|
-
|
|
853
|
+
nj = m21.x;
|
|
854
854
|
} else {
|
|
855
|
-
|
|
855
|
+
nj = m22.x;
|
|
856
856
|
}
|
|
857
|
-
return i32(
|
|
857
|
+
return i32(nj);
|
|
858
858
|
}
|
|
859
859
|
|
|
860
|
-
fn
|
|
861
|
-
|
|
860
|
+
fn lW(
|
|
861
|
+
pa: i32,
|
|
862
862
|
index: vec3i,
|
|
863
|
-
|
|
863
|
+
eK: vec3f
|
|
864
864
|
) -> i32 {
|
|
865
865
|
let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
866
866
|
let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
867
867
|
let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
868
868
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
869
|
-
return
|
|
869
|
+
return fm(m0, m1, m2, eK);
|
|
870
870
|
}
|
|
871
|
-
return
|
|
871
|
+
return pa;
|
|
872
872
|
}
|
|
873
873
|
|
|
874
874
|
|
|
875
875
|
|
|
876
876
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
877
|
-
fn
|
|
878
|
-
let determinant =
|
|
877
|
+
fn eE(normal: vec3f, dp1: vec3f, dp2: vec3f, od: vec2f, oe: vec2f, input: vec4f) -> mat2x3f {
|
|
878
|
+
let determinant = od.x * oe.y - od.y * oe.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 * oe.y - dp2 * od.y) / determinant;
|
|
885
|
+
let db = (dp2 * od.x - dp1 * oe.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 ik = select(-1.0, 1.0, normal.z >= 0.0);
|
|
892
|
+
let dW = -1.0 / (ik + 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 + ik * normal.x * normal.x * dW, ik * xy, -ik * normal.x);
|
|
895
|
+
b = vec3f(xy, ik + 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));
|
|
899
899
|
}
|
|
900
900
|
|
|
901
901
|
` : /* wgsl */ ``}
|
|
902
|
-
fn
|
|
902
|
+
fn ht(
|
|
903
903
|
si: ptr<function, ad>,
|
|
904
|
-
tri:
|
|
905
|
-
|
|
904
|
+
tri: fA,
|
|
905
|
+
eK: vec3f,
|
|
906
906
|
index: vec3i,
|
|
907
907
|
bU: bool,
|
|
908
|
-
|
|
908
|
+
fv: i32
|
|
909
909
|
) {
|
|
910
910
|
(*si).hit = true;
|
|
911
911
|
|
|
@@ -915,22 +915,28 @@ let uvProjection = i32(material.uvProjection);
|
|
|
915
915
|
let i0 = index.x;
|
|
916
916
|
let i1 = index.y;
|
|
917
917
|
let i2 = index.z;
|
|
918
|
-
|
|
918
|
+
(*si).vertexColor = vec3f(1.0);
|
|
919
|
+
if (USE_VERTEX_COLOR) {
|
|
920
|
+
(*si).vertexColor = eK.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
921
|
+
+ eK.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
922
|
+
+ eK.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
|
|
923
|
+
}
|
|
924
|
+
let oY = uvProjection == ${uvProjectionConstants.spherical};
|
|
919
925
|
|
|
920
926
|
var normal: vec3f = (*si).normal;
|
|
921
|
-
var
|
|
927
|
+
var gZ: vec3f;
|
|
922
928
|
var n0 = vec3f(0.0);
|
|
923
929
|
var n1 = vec3f(0.0);
|
|
924
930
|
var n2 = vec3f(0.0);
|
|
925
931
|
|
|
926
932
|
|
|
927
|
-
if (!bU ||
|
|
933
|
+
if (!bU || oY) {
|
|
928
934
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
929
935
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
930
936
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
931
|
-
|
|
937
|
+
gZ = normalize(eK.x * n0 + eK.y * n1 + eK.z * n2);
|
|
932
938
|
if (!bU) {
|
|
933
|
-
normal =
|
|
939
|
+
normal = gZ;
|
|
934
940
|
}
|
|
935
941
|
}
|
|
936
942
|
|
|
@@ -943,14 +949,14 @@ if (USE_UV) {
|
|
|
943
949
|
uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
|
|
944
950
|
uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
|
|
945
951
|
uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
|
|
946
|
-
uv =
|
|
952
|
+
uv = eK.x * uv0 + eK.y * uv1 + eK.z * uv2;
|
|
947
953
|
if (USE_UV1) {
|
|
948
954
|
let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
949
955
|
let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
950
956
|
let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
951
|
-
cX =
|
|
952
|
-
+
|
|
953
|
-
+
|
|
957
|
+
cX = eK.x * secondaryUv0
|
|
958
|
+
+ eK.y * secondaryUv1
|
|
959
|
+
+ eK.z * secondaryUv2;
|
|
954
960
|
}
|
|
955
961
|
}
|
|
956
962
|
|
|
@@ -958,23 +964,23 @@ if (USE_TANGENT) {
|
|
|
958
964
|
let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
959
965
|
let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
960
966
|
let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
961
|
-
(*si).tangent = normalize(
|
|
967
|
+
(*si).tangent = normalize(eK.x * t0 + eK.y * t1 + eK.z * t2);
|
|
962
968
|
}
|
|
963
969
|
|
|
964
|
-
if (
|
|
965
|
-
(*si).materialIndex =
|
|
970
|
+
if (fv >= 0) {
|
|
971
|
+
(*si).materialIndex = fv;
|
|
966
972
|
}
|
|
967
973
|
else {
|
|
968
|
-
(*si).materialIndex =
|
|
974
|
+
(*si).materialIndex = lW(
|
|
969
975
|
(*si).materialIndex,
|
|
970
976
|
index,
|
|
971
|
-
|
|
977
|
+
eK
|
|
972
978
|
);
|
|
973
979
|
}
|
|
974
980
|
|
|
975
981
|
if (uvProjection > 0) {
|
|
976
982
|
|
|
977
|
-
uv =
|
|
983
|
+
uv = gH(uvProjection, (*si).position, select(normal, gZ, oY));
|
|
978
984
|
cX = uv;
|
|
979
985
|
}
|
|
980
986
|
|
|
@@ -992,41 +998,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
|
992
998
|
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0)" : ""}) {
|
|
993
999
|
let dp1 = tri.p0 - tri.p2;
|
|
994
1000
|
let dp2 = tri.p1 - tri.p2;
|
|
995
|
-
var
|
|
1001
|
+
var aT = vec4f(0.0);
|
|
996
1002
|
if (USE_TANGENT) {
|
|
997
|
-
|
|
998
|
-
+
|
|
999
|
-
+
|
|
1000
|
-
}
|
|
1001
|
-
let
|
|
1002
|
-
(*si).geometryTangent =
|
|
1003
|
-
(*si).geometryBitangent =
|
|
1004
|
-
var
|
|
1003
|
+
aT = eK.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
|
|
1004
|
+
+ eK.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
|
|
1005
|
+
+ eK.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
|
|
1006
|
+
}
|
|
1007
|
+
let eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
1008
|
+
(*si).geometryTangent = eS[0];
|
|
1009
|
+
(*si).geometryBitangent = eS[1];
|
|
1010
|
+
var fY = eS;
|
|
1005
1011
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1006
1012
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1007
1013
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1008
1014
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1009
|
-
|
|
1015
|
+
fY = eE(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1010
1016
|
}
|
|
1011
|
-
(*si).directionTangent =
|
|
1012
|
-
(*si).directionBitangent =
|
|
1017
|
+
(*si).directionTangent = fY[0];
|
|
1018
|
+
(*si).directionBitangent = fY[1];
|
|
1013
1019
|
${hasCoatNormals ? /* wgsl */ `
|
|
1014
1020
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1015
|
-
let
|
|
1016
|
-
var
|
|
1017
|
-
if (USE_UV1 && mapInfo[
|
|
1021
|
+
let kC = i32(directionMaterial.coatNormalMapIndex);
|
|
1022
|
+
var mi = eS;
|
|
1023
|
+
if (USE_UV1 && mapInfo[kC + NUM_MAPS * 2].x > 0.5) {
|
|
1018
1024
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1019
1025
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1020
1026
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1021
|
-
|
|
1022
|
-
select(
|
|
1027
|
+
mi = eE(normal, dp1, dp2, a-c, b-c,
|
|
1028
|
+
select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1023
1029
|
}
|
|
1024
1030
|
|
|
1025
1031
|
|
|
1026
|
-
let decoded = sampleMap(
|
|
1032
|
+
let decoded = sampleMap(kC, getMapUvSet(kC, uv,
|
|
1027
1033
|
select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1028
|
-
let mapped =
|
|
1029
|
-
+
|
|
1034
|
+
let mapped = mi[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1035
|
+
+ mi[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1030
1036
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1031
1037
|
}
|
|
1032
1038
|
` : ''}
|
|
@@ -1041,14 +1047,14 @@ if (!bU) {
|
|
|
1041
1047
|
|
|
1042
1048
|
|
|
1043
1049
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1044
|
-
let
|
|
1050
|
+
let km = eK.x * n0 + eK.y * n1 + eK.z * n2;
|
|
1045
1051
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1046
1052
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1047
1053
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1048
|
-
var h = a *
|
|
1049
|
-
+ (a + b + c) *
|
|
1050
|
-
+ b *
|
|
1051
|
-
if (dot(
|
|
1054
|
+
var h = a * eK.x * (eK.x - 1.0)
|
|
1055
|
+
+ (a + b + c) * eK.x * eK.y
|
|
1056
|
+
+ b * eK.y * (eK.y - 1.0);
|
|
1057
|
+
if (dot(km, geometricNormal) > 0.0) {
|
|
1052
1058
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1053
1059
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1054
1060
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1066,22 +1072,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1066
1072
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1067
1073
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1068
1074
|
}
|
|
1069
|
-
(*si).shadowOffset =
|
|
1075
|
+
(*si).shadowOffset = km * h;
|
|
1070
1076
|
}
|
|
1071
1077
|
(*si).uv = uv;
|
|
1072
1078
|
(*si).uv1 = cX;
|
|
1073
1079
|
if (USE_NORMAL_MAPS) {
|
|
1074
1080
|
let dp1 = tri.p0 - tri.p2;
|
|
1075
1081
|
let dp2 = tri.p1 - tri.p2;
|
|
1076
|
-
let
|
|
1077
|
-
let
|
|
1078
|
-
(*si).normal =
|
|
1079
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1082
|
+
let od = uv0 - uv2;
|
|
1083
|
+
let oe = uv1 - uv2;
|
|
1084
|
+
(*si).normal = om(
|
|
1085
|
+
(*si).materialIndex, uv, normal, dp1, dp2, od, oe
|
|
1080
1086
|
);
|
|
1081
1087
|
}
|
|
1082
1088
|
}
|
|
1083
1089
|
|
|
1084
|
-
struct
|
|
1090
|
+
struct eC {
|
|
1085
1091
|
t: f32,
|
|
1086
1092
|
barycentric: vec3f,
|
|
1087
1093
|
};
|
|
@@ -1090,8 +1096,8 @@ barycentric: vec3f,
|
|
|
1090
1096
|
|
|
1091
1097
|
|
|
1092
1098
|
|
|
1093
|
-
fn
|
|
1094
|
-
var ti:
|
|
1099
|
+
fn fL(o: vec3f, d: vec3f, tri: fA, ey: i32, gP: vec3f, tMax: f32) -> eC {
|
|
1100
|
+
var ti: eC;
|
|
1095
1101
|
|
|
1096
1102
|
|
|
1097
1103
|
var p0t = tri.p0 - o;
|
|
@@ -1111,9 +1117,9 @@ p2t = p2t.zxy;
|
|
|
1111
1117
|
|
|
1112
1118
|
|
|
1113
1119
|
|
|
1114
|
-
p0t = vec3f(p0t.xy +
|
|
1115
|
-
p1t = vec3f(p1t.xy +
|
|
1116
|
-
p2t = vec3f(p2t.xy +
|
|
1120
|
+
p0t = vec3f(p0t.xy + gP.xy * p0t.z, p0t.z);
|
|
1121
|
+
p1t = vec3f(p1t.xy + gP.xy * p1t.z, p1t.z);
|
|
1122
|
+
p2t = vec3f(p2t.xy + gP.xy * p2t.z, p2t.z);
|
|
1117
1123
|
|
|
1118
1124
|
|
|
1119
1125
|
var e = vec3f(
|
|
@@ -1125,9 +1131,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1125
1131
|
if (DEPTH_QUERY_MODE) {
|
|
1126
1132
|
|
|
1127
1133
|
|
|
1128
|
-
let
|
|
1134
|
+
let rE = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1129
1135
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1130
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1136
|
+
e = select(e, vec3f(0.0), abs(e) <= rE * 1e-6);
|
|
1131
1137
|
}
|
|
1132
1138
|
|
|
1133
1139
|
|
|
@@ -1138,19 +1144,19 @@ return ti;
|
|
|
1138
1144
|
let det = e.x + e.y + e.z;
|
|
1139
1145
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1140
1146
|
|
|
1141
|
-
p0t.z *=
|
|
1142
|
-
p1t.z *=
|
|
1143
|
-
p2t.z *=
|
|
1144
|
-
let
|
|
1147
|
+
p0t.z *= gP.z;
|
|
1148
|
+
p1t.z *= gP.z;
|
|
1149
|
+
p2t.z *= gP.z;
|
|
1150
|
+
let rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1145
1151
|
|
|
1146
1152
|
|
|
1147
|
-
if (abs(
|
|
1153
|
+
if (abs(rn) > abs(tMax * det)) {
|
|
1148
1154
|
return ti;
|
|
1149
1155
|
}
|
|
1150
1156
|
|
|
1151
|
-
let
|
|
1152
|
-
ti.t =
|
|
1153
|
-
ti.barycentric = e *
|
|
1157
|
+
let sw = 1. / det;
|
|
1158
|
+
ti.t = rn * sw;
|
|
1159
|
+
ti.barycentric = e * sw;
|
|
1154
1160
|
|
|
1155
1161
|
return ti;
|
|
1156
1162
|
}
|
|
@@ -1160,26 +1166,26 @@ return ti;
|
|
|
1160
1166
|
|
|
1161
1167
|
override DEPTH_QUERY_MODE: bool = false;
|
|
1162
1168
|
|
|
1163
|
-
fn
|
|
1169
|
+
fn fb(d: vec3f) -> vec3f {
|
|
1164
1170
|
if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
1165
1171
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1166
1172
|
}
|
|
1167
1173
|
|
|
1168
|
-
fn
|
|
1174
|
+
fn eZ(gC: vec3f, o: vec3f) -> vec3f {
|
|
1169
1175
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1170
|
-
return abs(
|
|
1176
|
+
return abs(gC) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1171
1177
|
}
|
|
1172
1178
|
|
|
1173
1179
|
|
|
1174
1180
|
|
|
1175
|
-
fn cM(o: vec3f,
|
|
1176
|
-
let
|
|
1177
|
-
let
|
|
1178
|
-
let bJ =
|
|
1179
|
-
let
|
|
1180
|
-
let
|
|
1181
|
-
let t0 = max(
|
|
1182
|
-
let t1 = min(
|
|
1181
|
+
fn cM(o: vec3f, vK: vec3f, vJ: vec3f, gC: vec3f, tMax: f32) -> f32 {
|
|
1182
|
+
let uR = (vK - o) * gC;
|
|
1183
|
+
let uS = (vJ - o) * gC;
|
|
1184
|
+
let bJ = eZ(gC, o);
|
|
1185
|
+
let mL = min(uR, uS) - bJ;
|
|
1186
|
+
let rU = max(uR, uS) + bJ;
|
|
1187
|
+
let t0 = max(mL.x, max(mL.y, mL.z));
|
|
1188
|
+
let t1 = min(rU.x, min(rU.y, rU.z));
|
|
1183
1189
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1184
1190
|
}
|
|
1185
1191
|
|
|
@@ -1187,7 +1193,7 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1187
1193
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1188
1194
|
}
|
|
1189
1195
|
|
|
1190
|
-
fn
|
|
1196
|
+
fn mv(d: vec3f, ey: i32) -> vec3f {
|
|
1191
1197
|
|
|
1192
1198
|
|
|
1193
1199
|
if (ey == 0) {
|
|
@@ -1199,33 +1205,33 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
|
1199
1205
|
}
|
|
1200
1206
|
}
|
|
1201
1207
|
|
|
1202
|
-
fn
|
|
1208
|
+
fn mj(
|
|
1203
1209
|
si: ptr<function, ad>,
|
|
1204
|
-
|
|
1210
|
+
lC: fA,
|
|
1205
1211
|
aB: vec3f,
|
|
1206
|
-
|
|
1212
|
+
hw: vec3i,
|
|
1207
1213
|
bU: bool,
|
|
1208
1214
|
ao: i32,
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1215
|
+
eD: vec3f,
|
|
1216
|
+
eY: vec3f,
|
|
1217
|
+
fv: i32
|
|
1212
1218
|
) {
|
|
1213
1219
|
(*si).instanceIndex = ao;
|
|
1214
1220
|
(*si).barycentrics = aB.xy;
|
|
1215
|
-
(*si).normal =
|
|
1216
|
-
(*si).position =
|
|
1221
|
+
(*si).normal = eD;
|
|
1222
|
+
(*si).position = eY;
|
|
1217
1223
|
(*si).materialIndex = i32(ae(
|
|
1218
1224
|
bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
|
|
1219
1225
|
).x);
|
|
1220
1226
|
|
|
1221
1227
|
|
|
1222
|
-
|
|
1228
|
+
ht(
|
|
1223
1229
|
si,
|
|
1224
|
-
|
|
1230
|
+
lC,
|
|
1225
1231
|
aB,
|
|
1226
|
-
|
|
1232
|
+
hw,
|
|
1227
1233
|
bU,
|
|
1228
|
-
|
|
1234
|
+
fv
|
|
1229
1235
|
);
|
|
1230
1236
|
|
|
1231
1237
|
let l2w = mat4x4<f32>(
|
|
@@ -1246,7 +1252,7 @@ w2l[1].xyz,
|
|
|
1246
1252
|
w2l[2].xyz
|
|
1247
1253
|
));
|
|
1248
1254
|
|
|
1249
|
-
(*si).faceNormal = normalize(aD *
|
|
1255
|
+
(*si).faceNormal = normalize(aD * eD);
|
|
1250
1256
|
(*si).vertexNormal = normalize(aD * (*si).vertexNormal);
|
|
1251
1257
|
(*si).normal = normalize(aD * (*si).normal);
|
|
1252
1258
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
|
|
@@ -1269,7 +1275,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
|
1269
1275
|
|
|
1270
1276
|
|
|
1271
1277
|
|
|
1272
|
-
fn
|
|
1278
|
+
fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lD: bool) {
|
|
1273
1279
|
|
|
1274
1280
|
(*si).hit = false;
|
|
1275
1281
|
|
|
@@ -1279,37 +1285,37 @@ return;
|
|
|
1279
1285
|
|
|
1280
1286
|
var tMax = RAY_MAX_DISTANCE;
|
|
1281
1287
|
var ey: i32;
|
|
1282
|
-
var
|
|
1288
|
+
var gP: vec3f;
|
|
1283
1289
|
|
|
1284
|
-
var
|
|
1285
|
-
var
|
|
1290
|
+
var hw: vec3i;
|
|
1291
|
+
var lC: fA;
|
|
1286
1292
|
var ao: i32;
|
|
1287
|
-
var
|
|
1293
|
+
var hO: i32 = (*si).triangleIndex;
|
|
1288
1294
|
|
|
1289
1295
|
${getBVHTraverseCode(`
|
|
1290
1296
|
(*si).triangleIndex = triangleIndex;
|
|
1291
|
-
|
|
1292
|
-
|
|
1297
|
+
lC = tri;
|
|
1298
|
+
hw = index;
|
|
1293
1299
|
ao = cf;
|
|
1294
1300
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
1295
1301
|
|
|
1296
|
-
if (
|
|
1297
|
-
|
|
1302
|
+
if (rb) {
|
|
1303
|
+
mj(
|
|
1298
1304
|
si,
|
|
1299
|
-
|
|
1305
|
+
lC,
|
|
1300
1306
|
aB,
|
|
1301
|
-
|
|
1307
|
+
hw,
|
|
1302
1308
|
bU,
|
|
1303
1309
|
ao,
|
|
1304
|
-
|
|
1305
|
-
|
|
1310
|
+
eD,
|
|
1311
|
+
eY,
|
|
1306
1312
|
-1
|
|
1307
1313
|
);
|
|
1308
1314
|
}
|
|
1309
1315
|
}
|
|
1310
1316
|
|
|
1311
1317
|
|
|
1312
|
-
fn
|
|
1318
|
+
fn iM(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
|
|
1313
1319
|
(*si).hit = false;
|
|
1314
1320
|
|
|
1315
1321
|
if (rtUniform.isEmpty > 0) {
|
|
@@ -1318,19 +1324,19 @@ return;
|
|
|
1318
1324
|
|
|
1319
1325
|
let bounces = 0;
|
|
1320
1326
|
let doubleSided = true;
|
|
1321
|
-
let
|
|
1327
|
+
let lD = false;
|
|
1322
1328
|
var tMax = maxDistance;
|
|
1323
1329
|
var ey: i32;
|
|
1324
|
-
var
|
|
1325
|
-
var
|
|
1326
|
-
var
|
|
1330
|
+
var gP: vec3f;
|
|
1331
|
+
var hw: vec3i;
|
|
1332
|
+
var lC: fA;
|
|
1327
1333
|
var ao: i32;
|
|
1328
|
-
var
|
|
1334
|
+
var hO: i32 = -1;
|
|
1329
1335
|
|
|
1330
1336
|
${getBVHTraverseCode(`
|
|
1331
1337
|
(*si).triangleIndex = triangleIndex;
|
|
1332
|
-
|
|
1333
|
-
|
|
1338
|
+
lC = tri;
|
|
1339
|
+
hw = index;
|
|
1334
1340
|
ao = cf;
|
|
1335
1341
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
1336
1342
|
if (cf != instanceIndex) {
|
|
@@ -1338,16 +1344,16 @@ continue;
|
|
|
1338
1344
|
}
|
|
1339
1345
|
`)}
|
|
1340
1346
|
|
|
1341
|
-
if (
|
|
1347
|
+
if (rb) {
|
|
1342
1348
|
(*si).instanceIndex = ao;
|
|
1343
|
-
(*si).normal =
|
|
1344
|
-
(*si).position =
|
|
1349
|
+
(*si).normal = eD;
|
|
1350
|
+
(*si).position = eY;
|
|
1345
1351
|
(*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
1346
|
-
|
|
1352
|
+
ht(
|
|
1347
1353
|
si,
|
|
1348
|
-
|
|
1354
|
+
lC,
|
|
1349
1355
|
aB,
|
|
1350
|
-
|
|
1356
|
+
hw,
|
|
1351
1357
|
bU,
|
|
1352
1358
|
-1
|
|
1353
1359
|
);
|
|
@@ -1369,7 +1375,7 @@ w2l[0].xyz,
|
|
|
1369
1375
|
w2l[1].xyz,
|
|
1370
1376
|
w2l[2].xyz
|
|
1371
1377
|
));
|
|
1372
|
-
(*si).faceNormal = normalize(aD *
|
|
1378
|
+
(*si).faceNormal = normalize(aD * eD);
|
|
1373
1379
|
(*si).vertexNormal = normalize(aD * (*si).vertexNormal);
|
|
1374
1380
|
(*si).normal = normalize(aD * (*si).normal);
|
|
1375
1381
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
|
|
@@ -1387,45 +1393,45 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1387
1393
|
}
|
|
1388
1394
|
}
|
|
1389
1395
|
|
|
1390
|
-
fn ex(ray: Ray, lightDistance: f32,
|
|
1396
|
+
fn ex(ray: Ray, lightDistance: f32, jL: i32) -> bool {
|
|
1391
1397
|
if (rtUniform.isEmpty > 0) {
|
|
1392
1398
|
return false;
|
|
1393
1399
|
}
|
|
1394
1400
|
|
|
1395
1401
|
let doubleSided = true;
|
|
1396
|
-
let
|
|
1397
|
-
var tMax =
|
|
1402
|
+
let qo = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
1403
|
+
var tMax = qo;
|
|
1398
1404
|
var ey: i32;
|
|
1399
|
-
var
|
|
1405
|
+
var gP: vec3f;
|
|
1400
1406
|
|
|
1401
1407
|
let bounces = 1;
|
|
1402
|
-
var
|
|
1403
|
-
var
|
|
1408
|
+
var lD = false;
|
|
1409
|
+
var hO: i32 = jL;
|
|
1404
1410
|
|
|
1405
1411
|
${getBVHTraverseCode(
|
|
1406
1412
|
/*wgsl */ `
|
|
1407
1413
|
|
|
1408
1414
|
|
|
1409
1415
|
|
|
1410
|
-
var
|
|
1416
|
+
var jt = true;
|
|
1411
1417
|
|
|
1412
|
-
if (
|
|
1418
|
+
if (jt) {
|
|
1413
1419
|
if (HAS_ALPHA) {
|
|
1414
|
-
let materialIndex = i32(ae(bitcast<i32>(
|
|
1415
|
-
if (!
|
|
1420
|
+
let materialIndex = i32(ae(bitcast<i32>(ou.z)).x);
|
|
1421
|
+
if (!nG(
|
|
1416
1422
|
materialIndex,
|
|
1417
1423
|
index,
|
|
1418
1424
|
aB,
|
|
1419
|
-
|
|
1420
|
-
|
|
1425
|
+
eY,
|
|
1426
|
+
eD
|
|
1421
1427
|
)) {
|
|
1422
1428
|
|
|
1423
|
-
tMax =
|
|
1424
|
-
|
|
1429
|
+
tMax = qo;
|
|
1430
|
+
jt = false;
|
|
1425
1431
|
}
|
|
1426
1432
|
}
|
|
1427
1433
|
}
|
|
1428
|
-
if (
|
|
1434
|
+
if (jt) {
|
|
1429
1435
|
return true;
|
|
1430
1436
|
}
|
|
1431
1437
|
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|