@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
package/lib/Engine.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface EngineParams {
|
|
|
17
17
|
/** Default display canvas. Default a new HTML canvas, or OffscreenCanvas without document. */ canvas?: HTMLCanvasElement | OffscreenCanvas;
|
|
18
18
|
/** Backend selection. Default auto, with WebGL fallback. webgpu requires WebGPU. */ backend?: 'auto' | 'webgpu' | 'webgl';
|
|
19
19
|
/** Caller-owned WebGPU device. Default undefined uses a shared device. Implies webgpu; incompatible with webgl. */ device?: GPUDevice;
|
|
20
|
+
/** Material texture bindings. Default atlas; auto tries WebGPU bindless textures and falls back to atlas when unavailable. Fixed at construction. */ textureBinding?: 'atlas' | 'auto';
|
|
20
21
|
}
|
|
21
22
|
/** Material-atlas device limits. */
|
|
22
23
|
export interface TextureAtlasLimits {
|
|
@@ -66,6 +67,8 @@ export default class Engine {
|
|
|
66
67
|
private _bvhWorkerPool?;
|
|
67
68
|
private _bvhPreparationRevision;
|
|
68
69
|
private _bvhPreparation?;
|
|
70
|
+
private _bvhPreparationController?;
|
|
71
|
+
private _bvhFailedRevision;
|
|
69
72
|
private _bvhPreparationTail;
|
|
70
73
|
private _tinyBvhUnavailable;
|
|
71
74
|
private _bvhWorkerUnavailable;
|
|
@@ -89,6 +92,7 @@ export default class Engine {
|
|
|
89
92
|
private _contextRestore?;
|
|
90
93
|
private _gpuAdapterInfo?;
|
|
91
94
|
private _backendChoice;
|
|
95
|
+
private readonly _textureBinding;
|
|
92
96
|
private _initPromise?;
|
|
93
97
|
private _info?;
|
|
94
98
|
private _pipelineInitError?;
|
package/lib/Engine.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { bvhConfig, engineSettingsKey, workerCount, textureBudget } from './settings/engine.js';
|
|
2
2
|
import { createCanvas } from './util/canvas.js';
|
|
3
3
|
import { getRecommendedDeviceDescriptor, validateDevice } from './renderer/deviceRequirements.js';
|
|
4
|
+
import { probeBindless, resourceTableFeature } from './renderer/wgpuBindless.js';
|
|
4
5
|
import { cameraSnapshot } from './renderer/cameraSnapshot.js';
|
|
5
6
|
import Display from './Display.js';
|
|
6
7
|
import { Events } from './util/events.js';
|
|
@@ -16,29 +17,42 @@ import { packDepthSampleArea } from './renderer/depthQuery.js';
|
|
|
16
17
|
import { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';
|
|
17
18
|
import { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';
|
|
18
19
|
import { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const request = (async () => {
|
|
27
|
-
const adapter = await gpu.requestAdapter({ powerPreference: 'high-performance' }) ?? await gpu.requestAdapter();
|
|
20
|
+
const CANCELLED_DENOISE_GRACE_MS = 10000;
|
|
21
|
+
const sharedDevices = new Map();
|
|
22
|
+
async function sharedDevice(gpu, mode) {
|
|
23
|
+
let request = sharedDevices.get(mode);
|
|
24
|
+
if (!request) {
|
|
25
|
+
request = (async () => {
|
|
26
|
+
let adapter = await gpu.requestAdapter({ powerPreference: 'high-performance' }) ?? await gpu.requestAdapter();
|
|
28
27
|
if (!adapter)
|
|
29
28
|
throw new Error('No WebGPU adapter is available');
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
const descriptor = getRecommendedDeviceDescriptor(adapter);
|
|
30
|
+
const support = mode === 'auto' ? resourceTableFeature(adapter.features) : undefined;
|
|
31
|
+
let device, fallbackReason;
|
|
32
|
+
try {
|
|
33
|
+
device = await adapter.requestDevice(support ? { ...descriptor, requiredFeatures: [...descriptor.requiredFeatures ?? [], support.feature] } : descriptor);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (!support)
|
|
37
|
+
throw error;
|
|
38
|
+
fallbackReason = error instanceof Error ? error.message : String(error);
|
|
39
|
+
const retry = await gpu.requestAdapter({ powerPreference: 'high-performance' }) ?? await gpu.requestAdapter();
|
|
40
|
+
if (!retry)
|
|
41
|
+
throw new Error('No WebGPU adapter is available for atlas fallback');
|
|
42
|
+
device = await retry.requestDevice(getRecommendedDeviceDescriptor(retry));
|
|
43
|
+
adapter = retry;
|
|
44
|
+
}
|
|
45
|
+
const current = request;
|
|
46
|
+
void device.lost.then(() => { if (sharedDevices.get(mode) === current)
|
|
47
|
+
sharedDevices.delete(mode); });
|
|
48
|
+
return { device, adapterInfo: adapter.info, fallbackReason };
|
|
36
49
|
})();
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
50
|
+
sharedDevices.set(mode, request);
|
|
51
|
+
const current = request;
|
|
52
|
+
void request.catch(() => { if (sharedDevices.get(mode) === current)
|
|
53
|
+
sharedDevices.delete(mode); });
|
|
40
54
|
}
|
|
41
|
-
return
|
|
55
|
+
return request;
|
|
42
56
|
}
|
|
43
57
|
/** Shared device, committed scene/camera, CPU preparation and denoiser ownership. */
|
|
44
58
|
export default class Engine {
|
|
@@ -56,6 +70,8 @@ export default class Engine {
|
|
|
56
70
|
_bvhWorkerPool;
|
|
57
71
|
_bvhPreparationRevision = 0;
|
|
58
72
|
_bvhPreparation;
|
|
73
|
+
_bvhPreparationController;
|
|
74
|
+
_bvhFailedRevision = -1;
|
|
59
75
|
_bvhPreparationTail = Promise.resolve();
|
|
60
76
|
_tinyBvhUnavailable = false;
|
|
61
77
|
_bvhWorkerUnavailable = false;
|
|
@@ -79,6 +95,7 @@ export default class Engine {
|
|
|
79
95
|
_contextRestore;
|
|
80
96
|
_gpuAdapterInfo;
|
|
81
97
|
_backendChoice;
|
|
98
|
+
_textureBinding;
|
|
82
99
|
_initPromise;
|
|
83
100
|
_info;
|
|
84
101
|
_pipelineInitError;
|
|
@@ -121,6 +138,7 @@ export default class Engine {
|
|
|
121
138
|
if (params.device && params.backend === 'webgl')
|
|
122
139
|
throw new Error('A supplied GPUDevice cannot use the webgl backend.');
|
|
123
140
|
this._suppliedDevice = params.device;
|
|
141
|
+
this._textureBinding = params.textureBinding ?? 'atlas';
|
|
124
142
|
this._ownsDeviceSelection = !params.device;
|
|
125
143
|
this._backendChoice = params.device ? 'webgpu' : params.backend ?? 'auto';
|
|
126
144
|
this._sceneChangeDetector = new SceneChangeDetector();
|
|
@@ -184,8 +202,11 @@ export default class Engine {
|
|
|
184
202
|
resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;
|
|
185
203
|
if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {
|
|
186
204
|
this._committedScene = this._snapshot.capture(this.scene, changes);
|
|
187
|
-
|
|
205
|
+
// Preparing meshes the next upload replaces would only delay that upload.
|
|
206
|
+
if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) {
|
|
188
207
|
this._pendingMeshes = 'full';
|
|
208
|
+
this._bvhPreparationController?.abort();
|
|
209
|
+
}
|
|
189
210
|
else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full')
|
|
190
211
|
this._pendingMeshes = 'incremental';
|
|
191
212
|
for (const mesh of changes.transforms)
|
|
@@ -228,11 +249,23 @@ export default class Engine {
|
|
|
228
249
|
return;
|
|
229
250
|
const scene = this._committedScene ?? { meshes: [], lights: [] };
|
|
230
251
|
if (this._needsBVHPreparation(scene.meshes)) {
|
|
231
|
-
const
|
|
252
|
+
const controller = this._bvhPreparationController = new AbortController();
|
|
253
|
+
const task = this.prepare(scene, { signal: controller.signal, onProgress: progress => {
|
|
254
|
+
if (this._bvhPreparationController === controller)
|
|
255
|
+
this._events.emit('progress', { stage: 'bvh', progress });
|
|
256
|
+
} });
|
|
232
257
|
this._bvhPreparation = task;
|
|
233
|
-
|
|
234
|
-
this._bvhPreparation = undefined;
|
|
235
|
-
|
|
258
|
+
const finished = () => { if (this._bvhPreparation === task)
|
|
259
|
+
this._bvhPreparation = undefined; };
|
|
260
|
+
void task.then(() => { finished(); this._upload(); }, error => {
|
|
261
|
+
finished();
|
|
262
|
+
// Upload without prepared BVHs instead of retrying the same failure every frame.
|
|
263
|
+
if (!controller.signal.aborted) {
|
|
264
|
+
this._bvhFailedRevision = this._sceneRevision;
|
|
265
|
+
this._notifyError(error);
|
|
266
|
+
}
|
|
267
|
+
this._upload();
|
|
268
|
+
});
|
|
236
269
|
return;
|
|
237
270
|
}
|
|
238
271
|
const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));
|
|
@@ -276,11 +309,7 @@ export default class Engine {
|
|
|
276
309
|
...config,
|
|
277
310
|
builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',
|
|
278
311
|
useWorker, workerPool: this._bvhWorkerPool, isCancelled,
|
|
279
|
-
rebuild: false, onProgress:
|
|
280
|
-
if (this._bvhPreparation === preparation)
|
|
281
|
-
this._events.emit('progress', { stage: 'bvh', progress });
|
|
282
|
-
options.onProgress?.(progress);
|
|
283
|
-
}
|
|
312
|
+
rebuild: false, onProgress: options.onProgress
|
|
284
313
|
});
|
|
285
314
|
if (isCancelled())
|
|
286
315
|
return;
|
|
@@ -316,6 +345,8 @@ export default class Engine {
|
|
|
316
345
|
_needsBVHPreparation(meshes) {
|
|
317
346
|
if (this._bvhPreparation)
|
|
318
347
|
return true;
|
|
348
|
+
if (this._bvhFailedRevision === this._sceneRevision)
|
|
349
|
+
return false;
|
|
319
350
|
if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&
|
|
320
351
|
(!canUseBvhWorker() || this._bvhWorkerUnavailable)) {
|
|
321
352
|
return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));
|
|
@@ -335,16 +366,24 @@ export default class Engine {
|
|
|
335
366
|
if (preferWebGPU && (this._suppliedDevice || (typeof navigator !== 'undefined' && navigator.gpu))) {
|
|
336
367
|
try {
|
|
337
368
|
const gpu = typeof navigator !== 'undefined' ? navigator.gpu : undefined;
|
|
338
|
-
const
|
|
369
|
+
const shared = this._suppliedDevice ? undefined : await sharedDevice(gpu, this._textureBinding);
|
|
370
|
+
const gpuDevice = this._suppliedDevice ?? shared.device;
|
|
339
371
|
const gpuAdapterInfo = this._suppliedDevice
|
|
340
|
-
? gpuDevice.adapterInfo :
|
|
372
|
+
? gpuDevice.adapterInfo : shared?.adapterInfo;
|
|
373
|
+
const materialTextures = { requested: this._textureBinding };
|
|
374
|
+
if (this._textureBinding === 'auto') {
|
|
375
|
+
const support = resourceTableFeature(gpuDevice.features);
|
|
376
|
+
materialTextures.fallbackReason = shared?.fallbackReason ?? (support ? await probeBindless(gpuDevice, support) : 'Resource-table feature is not enabled on this device.');
|
|
377
|
+
if (!materialTextures.fallbackReason)
|
|
378
|
+
materialTextures.support = support;
|
|
379
|
+
}
|
|
341
380
|
if (this._disposed)
|
|
342
381
|
return;
|
|
343
382
|
validateDevice(gpuDevice);
|
|
344
383
|
this._gpuAdapterInfo = gpuAdapterInfo ?? undefined;
|
|
345
384
|
this._gpuDevice = gpuDevice;
|
|
346
385
|
this._pipeline = makeWGPURenderTargets(this.display.canvas, gpuDevice, {
|
|
347
|
-
presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm'
|
|
386
|
+
presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm', materialTextures
|
|
348
387
|
});
|
|
349
388
|
this._watchDevice(gpuDevice);
|
|
350
389
|
gpuCreated = true;
|
|
@@ -420,8 +459,6 @@ export default class Engine {
|
|
|
420
459
|
void device.lost.then(info => {
|
|
421
460
|
if (this._disposed || this._gpuDevice !== device)
|
|
422
461
|
return;
|
|
423
|
-
if (globalGPUDevice === device)
|
|
424
|
-
globalGPUDevice = null;
|
|
425
462
|
const recovering = this._ownsDeviceSelection;
|
|
426
463
|
const error = new Error(`WebGPU device lost (${info.reason}): ${info.message || 'device is unavailable'}`);
|
|
427
464
|
this._invalidateDevice(error, recovering);
|
|
@@ -515,7 +552,13 @@ export default class Engine {
|
|
|
515
552
|
if (!this._pipeline && !this._lastBvhBuild)
|
|
516
553
|
return;
|
|
517
554
|
const values = this._pipeline?.getDiagnostics();
|
|
518
|
-
|
|
555
|
+
const materialTextures = values?.materialTextures ?? (this._pipeline ? {
|
|
556
|
+
requested: this._textureBinding, active: 'atlas',
|
|
557
|
+
fallbackReason: this._textureBinding === 'auto' ? 'Bindless textures require a supported WebGPU device.' : undefined,
|
|
558
|
+
textureCount: values?.textureAtlas?.textureCount ?? 0, estimatedBytes: values?.textureAtlas?.estimatedBytes ?? 0,
|
|
559
|
+
scale: values?.textureAtlas?.scale ?? 1, metadataBytes: 0, resourceTableCapacity: 0, retiredBytes: 0
|
|
560
|
+
} : undefined);
|
|
561
|
+
return { ...values, materialTextures, bvh: { ...values?.bvh, lastBuild: this._lastBvhBuild }, backend: this.backend, adapterName: this._adapterName(), width: this.display.canvas.width, height: this.display.canvas.height,
|
|
519
562
|
lastError: this.lastError?.message, webgpuFallbackReason: this._webgpuFallbackReason,
|
|
520
563
|
presentedTarget: this._presented?.label, presentedComplete: this._presented?.presentationComplete ?? false };
|
|
521
564
|
}
|
|
@@ -541,6 +584,7 @@ export default class Engine {
|
|
|
541
584
|
return;
|
|
542
585
|
this._disposed = true;
|
|
543
586
|
this._bvhPreparationRevision++;
|
|
587
|
+
this._bvhPreparationController?.abort();
|
|
544
588
|
this._lossController?.abort(new Error('Engine is disposed.'));
|
|
545
589
|
this._lossController = undefined;
|
|
546
590
|
this._contextRestore?.reject(new Error('Engine is disposed.'));
|
|
@@ -574,6 +618,7 @@ export default class Engine {
|
|
|
574
618
|
/** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }
|
|
575
619
|
/** @internal */ _releaseTarget(target) { if (this._presented === target)
|
|
576
620
|
this._presented = undefined; this._pipeline?.releaseTarget(target); }
|
|
621
|
+
/** @internal */ _isPresented(target) { return !!target && this._presented === target; }
|
|
577
622
|
/** @internal */ _present(target) { target.activate(); target.present(); this._presented = target; }
|
|
578
623
|
/** @internal */ _notifyError(value) {
|
|
579
624
|
const error = value instanceof Error ? value : new Error(String(value));
|
|
@@ -674,11 +719,28 @@ export default class Engine {
|
|
|
674
719
|
await denoiser.prepare?.({ device, width, height });
|
|
675
720
|
this._customPrepared.set(denoiser, { device, width, height });
|
|
676
721
|
}
|
|
677
|
-
/** @internal */ _enqueueDenoise(work) {
|
|
722
|
+
/** @internal A cancelled job loses its lease if it does not settle within the grace period. */ _enqueueDenoise(work, signal) {
|
|
678
723
|
const task = this._denoiseTail.then(async () => {
|
|
679
724
|
const device = this._gpuDevice, generation = this._deviceRevision;
|
|
725
|
+
let settle;
|
|
680
726
|
try {
|
|
681
|
-
|
|
727
|
+
if (!signal)
|
|
728
|
+
return await work();
|
|
729
|
+
const abandoned = new Promise(resolve => {
|
|
730
|
+
const expire = () => setTimeout(() => {
|
|
731
|
+
console.warn('A cancelled denoiser did not settle; continuing without it.');
|
|
732
|
+
resolve(undefined);
|
|
733
|
+
}, CANCELLED_DENOISE_GRACE_MS);
|
|
734
|
+
const running = work().finally(() => { clearTimeout(timer); signal.removeEventListener('abort', onAbort); });
|
|
735
|
+
let timer;
|
|
736
|
+
const onAbort = () => { timer = expire(); };
|
|
737
|
+
if (signal.aborted)
|
|
738
|
+
onAbort();
|
|
739
|
+
else
|
|
740
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
741
|
+
settle = running;
|
|
742
|
+
});
|
|
743
|
+
return await Promise.race([settle, abandoned]);
|
|
682
744
|
}
|
|
683
745
|
finally {
|
|
684
746
|
// Cancelling tiled OIDN stops future tiles, not the commands already
|
package/lib/Engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from './scene/InstancedMesh.js';\nimport { bvhConfig, engineSettingsKey, workerCount, textureBudget } from './settings/engine.js';\nimport {createCanvas} from './util/canvas.js';\nimport Camera from './scene/Camera.js';\nimport {getRecommendedDeviceDescriptor, validateDevice} from './renderer/deviceRequirements.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { Scene } from './scene/Scene.js';\nimport type Mesh from './scene/Mesh.js';\nimport type Geometry from './scene/Geometry.js';\nimport Display from './Display.js';\nimport type Render from './Render.js';\nimport { Events } from './util/events.js';\nimport { SceneChangeDetector, snapshotFields, snapshotsEqual } from './renderer/sceneChangeDetector.js';\nimport { CommittedScene } from './renderer/committedScene.js';\nimport { validateSceneLights } from './renderer/lightsUtil.js';\nimport { ensureMeshGeometryAttributes, meshNeedsStaticBvh, getPreparedMeshGeometry } from './renderer/prepareMeshBVH.js';\nimport { getGeometryBvh, type BvhBuildConfig } from './renderer/geometryBvh.js';\nimport { prepareStaticBvhs } from './renderer/staticBvhPreparation.js';\nimport { canUseBvhWorker, BvhWorkerPool, resolveBvhWorkerCount } from './renderer/bvhWorkerClient.js';\nimport { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './renderer/MaterialTable.js';\nimport { packDepthSampleArea, type DepthSampleArea } from './renderer/depthQuery.js';\nimport { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';\nimport { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';\nimport { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';\nimport type { RenderPipeline, RenderTarget } from './renderer/renderPipeline.js';\nimport type { RenderingDiagnostics } from './renderer/RenderingPipeline.js';\nimport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\nimport type {OwnedDenoiser} from './renderer/denoiser.js';\nimport type {Denoiser} from './Render.js';\nexport type { DepthSampleArea } from './renderer/depthQuery.js';\n\n/** BLAS implementation; default builtin. */\nexport type BVHBuilder = 'tinybvh' | 'builtin';\n/** Optional CPU preparation settings. */\nexport interface PrepareOptions {\n /** Completed BLAS fraction 0–1. Default undefined. */ onProgress?: (progress: number) => void;\n /** Cancels preparation. Default undefined. */ signal?: AbortSignal;\n}\n/** Engine construction settings. */\nexport interface EngineParams {\n /** Default display canvas. Default a new HTML canvas, or OffscreenCanvas without document. */ canvas?: HTMLCanvasElement | OffscreenCanvas;\n /** Backend selection. Default auto, with WebGL fallback. webgpu requires WebGPU. */ backend?: 'auto' | 'webgpu' | 'webgl';\n /** Caller-owned WebGPU device. Default undefined uses a shared device. Implies webgpu; incompatible with webgl. */ device?: GPUDevice;\n}\n/** Material-atlas device limits. */\nexport interface TextureAtlasLimits { maxTextureArrayLayers: number; maxTextureDimension2D: number; }\n/** Initialization result. */\nexport interface EngineInfo {\n backend: 'webgpu' | 'webgl'; adapterName: string; webgpuFallbackReason?: string; limits: TextureAtlasLimits;\n}\n/** Device and target diagnostics; Per-target GPU bytes exclude shared scene, temporary passes and driver costs. */\nexport interface EngineDiagnostics extends RenderingDiagnostics {\n backend: 'webgpu' | 'webgl' | undefined; adapterName: string;\n width: number; height: number; lastError?: string; webgpuFallbackReason?: string;\n}\ninterface EngineEvents {\n progress: { stage: 'device' | 'bvh' | 'shaders'; progress: number };\n error: Error;\n devicelost: { reason: string; recovering: boolean };\n}\nlet globalGPUDevice: GPUDevice | null = null;\nlet globalGPUAdapterInfo: GPUAdapterInfo | null = null;\nlet globalGPURequest: Promise<GPUDevice> | undefined;\nasync function sharedDevice(gpu: GPU): Promise<GPUDevice> {\n if (globalGPUDevice) return globalGPUDevice;\n if (!globalGPURequest) {\n const request = (async () => {\n const adapter = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!adapter) throw new Error('No WebGPU adapter is available');\n const device = await adapter.requestDevice(getRecommendedDeviceDescriptor(adapter));\n globalGPUAdapterInfo = (adapter as GPUAdapter & {info?: GPUAdapterInfo}).info ?? null;\n globalGPUDevice = device;\n void device.lost.then(() => { if (globalGPUDevice === device) globalGPUDevice = null; });\n return device;\n })();\n globalGPURequest = request;\n void request.finally(() => { if (globalGPURequest === request) globalGPURequest = undefined; }).catch(() => {});\n }\n return globalGPURequest;\n}\n\n/** Shared device, committed scene/camera, CPU preparation and denoiser ownership. */\nexport default class Engine {\n /** Source scene, accepted only by update(). Default undefined. */ scene: Scene | undefined;\n /** Source camera, accepted only by update(). Default undefined. */ camera: Camera | undefined;\n /** Default canvas and display settings. */ readonly display: Display;\n /** Static BLAS builder. Default builtin. */ bvhBuilder: BVHBuilder = 'builtin';\n /** Static BLAS layout. Default bvh2; dynamic geometry uses bvh2. */ bvhLayout: TinyBvhLayout = 'bvh2';\n /** Enable TinyBVH spatial splits. Default false. */ bvhSpatialSplits = false;\n /** Material texture budget in bytes. Default 384 MiB. */ textureAtlasBudgetBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n /** Maximum CPU BVH workers. Default auto (hardware concurrency minus one, clamped 1–4). */\n get bvhWorkerCount(): number | 'auto' { return this._bvhWorkerCount; }\n set bvhWorkerCount(count: number | 'auto') { resolveBvhWorkerCount(count); this._bvhWorkerCount = count; }\n private _bvhWorkerCount: number | 'auto' = 'auto';\n private _bvhWorkerPool?: BvhWorkerPool;\n private _bvhPreparationRevision = 0;\n private _bvhPreparation?: Promise<void>;\n private _bvhPreparationTail: Promise<unknown> = Promise.resolve();\n private _tinyBvhUnavailable = false;\n private _bvhWorkerUnavailable = false;\n private _bvhPreparedGeometry = new WeakMap<Mesh, [Geometry, number]>();\n private _lastBvhBuild?: { geometryCount: number; bvhTimeMs: number };\n private _lastBvhSettings = '';\n private _lastBudget = -1;\n private _shaderProgress = '';\n private _events = new Events<EngineEvents>();\n private _pipeline?: RenderPipeline;\n private _webglRenderer?: WebGLRenderer;\n private _gpuDevice?: GPUDevice;\n private _suppliedDevice?: GPUDevice;\n private readonly _ownsDeviceSelection: boolean;\n private _deviceRevision = 0;\n private _lossController?: AbortController;\n private _deviceLossError?: Error;\n private _webglListening = false;\n private _webglLost = false;\n private _recoverWebGL = false;\n private _contextRestore?: {promise: Promise<void>; resolve: () => void; reject: (error: Error) => void};\n private _gpuAdapterInfo?: GPUAdapterInfo;\n private _backendChoice: NonNullable<EngineParams['backend']>;\n private _initPromise?: Promise<EngineInfo>;\n private _info?: EngineInfo;\n private _pipelineInitError?: Error;\n private _webgpuFallbackReason?: string;\n private _reportedErrors = new WeakSet<Error>();\n private _loggedErrorMessages = new Set<string>();\n private _sceneChangeDetector: SceneChangeDetector;\n private _snapshot = new CommittedScene();\n private _sourceScene?: Scene;\n private _committedScene?: Scene;\n private _sourceCamera?: Camera;\n private _committedCamera?: Camera;\n private _cameraFields: unknown[] = [];\n private _sceneRevision = 0;\n private _cameraRevision = 0;\n private _uploadedRevision = -1;\n private _pendingMeshes: 'none' | 'incremental' | 'full' = 'full';\n private _pendingTransforms = new Set<Mesh>();\n private _pendingColors = new Set<InstancedMesh>();\n private _pendingGeometries = new Set<Geometry>();\n private _pendingMaterials = new Set<import('./scene/OpenPBRMaterial.js').default>();\n private _pendingLights = true;\n private _pendingBackground = true;\n private _disposed = false;\n private _readingDepth = false;\n private _renders = new Set<Render>();\n private _targetCounter = 0;\n private _presented?: RenderTarget;\n private _denoisers = new Set<OwnedDenoiser>();\n private _denoiserCache = new Map<string, {references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _denoiserEntries = new WeakMap<OwnedDenoiser, {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _weights = new Map<string, Promise<ArrayBuffer>>();\n private _customPrepared = new WeakMap<Denoiser, {device: GPUDevice; width: number; height: number}>();\n private _denoiseTail: Promise<unknown> = Promise.resolve();\n private _lastError: Error | undefined;\n /** Most recent synchronous engine/render failure. Default undefined. */\n get lastError() { return this._lastError; }\n /** @internal */ _setRenderError(error?: Error) { this._lastError = error ?? this._pipelineInitError; }\n\n constructor(params: EngineParams = {}) {\n if (params.device && params.backend === 'webgl') throw new Error('A supplied GPUDevice cannot use the webgl backend.');\n this._suppliedDevice = params.device;\n this._ownsDeviceSelection = !params.device;\n this._backendChoice = params.device ? 'webgpu' : params.backend ?? 'auto';\n this._sceneChangeDetector = new SceneChangeDetector();\n this.display = Display._create(this, params.canvas ?? createCanvas());\n }\n /** Initializes once; concurrent/repeated calls share the result. */\n init(): Promise<EngineInfo> {\n return this._initPromise ??= (async () => {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._pipelineInitError && !this._ownsDeviceSelection) throw this._pipelineInitError;\n const revision = this._deviceRevision;\n if (this._contextRestore) await this._contextRestore.promise;\n if (this._disposed) throw new Error('Engine is disposed.');\n await this._initPipeline(this._backendChoice !== 'webgl' && !this._recoverWebGL);\n if (revision !== this._deviceRevision) throw this._deviceLossError;\n if (this._pipelineInitError) throw this._pipelineInitError;\n if (this._disposed) { this._pipeline?.dispose(); throw new Error('Engine is disposed.'); }\n const gl = this._webglRenderer?.gl, limits = this._gpuDevice?.limits;\n this._info = { backend: this._gpuDevice ? 'webgpu' : 'webgl', adapterName: this._adapterName(), webgpuFallbackReason: this._webgpuFallbackReason,\n limits: { maxTextureArrayLayers: limits?.maxTextureArrayLayers ?? gl?.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS), maxTextureDimension2D: limits?.maxTextureDimension2D ?? gl?.getParameter(gl.MAX_TEXTURE_SIZE) } };\n this._upload();\n return this._info;\n })();\n }\n /** Initialization info. Default undefined until init resolves. */ get info() { return this._info; }\n /** Active backend. Default undefined until initialization completes. */ get backend() { return this._info?.backend; }\n /** GPU device. Default undefined before initialization and on WebGL. */ get device() { return this._gpuDevice; }\n /** Subscribes to shared progress/errors/device loss; returns unsubscribe. */\n on<K extends keyof EngineEvents>(event: K, listener: (value: EngineEvents[K]) => void): () => void { return this._events.on(event, listener); }\n\n /** The sole external edit detection/commit point. Returns whether inputs changed. */\n update(): boolean {\n if (this._disposed) throw new Error('Engine is disposed.');\n this._lastError = this._pipelineInitError;\n let changed = false, resetTiming = false;\n const cameraFields = this.camera ? snapshotFields(this.camera) : [];\n if (this.camera !== this._sourceCamera || !snapshotsEqual(cameraFields, this._cameraFields)) {\n this._sourceCamera = this.camera; this._cameraFields = cameraFields;\n this._committedCamera = this.camera ? cameraSnapshot(this.camera) : undefined; this._cameraRevision++; changed = true;\n }\n const bvhSettings = engineSettingsKey(this, 'bvh');\n const force = bvhSettings !== this._lastBvhSettings || textureBudget(this) !== this._lastBudget;\n if (this.scene !== this._sourceScene || force) this._sceneChangeDetector.reset();\n if (this.scene) {\n validateSceneLights(this.scene.lights, error => this._notifyError(error));\n ensureMeshGeometryAttributes(this.scene.meshes);\n const changes = this._sceneChangeDetector.detect(this.scene);\n resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;\n if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {\n this._committedScene = this._snapshot.capture(this.scene, changes);\n if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) this._pendingMeshes = 'full';\n else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full') this._pendingMeshes = 'incremental';\n for (const mesh of changes.transforms) this._pendingTransforms.add(this._snapshot.mirror(mesh));\n for (const mesh of changes.colors) this._pendingColors.add(this._snapshot.mirror(mesh));\n for (const geometry of changes.geometries) this._pendingGeometries.add(this._snapshot.mirror(geometry));\n for (const material of changes.materials) this._pendingMaterials.add(this._snapshot.mirror(material));\n this._pendingLights ||= changes.lights;\n this._pendingBackground ||= changes.background;\n this._sceneRevision++; changed = true;\n }\n this._sceneChangeDetector.commit();\n } else if (this._sourceScene) { this._committedScene = undefined; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true; this._sceneRevision++; changed = true; }\n this._sourceScene = this.scene; this._lastBvhSettings = bvhSettings; this._lastBudget = textureBudget(this);\n if (!this._pipeline) void this.init().catch(() => {});\n if (changed) for (const render of this._renders) render._inputsChanged(resetTiming);\n this._upload();\n return changed;\n }\n private _upload() {\n const pipeline = this._pipeline;\n if (!pipeline || this._disposed || this._bvhPreparation || this._uploadedRevision === this._sceneRevision) return;\n const scene = this._committedScene ?? { meshes: [], lights: [] };\n if (this._needsBVHPreparation(scene.meshes)) {\n const task = this.prepare(scene); this._bvhPreparation = task;\n void task.then(() => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; this._upload(); }, error => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; this._notifyError(error); });\n return;\n }\n const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));\n if (this._pendingMeshes !== 'none' || budgetChanged) pipeline.setMeshes(scene.meshes, this._pendingMeshes === 'full' || budgetChanged ? undefined : {\n transforms: [...this._pendingTransforms], colors: [...this._pendingColors], geometries: [...this._pendingGeometries], materials: [...this._pendingMaterials]\n });\n if (this._pendingLights) pipeline.setLights(scene.lights);\n if (this._pendingBackground) pipeline.setBackground(scene.background);\n this._pendingMeshes = 'none'; this._pendingLights = false; this._pendingBackground = false;\n this._pendingTransforms.clear(); this._pendingColors.clear(); this._pendingGeometries.clear(); this._pendingMaterials.clear();\n this._uploadedRevision = this._sceneRevision;\n }\n private _bvhConfig(): BvhBuildConfig { return bvhConfig(this); }\n /** Builds static CPU BVHs for this scene without replacing GPU inputs. Options default undefined. */\n prepare(scene: Scene, options: PrepareOptions = {}): Promise<void> {\n const revision = this._bvhPreparationRevision;\n const preparation = this._bvhPreparationTail.then(async () => {\n const isCancelled = () => revision !== this._bvhPreparationRevision || options.signal?.aborted === true;\n if (isCancelled()) return;\n const meshes = scene.meshes;\n const useWorker = canUseBvhWorker() && !this._bvhWorkerUnavailable;\n if (useWorker) {\n const count = workerCount(this);\n if (this._bvhWorkerPool?.size !== count) {\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = new BvhWorkerPool(count);\n }\n }\n const config = this._bvhConfig();\n const result = await prepareStaticBvhs(meshes, {\n config,\n ...config,\n builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',\n useWorker, workerPool: this._bvhWorkerPool, isCancelled,\n rebuild: false, onProgress: progress => {\n if (this._bvhPreparation === preparation) this._events.emit('progress', {stage: 'bvh', progress});\n options.onProgress?.(progress);\n }\n });\n if (isCancelled()) return;\n if (result.workerUnavailable && !this._bvhWorkerUnavailable) {\n this._bvhWorkerUnavailable = true;\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = undefined;\n console.warn('BVH preparation failed; falling back to the calling-thread BVH builder.');\n }\n if (result.tinyBvhUnavailable && !this._tinyBvhUnavailable) {\n this._tinyBvhUnavailable = true;\n console.warn('BVH preparation failed; falling back to the built-in BVH builder.');\n }\n result.failedMeshes.forEach(mesh => {\n this._bvhPreparedGeometry.set(mesh, [mesh.geometry, mesh.geometry.version]);\n });\n\n this._lastBvhBuild = { geometryCount: result.geometryCount, bvhTimeMs: result.bvhTimeMs };\n });\n this._bvhPreparationTail = preparation.catch(() => undefined);\n const signal = options.signal;\n if (!signal) return preparation;\n return new Promise<void>((resolve, reject) => {\n const aborted = () => reject(signal.reason ?? new DOMException('BVH preparation aborted', 'AbortError'));\n if (signal.aborted) { aborted(); return; }\n signal.addEventListener('abort', aborted, { once: true });\n preparation.then(resolve, reject).finally(() => signal.removeEventListener('abort', aborted));\n });\n }\n\n private _needsBVHPreparation(meshes: Mesh[]) {\n if (this._bvhPreparation) return true;\n if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&\n (!canUseBvhWorker() || this._bvhWorkerUnavailable)) {\n return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));\n }\n return meshes.some((mesh) => {\n const prepared = this._bvhPreparedGeometry.get(mesh);\n const attempted = prepared?.[0] === mesh.geometry &&\n prepared[1] === mesh.geometry.version;\n return !attempted && meshNeedsStaticBvh(mesh, this._bvhConfig());\n });\n }\n\n private async _initPipeline(preferWebGPU: boolean) {\n let gpuCreated = false;\n try {\n\n this._events.emit('progress', {stage: 'device', progress: 0});\n this._pipelineInitError = undefined;\n if (preferWebGPU && (this._suppliedDevice || (typeof navigator !== 'undefined' && navigator.gpu))) {\n try {\n const gpu = typeof navigator !== 'undefined' ? navigator.gpu : undefined;\n const gpuDevice = this._suppliedDevice ?? await sharedDevice(gpu!);\n const gpuAdapterInfo = this._suppliedDevice\n ? (gpuDevice as GPUDevice & {adapterInfo?: GPUAdapterInfo}).adapterInfo : globalGPUAdapterInfo;\n if (this._disposed) return;\n validateDevice(gpuDevice);\n this._gpuAdapterInfo = gpuAdapterInfo ?? undefined;\n this._gpuDevice = gpuDevice;\n this._pipeline = makeWGPURenderTargets(this.display.canvas, gpuDevice, {\n presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm'\n });\n this._watchDevice(gpuDevice);\n gpuCreated = true;\n } catch (e) {\n if (this._backendChoice === 'webgpu') throw e;\n this._webgpuFallbackReason = e instanceof Error ? e.message : String(e);\n this._gpuDevice = undefined;\n this._gpuAdapterInfo = undefined;\n }\n }\n if (!gpuCreated) {\n if (this._backendChoice === 'webgpu') throw new Error('WebGPU is not available in this environment');\n if (preferWebGPU && !this._webgpuFallbackReason) {\n this._webgpuFallbackReason = 'WebGPU is not available in this environment';\n }\n this._webglRenderer = new WebGLRenderer({\n canvas: this.display.canvas,\n alpha: true,\n depth: true,\n stencil: false,\n antialias: false,\n pixelRatio: 1,\n preserveDrawingBuffer: true,\n // PENDING\n premultipliedAlpha: false,\n parallelShaderCompile: true,\n powerPreference: 'high-performance'\n });\n\n this._pipeline = makeWebGLRenderTargets(this._webglRenderer);\n if (!this._webglListening) {\n this._webglListening = true;\n this.display.canvas.addEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.addEventListener('webglcontextrestored', this._onContextRestored);\n }\n this._recoverWebGL = false;\n }\n\n\n } catch (error) {\n this._pipelineInitError = error instanceof Error ? error : new Error(String(error));\n this._lastError = this._pipelineInitError;\n this._notifyError(this._pipelineInitError);\n } finally {\n\n this._events.emit('progress', {stage: 'device', progress: 1});\n }\n }\n\n private _onContextLost = (event: Event) => {\n event.preventDefault();\n if (this._disposed || this._webglLost) return;\n this._webglLost = true; this._recoverWebGL = true;\n let resolve!: () => void, reject!: (error: Error) => void;\n const promise = new Promise<void>((done, fail) => {resolve = done; reject = fail;});\n void promise.catch(() => {});\n this._contextRestore = {promise, resolve, reject};\n const error = new Error(`WebGL context lost: ${(event as WebGLContextEvent).statusMessage || 'context is unavailable'}`);\n this._invalidateDevice(error, true);\n this._events.emit('devicelost', {reason: 'webglcontextlost', recovering: true});\n };\n private _onContextRestored = () => {\n if (this._disposed || !this._webglLost) return;\n this._webglLost = false;\n const restore = this._contextRestore; this._contextRestore = undefined; restore?.resolve();\n };\n private _watchDevice(device: GPUDevice) {\n void device.lost.then(info => {\n if (this._disposed || this._gpuDevice !== device) return;\n if (globalGPUDevice === device) globalGPUDevice = null;\n const recovering = this._ownsDeviceSelection;\n const error = new Error(`WebGPU device lost (${info.reason}): ${info.message || 'device is unavailable'}`);\n this._invalidateDevice(error, recovering);\n this._events.emit('devicelost', {reason: info.reason, recovering});\n if (!recovering) this._notifyError(error);\n });\n }\n private _invalidateDevice(error: Error, recovering: boolean) {\n this._deviceLossError = error; this._deviceRevision++;\n this._lossController?.abort(error); this._lossController = undefined;\n for (const render of this._renders) render._deviceLost(recovering);\n this._pipeline?.dispose(); this._pipeline = undefined;\n this._webglRenderer?.dispose(); this._webglRenderer = undefined;\n this._gpuDevice = undefined; this._gpuAdapterInfo = undefined;\n this._info = undefined; this._initPromise = undefined;\n this._pipelineInitError = recovering ? undefined : error; this._lastError = error;\n this._presented = undefined; this._shaderProgress = '';\n this._uploadedRevision = -1; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true;\n this._sceneRevision++;\n this._customPrepared = new WeakMap();\n for (const filter of [...this._denoisers]) {\n const entry = this._denoiserEntries.get(filter); if (entry) entry.references = 1;\n this._releaseDenoiser(filter);\n }\n this._denoiserCache.clear();\n }\n /** Replaces a caller-owned device after validation. Only available on engines\n * constructed with device; the next update/refine uploads the committed scene.\n */\n async setDevice(device: GPUDevice): Promise<void> {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._ownsDeviceSelection) throw new Error('setDevice requires an engine constructed with device.');\n try { validateDevice(device); }\n catch (error) {this._lastError = this._notifyError(error); throw error;}\n if (this._gpuDevice === device && !this._pipelineInitError) return;\n this._invalidateDevice(new Error('WebGPU device replaced during converge.'), true);\n this._suppliedDevice = device;\n }\n /** @internal Device loss rejects pending waits without relying on driver completion. */\n _awaitDevice<T>(work: Promise<T>): Promise<T> {\n const signal = (this._lossController ??= new AbortController()).signal;\n return new Promise((resolve, reject) => {\n const lost = () => reject(signal.reason);\n signal.addEventListener('abort', lost, {once: true});\n work.then(resolve, reject).finally(() => signal.removeEventListener('abort', lost));\n });\n }\n /** @internal */ get _deviceGeneration() { return this._deviceRevision; }\n /** @internal */ get _lostError() { return this._deviceLossError; }\n\n private _adapterName() {\n if (this._gpuAdapterInfo) return this._gpuAdapterInfo.description || this._gpuAdapterInfo.vendor || 'WebGPU';\n const gl = this._webglRenderer?.gl, extension = gl?.getExtension('WEBGL_debug_renderer_info');\n return extension && gl ? gl.getParameter(extension.UNMASKED_RENDERER_WEBGL) : this._webglRenderer ? 'WebGL 2' : this._gpuDevice ? 'WebGPU' : '';\n }\n /** @internal */ _reportShaderProgress() {\n const compilation = this._pipeline?.getDiagnostics().shaderCompilation;\n if (!compilation) return;\n const key = `${compilation.status}/${compilation.completedPipelineCount}/${compilation.pipelineCount}`;\n if (key === this._shaderProgress) return;\n this._shaderProgress = key;\n this._events.emit('progress', {stage: 'shaders', progress: compilation.pipelineCount ? compilation.completedPipelineCount / compilation.pipelineCount : 1});\n }\n /** Current shared preparation and resident target statistics. Default undefined before any work. */\n getDiagnostics(): EngineDiagnostics | undefined {\n if (!this._pipeline && !this._lastBvhBuild) return;\n const values = this._pipeline?.getDiagnostics();\n return { ...values, bvh: {...values?.bvh, lastBuild: this._lastBvhBuild}, backend: this.backend, adapterName: this._adapterName(), width: this.display.canvas.width, height: this.display.canvas.height,\n lastError: this.lastError?.message, webgpuFallbackReason: this._webgpuFallbackReason,\n presentedTarget: this._presented?.label, presentedComplete: this._presented?.presentationComplete ?? false };\n }\n /** Queries a 7×7 depth grid using the committed engine camera. Default undefined until GPU data is ready. */\n async readDepthSamples(area: DepthSampleArea): Promise<Float32Array | undefined> {\n packDepthSampleArea(area, 1);\n if (!this._ready || !this._committedCamera || this._readingDepth) return;\n this._readingDepth = true;\n try {\n const camera = cameraSnapshot(this._committedCamera);\n camera.aspect ??= this.display.canvas.width / this.display.canvas.height;\n const result = await this._pipeline!.readDepthSamples(camera, area);\n return this._disposed ? undefined : result;\n }\n finally { this._readingDepth = false; }\n }\n /** Releases all renders, shared resources, CPU workers and owned denoisers. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._bvhPreparationRevision++;\n this._lossController?.abort(new Error('Engine is disposed.')); this._lossController = undefined;\n this._contextRestore?.reject(new Error('Engine is disposed.')); this._contextRestore = undefined;\n if (this._webglListening) {\n this.display.canvas.removeEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.removeEventListener('webglcontextrestored', this._onContextRestored);\n }\n for (const render of [...this._renders]) render.dispose();\n this._pipeline?.dispose(); this._pipeline = undefined; this._webglRenderer?.dispose(); this._bvhWorkerPool?.dispose();\n for (const denoiser of [...this._denoisers]) { const entry = this._denoiserEntries.get(denoiser); if (entry) entry.references = 1; this._releaseDenoiser(denoiser); }\n this._denoiserCache.clear();\n this._weights.clear(); this._events.clear();\n }\n /** @internal */ get _initializationError() { return this._pipelineInitError; }\n /** @internal */ get _ready() { return !!this._pipeline && this._uploadedRevision === this._sceneRevision && !!this._committedScene && !!this._committedCamera && !this._disposed; }\n /** @internal */ get _inputs() { return {scene: this._sceneRevision, camera: this._cameraRevision, value: this._committedCamera}; }\n /** @internal */ _register(render: Render) { if (this._disposed) throw new Error('Engine is disposed.'); this._renders.add(render); }\n /** @internal */ _unregister(render: Render) { this._renders.delete(render); }\n /** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }\n /** @internal */ _releaseTarget(target: RenderTarget) { if (this._presented === target) this._presented = undefined; this._pipeline?.releaseTarget(target); }\n /** @internal */ _present(target: RenderTarget) { target.activate(); target.present(); this._presented = target; }\n /** @internal */ _notifyError(value: unknown): Error {\n const error = value instanceof Error ? value : new Error(String(value));\n if (!this._loggedErrorMessages.has(error.message)) { this._loggedErrorMessages.add(error.message); console.error(`Path tracing failed: ${error.message}`, error); }\n if (!this._reportedErrors.has(error)) { this._reportedErrors.add(error); this._events.emit('error', error); }\n return error;\n }\n /** @internal */ _getWeights(url: string, load: () => Promise<ArrayBuffer>) {\n let pending = this._weights.get(url);\n if (!pending) { pending = load(); this._weights.set(url, pending); void pending.catch(() => { if (this._weights.get(url) === pending) this._weights.delete(url); }); }\n return pending;\n }\n /** @internal */ _retainDenoiser<T extends OwnedDenoiser>(key: string, create: () => T): T {\n let entry = this._denoiserCache.get(key);\n if (!entry?.value) {\n const value = this._ownDenoiser(create());\n const next = {key, references: 0, value};\n this._denoiserCache.set(key, next); this._denoiserEntries.set(value, next); entry = next;\n }\n entry.references++; return entry.value as T;\n }\n /** @internal */ async _acquireDenoiser(key: string, create: () => Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>>): Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>> {\n let entry = this._denoiserCache.get(key);\n if (!entry) {\n const next: {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>} = {key, references: 0};\n const revision = this._deviceRevision;\n next.pending = create().then(filter => {\n if (revision !== this._deviceRevision) { this._disposeDenoiser(filter); throw this._deviceLossError; }\n next.value = this._ownDenoiser(filter); this._denoiserEntries.set(filter, next); return filter; });\n this._denoiserCache.set(key, next); entry = next;\n }\n entry.references++;\n try { return (entry.value ?? await entry.pending!) as Extract<OwnedDenoiser, {kind: 'oidn'}>; }\n catch (error) { entry.references--; if (this._denoiserCache.get(key) === entry) this._denoiserCache.delete(key); throw error; }\n }\n /** @internal */ _ownDenoiser<T extends OwnedDenoiser>(denoiser: T): T {\n if (this._disposed) { this._disposeDenoiser(denoiser); throw new Error('Engine is disposed.'); }\n this._denoisers.add(denoiser); return denoiser;\n }\n /** @internal */ _releaseDenoiser(denoiser: OwnedDenoiser) {\n const entry = this._denoiserEntries.get(denoiser);\n if (entry && --entry.references > 0) return;\n if (entry && this._denoiserCache.get(entry.key) === entry) this._denoiserCache.delete(entry.key);\n this._denoiserEntries.delete(denoiser);\n if (!this._denoisers.delete(denoiser)) return;\n this._disposeDenoiser(denoiser);\n }\n private _disposeDenoiser(denoiser: OwnedDenoiser) {\n if (denoiser.kind === 'oidn') { denoiser.denoiser.auxiliaryDenoisers?.albedo.dispose(); denoiser.denoiser.auxiliaryDenoisers?.normal.dispose(); }\n denoiser.denoiser.dispose();\n }\n /** @internal Called only while holding the shared inference lease. */\n async _prepareCustomDenoiser(denoiser: Denoiser, width: number, height: number) {\n const device = this.device;\n if (!device) throw new Error('Custom denoising requires WebGPU.');\n const previous = this._customPrepared.get(denoiser);\n if (previous?.device === device && previous.width === width && previous.height === height) return;\n await denoiser.prepare?.({device, width, height});\n this._customPrepared.set(denoiser, {device, width, height});\n }\n /** @internal */ _enqueueDenoise<T>(work: () => Promise<T>): Promise<T> {\n const task = this._denoiseTail.then(async () => {\n const device = this._gpuDevice, generation = this._deviceRevision;\n try { return await work(); }\n finally {\n // Cancelling tiled OIDN stops future tiles, not the commands already\n // submitted. Keep the shared scratch lease until those commands finish\n // so rapid edits cannot pile up inference or resize its inputs in flight.\n // A lost/disposed device must release the lease without waiting for a\n // queue that may never complete.\n if (device && device === this._gpuDevice && generation === this._deviceRevision && !this._disposed) {\n await this._awaitDevice(device.queue.onSubmittedWorkDone()).catch(() => {});\n }\n }\n });\n this._denoiseTail = task.catch(() => {}); return task;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Engine.js","sourceRoot":"","sources":["../src/Engine.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from './scene/InstancedMesh.js';\nimport { bvhConfig, engineSettingsKey, workerCount, textureBudget } from './settings/engine.js';\nimport {createCanvas} from './util/canvas.js';\nimport Camera from './scene/Camera.js';\nimport {getRecommendedDeviceDescriptor, validateDevice} from './renderer/deviceRequirements.js';\nimport {probeBindless, resourceTableFeature, type MaterialTextureSelection} from './renderer/wgpuBindless.js';\nimport { cameraSnapshot } from './renderer/cameraSnapshot.js';\nimport type { Scene } from './scene/Scene.js';\nimport type Mesh from './scene/Mesh.js';\nimport type Geometry from './scene/Geometry.js';\nimport Display from './Display.js';\nimport type Render from './Render.js';\nimport { Events } from './util/events.js';\nimport { SceneChangeDetector, snapshotFields, snapshotsEqual } from './renderer/sceneChangeDetector.js';\nimport { CommittedScene } from './renderer/committedScene.js';\nimport { validateSceneLights } from './renderer/lightsUtil.js';\nimport { ensureMeshGeometryAttributes, meshNeedsStaticBvh, getPreparedMeshGeometry } from './renderer/prepareMeshBVH.js';\nimport { getGeometryBvh, type BvhBuildConfig } from './renderer/geometryBvh.js';\nimport { prepareStaticBvhs } from './renderer/staticBvhPreparation.js';\nimport { canUseBvhWorker, BvhWorkerPool, resolveBvhWorkerCount } from './renderer/bvhWorkerClient.js';\nimport { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './renderer/MaterialTable.js';\nimport { packDepthSampleArea, type DepthSampleArea } from './renderer/depthQuery.js';\nimport { makeWGPURenderTargets } from './renderer/WGPURenderingPipeline.js';\nimport { makeWebGLRenderTargets } from './renderer/WebGLRenderingPipeline.js';\nimport { WebGLDevice as WebGLRenderer } from './renderer/webgl.js';\nimport type { RenderPipeline, RenderTarget } from './renderer/renderPipeline.js';\nimport type { RenderingDiagnostics } from './renderer/RenderingPipeline.js';\nimport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\nimport type {OwnedDenoiser} from './renderer/ownedDenoiser.js';\nimport type {Denoiser} from './Render.js';\nexport type { DepthSampleArea } from './renderer/depthQuery.js';\n\n/** BLAS implementation; default builtin. */\nexport type BVHBuilder = 'tinybvh' | 'builtin';\n/** Optional CPU preparation settings. */\nexport interface PrepareOptions {\n /** Completed BLAS fraction 0–1. Default undefined. */ onProgress?: (progress: number) => void;\n /** Cancels preparation. Default undefined. */ signal?: AbortSignal;\n}\n/** Engine construction settings. */\nexport interface EngineParams {\n /** Default display canvas. Default a new HTML canvas, or OffscreenCanvas without document. */ canvas?: HTMLCanvasElement | OffscreenCanvas;\n /** Backend selection. Default auto, with WebGL fallback. webgpu requires WebGPU. */ backend?: 'auto' | 'webgpu' | 'webgl';\n /** Caller-owned WebGPU device. Default undefined uses a shared device. Implies webgpu; incompatible with webgl. */ device?: GPUDevice;\n /** Material texture bindings. Default atlas; auto tries WebGPU bindless textures and falls back to atlas when unavailable. Fixed at construction. */ textureBinding?: 'atlas' | 'auto';\n}\n/** Material-atlas device limits. */\nexport interface TextureAtlasLimits { maxTextureArrayLayers: number; maxTextureDimension2D: number; }\n/** Initialization result. */\nexport interface EngineInfo {\n backend: 'webgpu' | 'webgl'; adapterName: string; webgpuFallbackReason?: string; limits: TextureAtlasLimits;\n}\n/** Device and target diagnostics; Per-target GPU bytes exclude shared scene, temporary passes and driver costs. */\nexport interface EngineDiagnostics extends RenderingDiagnostics {\n backend: 'webgpu' | 'webgl' | undefined; adapterName: string;\n width: number; height: number; lastError?: string; webgpuFallbackReason?: string;\n}\ninterface EngineEvents {\n progress: { stage: 'device' | 'bvh' | 'shaders'; progress: number };\n error: Error;\n devicelost: { reason: string; recovering: boolean };\n}\nconst CANCELLED_DENOISE_GRACE_MS = 10000;\ninterface SharedDevice {device: GPUDevice; adapterInfo?: GPUAdapterInfo; fallbackReason?: string;}\nconst sharedDevices = new Map<string, Promise<SharedDevice>>();\nasync function sharedDevice(gpu: GPU, mode: 'atlas' | 'auto'): Promise<SharedDevice> {\n let request = sharedDevices.get(mode);\n if (!request) {\n request = (async () => {\n let adapter = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!adapter) throw new Error('No WebGPU adapter is available');\n const descriptor = getRecommendedDeviceDescriptor(adapter);\n const support = mode === 'auto' ? resourceTableFeature(adapter.features) : undefined;\n let device: GPUDevice, fallbackReason: string | undefined;\n try {\n device = await adapter.requestDevice(support ? {...descriptor, requiredFeatures: [...descriptor.requiredFeatures ?? [], support.feature]} : descriptor);\n } catch (error) {\n if (!support) throw error;\n fallbackReason = error instanceof Error ? error.message : String(error);\n const retry = await gpu.requestAdapter({powerPreference: 'high-performance'}) ?? await gpu.requestAdapter();\n if (!retry) throw new Error('No WebGPU adapter is available for atlas fallback');\n device = await retry.requestDevice(getRecommendedDeviceDescriptor(retry));\n adapter = retry;\n }\n const current = request;\n void device.lost.then(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n return {device, adapterInfo: (adapter as GPUAdapter & {info?: GPUAdapterInfo}).info, fallbackReason};\n })();\n sharedDevices.set(mode, request);\n const current = request;\n void request.catch(() => { if (sharedDevices.get(mode) === current) sharedDevices.delete(mode); });\n }\n return request;\n}\n\n/** Shared device, committed scene/camera, CPU preparation and denoiser ownership. */\nexport default class Engine {\n /** Source scene, accepted only by update(). Default undefined. */ scene: Scene | undefined;\n /** Source camera, accepted only by update(). Default undefined. */ camera: Camera | undefined;\n /** Default canvas and display settings. */ readonly display: Display;\n /** Static BLAS builder. Default builtin. */ bvhBuilder: BVHBuilder = 'builtin';\n /** Static BLAS layout. Default bvh2; dynamic geometry uses bvh2. */ bvhLayout: TinyBvhLayout = 'bvh2';\n /** Enable TinyBVH spatial splits. Default false. */ bvhSpatialSplits = false;\n /** Material texture budget in bytes. Default 384 MiB. */ textureAtlasBudgetBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n /** Maximum CPU BVH workers. Default auto (hardware concurrency minus one, clamped 1–4). */\n get bvhWorkerCount(): number | 'auto' { return this._bvhWorkerCount; }\n set bvhWorkerCount(count: number | 'auto') { resolveBvhWorkerCount(count); this._bvhWorkerCount = count; }\n private _bvhWorkerCount: number | 'auto' = 'auto';\n private _bvhWorkerPool?: BvhWorkerPool;\n private _bvhPreparationRevision = 0;\n private _bvhPreparation?: Promise<void>;\n private _bvhPreparationController?: AbortController;\n private _bvhFailedRevision = -1;\n private _bvhPreparationTail: Promise<unknown> = Promise.resolve();\n private _tinyBvhUnavailable = false;\n private _bvhWorkerUnavailable = false;\n private _bvhPreparedGeometry = new WeakMap<Mesh, [Geometry, number]>();\n private _lastBvhBuild?: { geometryCount: number; bvhTimeMs: number };\n private _lastBvhSettings = '';\n private _lastBudget = -1;\n private _shaderProgress = '';\n private _events = new Events<EngineEvents>();\n private _pipeline?: RenderPipeline;\n private _webglRenderer?: WebGLRenderer;\n private _gpuDevice?: GPUDevice;\n private _suppliedDevice?: GPUDevice;\n private readonly _ownsDeviceSelection: boolean;\n private _deviceRevision = 0;\n private _lossController?: AbortController;\n private _deviceLossError?: Error;\n private _webglListening = false;\n private _webglLost = false;\n private _recoverWebGL = false;\n private _contextRestore?: {promise: Promise<void>; resolve: () => void; reject: (error: Error) => void};\n private _gpuAdapterInfo?: GPUAdapterInfo;\n private _backendChoice: NonNullable<EngineParams['backend']>;\n private readonly _textureBinding: 'atlas' | 'auto';\n private _initPromise?: Promise<EngineInfo>;\n private _info?: EngineInfo;\n private _pipelineInitError?: Error;\n private _webgpuFallbackReason?: string;\n private _reportedErrors = new WeakSet<Error>();\n private _loggedErrorMessages = new Set<string>();\n private _sceneChangeDetector: SceneChangeDetector;\n private _snapshot = new CommittedScene();\n private _sourceScene?: Scene;\n private _committedScene?: Scene;\n private _sourceCamera?: Camera;\n private _committedCamera?: Camera;\n private _cameraFields: unknown[] = [];\n private _sceneRevision = 0;\n private _cameraRevision = 0;\n private _uploadedRevision = -1;\n private _pendingMeshes: 'none' | 'incremental' | 'full' = 'full';\n private _pendingTransforms = new Set<Mesh>();\n private _pendingColors = new Set<InstancedMesh>();\n private _pendingGeometries = new Set<Geometry>();\n private _pendingMaterials = new Set<import('./scene/OpenPBRMaterial.js').default>();\n private _pendingLights = true;\n private _pendingBackground = true;\n private _disposed = false;\n private _readingDepth = false;\n private _renders = new Set<Render>();\n private _targetCounter = 0;\n private _presented?: RenderTarget;\n private _denoisers = new Set<OwnedDenoiser>();\n private _denoiserCache = new Map<string, {references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _denoiserEntries = new WeakMap<OwnedDenoiser, {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>}>();\n private _weights = new Map<string, Promise<ArrayBuffer>>();\n private _customPrepared = new WeakMap<Denoiser, {device: GPUDevice; width: number; height: number}>();\n private _denoiseTail: Promise<unknown> = Promise.resolve();\n private _lastError: Error | undefined;\n /** Most recent synchronous engine/render failure. Default undefined. */\n get lastError() { return this._lastError; }\n /** @internal */ _setRenderError(error?: Error) { this._lastError = error ?? this._pipelineInitError; }\n\n constructor(params: EngineParams = {}) {\n if (params.device && params.backend === 'webgl') throw new Error('A supplied GPUDevice cannot use the webgl backend.');\n this._suppliedDevice = params.device;\n this._textureBinding = params.textureBinding ?? 'atlas';\n this._ownsDeviceSelection = !params.device;\n this._backendChoice = params.device ? 'webgpu' : params.backend ?? 'auto';\n this._sceneChangeDetector = new SceneChangeDetector();\n this.display = Display._create(this, params.canvas ?? createCanvas());\n }\n /** Initializes once; concurrent/repeated calls share the result. */\n init(): Promise<EngineInfo> {\n return this._initPromise ??= (async () => {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._pipelineInitError && !this._ownsDeviceSelection) throw this._pipelineInitError;\n const revision = this._deviceRevision;\n if (this._contextRestore) await this._contextRestore.promise;\n if (this._disposed) throw new Error('Engine is disposed.');\n await this._initPipeline(this._backendChoice !== 'webgl' && !this._recoverWebGL);\n if (revision !== this._deviceRevision) throw this._deviceLossError;\n if (this._pipelineInitError) throw this._pipelineInitError;\n if (this._disposed) { this._pipeline?.dispose(); throw new Error('Engine is disposed.'); }\n const gl = this._webglRenderer?.gl, limits = this._gpuDevice?.limits;\n this._info = { backend: this._gpuDevice ? 'webgpu' : 'webgl', adapterName: this._adapterName(), webgpuFallbackReason: this._webgpuFallbackReason,\n limits: { maxTextureArrayLayers: limits?.maxTextureArrayLayers ?? gl?.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS), maxTextureDimension2D: limits?.maxTextureDimension2D ?? gl?.getParameter(gl.MAX_TEXTURE_SIZE) } };\n this._upload();\n return this._info;\n })();\n }\n /** Initialization info. Default undefined until init resolves. */ get info() { return this._info; }\n /** Active backend. Default undefined until initialization completes. */ get backend() { return this._info?.backend; }\n /** GPU device. Default undefined before initialization and on WebGL. */ get device() { return this._gpuDevice; }\n /** Subscribes to shared progress/errors/device loss; returns unsubscribe. */\n on<K extends keyof EngineEvents>(event: K, listener: (value: EngineEvents[K]) => void): () => void { return this._events.on(event, listener); }\n\n /** The sole external edit detection/commit point. Returns whether inputs changed. */\n update(): boolean {\n if (this._disposed) throw new Error('Engine is disposed.');\n this._lastError = this._pipelineInitError;\n let changed = false, resetTiming = false;\n const cameraFields = this.camera ? snapshotFields(this.camera) : [];\n if (this.camera !== this._sourceCamera || !snapshotsEqual(cameraFields, this._cameraFields)) {\n this._sourceCamera = this.camera; this._cameraFields = cameraFields;\n this._committedCamera = this.camera ? cameraSnapshot(this.camera) : undefined; this._cameraRevision++; changed = true;\n }\n const bvhSettings = engineSettingsKey(this, 'bvh');\n const force = bvhSettings !== this._lastBvhSettings || textureBudget(this) !== this._lastBudget;\n if (this.scene !== this._sourceScene || force) this._sceneChangeDetector.reset();\n if (this.scene) {\n validateSceneLights(this.scene.lights, error => this._notifyError(error));\n ensureMeshGeometryAttributes(this.scene.meshes);\n const changes = this._sceneChangeDetector.detect(this.scene);\n resetTiming = changes.meshes === 'full' || this.scene !== this._sourceScene || force;\n if (changes.meshes !== 'none' || changes.lights || changes.background || this.scene !== this._sourceScene || force) {\n this._committedScene = this._snapshot.capture(this.scene, changes);\n // Preparing meshes the next upload replaces would only delay that upload.\n if (changes.meshes === 'full' || force || this.scene !== this._sourceScene) { this._pendingMeshes = 'full'; this._bvhPreparationController?.abort(); }\n else if (changes.meshes === 'incremental' && this._pendingMeshes !== 'full') this._pendingMeshes = 'incremental';\n for (const mesh of changes.transforms) this._pendingTransforms.add(this._snapshot.mirror(mesh));\n for (const mesh of changes.colors) this._pendingColors.add(this._snapshot.mirror(mesh));\n for (const geometry of changes.geometries) this._pendingGeometries.add(this._snapshot.mirror(geometry));\n for (const material of changes.materials) this._pendingMaterials.add(this._snapshot.mirror(material));\n this._pendingLights ||= changes.lights;\n this._pendingBackground ||= changes.background;\n this._sceneRevision++; changed = true;\n }\n this._sceneChangeDetector.commit();\n } else if (this._sourceScene) { this._committedScene = undefined; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true; this._sceneRevision++; changed = true; }\n this._sourceScene = this.scene; this._lastBvhSettings = bvhSettings; this._lastBudget = textureBudget(this);\n if (!this._pipeline) void this.init().catch(() => {});\n if (changed) for (const render of this._renders) render._inputsChanged(resetTiming);\n this._upload();\n return changed;\n }\n private _upload() {\n const pipeline = this._pipeline;\n if (!pipeline || this._disposed || this._bvhPreparation || this._uploadedRevision === this._sceneRevision) return;\n const scene = this._committedScene ?? { meshes: [], lights: [] };\n if (this._needsBVHPreparation(scene.meshes)) {\n const controller = this._bvhPreparationController = new AbortController();\n const task = this.prepare(scene, {signal: controller.signal, onProgress: progress => {\n if (this._bvhPreparationController === controller) this._events.emit('progress', {stage: 'bvh', progress});\n }});\n this._bvhPreparation = task;\n const finished = () => { if (this._bvhPreparation === task) this._bvhPreparation = undefined; };\n void task.then(() => { finished(); this._upload(); }, error => {\n finished();\n // Upload without prepared BVHs instead of retrying the same failure every frame.\n if (!controller.signal.aborted) { this._bvhFailedRevision = this._sceneRevision; this._notifyError(error); }\n this._upload();\n });\n return;\n }\n const budgetChanged = pipeline.setTextureAtlasBudget(this._lastBudget >= 0 ? this._lastBudget : textureBudget(this));\n if (this._pendingMeshes !== 'none' || budgetChanged) pipeline.setMeshes(scene.meshes, this._pendingMeshes === 'full' || budgetChanged ? undefined : {\n transforms: [...this._pendingTransforms], colors: [...this._pendingColors], geometries: [...this._pendingGeometries], materials: [...this._pendingMaterials]\n });\n if (this._pendingLights) pipeline.setLights(scene.lights);\n if (this._pendingBackground) pipeline.setBackground(scene.background);\n this._pendingMeshes = 'none'; this._pendingLights = false; this._pendingBackground = false;\n this._pendingTransforms.clear(); this._pendingColors.clear(); this._pendingGeometries.clear(); this._pendingMaterials.clear();\n this._uploadedRevision = this._sceneRevision;\n }\n private _bvhConfig(): BvhBuildConfig { return bvhConfig(this); }\n /** Builds static CPU BVHs for this scene without replacing GPU inputs. Options default undefined. */\n prepare(scene: Scene, options: PrepareOptions = {}): Promise<void> {\n const revision = this._bvhPreparationRevision;\n const preparation = this._bvhPreparationTail.then(async () => {\n const isCancelled = () => revision !== this._bvhPreparationRevision || options.signal?.aborted === true;\n if (isCancelled()) return;\n const meshes = scene.meshes;\n const useWorker = canUseBvhWorker() && !this._bvhWorkerUnavailable;\n if (useWorker) {\n const count = workerCount(this);\n if (this._bvhWorkerPool?.size !== count) {\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = new BvhWorkerPool(count);\n }\n }\n const config = this._bvhConfig();\n const result = await prepareStaticBvhs(meshes, {\n config,\n ...config,\n builder: this.bvhBuilder === 'tinybvh' && !this._tinyBvhUnavailable ? 'tinybvh' : 'builtin',\n useWorker, workerPool: this._bvhWorkerPool, isCancelled,\n rebuild: false, onProgress: options.onProgress\n });\n if (isCancelled()) return;\n if (result.workerUnavailable && !this._bvhWorkerUnavailable) {\n this._bvhWorkerUnavailable = true;\n this._bvhWorkerPool?.dispose();\n this._bvhWorkerPool = undefined;\n console.warn('BVH preparation failed; falling back to the calling-thread BVH builder.');\n }\n if (result.tinyBvhUnavailable && !this._tinyBvhUnavailable) {\n this._tinyBvhUnavailable = true;\n console.warn('BVH preparation failed; falling back to the built-in BVH builder.');\n }\n result.failedMeshes.forEach(mesh => {\n this._bvhPreparedGeometry.set(mesh, [mesh.geometry, mesh.geometry.version]);\n });\n\n this._lastBvhBuild = { geometryCount: result.geometryCount, bvhTimeMs: result.bvhTimeMs };\n });\n this._bvhPreparationTail = preparation.catch(() => undefined);\n const signal = options.signal;\n if (!signal) return preparation;\n return new Promise<void>((resolve, reject) => {\n const aborted = () => reject(signal.reason ?? new DOMException('BVH preparation aborted', 'AbortError'));\n if (signal.aborted) { aborted(); return; }\n signal.addEventListener('abort', aborted, { once: true });\n preparation.then(resolve, reject).finally(() => signal.removeEventListener('abort', aborted));\n });\n }\n\n private _needsBVHPreparation(meshes: Mesh[]) {\n if (this._bvhPreparation) return true;\n if (this._bvhFailedRevision === this._sceneRevision) return false;\n if ((this.bvhBuilder !== 'tinybvh' || this._tinyBvhUnavailable) &&\n (!canUseBvhWorker() || this._bvhWorkerUnavailable)) {\n return meshes.some(mesh => !!getGeometryBvh(getPreparedMeshGeometry(mesh)) && meshNeedsStaticBvh(mesh, this._bvhConfig()));\n }\n return meshes.some((mesh) => {\n const prepared = this._bvhPreparedGeometry.get(mesh);\n const attempted = prepared?.[0] === mesh.geometry &&\n prepared[1] === mesh.geometry.version;\n return !attempted && meshNeedsStaticBvh(mesh, this._bvhConfig());\n });\n }\n\n private async _initPipeline(preferWebGPU: boolean) {\n let gpuCreated = false;\n try {\n\n this._events.emit('progress', {stage: 'device', progress: 0});\n this._pipelineInitError = undefined;\n if (preferWebGPU && (this._suppliedDevice || (typeof navigator !== 'undefined' && navigator.gpu))) {\n try {\n const gpu = typeof navigator !== 'undefined' ? navigator.gpu : undefined;\n const shared = this._suppliedDevice ? undefined : await sharedDevice(gpu!, this._textureBinding);\n const gpuDevice = this._suppliedDevice ?? shared!.device;\n const gpuAdapterInfo = this._suppliedDevice\n ? (gpuDevice as GPUDevice & {adapterInfo?: GPUAdapterInfo}).adapterInfo : shared?.adapterInfo;\n const materialTextures: MaterialTextureSelection = {requested: this._textureBinding};\n if (this._textureBinding === 'auto') {\n const support = resourceTableFeature(gpuDevice.features);\n materialTextures.fallbackReason = shared?.fallbackReason ?? (support ? await probeBindless(gpuDevice, support) : 'Resource-table feature is not enabled on this device.');\n if (!materialTextures.fallbackReason) materialTextures.support = support;\n }\n if (this._disposed) return;\n validateDevice(gpuDevice);\n this._gpuAdapterInfo = gpuAdapterInfo ?? undefined;\n this._gpuDevice = gpuDevice;\n this._pipeline = makeWGPURenderTargets(this.display.canvas, gpuDevice, {\n presentationFormat: gpu?.getPreferredCanvasFormat() ?? 'bgra8unorm', materialTextures\n });\n this._watchDevice(gpuDevice);\n gpuCreated = true;\n } catch (e) {\n if (this._backendChoice === 'webgpu') throw e;\n this._webgpuFallbackReason = e instanceof Error ? e.message : String(e);\n this._gpuDevice = undefined;\n this._gpuAdapterInfo = undefined;\n }\n }\n if (!gpuCreated) {\n if (this._backendChoice === 'webgpu') throw new Error('WebGPU is not available in this environment');\n if (preferWebGPU && !this._webgpuFallbackReason) {\n this._webgpuFallbackReason = 'WebGPU is not available in this environment';\n }\n this._webglRenderer = new WebGLRenderer({\n canvas: this.display.canvas,\n alpha: true,\n depth: true,\n stencil: false,\n antialias: false,\n pixelRatio: 1,\n preserveDrawingBuffer: true,\n // PENDING\n premultipliedAlpha: false,\n parallelShaderCompile: true,\n powerPreference: 'high-performance'\n });\n\n this._pipeline = makeWebGLRenderTargets(this._webglRenderer);\n if (!this._webglListening) {\n this._webglListening = true;\n this.display.canvas.addEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.addEventListener('webglcontextrestored', this._onContextRestored);\n }\n this._recoverWebGL = false;\n }\n\n\n } catch (error) {\n this._pipelineInitError = error instanceof Error ? error : new Error(String(error));\n this._lastError = this._pipelineInitError;\n this._notifyError(this._pipelineInitError);\n } finally {\n\n this._events.emit('progress', {stage: 'device', progress: 1});\n }\n }\n\n private _onContextLost = (event: Event) => {\n event.preventDefault();\n if (this._disposed || this._webglLost) return;\n this._webglLost = true; this._recoverWebGL = true;\n let resolve!: () => void, reject!: (error: Error) => void;\n const promise = new Promise<void>((done, fail) => {resolve = done; reject = fail;});\n void promise.catch(() => {});\n this._contextRestore = {promise, resolve, reject};\n const error = new Error(`WebGL context lost: ${(event as WebGLContextEvent).statusMessage || 'context is unavailable'}`);\n this._invalidateDevice(error, true);\n this._events.emit('devicelost', {reason: 'webglcontextlost', recovering: true});\n };\n private _onContextRestored = () => {\n if (this._disposed || !this._webglLost) return;\n this._webglLost = false;\n const restore = this._contextRestore; this._contextRestore = undefined; restore?.resolve();\n };\n private _watchDevice(device: GPUDevice) {\n void device.lost.then(info => {\n if (this._disposed || this._gpuDevice !== device) return;\n const recovering = this._ownsDeviceSelection;\n const error = new Error(`WebGPU device lost (${info.reason}): ${info.message || 'device is unavailable'}`);\n this._invalidateDevice(error, recovering);\n this._events.emit('devicelost', {reason: info.reason, recovering});\n if (!recovering) this._notifyError(error);\n });\n }\n private _invalidateDevice(error: Error, recovering: boolean) {\n this._deviceLossError = error; this._deviceRevision++;\n this._lossController?.abort(error); this._lossController = undefined;\n for (const render of this._renders) render._deviceLost(recovering);\n this._pipeline?.dispose(); this._pipeline = undefined;\n this._webglRenderer?.dispose(); this._webglRenderer = undefined;\n this._gpuDevice = undefined; this._gpuAdapterInfo = undefined;\n this._info = undefined; this._initPromise = undefined;\n this._pipelineInitError = recovering ? undefined : error; this._lastError = error;\n this._presented = undefined; this._shaderProgress = '';\n this._uploadedRevision = -1; this._pendingMeshes = 'full'; this._pendingLights = true; this._pendingBackground = true;\n this._sceneRevision++;\n this._customPrepared = new WeakMap();\n for (const filter of [...this._denoisers]) {\n const entry = this._denoiserEntries.get(filter); if (entry) entry.references = 1;\n this._releaseDenoiser(filter);\n }\n this._denoiserCache.clear();\n }\n /** Replaces a caller-owned device after validation. Only available on engines\n * constructed with device; the next update/refine uploads the committed scene.\n */\n async setDevice(device: GPUDevice): Promise<void> {\n if (this._disposed) throw new Error('Engine is disposed.');\n if (this._ownsDeviceSelection) throw new Error('setDevice requires an engine constructed with device.');\n try { validateDevice(device); }\n catch (error) {this._lastError = this._notifyError(error); throw error;}\n if (this._gpuDevice === device && !this._pipelineInitError) return;\n this._invalidateDevice(new Error('WebGPU device replaced during converge.'), true);\n this._suppliedDevice = device;\n }\n /** @internal Device loss rejects pending waits without relying on driver completion. */\n _awaitDevice<T>(work: Promise<T>): Promise<T> {\n const signal = (this._lossController ??= new AbortController()).signal;\n return new Promise((resolve, reject) => {\n const lost = () => reject(signal.reason);\n signal.addEventListener('abort', lost, {once: true});\n work.then(resolve, reject).finally(() => signal.removeEventListener('abort', lost));\n });\n }\n /** @internal */ get _deviceGeneration() { return this._deviceRevision; }\n /** @internal */ get _lostError() { return this._deviceLossError; }\n\n private _adapterName() {\n if (this._gpuAdapterInfo) return this._gpuAdapterInfo.description || this._gpuAdapterInfo.vendor || 'WebGPU';\n const gl = this._webglRenderer?.gl, extension = gl?.getExtension('WEBGL_debug_renderer_info');\n return extension && gl ? gl.getParameter(extension.UNMASKED_RENDERER_WEBGL) : this._webglRenderer ? 'WebGL 2' : this._gpuDevice ? 'WebGPU' : '';\n }\n /** @internal */ _reportShaderProgress() {\n const compilation = this._pipeline?.getDiagnostics().shaderCompilation;\n if (!compilation) return;\n const key = `${compilation.status}/${compilation.completedPipelineCount}/${compilation.pipelineCount}`;\n if (key === this._shaderProgress) return;\n this._shaderProgress = key;\n this._events.emit('progress', {stage: 'shaders', progress: compilation.pipelineCount ? compilation.completedPipelineCount / compilation.pipelineCount : 1});\n }\n /** Current shared preparation and resident target statistics. Default undefined before any work. */\n getDiagnostics(): EngineDiagnostics | undefined {\n if (!this._pipeline && !this._lastBvhBuild) return;\n const values = this._pipeline?.getDiagnostics();\n const materialTextures = values?.materialTextures ?? (this._pipeline ? {\n requested: this._textureBinding, active: 'atlas' as const,\n fallbackReason: this._textureBinding === 'auto' ? 'Bindless textures require a supported WebGPU device.' : undefined,\n textureCount: values?.textureAtlas?.textureCount ?? 0, estimatedBytes: values?.textureAtlas?.estimatedBytes ?? 0,\n scale: values?.textureAtlas?.scale ?? 1, metadataBytes: 0, resourceTableCapacity: 0, retiredBytes: 0\n } : undefined);\n return { ...values, materialTextures, bvh: {...values?.bvh, lastBuild: this._lastBvhBuild}, backend: this.backend, adapterName: this._adapterName(), width: this.display.canvas.width, height: this.display.canvas.height,\n lastError: this.lastError?.message, webgpuFallbackReason: this._webgpuFallbackReason,\n presentedTarget: this._presented?.label, presentedComplete: this._presented?.presentationComplete ?? false };\n }\n /** Queries a 7×7 depth grid using the committed engine camera. Default undefined until GPU data is ready. */\n async readDepthSamples(area: DepthSampleArea): Promise<Float32Array | undefined> {\n packDepthSampleArea(area, 1);\n if (!this._ready || !this._committedCamera || this._readingDepth) return;\n this._readingDepth = true;\n try {\n const camera = cameraSnapshot(this._committedCamera);\n camera.aspect ??= this.display.canvas.width / this.display.canvas.height;\n const result = await this._pipeline!.readDepthSamples(camera, area);\n return this._disposed ? undefined : result;\n }\n finally { this._readingDepth = false; }\n }\n /** Releases all renders, shared resources, CPU workers and owned denoisers. */\n dispose() {\n if (this._disposed) return;\n this._disposed = true; this._bvhPreparationRevision++; this._bvhPreparationController?.abort();\n this._lossController?.abort(new Error('Engine is disposed.')); this._lossController = undefined;\n this._contextRestore?.reject(new Error('Engine is disposed.')); this._contextRestore = undefined;\n if (this._webglListening) {\n this.display.canvas.removeEventListener('webglcontextlost', this._onContextLost);\n this.display.canvas.removeEventListener('webglcontextrestored', this._onContextRestored);\n }\n for (const render of [...this._renders]) render.dispose();\n this._pipeline?.dispose(); this._pipeline = undefined; this._webglRenderer?.dispose(); this._bvhWorkerPool?.dispose();\n for (const denoiser of [...this._denoisers]) { const entry = this._denoiserEntries.get(denoiser); if (entry) entry.references = 1; this._releaseDenoiser(denoiser); }\n this._denoiserCache.clear();\n this._weights.clear(); this._events.clear();\n }\n /** @internal */ get _initializationError() { return this._pipelineInitError; }\n /** @internal */ get _ready() { return !!this._pipeline && this._uploadedRevision === this._sceneRevision && !!this._committedScene && !!this._committedCamera && !this._disposed; }\n /** @internal */ get _inputs() { return {scene: this._sceneRevision, camera: this._cameraRevision, value: this._committedCamera}; }\n /** @internal */ _register(render: Render) { if (this._disposed) throw new Error('Engine is disposed.'); this._renders.add(render); }\n /** @internal */ _unregister(render: Render) { this._renders.delete(render); }\n /** @internal */ _createTarget() { return this._pipeline?.createTarget(`render-${++this._targetCounter}`); }\n /** @internal */ _releaseTarget(target: RenderTarget) { if (this._presented === target) this._presented = undefined; this._pipeline?.releaseTarget(target); }\n /** @internal */ _isPresented(target: RenderTarget | undefined) { return !!target && this._presented === target; }\n /** @internal */ _present(target: RenderTarget) { target.activate(); target.present(); this._presented = target; }\n /** @internal */ _notifyError(value: unknown): Error {\n const error = value instanceof Error ? value : new Error(String(value));\n if (!this._loggedErrorMessages.has(error.message)) { this._loggedErrorMessages.add(error.message); console.error(`Path tracing failed: ${error.message}`, error); }\n if (!this._reportedErrors.has(error)) { this._reportedErrors.add(error); this._events.emit('error', error); }\n return error;\n }\n /** @internal */ _getWeights(url: string, load: () => Promise<ArrayBuffer>) {\n let pending = this._weights.get(url);\n if (!pending) { pending = load(); this._weights.set(url, pending); void pending.catch(() => { if (this._weights.get(url) === pending) this._weights.delete(url); }); }\n return pending;\n }\n /** @internal */ _retainDenoiser<T extends OwnedDenoiser>(key: string, create: () => T): T {\n let entry = this._denoiserCache.get(key);\n if (!entry?.value) {\n const value = this._ownDenoiser(create());\n const next = {key, references: 0, value};\n this._denoiserCache.set(key, next); this._denoiserEntries.set(value, next); entry = next;\n }\n entry.references++; return entry.value as T;\n }\n /** @internal */ async _acquireDenoiser(key: string, create: () => Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>>): Promise<Extract<OwnedDenoiser, {kind: 'oidn'}>> {\n let entry = this._denoiserCache.get(key);\n if (!entry) {\n const next: {key: string; references: number; value?: OwnedDenoiser; pending?: Promise<OwnedDenoiser>} = {key, references: 0};\n const revision = this._deviceRevision;\n next.pending = create().then(filter => {\n if (revision !== this._deviceRevision) { this._disposeDenoiser(filter); throw this._deviceLossError; }\n next.value = this._ownDenoiser(filter); this._denoiserEntries.set(filter, next); return filter; });\n this._denoiserCache.set(key, next); entry = next;\n }\n entry.references++;\n try { return (entry.value ?? await entry.pending!) as Extract<OwnedDenoiser, {kind: 'oidn'}>; }\n catch (error) { entry.references--; if (this._denoiserCache.get(key) === entry) this._denoiserCache.delete(key); throw error; }\n }\n /** @internal */ _ownDenoiser<T extends OwnedDenoiser>(denoiser: T): T {\n if (this._disposed) { this._disposeDenoiser(denoiser); throw new Error('Engine is disposed.'); }\n this._denoisers.add(denoiser); return denoiser;\n }\n /** @internal */ _releaseDenoiser(denoiser: OwnedDenoiser) {\n const entry = this._denoiserEntries.get(denoiser);\n if (entry && --entry.references > 0) return;\n if (entry && this._denoiserCache.get(entry.key) === entry) this._denoiserCache.delete(entry.key);\n this._denoiserEntries.delete(denoiser);\n if (!this._denoisers.delete(denoiser)) return;\n this._disposeDenoiser(denoiser);\n }\n private _disposeDenoiser(denoiser: OwnedDenoiser) {\n if (denoiser.kind === 'oidn') { denoiser.denoiser.auxiliaryDenoisers?.albedo.dispose(); denoiser.denoiser.auxiliaryDenoisers?.normal.dispose(); }\n denoiser.denoiser.dispose();\n }\n /** @internal Called only while holding the shared inference lease. */\n async _prepareCustomDenoiser(denoiser: Denoiser, width: number, height: number) {\n const device = this.device;\n if (!device) throw new Error('Custom denoising requires WebGPU.');\n const previous = this._customPrepared.get(denoiser);\n if (previous?.device === device && previous.width === width && previous.height === height) return;\n await denoiser.prepare?.({device, width, height});\n this._customPrepared.set(denoiser, {device, width, height});\n }\n /** @internal A cancelled job loses its lease if it does not settle within the grace period. */ _enqueueDenoise<T>(work: () => Promise<T>, signal?: AbortSignal): Promise<T | undefined> {\n const task = this._denoiseTail.then(async () => {\n const device = this._gpuDevice, generation = this._deviceRevision;\n let settle: Promise<T> | undefined;\n try {\n if (!signal) return await work();\n const abandoned = new Promise<undefined>(resolve => {\n const expire = () => setTimeout(() => {\n console.warn('A cancelled denoiser did not settle; continuing without it.');\n resolve(undefined);\n }, CANCELLED_DENOISE_GRACE_MS);\n const running = work().finally(() => { clearTimeout(timer); signal.removeEventListener('abort', onAbort); });\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onAbort = () => { timer = expire(); };\n if (signal.aborted) onAbort(); else signal.addEventListener('abort', onAbort, {once: true});\n settle = running;\n });\n return await Promise.race([settle!, abandoned]);\n }\n finally {\n // Cancelling tiled OIDN stops future tiles, not the commands already\n // submitted. Keep the shared scratch lease until those commands finish\n // so rapid edits cannot pile up inference or resize its inputs in flight.\n // A lost/disposed device must release the lease without waiting for a\n // queue that may never complete.\n if (device && device === this._gpuDevice && generation === this._deviceRevision && !this._disposed) {\n await this._awaitDevice(device.queue.onSubmittedWorkDone()).catch(() => {});\n }\n }\n });\n this._denoiseTail = task.catch(() => {}); return task;\n }\n}\n"]}
|