@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
|
@@ -13,7 +13,7 @@ function record(fields) {
|
|
|
13
13
|
// One source for native wire records, resource identities and shared WebGPU
|
|
14
14
|
// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.
|
|
15
15
|
export const WORD_BYTES = 4;
|
|
16
|
-
export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1 };
|
|
16
|
+
export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, TARGET_PACKET: 4, GEOMETRY_KERNELS: 1 };
|
|
17
17
|
export function sceneRecords() {
|
|
18
18
|
return {
|
|
19
19
|
HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),
|
|
@@ -39,7 +39,7 @@ export function sceneRecords() {
|
|
|
39
39
|
EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),
|
|
40
40
|
SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),
|
|
41
41
|
field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),
|
|
42
|
-
field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),
|
|
42
|
+
field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'), field('CAUSTIC_FLAGS'), field('LIGHT_PHOTONS'), field('PHOTON_MAP_PHOTONS'), field('PHOTON_MAP_RADIUS'), field('TEXTURE_DIMENSION'), field('TEXTURE_BINDINGS'), field('TEXTURE_BUDGET_BYTES', 2)]),
|
|
43
43
|
WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),
|
|
44
44
|
GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),
|
|
45
45
|
GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),
|
|
@@ -55,7 +55,7 @@ export const resourceIds = {
|
|
|
55
55
|
HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,
|
|
56
56
|
DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,
|
|
57
57
|
PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,
|
|
58
|
-
SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55
|
|
58
|
+
SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55, MATERIAL_TEXTURE_BASE: 1000
|
|
59
59
|
};
|
|
60
60
|
export const packetKinds = { BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3 };
|
|
61
61
|
export const samplerIds = { MATERIAL: 40 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS')]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
|
|
1
|
+
{"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3,TARGET_PACKET:4, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'),field('CAUSTIC_FLAGS'),field('LIGHT_PHOTONS'),field('PHOTON_MAP_PHOTONS'),field('PHOTON_MAP_RADIUS'), field('TEXTURE_DIMENSION'), field('TEXTURE_BINDINGS'), field('TEXTURE_BUDGET_BYTES', 2)]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55, MATERIAL_TEXTURE_BASE: 1000\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
|
|
@@ -14,14 +14,15 @@ export interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {
|
|
|
14
14
|
displacementScale: number;
|
|
15
15
|
bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];
|
|
16
16
|
}
|
|
17
|
-
export declare function updateMeshInstanceTransforms<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], current?: MeshInstances, dirtyIndices?: ReadonlySet<number>):
|
|
17
|
+
export declare function updateMeshInstanceTransforms<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], current?: MeshInstances, dirtyIndices?: ReadonlySet<number>): TLASInstance[] | PackedMeshInstances;
|
|
18
18
|
/** Dirty slots shared by Web refits and native range uploads. */
|
|
19
19
|
export declare function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances): Set<number>;
|
|
20
20
|
export declare function prepareSceneMeshes<M extends MeshState>(meshes: M[], prepareGeometry: (mesh: M) => {
|
|
21
21
|
geometry: Geometry;
|
|
22
22
|
displacementScale: number;
|
|
23
|
-
}, boundsForGeometry?: typeof getBvhBounds, softwareBvhs?: boolean): {
|
|
23
|
+
}, boundsForGeometry?: typeof getBvhBounds, softwareBvhs?: boolean, mergeAttributes?: boolean): {
|
|
24
24
|
geometry: Geometry;
|
|
25
|
+
mergedAttributes: boolean;
|
|
25
26
|
geometries: Geometry[];
|
|
26
27
|
geometryRegions: Map<Geometry, {
|
|
27
28
|
vertexOffset: number;
|
|
@@ -129,7 +129,7 @@ export function dirtyPreparedInstanceIndices(bindings, meshes, instances) {
|
|
|
129
129
|
}
|
|
130
130
|
return dirty;
|
|
131
131
|
}
|
|
132
|
-
export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry = getBvhBounds, softwareBvhs = true) {
|
|
132
|
+
export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry = getBvhBounds, softwareBvhs = true, mergeAttributes = true) {
|
|
133
133
|
const materialIndexMap = new Map();
|
|
134
134
|
const geometryIndexMap = new Map();
|
|
135
135
|
const geometryBounds = new Map();
|
|
@@ -206,9 +206,18 @@ export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry =
|
|
|
206
206
|
})
|
|
207
207
|
.filter((instance) => instance != null);
|
|
208
208
|
const geometryRegions = new Map();
|
|
209
|
-
const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);
|
|
209
|
+
const geometry = mergeAttributes ? mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions) : geometryLayout(geometries);
|
|
210
|
+
if (!mergeAttributes) {
|
|
211
|
+
let vertexOffset = 0, indexOffset = 0;
|
|
212
|
+
geometries.forEach((g, i) => {
|
|
213
|
+
geometryRegions.set(g, { vertexOffset, indexOffset, materialIndices: globalMaterialIndicesMap[i] });
|
|
214
|
+
vertexOffset += g.vertexCount;
|
|
215
|
+
indexOffset += g.indexArray.length;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
210
218
|
return {
|
|
211
219
|
geometry,
|
|
220
|
+
mergedAttributes: mergeAttributes,
|
|
212
221
|
geometries,
|
|
213
222
|
geometryRegions,
|
|
214
223
|
geometryStates: new Map(instanceBindings.map(binding => {
|
|
@@ -227,6 +236,13 @@ export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry =
|
|
|
227
236
|
})) : []
|
|
228
237
|
};
|
|
229
238
|
}
|
|
239
|
+
// Feature descriptor only: direct WebGPU packing retains the original geometries.
|
|
240
|
+
function geometryLayout(geometries) {
|
|
241
|
+
const empty = new Float32Array(0);
|
|
242
|
+
return new Geometry({ position: new Attribute(empty, 3), normal: new Attribute(empty, 3),
|
|
243
|
+
indices: new Attribute(new Uint32Array(0), 1),
|
|
244
|
+
tangent: geometries.some(g => g.tangent) ? new Attribute(empty, 4) : undefined });
|
|
245
|
+
}
|
|
230
246
|
export function mergeGeometry(geometries, globalMaterialIndicesMap, regions, webgl = false) {
|
|
231
247
|
const totalVertexCount = geometries.reduce((sum, geo) => sum + geo.vertexCount, 0);
|
|
232
248
|
const totalIndexCount = geometries.reduce((sum, geo) => sum + geo.indexArray.length, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenePreparation.js","sourceRoot":"","sources":["../../src/renderer/scenePreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { Box3 } from './Box3.js';\nimport MeshState from '../scene/MeshState.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';\nimport { type TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport { getBvhBounds } from './geometryBvhBounds.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { read } from '../math/access.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\n\n// Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result: Box3 = makeBounds(),\n p = vec3.create()\n) {\n const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n (corner & 1 ? upper[0] : lower[0]),\n (corner & 2 ? upper[1] : lower[1]),\n (corner & 4 ? upper[2] : lower[2])\n );\n vec3.transformMat4(p, p, matrix);\n if (!finiteValues(p)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {\n mesh: M;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms<M extends MeshState>(\n bindings: PreparedMeshInstanceBinding<M>[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n // Dirty indices are packed source slots, as consumed by refitTLAS. Preserve\n // the previous candidate until membership and GPU validation have succeeded.\n if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&\n current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {\n const next = current.copy(), matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let membershipChanged = false;\n const parents = new Map<M, Float64Array>();\n for (const index of dirtyIndices) {\n const binding = bindings[current.bindingIndices[index]];\n const local = current.localIndices[index];\n if (!binding || local >= meshInstanceCount(binding.mesh)) {membershipChanged = true; break;}\n let parent = parents.get(binding.mesh);\n if (!parent) { parent = matrixStorage(binding.mesh.transform); parents.set(binding.mesh, parent); }\n meshInstanceTransform(binding.mesh, local, matrix, parent);\n const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {membershipChanged = true; break;}\n next.transforms.set(matrix, index * 16); next.bounds.set(bounds.min, index * 6); next.bounds.set(bounds.max, index * 6 + 3);\n }\n if (!membershipChanged) return next;\n }\n if (bindings.some(binding => binding.mesh.instanceData != null)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let sourceIndex = 0;\n for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {\n const binding = bindings[bindingIndex];\n const slots: number[] = []; packed.bindingSlots.push(slots);\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n const parent = matrixStorage(mesh.transform);\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix, parent);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex; packed.bindingIndices[index] = bindingIndex; packed.localIndices[index] = i; slots.push(index);\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh.instanceData?.colors;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding<M>\n ): TLASInstance =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices || !Array.isArray(current)) return bindings.map(update);\n const next = current.slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Dirty slots shared by Web refits and native range uploads. */\nexport function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances) {\n const dirty = new Set<number>();\n for (let i = 0; i < bindings.length; i++) {\n if (!meshes.has(bindings[i].mesh)) continue;\n if (!Array.isArray(instances)) {\n for (const slot of instances.bindingSlots[i] ?? []) dirty.add(slot);\n } else dirty.add(i);\n }\n return dirty;\n}\n\nexport function prepareSceneMeshes<M extends MeshState>(meshes: M[],\n prepareGeometry: (mesh: M) => {geometry: Geometry; displacementScale: number},\n boundsForGeometry = getBvhBounds, softwareBvhs = true) {\n const materialIndexMap = new Map<MaterialState, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometryBounds = new Map<Geometry, [Float64Array, Float64Array]>();\n const geometries: Geometry[] = [];\n const materials: M['materials'] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: M;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding<M>[] = [];\n\n\n const instances: TLASInstance[] = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareGeometry(mesh);\n let cachedBounds = geometryBounds.get(geometry);\n if (!cachedBounds) {\n const rawBounds = boundsForGeometry(geometry);\n cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];\n geometryBounds.set(geometry, cachedBounds);\n }\n // Instances share the scan, while retained updates keep independent arrays.\n const bvhBounds: [Float64Array, Float64Array] = [cachedBounds[0].slice(), cachedBounds[1].slice()];\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance: TLASInstance = {\n bounds,\n blasIndex: geoIdx!,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (mesh.instanceData == null && (\n !finiteValues(bounds.min) ||\n !finiteValues(bounds.max) ||\n !finiteValues(mesh.transform)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indexArray.length }];\n })),\n instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances) as MeshInstances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: softwareBvhs ? geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indexArray.length / 3\n })) : []\n };\n}\n\nexport function mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>,\n webgl = false\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indexArray.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n // The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute\n // selection; instanced preparation uses XYZW tangents and independent channels.\n const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;\n const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);\n const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);\n const tangentSize = webgl ? 3 : 4;\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (mergedGeometry.color && geometry.color) {\n mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);\n }\n if (mergedGeometry.tangent && geometry.tangent) {\n const source = geometry.tangent;\n if (webgl) {\n mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);\n } else for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);\n\n const meshIndices = geometry.indexArray;\n for (let i = 0; i < attributeLength(meshIndices); i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);\n }\n currentVertex += vertexCount;\n currentIndex += attributeLength(meshIndices);\n });\n\n return mergedGeometry;\n}\n\nexport function computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = attributeValue(indices, f++);\n i2 = attributeValue(indices, f++);\n i3 = attributeValue(indices, f++);\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n\nfunction finiteValues(values: Float32Array | Float64Array | number[]): boolean {\n if (values instanceof Float32Array) return finiteStorage(values);\n if (values instanceof Float64Array) return finiteStorage(values);\n return finiteStorage(values);\n}\nfunction finiteStorage<T extends Float32Array | Float64Array | number[]>(values: T): boolean {\n const length = values.length;\n for (let i = 0; i < length; i++) if (!Number.isFinite(read(values, i))) return false;\n return true;\n}\n\nfunction makeBounds(): Box3 {\n return new Box3();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scenePreparation.js","sourceRoot":"","sources":["../../src/renderer/scenePreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { Box3 } from './Box3.js';\nimport MeshState from '../scene/MeshState.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';\nimport { type TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport { getBvhBounds } from './geometryBvhBounds.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { read } from '../math/access.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\n\n// Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result: Box3 = makeBounds(),\n p = vec3.create()\n) {\n const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n (corner & 1 ? upper[0] : lower[0]),\n (corner & 2 ? upper[1] : lower[1]),\n (corner & 4 ? upper[2] : lower[2])\n );\n vec3.transformMat4(p, p, matrix);\n if (!finiteValues(p)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {\n mesh: M;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms<M extends MeshState>(\n bindings: PreparedMeshInstanceBinding<M>[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n // Dirty indices are packed source slots, as consumed by refitTLAS. Preserve\n // the previous candidate until membership and GPU validation have succeeded.\n if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&\n current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {\n const next = current.copy(), matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let membershipChanged = false;\n const parents = new Map<M, Float64Array>();\n for (const index of dirtyIndices) {\n const binding = bindings[current.bindingIndices[index]];\n const local = current.localIndices[index];\n if (!binding || local >= meshInstanceCount(binding.mesh)) {membershipChanged = true; break;}\n let parent = parents.get(binding.mesh);\n if (!parent) { parent = matrixStorage(binding.mesh.transform); parents.set(binding.mesh, parent); }\n meshInstanceTransform(binding.mesh, local, matrix, parent);\n const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {membershipChanged = true; break;}\n next.transforms.set(matrix, index * 16); next.bounds.set(bounds.min, index * 6); next.bounds.set(bounds.max, index * 6 + 3);\n }\n if (!membershipChanged) return next;\n }\n if (bindings.some(binding => binding.mesh.instanceData != null)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let sourceIndex = 0;\n for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {\n const binding = bindings[bindingIndex];\n const slots: number[] = []; packed.bindingSlots.push(slots);\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n const parent = matrixStorage(mesh.transform);\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix, parent);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex; packed.bindingIndices[index] = bindingIndex; packed.localIndices[index] = i; slots.push(index);\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh.instanceData?.colors;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding<M>\n ): TLASInstance =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices || !Array.isArray(current)) return bindings.map(update);\n const next = current.slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Dirty slots shared by Web refits and native range uploads. */\nexport function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances) {\n const dirty = new Set<number>();\n for (let i = 0; i < bindings.length; i++) {\n if (!meshes.has(bindings[i].mesh)) continue;\n if (!Array.isArray(instances)) {\n for (const slot of instances.bindingSlots[i] ?? []) dirty.add(slot);\n } else dirty.add(i);\n }\n return dirty;\n}\n\nexport function prepareSceneMeshes<M extends MeshState>(meshes: M[],\n prepareGeometry: (mesh: M) => {geometry: Geometry; displacementScale: number},\n boundsForGeometry = getBvhBounds, softwareBvhs = true, mergeAttributes = true) {\n const materialIndexMap = new Map<MaterialState, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometryBounds = new Map<Geometry, [Float64Array, Float64Array]>();\n const geometries: Geometry[] = [];\n const materials: M['materials'] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: M;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding<M>[] = [];\n\n\n const instances: TLASInstance[] = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareGeometry(mesh);\n let cachedBounds = geometryBounds.get(geometry);\n if (!cachedBounds) {\n const rawBounds = boundsForGeometry(geometry);\n cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];\n geometryBounds.set(geometry, cachedBounds);\n }\n // Instances share the scan, while retained updates keep independent arrays.\n const bvhBounds: [Float64Array, Float64Array] = [cachedBounds[0].slice(), cachedBounds[1].slice()];\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance: TLASInstance = {\n bounds,\n blasIndex: geoIdx!,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (mesh.instanceData == null && (\n !finiteValues(bounds.min) ||\n !finiteValues(bounds.max) ||\n !finiteValues(mesh.transform)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeAttributes ? mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions) : geometryLayout(geometries);\n if (!mergeAttributes) {\n let vertexOffset = 0, indexOffset = 0;\n geometries.forEach((g, i) => {\n geometryRegions.set(g, {vertexOffset, indexOffset, materialIndices: globalMaterialIndicesMap[i]});\n vertexOffset += g.vertexCount; indexOffset += g.indexArray.length;\n });\n }\n\n return {\n geometry,\n mergedAttributes: mergeAttributes,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indexArray.length }];\n })),\n instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances) as MeshInstances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: softwareBvhs ? geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indexArray.length / 3\n })) : []\n };\n}\n\n// Feature descriptor only: direct WebGPU packing retains the original geometries.\nfunction geometryLayout(geometries: Geometry[]) {\n const empty = new Float32Array(0);\n return new Geometry({position: new Attribute(empty, 3), normal: new Attribute(empty, 3),\n indices: new Attribute(new Uint32Array(0), 1),\n tangent: geometries.some(g => g.tangent) ? new Attribute(empty, 4) : undefined});\n}\n\nexport function mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>,\n webgl = false\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indexArray.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n // The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute\n // selection; instanced preparation uses XYZW tangents and independent channels.\n const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;\n const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);\n const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);\n const tangentSize = webgl ? 3 : 4;\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (mergedGeometry.color && geometry.color) {\n mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);\n }\n if (mergedGeometry.tangent && geometry.tangent) {\n const source = geometry.tangent;\n if (webgl) {\n mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);\n } else for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);\n\n const meshIndices = geometry.indexArray;\n for (let i = 0; i < attributeLength(meshIndices); i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);\n }\n currentVertex += vertexCount;\n currentIndex += attributeLength(meshIndices);\n });\n\n return mergedGeometry;\n}\n\nexport function computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = attributeValue(indices, f++);\n i2 = attributeValue(indices, f++);\n i3 = attributeValue(indices, f++);\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n\nfunction finiteValues(values: Float32Array | Float64Array | number[]): boolean {\n if (values instanceof Float32Array) return finiteStorage(values);\n if (values instanceof Float64Array) return finiteStorage(values);\n return finiteStorage(values);\n}\nfunction finiteStorage<T extends Float32Array | Float64Array | number[]>(values: T): boolean {\n const length = values.length;\n for (let i = 0; i < length; i++) if (!Number.isFinite(read(values, i))) return false;\n return true;\n}\n\nfunction makeBounds(): Box3 {\n return new Box3();\n}\n"]}
|
|
@@ -11,10 +11,10 @@ return textureLoad(${name}, pixel, level);
|
|
|
11
11
|
${samplers.map(sampler => /* wgsl */ `
|
|
12
12
|
fn sample_${name}_${sampler}(coord: vec2f) -> vec4f {
|
|
13
13
|
${scratch ? /* wgsl */ `
|
|
14
|
-
let
|
|
15
|
-
if (all(
|
|
14
|
+
let kS = textureDimensions(${name});
|
|
15
|
+
if (all(kS == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }
|
|
16
16
|
let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
|
|
17
|
-
return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(
|
|
17
|
+
return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(kS), 0.0);`
|
|
18
18
|
: `return textureSample(${name}, ${sampler}, coord);`}
|
|
19
19
|
}`).join('')}`).join('');
|
|
20
20
|
}
|
|
@@ -29,10 +29,10 @@ return texelFetch(${name}, pixel, level);
|
|
|
29
29
|
}
|
|
30
30
|
vec4 sample_${name}(vec2 coord) {
|
|
31
31
|
${scratch ? /* glsl */ `
|
|
32
|
-
ivec2
|
|
33
|
-
if (all(equal(
|
|
32
|
+
ivec2 kS = textureSize(${name}, 0);
|
|
33
|
+
if (all(equal(kS, ${name}Region()))) return texture(${name}, coord);
|
|
34
34
|
vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
|
|
35
|
-
return texture(${name}, pixel / vec2(
|
|
35
|
+
return texture(${name}, pixel / vec2(kS));`
|
|
36
36
|
: `return texture(${name}, coord);`}
|
|
37
37
|
}`).join('');
|
|
38
38
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous wavelength sampling shared by camera paths and caustic photons.
|
|
3
|
+
*
|
|
4
|
+
* CIE 1931 matching functions use the multi-lobe fit from Wyman, Sloan and
|
|
5
|
+
* Shirley, "Simple Analytic Approximations to the CIE XYZ Color Matching
|
|
6
|
+
* Functions", JCGT 2(2), 2013. Only the published formula and coefficients are
|
|
7
|
+
* used. Out-of-gamut negatives clamp to zero, and each channel is normalized so
|
|
8
|
+
* that a uniform wavelength keeps white light white.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SPECTRUM_WAVELENGTH_MIN = 400;
|
|
11
|
+
export declare const SPECTRUM_WAVELENGTH_RANGE = 300;
|
|
12
|
+
export declare function spectrumRgb(wavelength: number): number[];
|
|
13
|
+
export declare const SPECTRUM_PHOTON_DISTRIBUTION = 3;
|
|
14
|
+
/** Maps a unit random number to a wavelength and its probability density. */
|
|
15
|
+
export declare function spectrumSample(distribution: number, u: number): {
|
|
16
|
+
wavelength: number;
|
|
17
|
+
pdf: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function spectrumIorWavelength(wavelength: number): number;
|
|
20
|
+
export declare const spectrumWgsl: string;
|
|
21
|
+
export declare const spectrumGlsl: string;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous wavelength sampling shared by camera paths and caustic photons.
|
|
3
|
+
*
|
|
4
|
+
* CIE 1931 matching functions use the multi-lobe fit from Wyman, Sloan and
|
|
5
|
+
* Shirley, "Simple Analytic Approximations to the CIE XYZ Color Matching
|
|
6
|
+
* Functions", JCGT 2(2), 2013. Only the published formula and coefficients are
|
|
7
|
+
* used. Out-of-gamut negatives clamp to zero, and each channel is normalized so
|
|
8
|
+
* that a uniform wavelength keeps white light white.
|
|
9
|
+
*/
|
|
10
|
+
export const SPECTRUM_WAVELENGTH_MIN = 400;
|
|
11
|
+
export const SPECTRUM_WAVELENGTH_RANGE = 300;
|
|
12
|
+
// Amplitude, mean, sigma below the mean and sigma above it.
|
|
13
|
+
const XYZ_LOBES = [
|
|
14
|
+
[[1.056, 599.8, 37.9, 31.0], [0.362, 442.0, 16.0, 26.7], [-0.065, 501.1, 20.4, 26.2]],
|
|
15
|
+
[[0.821, 568.8, 46.9, 40.5], [0.286, 530.9, 16.3, 31.1]],
|
|
16
|
+
[[1.217, 437.0, 11.8, 36.0], [0.681, 459.0, 26.0, 13.8]]
|
|
17
|
+
];
|
|
18
|
+
// Linear sRGB primaries, D65.
|
|
19
|
+
const XYZ_TO_RGB = [
|
|
20
|
+
[3.2406, -1.5372, -0.4986],
|
|
21
|
+
[-0.9689, 1.8758, 0.0415],
|
|
22
|
+
[0.0557, -0.204, 1.057]
|
|
23
|
+
];
|
|
24
|
+
function unnormalizedRgb(wavelength) {
|
|
25
|
+
const xyz = XYZ_LOBES.map((lobes) => {
|
|
26
|
+
let sum = 0;
|
|
27
|
+
for (const lobe of lobes) {
|
|
28
|
+
const t = (wavelength - lobe[1]) / (wavelength < lobe[1] ? lobe[2] : lobe[3]);
|
|
29
|
+
sum += lobe[0] * Math.exp(-0.5 * t * t);
|
|
30
|
+
}
|
|
31
|
+
return sum;
|
|
32
|
+
});
|
|
33
|
+
return XYZ_TO_RGB.map((row) => Math.max(0, row[0] * xyz[0] + row[1] * xyz[1] + row[2] * xyz[2]));
|
|
34
|
+
}
|
|
35
|
+
function channelScale() {
|
|
36
|
+
const steps = 3000;
|
|
37
|
+
const sum = [0, 0, 0];
|
|
38
|
+
for (let i = 0; i < steps; i++) {
|
|
39
|
+
const rgb = unnormalizedRgb(SPECTRUM_WAVELENGTH_MIN + (SPECTRUM_WAVELENGTH_RANGE * (i + 0.5)) / steps);
|
|
40
|
+
for (let c = 0; c < 3; c++)
|
|
41
|
+
sum[c] += rgb[c] / steps;
|
|
42
|
+
}
|
|
43
|
+
// Rounded so JavaScript and native builds generate identical shader text.
|
|
44
|
+
return sum.map((mean) => Number((1 / mean).toFixed(6)));
|
|
45
|
+
}
|
|
46
|
+
const SCALE = channelScale();
|
|
47
|
+
export function spectrumRgb(wavelength) {
|
|
48
|
+
return unnormalizedRgb(wavelength).map((value, c) => value * SCALE[c]);
|
|
49
|
+
}
|
|
50
|
+
// Inverse CDFs in 5 nm bins: one per RGB channel for camera paths, and r+g+b for
|
|
51
|
+
// photons. Narrow bins keep each sampled response close to the fit.
|
|
52
|
+
const SAMPLE_BINS = 60;
|
|
53
|
+
const SAMPLE_BIN_WIDTH = SPECTRUM_WAVELENGTH_RANGE / SAMPLE_BINS;
|
|
54
|
+
export const SPECTRUM_PHOTON_DISTRIBUTION = 3;
|
|
55
|
+
function sampleCdfs() {
|
|
56
|
+
const substeps = 20;
|
|
57
|
+
const cdfs = [];
|
|
58
|
+
for (let distribution = 0; distribution <= SPECTRUM_PHOTON_DISTRIBUTION; distribution++) {
|
|
59
|
+
const cdf = [0];
|
|
60
|
+
for (let bin = 0; bin < SAMPLE_BINS; bin++) {
|
|
61
|
+
let mass = 0;
|
|
62
|
+
for (let i = 0; i < substeps; i++) {
|
|
63
|
+
const rgb = spectrumRgb(SPECTRUM_WAVELENGTH_MIN + (bin + (i + 0.5) / substeps) * SAMPLE_BIN_WIDTH);
|
|
64
|
+
mass += distribution === SPECTRUM_PHOTON_DISTRIBUTION ? rgb[0] + rgb[1] + rgb[2] : rgb[distribution];
|
|
65
|
+
}
|
|
66
|
+
cdf.push(cdf[bin] + mass);
|
|
67
|
+
}
|
|
68
|
+
for (const value of cdf)
|
|
69
|
+
cdfs.push(Number((value / cdf[SAMPLE_BINS]).toFixed(7)));
|
|
70
|
+
}
|
|
71
|
+
return cdfs;
|
|
72
|
+
}
|
|
73
|
+
const SAMPLE_CDFS = sampleCdfs();
|
|
74
|
+
/** Maps a unit random number to a wavelength and its probability density. */
|
|
75
|
+
export function spectrumSample(distribution, u) {
|
|
76
|
+
const first = distribution * (SAMPLE_BINS + 1);
|
|
77
|
+
let low = 0;
|
|
78
|
+
let high = SAMPLE_BINS;
|
|
79
|
+
while (high - low > 1) {
|
|
80
|
+
const middle = (low + high) >> 1;
|
|
81
|
+
if (SAMPLE_CDFS[first + middle] <= u)
|
|
82
|
+
low = middle;
|
|
83
|
+
else
|
|
84
|
+
high = middle;
|
|
85
|
+
}
|
|
86
|
+
const mass = SAMPLE_CDFS[first + low + 1] - SAMPLE_CDFS[first + low];
|
|
87
|
+
return {
|
|
88
|
+
wavelength: SPECTRUM_WAVELENGTH_MIN + SAMPLE_BIN_WIDTH * (low + (u - SAMPLE_CDFS[first + low]) / mass),
|
|
89
|
+
pdf: mass / SAMPLE_BIN_WIDTH
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Cauchy IOR grows quickly at short wavelengths and strong dispersion scales turn
|
|
93
|
+
// violet light into total internal reflection. Below 500 nm the refracting
|
|
94
|
+
// wavelength eases toward 475 nm, while color still follows the sampled wavelength.
|
|
95
|
+
const IOR_KNEE = 500;
|
|
96
|
+
const IOR_KNEE_WIDTH = 25;
|
|
97
|
+
export function spectrumIorWavelength(wavelength) {
|
|
98
|
+
if (wavelength >= IOR_KNEE)
|
|
99
|
+
return wavelength;
|
|
100
|
+
return IOR_KNEE - IOR_KNEE_WIDTH * (1 - Math.exp((wavelength - IOR_KNEE) / IOR_KNEE_WIDTH));
|
|
101
|
+
}
|
|
102
|
+
const CDF_LITERALS = SAMPLE_CDFS.map((value) => value.toFixed(7)).join(',');
|
|
103
|
+
const lobeSum = (lobes) => lobes.map((lobe) => `${lobe[0]}f*spectrumLobe(wavelength,${lobe[1]}f,${lobe[2]}f,${lobe[3]}f)`).join('+');
|
|
104
|
+
export const spectrumWgsl = /* wgsl */ `
|
|
105
|
+
fn spectrumLobe(wavelength:f32,mean:f32,below:f32,above:f32)->f32 {
|
|
106
|
+
let t=(wavelength-mean)/select(above,below,wavelength<mean);
|
|
107
|
+
return exp(-0.5*t*t);
|
|
108
|
+
}
|
|
109
|
+
fn spectrumRgb(wavelength:f32)->vec3f {
|
|
110
|
+
let xyz=vec3f(${XYZ_LOBES.map(lobeSum).join(',')});
|
|
111
|
+
let rgb=mat3x3f(${[0, 1, 2].map((c) => XYZ_TO_RGB.map((row) => `${row[c]}f`).join(',')).join(',')})*xyz;
|
|
112
|
+
return max(rgb,vec3f(0.0))*vec3f(${SCALE.map((s) => `${s}f`).join(',')});
|
|
113
|
+
}
|
|
114
|
+
fn spectrumIorWavelength(wavelength:f32)->f32 {
|
|
115
|
+
if(wavelength>=${IOR_KNEE}.0) { return wavelength; }
|
|
116
|
+
return ${IOR_KNEE}.0-${IOR_KNEE_WIDTH}.0*(1.0-exp((wavelength-${IOR_KNEE}.0)/${IOR_KNEE_WIDTH}.0));
|
|
117
|
+
}
|
|
118
|
+
const SPECTRUM_CDF=array<f32,${(SAMPLE_BINS + 1) * 4}>(${CDF_LITERALS});
|
|
119
|
+
fn spectrumSample(distribution:u32,u:f32,pdf:ptr<function,f32>)->f32 {
|
|
120
|
+
let first=distribution*${SAMPLE_BINS + 1}u;
|
|
121
|
+
var low=0u;
|
|
122
|
+
var high=${SAMPLE_BINS}u;
|
|
123
|
+
while(high-low>1u) {
|
|
124
|
+
let middle=(low+high)/2u;
|
|
125
|
+
if(SPECTRUM_CDF[first+middle]<=u) { low=middle; } else { high=middle; }
|
|
126
|
+
}
|
|
127
|
+
let mass=SPECTRUM_CDF[first+low+1u]-SPECTRUM_CDF[first+low];
|
|
128
|
+
*pdf=mass/${SAMPLE_BIN_WIDTH}.0;
|
|
129
|
+
return ${SPECTRUM_WAVELENGTH_MIN}.0+${SAMPLE_BIN_WIDTH}.0*(f32(low)+(u-SPECTRUM_CDF[first+low])/mass);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
fn ce(channel:u32,u:f32)->f32 {
|
|
133
|
+
var pdf=0.0;
|
|
134
|
+
return spectrumIorWavelength(spectrumSample(channel,u,&pdf));
|
|
135
|
+
}
|
|
136
|
+
`;
|
|
137
|
+
export const spectrumGlsl = /* glsl */ `
|
|
138
|
+
const float SPECTRUM_CDF[${(SAMPLE_BINS + 1) * 4}]=float[${(SAMPLE_BINS + 1) * 4}](${CDF_LITERALS});
|
|
139
|
+
|
|
140
|
+
float ce(int channel,float u) {
|
|
141
|
+
int first=channel*${SAMPLE_BINS + 1};
|
|
142
|
+
int low=0;
|
|
143
|
+
int high=${SAMPLE_BINS};
|
|
144
|
+
while(high-low>1) {
|
|
145
|
+
int middle=(low+high)/2;
|
|
146
|
+
if(SPECTRUM_CDF[first+middle]<=u) { low=middle; } else { high=middle; }
|
|
147
|
+
}
|
|
148
|
+
float start=SPECTRUM_CDF[first+low];
|
|
149
|
+
float wavelength=${SPECTRUM_WAVELENGTH_MIN}.0+${SAMPLE_BIN_WIDTH}.0*(float(low)+(u-start)/(SPECTRUM_CDF[first+low+1]-start));
|
|
150
|
+
if(wavelength>=${IOR_KNEE}.0) { return wavelength; }
|
|
151
|
+
return ${IOR_KNEE}.0-${IOR_KNEE_WIDTH}.0*(1.0-exp((wavelength-${IOR_KNEE}.0)/${IOR_KNEE_WIDTH}.0));
|
|
152
|
+
}
|
|
153
|
+
`;
|
|
154
|
+
//# sourceMappingURL=spectrum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spectrum.js","sourceRoot":"","sources":["../../src/renderer/spectrum.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Continuous wavelength sampling shared by camera paths and caustic photons.\n *\n * CIE 1931 matching functions use the multi-lobe fit from Wyman, Sloan and\n * Shirley, \"Simple Analytic Approximations to the CIE XYZ Color Matching\n * Functions\", JCGT 2(2), 2013. Only the published formula and coefficients are\n * used. Out-of-gamut negatives clamp to zero, and each channel is normalized so\n * that a uniform wavelength keeps white light white.\n */\nexport const SPECTRUM_WAVELENGTH_MIN = 400;\nexport const SPECTRUM_WAVELENGTH_RANGE = 300;\n\n// Amplitude, mean, sigma below the mean and sigma above it.\nconst XYZ_LOBES: number[][][] = [\n [[1.056, 599.8, 37.9, 31.0], [0.362, 442.0, 16.0, 26.7], [-0.065, 501.1, 20.4, 26.2]],\n [[0.821, 568.8, 46.9, 40.5], [0.286, 530.9, 16.3, 31.1]],\n [[1.217, 437.0, 11.8, 36.0], [0.681, 459.0, 26.0, 13.8]]\n];\n// Linear sRGB primaries, D65.\nconst XYZ_TO_RGB: number[][] = [\n [3.2406, -1.5372, -0.4986],\n [-0.9689, 1.8758, 0.0415],\n [0.0557, -0.204, 1.057]\n];\n\nfunction unnormalizedRgb(wavelength: number): number[] {\n const xyz = XYZ_LOBES.map((lobes) => {\n let sum = 0;\n for (const lobe of lobes) {\n const t = (wavelength - lobe[1]) / (wavelength < lobe[1] ? lobe[2] : lobe[3]);\n sum += lobe[0] * Math.exp(-0.5 * t * t);\n }\n return sum;\n });\n return XYZ_TO_RGB.map((row) => Math.max(0, row[0] * xyz[0] + row[1] * xyz[1] + row[2] * xyz[2]));\n}\n\nfunction channelScale(): number[] {\n const steps = 3000;\n const sum = [0, 0, 0];\n for (let i = 0; i < steps; i++) {\n const rgb = unnormalizedRgb(SPECTRUM_WAVELENGTH_MIN + (SPECTRUM_WAVELENGTH_RANGE * (i + 0.5)) / steps);\n for (let c = 0; c < 3; c++) sum[c] += rgb[c] / steps;\n }\n // Rounded so JavaScript and native builds generate identical shader text.\n return sum.map((mean) => Number((1 / mean).toFixed(6)));\n}\nconst SCALE = channelScale();\n\nexport function spectrumRgb(wavelength: number): number[] {\n return unnormalizedRgb(wavelength).map((value, c) => value * SCALE[c]);\n}\n\n// Inverse CDFs in 5 nm bins: one per RGB channel for camera paths, and r+g+b for\n// photons. Narrow bins keep each sampled response close to the fit.\nconst SAMPLE_BINS = 60;\nconst SAMPLE_BIN_WIDTH = SPECTRUM_WAVELENGTH_RANGE / SAMPLE_BINS;\nexport const SPECTRUM_PHOTON_DISTRIBUTION = 3;\nfunction sampleCdfs(): number[] {\n const substeps = 20;\n const cdfs: number[] = [];\n for (let distribution = 0; distribution <= SPECTRUM_PHOTON_DISTRIBUTION; distribution++) {\n const cdf = [0];\n for (let bin = 0; bin < SAMPLE_BINS; bin++) {\n let mass = 0;\n for (let i = 0; i < substeps; i++) {\n const rgb = spectrumRgb(SPECTRUM_WAVELENGTH_MIN + (bin + (i + 0.5) / substeps) * SAMPLE_BIN_WIDTH);\n mass += distribution === SPECTRUM_PHOTON_DISTRIBUTION ? rgb[0] + rgb[1] + rgb[2] : rgb[distribution];\n }\n cdf.push(cdf[bin] + mass);\n }\n for (const value of cdf) cdfs.push(Number((value / cdf[SAMPLE_BINS]).toFixed(7)));\n }\n return cdfs;\n}\nconst SAMPLE_CDFS = sampleCdfs();\n\n/** Maps a unit random number to a wavelength and its probability density. */\nexport function spectrumSample(distribution: number, u: number) {\n const first = distribution * (SAMPLE_BINS + 1);\n let low = 0;\n let high = SAMPLE_BINS;\n while (high - low > 1) {\n const middle = (low + high) >> 1;\n if (SAMPLE_CDFS[first + middle] <= u) low = middle;\n else high = middle;\n }\n const mass = SAMPLE_CDFS[first + low + 1] - SAMPLE_CDFS[first + low];\n return {\n wavelength: SPECTRUM_WAVELENGTH_MIN + SAMPLE_BIN_WIDTH * (low + (u - SAMPLE_CDFS[first + low]) / mass),\n pdf: mass / SAMPLE_BIN_WIDTH\n };\n}\n\n// Cauchy IOR grows quickly at short wavelengths and strong dispersion scales turn\n// violet light into total internal reflection. Below 500 nm the refracting\n// wavelength eases toward 475 nm, while color still follows the sampled wavelength.\nconst IOR_KNEE = 500;\nconst IOR_KNEE_WIDTH = 25;\n\nexport function spectrumIorWavelength(wavelength: number) {\n if (wavelength >= IOR_KNEE) return wavelength;\n return IOR_KNEE - IOR_KNEE_WIDTH * (1 - Math.exp((wavelength - IOR_KNEE) / IOR_KNEE_WIDTH));\n}\n\nconst CDF_LITERALS = SAMPLE_CDFS.map((value) => value.toFixed(7)).join(',');\nconst lobeSum = (lobes: number[][]) =>\n lobes.map((lobe) => `${lobe[0]}f*spectrumLobe(wavelength,${lobe[1]}f,${lobe[2]}f,${lobe[3]}f)`).join('+');\n\nexport const spectrumWgsl = /* wgsl */ `\nfn spectrumLobe(wavelength:f32,mean:f32,below:f32,above:f32)->f32 {\n let t=(wavelength-mean)/select(above,below,wavelength<mean);\n return exp(-0.5*t*t);\n}\nfn spectrumRgb(wavelength:f32)->vec3f {\n let xyz=vec3f(${XYZ_LOBES.map(lobeSum).join(',')});\n let rgb=mat3x3f(${[0, 1, 2].map((c) => XYZ_TO_RGB.map((row) => `${row[c]}f`).join(',')).join(',')})*xyz;\n return max(rgb,vec3f(0.0))*vec3f(${SCALE.map((s) => `${s}f`).join(',')});\n}\nfn spectrumIorWavelength(wavelength:f32)->f32 {\n if(wavelength>=${IOR_KNEE}.0) { return wavelength; }\n return ${IOR_KNEE}.0-${IOR_KNEE_WIDTH}.0*(1.0-exp((wavelength-${IOR_KNEE}.0)/${IOR_KNEE_WIDTH}.0));\n}\nconst SPECTRUM_CDF=array<f32,${(SAMPLE_BINS + 1) * 4}>(${CDF_LITERALS});\nfn spectrumSample(distribution:u32,u:f32,pdf:ptr<function,f32>)->f32 {\n let first=distribution*${SAMPLE_BINS + 1}u;\n var low=0u;\n var high=${SAMPLE_BINS}u;\n while(high-low>1u) {\n let middle=(low+high)/2u;\n if(SPECTRUM_CDF[first+middle]<=u) { low=middle; } else { high=middle; }\n }\n let mass=SPECTRUM_CDF[first+low+1u]-SPECTRUM_CDF[first+low];\n *pdf=mass/${SAMPLE_BIN_WIDTH}.0;\n return ${SPECTRUM_WAVELENGTH_MIN}.0+${SAMPLE_BIN_WIDTH}.0*(f32(low)+(u-SPECTRUM_CDF[first+low])/mass);\n}\n// Refracting wavelength of a camera path that carries one RGB channel.\nfn spectrumCameraWavelength(channel:u32,u:f32)->f32 {\n var pdf=0.0;\n return spectrumIorWavelength(spectrumSample(channel,u,&pdf));\n}\n`;\n\nexport const spectrumGlsl = /* glsl */ `\nconst float SPECTRUM_CDF[${(SAMPLE_BINS + 1) * 4}]=float[${(SAMPLE_BINS + 1) * 4}](${CDF_LITERALS});\n// Refracting wavelength of a camera path that carries one RGB channel.\nfloat spectrumCameraWavelength(int channel,float u) {\n int first=channel*${SAMPLE_BINS + 1};\n int low=0;\n int high=${SAMPLE_BINS};\n while(high-low>1) {\n int middle=(low+high)/2;\n if(SPECTRUM_CDF[first+middle]<=u) { low=middle; } else { high=middle; }\n }\n float start=SPECTRUM_CDF[first+low];\n float wavelength=${SPECTRUM_WAVELENGTH_MIN}.0+${SAMPLE_BIN_WIDTH}.0*(float(low)+(u-start)/(SPECTRUM_CDF[first+low+1]-start));\n if(wavelength>=${IOR_KNEE}.0) { return wavelength; }\n return ${IOR_KNEE}.0-${IOR_KNEE_WIDTH}.0*(1.0-exp((wavelength-${IOR_KNEE}.0)/${IOR_KNEE_WIDTH}.0));\n}\n`;\n"]}
|