@meimu/mutracer 0.2.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/README.md +3 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +9328 -7614
- package/docs/api.md +83 -35
- package/docs/caustics.md +80 -0
- package/docs/materials.md +9 -6
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +53 -9
- 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 +122 -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/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +18 -6
- 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 +4 -1
- package/lib/Engine.js +77 -14
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +81 -24
- package/lib/Render.js +201 -26
- 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 +4 -2
- 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/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.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 +11 -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/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 +19 -19
- 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 +65 -21
- package/lib/renderer/WGPURayTracePass.js +730 -409
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +110 -68
- 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 +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +10 -0
- 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 +20 -11
- package/lib/renderer/WebGLRayTracePass.js +157 -116
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +17 -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/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/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/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 +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +45 -37
- 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.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 +478 -465
- 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 +70 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
- 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 +160 -118
- 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 +88 -91
- 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/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 +13 -7
- 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.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +338 -252
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- 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/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 +5 -4
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +5 -0
- package/lib/renderer/renderPipeline.js +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/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 +2 -0
- package/lib/renderer/sceneLayoutSchema.js +3 -3
- 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.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- 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/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- 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 +3 -3
- 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 +22 -0
- package/lib/renderer/wgpuShaderSource.js +3 -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 +55 -55
- 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 +33 -33
- 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 +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +539 -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.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
- 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 +23 -21
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
- 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 +5 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
- 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 +228 -189
- 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 +88 -92
- 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/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 +100 -98
- 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 +12 -3
- 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.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 +23 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
- 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/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +22 -0
- package/lib/settings/render.js +2 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +23 -16
- 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 +7 -4
- 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
|
-
|
|
27
|
-
|
|
24
|
+
tD = true;
|
|
25
|
+
qi = true;
|
|
26
|
+
fe = 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 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(
|
|
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
|
-
|
|
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,285 +231,291 @@ ${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 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
|
+
var aw: vec3f;
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
if (bP(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, invD, tMax) > 0.0) {
|
|
244
|
+
jO = 0;
|
|
245
|
+
nA[0] = 0;
|
|
246
|
+
}
|
|
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
|
|
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
|
-
instancesBuffer[
|
|
298
|
-
instancesBuffer[
|
|
299
|
-
instancesBuffer[
|
|
300
|
-
instancesBuffer[
|
|
303
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
304
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
305
|
+
instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
306
|
+
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(
|
|
311
|
-
let
|
|
314
|
+
let fW = bitcast<u32>(qf.x);
|
|
315
|
+
let hj = fW >> 30u;
|
|
316
|
+
let blasOffset = i32(fW & 0x3fffffffu);
|
|
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,
|
|
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
|
-
let primitiveOffset =
|
|
391
|
-
+ i32(
|
|
396
|
+
let primitiveOffset = bufferOff + blasOffset
|
|
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 (
|
|
424
|
-
let i = node +
|
|
425
|
-
let
|
|
426
|
-
let
|
|
427
|
-
let
|
|
428
|
-
let
|
|
429
|
-
primitiveCount = i32(bitcast<u32>(
|
|
429
|
+
if (hj == 2u) {
|
|
430
|
+
let i = node + bufferOff;
|
|
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
|
-
primitiveOffset =
|
|
432
|
-
+ i32(bitcast<u32>(
|
|
437
|
+
primitiveOffset = bufferOff + blasOffset
|
|
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 (
|
|
453
|
-
|
|
458
|
+
if (pb > 0.0) {
|
|
459
|
+
dX++; gL[dX] = right;
|
|
454
460
|
}
|
|
455
|
-
if (
|
|
456
|
-
|
|
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((
|
|
467
|
-
primitiveOffset =
|
|
468
|
-
+ i32(
|
|
469
|
+
if (hj == 1u) {
|
|
470
|
+
let iE = bitcast<u32>(node);
|
|
471
|
+
if ((iE & 0x80000000u) != 0u) {
|
|
472
|
+
primitiveCount = i32((iE >> 23u) & 0xffu);
|
|
473
|
+
primitiveOffset = bufferOff + blasOffset
|
|
474
|
+
+ i32(iE & 0x007fffffu);
|
|
469
475
|
}
|
|
470
476
|
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>(
|
|
477
|
+
let i = node + bufferOff;
|
|
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 (
|
|
548
|
-
let i = node +
|
|
553
|
+
if (hj == 0u) {
|
|
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
|
-
bvhBuffer[left +
|
|
558
|
-
bvhBuffer[left + 1 +
|
|
559
|
-
|
|
563
|
+
bvhBuffer[left + bufferOff].xyz,
|
|
564
|
+
bvhBuffer[left + 1 + bufferOff].xyz,
|
|
565
|
+
invD,
|
|
560
566
|
tMax
|
|
561
567
|
);
|
|
562
|
-
let d1 =
|
|
568
|
+
let d1 = bP(
|
|
563
569
|
o,
|
|
564
|
-
bvhBuffer[right +
|
|
565
|
-
bvhBuffer[right + 1 +
|
|
566
|
-
|
|
570
|
+
bvhBuffer[right + bufferOff].xyz,
|
|
571
|
+
bvhBuffer[right + 1 + bufferOff].xyz,
|
|
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,31 +614,32 @@ ${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
|
|
626
|
+
let jK = false;
|
|
627
|
+
let fT = -1;
|
|
628
|
+
let fS = -1;
|
|
622
629
|
var tMax = RAY_MAX_DISTANCE;
|
|
623
|
-
var
|
|
624
|
-
var
|
|
630
|
+
var ei: i32;
|
|
631
|
+
var gZ: vec3f;
|
|
625
632
|
${getBVHTraverseCode(`
|
|
626
|
-
result.hit = true; result.instance =
|
|
627
|
-
result.t = tMax; result.barycentric =
|
|
633
|
+
result.hit = true; result.instance = bK; result.record = triangleIndex;
|
|
634
|
+
result.t = tMax; result.barycentric = aw;
|
|
628
635
|
`, false, false, 1, hasAnisotropyDirections)}
|
|
629
636
|
return result;
|
|
630
637
|
}
|
|
631
638
|
`;
|
|
632
639
|
}
|
|
633
|
-
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 = '' }) {
|
|
634
641
|
return /* wgsl */ `
|
|
635
|
-
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) {
|
|
636
643
|
|
|
637
644
|
(*si).hit = false;
|
|
638
645
|
|
|
@@ -641,31 +648,32 @@ return;
|
|
|
641
648
|
}
|
|
642
649
|
|
|
643
650
|
var tMax = RAY_MAX_DISTANCE;
|
|
644
|
-
var
|
|
645
|
-
var
|
|
651
|
+
var ei: i32;
|
|
652
|
+
var gZ: vec3f;
|
|
646
653
|
|
|
647
|
-
var
|
|
648
|
-
var
|
|
649
|
-
var
|
|
650
|
-
var
|
|
654
|
+
var hL: vec3i;
|
|
655
|
+
var mL: fL;
|
|
656
|
+
var am: i32;
|
|
657
|
+
var fT: i32 = (*si).triangleIndex;
|
|
658
|
+
let fS = (*si).instanceIndex;
|
|
651
659
|
|
|
652
660
|
${getBVHTraverseCode(`
|
|
653
661
|
(*si).triangleIndex = triangleIndex;
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
|
|
662
|
+
mL = tri;
|
|
663
|
+
hL = index;
|
|
664
|
+
am = bK;
|
|
665
|
+
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
|
|
658
666
|
|
|
659
|
-
${closestHitHook} if (
|
|
660
|
-
|
|
667
|
+
${closestHitHook} if (tD) {
|
|
668
|
+
nJ(
|
|
661
669
|
si,
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
670
|
+
mL,
|
|
671
|
+
aw,
|
|
672
|
+
hL,
|
|
673
|
+
bQ,
|
|
674
|
+
am,
|
|
675
|
+
hitNormal,
|
|
676
|
+
fe,
|
|
669
677
|
-1
|
|
670
678
|
);
|
|
671
679
|
}
|
|
@@ -681,58 +689,59 @@ return;
|
|
|
681
689
|
|
|
682
690
|
let bounces = 0;
|
|
683
691
|
let doubleSided = true;
|
|
684
|
-
let
|
|
692
|
+
let jK = false;
|
|
685
693
|
var tMax = maxDistance;
|
|
686
|
-
var
|
|
687
|
-
var
|
|
688
|
-
var
|
|
689
|
-
var
|
|
690
|
-
var
|
|
691
|
-
var
|
|
694
|
+
var ei: i32;
|
|
695
|
+
var gZ: vec3f;
|
|
696
|
+
var hL: vec3i;
|
|
697
|
+
var mL: fL;
|
|
698
|
+
var am: i32;
|
|
699
|
+
var fT: i32 = -1;
|
|
700
|
+
let fS = instanceIndex;
|
|
692
701
|
|
|
693
702
|
${getBVHTraverseCode(`
|
|
694
703
|
(*si).triangleIndex = triangleIndex;
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
704
|
+
mL = tri;
|
|
705
|
+
hL = index;
|
|
706
|
+
am = bK;
|
|
698
707
|
`, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
|
|
699
|
-
if (
|
|
708
|
+
if (bK != instanceIndex) {
|
|
700
709
|
continue;
|
|
701
710
|
}
|
|
702
|
-
|
|
711
|
+
`, perInstanceBounds)}
|
|
703
712
|
|
|
704
|
-
if (
|
|
705
|
-
(*si).instanceIndex =
|
|
706
|
-
(*si).normal =
|
|
707
|
-
(*si).position =
|
|
708
|
-
(*si).materialIndex = i32(
|
|
709
|
-
|
|
713
|
+
if (tD) {
|
|
714
|
+
(*si).instanceIndex = am;
|
|
715
|
+
(*si).normal = hitNormal;
|
|
716
|
+
(*si).position = fe;
|
|
717
|
+
(*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
|
|
718
|
+
hI(
|
|
710
719
|
si,
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
720
|
+
mL,
|
|
721
|
+
aw,
|
|
722
|
+
hL,
|
|
723
|
+
bQ,
|
|
715
724
|
-1
|
|
716
725
|
);
|
|
717
726
|
|
|
718
727
|
let l2w = mat4x4<f32>(
|
|
719
|
-
instancesBuffer[
|
|
720
|
-
instancesBuffer[
|
|
721
|
-
instancesBuffer[
|
|
722
|
-
instancesBuffer[
|
|
728
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
729
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
730
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
731
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
723
732
|
);
|
|
724
733
|
let w2l = mat4x4<f32>(
|
|
725
|
-
instancesBuffer[
|
|
726
|
-
instancesBuffer[
|
|
727
|
-
instancesBuffer[
|
|
728
|
-
instancesBuffer[
|
|
734
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
735
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
736
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
737
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
729
738
|
);
|
|
730
739
|
let aH = transpose(mat3x3<f32>(
|
|
731
740
|
w2l[0].xyz,
|
|
732
741
|
w2l[1].xyz,
|
|
733
742
|
w2l[2].xyz
|
|
734
743
|
));
|
|
735
|
-
(*si).faceNormal = normalize(aH *
|
|
744
|
+
(*si).faceNormal = normalize(aH * hitNormal);
|
|
736
745
|
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
737
746
|
(*si).normal = normalize(aH * (*si).normal);
|
|
738
747
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
@@ -750,75 +759,76 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
750
759
|
}
|
|
751
760
|
}
|
|
752
761
|
|
|
753
|
-
fn ${shadowName}(ray: Ray, lightDistance: f32,
|
|
762
|
+
fn ${shadowName}(ray: Ray, lightDistance: f32, kx: i32, tm:i32) -> bool {
|
|
754
763
|
if (rtUniform.isEmpty > 0) {
|
|
755
764
|
return false;
|
|
756
765
|
}
|
|
757
766
|
|
|
758
767
|
let doubleSided = true;
|
|
759
|
-
let
|
|
760
|
-
var tMax =
|
|
761
|
-
var
|
|
762
|
-
var
|
|
768
|
+
let sA = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
|
|
769
|
+
var tMax = sA;
|
|
770
|
+
var ei: i32;
|
|
771
|
+
var gZ: vec3f;
|
|
763
772
|
|
|
764
773
|
let bounces = 1;
|
|
765
|
-
var
|
|
766
|
-
var
|
|
774
|
+
var jK = false;
|
|
775
|
+
var fT: i32 = kx;
|
|
776
|
+
let fS = tm;
|
|
767
777
|
|
|
768
778
|
${getBVHTraverseCode(
|
|
769
779
|
/*wgsl */ `
|
|
770
780
|
|
|
771
781
|
|
|
772
782
|
|
|
773
|
-
var
|
|
783
|
+
var kc = true;
|
|
774
784
|
|
|
775
|
-
if (
|
|
785
|
+
if (kc) {
|
|
776
786
|
if (HAS_ALPHA) {
|
|
777
|
-
let materialIndex = i32(
|
|
778
|
-
if (!
|
|
787
|
+
let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
|
|
788
|
+
if (!po(
|
|
779
789
|
materialIndex,
|
|
780
790
|
index,
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
791
|
+
aw,
|
|
792
|
+
fe,
|
|
793
|
+
hitNormal${compactVertices ? ', triangleIndex' : ''}
|
|
784
794
|
)) {
|
|
785
795
|
|
|
786
|
-
tMax =
|
|
787
|
-
|
|
796
|
+
tMax = sA;
|
|
797
|
+
kc = false;
|
|
788
798
|
}
|
|
789
799
|
}
|
|
790
800
|
}
|
|
791
|
-
if (
|
|
801
|
+
if (kc) {
|
|
792
802
|
return true;
|
|
793
803
|
}
|
|
794
|
-
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
|
|
804
|
+
`, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
|
|
795
805
|
|
|
796
806
|
return false;
|
|
797
807
|
}
|
|
798
808
|
|
|
799
809
|
`;
|
|
800
810
|
}
|
|
801
|
-
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 = '' }) {
|
|
802
812
|
return /*wgsl*/ `
|
|
803
813
|
|
|
804
814
|
|
|
805
815
|
|
|
806
816
|
|
|
807
817
|
|
|
808
|
-
var<private>
|
|
809
|
-
var<private>
|
|
810
|
-
${(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>;` : ''}
|
|
811
821
|
|
|
812
822
|
${hasDisplacement ? displacementWgsl : ''}
|
|
813
823
|
${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
|
|
814
824
|
|
|
815
|
-
struct
|
|
825
|
+
struct fL {
|
|
816
826
|
p0: vec3f,
|
|
817
827
|
p1: vec3f,
|
|
818
828
|
p2: vec3f,
|
|
819
829
|
};
|
|
820
830
|
|
|
821
|
-
fn
|
|
831
|
+
fn hM(rad: f32, pos: vec3f, r: Ray) -> f32 {
|
|
822
832
|
let op: vec3f = pos - r.o;
|
|
823
833
|
let eps: f32 = 0.001;
|
|
824
834
|
let b: f32 = dot(op, r.d);
|
|
@@ -841,7 +851,7 @@ return t2;
|
|
|
841
851
|
return INF;
|
|
842
852
|
}
|
|
843
853
|
|
|
844
|
-
fn
|
|
854
|
+
fn oU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
|
|
845
855
|
let dt: f32 = dot(r.d, n);
|
|
846
856
|
let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
|
|
847
857
|
|
|
@@ -861,14 +871,16 @@ return INF;
|
|
|
861
871
|
}
|
|
862
872
|
|
|
863
873
|
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
|
-
|
|
874
|
+
let ao = distance(origin, center);
|
|
875
|
+
if (ao <= radius) { return INV4PI; }
|
|
876
|
+
let sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
|
|
877
|
+
let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
|
|
878
|
+
|
|
879
|
+
let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
880
|
+
return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
|
|
869
881
|
}
|
|
870
882
|
|
|
871
|
-
fn
|
|
883
|
+
fn iB(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
|
|
872
884
|
|
|
873
885
|
|
|
874
886
|
var d: f32 = INF;
|
|
@@ -880,9 +892,9 @@ var d: f32 = INF;
|
|
|
880
892
|
(*lightSample).isDelta = false;
|
|
881
893
|
var u = light.u;
|
|
882
894
|
var v = light.v;
|
|
883
|
-
var
|
|
895
|
+
var dU = i32(light.litType);
|
|
884
896
|
|
|
885
|
-
if (HAS_SCENE_RECT_LIGHT &&
|
|
897
|
+
if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
|
|
886
898
|
|
|
887
899
|
var pos = light.position - u * 0.5 - v * 0.5;
|
|
888
900
|
var normal = normalize(cross(u, v));
|
|
@@ -890,18 +902,18 @@ if (dot(normal, r.d) > 0.0) {
|
|
|
890
902
|
return INF;
|
|
891
903
|
}
|
|
892
904
|
|
|
893
|
-
d =
|
|
905
|
+
d = oU(pos, u, v, normal, r);
|
|
894
906
|
if (d < 0.0) {
|
|
895
907
|
d = INF;
|
|
896
908
|
}
|
|
897
909
|
else {
|
|
898
|
-
var
|
|
910
|
+
var cv: f32 = dot(-r.d, normal);
|
|
899
911
|
let spread = light.radiusOrSpread;
|
|
900
|
-
if (
|
|
912
|
+
if (cv >= cos(spread * PI / 2.0)) {
|
|
901
913
|
(*lightSample).direction = r.d;
|
|
902
914
|
(*lightSample).normal = normal;
|
|
903
915
|
(*lightSample).dist = d;
|
|
904
|
-
(*lightSample).pdf = (d * d) / (light.area *
|
|
916
|
+
(*lightSample).pdf = (d * d) / (light.area * cv);
|
|
905
917
|
(*lightSample).emission = light.emission;
|
|
906
918
|
(*lightSample).isDelta = false;
|
|
907
919
|
}
|
|
@@ -911,12 +923,12 @@ d = INF;
|
|
|
911
923
|
}
|
|
912
924
|
}
|
|
913
925
|
|
|
914
|
-
else if (HAS_SCENE_SPHERE_LIGHT &&
|
|
926
|
+
else if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
|
|
915
927
|
if (light.radiusOrSpread <= 0.0) {
|
|
916
|
-
let
|
|
917
|
-
let projection = dot(
|
|
918
|
-
let
|
|
919
|
-
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) {
|
|
920
932
|
return INF;
|
|
921
933
|
}
|
|
922
934
|
d = projection;
|
|
@@ -927,7 +939,7 @@ d = projection;
|
|
|
927
939
|
(*lightSample).isDelta = true;
|
|
928
940
|
}
|
|
929
941
|
else {
|
|
930
|
-
d =
|
|
942
|
+
d = hM(light.radiusOrSpread, light.position, r);
|
|
931
943
|
(*lightSample).isDelta = false;
|
|
932
944
|
if (d > 0.0 && d != INF) {
|
|
933
945
|
(*lightSample).direction = r.d;
|
|
@@ -956,12 +968,12 @@ light.radiusOrSpread <= 0.0
|
|
|
956
968
|
}
|
|
957
969
|
}
|
|
958
970
|
|
|
959
|
-
else if (HAS_SCENE_SPOT_LIGHT &&
|
|
971
|
+
else if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
|
|
960
972
|
if (light.radiusOrSpread <= 0.0) {
|
|
961
|
-
let
|
|
962
|
-
let projection = dot(
|
|
963
|
-
let
|
|
964
|
-
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) {
|
|
965
977
|
return INF;
|
|
966
978
|
}
|
|
967
979
|
d = projection;
|
|
@@ -972,13 +984,13 @@ d = projection;
|
|
|
972
984
|
(*lightSample).isDelta = true;
|
|
973
985
|
}
|
|
974
986
|
else {
|
|
975
|
-
d =
|
|
987
|
+
d = hM(light.radiusOrSpread, light.position, r);
|
|
976
988
|
(*lightSample).isDelta = false;
|
|
977
989
|
}
|
|
978
990
|
if (d != INF) {
|
|
979
|
-
let
|
|
980
|
-
let
|
|
981
|
-
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; }
|
|
982
994
|
if (light.radiusOrSpread > 0.0) {
|
|
983
995
|
(*lightSample).direction = r.d;
|
|
984
996
|
(*lightSample).dist = d;
|
|
@@ -987,7 +999,7 @@ r.o + r.d * d - light.position
|
|
|
987
999
|
);
|
|
988
1000
|
(*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
|
|
989
1001
|
}
|
|
990
|
-
(*lightSample).emission = light.emission *
|
|
1002
|
+
(*lightSample).emission = light.emission * od * select(
|
|
991
1003
|
1.0,
|
|
992
1004
|
1.0 / max(d * d, 1e-8),
|
|
993
1005
|
light.radiusOrSpread <= 0.0
|
|
@@ -995,7 +1007,7 @@ light.radiusOrSpread <= 0.0
|
|
|
995
1007
|
}
|
|
996
1008
|
}
|
|
997
1009
|
|
|
998
|
-
else if (
|
|
1010
|
+
else if (dU != RECT_LIGHT && dU != SPHERE_LIGHT && dU != SPOT_LIGHT) {
|
|
999
1011
|
|
|
1000
1012
|
d = INF;
|
|
1001
1013
|
}
|
|
@@ -1003,111 +1015,113 @@ d = INF;
|
|
|
1003
1015
|
return d;
|
|
1004
1016
|
}
|
|
1005
1017
|
|
|
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
|
|
1018
|
+
fn fv(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
|
|
1019
|
+
let m00 = af(m0.x);
|
|
1020
|
+
let m01 = af(m0.y);
|
|
1021
|
+
let m02 = af(m0.z);
|
|
1022
|
+
let m10 = af(m1.x);
|
|
1023
|
+
let m11 = af(m1.y);
|
|
1024
|
+
let m12 = af(m1.z);
|
|
1025
|
+
let m20 = af(m2.x);
|
|
1026
|
+
let m21 = af(m2.y);
|
|
1027
|
+
let m22 = af(m2.z);
|
|
1028
|
+
var w00 = m00.y * bary.x;
|
|
1029
|
+
var w01 = m01.y * bary.x;
|
|
1030
|
+
var w02 = m02.y * bary.x;
|
|
1031
|
+
var w10 = m10.y * bary.y;
|
|
1032
|
+
var w11 = m11.y * bary.y;
|
|
1033
|
+
var w12 = m12.y * bary.y;
|
|
1034
|
+
var w20 = m20.y * bary.z;
|
|
1035
|
+
var w21 = m21.y * bary.z;
|
|
1036
|
+
var w22 = m22.y * bary.z;
|
|
1037
|
+
|
|
1038
|
+
var hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
|
|
1039
|
+
|
|
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;
|
|
1049
|
+
|
|
1050
|
+
let rand = cm(0u);
|
|
1051
|
+
var oV: f32;
|
|
1040
1052
|
if (rand < w00) {
|
|
1041
|
-
|
|
1053
|
+
oV = m00.x;
|
|
1042
1054
|
} else if (rand < w01) {
|
|
1043
|
-
|
|
1055
|
+
oV = m01.x;
|
|
1044
1056
|
} else if (rand < w02) {
|
|
1045
|
-
|
|
1057
|
+
oV = m02.x;
|
|
1046
1058
|
} else if (rand < w10) {
|
|
1047
|
-
|
|
1059
|
+
oV = m10.x;
|
|
1048
1060
|
} else if (rand < w11) {
|
|
1049
|
-
|
|
1061
|
+
oV = m11.x;
|
|
1050
1062
|
} else if (rand < w12) {
|
|
1051
|
-
|
|
1063
|
+
oV = m12.x;
|
|
1052
1064
|
} else if (rand < w20) {
|
|
1053
|
-
|
|
1065
|
+
oV = m20.x;
|
|
1054
1066
|
} else if (rand < w21) {
|
|
1055
|
-
|
|
1067
|
+
oV = m21.x;
|
|
1056
1068
|
} else {
|
|
1057
|
-
|
|
1069
|
+
oV = m22.x;
|
|
1058
1070
|
}
|
|
1059
|
-
return i32(
|
|
1071
|
+
return i32(oV);
|
|
1060
1072
|
}
|
|
1061
1073
|
|
|
1062
|
-
fn
|
|
1063
|
-
|
|
1074
|
+
fn nl(
|
|
1075
|
+
lw: i32,
|
|
1064
1076
|
index: vec3i,
|
|
1065
|
-
|
|
1077
|
+
bary: vec3f${compactVertices ? ', record: i32' : ''}
|
|
1066
1078
|
) -> i32 {
|
|
1079
|
+
${compactVertices ? /* wgsl */ `return pJ(lw, record);` : /* wgsl */ `
|
|
1067
1080
|
let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1068
1081
|
let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1069
1082
|
let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
|
|
1070
1083
|
if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
|
|
1071
|
-
return
|
|
1084
|
+
return fv(m0, m1, m2, bary);
|
|
1072
1085
|
}
|
|
1073
|
-
return
|
|
1086
|
+
return lw;
|
|
1087
|
+
`}
|
|
1074
1088
|
}
|
|
1075
1089
|
|
|
1076
1090
|
|
|
1077
1091
|
|
|
1078
1092
|
${hasAnisotropyDirections ? /* wgsl */ `
|
|
1079
|
-
fn
|
|
1080
|
-
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;
|
|
1081
1095
|
var t = input.xyz;
|
|
1082
1096
|
var b = vec3f(0.0);
|
|
1083
1097
|
|
|
1084
1098
|
var sign = select(input.w, 0.0, abs(input.w) > 1.5);
|
|
1085
1099
|
if (abs(determinant) > 1e-12) {
|
|
1086
|
-
let dt = (dp1 *
|
|
1087
|
-
let db = (dp2 *
|
|
1100
|
+
let dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
|
|
1101
|
+
let db = (dp2 * pU.x - dp1 * pV.x) / determinant;
|
|
1088
1102
|
if (dot(t, t) < 1e-8) { t = dt; }
|
|
1089
1103
|
if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
|
|
1090
1104
|
}
|
|
1091
1105
|
t -= normal * dot(normal, t);
|
|
1092
1106
|
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,
|
|
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);
|
|
1098
1112
|
}
|
|
1099
1113
|
else { t = normalize(t); b = normalize(cross(normal, t)); }
|
|
1100
1114
|
return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
|
|
1101
1115
|
}
|
|
1102
1116
|
|
|
1103
1117
|
` : /* wgsl */ ``}
|
|
1104
|
-
fn
|
|
1118
|
+
fn hI(
|
|
1105
1119
|
si: ptr<function, SurfaceInteraction>,
|
|
1106
|
-
tri:
|
|
1107
|
-
|
|
1120
|
+
tri: fL,
|
|
1121
|
+
bary: vec3f,
|
|
1108
1122
|
index: vec3i,
|
|
1109
|
-
|
|
1110
|
-
|
|
1123
|
+
bQ: bool,
|
|
1124
|
+
fH: i32
|
|
1111
1125
|
) {
|
|
1112
1126
|
(*si).hit = true;
|
|
1113
1127
|
|
|
@@ -1119,26 +1133,26 @@ let i1 = index.y;
|
|
|
1119
1133
|
let i2 = index.z;
|
|
1120
1134
|
(*si).vertexColor = vec3f(1.0);
|
|
1121
1135
|
if (USE_VERTEX_COLOR) {
|
|
1122
|
-
(*si).vertexColor =
|
|
1123
|
-
+
|
|
1124
|
-
+
|
|
1136
|
+
(*si).vertexColor = bary.x * vertexColor(i0)
|
|
1137
|
+
+ bary.y * vertexColor(i1)
|
|
1138
|
+
+ bary.z * vertexColor(i2);
|
|
1125
1139
|
}
|
|
1126
|
-
let
|
|
1140
|
+
let qP = uvProjection == ${uvProjectionConstants.spherical};
|
|
1127
1141
|
|
|
1128
1142
|
var normal: vec3f = (*si).normal;
|
|
1129
|
-
var
|
|
1143
|
+
var hu: vec3f;
|
|
1130
1144
|
var n0 = vec3f(0.0);
|
|
1131
1145
|
var n1 = vec3f(0.0);
|
|
1132
1146
|
var n2 = vec3f(0.0);
|
|
1133
1147
|
|
|
1134
1148
|
|
|
1135
|
-
if (!
|
|
1136
|
-
n0 =
|
|
1137
|
-
n1 =
|
|
1138
|
-
n2 =
|
|
1139
|
-
|
|
1140
|
-
if (!
|
|
1141
|
-
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;
|
|
1142
1156
|
}
|
|
1143
1157
|
}
|
|
1144
1158
|
|
|
@@ -1146,48 +1160,48 @@ var uv: vec2f;
|
|
|
1146
1160
|
var uv0: vec2f;
|
|
1147
1161
|
var uv1: vec2f;
|
|
1148
1162
|
var uv2: vec2f;
|
|
1149
|
-
var
|
|
1163
|
+
var cT = vec2f(0.0);
|
|
1150
1164
|
if (USE_UV) {
|
|
1151
|
-
uv0 =
|
|
1152
|
-
uv1 =
|
|
1153
|
-
uv2 =
|
|
1154
|
-
uv =
|
|
1165
|
+
uv0 = hd(i0);
|
|
1166
|
+
uv1 = hd(i1);
|
|
1167
|
+
uv2 = hd(i2);
|
|
1168
|
+
uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
|
|
1155
1169
|
if (USE_UV1) {
|
|
1156
|
-
let secondaryUv0 =
|
|
1157
|
-
let secondaryUv1 =
|
|
1158
|
-
let secondaryUv2 =
|
|
1159
|
-
|
|
1160
|
-
+
|
|
1161
|
-
+
|
|
1170
|
+
let secondaryUv0 = hV(i0);
|
|
1171
|
+
let secondaryUv1 = hV(i1);
|
|
1172
|
+
let secondaryUv2 = hV(i2);
|
|
1173
|
+
cT = bary.x * secondaryUv0
|
|
1174
|
+
+ bary.y * secondaryUv1
|
|
1175
|
+
+ bary.z * secondaryUv2;
|
|
1162
1176
|
}
|
|
1163
1177
|
}
|
|
1164
1178
|
|
|
1165
1179
|
if (USE_TANGENT) {
|
|
1166
|
-
let t0 =
|
|
1167
|
-
let t1 =
|
|
1168
|
-
let t2 =
|
|
1169
|
-
(*si).tangent = normalize(
|
|
1180
|
+
let t0 = gC(i0).xyz;
|
|
1181
|
+
let t1 = gC(i1).xyz;
|
|
1182
|
+
let t2 = gC(i2).xyz;
|
|
1183
|
+
(*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
|
|
1170
1184
|
}
|
|
1171
1185
|
|
|
1172
|
-
if (
|
|
1173
|
-
(*si).materialIndex =
|
|
1186
|
+
if (fH >= 0) {
|
|
1187
|
+
(*si).materialIndex = fH;
|
|
1174
1188
|
}
|
|
1175
1189
|
else {
|
|
1176
|
-
(*si).materialIndex =
|
|
1190
|
+
(*si).materialIndex = nl(
|
|
1177
1191
|
(*si).materialIndex,
|
|
1178
1192
|
index,
|
|
1179
|
-
|
|
1193
|
+
bary${compactVertices ? ', (*si).triangleIndex' : ''}
|
|
1180
1194
|
);
|
|
1181
1195
|
}
|
|
1182
1196
|
|
|
1183
1197
|
if (uvProjection > 0) {
|
|
1184
1198
|
|
|
1185
|
-
uv =
|
|
1186
|
-
|
|
1199
|
+
uv = gW(uvProjection, (*si).position, select(normal, hu, qP));
|
|
1200
|
+
cT = uv;
|
|
1187
1201
|
}
|
|
1188
1202
|
|
|
1189
1203
|
uv = uv * material.uvScale;
|
|
1190
|
-
|
|
1204
|
+
cT = cT * material.uvScale;
|
|
1191
1205
|
|
|
1192
1206
|
|
|
1193
1207
|
if (uvProjection == ${uvProjectionConstants.triplanar}) {
|
|
@@ -1200,41 +1214,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
|
|
|
1200
1214
|
if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
|
|
1201
1215
|
let dp1 = tri.p0 - tri.p2;
|
|
1202
1216
|
let dp2 = tri.p1 - tri.p2;
|
|
1203
|
-
var
|
|
1217
|
+
var aT = vec4f(0.0);
|
|
1204
1218
|
if (USE_TANGENT) {
|
|
1205
|
-
|
|
1206
|
-
+
|
|
1207
|
-
+
|
|
1208
|
-
}
|
|
1209
|
-
let
|
|
1210
|
-
(*si).geometryTangent =
|
|
1211
|
-
(*si).geometryBitangent =
|
|
1212
|
-
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;
|
|
1213
1227
|
if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
|
|
1214
|
-
let a =
|
|
1215
|
-
let b =
|
|
1216
|
-
let c =
|
|
1217
|
-
|
|
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));
|
|
1218
1232
|
}
|
|
1219
|
-
(*si).directionTangent =
|
|
1220
|
-
(*si).directionBitangent =
|
|
1233
|
+
(*si).directionTangent = gp[0];
|
|
1234
|
+
(*si).directionBitangent = gp[1];
|
|
1221
1235
|
${hasCoatNormals ? /* wgsl */ `
|
|
1222
1236
|
if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
|
|
1223
|
-
let
|
|
1224
|
-
var
|
|
1225
|
-
if (USE_UV1 && mapInfo[
|
|
1226
|
-
let a =
|
|
1227
|
-
let b =
|
|
1228
|
-
let c =
|
|
1229
|
-
|
|
1230
|
-
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));
|
|
1231
1245
|
}
|
|
1232
1246
|
|
|
1233
1247
|
|
|
1234
|
-
let decoded = sampleMap(
|
|
1235
|
-
select(
|
|
1236
|
-
let mapped =
|
|
1237
|
-
+
|
|
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;
|
|
1238
1252
|
if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
1239
1253
|
}
|
|
1240
1254
|
` : ''}
|
|
@@ -1244,19 +1258,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
|
|
|
1244
1258
|
(*si).normal = normal;
|
|
1245
1259
|
(*si).vertexNormal = normal;
|
|
1246
1260
|
(*si).shadowOffset = vec3f(0.0);
|
|
1247
|
-
if (!
|
|
1261
|
+
if (!bQ) {
|
|
1248
1262
|
|
|
1249
1263
|
|
|
1250
1264
|
|
|
1251
1265
|
let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
|
|
1252
|
-
let
|
|
1266
|
+
let le = bary.x * n0 + bary.y * n1 + bary.z * n2;
|
|
1253
1267
|
let a = dot(n2 - n0, tri.p0 - tri.p2);
|
|
1254
1268
|
let b = dot(n2 - n1, tri.p1 - tri.p2);
|
|
1255
1269
|
let c = dot(n1 - n0, tri.p1 - tri.p0);
|
|
1256
|
-
var h = a *
|
|
1257
|
-
+ (a + b + c) *
|
|
1258
|
-
+ b *
|
|
1259
|
-
if (dot(
|
|
1270
|
+
var h = a * bary.x * (bary.x - 1.0)
|
|
1271
|
+
+ (a + b + c) * bary.x * bary.y
|
|
1272
|
+
+ b * bary.y * (bary.y - 1.0);
|
|
1273
|
+
if (dot(le, geometricNormal) > 0.0) {
|
|
1260
1274
|
var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
|
|
1261
1275
|
var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
|
|
1262
1276
|
var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
|
|
@@ -1274,22 +1288,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
|
|
|
1274
1288
|
h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
|
|
1275
1289
|
h = min(-min(min(h0, h1), h2), h * 0.5);
|
|
1276
1290
|
}
|
|
1277
|
-
(*si).shadowOffset =
|
|
1291
|
+
(*si).shadowOffset = le * h;
|
|
1278
1292
|
}
|
|
1279
1293
|
(*si).uv = uv;
|
|
1280
|
-
(*si).uv1 =
|
|
1294
|
+
(*si).uv1 = cT;
|
|
1281
1295
|
if (USE_NORMAL_MAPS) {
|
|
1282
1296
|
let dp1 = tri.p0 - tri.p2;
|
|
1283
1297
|
let dp2 = tri.p1 - tri.p2;
|
|
1284
|
-
let
|
|
1285
|
-
let
|
|
1286
|
-
(*si).normal =
|
|
1287
|
-
(*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
|
|
1288
1302
|
);
|
|
1289
1303
|
}
|
|
1290
1304
|
}
|
|
1291
1305
|
|
|
1292
|
-
struct
|
|
1306
|
+
struct eF {
|
|
1293
1307
|
t: f32,
|
|
1294
1308
|
barycentric: vec3f,
|
|
1295
1309
|
};
|
|
@@ -1298,8 +1312,8 @@ barycentric: vec3f,
|
|
|
1298
1312
|
|
|
1299
1313
|
|
|
1300
1314
|
|
|
1301
|
-
fn
|
|
1302
|
-
var ti:
|
|
1315
|
+
fn fY(o: vec3f, d: vec3f, tri: fL, ei: i32, gZ: vec3f, tMax: f32) -> eF {
|
|
1316
|
+
var ti: eF;
|
|
1303
1317
|
|
|
1304
1318
|
|
|
1305
1319
|
var p0t = tri.p0 - o;
|
|
@@ -1307,11 +1321,11 @@ var p1t = tri.p1 - o;
|
|
|
1307
1321
|
var p2t = tri.p2 - o;
|
|
1308
1322
|
|
|
1309
1323
|
|
|
1310
|
-
if (
|
|
1324
|
+
if (ei == 0) {
|
|
1311
1325
|
p0t = p0t.yzx;
|
|
1312
1326
|
p1t = p1t.yzx;
|
|
1313
1327
|
p2t = p2t.yzx;
|
|
1314
|
-
} else if (
|
|
1328
|
+
} else if (ei == 1) {
|
|
1315
1329
|
p0t = p0t.zxy;
|
|
1316
1330
|
p1t = p1t.zxy;
|
|
1317
1331
|
p2t = p2t.zxy;
|
|
@@ -1319,9 +1333,9 @@ p2t = p2t.zxy;
|
|
|
1319
1333
|
|
|
1320
1334
|
|
|
1321
1335
|
|
|
1322
|
-
p0t = vec3f(p0t.xy +
|
|
1323
|
-
p1t = vec3f(p1t.xy +
|
|
1324
|
-
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);
|
|
1325
1339
|
|
|
1326
1340
|
|
|
1327
1341
|
var e = vec3f(
|
|
@@ -1333,9 +1347,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
|
|
|
1333
1347
|
if (DEPTH_QUERY_MODE) {
|
|
1334
1348
|
|
|
1335
1349
|
|
|
1336
|
-
let
|
|
1350
|
+
let ua = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
|
|
1337
1351
|
+ abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
|
|
1338
|
-
e = select(e, vec3f(0.0), abs(e) <=
|
|
1352
|
+
e = select(e, vec3f(0.0), abs(e) <= ua * 1e-6);
|
|
1339
1353
|
}
|
|
1340
1354
|
|
|
1341
1355
|
|
|
@@ -1346,19 +1360,19 @@ return ti;
|
|
|
1346
1360
|
let det = e.x + e.y + e.z;
|
|
1347
1361
|
if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
|
|
1348
1362
|
|
|
1349
|
-
p0t.z *=
|
|
1350
|
-
p1t.z *=
|
|
1351
|
-
p2t.z *=
|
|
1352
|
-
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);
|
|
1353
1367
|
|
|
1354
1368
|
|
|
1355
|
-
if (abs(
|
|
1369
|
+
if (abs(tQ) > abs(tMax * det)) {
|
|
1356
1370
|
return ti;
|
|
1357
1371
|
}
|
|
1358
1372
|
|
|
1359
|
-
let
|
|
1360
|
-
ti.t =
|
|
1361
|
-
ti.barycentric = e *
|
|
1373
|
+
let vu = 1. / det;
|
|
1374
|
+
ti.t = tQ * vu;
|
|
1375
|
+
ti.barycentric = e * vu;
|
|
1362
1376
|
|
|
1363
1377
|
return ti;
|
|
1364
1378
|
}
|
|
@@ -1368,26 +1382,26 @@ return ti;
|
|
|
1368
1382
|
|
|
1369
1383
|
override DEPTH_QUERY_MODE: bool = false;
|
|
1370
1384
|
|
|
1371
|
-
fn
|
|
1385
|
+
fn traversalInverse(d: vec3f) -> vec3f {
|
|
1372
1386
|
if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
|
|
1373
1387
|
return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
|
|
1374
1388
|
}
|
|
1375
1389
|
|
|
1376
|
-
fn
|
|
1390
|
+
fn ff(invD: vec3f, o: vec3f) -> vec3f {
|
|
1377
1391
|
if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
|
|
1378
|
-
return abs(
|
|
1392
|
+
return abs(invD) * max(vec3f(1.0), abs(o)) * 1e-6;
|
|
1379
1393
|
}
|
|
1380
1394
|
|
|
1381
1395
|
|
|
1382
1396
|
|
|
1383
|
-
fn
|
|
1384
|
-
let
|
|
1385
|
-
let
|
|
1386
|
-
let padding =
|
|
1387
|
-
let
|
|
1388
|
-
let
|
|
1389
|
-
let t0 = max(
|
|
1390
|
-
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));
|
|
1391
1405
|
return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
|
|
1392
1406
|
}
|
|
1393
1407
|
|
|
@@ -1395,58 +1409,58 @@ fn maxDimension(v: vec3f) -> i32 {
|
|
|
1395
1409
|
return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
|
|
1396
1410
|
}
|
|
1397
1411
|
|
|
1398
|
-
fn
|
|
1412
|
+
fn nV(d: vec3f, ei: i32) -> vec3f {
|
|
1399
1413
|
|
|
1400
1414
|
|
|
1401
|
-
if (
|
|
1415
|
+
if (ei == 0) {
|
|
1402
1416
|
return vec3f(-d.y, -d.z, 1.0) / d.x;
|
|
1403
|
-
} else if (
|
|
1417
|
+
} else if (ei == 1) {
|
|
1404
1418
|
return vec3f(-d.z, -d.x, 1.0) / d.y;
|
|
1405
1419
|
} else {
|
|
1406
1420
|
return vec3f(-d.x, -d.y, 1.0) / d.z;
|
|
1407
1421
|
}
|
|
1408
1422
|
}
|
|
1409
1423
|
|
|
1410
|
-
fn
|
|
1424
|
+
fn nJ(
|
|
1411
1425
|
si: ptr<function, SurfaceInteraction>,
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1426
|
+
mL: fL,
|
|
1427
|
+
aw: vec3f,
|
|
1428
|
+
hL: vec3i,
|
|
1429
|
+
bQ: bool,
|
|
1430
|
+
am: i32,
|
|
1431
|
+
hitNormal: vec3f,
|
|
1432
|
+
fe: vec3f,
|
|
1433
|
+
fH: i32
|
|
1420
1434
|
) {
|
|
1421
|
-
(*si).instanceIndex =
|
|
1422
|
-
(*si).barycentrics =
|
|
1423
|
-
(*si).normal =
|
|
1424
|
-
(*si).position =
|
|
1425
|
-
(*si).materialIndex = i32(
|
|
1426
|
-
bitcast<i32>(instancesBuffer[
|
|
1435
|
+
(*si).instanceIndex = am;
|
|
1436
|
+
(*si).barycentrics = aw.xy;
|
|
1437
|
+
(*si).normal = hitNormal;
|
|
1438
|
+
(*si).position = fe;
|
|
1439
|
+
(*si).materialIndex = i32(af(
|
|
1440
|
+
bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
|
|
1427
1441
|
).x);
|
|
1428
1442
|
|
|
1429
1443
|
|
|
1430
|
-
|
|
1444
|
+
hI(
|
|
1431
1445
|
si,
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1446
|
+
mL,
|
|
1447
|
+
aw,
|
|
1448
|
+
hL,
|
|
1449
|
+
bQ,
|
|
1450
|
+
fH
|
|
1437
1451
|
);
|
|
1438
1452
|
|
|
1439
1453
|
let l2w = mat4x4<f32>(
|
|
1440
|
-
instancesBuffer[
|
|
1441
|
-
instancesBuffer[
|
|
1442
|
-
instancesBuffer[
|
|
1443
|
-
instancesBuffer[
|
|
1454
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
|
|
1455
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
|
|
1456
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
|
|
1457
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
|
|
1444
1458
|
);
|
|
1445
1459
|
let w2l = mat4x4<f32>(
|
|
1446
|
-
instancesBuffer[
|
|
1447
|
-
instancesBuffer[
|
|
1448
|
-
instancesBuffer[
|
|
1449
|
-
instancesBuffer[
|
|
1460
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
|
|
1461
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
|
|
1462
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
|
|
1463
|
+
instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
|
|
1450
1464
|
);
|
|
1451
1465
|
let aH = transpose(mat3x3<f32>(
|
|
1452
1466
|
w2l[0].xyz,
|
|
@@ -1454,7 +1468,7 @@ w2l[1].xyz,
|
|
|
1454
1468
|
w2l[2].xyz
|
|
1455
1469
|
));
|
|
1456
1470
|
|
|
1457
|
-
(*si).faceNormal = normalize(aH *
|
|
1471
|
+
(*si).faceNormal = normalize(aH * hitNormal);
|
|
1458
1472
|
(*si).vertexNormal = normalize(aH * (*si).vertexNormal);
|
|
1459
1473
|
(*si).normal = normalize(aH * (*si).normal);
|
|
1460
1474
|
${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
|
|
@@ -1472,10 +1486,10 @@ ${hasAnisotropyDirections ? /* wgsl */ `
|
|
|
1472
1486
|
}
|
|
1473
1487
|
|
|
1474
1488
|
|
|
1475
|
-
${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
|
|
1489
|
+
${createIntersectionAlphaWgsl(hasAnisotropyDirections, compactVertices)}
|
|
1476
1490
|
|
|
1477
1491
|
|
|
1478
1492
|
|
|
1479
|
-
${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
|
|
1493
|
+
${sceneIntersections || createSceneIntersectionsWgsl({ perInstanceBounds, compactVertices, hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
|
|
1480
1494
|
}
|
|
1481
1495
|
//# sourceMappingURL=intersect.wgsl.js.map
|