@meimu/mutracer 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/README.md +3 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +9328 -7614
- package/docs/api.md +83 -35
- package/docs/caustics.md +80 -0
- package/docs/materials.md +9 -6
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +53 -9
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +122 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +18 -6
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -1
- package/lib/Engine.js +77 -14
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +81 -24
- package/lib/Render.js +201 -26
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +4 -2
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +11 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +65 -21
- package/lib/renderer/WGPURayTracePass.js +730 -409
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +110 -68
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +10 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
- package/lib/renderer/WebGLRayTracePass.js +157 -116
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +17 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +45 -37
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +13 -7
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +338 -252
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +5 -4
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +5 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
- package/lib/renderer/sceneLayoutSchema.js +3 -3
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +3 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +539 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +22 -0
- package/lib/settings/render.js +2 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +23 -16
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +2 -1
- package/package.json +7 -4
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
package/lib/RenderLoop.js
CHANGED
|
@@ -2,6 +2,7 @@ import { scheduleFrame } from './util/frame.js';
|
|
|
2
2
|
import Render from './Render.js';
|
|
3
3
|
import { Events } from './util/events.js';
|
|
4
4
|
import { aovChannel, updateProgressiveState, loopImageState } from './renderer/progressiveScheduler.js';
|
|
5
|
+
const MAX_INFERENCE_HOLD_MS = 5000;
|
|
5
6
|
/** Built-in interactive policy implemented entirely through the first-layer API. */
|
|
6
7
|
export default class RenderLoop {
|
|
7
8
|
engine;
|
|
@@ -22,12 +23,14 @@ export default class RenderLoop {
|
|
|
22
23
|
_busy = false;
|
|
23
24
|
_disposed = false;
|
|
24
25
|
_cancelScheduled;
|
|
25
|
-
|
|
26
|
+
_refillController;
|
|
26
27
|
_cancelRefillFrame;
|
|
27
28
|
_warnedTick = false;
|
|
28
29
|
/** Render whose next presentation is waiting for a complete preview frame. */
|
|
29
30
|
_previewFrameOwner;
|
|
30
31
|
_presented;
|
|
32
|
+
_inferenceHoldStart;
|
|
33
|
+
_lastError;
|
|
31
34
|
_finishedImage;
|
|
32
35
|
_motion;
|
|
33
36
|
_unsubscribe;
|
|
@@ -59,8 +62,11 @@ export default class RenderLoop {
|
|
|
59
62
|
for (const sync of syncs)
|
|
60
63
|
this.addSync(sync);
|
|
61
64
|
this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', { ...event, preview: false }));
|
|
62
|
-
if (typeof document !== 'undefined')
|
|
65
|
+
if (typeof document !== 'undefined') {
|
|
63
66
|
document.addEventListener('visibilitychange', this._visibility);
|
|
67
|
+
for (const event of this._inputEvents)
|
|
68
|
+
document.addEventListener(event, this._input, { capture: true, passive: true });
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
71
|
_render(value, defaults) {
|
|
66
72
|
if (value instanceof Render)
|
|
@@ -83,6 +89,7 @@ export default class RenderLoop {
|
|
|
83
89
|
/** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing() { return this._changing; }
|
|
84
90
|
/** Complete final beauty samples; preview and AOV-only sampling are excluded. Default 0. */ get samples() { return this.status === 'previewing' ? 0 : this.final.samples; }
|
|
85
91
|
/** Current presented/execution state. Default preparing. */ get status() { return this._status; }
|
|
92
|
+
/** Exception thrown by the latest tick, such as from a sync or scene update; status is error while set. Default undefined. */ get lastError() { return this._lastError; }
|
|
86
93
|
/** Subscribes to status transitions or complete final samples; returns unsubscribe. */
|
|
87
94
|
on(event, listener) { return this._events.on(event, listener); }
|
|
88
95
|
/** Adds an integration on this engine. Duplicate registrations are ignored. */
|
|
@@ -114,9 +121,27 @@ export default class RenderLoop {
|
|
|
114
121
|
}
|
|
115
122
|
return this._tick();
|
|
116
123
|
}
|
|
124
|
+
// Anything thrown here would otherwise repeat every frame while status keeps
|
|
125
|
+
// reporting the last healthy state.
|
|
117
126
|
_tick() {
|
|
127
|
+
try {
|
|
128
|
+
const status = this._runTick();
|
|
129
|
+
this._lastError = undefined;
|
|
130
|
+
return status;
|
|
131
|
+
}
|
|
132
|
+
catch (value) {
|
|
133
|
+
const error = value instanceof Error ? value : new Error(String(value));
|
|
134
|
+
if (error.message !== this._lastError?.message)
|
|
135
|
+
console.error(`RenderLoop tick failed: ${error.message}`, error);
|
|
136
|
+
this._lastError = error;
|
|
137
|
+
this._cancelRefill();
|
|
138
|
+
this._previewFrameOwner = undefined;
|
|
139
|
+
return this._setStatus('error');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
_runTick() {
|
|
118
143
|
this._cancelRefill();
|
|
119
|
-
const
|
|
144
|
+
const controller = this._refillController = new AbortController();
|
|
120
145
|
if (this._busy || (typeof document !== 'undefined' && document.hidden))
|
|
121
146
|
return this.status;
|
|
122
147
|
for (const sync of this._syncs)
|
|
@@ -130,7 +155,13 @@ export default class RenderLoop {
|
|
|
130
155
|
const owner = this._previewFrameOwner;
|
|
131
156
|
const pendingPreview = !!owner && (owner === this.preview || !owner._completeFor(this.display.channel));
|
|
132
157
|
const tracingPreview = pendingPreview && this.preview?.status === 'converging' && samples(this.preview) === 0;
|
|
133
|
-
const
|
|
158
|
+
const holdingInference = !aov && this.coalesceSceneUpdates && pendingPreview && !!this.preview?.denoising;
|
|
159
|
+
if (!holdingInference)
|
|
160
|
+
this._inferenceHoldStart = undefined;
|
|
161
|
+
else
|
|
162
|
+
this._inferenceHoldStart ??= performance.now();
|
|
163
|
+
// Only a commit can cancel inference, so a stalled filter must not hold it forever.
|
|
164
|
+
const holding = tracingPreview || (holdingInference && performance.now() - this._inferenceHoldStart < MAX_INFERENCE_HOLD_MS);
|
|
134
165
|
// Inference belongs to a presentation, not merely to a background render.
|
|
135
166
|
// A fallback result must never replace an already available final image.
|
|
136
167
|
if (pendingPreview && !holding && this.preview)
|
|
@@ -181,7 +212,23 @@ export default class RenderLoop {
|
|
|
181
212
|
current._restartAovs();
|
|
182
213
|
motion.phase = 'settling';
|
|
183
214
|
}
|
|
184
|
-
|
|
215
|
+
const refill = !aov && idle && current === this.final;
|
|
216
|
+
let status;
|
|
217
|
+
if (refill) {
|
|
218
|
+
// Keep the loop's short synchronous budget; the public helper uses an
|
|
219
|
+
// ordinary refine(). Selection/activity are application policy, revoked
|
|
220
|
+
// through the same signal as input, stop and the next display frame.
|
|
221
|
+
void current._refineUntil(performance.now() + 1000 / 60, controller.signal, { batchSamples: current.batchSamples, targetBatchTimeMs: 4 }, () => {
|
|
222
|
+
if ([...this._syncs].some(sync => sync.active) || this.select({ changing: false }) !== 'final')
|
|
223
|
+
controller.abort();
|
|
224
|
+
}).then(() => {
|
|
225
|
+
if (!controller.signal.aborted && current.status === 'error')
|
|
226
|
+
this._setStatus('error');
|
|
227
|
+
});
|
|
228
|
+
status = current.status;
|
|
229
|
+
}
|
|
230
|
+
else
|
|
231
|
+
status = refine(current);
|
|
185
232
|
if (motion?.phase === 'priming' && status === 'finished') {
|
|
186
233
|
current._restartAovs();
|
|
187
234
|
motion.phase = 'settling';
|
|
@@ -202,50 +249,20 @@ export default class RenderLoop {
|
|
|
202
249
|
const previewing = waitingForPreview || (!aov && current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);
|
|
203
250
|
const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;
|
|
204
251
|
this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;
|
|
205
|
-
if (
|
|
206
|
-
|
|
252
|
+
if (refill && !previewing && !controller.signal.aborted && current._refilling) {
|
|
253
|
+
// Manual tick grants work only until the next display frame.
|
|
254
|
+
this._cancelRefillFrame = scheduleFrame(() => this._cancelRefill());
|
|
255
|
+
}
|
|
256
|
+
else
|
|
257
|
+
controller.abort();
|
|
207
258
|
return this._setStatus(next);
|
|
208
259
|
}
|
|
209
260
|
_cancelRefill() {
|
|
210
|
-
this.
|
|
261
|
+
this._refillController?.abort();
|
|
262
|
+
this._refillController = undefined;
|
|
211
263
|
this._cancelRefillFrame?.();
|
|
212
264
|
this._cancelRefillFrame = undefined;
|
|
213
265
|
}
|
|
214
|
-
_scheduleRefill() {
|
|
215
|
-
const device = this.engine.device;
|
|
216
|
-
if (!device || !this._canRefill())
|
|
217
|
-
return;
|
|
218
|
-
const generation = this._refillGeneration;
|
|
219
|
-
// A manual tick grants work only until the next display frame. If the host
|
|
220
|
-
// stops ticking (pause/export), it cannot leave a background render running.
|
|
221
|
-
this._cancelRefillFrame = scheduleFrame(() => this._cancelRefill());
|
|
222
|
-
const refill = () => {
|
|
223
|
-
if (generation !== this._refillGeneration || device !== this.engine.device ||
|
|
224
|
-
this._disposed || this._busy || (typeof document !== 'undefined' && document.hidden) ||
|
|
225
|
-
aovChannel(this.display.channel) ||
|
|
226
|
-
!this._canRefill() || [...this._syncs].some(sync => sync.active) ||
|
|
227
|
-
this.select({ changing: false }) !== 'final')
|
|
228
|
-
return;
|
|
229
|
-
const before = this.final.samples;
|
|
230
|
-
const status = this.final.refine(undefined, { targetBatchTimeMs: 4, deferResolve: true });
|
|
231
|
-
if (status === 'error') {
|
|
232
|
-
this._cancelRefill();
|
|
233
|
-
this._setStatus('error');
|
|
234
|
-
return;
|
|
235
|
-
}
|
|
236
|
-
if (this.final.samples > before && status === 'converging')
|
|
237
|
-
wait();
|
|
238
|
-
};
|
|
239
|
-
const wait = () => { void this.final.whenReadyToRefine().then(refill, () => { }); };
|
|
240
|
-
// Keep only a short chunk ahead of input. GPU completion, rather than the
|
|
241
|
-
// display refresh rate, paces the next chunk; presentation stays on rAF.
|
|
242
|
-
wait();
|
|
243
|
-
}
|
|
244
|
-
_canRefill() {
|
|
245
|
-
const time = this.final.gpuSampleTimeMs;
|
|
246
|
-
return this.final.batchSamples && !this.final.denoising && this.final.samples > 0 &&
|
|
247
|
-
this.final.status === 'converging' && time !== undefined && time <= this.final.timeBudgetMs;
|
|
248
|
-
}
|
|
249
266
|
_schedule() {
|
|
250
267
|
if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden))
|
|
251
268
|
return;
|
|
@@ -256,6 +273,10 @@ export default class RenderLoop {
|
|
|
256
273
|
this._schedule();
|
|
257
274
|
} });
|
|
258
275
|
}
|
|
276
|
+
// Input may finish before the next sync update (for example a quick drag).
|
|
277
|
+
// Revoke the old frame's lease at dispatch, before a GPU fence can refill it.
|
|
278
|
+
_inputEvents = ['pointerdown', 'pointermove', 'pointerup', 'wheel', 'keydown', 'input', 'change'];
|
|
279
|
+
_input = () => { this._cancelRefill(); };
|
|
259
280
|
_visibility = () => {
|
|
260
281
|
if (document.hidden) {
|
|
261
282
|
this._cancelFrame();
|
|
@@ -307,8 +328,11 @@ export default class RenderLoop {
|
|
|
307
328
|
this._unsubscribe();
|
|
308
329
|
this._events.clear();
|
|
309
330
|
this._syncs.clear();
|
|
310
|
-
if (typeof document !== 'undefined')
|
|
331
|
+
if (typeof document !== 'undefined') {
|
|
311
332
|
document.removeEventListener('visibilitychange', this._visibility);
|
|
333
|
+
for (const event of this._inputEvents)
|
|
334
|
+
document.removeEventListener(event, this._input, true);
|
|
335
|
+
}
|
|
312
336
|
for (const render of this._owned)
|
|
313
337
|
render.dispose();
|
|
314
338
|
this._owned.clear();
|
package/lib/RenderLoop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderLoop.js","sourceRoot":"","sources":["../src/RenderLoop.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from './util/frame.js';\nimport type Engine from './Engine.js';\nimport type Display from './Display.js';\nimport Render, { type RenderOptions, type RenderStatus, type ConvergeOptions, type ConvergeResult, type SampleEvent } from './Render.js';\nimport type Sync from './Sync.js';\nimport { Events } from './util/events.js';\nimport { aovChannel, updateProgressiveState, loopImageState, type ProgressiveState } from './renderer/progressiveScheduler.js';\n\n/** Presentation state; preview images never count as final completion. */\nexport type RenderLoopStatus = RenderStatus | 'previewing';\nexport interface RenderLoopOptions {\n /** Presentation settings/canvas. Default engine.display. */ display?: Display;\n /** Preview render/settings, or false to disable. Default half resolution with adaptive scale .125–.5, 80 ms budget, 2 bounces, no bevel, 1 wavelength and 2 light candidates. */ preview?: Render | RenderOptions | false;\n /** Final render/settings. Default a new Render with preview as fallback. */ final?: Render | RenderOptions;\n /** External integrations, invoked in order. Default none. */ sync?: Sync | Sync[];\n /** Idle delay for consecutive edits without explicit sync activity. Default 150 ms. */ idleMs?: number;\n /** Hold preview inference before committing the latest camera/scene. Default false. */ coalesceSceneUpdates?: boolean;\n}\ninterface LoopEvents {\n status: {status: RenderLoopStatus; previous: RenderLoopStatus};\n sample: SampleEvent & {preview: false};\n}\n\n/** Built-in interactive policy implemented entirely through the first-layer API. */\nexport default class RenderLoop {\n readonly preview: Render | undefined;\n readonly final: Render;\n readonly display: Display;\n /** Selection policy. Default changing ? preview : final; absent previews select final. */\n select: (info: {changing: boolean}) => 'preview' | 'final' = ({changing}) => changing ? 'preview' : 'final';\n /** Heuristic idle delay. Default 150 ms. */ idleMs: number;\n /** Defer engine commits while preview inference is pending. Default false. */ coalesceSceneUpdates: boolean;\n private _changing = false;\n private _status: RenderLoopStatus = 'preparing';\n private _events = new Events<LoopEvents>();\n private _syncs = new Set<Sync>();\n private _owned = new Set<Render>();\n private _policy: ProgressiveState = {previousChanged: false, lastContinuousChange: -Infinity, changing: false};\n private _running = false;\n private _busy = false;\n private _disposed = false;\n private _cancelScheduled?: () => void;\n private _refillGeneration = 0;\n private _cancelRefillFrame?: () => void;\n private _warnedTick = false;\n /** Render whose next presentation is waiting for a complete preview frame. */\n private _previewFrameOwner?: Render;\n private _presented?: Render;\n private _finishedImage?: string;\n private _motion?: {render: Render; phase: 'moving' | 'priming' | 'settling' | 'settled'};\n private _unsubscribe: () => void;\n constructor(readonly engine: Engine, options: RenderLoopOptions = {}) {\n // Validate foreign objects before allocating owned resources.\n const syncs = options.sync ? (Array.isArray(options.sync) ? options.sync : [options.sync]) : [];\n for (const sync of syncs) this._checkEngine(sync.engine);\n for (const render of [options.preview, options.final]) if (render instanceof Render) this._checkEngine(render.engine);\n this.display = options.display ?? engine.display;\n this.idleMs = options.idleMs ?? 150;\n this.coalesceSceneUpdates = options.coalesceSceneUpdates ?? false;\n try {\n if (options.preview !== false) this.preview = this._render(options.preview, {\n resolutionScale: .5, timeBudgetMs: 80, adaptiveResolution: {targetFrameMs: 80, minScale: .125},\n bounces: 2, bevel: false, dispersionWavelengths: 1, directLightCandidates: 2,\n });\n this.final = this._render(options.final, {fallback: this.preview ?? null});\n } catch (error) {for (const render of this._owned) render.dispose(); throw error;}\n for (const sync of syncs) this.addSync(sync);\n this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', {...event, preview: false}));\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', this._visibility);\n }\n private _render(value: Render | RenderOptions | undefined, defaults: RenderOptions): Render {\n if (value instanceof Render) return value;\n const settings = {...defaults, ...value};\n if (value && 'width' in value) {\n if (!('resolutionScale' in value)) delete settings.resolutionScale;\n if (!('adaptiveResolution' in value)) delete settings.adaptiveResolution;\n }\n const render = new Render(this.engine, settings as RenderOptions); this._owned.add(render); return render;\n }\n private _checkEngine(engine: Engine): void { if (engine !== this.engine) throw new Error('RenderLoop renders and syncs must belong to the same engine.'); }\n private _assertAlive(): void { if (this._disposed) throw new Error('RenderLoop is disposed.'); }\n /** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing(): boolean { return this._changing; }\n /** Complete final beauty samples; preview and AOV-only sampling are excluded. Default 0. */ get samples(): number { return this.status === 'previewing' ? 0 : this.final.samples; }\n /** Current presented/execution state. Default preparing. */ get status(): RenderLoopStatus { return this._status; }\n /** Subscribes to status transitions or complete final samples; returns unsubscribe. */\n on<K extends keyof LoopEvents>(event: K, listener: (value: LoopEvents[K]) => void): () => void { return this._events.on(event, listener); }\n /** Adds an integration on this engine. Duplicate registrations are ignored. */\n addSync(sync: Sync): void { this._assertAlive(); this._checkEngine(sync.engine); this._syncs.add(sync); }\n /** Removes an integration without disposing it. */ removeSync(sync: Sync): void { this._syncs.delete(sync); }\n private _setStatus(status: RenderLoopStatus): RenderLoopStatus {\n if (status !== this._status) { const previous = this._status; this._status = status; this._events.emit('status', {status, previous}); }\n return status;\n }\n private _present(render: Render): Render | undefined {\n const shown = this.display.present(render);\n if (shown) this._presented = shown;\n return shown;\n }\n /** Executes one manual tick. Calls during start are ignored with one warning. */\n tick(): RenderLoopStatus {\n this._assertAlive();\n if (this._running) { if (!this._warnedTick) {this._warnedTick = true; console.warn('RenderLoop.tick() is ignored while start() is active.');} return this.status; }\n return this._tick();\n }\n private _tick(): RenderLoopStatus {\n this._cancelRefill();\n const refillGeneration = this._refillGeneration;\n if (this._busy || (typeof document !== 'undefined' && document.hidden)) return this.status;\n for (const sync of this._syncs) sync.update();\n const aov = aovChannel(this.display.channel);\n const refine = (render: Render) => render.refine(aov, {\n batchSamples: render.batchSamples && !this.changing && render !== this.preview,\n targetBatchTimeMs: 4,\n });\n const samples = (render: Render) => aov ? render.aovSamplesRendered : render.samples;\n const owner = this._previewFrameOwner;\n const pendingPreview = !!owner && (owner === this.preview || !owner._completeFor(this.display.channel));\n const tracingPreview = pendingPreview && this.preview?.status === 'converging' && samples(this.preview) === 0;\n const holding = tracingPreview || (!aov && this.coalesceSceneUpdates && pendingPreview && !!this.preview?.denoising);\n // Inference belongs to a presentation, not merely to a background render.\n // A fallback result must never replace an already available final image.\n if (pendingPreview && !holding && this.preview) this._present(this.preview);\n if (!holding) this._previewFrameOwner = undefined;\n const changed = holding ? false : this.engine.update();\n const active = [...this._syncs].some(sync => sync.active);\n this._policy = updateProgressiveState(this._policy, changed, active, performance.now(), this.idleMs);\n this._changing = this._policy.changing;\n const selected = this.select({changing: this.changing});\n if (holding && this.preview) {\n // Finish this image against its committed camera while syncs collect the\n // latest input. Restarting its first tile on every edit starves presentation.\n if (tracingPreview) {\n const status = refine(this.preview);\n if (status === 'error') { this._previewFrameOwner = undefined; return this._setStatus('error'); }\n if ((!this.coalesceSceneUpdates || !this.preview.denoising) && this._present(this.preview)) this._previewFrameOwner = undefined;\n }\n return this._setStatus('previewing');\n }\n const current = selected === 'preview' && this.preview ? this.preview : this.final;\n const idle = !changed && !this.changing;\n if (aov !== 'motion') this._motion = undefined;\n else if (this._motion?.render !== current) {\n // Targets have independent histories. Prime every target switch, even\n // when a final small camera edit coincides with leaving preview.\n this._motion = {render: current, phase: this._motion ? 'priming' : 'moving'};\n } else if ((!idle && this._motion.phase !== 'priming') || (!current._completeFor('motion') && this._motion.phase === 'settled')) {\n this._motion.phase = 'moving';\n }\n const motion = this._motion;\n const imageState = loopImageState(this.final, this.display);\n if (idle && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage && (!motion || motion.phase === 'settled')) return this.status;\n // Invalidate a completed filter before refinement when display settings changed.\n if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0) this._present(this.final);\n // Motion describes successive images. One unchanged image retires the last\n // displacement; afterwards leave the finished target idle as usual.\n if (motion?.phase === 'moving' && idle && current._completeFor('motion')) {\n current._restartAovs(); motion.phase = 'settling';\n }\n let status = refine(current);\n if (motion?.phase === 'priming' && status === 'finished') {\n current._restartAovs(); motion.phase = 'settling'; status = refine(current);\n }\n if (motion?.phase === 'settling' && status === 'finished') motion.phase = 'settled';\n // Keep the canvas on the last completed image while filtering the next\n // preview; presenting its raw sample here would overwrite the denoise above.\n const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && samples(current) === 0) || (!aov && this.coalesceSceneUpdates && this.preview.denoising)) &&\n (current === this.preview || (!current._completeFor(this.display.channel) && current.fallback === this.preview));\n if (waitingForPreview) this._previewFrameOwner = current;\n else this._present(current);\n // Execution may already be tracing final tiles while the canvas still shows\n // preview. Only a successful presentation transfers ownership of the image.\n const previewing = waitingForPreview || (!aov && current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);\n const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;\n this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;\n if (refillGeneration === this._refillGeneration && !aov && idle && current === this.final && !previewing) this._scheduleRefill();\n return this._setStatus(next);\n }\n private _cancelRefill(): void {\n this._refillGeneration++;\n this._cancelRefillFrame?.(); this._cancelRefillFrame = undefined;\n }\n private _scheduleRefill(): void {\n const device = this.engine.device;\n if (!device || !this._canRefill()) return;\n const generation = this._refillGeneration;\n // A manual tick grants work only until the next display frame. If the host\n // stops ticking (pause/export), it cannot leave a background render running.\n this._cancelRefillFrame = scheduleFrame(() => this._cancelRefill());\n const refill = () => {\n if (generation !== this._refillGeneration || device !== this.engine.device ||\n this._disposed || this._busy || (typeof document !== 'undefined' && document.hidden) ||\n aovChannel(this.display.channel) ||\n !this._canRefill() || [...this._syncs].some(sync => sync.active) ||\n this.select({changing: false}) !== 'final') return;\n const before = this.final.samples;\n const status = this.final.refine(undefined, {targetBatchTimeMs: 4, deferResolve: true});\n if (status === 'error') {this._cancelRefill(); this._setStatus('error'); return;}\n if (this.final.samples > before && status === 'converging') wait();\n };\n const wait = () => {void this.final.whenReadyToRefine().then(refill, () => {});};\n // Keep only a short chunk ahead of input. GPU completion, rather than the\n // display refresh rate, paces the next chunk; presentation stays on rAF.\n wait();\n }\n private _canRefill(): boolean {\n const time = this.final.gpuSampleTimeMs;\n return this.final.batchSamples && !this.final.denoising && this.final.samples > 0 &&\n this.final.status === 'converging' && time !== undefined && time <= this.final.timeBudgetMs;\n }\n private _schedule(): void {\n if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden)) return;\n this._cancelScheduled = scheduleFrame(() => { this._cancelScheduled = undefined; try {this._tick();} finally {this._schedule();} });\n }\n private _visibility = (): void => {\n if (document.hidden) {this._cancelFrame(); this._cancelRefill();} else this._schedule();\n };\n private _cancelFrame(): void { this._cancelScheduled?.(); this._cancelScheduled = undefined; }\n /** Starts an idempotent loop; uses a 16 ms timer without rAF. Hidden pages pause automatically. */ start(): void { this._assertAlive(); this._running = true; this._schedule(); }\n /** Stops scheduling without discarding accumulated images. */ stop(): void { this._running = false; this._cancelFrame(); this._cancelRefill(); }\n /** Pauses ticks, converges final, presents it, and resumes a previously running loop. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n this._assertAlive(); if (this._busy) throw new Error('RenderLoop convergence is already running.');\n this._busy = true; this._previewFrameOwner = undefined; this._cancelFrame(); this._cancelRefill();\n try {\n for (const sync of this._syncs) sync.update(); this.engine.update();\n this._setStatus('preparing');\n const result = await this.final.converge({...options, onProgress: progress => {\n this._setStatus(progress.stage === 'denoising' ? 'denoising' : this.final.status);\n options.onProgress?.(progress);\n }});\n this._present(this.final); this._setStatus('finished'); return result;\n } catch (error) {this._setStatus('error'); throw error;}\n finally {this._busy = false; this._schedule();}\n }\n /** Stops the loop and releases renders it created. Supplied renders/syncs remain owned by the caller. */\n dispose(): void {\n if (this._disposed) return;\n this.stop(); this._disposed = true; this._unsubscribe(); this._events.clear(); this._syncs.clear();\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', this._visibility);\n for (const render of this._owned) render.dispose(); this._owned.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RenderLoop.js","sourceRoot":"","sources":["../src/RenderLoop.ts"],"names":[],"mappings":"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","sourcesContent":["import {scheduleFrame} from './util/frame.js';\nimport type Engine from './Engine.js';\nimport type Display from './Display.js';\nimport Render, { type RenderOptions, type RenderStatus, type ConvergeOptions, type ConvergeResult, type SampleEvent } from './Render.js';\nimport type Sync from './Sync.js';\nimport { Events } from './util/events.js';\nimport { aovChannel, updateProgressiveState, loopImageState, type ProgressiveState } from './renderer/progressiveScheduler.js';\n\nconst MAX_INFERENCE_HOLD_MS = 5000;\n\n/** Presentation state; preview images never count as final completion. */\nexport type RenderLoopStatus = RenderStatus | 'previewing';\nexport interface RenderLoopOptions {\n /** Presentation settings/canvas. Default engine.display. */ display?: Display;\n /** Preview render/settings, or false to disable. Default half resolution with adaptive scale .125–.5, 80 ms budget, 2 bounces, no bevel, 1 wavelength and 2 light candidates. */ preview?: Render | RenderOptions | false;\n /** Final render/settings. Default a new Render with preview as fallback. */ final?: Render | RenderOptions;\n /** External integrations, invoked in order. Default none. */ sync?: Sync | Sync[];\n /** Idle delay for consecutive edits without explicit sync activity. Default 150 ms. */ idleMs?: number;\n /** Hold preview inference before committing the latest camera/scene. Default false. */ coalesceSceneUpdates?: boolean;\n}\ninterface LoopEvents {\n status: {status: RenderLoopStatus; previous: RenderLoopStatus};\n sample: SampleEvent & {preview: false};\n}\n\n/** Built-in interactive policy implemented entirely through the first-layer API. */\nexport default class RenderLoop {\n readonly preview: Render | undefined;\n readonly final: Render;\n readonly display: Display;\n /** Selection policy. Default changing ? preview : final; absent previews select final. */\n select: (info: {changing: boolean}) => 'preview' | 'final' = ({changing}) => changing ? 'preview' : 'final';\n /** Heuristic idle delay. Default 150 ms. */ idleMs: number;\n /** Defer engine commits while preview inference is pending. Default false. */ coalesceSceneUpdates: boolean;\n private _changing = false;\n private _status: RenderLoopStatus = 'preparing';\n private _events = new Events<LoopEvents>();\n private _syncs = new Set<Sync>();\n private _owned = new Set<Render>();\n private _policy: ProgressiveState = {previousChanged: false, lastContinuousChange: -Infinity, changing: false};\n private _running = false;\n private _busy = false;\n private _disposed = false;\n private _cancelScheduled?: () => void;\n private _refillController?: AbortController;\n private _cancelRefillFrame?: () => void;\n private _warnedTick = false;\n /** Render whose next presentation is waiting for a complete preview frame. */\n private _previewFrameOwner?: Render;\n private _presented?: Render;\n private _inferenceHoldStart?: number;\n private _lastError?: Error;\n private _finishedImage?: string;\n private _motion?: {render: Render; phase: 'moving' | 'priming' | 'settling' | 'settled'};\n private _unsubscribe: () => void;\n constructor(readonly engine: Engine, options: RenderLoopOptions = {}) {\n // Validate foreign objects before allocating owned resources.\n const syncs = options.sync ? (Array.isArray(options.sync) ? options.sync : [options.sync]) : [];\n for (const sync of syncs) this._checkEngine(sync.engine);\n for (const render of [options.preview, options.final]) if (render instanceof Render) this._checkEngine(render.engine);\n this.display = options.display ?? engine.display;\n this.idleMs = options.idleMs ?? 150;\n this.coalesceSceneUpdates = options.coalesceSceneUpdates ?? false;\n try {\n if (options.preview !== false) this.preview = this._render(options.preview, {\n resolutionScale: .5, timeBudgetMs: 80, adaptiveResolution: {targetFrameMs: 80, minScale: .125},\n bounces: 2, bevel: false, dispersionWavelengths: 1, directLightCandidates: 2,\n });\n this.final = this._render(options.final, {fallback: this.preview ?? null});\n } catch (error) {for (const render of this._owned) render.dispose(); throw error;}\n for (const sync of syncs) this.addSync(sync);\n this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', {...event, preview: false}));\n if (typeof document !== 'undefined') {\n document.addEventListener('visibilitychange', this._visibility);\n for (const event of this._inputEvents) document.addEventListener(event, this._input, {capture: true, passive: true});\n }\n }\n private _render(value: Render | RenderOptions | undefined, defaults: RenderOptions): Render {\n if (value instanceof Render) return value;\n const settings = {...defaults, ...value};\n if (value && 'width' in value) {\n if (!('resolutionScale' in value)) delete settings.resolutionScale;\n if (!('adaptiveResolution' in value)) delete settings.adaptiveResolution;\n }\n const render = new Render(this.engine, settings as RenderOptions); this._owned.add(render); return render;\n }\n private _checkEngine(engine: Engine): void { if (engine !== this.engine) throw new Error('RenderLoop renders and syncs must belong to the same engine.'); }\n private _assertAlive(): void { if (this._disposed) throw new Error('RenderLoop is disposed.'); }\n /** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing(): boolean { return this._changing; }\n /** Complete final beauty samples; preview and AOV-only sampling are excluded. Default 0. */ get samples(): number { return this.status === 'previewing' ? 0 : this.final.samples; }\n /** Current presented/execution state. Default preparing. */ get status(): RenderLoopStatus { return this._status; }\n /** Exception thrown by the latest tick, such as from a sync or scene update; status is error while set. Default undefined. */ get lastError(): Error | undefined { return this._lastError; }\n /** Subscribes to status transitions or complete final samples; returns unsubscribe. */\n on<K extends keyof LoopEvents>(event: K, listener: (value: LoopEvents[K]) => void): () => void { return this._events.on(event, listener); }\n /** Adds an integration on this engine. Duplicate registrations are ignored. */\n addSync(sync: Sync): void { this._assertAlive(); this._checkEngine(sync.engine); this._syncs.add(sync); }\n /** Removes an integration without disposing it. */ removeSync(sync: Sync): void { this._syncs.delete(sync); }\n private _setStatus(status: RenderLoopStatus): RenderLoopStatus {\n if (status !== this._status) { const previous = this._status; this._status = status; this._events.emit('status', {status, previous}); }\n return status;\n }\n private _present(render: Render): Render | undefined {\n const shown = this.display.present(render);\n if (shown) this._presented = shown;\n return shown;\n }\n /** Executes one manual tick. Calls during start are ignored with one warning. */\n tick(): RenderLoopStatus {\n this._assertAlive();\n if (this._running) { if (!this._warnedTick) {this._warnedTick = true; console.warn('RenderLoop.tick() is ignored while start() is active.');} return this.status; }\n return this._tick();\n }\n // Anything thrown here would otherwise repeat every frame while status keeps\n // reporting the last healthy state.\n private _tick(): RenderLoopStatus {\n try {\n const status = this._runTick();\n this._lastError = undefined;\n return status;\n } catch (value) {\n const error = value instanceof Error ? value : new Error(String(value));\n if (error.message !== this._lastError?.message) console.error(`RenderLoop tick failed: ${error.message}`, error);\n this._lastError = error;\n this._cancelRefill(); this._previewFrameOwner = undefined;\n return this._setStatus('error');\n }\n }\n private _runTick(): RenderLoopStatus {\n this._cancelRefill();\n const controller = this._refillController = new AbortController();\n if (this._busy || (typeof document !== 'undefined' && document.hidden)) return this.status;\n for (const sync of this._syncs) sync.update();\n const aov = aovChannel(this.display.channel);\n const refine = (render: Render) => render.refine(aov, {\n batchSamples: render.batchSamples && !this.changing && render !== this.preview,\n targetBatchTimeMs: 4,\n });\n const samples = (render: Render) => aov ? render.aovSamplesRendered : render.samples;\n const owner = this._previewFrameOwner;\n const pendingPreview = !!owner && (owner === this.preview || !owner._completeFor(this.display.channel));\n const tracingPreview = pendingPreview && this.preview?.status === 'converging' && samples(this.preview) === 0;\n const holdingInference = !aov && this.coalesceSceneUpdates && pendingPreview && !!this.preview?.denoising;\n if (!holdingInference) this._inferenceHoldStart = undefined;\n else this._inferenceHoldStart ??= performance.now();\n // Only a commit can cancel inference, so a stalled filter must not hold it forever.\n const holding = tracingPreview || (holdingInference && performance.now() - this._inferenceHoldStart! < MAX_INFERENCE_HOLD_MS);\n // Inference belongs to a presentation, not merely to a background render.\n // A fallback result must never replace an already available final image.\n if (pendingPreview && !holding && this.preview) this._present(this.preview);\n if (!holding) this._previewFrameOwner = undefined;\n const changed = holding ? false : this.engine.update();\n const active = [...this._syncs].some(sync => sync.active);\n this._policy = updateProgressiveState(this._policy, changed, active, performance.now(), this.idleMs);\n this._changing = this._policy.changing;\n const selected = this.select({changing: this.changing});\n if (holding && this.preview) {\n // Finish this image against its committed camera while syncs collect the\n // latest input. Restarting its first tile on every edit starves presentation.\n if (tracingPreview) {\n const status = refine(this.preview);\n if (status === 'error') { this._previewFrameOwner = undefined; return this._setStatus('error'); }\n if ((!this.coalesceSceneUpdates || !this.preview.denoising) && this._present(this.preview)) this._previewFrameOwner = undefined;\n }\n return this._setStatus('previewing');\n }\n const current = selected === 'preview' && this.preview ? this.preview : this.final;\n const idle = !changed && !this.changing;\n if (aov !== 'motion') this._motion = undefined;\n else if (this._motion?.render !== current) {\n // Targets have independent histories. Prime every target switch, even\n // when a final small camera edit coincides with leaving preview.\n this._motion = {render: current, phase: this._motion ? 'priming' : 'moving'};\n } else if ((!idle && this._motion.phase !== 'priming') || (!current._completeFor('motion') && this._motion.phase === 'settled')) {\n this._motion.phase = 'moving';\n }\n const motion = this._motion;\n const imageState = loopImageState(this.final, this.display);\n if (idle && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage && (!motion || motion.phase === 'settled')) return this.status;\n // Invalidate a completed filter before refinement when display settings changed.\n if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0) this._present(this.final);\n // Motion describes successive images. One unchanged image retires the last\n // displacement; afterwards leave the finished target idle as usual.\n if (motion?.phase === 'moving' && idle && current._completeFor('motion')) {\n current._restartAovs(); motion.phase = 'settling';\n }\n const refill = !aov && idle && current === this.final;\n let status: RenderStatus;\n if (refill) {\n // Keep the loop's short synchronous budget; the public helper uses an\n // ordinary refine(). Selection/activity are application policy, revoked\n // through the same signal as input, stop and the next display frame.\n void current._refineUntil(performance.now() + 1000 / 60, controller.signal,\n {batchSamples: current.batchSamples, targetBatchTimeMs: 4}, () => {\n if ([...this._syncs].some(sync => sync.active) || this.select({changing: false}) !== 'final') controller.abort();\n }).then(() => {\n if (!controller.signal.aborted && current.status === 'error') this._setStatus('error');\n });\n status = current.status;\n } else status = refine(current);\n if (motion?.phase === 'priming' && status === 'finished') {\n current._restartAovs(); motion.phase = 'settling'; status = refine(current);\n }\n if (motion?.phase === 'settling' && status === 'finished') motion.phase = 'settled';\n // Keep the canvas on the last completed image while filtering the next\n // preview; presenting its raw sample here would overwrite the denoise above.\n const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && samples(current) === 0) || (!aov && this.coalesceSceneUpdates && this.preview.denoising)) &&\n (current === this.preview || (!current._completeFor(this.display.channel) && current.fallback === this.preview));\n if (waitingForPreview) this._previewFrameOwner = current;\n else this._present(current);\n // Execution may already be tracing final tiles while the canvas still shows\n // preview. Only a successful presentation transfers ownership of the image.\n const previewing = waitingForPreview || (!aov && current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);\n const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;\n this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;\n if (refill && !previewing && !controller.signal.aborted && current._refilling) {\n // Manual tick grants work only until the next display frame.\n this._cancelRefillFrame = scheduleFrame(() => this._cancelRefill());\n } else controller.abort();\n return this._setStatus(next);\n }\n private _cancelRefill(): void {\n this._refillController?.abort(); this._refillController = undefined;\n this._cancelRefillFrame?.(); this._cancelRefillFrame = undefined;\n }\n private _schedule(): void {\n if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden)) return;\n this._cancelScheduled = scheduleFrame(() => { this._cancelScheduled = undefined; try {this._tick();} finally {this._schedule();} });\n }\n // Input may finish before the next sync update (for example a quick drag).\n // Revoke the old frame's lease at dispatch, before a GPU fence can refill it.\n private readonly _inputEvents = ['pointerdown', 'pointermove', 'pointerup', 'wheel', 'keydown', 'input', 'change'] as const;\n private _input = (): void => { this._cancelRefill(); };\n private _visibility = (): void => {\n if (document.hidden) {this._cancelFrame(); this._cancelRefill();} else this._schedule();\n };\n private _cancelFrame(): void { this._cancelScheduled?.(); this._cancelScheduled = undefined; }\n /** Starts an idempotent loop; uses a 16 ms timer without rAF. Hidden pages pause automatically. */ start(): void { this._assertAlive(); this._running = true; this._schedule(); }\n /** Stops scheduling without discarding accumulated images. */ stop(): void { this._running = false; this._cancelFrame(); this._cancelRefill(); }\n /** Pauses ticks, converges final, presents it, and resumes a previously running loop. */\n async converge(options: ConvergeOptions): Promise<ConvergeResult> {\n this._assertAlive(); if (this._busy) throw new Error('RenderLoop convergence is already running.');\n this._busy = true; this._previewFrameOwner = undefined; this._cancelFrame(); this._cancelRefill();\n try {\n for (const sync of this._syncs) sync.update(); this.engine.update();\n this._setStatus('preparing');\n const result = await this.final.converge({...options, onProgress: progress => {\n this._setStatus(progress.stage === 'denoising' ? 'denoising' : this.final.status);\n options.onProgress?.(progress);\n }});\n this._present(this.final); this._setStatus('finished'); return result;\n } catch (error) {this._setStatus('error'); throw error;}\n finally {this._busy = false; this._schedule();}\n }\n /** Stops the loop and releases renders it created. Supplied renders/syncs remain owned by the caller. */\n dispose(): void {\n if (this._disposed) return;\n this.stop(); this._disposed = true; this._unsubscribe(); this._events.clear(); this._syncs.clear();\n if (typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this._visibility);\n for (const event of this._inputEvents) document.removeEventListener(event, this._input, true);\n }\n for (const render of this._owned) render.dispose(); this._owned.clear();\n }\n}\n"]}
|
package/lib/main.d.ts
CHANGED
|
@@ -49,11 +49,13 @@ export type { SamplingPattern } from './renderer/sampling.js';
|
|
|
49
49
|
export { default as Engine } from './Engine.js';
|
|
50
50
|
export type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';
|
|
51
51
|
export { default as Display } from './Display.js';
|
|
52
|
-
export type { BlobOptions, DisplayChannel, AovIdComponent, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';
|
|
52
|
+
export type { BlobOptions, DisplayChannel, AovIdComponent, DisplaySettings, PostProcess, PostProcessContext, PostProcessOptions } from './Display.js';
|
|
53
53
|
export { default as Render } from './Render.js';
|
|
54
|
-
export type { RenderOptions, RenderSettings, RefineOptions, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';
|
|
54
|
+
export type { RenderOptions, RenderSettings, CausticSettings, RefineOptions, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';
|
|
55
55
|
export { default as Sync } from './Sync.js';
|
|
56
56
|
export { default as RenderLoop } from './RenderLoop.js';
|
|
57
57
|
export type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';
|
|
58
58
|
export { getRecommendedDeviceDescriptor } from './renderer/deviceRequirements.js';
|
|
59
59
|
export type { AovKind } from './renderer/aov.js';
|
|
60
|
+
export { createEasuPass } from './renderer/easu.js';
|
|
61
|
+
export type { EasuOptions, EasuPass } from './renderer/easu.js';
|
package/lib/main.js
CHANGED
|
@@ -41,4 +41,5 @@ export { default as Render } from './Render.js';
|
|
|
41
41
|
export { default as Sync } from './Sync.js';
|
|
42
42
|
export { default as RenderLoop } from './RenderLoop.js';
|
|
43
43
|
export { getRecommendedDeviceDescriptor } from './renderer/deviceRequirements.js';
|
|
44
|
+
export { createEasuPass } from './renderer/easu.js';
|
|
44
45
|
//# sourceMappingURL=main.js.map
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAYvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAY1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,SAAS,IAAI,iBAAiB,EAC/B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOjF,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAO1D,oCAAoC;AACpC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\n\n/**\n * MuTracer: a physically based WebGPU path tracer with a\n * WebGL 2 fallback.\n *\n * Build a {@link Scene} from {@link Mesh}es and lights (or convert a Three.js\n * scene with {@link fromTHREEScene}), then call {@link Engine.update} and {@link Render.refine} once\n * per animation frame.\n *\n * @packageDocumentation\n */\nexport { VERSION } from './version.js';\n\nexport type {\n AlphaBlendStrategy,\n ShaderCompilationDiagnostics,\n ToneMapping\n} from './renderer/RenderingPipeline.js';\nexport type {\n OfflineAdaptiveSamplingOptions,\n OfflineVarianceHistory\n} from './renderer/OfflineAdaptiveSampling.js';\nexport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileOptions, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nexport { DEFAULT_JNLM_OPTIONS } from './renderer/jnlm.js';\nexport type { JNLMOptions } from './renderer/jnlm.js';\n\n// Scene description\nexport type {\n AnalyticLight,\n EquirectBackground,\n GroundedSkyboxBackground,\n Scene,\n SceneBackground,\n SceneLight\n} from './scene/Scene.js';\nexport { default as Camera } from './scene/Camera.js';\nexport { default as Mesh } from './scene/Mesh.js';\nexport { default as InstancedMesh } from './scene/InstancedMesh.js';\nexport type { InstancedMeshOptions } from './scene/InstancedMesh.js';\nexport { default as SceneNode } from './scene/SceneNode.js';\nexport {\n default as Geometry,\n Attribute as GeometryAttribute\n} from './scene/Geometry.js';\nexport type { GeometryInit } from './scene/Geometry.js';\nexport type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';\nexport { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';\nexport type {\n MaterialAlphaMode,\n UVProjection\n} from './scene/OpenPBRMaterial.js';\nexport { default as ProceduralSky } from './scene/ProceduralSky.js';\nexport type { ProceduralSkyOptions } from './scene/ProceduralSky.js';\nexport { default as Texture } from './scene/Texture.js';\nexport type { TextureDataSource, TextureWrapMode, TextureColorSpace } from './scene/Texture.js';\nexport type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';\n\n// Lights\nexport { default as AmbientLight } from './scene/AmbientLight.js';\nexport { default as DirectionalLight } from './scene/DirectionalLight.js';\nexport { default as RectLight } from './scene/RectLight.js';\nexport { default as SphereLight } from './scene/SphereLight.js';\nexport { default as SpotLight } from './scene/SpotLight.js';\nexport { default as EnvironmentLight } from './scene/EnvironmentLight.js';\nexport {\n default as IESProfile,\n IESParseError,\n parseIESProfile\n} from './scene/IESProfile.js';\n\n// Loaders and integrations\nexport { loadRGBE, parseRGBE } from './util/loadRGBE.js';\nexport { fromTHREECamera, fromTHREEScene, THREESync } from './util/fromTHREE.js';\nexport type {\n FromTHREESceneOptions,\n THREESyncOptions, THREEControls,\n FromTHREECameraOptions\n} from './util/fromTHREE.js';\n\n// Geometry helpers\nexport {\n createCubeGeometry,\n createCurvePlaneGeometry,\n createPlaneGeometry,\n createSphereGeometry\n} from './util/commonGeometry.js';\nexport {\n generateVertexNormals,\n generateVertexTangents\n} from './util/geometry.js';\nexport { computeMeshesBoundingBox } from './util/mesh.js';\n\n// BVH\nexport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\n\nexport type { SamplingPattern } from './renderer/sampling.js';\n\n// Independent rendering mechanisms.\nexport { default as Engine } from './Engine.js';\nexport type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';\nexport { default as Display } from './Display.js';\nexport type { BlobOptions, DisplayChannel, AovIdComponent, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';\nexport { default as Render } from './Render.js';\nexport type { RenderOptions, RenderSettings, RefineOptions, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';\n\nexport { default as Sync } from './Sync.js';\nexport { default as RenderLoop } from './RenderLoop.js';\nexport type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';\n\nexport {getRecommendedDeviceDescriptor} from './renderer/deviceRequirements.js';\n\nexport type {AovKind} from './renderer/aov.js';\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAYvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAY1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,SAAS,IAAI,iBAAiB,EAC/B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOjF,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAO1D,oCAAoC;AACpC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC;AAIhF,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\n\n/**\n * MuTracer: a physically based WebGPU path tracer with a\n * WebGL 2 fallback.\n *\n * Build a {@link Scene} from {@link Mesh}es and lights (or convert a Three.js\n * scene with {@link fromTHREEScene}), then call {@link Engine.update} and {@link Render.refine} once\n * per animation frame.\n *\n * @packageDocumentation\n */\nexport { VERSION } from './version.js';\n\nexport type {\n AlphaBlendStrategy,\n ShaderCompilationDiagnostics,\n ToneMapping\n} from './renderer/RenderingPipeline.js';\nexport type {\n OfflineAdaptiveSamplingOptions,\n OfflineVarianceHistory\n} from './renderer/OfflineAdaptiveSampling.js';\nexport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileOptions, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nexport { DEFAULT_JNLM_OPTIONS } from './renderer/jnlm.js';\nexport type { JNLMOptions } from './renderer/jnlm.js';\n\n// Scene description\nexport type {\n AnalyticLight,\n EquirectBackground,\n GroundedSkyboxBackground,\n Scene,\n SceneBackground,\n SceneLight\n} from './scene/Scene.js';\nexport { default as Camera } from './scene/Camera.js';\nexport { default as Mesh } from './scene/Mesh.js';\nexport { default as InstancedMesh } from './scene/InstancedMesh.js';\nexport type { InstancedMeshOptions } from './scene/InstancedMesh.js';\nexport { default as SceneNode } from './scene/SceneNode.js';\nexport {\n default as Geometry,\n Attribute as GeometryAttribute\n} from './scene/Geometry.js';\nexport type { GeometryInit } from './scene/Geometry.js';\nexport type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';\nexport { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';\nexport type {\n MaterialAlphaMode,\n UVProjection\n} from './scene/OpenPBRMaterial.js';\nexport { default as ProceduralSky } from './scene/ProceduralSky.js';\nexport type { ProceduralSkyOptions } from './scene/ProceduralSky.js';\nexport { default as Texture } from './scene/Texture.js';\nexport type { TextureDataSource, TextureWrapMode, TextureColorSpace } from './scene/Texture.js';\nexport type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';\n\n// Lights\nexport { default as AmbientLight } from './scene/AmbientLight.js';\nexport { default as DirectionalLight } from './scene/DirectionalLight.js';\nexport { default as RectLight } from './scene/RectLight.js';\nexport { default as SphereLight } from './scene/SphereLight.js';\nexport { default as SpotLight } from './scene/SpotLight.js';\nexport { default as EnvironmentLight } from './scene/EnvironmentLight.js';\nexport {\n default as IESProfile,\n IESParseError,\n parseIESProfile\n} from './scene/IESProfile.js';\n\n// Loaders and integrations\nexport { loadRGBE, parseRGBE } from './util/loadRGBE.js';\nexport { fromTHREECamera, fromTHREEScene, THREESync } from './util/fromTHREE.js';\nexport type {\n FromTHREESceneOptions,\n THREESyncOptions, THREEControls,\n FromTHREECameraOptions\n} from './util/fromTHREE.js';\n\n// Geometry helpers\nexport {\n createCubeGeometry,\n createCurvePlaneGeometry,\n createPlaneGeometry,\n createSphereGeometry\n} from './util/commonGeometry.js';\nexport {\n generateVertexNormals,\n generateVertexTangents\n} from './util/geometry.js';\nexport { computeMeshesBoundingBox } from './util/mesh.js';\n\n// BVH\nexport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\n\nexport type { SamplingPattern } from './renderer/sampling.js';\n\n// Independent rendering mechanisms.\nexport { default as Engine } from './Engine.js';\nexport type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';\nexport { default as Display } from './Display.js';\nexport type { BlobOptions, DisplayChannel, AovIdComponent, DisplaySettings, PostProcess, PostProcessContext, PostProcessOptions } from './Display.js';\nexport { default as Render } from './Render.js';\nexport type { RenderOptions, RenderSettings, CausticSettings, RefineOptions, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';\n\nexport { default as Sync } from './Sync.js';\nexport { default as RenderLoop } from './RenderLoop.js';\nexport type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';\n\nexport {getRecommendedDeviceDescriptor} from './renderer/deviceRequirements.js';\n\nexport type {AovKind} from './renderer/aov.js';\n\nexport {createEasuPass} from './renderer/easu.js';\nexport type {EasuOptions, EasuPass} from './renderer/easu.js';\n"]}
|
package/lib/oidn.d.ts
CHANGED
|
@@ -40,6 +40,6 @@ export declare const DEFAULT_OIDN_WEIGHTS_PACKAGE_BASE_URL = "https://cdn.jsdeli
|
|
|
40
40
|
* Fallback for bundled standard/small weights when application assets fail.
|
|
41
41
|
* Defaults to jsDelivr's `@meimu/mutracer@VERSION/oidn/weights/` directory.
|
|
42
42
|
*/
|
|
43
|
-
export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.
|
|
43
|
+
export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.3.1/oidn/weights/";
|
|
44
44
|
export declare function resolveOIDNModelUrl(model: OIDNModel, weightsBaseUrl?: string | URL): string;
|
|
45
45
|
export declare function resolveOIDNAuxiliaryModelUrls(weightsBaseUrl?: string | URL): OIDNAuxiliaryModelUrls;
|
|
@@ -14,14 +14,7 @@ export class AovPrimitiveCache {
|
|
|
14
14
|
cached.topology === geometry.topologyVersion && cached.triangleIds === triangleIds)
|
|
15
15
|
return cached.ids;
|
|
16
16
|
const bvh = new Uint32Array(buffer), ids = new Uint32Array(bvh.length / 4).fill(AOV_BACKGROUND_ID);
|
|
17
|
-
|
|
18
|
-
for (let t = 0; t < indices.length / 3; t++)
|
|
19
|
-
triangles.set(`${indices[t * 3]},${indices[t * 3 + 1]},${indices[t * 3 + 2]}`, t);
|
|
20
|
-
for (let record = 0; record < ids.length; record++) {
|
|
21
|
-
const triangle = triangles.get(`${bvh[record * 4]},${bvh[record * 4 + 1]},${bvh[record * 4 + 2]}`);
|
|
22
|
-
if (triangle !== undefined)
|
|
23
|
-
ids[record] = triangle;
|
|
24
|
-
}
|
|
17
|
+
matchSourceTriangles(bvh, indices, ids);
|
|
25
18
|
// Builder metadata distinguishes displaced/duplicate index triples.
|
|
26
19
|
if (triangleIds)
|
|
27
20
|
for (let i = 0; i < triangleIds.length; i += 2)
|
|
@@ -45,4 +38,42 @@ export class AovPrimitiveCache {
|
|
|
45
38
|
return this.combined;
|
|
46
39
|
}
|
|
47
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Writes the source triangle whose index triple equals each record's first
|
|
43
|
+
* three words; the last duplicate wins. Triangles are bucketed by first index
|
|
44
|
+
* in typed arrays, so a lookup compares only the triangles sharing that vertex.
|
|
45
|
+
*/
|
|
46
|
+
function matchSourceTriangles(bvh, indices, ids) {
|
|
47
|
+
const triangles = indices.length / 3;
|
|
48
|
+
let vertices = 0;
|
|
49
|
+
for (let i = 0; i < indices.length; i += 3)
|
|
50
|
+
if (indices[i] >= vertices)
|
|
51
|
+
vertices = indices[i] + 1;
|
|
52
|
+
const start = new Uint32Array(vertices + 1);
|
|
53
|
+
for (let t = 0; t < triangles; t++)
|
|
54
|
+
start[indices[t * 3] + 1]++;
|
|
55
|
+
for (let v = 0; v < vertices; v++)
|
|
56
|
+
start[v + 1] += start[v];
|
|
57
|
+
// Each bucket stores (second index, third index, triangle) contiguously, so
|
|
58
|
+
// a lookup touches one random cache line instead of three.
|
|
59
|
+
const entries = new Uint32Array(triangles * 3), next = start.slice(0, vertices);
|
|
60
|
+
for (let t = 0; t < triangles; t++) {
|
|
61
|
+
const e = next[indices[t * 3]]++ * 3;
|
|
62
|
+
entries[e] = indices[t * 3 + 1];
|
|
63
|
+
entries[e + 1] = indices[t * 3 + 2];
|
|
64
|
+
entries[e + 2] = t;
|
|
65
|
+
}
|
|
66
|
+
for (let record = 0; record < ids.length; record++) {
|
|
67
|
+
const a = bvh[record * 4];
|
|
68
|
+
if (a >= vertices)
|
|
69
|
+
continue;
|
|
70
|
+
const b = bvh[record * 4 + 1], c = bvh[record * 4 + 2];
|
|
71
|
+
for (let e = start[a + 1] * 3; (e -= 3) >= start[a] * 3;) {
|
|
72
|
+
if (entries[e] === b && entries[e + 1] === c) {
|
|
73
|
+
ids[record] = entries[e + 2];
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
48
79
|
//# sourceMappingURL=AovPrimitiveCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AovPrimitiveCache.js","sourceRoot":"","sources":["../../src/renderer/AovPrimitiveCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAE3C,gFAAgF;AAChF,MAAM,OAAO,iBAAiB;IACpB,MAAM,GAAG,IAAI,OAAO,EAGxB,CAAC;IACG,KAAK,GAAkB,EAAE,CAAC;IAC1B,WAAW,GAAG,CAAC,CAAC,CAAC;IACjB,QAAQ,CAAe;IAE/B,GAAG,CAAC,MAAqD,EAAE,IAAiB;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBACpE,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,eAAe,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC;YAC1G,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnG,
|
|
1
|
+
{"version":3,"file":"AovPrimitiveCache.js","sourceRoot":"","sources":["../../src/renderer/AovPrimitiveCache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAE3C,gFAAgF;AAChF,MAAM,OAAO,iBAAiB;IACpB,MAAM,GAAG,IAAI,OAAO,EAGxB,CAAC;IACG,KAAK,GAAkB,EAAE,CAAC;IAC1B,WAAW,GAAG,CAAC,CAAC,CAAC;IACjB,QAAQ,CAAe;IAE/B,GAAG,CAAC,MAAqD,EAAE,IAAiB;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;YACzE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBACpE,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,eAAe,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW;gBAAE,OAAO,MAAM,CAAC,GAAG,CAAC;YAC1G,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnG,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YACxC,oEAAoE;YACpE,IAAI,WAAW;gBAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;oBAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;YACxG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,EAAE,GAAG,EAAC,CAAC,CAAC;YACnG,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;YACxF,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC9H,IAAI,MAAM,GAAG,WAAW,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;YAAC,CAAC;YAChF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,GAAgB,EAAE,OAAkC,EAAE,GAAgB;IAClG,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAAE,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ;YAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,OAAO,CAAC,CAAC,GAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,4EAA4E;IAC5E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,QAAQ;YAAE,SAAS;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;YACzD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAM;YAAC,CAAC;QACxF,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type {AovSceneSource} from './aovScene.js';\nimport type {FlattendBVH} from './bvhAccel.js';\nimport type Geometry from '../scene/Geometry.js';\nimport {AOV_BACKGROUND_ID} from './aov.js';\n\n/** Web AOV identity data is independent of camera, transforms and materials. */\nexport class AovPrimitiveCache {\n private blases = new WeakMap<ArrayBuffer, {\n geometry: Geometry; indices: Uint16Array | Uint32Array; topology: number;\n triangleIds?: Uint32Array; ids: Uint32Array;\n }>();\n private parts: Uint32Array[] = [];\n private tlasRecords = -1;\n private combined?: Uint32Array;\n\n get(source: Pick<AovSceneSource, 'blases' | 'geometries'>, tlas: FlattendBVH) {\n const parts = source.blases.map((blas, index) => {\n const geometry = source.geometries[index], indices = geometry.indexArray;\n const buffer = blas.bvh.buffer, triangleIds = blas.bvh.triangleIds;\n const cached = this.blases.get(buffer);\n if (cached && cached.geometry === geometry && cached.indices === indices &&\n cached.topology === geometry.topologyVersion && cached.triangleIds === triangleIds) return cached.ids;\n const bvh = new Uint32Array(buffer), ids = new Uint32Array(bvh.length / 4).fill(AOV_BACKGROUND_ID);\n matchSourceTriangles(bvh, indices, ids);\n // Builder metadata distinguishes displaced/duplicate index triples.\n if (triangleIds) for (let i = 0; i < triangleIds.length; i += 2) ids[triangleIds[i]] = triangleIds[i+1];\n this.blases.set(buffer, {geometry, indices, topology: geometry.topologyVersion, triangleIds, ids});\n return ids;\n });\n const tlasRecords = tlas.buffer.byteLength / 16;\n if (!this.combined || this.tlasRecords !== tlasRecords || parts.length !== this.parts.length ||\n parts.some((part, i) => part !== this.parts[i])) {\n const combined = new Uint32Array(tlasRecords + parts.reduce((count, part) => count + part.length, 0)).fill(AOV_BACKGROUND_ID);\n let offset = tlasRecords;\n for (const part of parts) { combined.set(part, offset); offset += part.length; }\n this.combined = combined; this.parts = parts; this.tlasRecords = tlasRecords;\n }\n return this.combined;\n }\n}\n\n/**\n * Writes the source triangle whose index triple equals each record's first\n * three words; the last duplicate wins. Triangles are bucketed by first index\n * in typed arrays, so a lookup compares only the triangles sharing that vertex.\n */\nfunction matchSourceTriangles(bvh: Uint32Array, indices: Uint16Array | Uint32Array, ids: Uint32Array) {\n const triangles = indices.length / 3;\n let vertices = 0;\n for (let i = 0; i < indices.length; i += 3) if (indices[i] >= vertices) vertices = indices[i] + 1;\n const start = new Uint32Array(vertices + 1);\n for (let t = 0; t < triangles; t++) start[indices[t*3] + 1]++;\n for (let v = 0; v < vertices; v++) start[v + 1] += start[v];\n // Each bucket stores (second index, third index, triangle) contiguously, so\n // a lookup touches one random cache line instead of three.\n const entries = new Uint32Array(triangles * 3), next = start.slice(0, vertices);\n for (let t = 0; t < triangles; t++) {\n const e = next[indices[t*3]]++ * 3;\n entries[e] = indices[t*3 + 1]; entries[e + 1] = indices[t*3 + 2]; entries[e + 2] = t;\n }\n for (let record = 0; record < ids.length; record++) {\n const a = bvh[record*4];\n if (a >= vertices) continue;\n const b = bvh[record*4 + 1], c = bvh[record*4 + 2];\n for (let e = start[a + 1] * 3; (e -= 3) >= start[a] * 3;) {\n if (entries[e] === b && entries[e + 1] === c) { ids[record] = entries[e + 2]; break; }\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type { PostProcess, PostProcessContext } from '../Display.js';
|
|
2
|
-
|
|
1
|
+
import type { PostProcess, PostProcessContext, PostProcessOptions } from '../Display.js';
|
|
2
|
+
type Size = {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
};
|
|
6
|
+
/** Target-owned images. A failed chain never replaces the composed image. */
|
|
3
7
|
export declare class DisplayPostProcess {
|
|
4
8
|
private readonly device;
|
|
5
9
|
private textures;
|
|
@@ -10,5 +14,6 @@ export declare class DisplayPostProcess {
|
|
|
10
14
|
getMemoryBytes(): number;
|
|
11
15
|
private retire;
|
|
12
16
|
dispose(): void;
|
|
13
|
-
run(input: GPUTexture, passes: readonly PostProcess[], render: PostProcessContext['render']): void;
|
|
17
|
+
run(input: GPUTexture, passes: readonly PostProcess[], render: PostProcessContext['render'], display?: Size, options?: readonly PostProcessOptions[], crop?: Size): void;
|
|
14
18
|
}
|
|
19
|
+
export {};
|