@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/RenderLoop.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { scheduleFrame } from './util/frame.js';
|
|
2
2
|
import Render from './Render.js';
|
|
3
3
|
import { Events } from './util/events.js';
|
|
4
|
-
import { updateProgressiveState, loopImageState } from './renderer/progressiveScheduler.js';
|
|
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,11 +23,16 @@ export default class RenderLoop {
|
|
|
22
23
|
_busy = false;
|
|
23
24
|
_disposed = false;
|
|
24
25
|
_cancelScheduled;
|
|
26
|
+
_refillController;
|
|
27
|
+
_cancelRefillFrame;
|
|
25
28
|
_warnedTick = false;
|
|
26
29
|
/** Render whose next presentation is waiting for a complete preview frame. */
|
|
27
30
|
_previewFrameOwner;
|
|
28
31
|
_presented;
|
|
32
|
+
_inferenceHoldStart;
|
|
33
|
+
_lastError;
|
|
29
34
|
_finishedImage;
|
|
35
|
+
_motion;
|
|
30
36
|
_unsubscribe;
|
|
31
37
|
constructor(engine, options = {}) {
|
|
32
38
|
this.engine = engine;
|
|
@@ -56,8 +62,11 @@ export default class RenderLoop {
|
|
|
56
62
|
for (const sync of syncs)
|
|
57
63
|
this.addSync(sync);
|
|
58
64
|
this._unsubscribe = this.final.on('sample', event => this._events.emit('sample', { ...event, preview: false }));
|
|
59
|
-
if (typeof document !== 'undefined')
|
|
65
|
+
if (typeof document !== 'undefined') {
|
|
60
66
|
document.addEventListener('visibilitychange', this._visibility);
|
|
67
|
+
for (const event of this._inputEvents)
|
|
68
|
+
document.addEventListener(event, this._input, { capture: true, passive: true });
|
|
69
|
+
}
|
|
61
70
|
}
|
|
62
71
|
_render(value, defaults) {
|
|
63
72
|
if (value instanceof Render)
|
|
@@ -78,8 +87,9 @@ export default class RenderLoop {
|
|
|
78
87
|
_assertAlive() { if (this._disposed)
|
|
79
88
|
throw new Error('RenderLoop is disposed.'); }
|
|
80
89
|
/** Whether an explicit integration or consecutive edits indicate motion. Default false. */ get changing() { return this._changing; }
|
|
81
|
-
/** Complete final samples; preview sampling
|
|
90
|
+
/** Complete final beauty samples; preview and AOV-only sampling are excluded. Default 0. */ get samples() { return this.status === 'previewing' ? 0 : this.final.samples; }
|
|
82
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; }
|
|
83
93
|
/** Subscribes to status transitions or complete final samples; returns unsubscribe. */
|
|
84
94
|
on(event, listener) { return this._events.on(event, listener); }
|
|
85
95
|
/** Adds an integration on this engine. Duplicate registrations are ignored. */
|
|
@@ -111,15 +121,47 @@ export default class RenderLoop {
|
|
|
111
121
|
}
|
|
112
122
|
return this._tick();
|
|
113
123
|
}
|
|
124
|
+
// Anything thrown here would otherwise repeat every frame while status keeps
|
|
125
|
+
// reporting the last healthy state.
|
|
114
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() {
|
|
143
|
+
this._cancelRefill();
|
|
144
|
+
const controller = this._refillController = new AbortController();
|
|
115
145
|
if (this._busy || (typeof document !== 'undefined' && document.hidden))
|
|
116
146
|
return this.status;
|
|
117
147
|
for (const sync of this._syncs)
|
|
118
148
|
sync.update();
|
|
149
|
+
const aov = aovChannel(this.display.channel);
|
|
150
|
+
const refine = (render) => render.refine(aov, {
|
|
151
|
+
batchSamples: render.batchSamples && !this.changing && render !== this.preview,
|
|
152
|
+
targetBatchTimeMs: 4,
|
|
153
|
+
});
|
|
154
|
+
const samples = (render) => aov ? render.aovSamplesRendered : render.samples;
|
|
119
155
|
const owner = this._previewFrameOwner;
|
|
120
|
-
const pendingPreview = !!owner && (owner === this.preview || !owner.
|
|
121
|
-
const tracingPreview = pendingPreview && this.preview?.status === 'converging' && this.preview
|
|
122
|
-
const
|
|
156
|
+
const pendingPreview = !!owner && (owner === this.preview || !owner._completeFor(this.display.channel));
|
|
157
|
+
const tracingPreview = pendingPreview && this.preview?.status === 'converging' && samples(this.preview) === 0;
|
|
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);
|
|
123
165
|
// Inference belongs to a presentation, not merely to a background render.
|
|
124
166
|
// A fallback result must never replace an already available final image.
|
|
125
167
|
if (pendingPreview && !holding && this.preview)
|
|
@@ -135,7 +177,7 @@ export default class RenderLoop {
|
|
|
135
177
|
// Finish this image against its committed camera while syncs collect the
|
|
136
178
|
// latest input. Restarting its first tile on every edit starves presentation.
|
|
137
179
|
if (tracingPreview) {
|
|
138
|
-
const status = this.preview
|
|
180
|
+
const status = refine(this.preview);
|
|
139
181
|
if (status === 'error') {
|
|
140
182
|
this._previewFrameOwner = undefined;
|
|
141
183
|
return this._setStatus('error');
|
|
@@ -146,28 +188,81 @@ export default class RenderLoop {
|
|
|
146
188
|
return this._setStatus('previewing');
|
|
147
189
|
}
|
|
148
190
|
const current = selected === 'preview' && this.preview ? this.preview : this.final;
|
|
191
|
+
const idle = !changed && !this.changing;
|
|
192
|
+
if (aov !== 'motion')
|
|
193
|
+
this._motion = undefined;
|
|
194
|
+
else if (this._motion?.render !== current) {
|
|
195
|
+
// Targets have independent histories. Prime every target switch, even
|
|
196
|
+
// when a final small camera edit coincides with leaving preview.
|
|
197
|
+
this._motion = { render: current, phase: this._motion ? 'priming' : 'moving' };
|
|
198
|
+
}
|
|
199
|
+
else if ((!idle && this._motion.phase !== 'priming') || (!current._completeFor('motion') && this._motion.phase === 'settled')) {
|
|
200
|
+
this._motion.phase = 'moving';
|
|
201
|
+
}
|
|
202
|
+
const motion = this._motion;
|
|
149
203
|
const imageState = loopImageState(this.final, this.display);
|
|
150
|
-
if (
|
|
204
|
+
if (idle && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage && (!motion || motion.phase === 'settled'))
|
|
151
205
|
return this.status;
|
|
152
206
|
// Invalidate a completed filter before refinement when display settings changed.
|
|
153
207
|
if (this.status === 'finished' && imageState !== this._finishedImage && this.final.samples > 0)
|
|
154
208
|
this._present(this.final);
|
|
155
|
-
|
|
209
|
+
// Motion describes successive images. One unchanged image retires the last
|
|
210
|
+
// displacement; afterwards leave the finished target idle as usual.
|
|
211
|
+
if (motion?.phase === 'moving' && idle && current._completeFor('motion')) {
|
|
212
|
+
current._restartAovs();
|
|
213
|
+
motion.phase = 'settling';
|
|
214
|
+
}
|
|
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);
|
|
232
|
+
if (motion?.phase === 'priming' && status === 'finished') {
|
|
233
|
+
current._restartAovs();
|
|
234
|
+
motion.phase = 'settling';
|
|
235
|
+
status = refine(current);
|
|
236
|
+
}
|
|
237
|
+
if (motion?.phase === 'settling' && status === 'finished')
|
|
238
|
+
motion.phase = 'settled';
|
|
156
239
|
// Keep the canvas on the last completed image while filtering the next
|
|
157
240
|
// preview; presenting its raw sample here would overwrite the denoise above.
|
|
158
|
-
const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && current
|
|
159
|
-
(current === this.preview || (!current.
|
|
241
|
+
const waitingForPreview = !!this.preview && ((current === this.preview && status === 'converging' && samples(current) === 0) || (!aov && this.coalesceSceneUpdates && this.preview.denoising)) &&
|
|
242
|
+
(current === this.preview || (!current._completeFor(this.display.channel) && current.fallback === this.preview));
|
|
160
243
|
if (waitingForPreview)
|
|
161
244
|
this._previewFrameOwner = current;
|
|
162
245
|
else
|
|
163
246
|
this._present(current);
|
|
164
247
|
// Execution may already be tracing final tiles while the canvas still shows
|
|
165
248
|
// preview. Only a successful presentation transfers ownership of the image.
|
|
166
|
-
const previewing = waitingForPreview || (current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);
|
|
249
|
+
const previewing = waitingForPreview || (!aov && current === this.preview && current.denoising) || (!!this.preview && this._presented === this.preview);
|
|
167
250
|
const next = status === 'error' ? 'error' : previewing ? 'previewing' : status;
|
|
168
251
|
this._finishedImage = next === 'finished' ? loopImageState(this.final, this.display) : undefined;
|
|
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();
|
|
169
258
|
return this._setStatus(next);
|
|
170
259
|
}
|
|
260
|
+
_cancelRefill() {
|
|
261
|
+
this._refillController?.abort();
|
|
262
|
+
this._refillController = undefined;
|
|
263
|
+
this._cancelRefillFrame?.();
|
|
264
|
+
this._cancelRefillFrame = undefined;
|
|
265
|
+
}
|
|
171
266
|
_schedule() {
|
|
172
267
|
if (!this._running || this._busy || this._cancelScheduled !== undefined || (typeof document !== 'undefined' && document.hidden))
|
|
173
268
|
return;
|
|
@@ -178,15 +273,21 @@ export default class RenderLoop {
|
|
|
178
273
|
this._schedule();
|
|
179
274
|
} });
|
|
180
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(); };
|
|
181
280
|
_visibility = () => {
|
|
182
|
-
if (document.hidden)
|
|
281
|
+
if (document.hidden) {
|
|
183
282
|
this._cancelFrame();
|
|
283
|
+
this._cancelRefill();
|
|
284
|
+
}
|
|
184
285
|
else
|
|
185
286
|
this._schedule();
|
|
186
287
|
};
|
|
187
288
|
_cancelFrame() { this._cancelScheduled?.(); this._cancelScheduled = undefined; }
|
|
188
289
|
/** Starts an idempotent loop; uses a 16 ms timer without rAF. Hidden pages pause automatically. */ start() { this._assertAlive(); this._running = true; this._schedule(); }
|
|
189
|
-
/** Stops scheduling without discarding accumulated images. */ stop() { this._running = false; this._cancelFrame(); }
|
|
290
|
+
/** Stops scheduling without discarding accumulated images. */ stop() { this._running = false; this._cancelFrame(); this._cancelRefill(); }
|
|
190
291
|
/** Pauses ticks, converges final, presents it, and resumes a previously running loop. */
|
|
191
292
|
async converge(options) {
|
|
192
293
|
this._assertAlive();
|
|
@@ -195,6 +296,7 @@ export default class RenderLoop {
|
|
|
195
296
|
this._busy = true;
|
|
196
297
|
this._previewFrameOwner = undefined;
|
|
197
298
|
this._cancelFrame();
|
|
299
|
+
this._cancelRefill();
|
|
198
300
|
try {
|
|
199
301
|
for (const sync of this._syncs)
|
|
200
302
|
sync.update();
|
|
@@ -226,8 +328,11 @@ export default class RenderLoop {
|
|
|
226
328
|
this._unsubscribe();
|
|
227
329
|
this._events.clear();
|
|
228
330
|
this._syncs.clear();
|
|
229
|
-
if (typeof document !== 'undefined')
|
|
331
|
+
if (typeof document !== 'undefined') {
|
|
230
332
|
document.removeEventListener('visibilitychange', this._visibility);
|
|
333
|
+
for (const event of this._inputEvents)
|
|
334
|
+
document.removeEventListener(event, this._input, true);
|
|
335
|
+
}
|
|
231
336
|
for (const render of this._owned)
|
|
232
337
|
render.dispose();
|
|
233
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 { 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 _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 _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 samples; preview sampling is 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 if (this._busy || (typeof document !== 'undefined' && document.hidden)) return this.status;\n for (const sync of this._syncs) sync.update();\n const owner = this._previewFrameOwner;\n const pendingPreview = !!owner && (owner === this.preview || !owner._complete);\n const tracingPreview = pendingPreview && this.preview?.status === 'converging' && this.preview.samples === 0;\n const holding = tracingPreview || (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 = this.preview.refine();\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 imageState = loopImageState(this.final, this.display);\n if (!changed && !this.changing && current === this.final && this.status === 'finished' && this.final.status === 'finished' && imageState === this._finishedImage) 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 const status = current.refine();\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' && current.samples === 0) || (this.coalesceSceneUpdates && this.preview.denoising)) &&\n (current === this.preview || (!current._complete && 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 || (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 return this._setStatus(next);\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(); 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(); }\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();\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
|
@@ -15,7 +15,7 @@ export type { OfflineAdaptiveSamplingOptions, OfflineVarianceHistory } from './r
|
|
|
15
15
|
export type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileOptions, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';
|
|
16
16
|
export { DEFAULT_JNLM_OPTIONS } from './renderer/jnlm.js';
|
|
17
17
|
export type { JNLMOptions } from './renderer/jnlm.js';
|
|
18
|
-
export type { AnalyticLight, GroundedSkyboxBackground, Scene, SceneBackground, SceneLight } from './scene/Scene.js';
|
|
18
|
+
export type { AnalyticLight, EquirectBackground, GroundedSkyboxBackground, Scene, SceneBackground, SceneLight } from './scene/Scene.js';
|
|
19
19
|
export { default as Camera } from './scene/Camera.js';
|
|
20
20
|
export { default as Mesh } from './scene/Mesh.js';
|
|
21
21
|
export { default as InstancedMesh } from './scene/InstancedMesh.js';
|
|
@@ -26,6 +26,8 @@ export type { GeometryInit } from './scene/Geometry.js';
|
|
|
26
26
|
export type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';
|
|
27
27
|
export { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';
|
|
28
28
|
export type { MaterialAlphaMode, UVProjection } from './scene/OpenPBRMaterial.js';
|
|
29
|
+
export { default as ProceduralSky } from './scene/ProceduralSky.js';
|
|
30
|
+
export type { ProceduralSkyOptions } from './scene/ProceduralSky.js';
|
|
29
31
|
export { default as Texture } from './scene/Texture.js';
|
|
30
32
|
export type { TextureDataSource, TextureWrapMode, TextureColorSpace } from './scene/Texture.js';
|
|
31
33
|
export type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';
|
|
@@ -47,10 +49,11 @@ export type { SamplingPattern } from './renderer/sampling.js';
|
|
|
47
49
|
export { default as Engine } from './Engine.js';
|
|
48
50
|
export type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';
|
|
49
51
|
export { default as Display } from './Display.js';
|
|
50
|
-
export type { BlobOptions, DisplayChannel, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';
|
|
52
|
+
export type { BlobOptions, DisplayChannel, AovIdComponent, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';
|
|
51
53
|
export { default as Render } from './Render.js';
|
|
52
|
-
export type { RenderOptions, RenderSettings, 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';
|
|
53
55
|
export { default as Sync } from './Sync.js';
|
|
54
56
|
export { default as RenderLoop } from './RenderLoop.js';
|
|
55
57
|
export type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';
|
|
56
58
|
export { getRecommendedDeviceDescriptor } from './renderer/deviceRequirements.js';
|
|
59
|
+
export type { AovKind } from './renderer/aov.js';
|
package/lib/main.js
CHANGED
|
@@ -17,6 +17,7 @@ export { default as InstancedMesh } from './scene/InstancedMesh.js';
|
|
|
17
17
|
export { default as SceneNode } from './scene/SceneNode.js';
|
|
18
18
|
export { default as Geometry, Attribute as GeometryAttribute } from './scene/Geometry.js';
|
|
19
19
|
export { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';
|
|
20
|
+
export { default as ProceduralSky } from './scene/ProceduralSky.js';
|
|
20
21
|
export { default as Texture } from './scene/Texture.js';
|
|
21
22
|
// Lights
|
|
22
23
|
export { default as AmbientLight } from './scene/AmbientLight.js';
|
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;
|
|
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, 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"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MathArray, ReadonlyMathArray } from './types.js';
|
|
2
|
+
export declare function read(array: ReadonlyMathArray, index: number): number;
|
|
3
|
+
export declare function write(array: MathArray, index: number, value: number): void;
|
|
4
|
+
export declare function size(array: ReadonlyMathArray): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/math/access.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,IAAI,CAAC,KAAwB,EAAE,KAAa;IAC1D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,KAAgB,EAAE,KAAa,EAAE,KAAa;IAClE,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AACvB,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,KAAwB;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC","sourcesContent":["import type { MathArray, ReadonlyMathArray } from './types.js';\n\nexport function read(array: ReadonlyMathArray, index: number): number {\n return array[index];\n}\nexport function write(array: MathArray, index: number, value: number): void {\n array[index] = value;\n}\nexport function size(array: ReadonlyMathArray): number {\n return array.length;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MathArray, ReadonlyMathArray } from './types.js';
|
|
2
|
+
export declare function create(): Float32Array;
|
|
3
|
+
export declare function fromMat4<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0;
|
|
4
|
+
export declare function normalFromMat4<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0 | null;
|
package/lib/math/mat3.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function create() {
|
|
2
|
+
var out = new Float32Array(9);
|
|
3
|
+
out[0] = 1;
|
|
4
|
+
out[4] = 1;
|
|
5
|
+
out[8] = 1;
|
|
6
|
+
return out;
|
|
7
|
+
}
|
|
8
|
+
export function fromMat4(out, a) {
|
|
9
|
+
out[0] = a[0];
|
|
10
|
+
out[1] = a[1];
|
|
11
|
+
out[2] = a[2];
|
|
12
|
+
out[3] = a[4];
|
|
13
|
+
out[4] = a[5];
|
|
14
|
+
out[5] = a[6];
|
|
15
|
+
out[6] = a[8];
|
|
16
|
+
out[7] = a[9];
|
|
17
|
+
out[8] = a[10];
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
export function normalFromMat4(out, a) {
|
|
21
|
+
var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3];
|
|
22
|
+
var a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7];
|
|
23
|
+
var a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11];
|
|
24
|
+
var a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];
|
|
25
|
+
var b00 = a00 * a11 - a01 * a10;
|
|
26
|
+
var b01 = a00 * a12 - a02 * a10;
|
|
27
|
+
var b02 = a00 * a13 - a03 * a10;
|
|
28
|
+
var b03 = a01 * a12 - a02 * a11;
|
|
29
|
+
var b04 = a01 * a13 - a03 * a11;
|
|
30
|
+
var b05 = a02 * a13 - a03 * a12;
|
|
31
|
+
var b06 = a20 * a31 - a21 * a30;
|
|
32
|
+
var b07 = a20 * a32 - a22 * a30;
|
|
33
|
+
var b08 = a20 * a33 - a23 * a30;
|
|
34
|
+
var b09 = a21 * a32 - a22 * a31;
|
|
35
|
+
var b10 = a21 * a33 - a23 * a31;
|
|
36
|
+
var b11 = a22 * a33 - a23 * a32;
|
|
37
|
+
// Calculate the determinant
|
|
38
|
+
var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
|
|
39
|
+
if (!det) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
det = 1.0 / det;
|
|
43
|
+
out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
|
|
44
|
+
out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
|
|
45
|
+
out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
|
|
46
|
+
out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
|
|
47
|
+
out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
|
|
48
|
+
out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
|
|
49
|
+
out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
|
|
50
|
+
out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
|
|
51
|
+
out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=mat3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mat3.js","sourceRoot":"","sources":["../../src/math/mat3.ts"],"names":[],"mappings":"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G,GAAG,CAAC;IAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["// Adapted from gl-matrix 3.4.4, https://github.com/toji/gl-matrix/tree/v3.4.4/src\n// Copyright (c) 2015-2025 Brandon Jones and Colin MacKenzie IV, MIT.\n// See LICENSES/GlMatrix-MIT.txt. Arithmetic/order retained; creators use Float32Array.\nimport type { MathArray, ReadonlyMathArray } from './types.js';\n\nexport function create(): Float32Array {\n var out = new Float32Array(9);\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n\nexport function fromMat4<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0 {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n\nexport function normalFromMat4<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0 | null {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n return out;\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MathArray, ReadonlyMathArray } from './types.js';
|
|
2
|
+
export declare function copy<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0;
|
|
3
|
+
export declare function create(): Float32Array;
|
|
4
|
+
export declare function invert<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1): T0 | null;
|
|
5
|
+
export declare function lookAt<T0 extends MathArray, T1 extends ReadonlyMathArray, T2 extends ReadonlyMathArray, T3 extends ReadonlyMathArray>(out: T0, eye: T1, center: T2, up: T3): T0;
|
|
6
|
+
export declare function identity<T0 extends MathArray>(out: T0): T0;
|
|
7
|
+
export declare function targetTo<T0 extends MathArray, T1 extends ReadonlyMathArray, T2 extends ReadonlyMathArray, T3 extends ReadonlyMathArray>(out: T0, eye: T1, target: T2, up: T3): T0;
|
|
8
|
+
export declare function getScaling<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, mat: T1): T0;
|
|
9
|
+
export declare const mul: typeof multiply;
|
|
10
|
+
export declare function multiply<T0 extends MathArray, T1 extends ReadonlyMathArray, T2 extends ReadonlyMathArray>(out: T0, a: T1, b: T2): T0;
|
|
11
|
+
export declare const ortho: typeof orthoNO;
|
|
12
|
+
export declare function orthoNO<T0 extends MathArray>(out: T0, left: number, right: number, bottom: number, top: number, near: number, far: number): T0;
|
|
13
|
+
export declare const perspective: typeof perspectiveNO;
|
|
14
|
+
export declare function perspectiveNO<T0 extends MathArray>(out: T0, fovy: number, aspect: number, near: number, far: number | null): T0;
|
|
15
|
+
export declare function scale<T0 extends MathArray, T1 extends ReadonlyMathArray, T2 extends ReadonlyMathArray>(out: T0, a: T1, v: T2): T0;
|
|
16
|
+
export declare function rotateZ<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, a: T1, rad: number): T0;
|
|
17
|
+
export declare function fromScaling<T0 extends MathArray, T1 extends ReadonlyMathArray>(out: T0, v: T1): T0;
|
|
18
|
+
export declare function translate<T0 extends MathArray, T1 extends ReadonlyMathArray, T2 extends ReadonlyMathArray>(out: T0, a: T1, v: T2): T0;
|
|
19
|
+
export type Mat4Array = Float32Array | Float64Array | number[];
|