@meimu/mutracer 0.1.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +36 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.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/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- 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 +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +6 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- 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/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- 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 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- 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 +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- 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 +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- 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 +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- 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/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- 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/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
- 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 +152 -144
- 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 +269 -245
- 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 +27 -14
- 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 +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- 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.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- 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.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +36 -3
- package/lib/settings/render.js +4 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +20 -7
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bvhAccel.js","sourceRoot":"","sources":["../../src/renderer/bvhAccel.ts"],"names":[],"mappings":"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","sourcesContent":["import { readMeshInstance, type MeshInstances } from './meshInstances.js';\n// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances\n// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written\n// directly in the BVH2 layout read by the traversal shaders.\n\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { Mat4Array } from '../math.js';\nimport { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';\n\nconst vec3Min = vec3.min;\nconst vec3Max = vec3.max;\n\nexport const INSTANCE_VEC4_STRIDE = 10;\nexport const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;\n\nexport type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nexport interface FlattendBVH {\n /** CPU builder that produced the GPU traversal data. */\n builder?: 'builtin' | 'tinybvh';\n buildSurfaceArea?: number;\n maxDepth: number;\n /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */\n maxLeafPrimitives?: number;\n buffer: ArrayBuffer;\n /** Precomputed data without a layout field uses the legacy BVH2 layout. */\n layout?: BvhLayout;\n\n instancesBuffer?: ArrayBuffer;\n}\n\nconst BLAS_LAYOUT_SHIFT = 30;\nconst BLAS_OFFSET_MASK = 0x3fffffff;\nconst blasLayoutCodes: Record<BvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\n\nfunction encodeBlasOffset(offset: number, layout: BvhLayout) {\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {\n throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);\n }\n return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;\n}\n\nexport class Box3 {\n min: vec3.Vec3Array;\n max: vec3.Vec3Array;\n\n constructor() {\n this.min = [Infinity, Infinity, Infinity];\n this.max = [-Infinity, -Infinity, -Infinity];\n }\n}\n\nfunction unionBounds(bounds: Box3, a: Box3, b: Box3) {\n vec3Min(bounds.min, a.min, b.min);\n vec3Max(bounds.max, a.max, b.max);\n return bounds;\n}\n\nexport interface TLASInstance {\n blasIndex: number;\n bounds: Box3;\n transform: Mat4Array;\n materialsIndices: number[];\n displacementScale?: number;\n color?: [number, number, number];\n}\n\nexport interface BLASInstance {\n bvh: FlattendBVH;\n trainglesCount: number;\n verticesCount: number;\n}\n\n// Keep a bounded specialization range for unusually deep hierarchies while\n// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).\n// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.\nexport const MAX_TRAVERSAL_STACK_SIZE = 64;\n\nexport interface TraversalStackSizes {\n tlas: number;\n blas: number;\n}\n\n/**\n * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.\n * A TLAS leaf is consumed in place, so its instance fan-out no longer needs\n * pending stack entries. TinyBVH converted layouts store their exact stack\n * requirement in maxDepth; BVH2 stores its tree depth.\n */\nexport function getTraversalStackSizes(\n tlas: FlattendBVH,\n blases: readonly BLASInstance[]\n): TraversalStackSizes {\n return {\n tlas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n Math.max(1, tlas.maxDepth)\n ),\n blas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n blases.reduce(\n (stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth),\n 1\n )\n )\n };\n}\n\nexport function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer {\n const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));\n const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < blases.length; i++) {\n result.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return result.buffer;\n}\n\nfunction packH(minH: number, maxH: number): number {\n const roundedMinH = Math.min(Math.floor(minH * 255), 255);\n const roundedMaxH =\n Math.abs(maxH - minH) < 1e-6\n ? roundedMinH\n : Math.min(Math.ceil(maxH * 255), 255);\n return (roundedMinH << 8) + roundedMaxH;\n}\n\n/** Writes min and max of a triangle, or of its displacement prism, to out. */\nfunction triangleBounds(\n positions: ArrayLike<number>,\n stride: number,\n normals: ArrayLike<number> | undefined,\n normalStride: number,\n i0: number,\n i1: number,\n i2: number,\n minHeight: number,\n maxHeight: number,\n out: Float32Array,\n o: number\n) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let corner = 0; corner < 3; corner++) {\n const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n const p = vertex * stride;\n const x = positions[p], y = positions[p + 1], z = positions[p + 2];\n if (normals) {\n const n = vertex * normalStride;\n let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];\n const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (length > 0) {\n nx /= length; ny /= length; nz /= length;\n }\n for (let side = 0; side < 2; side++) {\n const h = side === 0 ? minHeight : maxHeight;\n const px = x + nx * h, py = y + ny * h, pz = z + nz * h;\n minX = Math.min(minX, px); minY = Math.min(minY, py); minZ = Math.min(minZ, pz);\n maxX = Math.max(maxX, px); maxY = Math.max(maxY, py); maxZ = Math.max(maxZ, pz);\n }\n } else {\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n out[o] = minX; out[o + 1] = minY; out[o + 2] = minZ;\n out[o + 3] = maxX; out[o + 4] = maxY; out[o + 5] = maxZ;\n return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&\n isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);\n}\n\nfunction emptyBvh(isTLAS: boolean): FlattendBVH {\n return {\n builder: 'builtin',\n buildSurfaceArea: isTLAS ? undefined : 0,\n maxDepth: 0,\n maxLeafPrimitives: 0,\n buffer: new ArrayBuffer(0),\n layout: 'bvh2',\n instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined\n };\n}\n\n/** BLAS without triangles. */\nexport function emptyBLAS() {\n return emptyBvh(false);\n}\n\n/**\n * Builds a BVH2 BLAS over the geometry's triangles. Triangles with\n * non-finite bounds are skipped. With per-triangle displacement ranges\n * (min, max pairs scaled by displacementScale), leaves bound the\n * displacement prisms along the vertex normals and store the packed ranges.\n */\nexport function buildBLAS(\n geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array\n): FlattendBVH {\n const position = geometry.position;\n const indices = geometry.indices?.array;\n if (!position || !indices || !Attribute.getCount(position)) {\n return emptyBvh(false);\n }\n const positions = position.array;\n const stride = position.itemSize;\n const normal = trianglesDisplacement ? geometry.normal : undefined;\n const normals = normal?.array;\n const normalStride = normal?.itemSize ?? 0;\n const triangleCount = Math.floor(indices.length / 3);\n const aabbs = new Float32Array(triangleCount * 6);\n const triangles = new Uint32Array(triangleCount);\n let count = 0;\n for (let t = 0; t < triangleCount; t++) {\n let minHeight = 0, maxHeight = 0;\n if (normals) {\n minHeight = trianglesDisplacement![t * 2] * displacementScale;\n maxHeight = trianglesDisplacement![t * 2 + 1] * displacementScale;\n if (isNaN(minHeight) || isNaN(maxHeight)) {\n minHeight = 0;\n maxHeight = displacementScale;\n }\n }\n if (triangleBounds(\n positions, stride, normals, normalStride,\n indices[t * 3], indices[t * 3 + 1], indices[t * 3 + 2],\n minHeight, maxHeight, aabbs, count * 6\n )) {\n triangles[count++] = t;\n }\n }\n if (!count) return emptyBvh(false);\n\n const bvh = buildBinnedSahBvh(aabbs, count);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n let buildSurfaceArea = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];\n buildSurfaceArea += 2 * (x * z + x * y + z * y);\n const prims = primCount[node];\n if (!prims) {\n // Pointer to the second child.\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n // Negative signals to the shader that this node is a leaf.\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const t = triangles[primIndices[leftFirst[node] + i]];\n const e = o + 8 + i * 4;\n ints[e] = indices[t * 3];\n ints[e + 1] = indices[t * 3 + 1];\n ints[e + 2] = indices[t * 3 + 2];\n // Pack minH, maxH to one channel.\n ints[e + 3] = trianglesDisplacement\n ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])\n : 0;\n }\n }\n\n return {\n builder: 'builtin',\n buildSurfaceArea,\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2'\n };\n}\n\ninterface BlasPlacement {\n blasOffsets: number[];\n vertexOffsets: number[];\n layouts: BvhLayout[];\n}\n\nfunction getBlasPlacement(blases: BLASInstance[]): BlasPlacement {\n let blasOffset = 0;\n let vertexOffset = 0;\n const placement: BlasPlacement = { blasOffsets: [], vertexOffsets: [], layouts: [] };\n blases.forEach((blas) => {\n placement.blasOffsets.push(blasOffset);\n placement.vertexOffsets.push(vertexOffset);\n placement.layouts.push(blas.bvh.layout ?? 'bvh2');\n blasOffset += blas.bvh.buffer.byteLength / 16;\n vertexOffset += blas.verticesCount;\n });\n return placement;\n}\n\n/** Writes the instance's world bounds, padded by its displacement, to out. */\nfunction instanceBounds(instance: TLASInstance, out: Float32Array, o: number) {\n const { min, max } = instance.bounds;\n let padX = 0, padY = 0, padZ = 0;\n const displacementScale = instance.displacementScale;\n if (displacementScale) {\n const m = instance.transform;\n padX = Math.max(0, displacementScale * Math.hypot(m[0], m[1], m[2]));\n padY = Math.max(0, displacementScale * Math.hypot(m[4], m[5], m[6]));\n padZ = Math.max(0, displacementScale * Math.hypot(m[8], m[9], m[10]));\n }\n out[o] = min[0] - padX; out[o + 1] = min[1] - padY; out[o + 2] = min[2] - padZ;\n out[o + 3] = max[0] + padX; out[o + 4] = max[1] + padY; out[o + 5] = max[2] + padZ;\n}\n\nfunction writeInstanceRecord(\n instanceInts: Int32Array,\n instanceFloats: Float32Array,\n targetIndex: number,\n instance: TLASInstance,\n placement: BlasPlacement\n) {\n const offset = targetIndex * INSTANCE_WORD_STRIDE;\n instanceInts[offset] = encodeBlasOffset(\n placement.blasOffsets[instance.blasIndex],\n placement.layouts[instance.blasIndex]\n );\n instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];\n instanceInts[offset + 2] = instance.materialsIndices[0] || 0;\n instanceFloats[offset + 3] = instance.displacementScale || 0;\n instanceFloats.set(instance.color ?? [1, 1, 1], offset + 36);\n instanceFloats[offset + 39] = 0;\n const inverse = mat4.invert(mat4.create(), instance.transform);\n for (let i = 0; i < 16; i++) {\n instanceFloats[offset + 4 + i] = inverse[i];\n instanceFloats[offset + 20 + i] = instance.transform[i];\n }\n}\n\n/**\n * Builds a BVH2 TLAS over the instances. Leaves store\n * (instance record, BLAS offset, source instance index, 0); instance records\n * are written in leaf order to instancesBuffer.\n */\nexport function buildTLAS(\n instances: MeshInstances,\n blases: BLASInstance[]\n): FlattendBVH {\n if (!instances.length) return emptyBvh(true);\n const placement = getBlasPlacement(blases);\n const aabbs = new Float32Array(instances.length * 6);\n for (let i = 0; i < instances.length; i++) {\n instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);\n }\n\n const bvh = buildBinnedSahBvh(aabbs, instances.length);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n const instancesBuffer = new ArrayBuffer(instances.length * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer);\n const instanceFloats = new Float32Array(instancesBuffer);\n let target = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const prims = primCount[node];\n if (!prims) {\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const source = primIndices[leftFirst[node] + i];\n const instance = readMeshInstance(instances, source);\n const e = o + 8 + i * 4;\n ints[e] = target;\n ints[e + 1] = placement.blasOffsets[instance.blasIndex];\n // Keep the source instance index in the otherwise-unused z lane so\n // the TLAS can be refitted without rebuilding its topology.\n ints[e + 2] = source;\n writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);\n target++;\n }\n }\n\n return {\n builder: 'builtin',\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2',\n instancesBuffer\n };\n}\n\nexport interface TLASRefitRange {\n offset: number;\n size: number;\n}\n\nexport interface TLASRefitResult {\n tlasRanges: TLASRefitRange[];\n instanceRanges: TLASRefitRange[];\n}\n\ninterface TLASRefitMetadata {\n parent: Map<number, number>;\n depth: Map<number, number>;\n leavesBySource: Map<number, Set<number>>;\n instancesByLeaf: Map<number, { source: number; target: number }[]>;\n}\n\nconst tlasRefitMetadata = new WeakMap<FlattendBVH, TLASRefitMetadata>();\n\nfunction getTLASRefitMetadata(flattened: FlattendBVH, ints: Int32Array) {\n const cached = tlasRefitMetadata.get(flattened);\n if (cached) return cached;\n const metadata: TLASRefitMetadata = {\n parent: new Map(),\n depth: new Map(),\n leavesBySource: new Map(),\n instancesByLeaf: new Map()\n };\n const visit = (index: number, parent: number | undefined, depth: number) => {\n metadata.depth.set(index, depth);\n if (parent != null) metadata.parent.set(index, parent);\n const base = index * 4;\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n visit(index + 2, index, depth + 1);\n visit(primitiveCountOrChild, index, depth + 1);\n return;\n }\n const entries: { source: number; target: number }[] = [];\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const target = ints[primitiveOffset];\n const source = ints[primitiveOffset + 2];\n entries.push({ source, target });\n const leaves = metadata.leavesBySource.get(source) ?? new Set<number>();\n leaves.add(index);\n metadata.leavesBySource.set(source, leaves);\n }\n metadata.instancesByLeaf.set(index, entries);\n };\n visit(0, undefined, 0);\n tlasRefitMetadata.set(flattened, metadata);\n return metadata;\n}\n\nexport function mergeRefitRanges(ranges: TLASRefitRange[]) {\n const sorted = ranges\n .filter(({ size }) => size > 0)\n .sort((left, right) => left.offset - right.offset);\n const merged: TLASRefitRange[] = [];\n for (const range of sorted) {\n const previous = merged[merged.length - 1];\n if (previous && range.offset <= previous.offset + previous.size) {\n previous.size = Math.max(\n previous.size,\n range.offset + range.size - previous.offset\n );\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nexport function refitTLAS(\n flattened: FlattendBVH,\n instances: MeshInstances,\n blases: BLASInstance[],\n dirtySourceIndices?: ReadonlySet<number>\n): TLASRefitResult {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {\n return { tlasRanges: [], instanceRanges: [] };\n }\n const floats = new Float32Array(flattened.buffer);\n const ints = new Int32Array(flattened.buffer);\n const instanceFloats = new Float32Array(flattened.instancesBuffer);\n const instanceInts = new Int32Array(flattened.instancesBuffer);\n\n const placement = getBlasPlacement(blases);\n const scratch = new Float32Array(6);\n\n function writeInstance(targetIndex: number, sourceIndex: number) {\n writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);\n }\n\n function addInstanceBounds(bounds: Box3, instance: TLASInstance) {\n instanceBounds(instance, scratch, 0);\n bounds.min[0] = Math.min(bounds.min[0], scratch[0]);\n bounds.min[1] = Math.min(bounds.min[1], scratch[1]);\n bounds.min[2] = Math.min(bounds.min[2], scratch[2]);\n bounds.max[0] = Math.max(bounds.max[0], scratch[3]);\n bounds.max[1] = Math.max(bounds.max[1], scratch[4]);\n bounds.max[2] = Math.max(bounds.max[2], scratch[5]);\n }\n\n function writeNodeBounds(index: number, bounds: Box3) {\n const base = index * 4;\n floats[base] = bounds.min[0];\n floats[base + 1] = bounds.min[1];\n floats[base + 2] = bounds.min[2];\n floats[base + 4] = bounds.max[0];\n floats[base + 5] = bounds.max[1];\n floats[base + 6] = bounds.max[2];\n }\n\n function readNodeBounds(index: number) {\n const base = index * 4;\n const bounds = new Box3();\n vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);\n vec3.set(\n bounds.max,\n floats[base + 4],\n floats[base + 5],\n floats[base + 6]\n );\n return bounds;\n }\n\n function refitNode(index: number): Box3 {\n const base = index * 4;\n const bounds = new Box3();\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n const left = refitNode(index + 2);\n const right = refitNode(primitiveCountOrChild);\n unionBounds(bounds, left, right);\n } else {\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const targetInstance = ints[primitiveOffset];\n const sourceInstance = ints[primitiveOffset + 2];\n const instance = readMeshInstance(instances, sourceInstance);\n if (!instance) continue;\n addInstanceBounds(bounds, instance);\n writeInstance(targetInstance, sourceInstance);\n }\n }\n writeNodeBounds(index, bounds);\n return bounds;\n }\n\n if (!dirtySourceIndices) {\n refitNode(0);\n return {\n tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],\n instanceRanges: [\n { offset: 0, size: flattened.instancesBuffer.byteLength }\n ]\n };\n }\n\n const metadata = getTLASRefitMetadata(flattened, ints);\n const dirtyLeaves = new Set<number>();\n const instanceRanges: TLASRefitRange[] = [];\n for (const source of dirtySourceIndices) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n leaves.forEach((leaf) => dirtyLeaves.add(leaf));\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n writeInstance(entry.target, source);\n instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });\n }\n }\n }\n\n const dirtyNodes = new Set<number>();\n for (const leaf of dirtyLeaves) {\n const bounds = new Box3();\n for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {\n const instance = readMeshInstance(instances, source);\n if (instance) addInstanceBounds(bounds, instance);\n }\n writeNodeBounds(leaf, bounds);\n dirtyNodes.add(leaf);\n let parent = metadata.parent.get(leaf);\n while (parent != null) {\n dirtyNodes.add(parent);\n parent = metadata.parent.get(parent);\n }\n }\n\n const internalNodes = [...dirtyNodes]\n .filter((index) => ints[index * 4 + 3] >= 0)\n .sort(\n (left, right) =>\n (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0)\n );\n for (const index of internalNodes) {\n const right = ints[index * 4 + 3];\n const bounds = new Box3();\n unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));\n writeNodeBounds(index, bounds);\n }\n\n return {\n tlasRanges: mergeRefitRanges(\n [...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))\n ),\n instanceRanges: mergeRefitRanges(instanceRanges)\n };\n}\n\n/** Dynamic BLASes rebuild when their total node surface area doubles. */\nexport const DYNAMIC_BLAS_REBUILD_RATIO = 2;\n\ninterface BlasRefitData {\n /** Per leaf (vec4 index): offset of its vertex list in vertices. */\n offsets: Int32Array;\n /** Per leaf: unique vertex count followed by the vertices. */\n vertices: Uint32Array;\n /** Node indices (vec4 units) with descendants before their ancestors. */\n postorder: Int32Array;\n}\n\n// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle\n// corners once so deformation refits read each leaf's vertex only once.\nconst blasRefitData = new WeakMap<ArrayBuffer, BlasRefitData>();\n\nfunction getBlasRefitData(buffer: ArrayBuffer): BlasRefitData {\n const cached = blasRefitData.get(buffer);\n if (cached) return cached;\n const ints = new Int32Array(buffer);\n const offsets = new Int32Array(ints.length / 4);\n const vertices: number[] = [];\n const preorder: number[] = [];\n const stack = [0];\n while (stack.length) {\n const index = stack.pop()!;\n preorder.push(index);\n const base = index * 4;\n const child = ints[base + 3];\n if (child >= 0) {\n stack.push(child, index + 2);\n continue;\n }\n offsets[index] = vertices.length;\n const countSlot = vertices.length;\n vertices.push(0);\n for (let i = 0; i < -child; i++) {\n for (let j = 0; j < 3; j++) {\n const vertex = ints[base + 8 + i * 4 + j];\n let seen = false;\n for (let k = countSlot + 1; k < vertices.length; k++) {\n if (vertices[k] === vertex) { seen = true; break; }\n }\n if (!seen) vertices.push(vertex);\n }\n }\n vertices[countSlot] = vertices.length - countSlot - 1;\n }\n const data = {\n offsets,\n vertices: new Uint32Array(vertices),\n postorder: new Int32Array(preorder.reverse())\n };\n blasRefitData.set(buffer, data);\n return data;\n}\n\n/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */\nexport function refitBLAS(\n flattened: FlattendBVH,\n geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>\n) {\n if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {\n return false;\n }\n const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);\n const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n if (flattened.buildSurfaceArea == null) {\n let area = 0;\n for (const index of postorder) {\n const b = index * 4;\n const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];\n area += 2 * (x * z + x * y + z * y);\n }\n flattened.buildSurfaceArea = area;\n }\n let area = 0;\n for (let node = 0; node < postorder.length; node++) {\n const index = postorder[node], base = index * 4, child = ints[base + 3];\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n if (child >= 0) {\n const left = base + 8, right = child * 4;\n minX = Math.min(floats[left], floats[right]); minY = Math.min(floats[left + 1], floats[right + 1]); minZ = Math.min(floats[left + 2], floats[right + 2]);\n maxX = Math.max(floats[left + 4], floats[right + 4]); maxY = Math.max(floats[left + 5], floats[right + 5]); maxZ = Math.max(floats[left + 6], floats[right + 6]);\n } else {\n const start = offsets[index], end = start + 1 + vertices[start];\n for (let i = start + 1; i < end; i++) {\n const offset = vertices[i] * stride;\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!isFinite(x) || !isFinite(y) || !isFinite(z)) continue;\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;\n area += 2 * (x * z + x * y + z * y);\n floats[base] = minX; floats[base + 1] = minY; floats[base + 2] = minZ;\n floats[base + 4] = maxX; floats[base + 5] = maxY; floats[base + 6] = maxZ;\n }\n return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);\n}\n\n/** Writes only instance colors; TLAS topology and bounds remain untouched. */\nexport function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[] {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size) return [];\n const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));\n const floats = new Float32Array(flattened.instancesBuffer);\n const ranges: TLASRefitRange[] = [];\n for (const source of dirty) for (const leaf of metadata.leavesBySource.get(source) ?? []) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n const offset = entry.target * INSTANCE_WORD_STRIDE + 36;\n floats.set(readMeshInstance(instances, source).color ?? [1, 1, 1], offset);\n ranges.push({offset: offset * 4, size: 16});\n }\n }\n return mergeRefitRanges(ranges);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bvhAccel.js","sourceRoot":"","sources":["../../src/renderer/bvhAccel.ts"],"names":[],"mappings":"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","sourcesContent":["import { readMeshInstance, meshInstancesLength, type MeshInstances } from './packedMeshInstances.js';\n// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances\n// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written\n// directly in the BVH2 layout read by the traversal shaders.\n\nimport Geometry from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';\n\nimport { read, write } from '../math/access.js';\nimport { attributeLength, attributeValue, indexStorage } from '../scene/attributeData.js';\nimport { Box3 } from './Box3.js';\nimport {quantizeDisplacementRange} from './displacementRange.js';\nexport { Box3 } from './Box3.js';\n\nexport const INSTANCE_VEC4_STRIDE = 10;\nexport const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;\n\nexport type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nexport interface FlattendBVH {\n /** CPU builder that produced the GPU traversal data. */\n builder?: 'builtin' | 'tinybvh';\n buildSurfaceArea?: number;\n maxDepth: number;\n /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */\n maxLeafPrimitives?: number;\n buffer: ArrayBuffer;\n /** Source triangle IDs, (record, source triangle) pairs. */\n triangleIds?: Uint32Array;\n /** Precomputed data without a layout field uses the legacy BVH2 layout. */\n layout?: BvhLayout;\n\n instancesBuffer?: ArrayBuffer;\n}\n\nconst BLAS_LAYOUT_SHIFT = 30;\nconst BLAS_OFFSET_MASK = 0x3fffffff;\nconst blasLayoutCodes: Record<BvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\n\nfunction encodeBlasOffset(offset: number, layout: BvhLayout) {\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {\n throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);\n }\n return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;\n}\n\nfunction unionBounds(bounds: Box3, a: Box3, b: Box3) {\n vec3.min(bounds.min, a.min, b.min);\n vec3.max(bounds.max, a.max, b.max);\n return bounds;\n}\n\nexport interface TLASInstance {\n blasIndex: number;\n bounds: Box3;\n transform: Float64Array;\n materialsIndices: number[];\n displacementScale?: number;\n color?: [number, number, number];\n}\n\nexport interface BLASInstance {\n bvh: FlattendBVH;\n trainglesCount: number;\n verticesCount: number;\n}\n\n// Keep a bounded specialization range for unusually deep hierarchies while\n// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).\n// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.\nexport const MAX_TRAVERSAL_STACK_SIZE = 64;\n\nexport interface TraversalStackSizes {\n tlas: number;\n blas: number;\n}\n\n/**\n * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.\n * A TLAS leaf is consumed in place, so its instance fan-out no longer needs\n * pending stack entries. TinyBVH converted layouts store their exact stack\n * requirement in maxDepth; BVH2 stores its tree depth.\n */\nexport function getTraversalStackSizes(\n tlas: FlattendBVH,\n blases: readonly BLASInstance[]\n): TraversalStackSizes {\n return {\n tlas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n Math.max(1, tlas.maxDepth)\n ),\n blas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n blases.reduce(\n (stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth),\n 1\n )\n )\n };\n}\n\nexport function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer {\n const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));\n const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < blases.length; i++) {\n result.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return result.buffer;\n}\n\nfunction packH(minH: number, maxH: number): number {\n const roundedMinH = Math.min(Math.floor(minH * 255), 255);\n const roundedMaxH =\n Math.abs(maxH - minH) < 1e-6\n ? roundedMinH\n : Math.min(Math.ceil(maxH * 255), 255);\n return (roundedMinH << 8) + roundedMaxH;\n}\n\n/** Writes min and max of a triangle, or of its displacement prism, to out. */\nfunction triangleBounds(\n positions: Float32Array,\n stride: number,\n normals: Float32Array | undefined,\n normalStride: number,\n i0: number,\n i1: number,\n i2: number,\n minHeight: number,\n maxHeight: number,\n out: Float32Array,\n o: number\n) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let corner = 0; corner < 3; corner++) {\n const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n const p = vertex * stride;\n const x = positions[p], y = positions[p + 1], z = positions[p + 2];\n if (normals) {\n const n = vertex * normalStride;\n let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];\n const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (length > 0) {\n nx /= length; ny /= length; nz /= length;\n }\n for (let side = 0; side < 2; side++) {\n const h = side === 0 ? minHeight : maxHeight;\n const px = x + nx * h, py = y + ny * h, pz = z + nz * h;\n minX = Math.min(minX, px); minY = Math.min(minY, py); minZ = Math.min(minZ, pz);\n maxX = Math.max(maxX, px); maxY = Math.max(maxY, py); maxZ = Math.max(maxZ, pz);\n }\n } else {\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n out[o] = minX; out[o + 1] = minY; out[o + 2] = minZ;\n out[o + 3] = maxX; out[o + 4] = maxY; out[o + 5] = maxZ;\n return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&\n isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);\n}\n\nfunction emptyBvh(isTLAS: boolean): FlattendBVH {\n return {\n builder: 'builtin',\n buildSurfaceArea: isTLAS ? undefined : 0,\n maxDepth: 0,\n maxLeafPrimitives: 0,\n buffer: new ArrayBuffer(0),\n layout: 'bvh2',\n instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined\n };\n}\n\n/** BLAS without triangles. */\nexport function emptyBLAS() {\n return emptyBvh(false);\n}\n\n/**\n * Builds a BVH2 BLAS over the geometry's triangles. Triangles with\n * non-finite bounds are skipped. With per-triangle displacement ranges\n * (min, max pairs scaled by displacementScale), leaves bound the\n * displacement prisms along the vertex normals and store the packed ranges.\n */\nexport function buildBLAS(\n geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array\n): FlattendBVH {\n const position = geometry.position;\n const indexAttribute = geometry.indices;\n if (!position || !indexAttribute || !position.array.length) {\n return emptyBvh(false);\n }\n const indices = indexStorage(indexAttribute.array);\n const positions = position.array;\n const stride = position.itemSize;\n const normal = trianglesDisplacement ? geometry.normal : undefined;\n const normals = normal?.array;\n const normalStride = normal?.itemSize ?? 0;\n const triangleCount = Math.floor(attributeLength(indices) / 3);\n const aabbs = new Float32Array(triangleCount * 6);\n const triangles = new Uint32Array(triangleCount);\n let count = 0;\n for (let t = 0; t < triangleCount; t++) {\n let minHeight = 0, maxHeight = 0;\n if (normals) {\n minHeight = trianglesDisplacement![t * 2] * displacementScale;\n maxHeight = trianglesDisplacement![t * 2 + 1] * displacementScale;\n if (isNaN(minHeight) || isNaN(maxHeight)) {\n minHeight = 0;\n maxHeight = displacementScale;\n }\n }\n if (triangleBounds(\n positions, stride, normals, normalStride,\n attributeValue(indices, t * 3), attributeValue(indices, t * 3 + 1), attributeValue(indices, t * 3 + 2),\n minHeight, maxHeight, aabbs, count * 6\n )) {\n triangles[count++] = t;\n }\n }\n if (!count) return emptyBvh(false);\n\n const bvh = buildBinnedSahBvh(aabbs, count);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n let buildSurfaceArea = 0;\n const triangleIds: number[] = [];\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];\n buildSurfaceArea += 2 * (x * z + x * y + z * y);\n const prims = primCount[node];\n if (!prims) {\n // Pointer to the second child.\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n // Negative signals to the shader that this node is a leaf.\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const t = triangles[primIndices[leftFirst[node] + i]];\n const e = o + 8 + i * 4;\n if (trianglesDisplacement) triangleIds.push(e / 4, t);\n ints[e] = attributeValue(indices, t * 3);\n ints[e + 1] = attributeValue(indices, t * 3 + 1);\n ints[e + 2] = attributeValue(indices, t * 3 + 2);\n // Pack minH, maxH to one channel.\n ints[e + 3] = trianglesDisplacement\n ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])\n : 0;\n }\n }\n\n return {\n builder: 'builtin',\n triangleIds: trianglesDisplacement ? new Uint32Array(triangleIds) : undefined,\n buildSurfaceArea,\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2'\n };\n}\n\ninterface BlasPlacement {\n blasOffsets: number[];\n vertexOffsets: number[];\n layouts: BvhLayout[];\n}\n\nfunction getBlasPlacement(blases: BLASInstance[]): BlasPlacement {\n let blasOffset = 0;\n let vertexOffset = 0;\n const placement: BlasPlacement = { blasOffsets: [], vertexOffsets: [], layouts: [] };\n blases.forEach((blas) => {\n placement.blasOffsets.push(blasOffset);\n placement.vertexOffsets.push(vertexOffset);\n placement.layouts.push(blas.bvh.layout ?? 'bvh2');\n blasOffset += blas.bvh.buffer.byteLength / 16;\n vertexOffset += blas.verticesCount;\n });\n return placement;\n}\n\n/** Writes the instance's world bounds, padded by its displacement, to out. */\nfunction instanceBounds(instance: TLASInstance, out: Float32Array, o: number) {\n const { min, max } = instance.bounds;\n let padX = 0, padY = 0, padZ = 0;\n const displacementScale = instance.displacementScale;\n if (displacementScale) {\n const m = instance.transform;\n padX = Math.max(0, displacementScale * Math.hypot(read(m, 0), read(m, 1), read(m, 2)));\n padY = Math.max(0, displacementScale * Math.hypot(read(m, 4), read(m, 5), read(m, 6)));\n padZ = Math.max(0, displacementScale * Math.hypot(read(m, 8), read(m, 9), read(m, 10)));\n }\n out[o] = read(min, 0) - padX; out[o + 1] = read(min, 1) - padY; out[o + 2] = read(min, 2) - padZ;\n out[o + 3] = read(max, 0) + padX; out[o + 4] = read(max, 1) + padY; out[o + 5] = read(max, 2) + padZ;\n}\n\nfunction writeInstanceColor(output: Float32Array, offset: number, instance: TLASInstance) {\n const color = instance.color;\n output[offset] = color ? color[0] : 1;\n output[offset + 1] = color ? color[1] : 1;\n output[offset + 2] = color ? color[2] : 1;\n}\n\nfunction writeInstanceRecord(\n instanceInts: Int32Array,\n instanceFloats: Float32Array,\n targetIndex: number,\n instance: TLASInstance,\n placement: BlasPlacement\n) {\n const offset = targetIndex * INSTANCE_WORD_STRIDE;\n instanceInts[offset] = encodeBlasOffset(\n placement.blasOffsets[instance.blasIndex],\n placement.layouts[instance.blasIndex]\n );\n instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];\n instanceInts[offset + 2] = instance.materialsIndices[0] || 0;\n instanceFloats[offset + 3] = instance.displacementScale || 0;\n writeInstanceColor(instanceFloats, offset + 36, instance);\n instanceFloats[offset + 39] = 0;\n const inverse = mat4.invert(new Float64Array(16), instance.transform)!;\n for (let i = 0; i < 16; i++) {\n instanceFloats[offset + 4 + i] = inverse[i];\n instanceFloats[offset + 20 + i] = read(instance.transform, i);\n }\n}\n\n// Hardware adapters use the same instance/material/matrix packing without a\n// software hierarchy. Offsets are primitive offsets in their indexed geometry.\nexport function packLinearInstances(instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[]): ArrayBuffer {\n const buffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);\n const words = new Int32Array(buffer), floats = new Float32Array(buffer);\n const placement: BlasPlacement = {blasOffsets: primitiveOffsets, vertexOffsets,\n layouts: primitiveOffsets.map(() => 'bvh2')};\n for (let i = 0; i < meshInstancesLength(instances); i++) {\n writeInstanceRecord(words, floats, i, readMeshInstance(instances, i), placement);\n }\n return buffer;\n}\n\n/** Repack only selected source-order instance slots for hardware adapters. */\nexport function refitLinearInstances(buffer: ArrayBuffer, instances: MeshInstances, primitiveOffsets: number[], vertexOffsets: number[], dirty: ReadonlySet<number>): TLASRefitRange[] {\n const words = new Int32Array(buffer), floats = new Float32Array(buffer);\n const placement: BlasPlacement = {blasOffsets: primitiveOffsets, vertexOffsets, layouts: primitiveOffsets.map(() => 'bvh2')};\n const ranges: TLASRefitRange[] = [];\n for (const index of dirty) {\n writeInstanceRecord(words, floats, index, readMeshInstance(instances, index), placement);\n ranges.push({offset: index * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4});\n }\n return mergeRefitRanges(ranges);\n}\n\n/**\n * Builds a BVH2 TLAS over the instances. Leaves store\n * (instance record, BLAS offset, source instance index, 0); instance records\n * are written in leaf order to instancesBuffer.\n */\nexport function buildTLAS(\n instances: MeshInstances,\n blases: BLASInstance[]\n): FlattendBVH {\n if (!meshInstancesLength(instances)) return emptyBvh(true);\n const placement = getBlasPlacement(blases);\n const aabbs = new Float32Array(meshInstancesLength(instances) * 6);\n for (let i = 0; i < meshInstancesLength(instances); i++) {\n instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);\n }\n\n const bvh = buildBinnedSahBvh(aabbs, meshInstancesLength(instances));\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n const instancesBuffer = new ArrayBuffer(meshInstancesLength(instances) * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer);\n const instanceFloats = new Float32Array(instancesBuffer);\n let target = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const prims = primCount[node];\n if (!prims) {\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const source = primIndices[leftFirst[node] + i];\n const instance = readMeshInstance(instances, source);\n const e = o + 8 + i * 4;\n ints[e] = target;\n ints[e + 1] = placement.blasOffsets[instance.blasIndex];\n // Keep the source instance index in the otherwise-unused z lane so\n // the TLAS can be refitted without rebuilding its topology.\n ints[e + 2] = source;\n writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);\n target++;\n }\n }\n\n return {\n builder: 'builtin',\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2',\n instancesBuffer\n };\n}\n\n/** Bounds transport for a platform BVH builder; same padding as buildTLAS. */\nexport function meshInstanceBounds(instances: MeshInstances): Float32Array {\n const bounds = new Float32Array(meshInstancesLength(instances) * 6);\n for (let i = 0; i < meshInstancesLength(instances); i++) instanceBounds(readMeshInstance(instances, i), bounds, i * 6);\n return bounds;\n}\n\n/** Pack a platform-built BVH2 hierarchy whose leaf x lane holds source indices. */\nexport function packBuiltTLAS(instances: MeshInstances, blases: BLASInstance[], hierarchy: FlattendBVH): FlattendBVH {\n const count = meshInstancesLength(instances);\n if (!count) return emptyBvh(true);\n const placement = getBlasPlacement(blases), words = new Int32Array(hierarchy.buffer);\n const instancesBuffer = new ArrayBuffer(count * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer), instanceFloats = new Float32Array(instancesBuffer);\n const stack: number[] = [0]; let target = 0;\n while (stack.length) {\n const node = stack.pop()!, o = node * 4, child = words[o + 3];\n if (child >= 0) { stack.push(child); stack.push(node + 2); continue; }\n for (let i = 0; i < -child; i++) {\n const e = o + 8 + i * 4, source = words[e];\n if (source < 0 || source >= count || target >= count) throw new Error('Invalid platform TLAS instance');\n const instance = readMeshInstance(instances, source);\n words[e] = target; words[e + 1] = placement.blasOffsets[instance.blasIndex]; words[e + 2] = source; words[e + 3] = 0;\n writeInstanceRecord(instanceInts, instanceFloats, target++, instance, placement);\n }\n }\n if (target !== count) throw new Error('Platform TLAS instance count mismatch');\n hierarchy.instancesBuffer = instancesBuffer;\n return hierarchy;\n}\n\nexport interface TLASRefitRange {\n offset: number;\n size: number;\n}\n\nexport interface TLASRefitResult {\n tlasRanges: TLASRefitRange[];\n instanceRanges: TLASRefitRange[];\n}\n\ninterface TLASRefitMetadata {\n parent: Map<number, number>;\n depth: Map<number, number>;\n leavesBySource: Map<number, Set<number>>;\n instancesByLeaf: Map<number, { source: number; target: number }[]>;\n}\n\nconst tlasRefitMetadata = new WeakMap<FlattendBVH, TLASRefitMetadata>();\n\nfunction getTLASRefitMetadata(flattened: FlattendBVH, ints: Int32Array) {\n const cached = tlasRefitMetadata.get(flattened);\n if (cached) return cached;\n const metadata: TLASRefitMetadata = {\n parent: new Map(),\n depth: new Map(),\n leavesBySource: new Map(),\n instancesByLeaf: new Map()\n };\n const visit = (index: number, parent: number | undefined, depth: number) => {\n metadata.depth.set(index, depth);\n if (parent != null) metadata.parent.set(index, parent);\n const base = index * 4;\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n visit(index + 2, index, depth + 1);\n visit(primitiveCountOrChild, index, depth + 1);\n return;\n }\n const entries: { source: number; target: number }[] = [];\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const target = ints[primitiveOffset];\n const source = ints[primitiveOffset + 2];\n entries.push({ source, target });\n const leaves = metadata.leavesBySource.get(source) ?? new Set<number>();\n leaves.add(index);\n metadata.leavesBySource.set(source, leaves);\n }\n metadata.instancesByLeaf.set(index, entries);\n };\n visit(0, undefined, 0);\n tlasRefitMetadata.set(flattened, metadata);\n return metadata;\n}\n\nexport function mergeRefitRanges(ranges: TLASRefitRange[]) {\n const sorted = ranges\n .filter(({ size }) => size > 0)\n .sort((left, right) => left.offset - right.offset);\n const merged: TLASRefitRange[] = [];\n for (const range of sorted) {\n const previous = merged[merged.length - 1];\n if (previous && range.offset <= previous.offset + previous.size) {\n previous.size = Math.max(\n previous.size,\n range.offset + range.size - previous.offset\n );\n } else {\n merged.push({ offset: range.offset, size: range.size });\n }\n }\n return merged;\n}\n\n/** A transactional candidate shares immutable refit topology metadata. */\nexport function copyTLASForRefit(flattened: FlattendBVH): FlattendBVH {\n const next = {...flattened, buffer: flattened.buffer.slice(0), instancesBuffer: flattened.instancesBuffer?.slice(0)};\n if (flattened.buffer.byteLength && flattened.instancesBuffer) {\n tlasRefitMetadata.set(next, getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer)));\n }\n return next;\n}\n\nexport function refitTLAS(\n flattened: FlattendBVH,\n instances: MeshInstances,\n blases: BLASInstance[],\n dirtySourceIndices?: ReadonlySet<number>\n): TLASRefitResult {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {\n return { tlasRanges: [], instanceRanges: [] };\n }\n const floats = new Float32Array(flattened.buffer);\n const ints = new Int32Array(flattened.buffer);\n const instanceFloats = new Float32Array(flattened.instancesBuffer);\n const instanceInts = new Int32Array(flattened.instancesBuffer);\n\n const placement = getBlasPlacement(blases);\n const scratch = new Float32Array(6);\n\n function writeInstance(targetIndex: number, sourceIndex: number) {\n writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);\n }\n\n function addInstanceBounds(bounds: Box3, instance: TLASInstance) {\n instanceBounds(instance, scratch, 0);\n write(bounds.min, 0, Math.min(read(bounds.min, 0), scratch[0]));\n write(bounds.min, 1, Math.min(read(bounds.min, 1), scratch[1]));\n write(bounds.min, 2, Math.min(read(bounds.min, 2), scratch[2]));\n write(bounds.max, 0, Math.max(read(bounds.max, 0), scratch[3]));\n write(bounds.max, 1, Math.max(read(bounds.max, 1), scratch[4]));\n write(bounds.max, 2, Math.max(read(bounds.max, 2), scratch[5]));\n }\n\n function writeNodeBounds(index: number, bounds: Box3) {\n const base = index * 4;\n floats[base] = read(bounds.min, 0);\n floats[base + 1] = read(bounds.min, 1);\n floats[base + 2] = read(bounds.min, 2);\n floats[base + 4] = read(bounds.max, 0);\n floats[base + 5] = read(bounds.max, 1);\n floats[base + 6] = read(bounds.max, 2);\n }\n\n function readNodeBounds(index: number) {\n const base = index * 4;\n const bounds = new Box3();\n vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);\n vec3.set(\n bounds.max,\n floats[base + 4],\n floats[base + 5],\n floats[base + 6]\n );\n return bounds;\n }\n\n function refitNode(index: number): Box3 {\n const base = index * 4;\n const bounds = new Box3();\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n const left = refitNode(index + 2);\n const right = refitNode(primitiveCountOrChild);\n unionBounds(bounds, left, right);\n } else {\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const targetInstance = ints[primitiveOffset];\n const sourceInstance = ints[primitiveOffset + 2];\n const instance = readMeshInstance(instances, sourceInstance);\n if (!instance) continue;\n addInstanceBounds(bounds, instance);\n writeInstance(targetInstance, sourceInstance);\n }\n }\n writeNodeBounds(index, bounds);\n return bounds;\n }\n\n if (!dirtySourceIndices) {\n refitNode(0);\n return {\n tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],\n instanceRanges: [\n { offset: 0, size: flattened.instancesBuffer.byteLength }\n ]\n };\n }\n\n const metadata = getTLASRefitMetadata(flattened, ints);\n const dirtyLeaves = new Set<number>();\n const instanceRanges: TLASRefitRange[] = [];\n for (const source of dirtySourceIndices) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n leaves.forEach((leaf) => dirtyLeaves.add(leaf));\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n writeInstance(entry.target, source);\n instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });\n }\n }\n }\n\n const dirtyNodes = new Set<number>();\n for (const leaf of dirtyLeaves) {\n const bounds = new Box3();\n for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {\n const instance = readMeshInstance(instances, source);\n if (instance) addInstanceBounds(bounds, instance);\n }\n writeNodeBounds(leaf, bounds);\n dirtyNodes.add(leaf);\n let parent = metadata.parent.get(leaf);\n while (parent != null) {\n dirtyNodes.add(parent);\n parent = metadata.parent.get(parent);\n }\n }\n\n const internalNodes = [...dirtyNodes]\n .filter((index) => ints[index * 4 + 3] >= 0)\n .sort(\n (left, right) =>\n (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0)\n );\n for (const index of internalNodes) {\n const right = ints[index * 4 + 3];\n const bounds = new Box3();\n unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));\n writeNodeBounds(index, bounds);\n }\n\n return {\n tlasRanges: mergeRefitRanges(\n [...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))\n ),\n instanceRanges: mergeRefitRanges(instanceRanges)\n };\n}\n\n/** Dynamic BLASes rebuild when their total node surface area doubles. */\nexport const DYNAMIC_BLAS_REBUILD_RATIO = 2;\n\ninterface BlasRefitData {\n /** Per leaf (vec4 index): offset of its vertex list in vertices. */\n offsets: Int32Array;\n /** Per leaf: unique vertex count followed by the vertices. */\n vertices: Uint32Array;\n /** Node indices (vec4 units) with descendants before their ancestors. */\n postorder: Int32Array;\n}\n\n// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle\n// corners once so deformation refits read each leaf's vertex only once.\nconst blasRefitData = new WeakMap<ArrayBuffer, BlasRefitData>();\n\nfunction getBlasRefitData(buffer: ArrayBuffer): BlasRefitData {\n const cached = blasRefitData.get(buffer);\n if (cached) return cached;\n const ints = new Int32Array(buffer);\n const offsets = new Int32Array(ints.length / 4);\n const vertices: number[] = [];\n const preorder: number[] = [];\n const stack = [0];\n while (stack.length) {\n const index = stack.pop()!;\n preorder.push(index);\n const base = index * 4;\n const child = ints[base + 3];\n if (child >= 0) {\n stack.push(child, index + 2);\n continue;\n }\n offsets[index] = vertices.length;\n const countSlot = vertices.length;\n vertices.push(0);\n for (let i = 0; i < -child; i++) {\n for (let j = 0; j < 3; j++) {\n const vertex = ints[base + 8 + i * 4 + j];\n let seen = false;\n for (let k = countSlot + 1; k < vertices.length; k++) {\n if (vertices[k] === vertex) { seen = true; break; }\n }\n if (!seen) vertices.push(vertex);\n }\n }\n vertices[countSlot] = vertices.length - countSlot - 1;\n }\n const data = {\n offsets,\n vertices: new Uint32Array(vertices),\n postorder: new Int32Array(preorder.reverse())\n };\n blasRefitData.set(buffer, data);\n return data;\n}\n\n/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */\nexport function refitBLAS(\n flattened: FlattendBVH,\n geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>,\n displacement?: {normal: Float32Array; scale: number; ranges: Float32Array}\n) {\n if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {\n return false;\n }\n const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);\n const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n const sourceTriangles = new Int32Array(displacement ? floats.length / 4 : 0).fill(-1);\n const prism = new Float32Array(6);\n if (displacement) {\n // Leaf source IDs remain distinct even for duplicate index triples.\n // Refuse old caches without this metadata before mutating their bounds.\n const triangleIds = flattened.triangleIds;\n if (!(triangleIds instanceof Uint32Array)) return false;\n for (let i = 0; i < triangleIds.length; i += 2) {\n const record: number = Number(triangleIds[i]);\n sourceTriangles[record] = triangleIds[i + 1];\n }\n }\n if (flattened.buildSurfaceArea == null) {\n let area = 0;\n for (const index of postorder) {\n const b = index * 4;\n const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];\n area += 2 * (x * z + x * y + z * y);\n }\n flattened.buildSurfaceArea = area;\n }\n let area = 0;\n for (let node = 0; node < postorder.length; node++) {\n const index = postorder[node], base = index * 4, child = ints[base + 3];\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n if (child >= 0) {\n const left = base + 8, right = child * 4;\n minX = Math.min(floats[left], floats[right]); minY = Math.min(floats[left + 1], floats[right + 1]); minZ = Math.min(floats[left + 2], floats[right + 2]);\n maxX = Math.max(floats[left + 4], floats[right + 4]); maxY = Math.max(floats[left + 5], floats[right + 5]); maxZ = Math.max(floats[left + 6], floats[right + 6]);\n } else if (displacement) {\n for (let i = 0; i < -child; i++) {\n const record = base + 8 + i * 4;\n const ia = ints[record], ib = ints[record + 1], ic = ints[record + 2];\n const triangle = sourceTriangles[record / 4];\n if (triangle < 0) return false;\n const minimum = displacement.ranges[triangle * 2], maximum = displacement.ranges[triangle * 2 + 1];\n if (!triangleBounds(positions, stride, displacement.normal, 3, ia, ib, ic,\n minimum * displacement.scale, maximum * displacement.scale, prism, 0)) return false;\n ints[record + 3] = flattened.builder === 'tinybvh' ? quantizeDisplacementRange(minimum, maximum) : packH(minimum, maximum);\n minX = Math.min(minX, prism[0]); minY = Math.min(minY, prism[1]); minZ = Math.min(minZ, prism[2]);\n maxX = Math.max(maxX, prism[3]); maxY = Math.max(maxY, prism[4]); maxZ = Math.max(maxZ, prism[5]);\n }\n } else {\n const start = offsets[index], end = start + 1 + vertices[start];\n for (let i = start + 1; i < end; i++) {\n const offset = vertices[i] * stride;\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!isFinite(x) || !isFinite(y) || !isFinite(z)) continue;\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;\n area += 2 * (x * z + x * y + z * y);\n floats[base] = minX; floats[base + 1] = minY; floats[base + 2] = minZ;\n floats[base + 4] = maxX; floats[base + 5] = maxY; floats[base + 6] = maxZ;\n }\n return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);\n}\n\n/** Writes only instance colors; TLAS topology and bounds remain untouched. */\nexport function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[] {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size) return [];\n const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));\n const floats = new Float32Array(flattened.instancesBuffer);\n const ranges: TLASRefitRange[] = [];\n for (const source of dirty) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n const offset = entry.target * INSTANCE_WORD_STRIDE + 36;\n writeInstanceColor(floats, offset, readMeshInstance(instances, source));\n ranges.push({offset: offset * 4, size: 16});\n }\n }\n }\n return mergeRefitRanges(ranges);\n}\n"]}
|
|
@@ -7,6 +7,7 @@ export declare function executeBvhBuild(request: BvhBuildRequest): Promise<{
|
|
|
7
7
|
maxDepth: number;
|
|
8
8
|
maxLeafPrimitives?: number;
|
|
9
9
|
buffer: ArrayBuffer;
|
|
10
|
+
triangleIds?: Uint32Array;
|
|
10
11
|
layout?: import("./bvhAccel.js").BvhLayout;
|
|
11
12
|
instancesBuffer?: ArrayBuffer;
|
|
12
13
|
}>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** Freeze camera values without rounding Three.js's double-precision matrices. */
|
|
2
2
|
export function cameraSnapshot(source) {
|
|
3
3
|
const copy = source.clone();
|
|
4
|
-
|
|
4
|
+
const transform = source.transform;
|
|
5
|
+
copy.transform = transform instanceof Float32Array ? transform.slice() : transform.slice();
|
|
5
6
|
return copy;
|
|
6
7
|
}
|
|
7
8
|
//# sourceMappingURL=cameraSnapshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cameraSnapshot.js","sourceRoot":"","sources":["../../src/renderer/cameraSnapshot.ts"],"names":[],"mappings":"AACA,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,CAAC,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"cameraSnapshot.js","sourceRoot":"","sources":["../../src/renderer/cameraSnapshot.ts"],"names":[],"mappings":"AACA,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,GAAG,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3F,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type Camera from '../scene/Camera.js';\n/** Freeze camera values without rounding Three.js's double-precision matrices. */\nexport function cameraSnapshot(source: Camera): Camera {\n const copy = source.clone();\n const transform = source.transform;\n copy.transform = transform instanceof Float32Array ? transform.slice() : transform.slice();\n return copy;\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Packs the shared WGSL camera block. Matrices are column-major. */
|
|
2
|
+
export function packCameraUniform(viewProjectionInverse, cameraWorld, apertureRadius, focusDistance) {
|
|
3
|
+
const values = new Float32Array(36);
|
|
4
|
+
for (let i = 0; i < 16; i++) {
|
|
5
|
+
values[i] = viewProjectionInverse[i];
|
|
6
|
+
values[16 + i] = cameraWorld[i];
|
|
7
|
+
}
|
|
8
|
+
values[32] = apertureRadius;
|
|
9
|
+
values[33] = focusDistance;
|
|
10
|
+
return values;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=cameraUniform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cameraUniform.js","sourceRoot":"","sources":["../../src/renderer/cameraUniform.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAC/B,qBAAmC,EAAE,WAAyB,EAC9D,cAAsB,EAAE,aAAqB;IAE7C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC;IAC5B,MAAM,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/** Packs the shared WGSL camera block. Matrices are column-major. */\nexport function packCameraUniform(\n viewProjectionInverse: Float32Array, cameraWorld: Float32Array,\n apertureRadius: number, focusDistance: number\n): Float32Array {\n const values = new Float32Array(36);\n for (let i = 0; i < 16; i++) {\n values[i] = viewProjectionInverse[i];\n values[16 + i] = cameraWorld[i];\n }\n values[32] = apertureRadius;\n values[33] = focusDistance;\n return values;\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
interface CausticDiagnostics {
|
|
2
|
+
debugGroup: number;
|
|
3
|
+
photonAlpha?: number;
|
|
4
|
+
photonRadiusScaling?: import('./wgsl/photonMap.compute.js').PhotonRadiusScaling;
|
|
5
|
+
/** Fixed progressive batch for isolated query counters. */
|
|
6
|
+
photonDebugBatch?: number;
|
|
7
|
+
photonBudgetBytes?: number;
|
|
8
|
+
photonScreenRadius?: boolean;
|
|
9
|
+
/** Internal photon density comparison; public defaults stay fixed. */
|
|
10
|
+
photonCountDivisor?: number;
|
|
11
|
+
/** Internal direct-receiver A/B override; false restores the original PM shader. */
|
|
12
|
+
photonDirectSubset?: boolean;
|
|
13
|
+
/** Scale experiments; off by default and excluded from public settings. */
|
|
14
|
+
photonPerCasterRadius?: boolean;
|
|
15
|
+
causticViewImportance?: boolean;
|
|
16
|
+
photonDeepScreenPixels?: number;
|
|
17
|
+
photonSkipQuery?: boolean;
|
|
18
|
+
photonSkipVisible?: boolean;
|
|
19
|
+
photonMaxDepth?: number;
|
|
20
|
+
fullEmissionRandom?: boolean;
|
|
21
|
+
aggregateCasters?: boolean;
|
|
22
|
+
capturePhotons?: boolean;
|
|
23
|
+
photonBatch?: {
|
|
24
|
+
device: GPUDevice;
|
|
25
|
+
data: GPUTexture;
|
|
26
|
+
emitted: number;
|
|
27
|
+
packed?: boolean;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare const causticDiagnostics: CausticDiagnostics;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Internal shader instrumentation. A nonnegative group replaces beauty RGB with three transport counters. */
|
|
2
|
+
const diagnosticsKey = Symbol.for('mutracer.internal.causticDiagnostics');
|
|
3
|
+
const diagnosticsScope = globalThis;
|
|
4
|
+
export const causticDiagnostics = diagnosticsScope[diagnosticsKey] ??= ({ debugGroup: -1 });
|
|
5
|
+
//# sourceMappingURL=causticDiagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causticDiagnostics.js","sourceRoot":"","sources":["../../src/renderer/causticDiagnostics.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,cAAc,GAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAyBxE,MAAM,gBAAgB,GAAC,UAA6E,CAAC;AACrG,MAAM,CAAC,MAAM,kBAAkB,GAAC,gBAAgB,CAAC,cAAc,CAAC,KAAG,CAAE,EAAC,UAAU,EAAC,CAAC,CAAC,EAAC,CAAE,CAAC","sourcesContent":["/** Internal shader instrumentation. A nonnegative group replaces beauty RGB with three transport counters. */\nconst diagnosticsKey=Symbol.for('mutracer.internal.causticDiagnostics');\ninterface CausticDiagnostics {\n debugGroup:number;\n photonAlpha?:number;\n photonRadiusScaling?: import('./wgsl/photonMap.compute.js').PhotonRadiusScaling;\n /** Fixed progressive batch for isolated query counters. */\n photonDebugBatch?:number;\n photonBudgetBytes?:number;\n photonScreenRadius?:boolean;\n /** Internal photon density comparison; public defaults stay fixed. */\n photonCountDivisor?:number;\n /** Internal direct-receiver A/B override; false restores the original PM shader. */\n photonDirectSubset?:boolean;\n /** Scale experiments; off by default and excluded from public settings. */\n photonPerCasterRadius?:boolean;\n causticViewImportance?:boolean;\n photonDeepScreenPixels?:number;\n photonSkipQuery?:boolean;\n photonSkipVisible?:boolean;\n photonMaxDepth?:number;\n fullEmissionRandom?:boolean;\n aggregateCasters?:boolean;\n capturePhotons?:boolean;\n photonBatch?:{device:GPUDevice;data:GPUTexture;emitted:number;packed?:boolean};\n}\nconst diagnosticsScope=globalThis as typeof globalThis & Record<symbol,CausticDiagnostics|undefined>;\nexport const causticDiagnostics=diagnosticsScope[diagnosticsKey]??=( {debugGroup:-1} );\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnalyticLightState } from '../scene/lightState.js';
|
|
2
|
+
import { type EmissiveTriangle } from './lightSampling.js';
|
|
3
|
+
/** Emitted flux, independent of the NEE selection heuristic. */
|
|
4
|
+
export declare function causticEmissionPower(light: AnalyticLightState, radius?: number): number;
|
|
5
|
+
/** Two texels per alias choice: probability/alias/type/index, then its PMF. */
|
|
6
|
+
export declare function causticEmissionTable(lights: readonly AnalyticLightState[], triangles: readonly EmissiveTriangle[], radius?: number, environmentPower?: number): {
|
|
7
|
+
data: Float32Array<ArrayBuffer>;
|
|
8
|
+
count: number;
|
|
9
|
+
totalPower: number;
|
|
10
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { buildLightAliasTable, colorLuminance, estimateAnalyticLightPower } from './lightSampling.js';
|
|
2
|
+
import { getSpotLightArea, getSpotLightRadiance } from './lightsData.js';
|
|
3
|
+
/** Emitted flux, independent of the NEE selection heuristic. */
|
|
4
|
+
export function causticEmissionPower(light, radius = 1) {
|
|
5
|
+
if (light.type === 'DirectionalLight')
|
|
6
|
+
return colorLuminance(light.color) * light.intensity * Math.PI * radius * radius;
|
|
7
|
+
if (light.type === 'RectLight')
|
|
8
|
+
return estimateAnalyticLightPower(light) * (light.spread <= .001 ? 1 / Math.PI : Math.sin(Math.PI * .5 * light.spread) ** 2);
|
|
9
|
+
if (light.type !== 'SpotLight')
|
|
10
|
+
return estimateAnalyticLightPower(light);
|
|
11
|
+
const outer = Math.cos(light.outerAngle * Math.PI / 180), inner = Math.cos(Math.min(light.innerAngle, light.outerAngle) * Math.PI / 180);
|
|
12
|
+
const rows = 128, columns = 128;
|
|
13
|
+
let integral = 0;
|
|
14
|
+
for (let y = 0; y < rows; y++)
|
|
15
|
+
for (let x = 0; x < columns; x++) {
|
|
16
|
+
const cosine = 1 - (1 - outer) * (y + .5) / rows;
|
|
17
|
+
const t = inner > outer ? Math.min(1, Math.max(0, (cosine - outer) / (inner - outer))) : 1;
|
|
18
|
+
const ies = light.iesProfile?.sampleBaked(Math.acos(cosine), 2 * Math.PI * (x + .5) / columns - Math.PI) ?? 1;
|
|
19
|
+
integral += t * t * (3 - 2 * t) * ies;
|
|
20
|
+
}
|
|
21
|
+
integral *= 2 * Math.PI * (1 - outer) / (rows * columns);
|
|
22
|
+
// A sphere projects to one quarter of its surface area in any direction.
|
|
23
|
+
const intensity = colorLuminance(light.color) * (light.radius === 0 ? light.intensity : getSpotLightRadiance(light) * getSpotLightArea(light) / 4);
|
|
24
|
+
return intensity * integral;
|
|
25
|
+
}
|
|
26
|
+
/** Two texels per alias choice: probability/alias/type/index, then its PMF. */
|
|
27
|
+
export function causticEmissionTable(lights, triangles, radius = 1, environmentPower = 0) {
|
|
28
|
+
const entries = lights.map((light, sourceIndex) => ({ sourceType: 2, sourceIndex, weight: causticEmissionPower(light, radius) }));
|
|
29
|
+
triangles.forEach((triangle, sourceIndex) => entries.push({ sourceType: 3, sourceIndex, weight: Math.PI * triangle.area * triangle.samplingLuminance }));
|
|
30
|
+
if (environmentPower > 0)
|
|
31
|
+
entries.push({ sourceType: 1, sourceIndex: 0, weight: environmentPower * Math.PI * radius * radius });
|
|
32
|
+
const distribution = buildLightAliasTable(entries), count = distribution.pmfs.length;
|
|
33
|
+
const data = new Float32Array(count * 8), words = new Uint32Array(data.buffer);
|
|
34
|
+
for (let i = 0; i < count; i++) {
|
|
35
|
+
words.set(distribution.choices.subarray(i * 4, i * 4 + 4), i * 8);
|
|
36
|
+
data[i * 8 + 4] = distribution.pmfs[i];
|
|
37
|
+
}
|
|
38
|
+
return { data, count, totalPower: distribution.totalWeight };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=causticEmission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causticEmission.js","sourceRoot":"","sources":["../../src/renderer/causticEmission.ts"],"names":[],"mappings":"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","sourcesContent":["import type {AnalyticLightState} from '../scene/lightState.js';\nimport {buildLightAliasTable,colorLuminance,estimateAnalyticLightPower,type EmissiveTriangle} from './lightSampling.js';\nimport {getSpotLightArea,getSpotLightRadiance} from './lightsData.js';\n\n/** Emitted flux, independent of the NEE selection heuristic. */\nexport function causticEmissionPower(light:AnalyticLightState,radius=1) {\n if(light.type==='DirectionalLight')return colorLuminance(light.color)*light.intensity*Math.PI*radius*radius;\n if(light.type==='RectLight')return estimateAnalyticLightPower(light)*(light.spread<=.001?1/Math.PI:Math.sin(Math.PI*.5*light.spread)**2);\n if(light.type!=='SpotLight')return estimateAnalyticLightPower(light);\n const outer=Math.cos(light.outerAngle*Math.PI/180),inner=Math.cos(Math.min(light.innerAngle,light.outerAngle)*Math.PI/180);\n const rows=128,columns=128;let integral=0;\n for(let y=0;y<rows;y++)for(let x=0;x<columns;x++){\n const cosine=1-(1-outer)*(y+.5)/rows;\n const t=inner>outer?Math.min(1,Math.max(0,(cosine-outer)/(inner-outer))):1;\n const ies=light.iesProfile?.sampleBaked(Math.acos(cosine),2*Math.PI*(x+.5)/columns-Math.PI)??1;\n integral+=t*t*(3-2*t)*ies;\n }\n integral*=2*Math.PI*(1-outer)/(rows*columns);\n // A sphere projects to one quarter of its surface area in any direction.\n const intensity=colorLuminance(light.color)*(light.radius===0?light.intensity:getSpotLightRadiance(light)*getSpotLightArea(light)/4);\n return intensity*integral;\n}\n/** Two texels per alias choice: probability/alias/type/index, then its PMF. */\nexport function causticEmissionTable(lights:readonly AnalyticLightState[],triangles:readonly EmissiveTriangle[],radius=1,environmentPower=0) {\n const entries=lights.map((light,sourceIndex)=>({sourceType:2,sourceIndex,weight:causticEmissionPower(light,radius)}));\n triangles.forEach((triangle,sourceIndex)=>entries.push({sourceType:3,sourceIndex,weight:Math.PI*triangle.area*triangle.samplingLuminance}));\n if(environmentPower>0)entries.push({sourceType:1,sourceIndex:0,weight:environmentPower*Math.PI*radius*radius});\n const distribution=buildLightAliasTable(entries),count=distribution.pmfs.length;\n const data=new Float32Array(count*8),words=new Uint32Array(data.buffer);\n for(let i=0;i<count;i++){words.set(distribution.choices.subarray(i*4,i*4+4),i*8);data[i*8+4]=distribution.pmfs[i];}\n return {data,count,totalPower:distribution.totalWeight};\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface CausticLightUniformOptions {
|
|
2
|
+
casterSphere: readonly number[];
|
|
3
|
+
viewProjection: Float32Array | Float64Array | number[];
|
|
4
|
+
photons: number;
|
|
5
|
+
batch: number;
|
|
6
|
+
cameraScale: number;
|
|
7
|
+
casterCount?: number;
|
|
8
|
+
choiceCount?: number;
|
|
9
|
+
orthographic?: boolean;
|
|
10
|
+
experiments?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function packCausticLightUniform(options: CausticLightUniformOptions): ArrayBuffer;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { researchTransport } from './researchTransport.js';
|
|
2
|
+
import { matrixStorage } from '../math/storage.js';
|
|
3
|
+
import { CAUSTIC_UNIFORM_BYTES } from './wgsl/causticLight.compute.js';
|
|
4
|
+
export function packCausticLightUniform(options) {
|
|
5
|
+
const data = new ArrayBuffer(CAUSTIC_UNIFORM_BYTES), f = new Float32Array(data), u = new Uint32Array(data);
|
|
6
|
+
const matrix = matrixStorage(options.viewProjection);
|
|
7
|
+
for (let i = 0; i < 4; i++)
|
|
8
|
+
f[i] = options.casterSphere[i];
|
|
9
|
+
for (let i = 0; i < 16; i++)
|
|
10
|
+
f[i + 4] = matrix[i];
|
|
11
|
+
u[20] = options.photons;
|
|
12
|
+
u[21] = options.batch;
|
|
13
|
+
u[22] = 0;
|
|
14
|
+
f[23] = options.cameraScale;
|
|
15
|
+
u[24] = options.casterCount ?? 0;
|
|
16
|
+
u[25] = options.choiceCount ?? 0;
|
|
17
|
+
u[26] = +!!options.orthographic;
|
|
18
|
+
u[27] = options.experiments ?? 0;
|
|
19
|
+
researchTransport()?.packUniform(data, options);
|
|
20
|
+
return data;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=causticUniform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causticUniform.js","sourceRoot":"","sources":["../../src/renderer/causticUniform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,qBAAqB,EAAC,MAAM,gCAAgC,CAAC;AAErE,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,MAAM,IAAI,GAAC,IAAI,WAAW,CAAC,qBAAqB,CAAC,EAAC,CAAC,GAAC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAC,CAAC,GAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACnG,MAAM,MAAM,GAAC,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAAA,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE;QAAC,CAAC,CAAC,CAAC,CAAC,GAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAAA,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,EAAE,EAAC,CAAC,EAAE;QAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1I,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,OAAO,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,KAAK,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,CAAC,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,WAAW,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,WAAW,IAAE,CAAC,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,WAAW,IAAE,CAAC,CAAC;IAAA,CAAC,CAAC,EAAE,CAAC,GAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACpK,CAAC,CAAC,EAAE,CAAC,GAAC,OAAO,CAAC,WAAW,IAAE,CAAC,CAAC;IAC7B,iBAAiB,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport {matrixStorage} from '../math/storage.js';\nimport {CAUSTIC_UNIFORM_BYTES} from './wgsl/causticLight.compute.js';\nexport interface CausticLightUniformOptions {casterSphere:readonly number[];viewProjection:Float32Array|Float64Array|number[];photons:number;batch:number;cameraScale:number;casterCount?:number;choiceCount?:number;orthographic?:boolean;experiments?:number}\nexport function packCausticLightUniform(options:CausticLightUniformOptions) {\n const data=new ArrayBuffer(CAUSTIC_UNIFORM_BYTES),f=new Float32Array(data),u=new Uint32Array(data);\n const matrix=matrixStorage(options.viewProjection);for(let i=0;i<4;i++)f[i]=options.casterSphere[i];for(let i=0;i<16;i++)f[i+4]=matrix[i];\n u[20]=options.photons;u[21]=options.batch;u[22]=0;f[23]=options.cameraScale;u[24]=options.casterCount??0;u[25]=options.choiceCount??0;u[26]=+!!options.orthographic;\n u[27]=options.experiments??0;\n researchTransport()?.packUniform(data, options);\n return data;\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type Mesh from '../scene/MeshState.js';
|
|
2
|
+
import type OpenPBRMaterial from '../scene/MaterialState.js';
|
|
3
|
+
export declare const CAUSTIC_ROUGHNESS_MAX = 0.1;
|
|
4
|
+
/** Material-only classification, shared by caster collection and GPU estimators. */
|
|
5
|
+
export declare function isCausticSpecular(m: Pick<OpenPBRMaterial, 'baseWeight' | 'baseMetalness' | 'transmissionWeight' | 'subsurfaceWeight' | 'fuzzWeight' | 'coatWeight' | 'specularRoughness'>): boolean;
|
|
6
|
+
export type CasterSphere = [number, number, number, number];
|
|
7
|
+
/** One conservative world-space sphere per smooth mesh instance. */
|
|
8
|
+
export declare function causticCasterSpheres(meshes: readonly Mesh[]): CasterSphere[];
|
|
9
|
+
/** Conservative sphere enclosing the caster mixture. */
|
|
10
|
+
export declare function causticCasterSphere(meshes: readonly Mesh[]): CasterSphere;
|
|
11
|
+
/** CPU reference for the solid-angle mixture, including overlapping cones. */
|
|
12
|
+
export declare function casterDirectionPdf(origin: readonly number[], direction: readonly number[], spheres: readonly CasterSphere[], weights?: readonly number[]): number;
|
|
13
|
+
/** Stochastic smooth coverage currently disagrees with PT energy.
|
|
14
|
+
* Keep those scenes on PT until transport and endpoint weights are verified.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasStochasticCausticCaster(meshes: readonly Mesh[]): boolean;
|