@meimu/mutracer 0.2.0 → 0.3.0
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/README.md +3 -0
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +8949 -7915
- package/docs/api.md +42 -21
- package/docs/caustics.md +80 -0
- package/docs/materials.md +5 -4
- package/docs/progressive-rendering.md +50 -9
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +7 -5
- package/lib/Display.js +1 -1
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +47 -12
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +61 -13
- package/lib/Render.js +169 -19
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.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/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +4 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +48 -17
- package/lib/renderer/WGPURayTracePass.js +538 -340
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +83 -47
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +4 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
- package/lib/renderer/WebGLRayTracePass.js +43 -6
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +33 -33
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- 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 +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +260 -237
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +4 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuShaderSource.d.ts +7 -0
- package/lib/renderer/wgpuShaderSource.js +2 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +2 -2
- 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/llms.txt +2 -1
- package/package.json +3 -3
|
@@ -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 = fM(o, d, tri, dZ, gH, 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
|
+
ex = normalize(cross(e1, e2));
|
|
16
|
+
let ku = i32(af(bitcast<i32>(oX.z)).x);
|
|
17
|
+
let iL = materialsBuffer[ku].doubleSided > 0.5;
|
|
18
|
+
if (!doubleSided && !iL && dot(ex, d) > 0.0) {
|
|
19
|
+
ex = vec3f(0.0);
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
sd = true;
|
|
25
|
+
pa = true;
|
|
26
|
+
eS = o + tMax * d;
|
|
27
|
+
aw = hit.barycentric;
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
};
|
|
31
31
|
function getPDMDisplacmentCode(anyHit) {
|
|
32
32
|
return /*wgsl */ `
|
|
33
|
-
let
|
|
33
|
+
let ll = pS(
|
|
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
|
+
jv(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
|
+
jg
|
|
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 = oX.w;
|
|
55
|
+
let uW = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(
|
|
57
|
+
let materialIndex = i32(af(bitcast<i32>(oX.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 && uW > 0) {
|
|
68
|
+
let minH = f32(uW >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(uW & 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 (ll.t < tMax) {
|
|
81
|
+
ex = ll.normal;
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
tMax =
|
|
84
|
+
tMax = ll.t;
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
aw = ll.barycentric;
|
|
87
|
+
eS = o + tMax * d;
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
bP = true;
|
|
90
|
+
sd = true;
|
|
91
|
+
pa = true;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
|
|
|
97
97
|
`;
|
|
98
98
|
};
|
|
99
99
|
const cwbvhTraversalWgsl = /* wgsl */ `
|
|
100
|
-
fn
|
|
100
|
+
fn bm(value: u32) -> vec4f {
|
|
101
101
|
return vec4f(
|
|
102
102
|
f32(value & 0xffu),
|
|
103
103
|
f32((value >> 8u) & 0xffu),
|
|
@@ -112,118 +112,118 @@ f32(value >> 24u)
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
fn
|
|
115
|
+
fn kI(value: u32) -> u32 {
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn oJ(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn oY(
|
|
124
124
|
node: i32,
|
|
125
|
-
|
|
125
|
+
uN: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
gb: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
|
-
let i = node +
|
|
131
|
+
let i = node + uN;
|
|
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 sD = bitcast<i32>((header & 0xffu) << 24u) >> 24;
|
|
137
|
+
let sE = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
|
|
138
|
+
let sF = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
|
|
139
|
+
let hG = vec3f(
|
|
140
|
+
bitcast<f32>(u32(sD + 127) << 23u),
|
|
141
|
+
bitcast<f32>(u32(sE + 127) << 23u),
|
|
142
|
+
bitcast<f32>(u32(sF + 127) << 23u)
|
|
143
143
|
);
|
|
144
|
-
let padding =
|
|
145
|
-
let
|
|
146
|
-
let
|
|
144
|
+
let padding = eU(gb, o);
|
|
145
|
+
let eD = (n0.xyz - o) * gb;
|
|
146
|
+
let cV = hG * gb;
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
|
|
150
|
-
let
|
|
151
|
-
let
|
|
152
|
-
let
|
|
153
|
-
let negative =
|
|
154
|
-
let
|
|
155
|
-
let
|
|
156
|
-
let
|
|
157
|
-
let
|
|
158
|
-
let
|
|
159
|
-
let
|
|
150
|
+
let vm = bitcast<vec4u>(n2);
|
|
151
|
+
let vn = bitcast<vec4u>(n3);
|
|
152
|
+
let vo = bitcast<vec4u>(n4);
|
|
153
|
+
let negative = gb < vec3f(0.0);
|
|
154
|
+
let wK = select(vm.xy, vn.zw, negative.x);
|
|
155
|
+
let xX = select(vn.zw, vm.xy, negative.x);
|
|
156
|
+
let wL = select(vm.zw, vo.xy, negative.y);
|
|
157
|
+
let xY = select(vo.xy, vm.zw, negative.y);
|
|
158
|
+
let wM = select(vn.xy, vo.zw, negative.z);
|
|
159
|
+
let xZ = select(vo.zw, vn.xy, negative.z);
|
|
160
160
|
|
|
161
|
-
let
|
|
161
|
+
let yL = max(
|
|
162
162
|
max(
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
bm(wK.x) * cV.x + eD.x - vec4f(padding.x),
|
|
164
|
+
bm(wL.x) * cV.y + eD.y - vec4f(padding.y)
|
|
165
165
|
),
|
|
166
|
-
|
|
166
|
+
bm(wM.x) * cV.z + eD.z - vec4f(padding.z)
|
|
167
167
|
);
|
|
168
|
-
let
|
|
168
|
+
let yH = min(
|
|
169
169
|
min(
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
bm(xX.x) * cV.x + eD.x + vec4f(padding.x),
|
|
171
|
+
bm(xY.x) * cV.y + eD.y + vec4f(padding.y)
|
|
172
172
|
),
|
|
173
|
-
|
|
173
|
+
bm(xZ.x) * cV.z + eD.z + vec4f(padding.z)
|
|
174
174
|
);
|
|
175
|
-
let
|
|
175
|
+
let yM = max(
|
|
176
176
|
max(
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
bm(wK.y) * cV.x + eD.x - vec4f(padding.x),
|
|
178
|
+
bm(wL.y) * cV.y + eD.y - vec4f(padding.y)
|
|
179
179
|
),
|
|
180
|
-
|
|
180
|
+
bm(wM.y) * cV.z + eD.z - vec4f(padding.z)
|
|
181
181
|
);
|
|
182
|
-
let
|
|
182
|
+
let yI = min(
|
|
183
183
|
min(
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
bm(xX.y) * cV.x + eD.x + vec4f(padding.x),
|
|
185
|
+
bm(xY.y) * cV.y + eD.y + vec4f(padding.y)
|
|
186
186
|
),
|
|
187
|
-
|
|
187
|
+
bm(xZ.y) * cV.z + eD.z + vec4f(padding.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 wI = (yL <= min(yH, vec4f(tMax))) & (yH > vec4f(0.0));
|
|
191
|
+
let wJ = (yM <= min(yI, vec4f(tMax))) & (yI > vec4f(0.0));
|
|
192
|
+
return select(0u, 1u, wI.x)
|
|
193
|
+
| select(0u, 2u, wI.y)
|
|
194
|
+
| select(0u, 4u, wI.z)
|
|
195
|
+
| select(0u, 8u, wI.w)
|
|
196
|
+
| select(0u, 16u, wJ.x)
|
|
197
|
+
| select(0u, 32u, wJ.y)
|
|
198
|
+
| select(0u, 64u, wJ.z)
|
|
199
|
+
| select(0u, 128u, wJ.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 oX = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(oX.y));
|
|
207
207
|
for (var k = 0; k < primitiveCount; k++) {
|
|
208
208
|
let triangleIndex = primitiveOffset + k;
|
|
209
209
|
${skipTriangleCode}
|
|
210
|
-
if (bounces > 0 && triangleIndex ==
|
|
210
|
+
if (bounces > 0 && triangleIndex == fH && bK == fG) {
|
|
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 = fw(
|
|
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 pa = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (pa) {
|
|
227
227
|
${handleHitCode}
|
|
228
228
|
}
|
|
229
229
|
}
|
|
@@ -231,285 +231,285 @@ ${handleHitCode}
|
|
|
231
231
|
return /* wgsl */ `
|
|
232
232
|
var d = ray.d;
|
|
233
233
|
var o = ray.o;
|
|
234
|
-
var
|
|
235
|
-
var
|
|
236
|
-
var
|
|
237
|
-
var
|
|
238
|
-
var
|
|
239
|
-
var
|
|
240
|
-
var
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
if (
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
247
|
-
while (
|
|
248
|
-
let
|
|
249
|
-
|
|
234
|
+
var jk = -1;
|
|
235
|
+
var gb = eW(d);
|
|
236
|
+
var bP = false;
|
|
237
|
+
var sd = false;
|
|
238
|
+
var eS: vec3f;
|
|
239
|
+
var ex: vec3f;
|
|
240
|
+
var aw: vec3f;
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if (cH(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gb, tMax) > 0.0) {
|
|
244
|
+
jk = 0;
|
|
245
|
+
mw[0] = 0;
|
|
246
|
+
}
|
|
247
|
+
while (jk >= 0) {
|
|
248
|
+
let uo = mw[jk];
|
|
249
|
+
jk--;
|
|
250
250
|
o = ray.o;
|
|
251
251
|
d = ray.d;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
let
|
|
255
|
-
let
|
|
256
|
-
if (
|
|
257
|
-
let left =
|
|
258
|
-
let right =
|
|
259
|
-
let d0 =
|
|
252
|
+
gb = eW(d);
|
|
253
|
+
|
|
254
|
+
let yw = bvhBuffer[uo];
|
|
255
|
+
let eP = bitcast<i32>(yw.w);
|
|
256
|
+
if (eP >= 0) {
|
|
257
|
+
let left = uo + 2;
|
|
258
|
+
let right = eP;
|
|
259
|
+
let d0 = cH(
|
|
260
260
|
o,
|
|
261
261
|
bvhBuffer[left].xyz,
|
|
262
262
|
bvhBuffer[left + 1].xyz,
|
|
263
|
-
|
|
263
|
+
gb,
|
|
264
264
|
tMax
|
|
265
265
|
);
|
|
266
|
-
let d1 =
|
|
266
|
+
let d1 = cH(
|
|
267
267
|
o,
|
|
268
268
|
bvhBuffer[right].xyz,
|
|
269
269
|
bvhBuffer[right + 1].xyz,
|
|
270
|
-
|
|
270
|
+
gb,
|
|
271
271
|
tMax
|
|
272
272
|
);
|
|
273
273
|
|
|
274
274
|
if (d0 > d1) {
|
|
275
|
-
if (d0 > 0.0) {
|
|
276
|
-
if (d1 > 0.0) {
|
|
275
|
+
if (d0 > 0.0) { jk++; mw[jk] = left; }
|
|
276
|
+
if (d1 > 0.0) { jk++; mw[jk] = right; }
|
|
277
277
|
}
|
|
278
278
|
else {
|
|
279
|
-
if (d1 > 0.0) {
|
|
280
|
-
if (d0 > 0.0) {
|
|
279
|
+
if (d1 > 0.0) { jk++; mw[jk] = right; }
|
|
280
|
+
if (d0 > 0.0) { jk++; mw[jk] = left; }
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
else {
|
|
284
|
-
let
|
|
284
|
+
let rN = -eP;
|
|
285
285
|
|
|
286
286
|
|
|
287
287
|
for (
|
|
288
|
-
var
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
var mW = rN - 1;
|
|
289
|
+
mW >= 0;
|
|
290
|
+
mW--
|
|
291
291
|
) {
|
|
292
|
-
let
|
|
293
|
-
let
|
|
294
|
-
let
|
|
295
|
-
let
|
|
292
|
+
let qn = bvhBuffer[uo + 2 + mW];
|
|
293
|
+
let bK = bitcast<i32>(qn.x);
|
|
294
|
+
let xl = bitcast<i32>(qn.y);
|
|
295
|
+
let oX = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
|
|
296
296
|
let w2l = mat4x4<f32>(
|
|
297
|
-
instancesBuffer[
|
|
298
|
-
instancesBuffer[
|
|
299
|
-
instancesBuffer[
|
|
300
|
-
instancesBuffer[
|
|
297
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
298
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
299
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
300
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
301
301
|
);
|
|
302
302
|
o = (w2l * vec4f(ray.o, 1.0)).xyz;
|
|
303
303
|
d = (w2l * vec4f(ray.d, 0.0)).xyz;
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
gb = eW(d);
|
|
305
|
+
dZ = maxDimension(abs(d));
|
|
306
|
+
gH = mU(d, dZ);
|
|
307
307
|
|
|
308
|
-
let
|
|
309
|
-
let
|
|
310
|
-
let blasOffset = i32(
|
|
311
|
-
let
|
|
308
|
+
let fK = bitcast<u32>(oX.x);
|
|
309
|
+
let gN = fK >> 30u;
|
|
310
|
+
let blasOffset = i32(fK & 0x3fffffffu);
|
|
311
|
+
let bufferOff = rtUniform.blasOffset;
|
|
312
312
|
|
|
313
313
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
314
|
-
if (
|
|
314
|
+
if (gN == 3u) {
|
|
315
315
|
|
|
316
316
|
|
|
317
317
|
|
|
318
318
|
|
|
319
|
-
var
|
|
320
|
-
var
|
|
321
|
-
var
|
|
319
|
+
var qc = -1;
|
|
320
|
+
var ta = 0u;
|
|
321
|
+
var ln = 0u;
|
|
322
322
|
|
|
323
|
-
var
|
|
324
|
-
let
|
|
323
|
+
var el = 0x80000000u;
|
|
324
|
+
let wm = select(0u, 4u, d.x < 0.0)
|
|
325
325
|
| select(0u, 2u, d.y < 0.0)
|
|
326
326
|
| select(0u, 1u, d.z < 0.0);
|
|
327
|
-
let
|
|
327
|
+
let rc = 7u - wm;
|
|
328
328
|
|
|
329
329
|
|
|
330
330
|
|
|
331
331
|
|
|
332
|
-
while (
|
|
333
|
-
|
|
332
|
+
while (ta < 4096u) {
|
|
333
|
+
ta++;
|
|
334
334
|
|
|
335
|
-
let internalMask =
|
|
336
|
-
let
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if ((
|
|
340
|
-
|
|
335
|
+
let internalMask = el & 0xffu;
|
|
336
|
+
let qY =
|
|
337
|
+
kI(el >> 24u) + 24u;
|
|
338
|
+
el &= ~(1u << qY);
|
|
339
|
+
if ((el & 0xff000000u) != 0u) {
|
|
340
|
+
qc++;
|
|
341
341
|
|
|
342
|
-
|
|
342
|
+
tE[qc] = vec2u(ln, el);
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
-
let slot = (
|
|
346
|
-
let
|
|
347
|
-
let relativeIndex = countOneBits(internalMask &
|
|
348
|
-
let tA =
|
|
345
|
+
let slot = (qY - 24u) ^ rc;
|
|
346
|
+
let oa = (1u << slot) - 1u;
|
|
347
|
+
let relativeIndex = countOneBits(internalMask & oa);
|
|
348
|
+
let tA = ln + relativeIndex;
|
|
349
349
|
let node = blasOffset + i32(tA * 5u);
|
|
350
|
-
let
|
|
351
|
-
let
|
|
352
|
-
node,
|
|
350
|
+
let jF = bvhBuffer[node + bufferOff];
|
|
351
|
+
let vQ = oY(
|
|
352
|
+
node, bufferOff, jF, o, gb, tMax
|
|
353
353
|
);
|
|
354
354
|
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
if (
|
|
358
|
-
let
|
|
359
|
-
let
|
|
360
|
-
var
|
|
361
|
-
var
|
|
362
|
-
while (
|
|
363
|
-
let
|
|
364
|
-
|
|
365
|
-
let
|
|
366
|
-
bitcast<u32>(
|
|
367
|
-
bitcast<u32>(
|
|
368
|
-
|
|
356
|
+
el = 0u;
|
|
357
|
+
if (vQ != 0u) {
|
|
358
|
+
let fF = bvhBuffer[node + bufferOff + 1];
|
|
359
|
+
let sM = bitcast<u32>(jF.w) >> 24u;
|
|
360
|
+
var uT = 0u;
|
|
361
|
+
var kp = vQ;
|
|
362
|
+
while (kp != 0u) {
|
|
363
|
+
let sw = kI(kp);
|
|
364
|
+
kp &= ~(1u << sw);
|
|
365
|
+
let tW = select(
|
|
366
|
+
bitcast<u32>(fF.z),
|
|
367
|
+
bitcast<u32>(fF.w),
|
|
368
|
+
sw >= 4u
|
|
369
369
|
);
|
|
370
|
-
let
|
|
371
|
-
(
|
|
372
|
-
let
|
|
373
|
-
let
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
370
|
+
let uF =
|
|
371
|
+
(tW >> ((sw & 3u) * 8u)) & 0xffu;
|
|
372
|
+
let jH = uF & 0x1fu;
|
|
373
|
+
let xk = select(
|
|
374
|
+
jH,
|
|
375
|
+
jH ^ rc,
|
|
376
|
+
jH >= 24u
|
|
377
377
|
);
|
|
378
|
-
let
|
|
379
|
-
|
|
378
|
+
let wQ = (uF >> 5u) & 0x7u;
|
|
379
|
+
uT |= wQ << xk;
|
|
380
380
|
}
|
|
381
381
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
let
|
|
385
|
-
var
|
|
386
|
-
while (
|
|
387
|
-
let
|
|
388
|
-
|
|
382
|
+
ln = bitcast<u32>(fF.x);
|
|
383
|
+
el = (uT & 0xff000000u) | sM;
|
|
384
|
+
let ps = bitcast<u32>(fF.y);
|
|
385
|
+
var pv = uT & 0x00ffffffu;
|
|
386
|
+
while (pv != 0u) {
|
|
387
|
+
let oD = oJ(pv);
|
|
388
|
+
pv &= ~(1u << oD);
|
|
389
389
|
let primitiveCount = 1;
|
|
390
|
-
let primitiveOffset =
|
|
391
|
-
+ i32(
|
|
390
|
+
let primitiveOffset = bufferOff + blasOffset
|
|
391
|
+
+ i32(ps + oD);
|
|
392
392
|
${intersectTriangles}
|
|
393
393
|
}
|
|
394
394
|
}
|
|
395
395
|
|
|
396
|
-
if ((
|
|
397
|
-
if (
|
|
398
|
-
let
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
396
|
+
if ((el & 0xff000000u) != 0u) { continue; }
|
|
397
|
+
if (qc >= 0) {
|
|
398
|
+
let rf = tE[qc];
|
|
399
|
+
ln = rf.x;
|
|
400
|
+
el = rf.y;
|
|
401
|
+
qc--;
|
|
402
402
|
}
|
|
403
403
|
else { break; }
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
406
|
` : ''}
|
|
407
407
|
|
|
408
|
-
var
|
|
409
|
-
if (
|
|
410
|
-
|
|
408
|
+
var dR = -1;
|
|
409
|
+
if (gN != 3u) {
|
|
410
|
+
dR = 0;
|
|
411
411
|
|
|
412
|
-
|
|
412
|
+
gs[0] = xl;
|
|
413
413
|
}
|
|
414
414
|
|
|
415
|
-
while (
|
|
415
|
+
while (dR >= 0) {
|
|
416
416
|
|
|
417
|
-
let node =
|
|
418
|
-
|
|
417
|
+
let node = gs[dR];
|
|
418
|
+
dR--;
|
|
419
419
|
var primitiveCount = 0;
|
|
420
420
|
var primitiveOffset = 0;
|
|
421
421
|
|
|
422
422
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
423
|
-
if (
|
|
424
|
-
let i = node +
|
|
425
|
-
let
|
|
426
|
-
let
|
|
427
|
-
let
|
|
428
|
-
let
|
|
429
|
-
primitiveCount = i32(bitcast<u32>(
|
|
423
|
+
if (gN == 2u) {
|
|
424
|
+
let i = node + bufferOff;
|
|
425
|
+
let xq = bvhBuffer[i];
|
|
426
|
+
let xr = bvhBuffer[i + 1];
|
|
427
|
+
let xs = bvhBuffer[i + 2];
|
|
428
|
+
let xt = bvhBuffer[i + 3];
|
|
429
|
+
primitiveCount = i32(bitcast<u32>(xs.w));
|
|
430
430
|
if (primitiveCount > 0) {
|
|
431
|
-
primitiveOffset =
|
|
432
|
-
+ i32(bitcast<u32>(
|
|
431
|
+
primitiveOffset = bufferOff + blasOffset
|
|
432
|
+
+ i32(bitcast<u32>(xt.w));
|
|
433
433
|
}
|
|
434
434
|
else {
|
|
435
|
-
let left = blasOffset + i32(bitcast<u32>(
|
|
436
|
-
let right = blasOffset + i32(bitcast<u32>(
|
|
437
|
-
let
|
|
438
|
-
o,
|
|
435
|
+
let left = blasOffset + i32(bitcast<u32>(xq.w) * 4u);
|
|
436
|
+
let right = blasOffset + i32(bitcast<u32>(xr.w) * 4u);
|
|
437
|
+
let pb = cH(
|
|
438
|
+
o, xq.xyz, xr.xyz, gb, tMax
|
|
439
439
|
);
|
|
440
|
-
let
|
|
441
|
-
o,
|
|
440
|
+
let oc = cH(
|
|
441
|
+
o, xs.xyz, xt.xyz, gb, tMax
|
|
442
442
|
);
|
|
443
|
-
if (
|
|
444
|
-
if (
|
|
445
|
-
|
|
443
|
+
if (pb > oc) {
|
|
444
|
+
if (pb > 0.0) {
|
|
445
|
+
dR++; gs[dR] = left;
|
|
446
446
|
}
|
|
447
|
-
if (
|
|
448
|
-
|
|
447
|
+
if (oc > 0.0) {
|
|
448
|
+
dR++; gs[dR] = right;
|
|
449
449
|
}
|
|
450
450
|
}
|
|
451
451
|
else {
|
|
452
|
-
if (
|
|
453
|
-
|
|
452
|
+
if (oc > 0.0) {
|
|
453
|
+
dR++; gs[dR] = right;
|
|
454
454
|
}
|
|
455
|
-
if (
|
|
456
|
-
|
|
455
|
+
if (pb > 0.0) {
|
|
456
|
+
dR++; gs[dR] = left;
|
|
457
457
|
}
|
|
458
458
|
}
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
` : ''}
|
|
462
462
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
463
|
-
if (
|
|
464
|
-
let
|
|
465
|
-
if ((
|
|
466
|
-
primitiveCount = i32((
|
|
467
|
-
primitiveOffset =
|
|
468
|
-
+ i32(
|
|
463
|
+
if (gN == 1u) {
|
|
464
|
+
let hT = bitcast<u32>(node);
|
|
465
|
+
if ((hT & 0x80000000u) != 0u) {
|
|
466
|
+
primitiveCount = i32((hT >> 23u) & 0xffu);
|
|
467
|
+
primitiveOffset = bufferOff + blasOffset
|
|
468
|
+
+ i32(hT & 0x007fffffu);
|
|
469
469
|
}
|
|
470
470
|
else {
|
|
471
|
-
let i = node +
|
|
472
|
-
let
|
|
473
|
-
let
|
|
474
|
-
let
|
|
475
|
-
let
|
|
476
|
-
let nodeMin =
|
|
477
|
-
let
|
|
478
|
-
let
|
|
479
|
-
bitcast<u32>(
|
|
480
|
-
bitcast<u32>(
|
|
471
|
+
let i = node + bufferOff;
|
|
472
|
+
let vW = bvhBuffer[i];
|
|
473
|
+
let sq = bvhBuffer[i + 1];
|
|
474
|
+
let qI = bvhBuffer[i + 2];
|
|
475
|
+
let oF = bvhBuffer[i + 3];
|
|
476
|
+
let nodeMin = vW.xyz;
|
|
477
|
+
let ea = vec3f(vW.w, sq.x, sq.y);
|
|
478
|
+
let mF = array<u32, 4>(
|
|
479
|
+
bitcast<u32>(sq.z), bitcast<u32>(sq.w),
|
|
480
|
+
bitcast<u32>(qI.x), bitcast<u32>(qI.y)
|
|
481
481
|
);
|
|
482
482
|
|
|
483
483
|
|
|
484
|
-
let negative =
|
|
485
|
-
let
|
|
486
|
-
let
|
|
487
|
-
let
|
|
488
|
-
let
|
|
489
|
-
let
|
|
490
|
-
let
|
|
491
|
-
let padding =
|
|
492
|
-
let
|
|
484
|
+
let negative = gb < vec3f(0.0);
|
|
485
|
+
let wK = unpack4x8unorm(bitcast<u32>(select(qI.z, oF.y, negative.x)));
|
|
486
|
+
let xX = unpack4x8unorm(bitcast<u32>(select(oF.y, qI.z, negative.x)));
|
|
487
|
+
let wL = unpack4x8unorm(bitcast<u32>(select(qI.w, oF.z, negative.y)));
|
|
488
|
+
let xY = unpack4x8unorm(bitcast<u32>(select(oF.z, qI.w, negative.y)));
|
|
489
|
+
let wM = unpack4x8unorm(bitcast<u32>(select(oF.x, oF.w, negative.z)));
|
|
490
|
+
let xZ = unpack4x8unorm(bitcast<u32>(select(oF.w, oF.x, negative.z)));
|
|
491
|
+
let padding = eU(gb, o);
|
|
492
|
+
let ns = max(
|
|
493
493
|
max(
|
|
494
|
-
(nodeMin.x +
|
|
495
|
-
(nodeMin.y +
|
|
494
|
+
(nodeMin.x + wK * ea.x - o.x) * gb.x - vec4f(padding.x),
|
|
495
|
+
(nodeMin.y + wL * ea.y - o.y) * gb.y - vec4f(padding.y)
|
|
496
496
|
),
|
|
497
|
-
(nodeMin.z +
|
|
497
|
+
(nodeMin.z + wM * ea.z - o.z) * gb.z - vec4f(padding.z)
|
|
498
498
|
);
|
|
499
|
-
let
|
|
499
|
+
let sW = min(
|
|
500
500
|
min(
|
|
501
|
-
(nodeMin.x +
|
|
502
|
-
(nodeMin.y +
|
|
501
|
+
(nodeMin.x + xX * ea.x - o.x) * gb.x + vec4f(padding.x),
|
|
502
|
+
(nodeMin.y + xY * ea.y - o.y) * gb.y + vec4f(padding.y)
|
|
503
503
|
),
|
|
504
|
-
(nodeMin.z +
|
|
504
|
+
(nodeMin.z + xZ * ea.z - o.z) * gb.z + vec4f(padding.z)
|
|
505
505
|
);
|
|
506
|
-
var distance = select(
|
|
506
|
+
var distance = select(sW, ns, ns > vec4f(0.0));
|
|
507
507
|
distance = select(
|
|
508
508
|
distance,
|
|
509
509
|
vec4f(-1.0),
|
|
510
|
-
|
|
510
|
+
ns > min(sW, vec4f(tMax))
|
|
511
511
|
);
|
|
512
|
-
var
|
|
512
|
+
var eY = array<f32, 4>(
|
|
513
513
|
distance.x,
|
|
514
514
|
distance.y,
|
|
515
515
|
distance.z,
|
|
@@ -518,78 +518,78 @@ distance.w
|
|
|
518
518
|
|
|
519
519
|
|
|
520
520
|
for (var order = 0; order < 4; order++) {
|
|
521
|
-
var
|
|
522
|
-
var
|
|
521
|
+
var dW = -1.0;
|
|
522
|
+
var ej = -1;
|
|
523
523
|
for (var child = 0; child < 4; child++) {
|
|
524
524
|
if (
|
|
525
|
-
|
|
526
|
-
|
|
525
|
+
mF[child] != 0u &&
|
|
526
|
+
eY[child] > dW
|
|
527
527
|
) {
|
|
528
|
-
|
|
529
|
-
|
|
528
|
+
dW = eY[child];
|
|
529
|
+
ej = child;
|
|
530
530
|
}
|
|
531
531
|
}
|
|
532
|
-
if (
|
|
533
|
-
let
|
|
534
|
-
var
|
|
535
|
-
if ((
|
|
536
|
-
|
|
532
|
+
if (ej >= 0 && dW > 0.0) {
|
|
533
|
+
let ol = mF[ej];
|
|
534
|
+
var jO = bitcast<i32>(ol);
|
|
535
|
+
if ((ol & 0x80000000u) == 0u) {
|
|
536
|
+
jO += blasOffset;
|
|
537
537
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
538
|
+
dR++;
|
|
539
|
+
gs[dR] = jO;
|
|
540
|
+
eY[ej] = -1.0;
|
|
541
541
|
}
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
}
|
|
545
545
|
` : ''}
|
|
546
546
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
548
|
-
let i = node +
|
|
547
|
+
if (gN == 0u) {
|
|
548
|
+
let i = node + bufferOff;
|
|
549
549
|
let r1 = bvhBuffer[i];
|
|
550
|
-
let
|
|
550
|
+
let bf = bitcast<i32>(r1.w);
|
|
551
551
|
|
|
552
|
-
if (
|
|
552
|
+
if (bf >= 0) {
|
|
553
553
|
let left = node + 2;
|
|
554
|
-
let right =
|
|
555
|
-
let d0 =
|
|
554
|
+
let right = bf + blasOffset;
|
|
555
|
+
let d0 = cH(
|
|
556
556
|
o,
|
|
557
|
-
bvhBuffer[left +
|
|
558
|
-
bvhBuffer[left + 1 +
|
|
559
|
-
|
|
557
|
+
bvhBuffer[left + bufferOff].xyz,
|
|
558
|
+
bvhBuffer[left + 1 + bufferOff].xyz,
|
|
559
|
+
gb,
|
|
560
560
|
tMax
|
|
561
561
|
);
|
|
562
|
-
let d1 =
|
|
562
|
+
let d1 = cH(
|
|
563
563
|
o,
|
|
564
|
-
bvhBuffer[right +
|
|
565
|
-
bvhBuffer[right + 1 +
|
|
566
|
-
|
|
564
|
+
bvhBuffer[right + bufferOff].xyz,
|
|
565
|
+
bvhBuffer[right + 1 + bufferOff].xyz,
|
|
566
|
+
gb,
|
|
567
567
|
tMax
|
|
568
568
|
);
|
|
569
569
|
|
|
570
570
|
if (d0 > d1) {
|
|
571
571
|
if (d0 > 0.0) {
|
|
572
|
-
|
|
572
|
+
dR++; gs[dR] = left;
|
|
573
573
|
|
|
574
574
|
}
|
|
575
575
|
if (d1 > 0.0) {
|
|
576
|
-
|
|
576
|
+
dR++; gs[dR] = right;
|
|
577
577
|
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
else {
|
|
581
581
|
if (d1 > 0.0) {
|
|
582
|
-
|
|
582
|
+
dR++; gs[dR] = right;
|
|
583
583
|
|
|
584
584
|
}
|
|
585
585
|
if (d0 > 0.0) {
|
|
586
|
-
|
|
586
|
+
dR++; gs[dR] = left;
|
|
587
587
|
|
|
588
588
|
}
|
|
589
589
|
}
|
|
590
590
|
}
|
|
591
591
|
else {
|
|
592
|
-
primitiveCount = -
|
|
592
|
+
primitiveCount = -bf;
|
|
593
593
|
primitiveOffset = i + 2;
|
|
594
594
|
}
|
|
595
595
|
}
|
|
@@ -608,23 +608,24 @@ ${intersectTriangles}
|
|
|
608
608
|
// triangle tests without surface completion or any integrator/alpha sampling.
|
|
609
609
|
export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
|
|
610
610
|
return /* wgsl */ `
|
|
611
|
-
struct
|
|
611
|
+
struct qV {
|
|
612
612
|
hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
|
|
613
613
|
}
|
|
614
|
-
fn
|
|
615
|
-
var result:
|
|
614
|
+
fn wq(ray: Ray) -> qV {
|
|
615
|
+
var result: qV;
|
|
616
616
|
result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
|
|
617
617
|
if (rtUniform.isEmpty > 0) { return result; }
|
|
618
618
|
let bounces = 0;
|
|
619
619
|
let doubleSided = false;
|
|
620
|
-
let
|
|
621
|
-
let
|
|
620
|
+
let jg = false;
|
|
621
|
+
let fH = -1;
|
|
622
|
+
let fG = -1;
|
|
622
623
|
var tMax = RAY_MAX_DISTANCE;
|
|
623
|
-
var
|
|
624
|
-
var
|
|
624
|
+
var dZ: i32;
|
|
625
|
+
var gH: vec3f;
|
|
625
626
|
${getBVHTraverseCode(`
|
|
626
|
-
result.hit = true; result.instance =
|
|
627
|
-
result.t = tMax; result.barycentric =
|
|
627
|
+
result.hit = true; result.instance = bK; result.record = triangleIndex;
|
|
628
|
+
result.t = tMax; result.barycentric = aw;
|
|
628
629
|
`, false, false, 1, hasAnisotropyDirections)}
|
|
629
630
|
return result;
|
|
630
631
|
}
|
|
@@ -632,7 +633,7 @@ return result;
|
|
|
632
633
|
}
|
|
633
634
|
export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
|
|
634
635
|
return /* wgsl */ `
|
|
635
|
-
fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool,
|
|
636
|
+
fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jg: bool) {
|
|
636
637
|
|
|
637
638
|
(*si).hit = false;
|
|
638
639
|
|
|
@@ -641,31 +642,32 @@ return;
|
|
|
641
642
|
}
|
|
642
643
|
|
|
643
644
|
var tMax = RAY_MAX_DISTANCE;
|
|
644
|
-
var
|
|
645
|
-
var
|
|
645
|
+
var dZ: i32;
|
|
646
|
+
var gH: vec3f;
|
|
646
647
|
|
|
647
|
-
var
|
|
648
|
-
var
|
|
649
|
-
var
|
|
650
|
-
var
|
|
648
|
+
var hr: vec3i;
|
|
649
|
+
var lR: fw;
|
|
650
|
+
var am: i32;
|
|
651
|
+
var fH: i32 = (*si).triangleIndex;
|
|
652
|
+
let fG = (*si).instanceIndex;
|
|
651
653
|
|
|
652
654
|
${getBVHTraverseCode(`
|
|
653
655
|
(*si).triangleIndex = triangleIndex;
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
656
|
+
lR = tri;
|
|
657
|
+
hr = index;
|
|
658
|
+
am = bK;
|
|
657
659
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
658
660
|
|
|
659
|
-
${closestHitHook} if (
|
|
660
|
-
|
|
661
|
+
${closestHitHook} if (sd) {
|
|
662
|
+
mH(
|
|
661
663
|
si,
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
664
|
+
lR,
|
|
665
|
+
aw,
|
|
666
|
+
hr,
|
|
667
|
+
bP,
|
|
668
|
+
am,
|
|
669
|
+
ex,
|
|
670
|
+
eS,
|
|
669
671
|
-1
|
|
670
672
|
);
|
|
671
673
|
}
|
|
@@ -681,61 +683,62 @@ return;
|
|
|
681
683
|
|
|
682
684
|
let bounces = 0;
|
|
683
685
|
let doubleSided = true;
|
|
684
|
-
let
|
|
686
|
+
let jg = false;
|
|
685
687
|
var tMax = maxDistance;
|
|
686
|
-
var
|
|
687
|
-
var
|
|
688
|
-
var
|
|
689
|
-
var
|
|
690
|
-
var
|
|
691
|
-
var
|
|
688
|
+
var dZ: i32;
|
|
689
|
+
var gH: vec3f;
|
|
690
|
+
var hr: vec3i;
|
|
691
|
+
var lR: fw;
|
|
692
|
+
var am: i32;
|
|
693
|
+
var fH: i32 = -1;
|
|
694
|
+
let fG = instanceIndex;
|
|
692
695
|
|
|
693
696
|
${getBVHTraverseCode(`
|
|
694
697
|
(*si).triangleIndex = triangleIndex;
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
+
lR = tri;
|
|
699
|
+
hr = index;
|
|
700
|
+
am = bK;
|
|
698
701
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
699
|
-
if (
|
|
702
|
+
if (bK != instanceIndex) {
|
|
700
703
|
continue;
|
|
701
704
|
}
|
|
702
705
|
`)}
|
|
703
706
|
|
|
704
|
-
if (
|
|
705
|
-
(*si).instanceIndex =
|
|
706
|
-
(*si).normal =
|
|
707
|
-
(*si).position =
|
|
708
|
-
(*si).materialIndex = i32(
|
|
709
|
-
|
|
707
|
+
if (sd) {
|
|
708
|
+
(*si).instanceIndex = am;
|
|
709
|
+
(*si).normal = ex;
|
|
710
|
+
(*si).position = eS;
|
|
711
|
+
(*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
712
|
+
hn(
|
|
710
713
|
si,
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
714
|
+
lR,
|
|
715
|
+
aw,
|
|
716
|
+
hr,
|
|
717
|
+
bP,
|
|
715
718
|
-1
|
|
716
719
|
);
|
|
717
720
|
|
|
718
721
|
let l2w = mat4x4<f32>(
|
|
719
|
-
instancesBuffer[
|
|
720
|
-
instancesBuffer[
|
|
721
|
-
instancesBuffer[
|
|
722
|
-
instancesBuffer[
|
|
722
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
723
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
724
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
725
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
723
726
|
);
|
|
724
727
|
let w2l = mat4x4<f32>(
|
|
725
|
-
instancesBuffer[
|
|
726
|
-
instancesBuffer[
|
|
727
|
-
instancesBuffer[
|
|
728
|
-
instancesBuffer[
|
|
728
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
729
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
730
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
731
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
729
732
|
);
|
|
730
|
-
let
|
|
733
|
+
let aG = transpose(mat3x3<f32>(
|
|
731
734
|
w2l[0].xyz,
|
|
732
735
|
w2l[1].xyz,
|
|
733
736
|
w2l[2].xyz
|
|
734
737
|
));
|
|
735
|
-
(*si).faceNormal = normalize(
|
|
736
|
-
(*si).vertexNormal = normalize(
|
|
737
|
-
(*si).normal = normalize(
|
|
738
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(
|
|
738
|
+
(*si).faceNormal = normalize(aG * ex);
|
|
739
|
+
(*si).vertexNormal = normalize(aG * (*si).vertexNormal);
|
|
740
|
+
(*si).normal = normalize(aG * (*si).normal);
|
|
741
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aG * (*si).coatNormal);` : ''}
|
|
739
742
|
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
740
743
|
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
741
744
|
}
|
|
@@ -750,45 +753,46 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
750
753
|
}
|
|
751
754
|
}
|
|
752
755
|
|
|
753
|
-
fn ${shadowName}(ray: Ray, lightDistance: f32,
|
|
756
|
+
fn ${shadowName}(ray: Ray, lightDistance: f32, jR: i32, rU:i32) -> bool {
|
|
754
757
|
if (rtUniform.isEmpty > 0) {
|
|
755
758
|
return false;
|
|
756
759
|
}
|
|
757
760
|
|
|
758
761
|
let doubleSided = true;
|
|
759
|
-
let
|
|
760
|
-
var tMax =
|
|
761
|
-
var
|
|
762
|
-
var
|
|
762
|
+
let rj = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
763
|
+
var tMax = rj;
|
|
764
|
+
var dZ: i32;
|
|
765
|
+
var gH: vec3f;
|
|
763
766
|
|
|
764
767
|
let bounces = 1;
|
|
765
|
-
var
|
|
766
|
-
var
|
|
768
|
+
var jg = false;
|
|
769
|
+
var fH: i32 = jR;
|
|
770
|
+
let fG = rU;
|
|
767
771
|
|
|
768
772
|
${getBVHTraverseCode(
|
|
769
773
|
/*wgsl */ `
|
|
770
774
|
|
|
771
775
|
|
|
772
776
|
|
|
773
|
-
var
|
|
777
|
+
var jA = true;
|
|
774
778
|
|
|
775
|
-
if (
|
|
779
|
+
if (jA) {
|
|
776
780
|
if (HAS_ALPHA) {
|
|
777
|
-
let materialIndex = i32(
|
|
778
|
-
if (!
|
|
781
|
+
let materialIndex = i32(af(bitcast<i32>(oX.z)).x);
|
|
782
|
+
if (!ou(
|
|
779
783
|
materialIndex,
|
|
780
784
|
index,
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
785
|
+
aw,
|
|
786
|
+
eS,
|
|
787
|
+
ex
|
|
784
788
|
)) {
|
|
785
789
|
|
|
786
|
-
tMax =
|
|
787
|
-
|
|
790
|
+
tMax = rj;
|
|
791
|
+
jA = false;
|
|
788
792
|
}
|
|
789
793
|
}
|
|
790
794
|
}
|
|
791
|
-
if (
|
|
795
|
+
if (jA) {
|
|
792
796
|
return true;
|
|
793
797
|
}
|
|
794
798
|
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|
|
@@ -805,20 +809,20 @@ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirecti
|
|
|
805
809
|
|
|
806
810
|
|
|
807
811
|
|
|
808
|
-
var<private>
|
|
809
|
-
var<private>
|
|
810
|
-
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private>
|
|
812
|
+
var<private> mw: array<i32, TLAS_STACK_SIZE>;
|
|
813
|
+
var<private> gs: array<i32, BLAS_STACK_SIZE>;
|
|
814
|
+
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> tE: array<vec2u, BLAS_STACK_SIZE>;` : ''}
|
|
811
815
|
|
|
812
816
|
${hasDisplacement ? displacementWgsl : ''}
|
|
813
817
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
814
818
|
|
|
815
|
-
struct
|
|
819
|
+
struct fw {
|
|
816
820
|
p0: vec3f,
|
|
817
821
|
p1: vec3f,
|
|
818
822
|
p2: vec3f,
|
|
819
823
|
};
|
|
820
824
|
|
|
821
|
-
fn
|
|
825
|
+
fn hs(rad: f32, pos: vec3f, r: Ray) -> f32 {
|
|
822
826
|
let op: vec3f = pos - r.o;
|
|
823
827
|
let eps: f32 = 0.001;
|
|
824
828
|
let b: f32 = dot(op, r.d);
|
|
@@ -841,7 +845,7 @@ return t2;
|
|
|
841
845
|
return INF;
|
|
842
846
|
}
|
|
843
847
|
|
|
844
|
-
fn
|
|
848
|
+
fn nV(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
845
849
|
let dt: f32 = dot(r.d, n);
|
|
846
850
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
847
851
|
|
|
@@ -861,14 +865,16 @@ return INF;
|
|
|
861
865
|
}
|
|
862
866
|
|
|
863
867
|
fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
|
|
864
|
-
let
|
|
865
|
-
if (
|
|
866
|
-
let
|
|
867
|
-
let cosThetaMax = sqrt(max(0.0, 1.0 -
|
|
868
|
-
|
|
868
|
+
let ao = distance(origin, center);
|
|
869
|
+
if (ao <= radius) { return INV4PI; }
|
|
870
|
+
let sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
|
|
871
|
+
let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
|
|
872
|
+
|
|
873
|
+
let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
874
|
+
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
869
875
|
}
|
|
870
876
|
|
|
871
|
-
fn
|
|
877
|
+
fn mX(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
872
878
|
|
|
873
879
|
|
|
874
880
|
var d: f32 = INF;
|
|
@@ -880,9 +886,9 @@ var d: f32 = INF;
|
|
|
880
886
|
(*lightSample).isDelta = false;
|
|
881
887
|
var u = light.u;
|
|
882
888
|
var v = light.v;
|
|
883
|
-
var
|
|
889
|
+
var dO = i32(light.litType);
|
|
884
890
|
|
|
885
|
-
if (HAS_SCENE_RECT_LIGHT &&
|
|
891
|
+
if (HAS_SCENE_RECT_LIGHT && dO == RECT_LIGHT) {
|
|
886
892
|
|
|
887
893
|
var pos = light.position - u * 0.5 - v * 0.5;
|
|
888
894
|
var normal = normalize(cross(u, v));
|
|
@@ -890,18 +896,18 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
890
896
|
return INF;
|
|
891
897
|
}
|
|
892
898
|
|
|
893
|
-
d =
|
|
899
|
+
d = nV(pos, u, v, normal, r);
|
|
894
900
|
if (d < 0.0) {
|
|
895
901
|
d = INF;
|
|
896
902
|
}
|
|
897
903
|
else {
|
|
898
|
-
var
|
|
904
|
+
var ct: f32 = dot(-r.d, normal);
|
|
899
905
|
let spread = light.radiusOrSpread;
|
|
900
|
-
if (
|
|
906
|
+
if (ct >= cos(spread * PI / 2.0)) {
|
|
901
907
|
(*lightSample).direction = r.d;
|
|
902
908
|
(*lightSample).normal = normal;
|
|
903
909
|
(*lightSample).dist = d;
|
|
904
|
-
(*lightSample).pdf = (d * d) / (light.area *
|
|
910
|
+
(*lightSample).pdf = (d * d) / (light.area * ct);
|
|
905
911
|
(*lightSample).emission = light.emission;
|
|
906
912
|
(*lightSample).isDelta = false;
|
|
907
913
|
}
|
|
@@ -911,12 +917,12 @@ d = INF;
|
|
|
911
917
|
}
|
|
912
918
|
}
|
|
913
919
|
|
|
914
|
-
else if (HAS_SCENE_SPHERE_LIGHT &&
|
|
920
|
+
else if (HAS_SCENE_SPHERE_LIGHT && dO == SPHERE_LIGHT) {
|
|
915
921
|
if (light.radiusOrSpread <= 0.0) {
|
|
916
|
-
let
|
|
917
|
-
let projection = dot(
|
|
918
|
-
let
|
|
919
|
-
if (projection <= EPS || dot(
|
|
922
|
+
let kz = light.position - r.o;
|
|
923
|
+
let projection = dot(kz, r.d);
|
|
924
|
+
let bd = kz - projection * r.d;
|
|
925
|
+
if (projection <= EPS || dot(bd, bd) > 1e-8) {
|
|
920
926
|
return INF;
|
|
921
927
|
}
|
|
922
928
|
d = projection;
|
|
@@ -927,7 +933,7 @@ d = projection;
|
|
|
927
933
|
(*lightSample).isDelta = true;
|
|
928
934
|
}
|
|
929
935
|
else {
|
|
930
|
-
d =
|
|
936
|
+
d = hs(light.radiusOrSpread, light.position, r);
|
|
931
937
|
(*lightSample).isDelta = false;
|
|
932
938
|
if (d > 0.0 && d != INF) {
|
|
933
939
|
(*lightSample).direction = r.d;
|
|
@@ -956,12 +962,12 @@ light.radiusOrSpread <= 0.0
|
|
|
956
962
|
}
|
|
957
963
|
}
|
|
958
964
|
|
|
959
|
-
else if (HAS_SCENE_SPOT_LIGHT &&
|
|
965
|
+
else if (HAS_SCENE_SPOT_LIGHT && dO == SPOT_LIGHT) {
|
|
960
966
|
if (light.radiusOrSpread <= 0.0) {
|
|
961
|
-
let
|
|
962
|
-
let projection = dot(
|
|
963
|
-
let
|
|
964
|
-
if (projection <= EPS || dot(
|
|
967
|
+
let kz = light.position - r.o;
|
|
968
|
+
let projection = dot(kz, r.d);
|
|
969
|
+
let bd = kz - projection * r.d;
|
|
970
|
+
if (projection <= EPS || dot(bd, bd) > 1e-8) {
|
|
965
971
|
return INF;
|
|
966
972
|
}
|
|
967
973
|
d = projection;
|
|
@@ -972,13 +978,13 @@ d = projection;
|
|
|
972
978
|
(*lightSample).isDelta = true;
|
|
973
979
|
}
|
|
974
980
|
else {
|
|
975
|
-
d =
|
|
981
|
+
d = hs(light.radiusOrSpread, light.position, r);
|
|
976
982
|
(*lightSample).isDelta = false;
|
|
977
983
|
}
|
|
978
984
|
if (d != INF) {
|
|
979
|
-
let
|
|
980
|
-
let
|
|
981
|
-
if (
|
|
985
|
+
let xv = r.o + d * r.d;
|
|
986
|
+
let ne = evaluateSpotEmissionMultiplier(light, normalize(r.o - xv));
|
|
987
|
+
if (ne <= 0.0) { return INF; }
|
|
982
988
|
if (light.radiusOrSpread > 0.0) {
|
|
983
989
|
(*lightSample).direction = r.d;
|
|
984
990
|
(*lightSample).dist = d;
|
|
@@ -987,7 +993,7 @@ r.o + r.d * d - light.position
|
|
|
987
993
|
);
|
|
988
994
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
989
995
|
}
|
|
990
|
-
(*lightSample).emission = light.emission *
|
|
996
|
+
(*lightSample).emission = light.emission * ne * select(
|
|
991
997
|
1.0,
|
|
992
998
|
1.0 / max(d * d, 1e-8),
|
|
993
999
|
light.radiusOrSpread <= 0.0
|
|
@@ -995,7 +1001,7 @@ light.radiusOrSpread <= 0.0
|
|
|
995
1001
|
}
|
|
996
1002
|
}
|
|
997
1003
|
|
|
998
|
-
else if (
|
|
1004
|
+
else if (dO != RECT_LIGHT && dO != SPHERE_LIGHT && dO != SPOT_LIGHT) {
|
|
999
1005
|
|
|
1000
1006
|
d = INF;
|
|
1001
1007
|
}
|
|
@@ -1003,111 +1009,111 @@ d = INF;
|
|
|
1003
1009
|
return d;
|
|
1004
1010
|
}
|
|
1005
1011
|
|
|
1006
|
-
fn
|
|
1007
|
-
let m00 =
|
|
1008
|
-
let m01 =
|
|
1009
|
-
let m02 =
|
|
1010
|
-
let m10 =
|
|
1011
|
-
let m11 =
|
|
1012
|
-
let m12 =
|
|
1013
|
-
let m20 =
|
|
1014
|
-
let m21 =
|
|
1015
|
-
let m22 =
|
|
1016
|
-
var w00 = m00.y *
|
|
1017
|
-
var w01 = m01.y *
|
|
1018
|
-
var w02 = m02.y *
|
|
1019
|
-
var w10 = m10.y *
|
|
1020
|
-
var w11 = m11.y *
|
|
1021
|
-
var w12 = m12.y *
|
|
1022
|
-
var w20 = m20.y *
|
|
1023
|
-
var w21 = m21.y *
|
|
1024
|
-
var w22 = m22.y *
|
|
1025
|
-
|
|
1026
|
-
var
|
|
1027
|
-
|
|
1028
|
-
w00 = w00 /
|
|
1029
|
-
w01 = w01 /
|
|
1030
|
-
w02 = w02 /
|
|
1031
|
-
w10 = w10 /
|
|
1032
|
-
w11 = w11 /
|
|
1033
|
-
w12 = w12 /
|
|
1034
|
-
w20 = w20 /
|
|
1035
|
-
w21 = w21 /
|
|
1036
|
-
w22 = w22 /
|
|
1037
|
-
|
|
1038
|
-
let rand =
|
|
1039
|
-
var
|
|
1012
|
+
fn fh(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
|
|
1013
|
+
let m00 = af(m0.x);
|
|
1014
|
+
let m01 = af(m0.y);
|
|
1015
|
+
let m02 = af(m0.z);
|
|
1016
|
+
let m10 = af(m1.x);
|
|
1017
|
+
let m11 = af(m1.y);
|
|
1018
|
+
let m12 = af(m1.z);
|
|
1019
|
+
let m20 = af(m2.x);
|
|
1020
|
+
let m21 = af(m2.y);
|
|
1021
|
+
let m22 = af(m2.z);
|
|
1022
|
+
var w00 = m00.y * bary.x;
|
|
1023
|
+
var w01 = m01.y * bary.x;
|
|
1024
|
+
var w02 = m02.y * bary.x;
|
|
1025
|
+
var w10 = m10.y * bary.y;
|
|
1026
|
+
var w11 = m11.y * bary.y;
|
|
1027
|
+
var w12 = m12.y * bary.y;
|
|
1028
|
+
var w20 = m20.y * bary.z;
|
|
1029
|
+
var w21 = m21.y * bary.z;
|
|
1030
|
+
var w22 = m22.y * bary.z;
|
|
1031
|
+
|
|
1032
|
+
var hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
1033
|
+
|
|
1034
|
+
w00 = w00 / hd;
|
|
1035
|
+
w01 = w01 / hd + w00;
|
|
1036
|
+
w02 = w02 / hd + w01;
|
|
1037
|
+
w10 = w10 / hd + w02;
|
|
1038
|
+
w11 = w11 / hd + w10;
|
|
1039
|
+
w12 = w12 / hd + w11;
|
|
1040
|
+
w20 = w20 / hd + w12;
|
|
1041
|
+
w21 = w21 / hd + w20;
|
|
1042
|
+
w22 = w22 / hd + w21;
|
|
1043
|
+
|
|
1044
|
+
let rand = ek(0u);
|
|
1045
|
+
var nW: f32;
|
|
1040
1046
|
if (rand < w00) {
|
|
1041
|
-
|
|
1047
|
+
nW = m00.x;
|
|
1042
1048
|
} else if (rand < w01) {
|
|
1043
|
-
|
|
1049
|
+
nW = m01.x;
|
|
1044
1050
|
} else if (rand < w02) {
|
|
1045
|
-
|
|
1051
|
+
nW = m02.x;
|
|
1046
1052
|
} else if (rand < w10) {
|
|
1047
|
-
|
|
1053
|
+
nW = m10.x;
|
|
1048
1054
|
} else if (rand < w11) {
|
|
1049
|
-
|
|
1055
|
+
nW = m11.x;
|
|
1050
1056
|
} else if (rand < w12) {
|
|
1051
|
-
|
|
1057
|
+
nW = m12.x;
|
|
1052
1058
|
} else if (rand < w20) {
|
|
1053
|
-
|
|
1059
|
+
nW = m20.x;
|
|
1054
1060
|
} else if (rand < w21) {
|
|
1055
|
-
|
|
1061
|
+
nW = m21.x;
|
|
1056
1062
|
} else {
|
|
1057
|
-
|
|
1063
|
+
nW = m22.x;
|
|
1058
1064
|
}
|
|
1059
|
-
return i32(
|
|
1065
|
+
return i32(nW);
|
|
1060
1066
|
}
|
|
1061
1067
|
|
|
1062
|
-
fn
|
|
1063
|
-
|
|
1068
|
+
fn mp(
|
|
1069
|
+
pQ: i32,
|
|
1064
1070
|
index: vec3i,
|
|
1065
|
-
|
|
1071
|
+
bary: vec3f
|
|
1066
1072
|
) -> i32 {
|
|
1067
1073
|
let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1068
1074
|
let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1069
1075
|
let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1070
1076
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1071
|
-
return
|
|
1077
|
+
return fh(m0, m1, m2, bary);
|
|
1072
1078
|
}
|
|
1073
|
-
return
|
|
1079
|
+
return pQ;
|
|
1074
1080
|
}
|
|
1075
1081
|
|
|
1076
1082
|
|
|
1077
1083
|
|
|
1078
1084
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1079
|
-
fn
|
|
1080
|
-
let determinant =
|
|
1085
|
+
fn ez(normal: vec3f, dp1: vec3f, dp2: vec3f, oM: vec2f, oN: vec2f, input: vec4f) -> mat2x3f {
|
|
1086
|
+
let determinant = oM.x * oN.y - oM.y * oN.x;
|
|
1081
1087
|
var t = input.xyz;
|
|
1082
1088
|
var b = vec3f(0.0);
|
|
1083
1089
|
|
|
1084
1090
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
1085
1091
|
if (abs(determinant) > 1e-12) {
|
|
1086
|
-
let dt = (dp1 *
|
|
1087
|
-
let db = (dp2 *
|
|
1092
|
+
let dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
|
|
1093
|
+
let db = (dp2 * oM.x - dp1 * oN.x) / determinant;
|
|
1088
1094
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
1089
1095
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
1090
1096
|
}
|
|
1091
1097
|
t -= normal * dot(normal, t);
|
|
1092
1098
|
if (dot(t, t) < 1e-8) {
|
|
1093
|
-
let
|
|
1094
|
-
let
|
|
1095
|
-
let xy = normal.x * normal.y *
|
|
1096
|
-
t = vec3f(1.0 +
|
|
1097
|
-
b = vec3f(xy,
|
|
1099
|
+
let ik = select(-1.0, 1.0, normal.z >= 0.0);
|
|
1100
|
+
let cv = -1.0 / (ik + normal.z);
|
|
1101
|
+
let xy = normal.x * normal.y * cv;
|
|
1102
|
+
t = vec3f(1.0 + ik * normal.x * normal.x * cv, ik * xy, -ik * normal.x);
|
|
1103
|
+
b = vec3f(xy, ik + normal.y * normal.y * cv, -normal.y);
|
|
1098
1104
|
}
|
|
1099
1105
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
1100
1106
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
1101
1107
|
}
|
|
1102
1108
|
|
|
1103
1109
|
` : /* wgsl */ ``}
|
|
1104
|
-
fn
|
|
1110
|
+
fn hn(
|
|
1105
1111
|
si: ptr<function, SurfaceInteraction>,
|
|
1106
|
-
tri:
|
|
1107
|
-
|
|
1112
|
+
tri: fw,
|
|
1113
|
+
bary: vec3f,
|
|
1108
1114
|
index: vec3i,
|
|
1109
|
-
|
|
1110
|
-
|
|
1115
|
+
bP: bool,
|
|
1116
|
+
fq: i32
|
|
1111
1117
|
) {
|
|
1112
1118
|
(*si).hit = true;
|
|
1113
1119
|
|
|
@@ -1119,26 +1125,26 @@ let i1 = index.y;
|
|
|
1119
1125
|
let i2 = index.z;
|
|
1120
1126
|
(*si).vertexColor = vec3f(1.0);
|
|
1121
1127
|
if (USE_VERTEX_COLOR) {
|
|
1122
|
-
(*si).vertexColor =
|
|
1123
|
-
+
|
|
1124
|
-
+
|
|
1128
|
+
(*si).vertexColor = bary.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
1129
|
+
+ bary.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
|
|
1130
|
+
+ bary.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
|
|
1125
1131
|
}
|
|
1126
|
-
let
|
|
1132
|
+
let pL = uvProjection == ${uvProjectionConstants.spherical};
|
|
1127
1133
|
|
|
1128
1134
|
var normal: vec3f = (*si).normal;
|
|
1129
|
-
var
|
|
1135
|
+
var gW: vec3f;
|
|
1130
1136
|
var n0 = vec3f(0.0);
|
|
1131
1137
|
var n1 = vec3f(0.0);
|
|
1132
1138
|
var n2 = vec3f(0.0);
|
|
1133
1139
|
|
|
1134
1140
|
|
|
1135
|
-
if (!
|
|
1141
|
+
if (!bP || pL) {
|
|
1136
1142
|
n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1137
1143
|
n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1138
1144
|
n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1139
|
-
|
|
1140
|
-
if (!
|
|
1141
|
-
normal =
|
|
1145
|
+
gW = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
|
|
1146
|
+
if (!bP) {
|
|
1147
|
+
normal = gW;
|
|
1142
1148
|
}
|
|
1143
1149
|
}
|
|
1144
1150
|
|
|
@@ -1146,19 +1152,19 @@ var uv: vec2f;
|
|
|
1146
1152
|
var uv0: vec2f;
|
|
1147
1153
|
var uv1: vec2f;
|
|
1148
1154
|
var uv2: vec2f;
|
|
1149
|
-
var
|
|
1155
|
+
var cQ = vec2f(0.0);
|
|
1150
1156
|
if (USE_UV) {
|
|
1151
1157
|
uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
|
|
1152
1158
|
uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
|
|
1153
1159
|
uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
|
|
1154
|
-
uv =
|
|
1160
|
+
uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
|
|
1155
1161
|
if (USE_UV1) {
|
|
1156
1162
|
let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1157
1163
|
let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1158
1164
|
let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1159
|
-
|
|
1160
|
-
+
|
|
1161
|
-
+
|
|
1165
|
+
cQ = bary.x * secondaryUv0
|
|
1166
|
+
+ bary.y * secondaryUv1
|
|
1167
|
+
+ bary.z * secondaryUv2;
|
|
1162
1168
|
}
|
|
1163
1169
|
}
|
|
1164
1170
|
|
|
@@ -1166,28 +1172,28 @@ if (USE_TANGENT) {
|
|
|
1166
1172
|
let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1167
1173
|
let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1168
1174
|
let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
|
|
1169
|
-
(*si).tangent = normalize(
|
|
1175
|
+
(*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
|
|
1170
1176
|
}
|
|
1171
1177
|
|
|
1172
|
-
if (
|
|
1173
|
-
(*si).materialIndex =
|
|
1178
|
+
if (fq >= 0) {
|
|
1179
|
+
(*si).materialIndex = fq;
|
|
1174
1180
|
}
|
|
1175
1181
|
else {
|
|
1176
|
-
(*si).materialIndex =
|
|
1182
|
+
(*si).materialIndex = mp(
|
|
1177
1183
|
(*si).materialIndex,
|
|
1178
1184
|
index,
|
|
1179
|
-
|
|
1185
|
+
bary
|
|
1180
1186
|
);
|
|
1181
1187
|
}
|
|
1182
1188
|
|
|
1183
1189
|
if (uvProjection > 0) {
|
|
1184
1190
|
|
|
1185
|
-
uv =
|
|
1186
|
-
|
|
1191
|
+
uv = gE(uvProjection, (*si).position, select(normal, gW, pL));
|
|
1192
|
+
cQ = uv;
|
|
1187
1193
|
}
|
|
1188
1194
|
|
|
1189
1195
|
uv = uv * material.uvScale;
|
|
1190
|
-
|
|
1196
|
+
cQ = cQ * material.uvScale;
|
|
1191
1197
|
|
|
1192
1198
|
|
|
1193
1199
|
if (uvProjection == ${uvProjectionConstants.triplanar}) {
|
|
@@ -1200,41 +1206,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
|
1200
1206
|
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
|
|
1201
1207
|
let dp1 = tri.p0 - tri.p2;
|
|
1202
1208
|
let dp2 = tri.p1 - tri.p2;
|
|
1203
|
-
var
|
|
1209
|
+
var aS = vec4f(0.0);
|
|
1204
1210
|
if (USE_TANGENT) {
|
|
1205
|
-
|
|
1206
|
-
+
|
|
1207
|
-
+
|
|
1208
|
-
}
|
|
1209
|
-
let
|
|
1210
|
-
(*si).geometryTangent =
|
|
1211
|
-
(*si).geometryBitangent =
|
|
1212
|
-
var
|
|
1211
|
+
aS = bary.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
|
|
1212
|
+
+ bary.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
|
|
1213
|
+
+ bary.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
|
|
1214
|
+
}
|
|
1215
|
+
let eL = ez(normal, dp1, dp2, uv0-uv2, uv1-uv2, aS);
|
|
1216
|
+
(*si).geometryTangent = eL[0];
|
|
1217
|
+
(*si).geometryBitangent = eL[1];
|
|
1218
|
+
var fX = eL;
|
|
1213
1219
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1214
1220
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1215
1221
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1216
1222
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1217
|
-
|
|
1223
|
+
fX = ez(normal, dp1, dp2, a-c, b-c, select(aS, vec4f(0.0), aS.w == 0.0));
|
|
1218
1224
|
}
|
|
1219
|
-
(*si).directionTangent =
|
|
1220
|
-
(*si).directionBitangent =
|
|
1225
|
+
(*si).directionTangent = fX[0];
|
|
1226
|
+
(*si).directionBitangent = fX[1];
|
|
1221
1227
|
${hasCoatNormals ? /* wgsl */ `
|
|
1222
1228
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1223
|
-
let
|
|
1224
|
-
var
|
|
1225
|
-
if (USE_UV1 && mapInfo[
|
|
1229
|
+
let kP = i32(directionMaterial.coatNormalMapIndex);
|
|
1230
|
+
var mG = eL;
|
|
1231
|
+
if (USE_UV1 && mapInfo[kP + NUM_MAPS * 2].x > 0.5) {
|
|
1226
1232
|
let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1227
1233
|
let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1228
1234
|
let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
|
|
1229
|
-
|
|
1230
|
-
select(
|
|
1235
|
+
mG = ez(normal, dp1, dp2, a-c, b-c,
|
|
1236
|
+
select(aS, vec4f(0.0), aS.w == 0.0));
|
|
1231
1237
|
}
|
|
1232
1238
|
|
|
1233
1239
|
|
|
1234
|
-
let decoded = sampleMap(
|
|
1235
|
-
select(
|
|
1236
|
-
let mapped =
|
|
1237
|
-
+
|
|
1240
|
+
let decoded = sampleMap(kP, getMapUvSet(kP, uv,
|
|
1241
|
+
select(cQ, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1242
|
+
let mapped = mG[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1243
|
+
+ mG[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1238
1244
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1239
1245
|
}
|
|
1240
1246
|
` : ''}
|
|
@@ -1244,19 +1250,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
|
1244
1250
|
(*si).normal = normal;
|
|
1245
1251
|
(*si).vertexNormal = normal;
|
|
1246
1252
|
(*si).shadowOffset = vec3f(0.0);
|
|
1247
|
-
if (!
|
|
1253
|
+
if (!bP) {
|
|
1248
1254
|
|
|
1249
1255
|
|
|
1250
1256
|
|
|
1251
1257
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1252
|
-
let
|
|
1258
|
+
let kw = bary.x * n0 + bary.y * n1 + bary.z * n2;
|
|
1253
1259
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1254
1260
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1255
1261
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1256
|
-
var h = a *
|
|
1257
|
-
+ (a + b + c) *
|
|
1258
|
-
+ b *
|
|
1259
|
-
if (dot(
|
|
1262
|
+
var h = a * bary.x * (bary.x - 1.0)
|
|
1263
|
+
+ (a + b + c) * bary.x * bary.y
|
|
1264
|
+
+ b * bary.y * (bary.y - 1.0);
|
|
1265
|
+
if (dot(kw, geometricNormal) > 0.0) {
|
|
1260
1266
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1261
1267
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1262
1268
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1274,22 +1280,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1274
1280
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1275
1281
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1276
1282
|
}
|
|
1277
|
-
(*si).shadowOffset =
|
|
1283
|
+
(*si).shadowOffset = kw * h;
|
|
1278
1284
|
}
|
|
1279
1285
|
(*si).uv = uv;
|
|
1280
|
-
(*si).uv1 =
|
|
1286
|
+
(*si).uv1 = cQ;
|
|
1281
1287
|
if (USE_NORMAL_MAPS) {
|
|
1282
1288
|
let dp1 = tri.p0 - tri.p2;
|
|
1283
1289
|
let dp2 = tri.p1 - tri.p2;
|
|
1284
|
-
let
|
|
1285
|
-
let
|
|
1286
|
-
(*si).normal =
|
|
1287
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1290
|
+
let oM = uv0 - uv2;
|
|
1291
|
+
let oN = uv1 - uv2;
|
|
1292
|
+
(*si).normal = oS(
|
|
1293
|
+
(*si).materialIndex, uv, normal, dp1, dp2, oM, oN
|
|
1288
1294
|
);
|
|
1289
1295
|
}
|
|
1290
1296
|
}
|
|
1291
1297
|
|
|
1292
|
-
struct
|
|
1298
|
+
struct ev {
|
|
1293
1299
|
t: f32,
|
|
1294
1300
|
barycentric: vec3f,
|
|
1295
1301
|
};
|
|
@@ -1298,8 +1304,8 @@ barycentric: vec3f,
|
|
|
1298
1304
|
|
|
1299
1305
|
|
|
1300
1306
|
|
|
1301
|
-
fn
|
|
1302
|
-
var ti:
|
|
1307
|
+
fn fM(o: vec3f, d: vec3f, tri: fw, dZ: i32, gH: vec3f, tMax: f32) -> ev {
|
|
1308
|
+
var ti: ev;
|
|
1303
1309
|
|
|
1304
1310
|
|
|
1305
1311
|
var p0t = tri.p0 - o;
|
|
@@ -1307,11 +1313,11 @@ var p1t = tri.p1 - o;
|
|
|
1307
1313
|
var p2t = tri.p2 - o;
|
|
1308
1314
|
|
|
1309
1315
|
|
|
1310
|
-
if (
|
|
1316
|
+
if (dZ == 0) {
|
|
1311
1317
|
p0t = p0t.yzx;
|
|
1312
1318
|
p1t = p1t.yzx;
|
|
1313
1319
|
p2t = p2t.yzx;
|
|
1314
|
-
} else if (
|
|
1320
|
+
} else if (dZ == 1) {
|
|
1315
1321
|
p0t = p0t.zxy;
|
|
1316
1322
|
p1t = p1t.zxy;
|
|
1317
1323
|
p2t = p2t.zxy;
|
|
@@ -1319,9 +1325,9 @@ p2t = p2t.zxy;
|
|
|
1319
1325
|
|
|
1320
1326
|
|
|
1321
1327
|
|
|
1322
|
-
p0t = vec3f(p0t.xy +
|
|
1323
|
-
p1t = vec3f(p1t.xy +
|
|
1324
|
-
p2t = vec3f(p2t.xy +
|
|
1328
|
+
p0t = vec3f(p0t.xy + gH.xy * p0t.z, p0t.z);
|
|
1329
|
+
p1t = vec3f(p1t.xy + gH.xy * p1t.z, p1t.z);
|
|
1330
|
+
p2t = vec3f(p2t.xy + gH.xy * p2t.z, p2t.z);
|
|
1325
1331
|
|
|
1326
1332
|
|
|
1327
1333
|
var e = vec3f(
|
|
@@ -1333,9 +1339,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1333
1339
|
if (DEPTH_QUERY_MODE) {
|
|
1334
1340
|
|
|
1335
1341
|
|
|
1336
|
-
let
|
|
1342
|
+
let sB = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1337
1343
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1338
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1344
|
+
e = select(e, vec3f(0.0), abs(e) <= sB * 1e-6);
|
|
1339
1345
|
}
|
|
1340
1346
|
|
|
1341
1347
|
|
|
@@ -1346,19 +1352,19 @@ return ti;
|
|
|
1346
1352
|
let det = e.x + e.y + e.z;
|
|
1347
1353
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1348
1354
|
|
|
1349
|
-
p0t.z *=
|
|
1350
|
-
p1t.z *=
|
|
1351
|
-
p2t.z *=
|
|
1352
|
-
let
|
|
1355
|
+
p0t.z *= gH.z;
|
|
1356
|
+
p1t.z *= gH.z;
|
|
1357
|
+
p2t.z *= gH.z;
|
|
1358
|
+
let sp = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1353
1359
|
|
|
1354
1360
|
|
|
1355
|
-
if (abs(
|
|
1361
|
+
if (abs(sp) > abs(tMax * det)) {
|
|
1356
1362
|
return ti;
|
|
1357
1363
|
}
|
|
1358
1364
|
|
|
1359
|
-
let
|
|
1360
|
-
ti.t =
|
|
1361
|
-
ti.barycentric = e *
|
|
1365
|
+
let tP = 1. / det;
|
|
1366
|
+
ti.t = sp * tP;
|
|
1367
|
+
ti.barycentric = e * tP;
|
|
1362
1368
|
|
|
1363
1369
|
return ti;
|
|
1364
1370
|
}
|
|
@@ -1368,26 +1374,26 @@ return ti;
|
|
|
1368
1374
|
|
|
1369
1375
|
override DEPTH_QUERY_MODE: bool = false;
|
|
1370
1376
|
|
|
1371
|
-
fn
|
|
1377
|
+
fn eW(d: vec3f) -> vec3f {
|
|
1372
1378
|
if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
1373
1379
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1374
1380
|
}
|
|
1375
1381
|
|
|
1376
|
-
fn
|
|
1382
|
+
fn eU(gb: vec3f, o: vec3f) -> vec3f {
|
|
1377
1383
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1378
|
-
return abs(
|
|
1384
|
+
return abs(gb) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1379
1385
|
}
|
|
1380
1386
|
|
|
1381
1387
|
|
|
1382
1388
|
|
|
1383
|
-
fn
|
|
1384
|
-
let
|
|
1385
|
-
let
|
|
1386
|
-
let padding =
|
|
1387
|
-
let
|
|
1388
|
-
let
|
|
1389
|
-
let t0 = max(
|
|
1390
|
-
let t1 = min(
|
|
1389
|
+
fn cH(o: vec3f, xU: vec3f, xT: vec3f, gb: vec3f, tMax: f32) -> f32 {
|
|
1390
|
+
let xg = (xU - o) * gb;
|
|
1391
|
+
let xh = (xT - o) * gb;
|
|
1392
|
+
let padding = eU(gb, o);
|
|
1393
|
+
let ns = min(xg, xh) - padding;
|
|
1394
|
+
let sW = max(xg, xh) + padding;
|
|
1395
|
+
let t0 = max(ns.x, max(ns.y, ns.z));
|
|
1396
|
+
let t1 = min(sW.x, min(sW.y, sW.z));
|
|
1391
1397
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1392
1398
|
}
|
|
1393
1399
|
|
|
@@ -1395,69 +1401,69 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1395
1401
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1396
1402
|
}
|
|
1397
1403
|
|
|
1398
|
-
fn
|
|
1404
|
+
fn mU(d: vec3f, dZ: i32) -> vec3f {
|
|
1399
1405
|
|
|
1400
1406
|
|
|
1401
|
-
if (
|
|
1407
|
+
if (dZ == 0) {
|
|
1402
1408
|
return vec3f(-d.y, -d.z, 1.0) / d.x;
|
|
1403
|
-
} else if (
|
|
1409
|
+
} else if (dZ == 1) {
|
|
1404
1410
|
return vec3f(-d.z, -d.x, 1.0) / d.y;
|
|
1405
1411
|
} else {
|
|
1406
1412
|
return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
1407
1413
|
}
|
|
1408
1414
|
}
|
|
1409
1415
|
|
|
1410
|
-
fn
|
|
1416
|
+
fn mH(
|
|
1411
1417
|
si: ptr<function, SurfaceInteraction>,
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1418
|
+
lR: fw,
|
|
1419
|
+
aw: vec3f,
|
|
1420
|
+
hr: vec3i,
|
|
1421
|
+
bP: bool,
|
|
1422
|
+
am: i32,
|
|
1423
|
+
ex: vec3f,
|
|
1424
|
+
eS: vec3f,
|
|
1425
|
+
fq: i32
|
|
1420
1426
|
) {
|
|
1421
|
-
(*si).instanceIndex =
|
|
1422
|
-
(*si).barycentrics =
|
|
1423
|
-
(*si).normal =
|
|
1424
|
-
(*si).position =
|
|
1425
|
-
(*si).materialIndex = i32(
|
|
1426
|
-
bitcast<i32>(instancesBuffer[
|
|
1427
|
+
(*si).instanceIndex = am;
|
|
1428
|
+
(*si).barycentrics = aw.xy;
|
|
1429
|
+
(*si).normal = ex;
|
|
1430
|
+
(*si).position = eS;
|
|
1431
|
+
(*si).materialIndex = i32(af(
|
|
1432
|
+
bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
|
|
1427
1433
|
).x);
|
|
1428
1434
|
|
|
1429
1435
|
|
|
1430
|
-
|
|
1436
|
+
hn(
|
|
1431
1437
|
si,
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1438
|
+
lR,
|
|
1439
|
+
aw,
|
|
1440
|
+
hr,
|
|
1441
|
+
bP,
|
|
1442
|
+
fq
|
|
1437
1443
|
);
|
|
1438
1444
|
|
|
1439
1445
|
let l2w = mat4x4<f32>(
|
|
1440
|
-
instancesBuffer[
|
|
1441
|
-
instancesBuffer[
|
|
1442
|
-
instancesBuffer[
|
|
1443
|
-
instancesBuffer[
|
|
1446
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
1447
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
1448
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
1449
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
1444
1450
|
);
|
|
1445
1451
|
let w2l = mat4x4<f32>(
|
|
1446
|
-
instancesBuffer[
|
|
1447
|
-
instancesBuffer[
|
|
1448
|
-
instancesBuffer[
|
|
1449
|
-
instancesBuffer[
|
|
1452
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
1453
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
1454
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
1455
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
1450
1456
|
);
|
|
1451
|
-
let
|
|
1457
|
+
let aG = transpose(mat3x3<f32>(
|
|
1452
1458
|
w2l[0].xyz,
|
|
1453
1459
|
w2l[1].xyz,
|
|
1454
1460
|
w2l[2].xyz
|
|
1455
1461
|
));
|
|
1456
1462
|
|
|
1457
|
-
(*si).faceNormal = normalize(
|
|
1458
|
-
(*si).vertexNormal = normalize(
|
|
1459
|
-
(*si).normal = normalize(
|
|
1460
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(
|
|
1463
|
+
(*si).faceNormal = normalize(aG * ex);
|
|
1464
|
+
(*si).vertexNormal = normalize(aG * (*si).vertexNormal);
|
|
1465
|
+
(*si).normal = normalize(aG * (*si).normal);
|
|
1466
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aG * (*si).coatNormal);` : ''}
|
|
1461
1467
|
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
1462
1468
|
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
1463
1469
|
}
|