@meimu/mutracer 0.3.0 → 0.3.1
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/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +29 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/viewer.md +11 -1
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- 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 +12 -6
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- 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/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.js +2 -2
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +2 -2
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.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 +21 -14
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -2
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -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 = fY(o, d, tri, ei, gZ, 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
|
+
hitNormal = normalize(cross(e1, e2));
|
|
16
|
+
let lc = i32(af(bitcast<i32>(qf.z)).x);
|
|
17
|
+
let jm = materialsBuffer[lc].doubleSided > 0.5;
|
|
18
|
+
if (!doubleSided && !jm && dot(hitNormal, d) > 0.0) {
|
|
19
|
+
hitNormal = vec3f(0.0);
|
|
20
20
|
continue;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
tMax = hit.t;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
tD = true;
|
|
25
|
+
qi = true;
|
|
26
|
+
fe = o + tMax * d;
|
|
27
27
|
aw = hit.barycentric;
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
};
|
|
31
31
|
function getPDMDisplacmentCode(anyHit) {
|
|
32
32
|
return /*wgsl */ `
|
|
33
|
-
let
|
|
33
|
+
let mh = qW(
|
|
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
|
+
getMapSize(displacementMapIndex),
|
|
40
40
|
minH, maxH,
|
|
41
41
|
hScale,
|
|
42
42
|
matData.displacementBias,
|
|
@@ -44,51 +44,51 @@ matData.displacementStepSize,
|
|
|
44
44
|
i32(matData.displacementUvProjection),
|
|
45
45
|
displacementUvProjectionScale,
|
|
46
46
|
${anyHit ? 'true' : 'false'},
|
|
47
|
-
|
|
47
|
+
jK
|
|
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 = qf.w;
|
|
55
|
+
let wK = bitcast<i32>(r3.w);
|
|
56
56
|
|
|
57
|
-
let materialIndex = i32(af(bitcast<i32>(
|
|
57
|
+
let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
|
|
58
58
|
let matData = materialsBuffer[materialIndex];
|
|
59
|
-
let n0 = normalize(
|
|
60
|
-
let n1 = normalize(
|
|
61
|
-
let n2 = normalize(
|
|
59
|
+
let n0 = normalize(vertexNormal(index.x));
|
|
60
|
+
let n1 = normalize(vertexNormal(index.y));
|
|
61
|
+
let n2 = normalize(vertexNormal(index.z));
|
|
62
62
|
if (matData.displacementMapIndex >= 0.0 && matData.displacementBias != 0.0) {
|
|
63
63
|
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 && wK > 0) {
|
|
68
|
+
let minH = f32(wK >> 8) / 255.0;
|
|
69
|
+
let maxH = f32(wK & 0xff) / 255.0;
|
|
70
70
|
let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
|
|
71
71
|
let displacementMapIndex = i32(matData.displacementMapIndex);
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
var uv0 =
|
|
75
|
-
var uv1 =
|
|
76
|
-
var uv2 =
|
|
74
|
+
var uv0 = hd(index.x);
|
|
75
|
+
var uv1 = hd(index.y);
|
|
76
|
+
var uv2 = hd(index.z);
|
|
77
77
|
|
|
78
78
|
${getPDMDisplacmentCode(anyHit)}
|
|
79
79
|
|
|
80
|
-
if (
|
|
81
|
-
|
|
80
|
+
if (mh.t < tMax) {
|
|
81
|
+
hitNormal = mh.normal;
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
tMax =
|
|
84
|
+
tMax = mh.t;
|
|
85
85
|
|
|
86
|
-
aw =
|
|
87
|
-
|
|
86
|
+
aw = mh.barycentric;
|
|
87
|
+
fe = o + tMax * d;
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
bQ = true;
|
|
90
|
+
tD = true;
|
|
91
|
+
qi = 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 bn(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 lv(value: u32) -> u32 {
|
|
116
116
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
fn
|
|
119
|
+
fn pR(value: u32) -> u32 {
|
|
120
120
|
return (bitcast<u32>(f32(value)) >> 23u) - 127u;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
fn
|
|
123
|
+
fn qg(
|
|
124
124
|
node: i32,
|
|
125
|
-
|
|
125
|
+
ww: i32,
|
|
126
126
|
n0: vec4f,
|
|
127
127
|
o: vec3f,
|
|
128
|
-
|
|
128
|
+
invD: vec3f,
|
|
129
129
|
tMax: f32
|
|
130
130
|
) -> u32 {
|
|
131
|
-
let i = node +
|
|
131
|
+
let i = node + ww;
|
|
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 uc = bitcast<i32>((header & 0xffu) << 24u) >> 24;
|
|
137
|
+
let ud = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
|
|
138
|
+
let ue = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
|
|
139
|
+
let ih = vec3f(
|
|
140
|
+
bitcast<f32>(u32(uc + 127) << 23u),
|
|
141
|
+
bitcast<f32>(u32(ud + 127) << 23u),
|
|
142
|
+
bitcast<f32>(u32(ue + 127) << 23u)
|
|
143
143
|
);
|
|
144
|
-
let padding =
|
|
145
|
-
let
|
|
146
|
-
let
|
|
144
|
+
let padding = ff(invD, o);
|
|
145
|
+
let eM = (n0.xyz - o) * invD;
|
|
146
|
+
let cW = ih * invD;
|
|
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 xd = bitcast<vec4u>(n2);
|
|
151
|
+
let xe = bitcast<vec4u>(n3);
|
|
152
|
+
let xf = bitcast<vec4u>(n4);
|
|
153
|
+
let negative = invD < vec3f(0.0);
|
|
154
|
+
let yK = select(xd.xy, xe.zw, negative.x);
|
|
155
|
+
let zV = select(xe.zw, xd.xy, negative.x);
|
|
156
|
+
let yL = select(xd.zw, xf.xy, negative.y);
|
|
157
|
+
let zW = select(xf.xy, xd.zw, negative.y);
|
|
158
|
+
let yM = select(xe.xy, xf.zw, negative.z);
|
|
159
|
+
let zX = select(xf.zw, xe.xy, negative.z);
|
|
160
160
|
|
|
161
|
-
let
|
|
161
|
+
let AL = max(
|
|
162
162
|
max(
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
bn(yK.x) * cW.x + eM.x - vec4f(padding.x),
|
|
164
|
+
bn(yL.x) * cW.y + eM.y - vec4f(padding.y)
|
|
165
165
|
),
|
|
166
|
-
|
|
166
|
+
bn(yM.x) * cW.z + eM.z - vec4f(padding.z)
|
|
167
167
|
);
|
|
168
|
-
let
|
|
168
|
+
let AF = min(
|
|
169
169
|
min(
|
|
170
|
-
|
|
171
|
-
|
|
170
|
+
bn(zV.x) * cW.x + eM.x + vec4f(padding.x),
|
|
171
|
+
bn(zW.x) * cW.y + eM.y + vec4f(padding.y)
|
|
172
172
|
),
|
|
173
|
-
|
|
173
|
+
bn(zX.x) * cW.z + eM.z + vec4f(padding.z)
|
|
174
174
|
);
|
|
175
|
-
let
|
|
175
|
+
let AM = max(
|
|
176
176
|
max(
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
bn(yK.y) * cW.x + eM.x - vec4f(padding.x),
|
|
178
|
+
bn(yL.y) * cW.y + eM.y - vec4f(padding.y)
|
|
179
179
|
),
|
|
180
|
-
|
|
180
|
+
bn(yM.y) * cW.z + eM.z - vec4f(padding.z)
|
|
181
181
|
);
|
|
182
|
-
let
|
|
182
|
+
let AG = min(
|
|
183
183
|
min(
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
bn(zV.y) * cW.x + eM.x + vec4f(padding.x),
|
|
185
|
+
bn(zW.y) * cW.y + eM.y + vec4f(padding.y)
|
|
186
186
|
),
|
|
187
|
-
|
|
187
|
+
bn(zX.y) * cW.z + eM.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 yG = (AL <= min(AF, vec4f(tMax))) & (AF > vec4f(0.0));
|
|
191
|
+
let yH = (AM <= min(AG, vec4f(tMax))) & (AG > vec4f(0.0));
|
|
192
|
+
return select(0u, 1u, yG.x)
|
|
193
|
+
| select(0u, 2u, yG.y)
|
|
194
|
+
| select(0u, 4u, yG.z)
|
|
195
|
+
| select(0u, 8u, yG.w)
|
|
196
|
+
| select(0u, 16u, yH.x)
|
|
197
|
+
| select(0u, 32u, yH.y)
|
|
198
|
+
| select(0u, 64u, yH.z)
|
|
199
|
+
| select(0u, 128u, yH.w);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
`;
|
|
203
|
-
function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
|
|
203
|
+
function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '', perInstanceBounds = false) {
|
|
204
204
|
const intersectTriangles = /* wgsl */ `
|
|
205
|
-
let
|
|
206
|
-
let vertexOffset = vec3i(bitcast<i32>(
|
|
205
|
+
let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
|
|
206
|
+
let vertexOffset = vec3i(bitcast<i32>(qf.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 == fT && bK == fS) {
|
|
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 =
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
216
|
+
var tri = fL(
|
|
217
|
+
vertexPosition(index.x),
|
|
218
|
+
vertexPosition(index.y),
|
|
219
|
+
vertexPosition(index.z)
|
|
220
220
|
);
|
|
221
|
-
var
|
|
221
|
+
var qi = false;
|
|
222
222
|
|
|
223
223
|
${hasDisplacement
|
|
224
224
|
? displacementIntersectCode(anyHit, hasAnisotropyDirections)
|
|
225
225
|
: flatIntersectCode()}
|
|
226
|
-
if (
|
|
226
|
+
if (qi) {
|
|
227
227
|
${handleHitCode}
|
|
228
228
|
}
|
|
229
229
|
}
|
|
@@ -231,68 +231,74 @@ ${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
|
|
234
|
+
var jO = -1;
|
|
235
|
+
${perInstanceBounds ? 'let worldInvD = traversalInverse(ray.d);\nvar invD = worldInvD;' : 'var invD = traversalInverse(d);'}
|
|
236
|
+
var bQ = false;
|
|
237
|
+
var tD = false;
|
|
238
|
+
var fe: vec3f;
|
|
239
|
+
var hitNormal: vec3f;
|
|
240
240
|
var aw: vec3f;
|
|
241
241
|
|
|
242
242
|
|
|
243
|
-
if (
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
if (bP(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, invD, tMax) > 0.0) {
|
|
244
|
+
jO = 0;
|
|
245
|
+
nA[0] = 0;
|
|
246
246
|
}
|
|
247
|
-
while (
|
|
248
|
-
let
|
|
249
|
-
|
|
247
|
+
while (jO >= 0) {
|
|
248
|
+
let vY = nA[jO];
|
|
249
|
+
jO--;
|
|
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
|
+
invD = traversalInverse(d);
|
|
253
|
+
|
|
254
|
+
let Ax = bvhBuffer[vY];
|
|
255
|
+
let eZ = bitcast<i32>(Ax.w);
|
|
256
|
+
if (eZ >= 0) {
|
|
257
|
+
let left = vY + 2;
|
|
258
|
+
let right = eZ;
|
|
259
|
+
let d0 = bP(
|
|
260
260
|
o,
|
|
261
261
|
bvhBuffer[left].xyz,
|
|
262
262
|
bvhBuffer[left + 1].xyz,
|
|
263
|
-
|
|
263
|
+
invD,
|
|
264
264
|
tMax
|
|
265
265
|
);
|
|
266
|
-
let d1 =
|
|
266
|
+
let d1 = bP(
|
|
267
267
|
o,
|
|
268
268
|
bvhBuffer[right].xyz,
|
|
269
269
|
bvhBuffer[right + 1].xyz,
|
|
270
|
-
|
|
270
|
+
invD,
|
|
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) { jO++; nA[jO] = left; }
|
|
276
|
+
if (d1 > 0.0) { jO++; nA[jO] = right; }
|
|
277
277
|
}
|
|
278
278
|
else {
|
|
279
|
-
if (d1 > 0.0) {
|
|
280
|
-
if (d0 > 0.0) {
|
|
279
|
+
if (d1 > 0.0) { jO++; nA[jO] = right; }
|
|
280
|
+
if (d0 > 0.0) { jO++; nA[jO] = left; }
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
else {
|
|
284
|
-
let
|
|
284
|
+
let td = -eZ;
|
|
285
285
|
|
|
286
286
|
|
|
287
287
|
for (
|
|
288
|
-
var
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
var nX = td - 1;
|
|
289
|
+
nX >= 0;
|
|
290
|
+
nX--
|
|
291
291
|
) {
|
|
292
|
-
let
|
|
293
|
-
let bK = bitcast<i32>(
|
|
294
|
-
|
|
295
|
-
|
|
292
|
+
let nY = bvhBuffer[vY + 2 + nX];
|
|
293
|
+
let bK = bitcast<i32>(nY.x);
|
|
294
|
+
${perInstanceBounds ? /* wgsl */ `
|
|
295
|
+
|
|
296
|
+
let box = bitcast<i32>(nY.w);
|
|
297
|
+
if (bP(ray.o, bvhBuffer[box].xyz, bvhBuffer[box + 1].xyz, worldInvD, tMax) <= 0.0) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
` : ''} let zn = bitcast<i32>(nY.y);
|
|
301
|
+
let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
|
|
296
302
|
let w2l = mat4x4<f32>(
|
|
297
303
|
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
298
304
|
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
@@ -301,215 +307,215 @@ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
|
301
307
|
);
|
|
302
308
|
o = (w2l * vec4f(ray.o, 1.0)).xyz;
|
|
303
309
|
d = (w2l * vec4f(ray.d, 0.0)).xyz;
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
310
|
+
invD = traversalInverse(d);
|
|
311
|
+
ei = maxDimension(abs(d));
|
|
312
|
+
gZ = nV(d, ei);
|
|
307
313
|
|
|
308
|
-
let
|
|
309
|
-
let
|
|
310
|
-
let blasOffset = i32(
|
|
314
|
+
let fW = bitcast<u32>(qf.x);
|
|
315
|
+
let hj = fW >> 30u;
|
|
316
|
+
let blasOffset = i32(fW & 0x3fffffffu);
|
|
311
317
|
let bufferOff = rtUniform.blasOffset;
|
|
312
318
|
|
|
313
319
|
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
|
|
314
|
-
if (
|
|
320
|
+
if (hj == 3u) {
|
|
315
321
|
|
|
316
322
|
|
|
317
323
|
|
|
318
324
|
|
|
319
|
-
var
|
|
320
|
-
var
|
|
321
|
-
var
|
|
325
|
+
var rk = -1;
|
|
326
|
+
var uD = 0u;
|
|
327
|
+
var mj = 0u;
|
|
322
328
|
|
|
323
|
-
var
|
|
324
|
-
let
|
|
329
|
+
var eu = 0x80000000u;
|
|
330
|
+
let yl = select(0u, 4u, d.x < 0.0)
|
|
325
331
|
| select(0u, 2u, d.y < 0.0)
|
|
326
332
|
| select(0u, 1u, d.z < 0.0);
|
|
327
|
-
let
|
|
333
|
+
let su = 7u - yl;
|
|
328
334
|
|
|
329
335
|
|
|
330
336
|
|
|
331
337
|
|
|
332
|
-
while (
|
|
333
|
-
|
|
338
|
+
while (uD < 4096u) {
|
|
339
|
+
uD++;
|
|
334
340
|
|
|
335
|
-
let internalMask =
|
|
336
|
-
let
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if ((
|
|
340
|
-
|
|
341
|
+
let internalMask = eu & 0xffu;
|
|
342
|
+
let sp =
|
|
343
|
+
lv(eu >> 24u) + 24u;
|
|
344
|
+
eu &= ~(1u << sp);
|
|
345
|
+
if ((eu & 0xff000000u) != 0u) {
|
|
346
|
+
rk++;
|
|
341
347
|
|
|
342
|
-
|
|
348
|
+
ve[rk] = vec2u(mj, eu);
|
|
343
349
|
}
|
|
344
350
|
|
|
345
|
-
let slot = (
|
|
346
|
-
let
|
|
347
|
-
let relativeIndex = countOneBits(internalMask &
|
|
348
|
-
let
|
|
349
|
-
let node = blasOffset + i32(
|
|
350
|
-
let
|
|
351
|
-
let
|
|
352
|
-
node, bufferOff,
|
|
351
|
+
let slot = (sp - 24u) ^ su;
|
|
352
|
+
let oZ = (1u << slot) - 1u;
|
|
353
|
+
let relativeIndex = countOneBits(internalMask & oZ);
|
|
354
|
+
let va = mj + relativeIndex;
|
|
355
|
+
let node = blasOffset + i32(va * 5u);
|
|
356
|
+
let kj = bvhBuffer[node + bufferOff];
|
|
357
|
+
let xK = qg(
|
|
358
|
+
node, bufferOff, kj, o, invD, tMax
|
|
353
359
|
);
|
|
354
360
|
|
|
355
361
|
|
|
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
|
-
|
|
362
|
+
eu = 0u;
|
|
363
|
+
if (xK != 0u) {
|
|
364
|
+
let fR = bvhBuffer[node + bufferOff + 1];
|
|
365
|
+
let ul = bitcast<u32>(kj.w) >> 24u;
|
|
366
|
+
var wG = 0u;
|
|
367
|
+
var kW = xK;
|
|
368
|
+
while (kW != 0u) {
|
|
369
|
+
let tW = lv(kW);
|
|
370
|
+
kW &= ~(1u << tW);
|
|
371
|
+
let vF = select(
|
|
372
|
+
bitcast<u32>(fR.z),
|
|
373
|
+
bitcast<u32>(fR.w),
|
|
374
|
+
tW >= 4u
|
|
369
375
|
);
|
|
370
|
-
let
|
|
371
|
-
(
|
|
372
|
-
let
|
|
373
|
-
let
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
376
|
+
let wn =
|
|
377
|
+
(vF >> ((tW & 3u) * 8u)) & 0xffu;
|
|
378
|
+
let kl = wn & 0x1fu;
|
|
379
|
+
let zm = select(
|
|
380
|
+
kl,
|
|
381
|
+
kl ^ su,
|
|
382
|
+
kl >= 24u
|
|
377
383
|
);
|
|
378
|
-
let
|
|
379
|
-
|
|
384
|
+
let yR = (wn >> 5u) & 0x7u;
|
|
385
|
+
wG |= yR << zm;
|
|
380
386
|
}
|
|
381
387
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
let
|
|
385
|
-
var
|
|
386
|
-
while (
|
|
387
|
-
let
|
|
388
|
-
|
|
388
|
+
mj = bitcast<u32>(fR.x);
|
|
389
|
+
eu = (wG & 0xff000000u) | ul;
|
|
390
|
+
let qE = bitcast<u32>(fR.y);
|
|
391
|
+
var qF = wG & 0x00ffffffu;
|
|
392
|
+
while (qF != 0u) {
|
|
393
|
+
let pI = pR(qF);
|
|
394
|
+
qF &= ~(1u << pI);
|
|
389
395
|
let primitiveCount = 1;
|
|
390
396
|
let primitiveOffset = bufferOff + blasOffset
|
|
391
|
-
+ i32(
|
|
397
|
+
+ i32(qE + pI);
|
|
392
398
|
${intersectTriangles}
|
|
393
399
|
}
|
|
394
400
|
}
|
|
395
401
|
|
|
396
|
-
if ((
|
|
397
|
-
if (
|
|
398
|
-
let
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
+
if ((eu & 0xff000000u) != 0u) { continue; }
|
|
403
|
+
if (rk >= 0) {
|
|
404
|
+
let sw = ve[rk];
|
|
405
|
+
mj = sw.x;
|
|
406
|
+
eu = sw.y;
|
|
407
|
+
rk--;
|
|
402
408
|
}
|
|
403
409
|
else { break; }
|
|
404
410
|
}
|
|
405
411
|
}
|
|
406
412
|
` : ''}
|
|
407
413
|
|
|
408
|
-
var
|
|
409
|
-
if (
|
|
410
|
-
|
|
414
|
+
var dX = -1;
|
|
415
|
+
if (hj != 3u) {
|
|
416
|
+
dX = 0;
|
|
411
417
|
|
|
412
|
-
|
|
418
|
+
gL[0] = zn;
|
|
413
419
|
}
|
|
414
420
|
|
|
415
|
-
while (
|
|
421
|
+
while (dX >= 0) {
|
|
416
422
|
|
|
417
|
-
let node =
|
|
418
|
-
|
|
423
|
+
let node = gL[dX];
|
|
424
|
+
dX--;
|
|
419
425
|
var primitiveCount = 0;
|
|
420
426
|
var primitiveOffset = 0;
|
|
421
427
|
|
|
422
428
|
${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
|
|
423
|
-
if (
|
|
429
|
+
if (hj == 2u) {
|
|
424
430
|
let i = node + bufferOff;
|
|
425
|
-
let
|
|
426
|
-
let
|
|
427
|
-
let
|
|
428
|
-
let
|
|
429
|
-
primitiveCount = i32(bitcast<u32>(
|
|
431
|
+
let zr = bvhBuffer[i];
|
|
432
|
+
let zs = bvhBuffer[i + 1];
|
|
433
|
+
let zt = bvhBuffer[i + 2];
|
|
434
|
+
let zu = bvhBuffer[i + 3];
|
|
435
|
+
primitiveCount = i32(bitcast<u32>(zt.w));
|
|
430
436
|
if (primitiveCount > 0) {
|
|
431
437
|
primitiveOffset = bufferOff + blasOffset
|
|
432
|
-
+ i32(bitcast<u32>(
|
|
438
|
+
+ i32(bitcast<u32>(zu.w));
|
|
433
439
|
}
|
|
434
440
|
else {
|
|
435
|
-
let left = blasOffset + i32(bitcast<u32>(
|
|
436
|
-
let right = blasOffset + i32(bitcast<u32>(
|
|
437
|
-
let
|
|
438
|
-
o,
|
|
441
|
+
let left = blasOffset + i32(bitcast<u32>(zr.w) * 4u);
|
|
442
|
+
let right = blasOffset + i32(bitcast<u32>(zs.w) * 4u);
|
|
443
|
+
let qj = bP(
|
|
444
|
+
o, zr.xyz, zs.xyz, invD, tMax
|
|
439
445
|
);
|
|
440
|
-
let
|
|
441
|
-
o,
|
|
446
|
+
let pb = bP(
|
|
447
|
+
o, zt.xyz, zu.xyz, invD, tMax
|
|
442
448
|
);
|
|
443
|
-
if (
|
|
444
|
-
if (
|
|
445
|
-
|
|
449
|
+
if (qj > pb) {
|
|
450
|
+
if (qj > 0.0) {
|
|
451
|
+
dX++; gL[dX] = left;
|
|
446
452
|
}
|
|
447
|
-
if (
|
|
448
|
-
|
|
453
|
+
if (pb > 0.0) {
|
|
454
|
+
dX++; gL[dX] = right;
|
|
449
455
|
}
|
|
450
456
|
}
|
|
451
457
|
else {
|
|
452
|
-
if (oc > 0.0) {
|
|
453
|
-
dR++; gs[dR] = right;
|
|
454
|
-
}
|
|
455
458
|
if (pb > 0.0) {
|
|
456
|
-
|
|
459
|
+
dX++; gL[dX] = right;
|
|
460
|
+
}
|
|
461
|
+
if (qj > 0.0) {
|
|
462
|
+
dX++; gL[dX] = left;
|
|
457
463
|
}
|
|
458
464
|
}
|
|
459
465
|
}
|
|
460
466
|
}
|
|
461
467
|
` : ''}
|
|
462
468
|
${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
|
|
463
|
-
if (
|
|
464
|
-
let
|
|
465
|
-
if ((
|
|
466
|
-
primitiveCount = i32((
|
|
469
|
+
if (hj == 1u) {
|
|
470
|
+
let iE = bitcast<u32>(node);
|
|
471
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
472
|
+
primitiveCount = i32((iE >> 23u) & 0xffu);
|
|
467
473
|
primitiveOffset = bufferOff + blasOffset
|
|
468
|
-
+ i32(
|
|
474
|
+
+ i32(iE & 0x007fffffu);
|
|
469
475
|
}
|
|
470
476
|
else {
|
|
471
477
|
let i = node + bufferOff;
|
|
472
|
-
let
|
|
473
|
-
let
|
|
474
|
-
let
|
|
475
|
-
let
|
|
476
|
-
let nodeMin =
|
|
477
|
-
let
|
|
478
|
-
let
|
|
479
|
-
bitcast<u32>(
|
|
480
|
-
bitcast<u32>(
|
|
478
|
+
let xS = bvhBuffer[i];
|
|
479
|
+
let tR = bvhBuffer[i + 1];
|
|
480
|
+
let rW = bvhBuffer[i + 2];
|
|
481
|
+
let pL = bvhBuffer[i + 3];
|
|
482
|
+
let nodeMin = xS.xyz;
|
|
483
|
+
let ej = vec3f(xS.w, tR.x, tR.y);
|
|
484
|
+
let nH = array<u32, 4>(
|
|
485
|
+
bitcast<u32>(tR.z), bitcast<u32>(tR.w),
|
|
486
|
+
bitcast<u32>(rW.x), bitcast<u32>(rW.y)
|
|
481
487
|
);
|
|
482
488
|
|
|
483
489
|
|
|
484
|
-
let negative =
|
|
485
|
-
let
|
|
486
|
-
let
|
|
487
|
-
let
|
|
488
|
-
let
|
|
489
|
-
let
|
|
490
|
-
let
|
|
491
|
-
let padding =
|
|
492
|
-
let
|
|
490
|
+
let negative = invD < vec3f(0.0);
|
|
491
|
+
let yK = unpack4x8unorm(bitcast<u32>(select(rW.z, pL.y, negative.x)));
|
|
492
|
+
let zV = unpack4x8unorm(bitcast<u32>(select(pL.y, rW.z, negative.x)));
|
|
493
|
+
let yL = unpack4x8unorm(bitcast<u32>(select(rW.w, pL.z, negative.y)));
|
|
494
|
+
let zW = unpack4x8unorm(bitcast<u32>(select(pL.z, rW.w, negative.y)));
|
|
495
|
+
let yM = unpack4x8unorm(bitcast<u32>(select(pL.x, pL.w, negative.z)));
|
|
496
|
+
let zX = unpack4x8unorm(bitcast<u32>(select(pL.w, pL.x, negative.z)));
|
|
497
|
+
let padding = ff(invD, o);
|
|
498
|
+
let ot = max(
|
|
493
499
|
max(
|
|
494
|
-
(nodeMin.x +
|
|
495
|
-
(nodeMin.y +
|
|
500
|
+
(nodeMin.x + yK * ej.x - o.x) * invD.x - vec4f(padding.x),
|
|
501
|
+
(nodeMin.y + yL * ej.y - o.y) * invD.y - vec4f(padding.y)
|
|
496
502
|
),
|
|
497
|
-
(nodeMin.z +
|
|
503
|
+
(nodeMin.z + yM * ej.z - o.z) * invD.z - vec4f(padding.z)
|
|
498
504
|
);
|
|
499
|
-
let
|
|
505
|
+
let uA = min(
|
|
500
506
|
min(
|
|
501
|
-
(nodeMin.x +
|
|
502
|
-
(nodeMin.y +
|
|
507
|
+
(nodeMin.x + zV * ej.x - o.x) * invD.x + vec4f(padding.x),
|
|
508
|
+
(nodeMin.y + zW * ej.y - o.y) * invD.y + vec4f(padding.y)
|
|
503
509
|
),
|
|
504
|
-
(nodeMin.z +
|
|
510
|
+
(nodeMin.z + zX * ej.z - o.z) * invD.z + vec4f(padding.z)
|
|
505
511
|
);
|
|
506
|
-
var distance = select(
|
|
512
|
+
var distance = select(uA, ot, ot > vec4f(0.0));
|
|
507
513
|
distance = select(
|
|
508
514
|
distance,
|
|
509
515
|
vec4f(-1.0),
|
|
510
|
-
|
|
516
|
+
ot > min(uA, vec4f(tMax))
|
|
511
517
|
);
|
|
512
|
-
var
|
|
518
|
+
var fi = array<f32, 4>(
|
|
513
519
|
distance.x,
|
|
514
520
|
distance.y,
|
|
515
521
|
distance.z,
|
|
@@ -518,78 +524,78 @@ distance.w
|
|
|
518
524
|
|
|
519
525
|
|
|
520
526
|
for (var order = 0; order < 4; order++) {
|
|
521
|
-
var
|
|
522
|
-
var
|
|
527
|
+
var ee = -1.0;
|
|
528
|
+
var eq = -1;
|
|
523
529
|
for (var child = 0; child < 4; child++) {
|
|
524
530
|
if (
|
|
525
|
-
|
|
526
|
-
|
|
531
|
+
nH[child] != 0u &&
|
|
532
|
+
fi[child] > ee
|
|
527
533
|
) {
|
|
528
|
-
|
|
529
|
-
|
|
534
|
+
ee = fi[child];
|
|
535
|
+
eq = child;
|
|
530
536
|
}
|
|
531
537
|
}
|
|
532
|
-
if (
|
|
533
|
-
let
|
|
534
|
-
var
|
|
535
|
-
if ((
|
|
536
|
-
|
|
538
|
+
if (eq >= 0 && ee > 0.0) {
|
|
539
|
+
let ph = nH[eq];
|
|
540
|
+
var kv = bitcast<i32>(ph);
|
|
541
|
+
if ((ph & 0x80000000u) == 0u) {
|
|
542
|
+
kv += blasOffset;
|
|
537
543
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
544
|
+
dX++;
|
|
545
|
+
gL[dX] = kv;
|
|
546
|
+
fi[eq] = -1.0;
|
|
541
547
|
}
|
|
542
548
|
}
|
|
543
549
|
}
|
|
544
550
|
}
|
|
545
551
|
` : ''}
|
|
546
552
|
${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
|
|
547
|
-
if (
|
|
553
|
+
if (hj == 0u) {
|
|
548
554
|
let i = node + bufferOff;
|
|
549
555
|
let r1 = bvhBuffer[i];
|
|
550
|
-
let
|
|
556
|
+
let bh = bitcast<i32>(r1.w);
|
|
551
557
|
|
|
552
|
-
if (
|
|
558
|
+
if (bh >= 0) {
|
|
553
559
|
let left = node + 2;
|
|
554
|
-
let right =
|
|
555
|
-
let d0 =
|
|
560
|
+
let right = bh + blasOffset;
|
|
561
|
+
let d0 = bP(
|
|
556
562
|
o,
|
|
557
563
|
bvhBuffer[left + bufferOff].xyz,
|
|
558
564
|
bvhBuffer[left + 1 + bufferOff].xyz,
|
|
559
|
-
|
|
565
|
+
invD,
|
|
560
566
|
tMax
|
|
561
567
|
);
|
|
562
|
-
let d1 =
|
|
568
|
+
let d1 = bP(
|
|
563
569
|
o,
|
|
564
570
|
bvhBuffer[right + bufferOff].xyz,
|
|
565
571
|
bvhBuffer[right + 1 + bufferOff].xyz,
|
|
566
|
-
|
|
572
|
+
invD,
|
|
567
573
|
tMax
|
|
568
574
|
);
|
|
569
575
|
|
|
570
576
|
if (d0 > d1) {
|
|
571
577
|
if (d0 > 0.0) {
|
|
572
|
-
|
|
578
|
+
dX++; gL[dX] = left;
|
|
573
579
|
|
|
574
580
|
}
|
|
575
581
|
if (d1 > 0.0) {
|
|
576
|
-
|
|
582
|
+
dX++; gL[dX] = right;
|
|
577
583
|
|
|
578
584
|
}
|
|
579
585
|
}
|
|
580
586
|
else {
|
|
581
587
|
if (d1 > 0.0) {
|
|
582
|
-
|
|
588
|
+
dX++; gL[dX] = right;
|
|
583
589
|
|
|
584
590
|
}
|
|
585
591
|
if (d0 > 0.0) {
|
|
586
|
-
|
|
592
|
+
dX++; gL[dX] = left;
|
|
587
593
|
|
|
588
594
|
}
|
|
589
595
|
}
|
|
590
596
|
}
|
|
591
597
|
else {
|
|
592
|
-
primitiveCount = -
|
|
598
|
+
primitiveCount = -bh;
|
|
593
599
|
primitiveOffset = i + 2;
|
|
594
600
|
}
|
|
595
601
|
}
|
|
@@ -608,21 +614,21 @@ ${intersectTriangles}
|
|
|
608
614
|
// triangle tests without surface completion or any integrator/alpha sampling.
|
|
609
615
|
export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
|
|
610
616
|
return /* wgsl */ `
|
|
611
|
-
struct
|
|
617
|
+
struct sl {
|
|
612
618
|
hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
|
|
613
619
|
}
|
|
614
|
-
fn
|
|
615
|
-
var result:
|
|
620
|
+
fn yn(ray: Ray) -> sl {
|
|
621
|
+
var result: sl;
|
|
616
622
|
result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
|
|
617
623
|
if (rtUniform.isEmpty > 0) { return result; }
|
|
618
624
|
let bounces = 0;
|
|
619
625
|
let doubleSided = false;
|
|
620
|
-
let
|
|
621
|
-
let
|
|
622
|
-
let
|
|
626
|
+
let jK = false;
|
|
627
|
+
let fT = -1;
|
|
628
|
+
let fS = -1;
|
|
623
629
|
var tMax = RAY_MAX_DISTANCE;
|
|
624
|
-
var
|
|
625
|
-
var
|
|
630
|
+
var ei: i32;
|
|
631
|
+
var gZ: vec3f;
|
|
626
632
|
${getBVHTraverseCode(`
|
|
627
633
|
result.hit = true; result.instance = bK; result.record = triangleIndex;
|
|
628
634
|
result.t = tMax; result.barycentric = aw;
|
|
@@ -631,9 +637,9 @@ return result;
|
|
|
631
637
|
}
|
|
632
638
|
`;
|
|
633
639
|
}
|
|
634
|
-
export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
|
|
640
|
+
export function createSceneIntersectionsWgsl({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
|
|
635
641
|
return /* wgsl */ `
|
|
636
|
-
fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool,
|
|
642
|
+
fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jK: bool) {
|
|
637
643
|
|
|
638
644
|
(*si).hit = false;
|
|
639
645
|
|
|
@@ -642,32 +648,32 @@ return;
|
|
|
642
648
|
}
|
|
643
649
|
|
|
644
650
|
var tMax = RAY_MAX_DISTANCE;
|
|
645
|
-
var
|
|
646
|
-
var
|
|
651
|
+
var ei: i32;
|
|
652
|
+
var gZ: vec3f;
|
|
647
653
|
|
|
648
|
-
var
|
|
649
|
-
var
|
|
654
|
+
var hL: vec3i;
|
|
655
|
+
var mL: fL;
|
|
650
656
|
var am: i32;
|
|
651
|
-
var
|
|
652
|
-
let
|
|
657
|
+
var fT: i32 = (*si).triangleIndex;
|
|
658
|
+
let fS = (*si).instanceIndex;
|
|
653
659
|
|
|
654
660
|
${getBVHTraverseCode(`
|
|
655
661
|
(*si).triangleIndex = triangleIndex;
|
|
656
|
-
|
|
657
|
-
|
|
662
|
+
mL = tri;
|
|
663
|
+
hL = index;
|
|
658
664
|
am = bK;
|
|
659
|
-
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
665
|
+
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
|
|
660
666
|
|
|
661
|
-
${closestHitHook} if (
|
|
662
|
-
|
|
667
|
+
${closestHitHook} if (tD) {
|
|
668
|
+
nJ(
|
|
663
669
|
si,
|
|
664
|
-
|
|
670
|
+
mL,
|
|
665
671
|
aw,
|
|
666
|
-
|
|
667
|
-
|
|
672
|
+
hL,
|
|
673
|
+
bQ,
|
|
668
674
|
am,
|
|
669
|
-
|
|
670
|
-
|
|
675
|
+
hitNormal,
|
|
676
|
+
fe,
|
|
671
677
|
-1
|
|
672
678
|
);
|
|
673
679
|
}
|
|
@@ -683,38 +689,38 @@ return;
|
|
|
683
689
|
|
|
684
690
|
let bounces = 0;
|
|
685
691
|
let doubleSided = true;
|
|
686
|
-
let
|
|
692
|
+
let jK = false;
|
|
687
693
|
var tMax = maxDistance;
|
|
688
|
-
var
|
|
689
|
-
var
|
|
690
|
-
var
|
|
691
|
-
var
|
|
694
|
+
var ei: i32;
|
|
695
|
+
var gZ: vec3f;
|
|
696
|
+
var hL: vec3i;
|
|
697
|
+
var mL: fL;
|
|
692
698
|
var am: i32;
|
|
693
|
-
var
|
|
694
|
-
let
|
|
699
|
+
var fT: i32 = -1;
|
|
700
|
+
let fS = instanceIndex;
|
|
695
701
|
|
|
696
702
|
${getBVHTraverseCode(`
|
|
697
703
|
(*si).triangleIndex = triangleIndex;
|
|
698
|
-
|
|
699
|
-
|
|
704
|
+
mL = tri;
|
|
705
|
+
hL = index;
|
|
700
706
|
am = bK;
|
|
701
707
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
702
708
|
if (bK != instanceIndex) {
|
|
703
709
|
continue;
|
|
704
710
|
}
|
|
705
|
-
|
|
711
|
+
`, perInstanceBounds)}
|
|
706
712
|
|
|
707
|
-
if (
|
|
713
|
+
if (tD) {
|
|
708
714
|
(*si).instanceIndex = am;
|
|
709
|
-
(*si).normal =
|
|
710
|
-
(*si).position =
|
|
715
|
+
(*si).normal = hitNormal;
|
|
716
|
+
(*si).position = fe;
|
|
711
717
|
(*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
712
|
-
|
|
718
|
+
hI(
|
|
713
719
|
si,
|
|
714
|
-
|
|
720
|
+
mL,
|
|
715
721
|
aw,
|
|
716
|
-
|
|
717
|
-
|
|
722
|
+
hL,
|
|
723
|
+
bQ,
|
|
718
724
|
-1
|
|
719
725
|
);
|
|
720
726
|
|
|
@@ -730,15 +736,15 @@ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
|
730
736
|
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
731
737
|
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
732
738
|
);
|
|
733
|
-
let
|
|
739
|
+
let aH = transpose(mat3x3<f32>(
|
|
734
740
|
w2l[0].xyz,
|
|
735
741
|
w2l[1].xyz,
|
|
736
742
|
w2l[2].xyz
|
|
737
743
|
));
|
|
738
|
-
(*si).faceNormal = normalize(
|
|
739
|
-
(*si).vertexNormal = normalize(
|
|
740
|
-
(*si).normal = normalize(
|
|
741
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(
|
|
744
|
+
(*si).faceNormal = normalize(aH * hitNormal);
|
|
745
|
+
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
746
|
+
(*si).normal = normalize(aH * (*si).normal);
|
|
747
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
742
748
|
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
743
749
|
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
744
750
|
}
|
|
@@ -753,76 +759,76 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
753
759
|
}
|
|
754
760
|
}
|
|
755
761
|
|
|
756
|
-
fn ${shadowName}(ray: Ray, lightDistance: f32,
|
|
762
|
+
fn ${shadowName}(ray: Ray, lightDistance: f32, kx: i32, tm:i32) -> bool {
|
|
757
763
|
if (rtUniform.isEmpty > 0) {
|
|
758
764
|
return false;
|
|
759
765
|
}
|
|
760
766
|
|
|
761
767
|
let doubleSided = true;
|
|
762
|
-
let
|
|
763
|
-
var tMax =
|
|
764
|
-
var
|
|
765
|
-
var
|
|
768
|
+
let sA = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
769
|
+
var tMax = sA;
|
|
770
|
+
var ei: i32;
|
|
771
|
+
var gZ: vec3f;
|
|
766
772
|
|
|
767
773
|
let bounces = 1;
|
|
768
|
-
var
|
|
769
|
-
var
|
|
770
|
-
let
|
|
774
|
+
var jK = false;
|
|
775
|
+
var fT: i32 = kx;
|
|
776
|
+
let fS = tm;
|
|
771
777
|
|
|
772
778
|
${getBVHTraverseCode(
|
|
773
779
|
/*wgsl */ `
|
|
774
780
|
|
|
775
781
|
|
|
776
782
|
|
|
777
|
-
var
|
|
783
|
+
var kc = true;
|
|
778
784
|
|
|
779
|
-
if (
|
|
785
|
+
if (kc) {
|
|
780
786
|
if (HAS_ALPHA) {
|
|
781
|
-
let materialIndex = i32(af(bitcast<i32>(
|
|
782
|
-
if (!
|
|
787
|
+
let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
|
|
788
|
+
if (!po(
|
|
783
789
|
materialIndex,
|
|
784
790
|
index,
|
|
785
791
|
aw,
|
|
786
|
-
|
|
787
|
-
|
|
792
|
+
fe,
|
|
793
|
+
hitNormal${compactVertices ? ', triangleIndex' : ''}
|
|
788
794
|
)) {
|
|
789
795
|
|
|
790
|
-
tMax =
|
|
791
|
-
|
|
796
|
+
tMax = sA;
|
|
797
|
+
kc = false;
|
|
792
798
|
}
|
|
793
799
|
}
|
|
794
800
|
}
|
|
795
|
-
if (
|
|
801
|
+
if (kc) {
|
|
796
802
|
return true;
|
|
797
803
|
}
|
|
798
|
-
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|
|
804
|
+
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
|
|
799
805
|
|
|
800
806
|
return false;
|
|
801
807
|
}
|
|
802
808
|
|
|
803
809
|
`;
|
|
804
810
|
}
|
|
805
|
-
export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
|
|
811
|
+
export default function getIntersectCode({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
|
|
806
812
|
return /*wgsl*/ `
|
|
807
813
|
|
|
808
814
|
|
|
809
815
|
|
|
810
816
|
|
|
811
817
|
|
|
812
|
-
var<private>
|
|
813
|
-
var<private>
|
|
814
|
-
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private>
|
|
818
|
+
var<private> nA: array<i32, TLAS_STACK_SIZE>;
|
|
819
|
+
var<private> gL: array<i32, BLAS_STACK_SIZE>;
|
|
820
|
+
${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> ve: array<vec2u, BLAS_STACK_SIZE>;` : ''}
|
|
815
821
|
|
|
816
822
|
${hasDisplacement ? displacementWgsl : ''}
|
|
817
823
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
818
824
|
|
|
819
|
-
struct
|
|
825
|
+
struct fL {
|
|
820
826
|
p0: vec3f,
|
|
821
827
|
p1: vec3f,
|
|
822
828
|
p2: vec3f,
|
|
823
829
|
};
|
|
824
830
|
|
|
825
|
-
fn
|
|
831
|
+
fn hM(rad: f32, pos: vec3f, r: Ray) -> f32 {
|
|
826
832
|
let op: vec3f = pos - r.o;
|
|
827
833
|
let eps: f32 = 0.001;
|
|
828
834
|
let b: f32 = dot(op, r.d);
|
|
@@ -845,7 +851,7 @@ return t2;
|
|
|
845
851
|
return INF;
|
|
846
852
|
}
|
|
847
853
|
|
|
848
|
-
fn
|
|
854
|
+
fn oU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
849
855
|
let dt: f32 = dot(r.d, n);
|
|
850
856
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
851
857
|
|
|
@@ -874,7 +880,7 @@ let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
|
874
880
|
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
875
881
|
}
|
|
876
882
|
|
|
877
|
-
fn
|
|
883
|
+
fn iB(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
878
884
|
|
|
879
885
|
|
|
880
886
|
var d: f32 = INF;
|
|
@@ -886,9 +892,9 @@ var d: f32 = INF;
|
|
|
886
892
|
(*lightSample).isDelta = false;
|
|
887
893
|
var u = light.u;
|
|
888
894
|
var v = light.v;
|
|
889
|
-
var
|
|
895
|
+
var dU = i32(light.litType);
|
|
890
896
|
|
|
891
|
-
if (HAS_SCENE_RECT_LIGHT &&
|
|
897
|
+
if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
|
|
892
898
|
|
|
893
899
|
var pos = light.position - u * 0.5 - v * 0.5;
|
|
894
900
|
var normal = normalize(cross(u, v));
|
|
@@ -896,18 +902,18 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
896
902
|
return INF;
|
|
897
903
|
}
|
|
898
904
|
|
|
899
|
-
d =
|
|
905
|
+
d = oU(pos, u, v, normal, r);
|
|
900
906
|
if (d < 0.0) {
|
|
901
907
|
d = INF;
|
|
902
908
|
}
|
|
903
909
|
else {
|
|
904
|
-
var
|
|
910
|
+
var cv: f32 = dot(-r.d, normal);
|
|
905
911
|
let spread = light.radiusOrSpread;
|
|
906
|
-
if (
|
|
912
|
+
if (cv >= cos(spread * PI / 2.0)) {
|
|
907
913
|
(*lightSample).direction = r.d;
|
|
908
914
|
(*lightSample).normal = normal;
|
|
909
915
|
(*lightSample).dist = d;
|
|
910
|
-
(*lightSample).pdf = (d * d) / (light.area *
|
|
916
|
+
(*lightSample).pdf = (d * d) / (light.area * cv);
|
|
911
917
|
(*lightSample).emission = light.emission;
|
|
912
918
|
(*lightSample).isDelta = false;
|
|
913
919
|
}
|
|
@@ -917,12 +923,12 @@ d = INF;
|
|
|
917
923
|
}
|
|
918
924
|
}
|
|
919
925
|
|
|
920
|
-
else if (HAS_SCENE_SPHERE_LIGHT &&
|
|
926
|
+
else if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
|
|
921
927
|
if (light.radiusOrSpread <= 0.0) {
|
|
922
|
-
let
|
|
923
|
-
let projection = dot(
|
|
924
|
-
let
|
|
925
|
-
if (projection <= EPS || dot(
|
|
928
|
+
let lj = light.position - r.o;
|
|
929
|
+
let projection = dot(lj, r.d);
|
|
930
|
+
let bf = lj - projection * r.d;
|
|
931
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) {
|
|
926
932
|
return INF;
|
|
927
933
|
}
|
|
928
934
|
d = projection;
|
|
@@ -933,7 +939,7 @@ d = projection;
|
|
|
933
939
|
(*lightSample).isDelta = true;
|
|
934
940
|
}
|
|
935
941
|
else {
|
|
936
|
-
d =
|
|
942
|
+
d = hM(light.radiusOrSpread, light.position, r);
|
|
937
943
|
(*lightSample).isDelta = false;
|
|
938
944
|
if (d > 0.0 && d != INF) {
|
|
939
945
|
(*lightSample).direction = r.d;
|
|
@@ -962,12 +968,12 @@ light.radiusOrSpread <= 0.0
|
|
|
962
968
|
}
|
|
963
969
|
}
|
|
964
970
|
|
|
965
|
-
else if (HAS_SCENE_SPOT_LIGHT &&
|
|
971
|
+
else if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
|
|
966
972
|
if (light.radiusOrSpread <= 0.0) {
|
|
967
|
-
let
|
|
968
|
-
let projection = dot(
|
|
969
|
-
let
|
|
970
|
-
if (projection <= EPS || dot(
|
|
973
|
+
let lj = light.position - r.o;
|
|
974
|
+
let projection = dot(lj, r.d);
|
|
975
|
+
let bf = lj - projection * r.d;
|
|
976
|
+
if (projection <= EPS || dot(bf, bf) > 1e-8) {
|
|
971
977
|
return INF;
|
|
972
978
|
}
|
|
973
979
|
d = projection;
|
|
@@ -978,13 +984,13 @@ d = projection;
|
|
|
978
984
|
(*lightSample).isDelta = true;
|
|
979
985
|
}
|
|
980
986
|
else {
|
|
981
|
-
d =
|
|
987
|
+
d = hM(light.radiusOrSpread, light.position, r);
|
|
982
988
|
(*lightSample).isDelta = false;
|
|
983
989
|
}
|
|
984
990
|
if (d != INF) {
|
|
985
|
-
let
|
|
986
|
-
let
|
|
987
|
-
if (
|
|
991
|
+
let zA = r.o + d * r.d;
|
|
992
|
+
let od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
|
|
993
|
+
if (od <= 0.0) { return INF; }
|
|
988
994
|
if (light.radiusOrSpread > 0.0) {
|
|
989
995
|
(*lightSample).direction = r.d;
|
|
990
996
|
(*lightSample).dist = d;
|
|
@@ -993,7 +999,7 @@ r.o + r.d * d - light.position
|
|
|
993
999
|
);
|
|
994
1000
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
995
1001
|
}
|
|
996
|
-
(*lightSample).emission = light.emission *
|
|
1002
|
+
(*lightSample).emission = light.emission * od * select(
|
|
997
1003
|
1.0,
|
|
998
1004
|
1.0 / max(d * d, 1e-8),
|
|
999
1005
|
light.radiusOrSpread <= 0.0
|
|
@@ -1001,7 +1007,7 @@ light.radiusOrSpread <= 0.0
|
|
|
1001
1007
|
}
|
|
1002
1008
|
}
|
|
1003
1009
|
|
|
1004
|
-
else if (
|
|
1010
|
+
else if (dU != RECT_LIGHT && dU != SPHERE_LIGHT && dU != SPOT_LIGHT) {
|
|
1005
1011
|
|
|
1006
1012
|
d = INF;
|
|
1007
1013
|
}
|
|
@@ -1009,7 +1015,7 @@ d = INF;
|
|
|
1009
1015
|
return d;
|
|
1010
1016
|
}
|
|
1011
1017
|
|
|
1012
|
-
fn
|
|
1018
|
+
fn fv(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
|
|
1013
1019
|
let m00 = af(m0.x);
|
|
1014
1020
|
let m01 = af(m0.y);
|
|
1015
1021
|
let m02 = af(m0.z);
|
|
@@ -1029,91 +1035,93 @@ var w20 = m20.y * bary.z;
|
|
|
1029
1035
|
var w21 = m21.y * bary.z;
|
|
1030
1036
|
var w22 = m22.y * bary.z;
|
|
1031
1037
|
|
|
1032
|
-
var
|
|
1038
|
+
var hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
1033
1039
|
|
|
1034
|
-
w00 = w00 /
|
|
1035
|
-
w01 = w01 /
|
|
1036
|
-
w02 = w02 /
|
|
1037
|
-
w10 = w10 /
|
|
1038
|
-
w11 = w11 /
|
|
1039
|
-
w12 = w12 /
|
|
1040
|
-
w20 = w20 /
|
|
1041
|
-
w21 = w21 /
|
|
1042
|
-
w22 = w22 /
|
|
1040
|
+
w00 = w00 / hB;
|
|
1041
|
+
w01 = w01 / hB + w00;
|
|
1042
|
+
w02 = w02 / hB + w01;
|
|
1043
|
+
w10 = w10 / hB + w02;
|
|
1044
|
+
w11 = w11 / hB + w10;
|
|
1045
|
+
w12 = w12 / hB + w11;
|
|
1046
|
+
w20 = w20 / hB + w12;
|
|
1047
|
+
w21 = w21 / hB + w20;
|
|
1048
|
+
w22 = w22 / hB + w21;
|
|
1043
1049
|
|
|
1044
|
-
let rand =
|
|
1045
|
-
var
|
|
1050
|
+
let rand = cm(0u);
|
|
1051
|
+
var oV: f32;
|
|
1046
1052
|
if (rand < w00) {
|
|
1047
|
-
|
|
1053
|
+
oV = m00.x;
|
|
1048
1054
|
} else if (rand < w01) {
|
|
1049
|
-
|
|
1055
|
+
oV = m01.x;
|
|
1050
1056
|
} else if (rand < w02) {
|
|
1051
|
-
|
|
1057
|
+
oV = m02.x;
|
|
1052
1058
|
} else if (rand < w10) {
|
|
1053
|
-
|
|
1059
|
+
oV = m10.x;
|
|
1054
1060
|
} else if (rand < w11) {
|
|
1055
|
-
|
|
1061
|
+
oV = m11.x;
|
|
1056
1062
|
} else if (rand < w12) {
|
|
1057
|
-
|
|
1063
|
+
oV = m12.x;
|
|
1058
1064
|
} else if (rand < w20) {
|
|
1059
|
-
|
|
1065
|
+
oV = m20.x;
|
|
1060
1066
|
} else if (rand < w21) {
|
|
1061
|
-
|
|
1067
|
+
oV = m21.x;
|
|
1062
1068
|
} else {
|
|
1063
|
-
|
|
1069
|
+
oV = m22.x;
|
|
1064
1070
|
}
|
|
1065
|
-
return i32(
|
|
1071
|
+
return i32(oV);
|
|
1066
1072
|
}
|
|
1067
1073
|
|
|
1068
|
-
fn
|
|
1069
|
-
|
|
1074
|
+
fn nl(
|
|
1075
|
+
lw: i32,
|
|
1070
1076
|
index: vec3i,
|
|
1071
|
-
bary: vec3f
|
|
1077
|
+
bary: vec3f${compactVertices ? ', record: i32' : ''}
|
|
1072
1078
|
) -> i32 {
|
|
1079
|
+
${compactVertices ? /* wgsl */ `return pJ(lw, record);` : /* wgsl */ `
|
|
1073
1080
|
let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1074
1081
|
let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1075
1082
|
let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1076
1083
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1077
|
-
return
|
|
1084
|
+
return fv(m0, m1, m2, bary);
|
|
1078
1085
|
}
|
|
1079
|
-
return
|
|
1086
|
+
return lw;
|
|
1087
|
+
`}
|
|
1080
1088
|
}
|
|
1081
1089
|
|
|
1082
1090
|
|
|
1083
1091
|
|
|
1084
1092
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1085
|
-
fn
|
|
1086
|
-
let determinant =
|
|
1093
|
+
fn eI(normal: vec3f, dp1: vec3f, dp2: vec3f, pU: vec2f, pV: vec2f, input: vec4f) -> mat2x3f {
|
|
1094
|
+
let determinant = pU.x * pV.y - pU.y * pV.x;
|
|
1087
1095
|
var t = input.xyz;
|
|
1088
1096
|
var b = vec3f(0.0);
|
|
1089
1097
|
|
|
1090
1098
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
1091
1099
|
if (abs(determinant) > 1e-12) {
|
|
1092
|
-
let dt = (dp1 *
|
|
1093
|
-
let db = (dp2 *
|
|
1100
|
+
let dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
|
|
1101
|
+
let db = (dp2 * pU.x - dp1 * pV.x) / determinant;
|
|
1094
1102
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
1095
1103
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
1096
1104
|
}
|
|
1097
1105
|
t -= normal * dot(normal, t);
|
|
1098
1106
|
if (dot(t, t) < 1e-8) {
|
|
1099
|
-
let
|
|
1100
|
-
let
|
|
1101
|
-
let xy = normal.x * normal.y *
|
|
1102
|
-
t = vec3f(1.0 +
|
|
1103
|
-
b = vec3f(xy,
|
|
1107
|
+
let iP = select(-1.0, 1.0, normal.z >= 0.0);
|
|
1108
|
+
let cA = -1.0 / (iP + normal.z);
|
|
1109
|
+
let xy = normal.x * normal.y * cA;
|
|
1110
|
+
t = vec3f(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
|
|
1111
|
+
b = vec3f(xy, iP + normal.y * normal.y * cA, -normal.y);
|
|
1104
1112
|
}
|
|
1105
1113
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
1106
1114
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
1107
1115
|
}
|
|
1108
1116
|
|
|
1109
1117
|
` : /* wgsl */ ``}
|
|
1110
|
-
fn
|
|
1118
|
+
fn hI(
|
|
1111
1119
|
si: ptr<function, SurfaceInteraction>,
|
|
1112
|
-
tri:
|
|
1120
|
+
tri: fL,
|
|
1113
1121
|
bary: vec3f,
|
|
1114
1122
|
index: vec3i,
|
|
1115
|
-
|
|
1116
|
-
|
|
1123
|
+
bQ: bool,
|
|
1124
|
+
fH: i32
|
|
1117
1125
|
) {
|
|
1118
1126
|
(*si).hit = true;
|
|
1119
1127
|
|
|
@@ -1125,26 +1133,26 @@ let i1 = index.y;
|
|
|
1125
1133
|
let i2 = index.z;
|
|
1126
1134
|
(*si).vertexColor = vec3f(1.0);
|
|
1127
1135
|
if (USE_VERTEX_COLOR) {
|
|
1128
|
-
(*si).vertexColor = bary.x *
|
|
1129
|
-
+ bary.y *
|
|
1130
|
-
+ bary.z *
|
|
1136
|
+
(*si).vertexColor = bary.x * vertexColor(i0)
|
|
1137
|
+
+ bary.y * vertexColor(i1)
|
|
1138
|
+
+ bary.z * vertexColor(i2);
|
|
1131
1139
|
}
|
|
1132
|
-
let
|
|
1140
|
+
let qP = uvProjection == ${uvProjectionConstants.spherical};
|
|
1133
1141
|
|
|
1134
1142
|
var normal: vec3f = (*si).normal;
|
|
1135
|
-
var
|
|
1143
|
+
var hu: vec3f;
|
|
1136
1144
|
var n0 = vec3f(0.0);
|
|
1137
1145
|
var n1 = vec3f(0.0);
|
|
1138
1146
|
var n2 = vec3f(0.0);
|
|
1139
1147
|
|
|
1140
1148
|
|
|
1141
|
-
if (!
|
|
1142
|
-
n0 =
|
|
1143
|
-
n1 =
|
|
1144
|
-
n2 =
|
|
1145
|
-
|
|
1146
|
-
if (!
|
|
1147
|
-
normal =
|
|
1149
|
+
if (!bQ || qP) {
|
|
1150
|
+
n0 = vertexNormal(i0);
|
|
1151
|
+
n1 = vertexNormal(i1);
|
|
1152
|
+
n2 = vertexNormal(i2);
|
|
1153
|
+
hu = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
|
|
1154
|
+
if (!bQ) {
|
|
1155
|
+
normal = hu;
|
|
1148
1156
|
}
|
|
1149
1157
|
}
|
|
1150
1158
|
|
|
@@ -1152,48 +1160,48 @@ var uv: vec2f;
|
|
|
1152
1160
|
var uv0: vec2f;
|
|
1153
1161
|
var uv1: vec2f;
|
|
1154
1162
|
var uv2: vec2f;
|
|
1155
|
-
var
|
|
1163
|
+
var cT = vec2f(0.0);
|
|
1156
1164
|
if (USE_UV) {
|
|
1157
|
-
uv0 =
|
|
1158
|
-
uv1 =
|
|
1159
|
-
uv2 =
|
|
1165
|
+
uv0 = hd(i0);
|
|
1166
|
+
uv1 = hd(i1);
|
|
1167
|
+
uv2 = hd(i2);
|
|
1160
1168
|
uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
|
|
1161
1169
|
if (USE_UV1) {
|
|
1162
|
-
let secondaryUv0 =
|
|
1163
|
-
let secondaryUv1 =
|
|
1164
|
-
let secondaryUv2 =
|
|
1165
|
-
|
|
1170
|
+
let secondaryUv0 = hV(i0);
|
|
1171
|
+
let secondaryUv1 = hV(i1);
|
|
1172
|
+
let secondaryUv2 = hV(i2);
|
|
1173
|
+
cT = bary.x * secondaryUv0
|
|
1166
1174
|
+ bary.y * secondaryUv1
|
|
1167
1175
|
+ bary.z * secondaryUv2;
|
|
1168
1176
|
}
|
|
1169
1177
|
}
|
|
1170
1178
|
|
|
1171
1179
|
if (USE_TANGENT) {
|
|
1172
|
-
let t0 =
|
|
1173
|
-
let t1 =
|
|
1174
|
-
let t2 =
|
|
1180
|
+
let t0 = gC(i0).xyz;
|
|
1181
|
+
let t1 = gC(i1).xyz;
|
|
1182
|
+
let t2 = gC(i2).xyz;
|
|
1175
1183
|
(*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
|
|
1176
1184
|
}
|
|
1177
1185
|
|
|
1178
|
-
if (
|
|
1179
|
-
(*si).materialIndex =
|
|
1186
|
+
if (fH >= 0) {
|
|
1187
|
+
(*si).materialIndex = fH;
|
|
1180
1188
|
}
|
|
1181
1189
|
else {
|
|
1182
|
-
(*si).materialIndex =
|
|
1190
|
+
(*si).materialIndex = nl(
|
|
1183
1191
|
(*si).materialIndex,
|
|
1184
1192
|
index,
|
|
1185
|
-
bary
|
|
1193
|
+
bary${compactVertices ? ', (*si).triangleIndex' : ''}
|
|
1186
1194
|
);
|
|
1187
1195
|
}
|
|
1188
1196
|
|
|
1189
1197
|
if (uvProjection > 0) {
|
|
1190
1198
|
|
|
1191
|
-
uv =
|
|
1192
|
-
|
|
1199
|
+
uv = gW(uvProjection, (*si).position, select(normal, hu, qP));
|
|
1200
|
+
cT = uv;
|
|
1193
1201
|
}
|
|
1194
1202
|
|
|
1195
1203
|
uv = uv * material.uvScale;
|
|
1196
|
-
|
|
1204
|
+
cT = cT * material.uvScale;
|
|
1197
1205
|
|
|
1198
1206
|
|
|
1199
1207
|
if (uvProjection == ${uvProjectionConstants.triplanar}) {
|
|
@@ -1206,41 +1214,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
|
1206
1214
|
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
|
|
1207
1215
|
let dp1 = tri.p0 - tri.p2;
|
|
1208
1216
|
let dp2 = tri.p1 - tri.p2;
|
|
1209
|
-
var
|
|
1217
|
+
var aT = vec4f(0.0);
|
|
1210
1218
|
if (USE_TANGENT) {
|
|
1211
|
-
|
|
1212
|
-
+ bary.y *
|
|
1213
|
-
+ bary.z *
|
|
1214
|
-
}
|
|
1215
|
-
let
|
|
1216
|
-
(*si).geometryTangent =
|
|
1217
|
-
(*si).geometryBitangent =
|
|
1218
|
-
var
|
|
1219
|
+
aT = bary.x * gC(i0)
|
|
1220
|
+
+ bary.y * gC(i1)
|
|
1221
|
+
+ bary.z * gC(i2);
|
|
1222
|
+
}
|
|
1223
|
+
let eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
|
|
1224
|
+
(*si).geometryTangent = eV[0];
|
|
1225
|
+
(*si).geometryBitangent = eV[1];
|
|
1226
|
+
var gp = eV;
|
|
1219
1227
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1220
|
-
let a =
|
|
1221
|
-
let b =
|
|
1222
|
-
let c =
|
|
1223
|
-
|
|
1228
|
+
let a = hV(i0);
|
|
1229
|
+
let b = hV(i1);
|
|
1230
|
+
let c = hV(i2);
|
|
1231
|
+
gp = eI(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1224
1232
|
}
|
|
1225
|
-
(*si).directionTangent =
|
|
1226
|
-
(*si).directionBitangent =
|
|
1233
|
+
(*si).directionTangent = gp[0];
|
|
1234
|
+
(*si).directionBitangent = gp[1];
|
|
1227
1235
|
${hasCoatNormals ? /* wgsl */ `
|
|
1228
1236
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1229
|
-
let
|
|
1230
|
-
var
|
|
1231
|
-
if (USE_UV1 && mapInfo[
|
|
1232
|
-
let a =
|
|
1233
|
-
let b =
|
|
1234
|
-
let c =
|
|
1235
|
-
|
|
1236
|
-
select(
|
|
1237
|
+
let lI = i32(directionMaterial.coatNormalMapIndex);
|
|
1238
|
+
var nI = eV;
|
|
1239
|
+
if (USE_UV1 && mapInfo[lI + NUM_MAPS * 2].x > 0.5) {
|
|
1240
|
+
let a = hV(i0);
|
|
1241
|
+
let b = hV(i1);
|
|
1242
|
+
let c = hV(i2);
|
|
1243
|
+
nI = eI(normal, dp1, dp2, a-c, b-c,
|
|
1244
|
+
select(aT, vec4f(0.0), aT.w == 0.0));
|
|
1237
1245
|
}
|
|
1238
1246
|
|
|
1239
1247
|
|
|
1240
|
-
let decoded = sampleMap(
|
|
1241
|
-
select(
|
|
1242
|
-
let mapped =
|
|
1243
|
-
+
|
|
1248
|
+
let decoded = sampleMap(lI, getMapUvSet(lI, uv,
|
|
1249
|
+
select(cT, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
|
|
1250
|
+
let mapped = nI[0] * decoded.x * directionMaterial.coatNormalScale.x
|
|
1251
|
+
+ nI[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
|
|
1244
1252
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1245
1253
|
}
|
|
1246
1254
|
` : ''}
|
|
@@ -1250,19 +1258,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
|
1250
1258
|
(*si).normal = normal;
|
|
1251
1259
|
(*si).vertexNormal = normal;
|
|
1252
1260
|
(*si).shadowOffset = vec3f(0.0);
|
|
1253
|
-
if (!
|
|
1261
|
+
if (!bQ) {
|
|
1254
1262
|
|
|
1255
1263
|
|
|
1256
1264
|
|
|
1257
1265
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1258
|
-
let
|
|
1266
|
+
let le = bary.x * n0 + bary.y * n1 + bary.z * n2;
|
|
1259
1267
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1260
1268
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1261
1269
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1262
1270
|
var h = a * bary.x * (bary.x - 1.0)
|
|
1263
1271
|
+ (a + b + c) * bary.x * bary.y
|
|
1264
1272
|
+ b * bary.y * (bary.y - 1.0);
|
|
1265
|
-
if (dot(
|
|
1273
|
+
if (dot(le, geometricNormal) > 0.0) {
|
|
1266
1274
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1267
1275
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1268
1276
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1280,22 +1288,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1280
1288
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1281
1289
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1282
1290
|
}
|
|
1283
|
-
(*si).shadowOffset =
|
|
1291
|
+
(*si).shadowOffset = le * h;
|
|
1284
1292
|
}
|
|
1285
1293
|
(*si).uv = uv;
|
|
1286
|
-
(*si).uv1 =
|
|
1294
|
+
(*si).uv1 = cT;
|
|
1287
1295
|
if (USE_NORMAL_MAPS) {
|
|
1288
1296
|
let dp1 = tri.p0 - tri.p2;
|
|
1289
1297
|
let dp2 = tri.p1 - tri.p2;
|
|
1290
|
-
let
|
|
1291
|
-
let
|
|
1292
|
-
(*si).normal =
|
|
1293
|
-
(*si).materialIndex, uv, normal, dp1, dp2,
|
|
1298
|
+
let pU = uv0 - uv2;
|
|
1299
|
+
let pV = uv1 - uv2;
|
|
1300
|
+
(*si).normal = qa(
|
|
1301
|
+
(*si).materialIndex, uv, normal, dp1, dp2, pU, pV
|
|
1294
1302
|
);
|
|
1295
1303
|
}
|
|
1296
1304
|
}
|
|
1297
1305
|
|
|
1298
|
-
struct
|
|
1306
|
+
struct eF {
|
|
1299
1307
|
t: f32,
|
|
1300
1308
|
barycentric: vec3f,
|
|
1301
1309
|
};
|
|
@@ -1304,8 +1312,8 @@ barycentric: vec3f,
|
|
|
1304
1312
|
|
|
1305
1313
|
|
|
1306
1314
|
|
|
1307
|
-
fn
|
|
1308
|
-
var ti:
|
|
1315
|
+
fn fY(o: vec3f, d: vec3f, tri: fL, ei: i32, gZ: vec3f, tMax: f32) -> eF {
|
|
1316
|
+
var ti: eF;
|
|
1309
1317
|
|
|
1310
1318
|
|
|
1311
1319
|
var p0t = tri.p0 - o;
|
|
@@ -1313,11 +1321,11 @@ var p1t = tri.p1 - o;
|
|
|
1313
1321
|
var p2t = tri.p2 - o;
|
|
1314
1322
|
|
|
1315
1323
|
|
|
1316
|
-
if (
|
|
1324
|
+
if (ei == 0) {
|
|
1317
1325
|
p0t = p0t.yzx;
|
|
1318
1326
|
p1t = p1t.yzx;
|
|
1319
1327
|
p2t = p2t.yzx;
|
|
1320
|
-
} else if (
|
|
1328
|
+
} else if (ei == 1) {
|
|
1321
1329
|
p0t = p0t.zxy;
|
|
1322
1330
|
p1t = p1t.zxy;
|
|
1323
1331
|
p2t = p2t.zxy;
|
|
@@ -1325,9 +1333,9 @@ p2t = p2t.zxy;
|
|
|
1325
1333
|
|
|
1326
1334
|
|
|
1327
1335
|
|
|
1328
|
-
p0t = vec3f(p0t.xy +
|
|
1329
|
-
p1t = vec3f(p1t.xy +
|
|
1330
|
-
p2t = vec3f(p2t.xy +
|
|
1336
|
+
p0t = vec3f(p0t.xy + gZ.xy * p0t.z, p0t.z);
|
|
1337
|
+
p1t = vec3f(p1t.xy + gZ.xy * p1t.z, p1t.z);
|
|
1338
|
+
p2t = vec3f(p2t.xy + gZ.xy * p2t.z, p2t.z);
|
|
1331
1339
|
|
|
1332
1340
|
|
|
1333
1341
|
var e = vec3f(
|
|
@@ -1339,9 +1347,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1339
1347
|
if (DEPTH_QUERY_MODE) {
|
|
1340
1348
|
|
|
1341
1349
|
|
|
1342
|
-
let
|
|
1350
|
+
let ua = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1343
1351
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1344
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1352
|
+
e = select(e, vec3f(0.0), abs(e) <= ua * 1e-6);
|
|
1345
1353
|
}
|
|
1346
1354
|
|
|
1347
1355
|
|
|
@@ -1352,19 +1360,19 @@ return ti;
|
|
|
1352
1360
|
let det = e.x + e.y + e.z;
|
|
1353
1361
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1354
1362
|
|
|
1355
|
-
p0t.z *=
|
|
1356
|
-
p1t.z *=
|
|
1357
|
-
p2t.z *=
|
|
1358
|
-
let
|
|
1363
|
+
p0t.z *= gZ.z;
|
|
1364
|
+
p1t.z *= gZ.z;
|
|
1365
|
+
p2t.z *= gZ.z;
|
|
1366
|
+
let tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
|
|
1359
1367
|
|
|
1360
1368
|
|
|
1361
|
-
if (abs(
|
|
1369
|
+
if (abs(tQ) > abs(tMax * det)) {
|
|
1362
1370
|
return ti;
|
|
1363
1371
|
}
|
|
1364
1372
|
|
|
1365
|
-
let
|
|
1366
|
-
ti.t =
|
|
1367
|
-
ti.barycentric = e *
|
|
1373
|
+
let vu = 1. / det;
|
|
1374
|
+
ti.t = tQ * vu;
|
|
1375
|
+
ti.barycentric = e * vu;
|
|
1368
1376
|
|
|
1369
1377
|
return ti;
|
|
1370
1378
|
}
|
|
@@ -1374,26 +1382,26 @@ return ti;
|
|
|
1374
1382
|
|
|
1375
1383
|
override DEPTH_QUERY_MODE: bool = false;
|
|
1376
1384
|
|
|
1377
|
-
fn
|
|
1385
|
+
fn traversalInverse(d: vec3f) -> vec3f {
|
|
1378
1386
|
if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
1379
1387
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1380
1388
|
}
|
|
1381
1389
|
|
|
1382
|
-
fn
|
|
1390
|
+
fn ff(invD: vec3f, o: vec3f) -> vec3f {
|
|
1383
1391
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1384
|
-
return abs(
|
|
1392
|
+
return abs(invD) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1385
1393
|
}
|
|
1386
1394
|
|
|
1387
1395
|
|
|
1388
1396
|
|
|
1389
|
-
fn
|
|
1390
|
-
let
|
|
1391
|
-
let
|
|
1392
|
-
let padding =
|
|
1393
|
-
let
|
|
1394
|
-
let
|
|
1395
|
-
let t0 = max(
|
|
1396
|
-
let t1 = min(
|
|
1397
|
+
fn bP(o: vec3f, zT: vec3f, zS: vec3f, invD: vec3f, tMax: f32) -> f32 {
|
|
1398
|
+
let zi = (zT - o) * invD;
|
|
1399
|
+
let zj = (zS - o) * invD;
|
|
1400
|
+
let padding = ff(invD, o);
|
|
1401
|
+
let ot = min(zi, zj) - padding;
|
|
1402
|
+
let uA = max(zi, zj) + padding;
|
|
1403
|
+
let t0 = max(ot.x, max(ot.y, ot.z));
|
|
1404
|
+
let t1 = min(uA.x, min(uA.y, uA.z));
|
|
1397
1405
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1398
1406
|
}
|
|
1399
1407
|
|
|
@@ -1401,45 +1409,45 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1401
1409
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1402
1410
|
}
|
|
1403
1411
|
|
|
1404
|
-
fn
|
|
1412
|
+
fn nV(d: vec3f, ei: i32) -> vec3f {
|
|
1405
1413
|
|
|
1406
1414
|
|
|
1407
|
-
if (
|
|
1415
|
+
if (ei == 0) {
|
|
1408
1416
|
return vec3f(-d.y, -d.z, 1.0) / d.x;
|
|
1409
|
-
} else if (
|
|
1417
|
+
} else if (ei == 1) {
|
|
1410
1418
|
return vec3f(-d.z, -d.x, 1.0) / d.y;
|
|
1411
1419
|
} else {
|
|
1412
1420
|
return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
1413
1421
|
}
|
|
1414
1422
|
}
|
|
1415
1423
|
|
|
1416
|
-
fn
|
|
1424
|
+
fn nJ(
|
|
1417
1425
|
si: ptr<function, SurfaceInteraction>,
|
|
1418
|
-
|
|
1426
|
+
mL: fL,
|
|
1419
1427
|
aw: vec3f,
|
|
1420
|
-
|
|
1421
|
-
|
|
1428
|
+
hL: vec3i,
|
|
1429
|
+
bQ: bool,
|
|
1422
1430
|
am: i32,
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1431
|
+
hitNormal: vec3f,
|
|
1432
|
+
fe: vec3f,
|
|
1433
|
+
fH: i32
|
|
1426
1434
|
) {
|
|
1427
1435
|
(*si).instanceIndex = am;
|
|
1428
1436
|
(*si).barycentrics = aw.xy;
|
|
1429
|
-
(*si).normal =
|
|
1430
|
-
(*si).position =
|
|
1437
|
+
(*si).normal = hitNormal;
|
|
1438
|
+
(*si).position = fe;
|
|
1431
1439
|
(*si).materialIndex = i32(af(
|
|
1432
1440
|
bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
|
|
1433
1441
|
).x);
|
|
1434
1442
|
|
|
1435
1443
|
|
|
1436
|
-
|
|
1444
|
+
hI(
|
|
1437
1445
|
si,
|
|
1438
|
-
|
|
1446
|
+
mL,
|
|
1439
1447
|
aw,
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1448
|
+
hL,
|
|
1449
|
+
bQ,
|
|
1450
|
+
fH
|
|
1443
1451
|
);
|
|
1444
1452
|
|
|
1445
1453
|
let l2w = mat4x4<f32>(
|
|
@@ -1454,16 +1462,16 @@ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
|
1454
1462
|
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
1455
1463
|
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
1456
1464
|
);
|
|
1457
|
-
let
|
|
1465
|
+
let aH = transpose(mat3x3<f32>(
|
|
1458
1466
|
w2l[0].xyz,
|
|
1459
1467
|
w2l[1].xyz,
|
|
1460
1468
|
w2l[2].xyz
|
|
1461
1469
|
));
|
|
1462
1470
|
|
|
1463
|
-
(*si).faceNormal = normalize(
|
|
1464
|
-
(*si).vertexNormal = normalize(
|
|
1465
|
-
(*si).normal = normalize(
|
|
1466
|
-
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(
|
|
1471
|
+
(*si).faceNormal = normalize(aH * hitNormal);
|
|
1472
|
+
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
1473
|
+
(*si).normal = normalize(aH * (*si).normal);
|
|
1474
|
+
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
1467
1475
|
if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
|
|
1468
1476
|
(*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
|
|
1469
1477
|
}
|
|
@@ -1478,10 +1486,10 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1478
1486
|
}
|
|
1479
1487
|
|
|
1480
1488
|
|
|
1481
|
-
${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
1489
|
+
${createIntersectionAlphaWgsl(hasAnisotropyDirections, compactVertices)}
|
|
1482
1490
|
|
|
1483
1491
|
|
|
1484
1492
|
|
|
1485
|
-
${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
|
|
1493
|
+
${sceneIntersections || createSceneIntersectionsWgsl({ perInstanceBounds, compactVertices, hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
|
|
1486
1494
|
}
|
|
1487
1495
|
//# sourceMappingURL=intersect.wgsl.js.map
|