@meimu/mutracer 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
- package/LICENSES/GlMatrix-MIT.txt +19 -0
- package/LICENSES/KinoBloom-MIT.txt +21 -0
- package/LICENSES/OIDNWeb-MIT.txt +21 -0
- package/LICENSES/Octicons-MIT.txt +21 -0
- package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
- package/LICENSES/TinyBVH-MIT.txt +21 -0
- package/LICENSES/WebGPUUtils-MIT.txt +21 -0
- package/LICENSES/ZetaRay-MIT.txt +21 -0
- package/README.md +195 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14352 -0
- package/docs/api.md +394 -0
- package/docs/bvh.md +141 -0
- package/docs/denoising.md +301 -0
- package/docs/getting-started.md +308 -0
- package/docs/materials.md +281 -0
- package/docs/performance.md +85 -0
- package/docs/post-processing.md +87 -0
- package/docs/progressive-rendering.md +144 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +273 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +121 -0
- package/lib/Display.js.map +1 -0
- package/lib/Engine.d.ts +161 -0
- package/lib/Engine.js +681 -0
- package/lib/Engine.js.map +1 -0
- package/lib/Render.d.ts +256 -0
- package/lib/Render.js +671 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +76 -0
- package/lib/RenderLoop.js +204 -0
- package/lib/RenderLoop.js.map +1 -0
- package/lib/Sync.d.ts +19 -0
- package/lib/Sync.js +19 -0
- package/lib/Sync.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +3 -0
- package/lib/constants.js.map +1 -0
- package/lib/main.d.ts +56 -0
- package/lib/main.js +43 -0
- package/lib/main.js.map +1 -0
- package/lib/math.d.ts +23 -0
- package/lib/math.js +56 -0
- package/lib/math.js.map +1 -0
- package/lib/oidn.d.ts +45 -0
- package/lib/oidn.js +42 -0
- package/lib/oidn.js.map +1 -0
- package/lib/oidnBundledWeights.cdn.d.ts +2 -0
- package/lib/oidnBundledWeights.cdn.js +5 -0
- package/lib/oidnBundledWeights.cdn.js.map +1 -0
- package/lib/oidnBundledWeights.d.ts +2 -0
- package/lib/oidnBundledWeights.js +4 -0
- package/lib/oidnBundledWeights.js.map +1 -0
- package/lib/renderer/DisplayPostProcess.d.ts +14 -0
- package/lib/renderer/DisplayPostProcess.js +41 -0
- package/lib/renderer/DisplayPostProcess.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +119 -0
- package/lib/renderer/MaterialTable.js +550 -0
- package/lib/renderer/MaterialTable.js.map +1 -0
- package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
- package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
- package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
- package/lib/renderer/RenderingPipeline.d.ts +232 -0
- package/lib/renderer/RenderingPipeline.js +18 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -0
- package/lib/renderer/ScratchPool.d.ts +13 -0
- package/lib/renderer/ScratchPool.js +21 -0
- package/lib/renderer/ScratchPool.js.map +1 -0
- package/lib/renderer/TileRender.d.ts +44 -0
- package/lib/renderer/TileRender.js +283 -0
- package/lib/renderer/TileRender.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.d.ts +17 -0
- package/lib/renderer/WGPUBloomPass.js +243 -0
- package/lib/renderer/WGPUBloomPass.js.map +1 -0
- package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
- package/lib/renderer/WGPUCanvasSurface.js +48 -0
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +73 -0
- package/lib/renderer/WGPUComputePass.js +317 -0
- package/lib/renderer/WGPUComputePass.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
- package/lib/renderer/WGPUFullQuadPass.js +389 -0
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
- package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
- package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
- package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
- package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
- package/lib/renderer/WGPURayTraceOutput.js +368 -0
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
- package/lib/renderer/WGPURayTracePass.d.ts +284 -0
- package/lib/renderer/WGPURayTracePass.js +2323 -0
- package/lib/renderer/WGPURayTracePass.js.map +1 -0
- package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
- package/lib/renderer/WGPURenderingPipeline.js +1446 -0
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
- package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
- package/lib/renderer/WGPUSceneFeatures.js +20 -0
- package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
- package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
- package/lib/renderer/WGPUScratchBuffer.js +21 -0
- package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
- package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
- package/lib/renderer/WGPUScratchTexture.js +27 -0
- package/lib/renderer/WGPUScratchTexture.js.map +1 -0
- package/lib/renderer/WGPUShaderCache.d.ts +26 -0
- package/lib/renderer/WGPUShaderCache.js +103 -0
- package/lib/renderer/WGPUShaderCache.js.map +1 -0
- package/lib/renderer/WebGLBloomPass.d.ts +18 -0
- package/lib/renderer/WebGLBloomPass.js +113 -0
- package/lib/renderer/WebGLBloomPass.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
- package/lib/renderer/WebGLFullQuadPass.js +208 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
- package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
- package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
- package/lib/renderer/WebGLRayTracePass.js +845 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -0
- package/lib/renderer/WebGLReadback.d.ts +4 -0
- package/lib/renderer/WebGLReadback.js +75 -0
- package/lib/renderer/WebGLReadback.js.map +1 -0
- package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
- package/lib/renderer/WebGLRenderingPipeline.js +510 -0
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
- package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
- package/lib/renderer/WebGLScratchCopy.js +27 -0
- package/lib/renderer/WebGLScratchCopy.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +26 -0
- package/lib/renderer/accumulationTarget.js +2 -0
- package/lib/renderer/accumulationTarget.js.map +1 -0
- package/lib/renderer/binnedSahBvh.d.ts +31 -0
- package/lib/renderer/binnedSahBvh.js +263 -0
- package/lib/renderer/binnedSahBvh.js.map +1 -0
- package/lib/renderer/bvh.worker.d.ts +1 -0
- package/lib/renderer/bvh.worker.js +16 -0
- package/lib/renderer/bvh.worker.js.map +1 -0
- package/lib/renderer/bvhAccel.d.ts +81 -0
- package/lib/renderer/bvhAccel.js +621 -0
- package/lib/renderer/bvhAccel.js.map +1 -0
- package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
- package/lib/renderer/bvhWorkerBuild.js +17 -0
- package/lib/renderer/bvhWorkerBuild.js.map +1 -0
- package/lib/renderer/bvhWorkerClient.d.ts +57 -0
- package/lib/renderer/bvhWorkerClient.js +166 -0
- package/lib/renderer/bvhWorkerClient.js.map +1 -0
- package/lib/renderer/cameraLens.d.ts +5 -0
- package/lib/renderer/cameraLens.js +15 -0
- package/lib/renderer/cameraLens.js.map +1 -0
- package/lib/renderer/cameraSnapshot.d.ts +3 -0
- package/lib/renderer/cameraSnapshot.js +7 -0
- package/lib/renderer/cameraSnapshot.js.map +1 -0
- package/lib/renderer/committedScene.d.ts +13 -0
- package/lib/renderer/committedScene.js +121 -0
- package/lib/renderer/committedScene.js.map +1 -0
- package/lib/renderer/dataTextureUtil.d.ts +32 -0
- package/lib/renderer/dataTextureUtil.js +46 -0
- package/lib/renderer/dataTextureUtil.js.map +1 -0
- package/lib/renderer/denoiser.d.ts +65 -0
- package/lib/renderer/denoiser.js +2 -0
- package/lib/renderer/denoiser.js.map +1 -0
- package/lib/renderer/depthQuery.d.ts +14 -0
- package/lib/renderer/depthQuery.js +14 -0
- package/lib/renderer/depthQuery.js.map +1 -0
- package/lib/renderer/deviceRequirements.d.ts +23 -0
- package/lib/renderer/deviceRequirements.js +50 -0
- package/lib/renderer/deviceRequirements.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +10 -0
- package/lib/renderer/envMapCreation.js +96 -0
- package/lib/renderer/envMapCreation.js.map +1 -0
- package/lib/renderer/envMapDistribution.d.ts +9 -0
- package/lib/renderer/envMapDistribution.js +107 -0
- package/lib/renderer/envMapDistribution.js.map +1 -0
- package/lib/renderer/float16.d.ts +1 -0
- package/lib/renderer/float16.js +19 -0
- package/lib/renderer/float16.js.map +1 -0
- package/lib/renderer/geometryBvh.d.ts +11 -0
- package/lib/renderer/geometryBvh.js +24 -0
- package/lib/renderer/geometryBvh.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +28 -0
- package/lib/renderer/geometryUpdates.js +131 -0
- package/lib/renderer/geometryUpdates.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
- package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
- package/lib/renderer/glsl/depthQuery.frag.js +55 -0
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
- package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/rayTrace.frag.js +619 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
- package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
- package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
- package/lib/renderer/gpuMemory.d.ts +2 -0
- package/lib/renderer/gpuMemory.js +10 -0
- package/lib/renderer/gpuMemory.js.map +1 -0
- package/lib/renderer/halton.d.ts +1 -0
- package/lib/renderer/halton.js +15 -0
- package/lib/renderer/halton.js.map +1 -0
- package/lib/renderer/jnlm.d.ts +85 -0
- package/lib/renderer/jnlm.js +87 -0
- package/lib/renderer/jnlm.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +75 -0
- package/lib/renderer/lightSampling.js +305 -0
- package/lib/renderer/lightSampling.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +26 -0
- package/lib/renderer/lightsUtil.js +154 -0
- package/lib/renderer/lightsUtil.js.map +1 -0
- package/lib/renderer/materialChanges.d.ts +13 -0
- package/lib/renderer/materialChanges.js +59 -0
- package/lib/renderer/materialChanges.js.map +1 -0
- package/lib/renderer/materialComparison.generated.d.ts +5 -0
- package/lib/renderer/materialComparison.generated.js +655 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +6 -0
- package/lib/renderer/materialConstants.js +3 -0
- package/lib/renderer/materialConstants.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +9 -0
- package/lib/renderer/materialEmission.js +21 -0
- package/lib/renderer/materialEmission.js.map +1 -0
- package/lib/renderer/materialIndices.d.ts +7 -0
- package/lib/renderer/materialIndices.js +34 -0
- package/lib/renderer/materialIndices.js.map +1 -0
- package/lib/renderer/materialLayout.d.ts +102 -0
- package/lib/renderer/materialLayout.js +189 -0
- package/lib/renderer/materialLayout.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +537 -0
- package/lib/renderer/materialTextureSlots.js +219 -0
- package/lib/renderer/materialTextureSlots.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
- package/lib/renderer/mergeMeshesToGeometry.js +236 -0
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
- package/lib/renderer/meshInstances.d.ts +23 -0
- package/lib/renderer/meshInstances.js +66 -0
- package/lib/renderer/meshInstances.js.map +1 -0
- package/lib/renderer/meshMembership.d.ts +10 -0
- package/lib/renderer/meshMembership.js +72 -0
- package/lib/renderer/meshMembership.js.map +1 -0
- package/lib/renderer/oidnNetwork.d.ts +20 -0
- package/lib/renderer/oidnNetwork.js +123 -0
- package/lib/renderer/oidnNetwork.js.map +1 -0
- package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
- package/lib/renderer/openPbrEnergyLut.js +965 -0
- package/lib/renderer/openPbrEnergyLut.js.map +1 -0
- package/lib/renderer/pathLimits.d.ts +4 -0
- package/lib/renderer/pathLimits.js +7 -0
- package/lib/renderer/pathLimits.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +110 -0
- package/lib/renderer/prepareMeshBVH.js +857 -0
- package/lib/renderer/prepareMeshBVH.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +11 -0
- package/lib/renderer/progressiveScheduler.js +19 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -0
- package/lib/renderer/renderPipeline.d.ts +57 -0
- package/lib/renderer/renderPipeline.js +49 -0
- package/lib/renderer/renderPipeline.js.map +1 -0
- package/lib/renderer/sampling.d.ts +10 -0
- package/lib/renderer/sampling.js +28 -0
- package/lib/renderer/sampling.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +29 -0
- package/lib/renderer/sceneChangeDetector.js +232 -0
- package/lib/renderer/sceneChangeDetector.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +14 -0
- package/lib/renderer/sceneLightChanges.js +34 -0
- package/lib/renderer/sceneLightChanges.js.map +1 -0
- package/lib/renderer/scratchSampling.d.ts +3 -0
- package/lib/renderer/scratchSampling.js +39 -0
- package/lib/renderer/scratchSampling.js.map +1 -0
- package/lib/renderer/shader.d.ts +37 -0
- package/lib/renderer/shader.js +41 -0
- package/lib/renderer/shader.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +24 -0
- package/lib/renderer/staticBvhPreparation.js +116 -0
- package/lib/renderer/staticBvhPreparation.js.map +1 -0
- package/lib/renderer/textureRegion.d.ts +8 -0
- package/lib/renderer/textureRegion.js +9 -0
- package/lib/renderer/textureRegion.js.map +1 -0
- package/lib/renderer/texturesFromMaterials.d.ts +6 -0
- package/lib/renderer/texturesFromMaterials.js +37 -0
- package/lib/renderer/texturesFromMaterials.js.map +1 -0
- package/lib/renderer/util.d.ts +17 -0
- package/lib/renderer/util.js +56 -0
- package/lib/renderer/util.js.map +1 -0
- package/lib/renderer/webgl.d.ts +131 -0
- package/lib/renderer/webgl.js +586 -0
- package/lib/renderer/webgl.js.map +1 -0
- package/lib/renderer/webglShaders.d.ts +4 -0
- package/lib/renderer/webglShaders.js +41 -0
- package/lib/renderer/webglShaders.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
- package/lib/scene/AmbientLight.d.ts +17 -0
- package/lib/scene/AmbientLight.js +15 -0
- package/lib/scene/AmbientLight.js.map +1 -0
- package/lib/scene/Camera.d.ts +78 -0
- package/lib/scene/Camera.js +111 -0
- package/lib/scene/Camera.js.map +1 -0
- package/lib/scene/DirectionalLight.d.ts +18 -0
- package/lib/scene/DirectionalLight.js +17 -0
- package/lib/scene/DirectionalLight.js.map +1 -0
- package/lib/scene/EnvironmentLight.d.ts +14 -0
- package/lib/scene/EnvironmentLight.js +14 -0
- package/lib/scene/EnvironmentLight.js.map +1 -0
- package/lib/scene/Geometry.d.ts +87 -0
- package/lib/scene/Geometry.js +108 -0
- package/lib/scene/Geometry.js.map +1 -0
- package/lib/scene/IESProfile.d.ts +19 -0
- package/lib/scene/IESProfile.js +165 -0
- package/lib/scene/IESProfile.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +43 -0
- package/lib/scene/InstancedMesh.js +79 -0
- package/lib/scene/InstancedMesh.js.map +1 -0
- package/lib/scene/Mesh.d.ts +14 -0
- package/lib/scene/Mesh.js +17 -0
- package/lib/scene/Mesh.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +224 -0
- package/lib/scene/OpenPBRMaterial.js +240 -0
- package/lib/scene/OpenPBRMaterial.js.map +1 -0
- package/lib/scene/RectLight.d.ts +31 -0
- package/lib/scene/RectLight.js +26 -0
- package/lib/scene/RectLight.js.map +1 -0
- package/lib/scene/Scene.d.ts +55 -0
- package/lib/scene/Scene.js +2 -0
- package/lib/scene/Scene.js.map +1 -0
- package/lib/scene/SceneNode.d.ts +16 -0
- package/lib/scene/SceneNode.js +33 -0
- package/lib/scene/SceneNode.js.map +1 -0
- package/lib/scene/SphereLight.d.ts +22 -0
- package/lib/scene/SphereLight.js +20 -0
- package/lib/scene/SphereLight.js.map +1 -0
- package/lib/scene/SpotLight.d.ts +35 -0
- package/lib/scene/SpotLight.js +29 -0
- package/lib/scene/SpotLight.js.map +1 -0
- package/lib/scene/Texture.d.ts +38 -0
- package/lib/scene/Texture.js +37 -0
- package/lib/scene/Texture.js.map +1 -0
- package/lib/scene/anisotropyParameters.d.ts +1 -0
- package/lib/scene/anisotropyParameters.js +13 -0
- package/lib/scene/anisotropyParameters.js.map +1 -0
- package/lib/scene/geometryChanges.d.ts +5 -0
- package/lib/scene/geometryChanges.js +18 -0
- package/lib/scene/geometryChanges.js.map +1 -0
- package/lib/scene/materialTextureNames.d.ts +2 -0
- package/lib/scene/materialTextureNames.js +9 -0
- package/lib/scene/materialTextureNames.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +400 -0
- package/lib/scene/openPbrSchema.js +149 -0
- package/lib/scene/openPbrSchema.js.map +1 -0
- package/lib/scene/thinFilmParameters.d.ts +4 -0
- package/lib/scene/thinFilmParameters.js +12 -0
- package/lib/scene/thinFilmParameters.js.map +1 -0
- package/lib/settings/display.d.ts +118 -0
- package/lib/settings/display.js +34 -0
- package/lib/settings/display.js.map +1 -0
- package/lib/settings/engine.d.ts +37 -0
- package/lib/settings/engine.js +26 -0
- package/lib/settings/engine.js.map +1 -0
- package/lib/settings/render.d.ts +178 -0
- package/lib/settings/render.js +36 -0
- package/lib/settings/render.js.map +1 -0
- package/lib/tinybvh/LICENSE +21 -0
- package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
- package/lib/tinybvh/TinyBvhBuilder.js +211 -0
- package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util/canvas.d.ts +2 -0
- package/lib/util/canvas.js +13 -0
- package/lib/util/canvas.js.map +1 -0
- package/lib/util/commonGeometry.d.ts +15 -0
- package/lib/util/commonGeometry.js +240 -0
- package/lib/util/commonGeometry.js.map +1 -0
- package/lib/util/events.d.ts +7 -0
- package/lib/util/events.js +23 -0
- package/lib/util/events.js.map +1 -0
- package/lib/util/frame.d.ts +2 -0
- package/lib/util/frame.js +10 -0
- package/lib/util/frame.js.map +1 -0
- package/lib/util/fromTHREE.d.ts +100 -0
- package/lib/util/fromTHREE.js +1063 -0
- package/lib/util/fromTHREE.js.map +1 -0
- package/lib/util/geometry.d.ts +13 -0
- package/lib/util/geometry.js +292 -0
- package/lib/util/geometry.js.map +1 -0
- package/lib/util/loadRGBE.d.ts +7 -0
- package/lib/util/loadRGBE.js +168 -0
- package/lib/util/loadRGBE.js.map +1 -0
- package/lib/util/math.d.ts +8 -0
- package/lib/util/math.js +64 -0
- package/lib/util/math.js.map +1 -0
- package/lib/util/mesh.d.ts +7 -0
- package/lib/util/mesh.js +20 -0
- package/lib/util/mesh.js.map +1 -0
- package/lib/util/threeDeformation.d.ts +20 -0
- package/lib/util/threeDeformation.js +218 -0
- package/lib/util/threeDeformation.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +3 -0
- package/lib/version.js.map +1 -0
- package/llms.txt +62 -0
- package/oidn/weights/LICENSE.txt +202 -0
- package/oidn/weights/README.md +43 -0
- package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
- package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
- package/package.json +124 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"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","sourcesContent":["import InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { packMaterialIndexAndWeightToInt } from './materialIndices.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { mat4, vec2, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS, TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents, hasGeneratedVertexTangents } from '../util/geometry.js';\n\nfunction computeGeometryBounds(geometry: Geometry) {\n const min = vec3.fromValues(Infinity, Infinity, Infinity);\n const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n const positions = geometry.position.array;\n const stride = geometry.position.itemSize;\n for (let offset = 0; offset + 2 < positions.length; offset += stride) {\n const x = positions[offset];\n const y = positions[offset + 1];\n const z = positions[offset + 2];\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n continue;\n }\n min[0] = Math.min(min[0], x);\n min[1] = Math.min(min[1], y);\n min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x);\n max[1] = Math.max(max[1], y);\n max[2] = Math.max(max[2], z);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function getBvhBounds(geometry: Geometry) {\n const bvh = getGeometryBvh(geometry)!;\n const floats = new Float32Array(bvh.buffer);\n if (bvh.layout === 'bvh4') {\n return [\n [floats[0], floats[1], floats[2]],\n [\n floats[0] + floats[3],\n floats[1] + floats[4],\n floats[2] + floats[5]\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n if (bvh.layout === 'bvh-gpu') {\n const words = new Uint32Array(bvh.buffer);\n if (words[11] === 0) {\n return [\n [\n Math.min(floats[0], floats[8]),\n Math.min(floats[1], floats[9]),\n Math.min(floats[2], floats[10])\n ],\n [\n Math.max(floats[4], floats[12]),\n Math.max(floats[5], floats[13]),\n Math.max(floats[6], floats[14])\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n // A single-leaf BVH_GPU node does not store its own bounds.\n return computeGeometryBounds(geometry);\n }\n if (bvh.layout === 'cwbvh') {\n const words = new Uint32Array(bvh.buffer);\n const header = words[3];\n const signedByte = (value: number) => (value << 24) >> 24;\n const scale = [\n 2 ** signedByte(header),\n 2 ** signedByte(header >> 8),\n 2 ** signedByte(header >> 16)\n ];\n const min: vec3.Vec3Array = [floats[0], floats[1], floats[2]];\n const max: vec3.Vec3Array = [...min];\n for (let slot = 0; slot < 8; slot++) {\n const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;\n if (!meta) continue;\n const shift = (slot & 3) * 8;\n const half = slot >> 2;\n max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);\n max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);\n max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n return [\n [floats[0], floats[1], floats[2]],\n [floats[4], floats[5], floats[6]]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result = {min: vec3.create(), max: vec3.create()},\n p = vec3.create()\n) {\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n bvhBounds[(corner >> 0) & 1][0],\n bvhBounds[(corner >> 1) & 1][1],\n bvhBounds[(corner >> 2) & 1][2]\n );\n vec3.transformMat4(p, p, m);\n if (!p.every(isFinite)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding {\n mesh: Mesh;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms(\n bindings: PreparedMeshInstanceBinding[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = Array(16).fill(0) as mat4.Mat4Array;\n const boundsScratch = {min: vec3.create(), max: vec3.create()}, pointScratch = vec3.create();\n let sourceIndex = 0;\n for (const binding of bindings) {\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex;\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding\n ) =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: mesh.transform,\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices) return bindings.map(update);\n const next = (current as TLASInstance[]).slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Returns the first material used for CPU displacement. */\nexport function getMeshDisplacementMaterial(mesh: Mesh) {\n return mesh.materials[0];\n}\n\nexport function getMeshDisplacementMap(mesh: Mesh) {\n // Not support multiple materials for displacement.\n const material = getMeshDisplacementMaterial(mesh);\n return material.displacementMap;\n}\n\nexport function getMeshDisplacementScale(mesh: Mesh) {\n return mesh.materials[0].displacementScale;\n}\n\nconst preparedGeometryCache = new WeakMap<Geometry, Map<string, Geometry>>();\nlet displacementTextureId = 1;\nconst displacementTextureIds = new WeakMap<object, number>();\n\nfunction getDisplacementTextureId(texture: Texture) {\n const identity = texture.source ?? texture;\n let id = displacementTextureIds.get(identity);\n if (id == null) {\n id = displacementTextureId++;\n displacementTextureIds.set(identity, id);\n }\n return id;\n}\n\nexport function getDisplacementTextureDataCacheKey(texture: Texture) {\n const image = texture.image;\n return [\n getDisplacementTextureId(texture),\n texture.version,\n image.width,\n image.height\n ].join('|');\n}\n\nconst detailedProjectiveRangeTriangleLimit = 100_000;\nconst displacementMinmaxCache = new Map<string, Uint8Array[]>();\n\nexport function getPreparedMeshGeometryCacheKey(mesh: Mesh) {\n const source = mesh.geometry;\n const material = getMeshDisplacementMaterial(mesh);\n const texture = material?.displacementMap;\n if (!material) return undefined;\n // Projective bounds depend on the material projection and height texture.\n if (material.displacementUvProjection !== 'none' && texture && Math.abs(material.displacementScale) > 1e-6) {\n return ['projectiveProjection', source.version, getDisplacementTextureDataCacheKey(texture),\n +texture.flipY, texture.uvScale.join(','), texture.uvOffset.join(','),\n material.displacementScale, material.displacementUvProjectionScale, material.displacementUvProjection].join('|');\n }\n return undefined;\n}\n\nexport function getCachedPreparedMeshGeometry(mesh: Mesh) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n const cached = preparedGeometryCache.get(mesh.geometry)?.get(key);\n if (!cached && key.startsWith('projectiveProjection|')) {\n return cachePreparedMeshGeometry(mesh, new Geometry(mesh.geometry));\n }\n return cached;\n}\n\nexport function cachePreparedMeshGeometry(mesh: Mesh, generated: Geometry) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n let entries = preparedGeometryCache.get(mesh.geometry);\n if (!entries) {\n entries = new Map();\n preparedGeometryCache.set(mesh.geometry, entries);\n }\n if (entries.size >= 4 && !entries.has(key)) entries.clear();\n entries.set(key, generated);\n return generated;\n}\n\n/** Returns cached prepared geometry, or the source while asynchronous preparation is pending. */\nexport function getPreparedMeshGeometry(mesh: Mesh) {\n return getCachedPreparedMeshGeometry(mesh) ?? mesh.geometry;\n}\n\nexport function computeMinmaxCPU(\n _geometry: Geometry,\n heightImage: Texture['image']\n) {\n const w = heightImage.width;\n const minmaxData: Uint8Array[] = [];\n const maxMipLevel = Math.log2(w);\n let heightPixels: ArrayLike<number>;\n let sourceChannels: number;\n let normalizeHeight: (value: number) => number;\n if (isTextureDataSource(heightImage)) {\n heightPixels = heightImage.data;\n sourceChannels = Math.max(\n 1,\n Math.floor(heightImage.data.length / (heightImage.width * heightImage.height))\n );\n const normalized =\n heightImage.data instanceof Uint8Array ||\n heightImage.data instanceof Uint8ClampedArray;\n normalizeHeight = normalized\n ? (value) => value\n : (value) => Math.round(Math.min(Math.max(value, 0), 1) * 255);\n } else {\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) throw new Error('The displacement texture is not CPU-readable.');\n canvas.width = w;\n canvas.height = w;\n ctx.drawImage(heightImage, 0, 0, w, w);\n heightPixels = ctx.getImageData(0, 0, w, w).data;\n sourceChannels = 4;\n normalizeHeight = (value) => value;\n }\n let mipmapSize = w;\n for (let lod = 0; lod <= maxMipLevel; lod++) {\n const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];\n const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);\n minmaxData.push(minmax);\n const channels = lod === 0 ? sourceChannels : 2;\n for (let y = 0; y < mipmapSize; y++) {\n for (let x = 0; x < mipmapSize; x++) {\n const yx = y * mipmapSize + x;\n const idx = yx * channels;\n let min = 0;\n let max = 0;\n if (lod == 0) {\n min = normalizeHeight(heightPixels[idx]);\n max = min;\n if (y < mipmapSize - 1 && x < mipmapSize - 1) {\n const h = normalizeHeight(\n heightPixels[idx + (mipmapSize + 1) * channels]\n );\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (y < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (x < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n } else {\n const x2 = x * 2;\n const y2 = y * 2;\n const prevMipmapSize = mipmapSize * 2;\n const idx2 = (y2 * prevMipmapSize + x2) * channels;\n const idx2_0 = idx2;\n const idx2_1 = idx2 + channels;\n const idx2_2 = idx2 + prevMipmapSize * channels;\n const idx2_3 = idx2 + prevMipmapSize * channels + channels;\n min = Math.min(\n prevMinmaxData[idx2_0],\n prevMinmaxData[idx2_1],\n prevMinmaxData[idx2_2],\n prevMinmaxData[idx2_3]\n );\n max = Math.max(\n prevMinmaxData[idx2_0 + 1],\n prevMinmaxData[idx2_1 + 1],\n prevMinmaxData[idx2_2 + 1],\n prevMinmaxData[idx2_3 + 1]\n );\n }\n minmax[yx * 2] = min;\n minmax[yx * 2 + 1] = max;\n }\n }\n mipmapSize = mipmapSize / 2;\n }\n\n return minmaxData;\n}\n\nfunction sphericalProjection(n: vec3.Vec3Array, uv: vec2.Vec2Array) {\n const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;\n const phi = Math.acos(n[1]) / Math.PI;\n vec2.set(uv, theta, 1.0 - phi);\n}\n\nexport function sphericalProjectionTriangle(\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n sphericalProjection(na, uvA);\n sphericalProjection(nb, uvB);\n sphericalProjection(nc, uvC);\n let onSeam = false;\n for (let i = 0; i < 2; i++) {\n if (\n Math.abs(uvA[i] - uvB[i]) > 0.5 ||\n Math.abs(uvA[i] - uvC[i]) > 0.5 ||\n Math.abs(uvB[i] - uvC[i]) > 0.5\n ) {\n const maxU = Math.max(uvA[i], uvB[i], uvC[i]);\n if (maxU - uvA[i] > 0.5) {\n uvA[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvB[i] > 0.5) {\n uvB[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvC[i] > 0.5) {\n uvC[i] += 1.0;\n onSeam = true;\n }\n }\n }\n\n return onSeam;\n}\n\nfunction getMaxAxisIndex(n: vec3.Vec3Array) {\n const x = Math.abs(n[0]);\n const y = Math.abs(n[1]);\n const z = Math.abs(n[2]);\n return x > y && x > z ? 0 : y > z ? 1 : 2;\n}\n\nexport function triplanarProjectionTriangle(\n a: vec3.Vec3Array,\n b: vec3.Vec3Array,\n c: vec3.Vec3Array,\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));\n const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));\n const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));\n\n if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {\n // yz\n vec2.set(uvA, a[1], a[2]);\n vec2.set(uvB, b[1], b[2]);\n vec2.set(uvC, c[1], c[2]);\n } else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {\n // xz\n vec2.set(uvA, a[0], a[2]);\n vec2.set(uvB, b[0], b[2]);\n vec2.set(uvC, c[0], c[2]);\n } else {\n // xy\n vec2.set(uvA, a[0], a[1]);\n vec2.set(uvB, b[0], b[1]);\n vec2.set(uvC, c[0], c[1]);\n }\n}\n\nfunction findRoots(\n triAabbMinP: vec2.Vec2Array,\n triAabbMaxP: vec2.Vec2Array,\n maxDepth: number,\n roots: vec3.Vec3Array[]\n) {\n let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);\n let size = Math.max(d[0], d[1]);\n let startMipLevel =\n maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;\n if (!isFinite(startMipLevel)) {\n startMipLevel = maxDepth;\n }\n startMipLevel = Math.max(startMipLevel, 0);\n let rootCount = 0;\n while (true) {\n const mipSize = Math.pow(2.0, maxDepth - startMipLevel);\n const minTexelX = Math.floor(mipSize * triAabbMinP[0]);\n const minTexelY = Math.floor(mipSize * triAabbMinP[1]);\n const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);\n const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);\n\n if (\n (maxTexelX - minTexelX < 2 &&\n maxTexelY - minTexelY < 2 &&\n startMipLevel >= 0) ||\n startMipLevel >= maxDepth\n ) {\n for (let y = minTexelY; y <= maxTexelY; y++) {\n for (let x = minTexelX; x <= maxTexelX; x++) {\n if (rootCount < roots.length) {\n vec3.set(\n roots[rootCount],\n Math.floor(x),\n Math.floor(y),\n startMipLevel\n );\n rootCount++;\n }\n }\n }\n break;\n }\n\n startMipLevel++;\n }\n\n return rootCount;\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indices.array;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!heightTexture) return;\n if (!uvs && uvProjection === 'none') {\n throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.'\n );\n }\n const heightImage = heightTexture.image;\n const isFlipY = heightTexture.flipY;\n if (!heightImage.width || !heightImage.height) {\n return;\n }\n const triangleCount = indices.length / 3;\n if (triangleCount >= detailedProjectiveRangeTriangleLimit) {\n // A conservative full-height prism is much cheaper to prepare for dense\n // source meshes and remains intersection-safe. Per-triangle UV min/max is\n // retained for smaller meshes where tighter BVH nodes matter more.\n const conservative = new Float32Array(triangleCount * 2);\n for (let triangle = 0; triangle < triangleCount; triangle++) {\n conservative[triangle * 2 + 1] = 1;\n }\n return conservative;\n }\n const minmaxCacheKey =\n getDisplacementTextureDataCacheKey(heightTexture);\n let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);\n if (!minmaxData) {\n minmaxData = computeMinmaxCPU(geometry, heightImage);\n if (displacementMinmaxCache.size >= 4) {\n displacementMinmaxCache.delete(\n displacementMinmaxCache.keys().next().value!\n );\n }\n displacementMinmaxCache.set(minmaxCacheKey, minmaxData);\n }\n\n const maxDepth = Math.log2(heightImage.width);\n const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);\n const normal = geometry.normal!.array;\n const position = geometry.position!.array;\n\n const uv1 = vec2.create();\n const uv2 = vec2.create();\n const uv3 = vec2.create();\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const n1 = vec3.create();\n const n2 = vec3.create();\n const n3 = vec3.create();\n\n const isTriplanar = uvProjection === 'triplanar';\n const isSpherical = uvProjection === 'spherical';\n const isCylindrical = uvProjection === 'cylindrical';\n const uvScale = material.displacementUvProjectionScale;\n\n const minUv = vec2.create();\n const maxUv = vec2.create();\n\n const roots: vec3.Vec3Array[] = [];\n for (let i = 0; i < 100; i++) {\n roots.push([0, 0, 0]);\n }\n for (let i = 0; i < indices.length; i += 3) {\n const i1 = indices[i];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const i1_2 = i1 * 2;\n const i2_2 = i2 * 2;\n const i3_2 = i3 * 2;\n const i1_3 = i1 * 3;\n const i2_3 = i2 * 3;\n const i3_3 = i3 * 3;\n\n if (uvs) {\n vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);\n vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);\n vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);\n } else {\n vec2.set(uv1, 0, 0);\n vec2.set(uv2, 0, 0);\n vec2.set(uv3, 0, 0);\n }\n\n let onSeam = false;\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);\n vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);\n vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);\n vec3.normalize(n1, n1);\n vec3.normalize(n2, n2);\n vec3.normalize(n3, n3);\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);\n vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);\n vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);\n }\n if (isTriplanar) {\n // Is on the seam. Needs full prism to avoid empty seams.\n const xMaxIndex = getMaxAxisIndex(n1);\n const yMaxIndex = getMaxAxisIndex(n2);\n const zMaxIndex = getMaxAxisIndex(n3);\n if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {\n onSeam = true;\n }\n /* prettier-ignore */\n triplanarProjectionTriangle(\n p1, p2, p3,\n n1, n2, n3,\n uv1, uv2, uv3\n );\n } else if (isSpherical) {\n vec3.normalize(p1, p1);\n vec3.normalize(p2, p2);\n vec3.normalize(p3, p3);\n onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);\n } else {\n const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;\n const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;\n const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;\n vec2.set(uv1, u1, p1[1]);\n vec2.set(uv2, u2, p2[1]);\n vec2.set(uv3, u3, p3[1]);\n onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;\n }\n }\n vec2.scale(uv1, uv1, uvScale);\n vec2.scale(uv2, uv2, uvScale);\n vec2.scale(uv3, uv3, uvScale);\n\n // TODO PDM don't have zero area triangle issue.\n\n let minHeight = Infinity;\n let maxHeight = -Infinity;\n\n if (onSeam) {\n minHeight = 0.0;\n maxHeight = 255.0;\n } else {\n vec2.copy(maxUv, uv1);\n vec2.copy(minUv, uv1);\n vec2.min(minUv, minUv, uv2);\n vec2.min(minUv, minUv, uv3);\n vec2.max(maxUv, maxUv, uv2);\n vec2.max(maxUv, maxUv, uv3);\n\n const rootCount = findRoots(minUv, maxUv, maxDepth, roots);\n\n for (let k = 0; k < rootCount; k++) {\n const mipLevel = roots[k][2];\n const mipSize = Math.pow(2, maxDepth - mipLevel);\n const minmax = minmaxData[mipLevel];\n const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;\n let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;\n if (isFlipY) {\n y = mipSize - y - 1;\n }\n const idx = (y * mipSize + x) * 2;\n\n minHeight = Math.min(minHeight, minmax[idx]);\n maxHeight = Math.max(maxHeight, minmax[idx + 1]);\n }\n }\n\n // TODO this will cause flat surface optimization fail.\n // But not adding bias will leads to small gap between flat surface and displaced surface.\n trianglesDisplacementRange[(i / 3) * 2] = Math.max(\n (Math.floor(minHeight) - 4) / 255,\n 0\n );\n trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min(\n (Math.ceil(maxHeight) + 4) / 255,\n 1\n );\n }\n\n return trianglesDisplacementRange;\n}\n\nconst warnedDirectionGeometry = new WeakSet<Geometry>();\n\n/** Prepare auto-generated source attributes before the renderer captures array identities. */\nexport function ensureMeshGeometryAttributes(meshes: readonly Mesh[]) {\n for (const { geometry, materials } of meshes) {\n if (!geometry.tangent && !warnedDirectionGeometry.has(geometry) && materials.some(m => m.anisotropyMap || m.specularAnisotropyRotation !== 0 || m.coatAnisotropyRotation !== 0 || (m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0))) {\n console.warn('MuTracer: anisotropy direction has no vertex tangent; deriving a frame from the selected UV set with a stable fallback for degenerate UVs.');\n warnedDirectionGeometry.add(geometry);\n }\n if (!geometry.position?.array.length) continue;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n }\n}\n\nfunction getMeshBlasGeometry(mesh: Mesh) {\n const geometry = getPreparedMeshGeometry(mesh);\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n return geometry;\n}\n\n/** Geometry and displacement inputs shared by synchronous and Worker BLAS builds. */\nexport function getMeshBlasInput(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const heightMap = getMeshDisplacementMap(mesh);\n const displacementScale = heightMap ? getMeshDisplacementScale(mesh) : 0;\n const trianglesDisplacement = Math.abs(displacementScale) > 1e-6\n ? getTrianglesDisplacementRange(geometry, heightMap, getMeshDisplacementMaterial(mesh))\n : undefined;\n return { geometry, displacementScale, trianglesDisplacement };\n}\n\n/** Whether a static mesh still needs a BLAS before it can be rendered. */\nexport function meshNeedsStaticBvh(mesh: Mesh, config?: BvhBuildConfig) {\n return !!mesh.geometry.position?.array.length && !mesh.geometry.dynamic &&\n (!getGeometryBvh(getPreparedMeshGeometry(mesh)) || !!config && !geometryBvhConfigMatches(getPreparedMeshGeometry(mesh), config));\n}\n\n/** Capture inputs whose changes invalidate an asynchronous BLAS result. */\nexport function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry) {\n const displacementMap = getMeshDisplacementMap(mesh);\n return {\n geometry: mesh.geometry,\n version: mesh.geometry.version,\n cacheKey: getPreparedMeshGeometryCacheKey(mesh),\n bvh: getGeometryBvh(target),\n displacementMap,\n displacementScale: getMeshDisplacementScale(mesh),\n displacementTextureKey: displacementMap\n ? getDisplacementTextureDataCacheKey(displacementMap) : undefined\n };\n}\n\n/** Check that a result still belongs to the captured mesh inputs. */\nexport function meshBlasSnapshotIsCurrent(\n mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>\n) {\n return mesh.geometry === snapshot.geometry && mesh.geometry.version === snapshot.version &&\n getPreparedMeshGeometryCacheKey(mesh) === snapshot.cacheKey && getGeometryBvh(target) === snapshot.bvh &&\n getMeshDisplacementMap(mesh) === snapshot.displacementMap &&\n getMeshDisplacementScale(mesh) === snapshot.displacementScale &&\n (!snapshot.displacementMap || getDisplacementTextureDataCacheKey(snapshot.displacementMap) ===\n snapshot.displacementTextureKey);\n}\n\nfunction prepareMeshGeometryBvh(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const displacementScale = getMeshDisplacementMap(mesh) ? getMeshDisplacementScale(mesh) : 0;\n if (geometry.dynamic && getGeometryBvh(geometry)?.builder !== 'builtin') setGeometryBvh(geometry, undefined);\n if (!getGeometryBvh(geometry)) {\n const { trianglesDisplacement } = getMeshBlasInput(mesh);\n setGeometryBvh(geometry, buildBLAS(geometry, displacementScale, trianglesDisplacement));\n }\n return { geometry, displacementScale };\n}\n\nexport function updateMeshInstances(meshes: Mesh[]) {\n const materialIndexMap = new Map<OpenPBRMaterial, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometries: Geometry[] = [];\n const materials: OpenPBRMaterial[] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding[] = [];\n\n\n const instances = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh);\n const bvhBounds = getBvhBounds(geometry);\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance = {\n bounds,\n blasIndex: geoIdx!,\n transform: mesh.transform,\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (!(mesh instanceof InstancedMesh) && (\n !bounds.min.every(isFinite) ||\n !bounds.max.every(isFinite) ||\n !mesh.transform.every(isFinite)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indices.array.length }];\n })),\n instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indices.array.length / 3\n }))\n };\n}\n\nfunction mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indices.array.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const hasColor = geometries.some((geo) => geo.color);\n const hasTangent = geometries.some((geo) => geo.tangent);\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(4 * totalVertexCount), 4)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (geometry.color) {\n mergedGeometry.color!.array.set(geometry.color.array, currentVertex * 3);\n }\n if (geometry.tangent) {\n const source = geometry.tangent;\n for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n });\n\n return mergedGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/** Batch records are regenerated together; refit all numeric source slots. */\nexport function dirtyMeshInstanceIndices(bindings: PreparedMeshInstanceBinding[], meshes: ReadonlySet<Mesh>, instances: MeshInstances) {\n if (instances instanceof PackedMeshInstances) return new Set(Array.from({length: instances.length}, (_, i) => i));\n return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));\n}\n\n/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */\nexport function updateMeshInstanceColors(bindings: PreparedMeshInstanceBinding[], instances: MeshInstances, meshes: ReadonlySet<Mesh>) {\n const dirty = new Set<number>();\n if (!(instances instanceof PackedMeshInstances)) return dirty;\n let sourceStart = 0, packedIndex = 0;\n for (const {mesh} of bindings) {\n const count = meshInstanceCount(mesh), sourceEnd = sourceStart + count;\n while (packedIndex < instances.length && instances.sourceIndices[packedIndex] < sourceEnd) {\n if (meshes.has(mesh)) {\n const localIndex = instances.sourceIndices[packedIndex] - sourceStart;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) instances.colors[packedIndex * 3 + k] = colors?.[localIndex * 3 + k] ?? 1;\n dirty.add(packedIndex);\n }\n packedIndex++;\n }\n sourceStart = sourceEnd;\n }\n return dirty;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type Render from '../Render.js';
|
|
2
|
+
import type Display from '../Display.js';
|
|
3
|
+
export interface ProgressiveState {
|
|
4
|
+
previousChanged: boolean;
|
|
5
|
+
lastContinuousChange: number;
|
|
6
|
+
changing: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Pure consecutive-edit policy; isolated changes start final immediately. */
|
|
9
|
+
export declare function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState;
|
|
10
|
+
/** Public state used to leave a finished canvas idle while still noticing settings edits. */
|
|
11
|
+
export declare function loopImageState(render: Render, display: Display): string;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Pure consecutive-edit policy; isolated changes start final immediately. */
|
|
2
|
+
export function updateProgressiveState(state, changed, active, now, idleMs) {
|
|
3
|
+
const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;
|
|
4
|
+
return { previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs) };
|
|
5
|
+
}
|
|
6
|
+
/** Public state used to leave a finished canvas idle while still noticing settings edits. */
|
|
7
|
+
export function loopImageState(render, display) {
|
|
8
|
+
return JSON.stringify([
|
|
9
|
+
render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,
|
|
10
|
+
render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,
|
|
11
|
+
render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,
|
|
12
|
+
render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,
|
|
13
|
+
display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,
|
|
14
|
+
display.contrast, display.saturation, display.temperature, display.tint, display.vignette,
|
|
15
|
+
display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,
|
|
16
|
+
display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=progressiveScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ;QAC/F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY;QACvF,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,0BAA0B;QAC1F,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KACxE,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type Render from '../Render.js';\nimport type Display from '../Display.js';\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, render.bounces, render.clamping,\n render.samplingPattern, render.directLightCandidates, render.bevel, render.bevelSamples,\n render.dispersionWavelengths, render.alphaBlendStrategy, render.transmissiveOutputAlphaMin,\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n ]);\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ScratchPool } from './ScratchPool.js';
|
|
2
|
+
import type Camera from '../scene/Camera.js';
|
|
3
|
+
import type { Scene } from '../scene/Scene.js';
|
|
4
|
+
import type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';
|
|
5
|
+
import type { SamplingPattern } from './sampling.js';
|
|
6
|
+
import type { TargetPipeline } from './accumulationTarget.js';
|
|
7
|
+
/** Immutable execution settings restored before every operation on a target. */
|
|
8
|
+
export interface TraceSettings {
|
|
9
|
+
transmissiveOutputAlphaMin: number;
|
|
10
|
+
bounces: number;
|
|
11
|
+
clamping: number;
|
|
12
|
+
bevel: boolean;
|
|
13
|
+
bevelSamples: number;
|
|
14
|
+
dispersionWavelengths: 1 | 3;
|
|
15
|
+
directLightCandidates: number;
|
|
16
|
+
alphaBlendStrategy: AlphaBlendStrategy;
|
|
17
|
+
samplingPattern: SamplingPattern;
|
|
18
|
+
maxSamples: number;
|
|
19
|
+
timeBudgetMs: number;
|
|
20
|
+
maxTiles: number;
|
|
21
|
+
allowMultipleSamplesPerFrame: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface DisplaySettings {
|
|
24
|
+
toneMapping: ToneMappingParams;
|
|
25
|
+
bloom: {
|
|
26
|
+
intensity: number;
|
|
27
|
+
threshold: number;
|
|
28
|
+
radius: number;
|
|
29
|
+
};
|
|
30
|
+
hdrOutputEnabled: boolean;
|
|
31
|
+
channel: DisplayChannel;
|
|
32
|
+
shadowCatcherColor: [number, number, number];
|
|
33
|
+
shadowCatcherAlpha: number;
|
|
34
|
+
}
|
|
35
|
+
export interface RenderTarget extends TargetPipeline {
|
|
36
|
+
readonly label: string;
|
|
37
|
+
configure(settings: TraceSettings): void;
|
|
38
|
+
synchronizeBackground(background: Scene['background']): void;
|
|
39
|
+
}
|
|
40
|
+
export interface RenderPipeline {
|
|
41
|
+
getSharedMemoryBytes(): number;
|
|
42
|
+
createTarget(label: string): RenderTarget;
|
|
43
|
+
releaseTarget(target: RenderTarget): void;
|
|
44
|
+
setMeshes: SceneResources['setMeshes'];
|
|
45
|
+
setLights: SceneResources['setLights'];
|
|
46
|
+
setBackground: SceneResources['setBackground'];
|
|
47
|
+
setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];
|
|
48
|
+
readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;
|
|
49
|
+
getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;
|
|
50
|
+
dispose(): void;
|
|
51
|
+
}
|
|
52
|
+
/** Shared scene ownership; every image operation explicitly selects its target. */
|
|
53
|
+
export declare function makeRenderPipeline(scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {
|
|
54
|
+
setCamera(camera: Camera): void;
|
|
55
|
+
readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;
|
|
56
|
+
setBounce(bounces: number): boolean;
|
|
57
|
+
}, create: () => TargetPipeline, webgl?: boolean, scratch?: ScratchPool): RenderPipeline;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Shared scene ownership; every image operation explicitly selects its target. */
|
|
2
|
+
export function makeRenderPipeline(scene, create, webgl = false, scratch) {
|
|
3
|
+
const targets = new Set();
|
|
4
|
+
const settings = new Map();
|
|
5
|
+
let latest;
|
|
6
|
+
let background;
|
|
7
|
+
return {
|
|
8
|
+
getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,
|
|
9
|
+
createTarget(label) {
|
|
10
|
+
const backend = create();
|
|
11
|
+
const target = {
|
|
12
|
+
...backend,
|
|
13
|
+
get presentationComplete() { return backend.presentationComplete; },
|
|
14
|
+
get presentationDenoised() { return backend.presentationDenoised; },
|
|
15
|
+
label,
|
|
16
|
+
configure(options) { settings.set(target, { ...options }); backend.configure(options); },
|
|
17
|
+
activate() {
|
|
18
|
+
latest = target;
|
|
19
|
+
if (webgl)
|
|
20
|
+
scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));
|
|
21
|
+
backend.activate();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
target.synchronizeBackground(background);
|
|
25
|
+
targets.add(target);
|
|
26
|
+
return target;
|
|
27
|
+
},
|
|
28
|
+
releaseTarget(target) { if (targets.delete(target)) {
|
|
29
|
+
settings.delete(target);
|
|
30
|
+
target.dispose();
|
|
31
|
+
} },
|
|
32
|
+
setMeshes: (meshes, update) => scene.setMeshes(meshes, update),
|
|
33
|
+
setLights: lights => scene.setLights(lights),
|
|
34
|
+
setBackground(value) {
|
|
35
|
+
background = value;
|
|
36
|
+
scene.setBackground(value);
|
|
37
|
+
for (const target of targets)
|
|
38
|
+
target.synchronizeBackground(value);
|
|
39
|
+
},
|
|
40
|
+
setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),
|
|
41
|
+
async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },
|
|
42
|
+
getDiagnostics() {
|
|
43
|
+
return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({ label: t.label, ...t.getMemory() })) };
|
|
44
|
+
},
|
|
45
|
+
dispose() { for (const target of targets)
|
|
46
|
+
target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=renderPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"AAuCA,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAChC,KAIC,EACD,MAA4B,EAC5B,KAAK,GAAG,KAAK,EACb,OAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,IAAI,MAAgC,CAAC;IACrC,IAAI,UAA+B,CAAC;IACpC,OAAO;QACL,oBAAoB,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC;QAC1D,YAAY,CAAC,KAAK;YAChB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAiB;gBAC3B,GAAG,OAAO;gBACV,IAAI,oBAAoB,KAAK,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACnE,IAAI,oBAAoB,KAAK,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACnE,KAAK;gBACL,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACxF,QAAQ;oBACN,MAAM,GAAG,MAAM,CAAC;oBAChB,IAAI,KAAK;wBAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1F,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,CAAC;aACF,CAAC;YACF,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,aAAa,CAAC,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC,CAAC,CAAC;QACpG,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9D,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C,aAAa,CAAC,KAAK;YACjB,UAAU,GAAG,KAAK,CAAC;YAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/C,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,qBAAqB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAClE,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrH,cAAc;YACZ,OAAO,EAAE,GAAG,KAAK,CAAC,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,EAAE,EAAC,CAAC,CAAC,EAAE,CAAC;QAC7I,CAAC;QACD,OAAO,KAAK,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;KACtI,CAAC;AACJ,CAAC","sourcesContent":["import type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; allowMultipleSamplesPerFrame: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Public sampling choices; independent of the denoiser. */
|
|
2
|
+
export type SamplingPattern = 'sobol' | 'zsobol' | 'random';
|
|
3
|
+
export declare function samplingPatternCode(pattern: SamplingPattern): number;
|
|
4
|
+
/** 256² pixel tiles leave 16 bits for samples in a 32-bit Morton index. */
|
|
5
|
+
export declare function zSobolLog2SPP(maxSamples: number): number;
|
|
6
|
+
export declare const zSobolPermutations: number[];
|
|
7
|
+
/** Four eight-bit permutations per word, avoiding shader array indexing. */
|
|
8
|
+
export declare const zSobolPackedPermutations: number[];
|
|
9
|
+
/** Pascal-mod-2 butterfly for Sobol's second direction-number column. */
|
|
10
|
+
export declare const sobolD1Steps: readonly [readonly [1, 2863311530], readonly [2, 3435973836], readonly [4, 4042322160], readonly [8, 4278255360], readonly [16, 4294901760]];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function samplingPatternCode(pattern) {
|
|
2
|
+
const code = { sobol: 0, zsobol: 1, random: 2 }[pattern];
|
|
3
|
+
if (code === undefined)
|
|
4
|
+
throw new Error(`Unknown sampling pattern: ${pattern}`);
|
|
5
|
+
return code;
|
|
6
|
+
}
|
|
7
|
+
/** 256² pixel tiles leave 16 bits for samples in a 32-bit Morton index. */
|
|
8
|
+
export function zSobolLog2SPP(maxSamples) {
|
|
9
|
+
return Number.isFinite(maxSamples)
|
|
10
|
+
? Math.min(16, Math.max(0, Math.ceil(Math.log2(Math.max(1, maxSamples)))))
|
|
11
|
+
: 16;
|
|
12
|
+
}
|
|
13
|
+
// ZSobol digit permutations/order adapted from pbrt-v4 ZSobolSampler,
|
|
14
|
+
// https://github.com/mmp/pbrt-v4/blob/master/src/pbrt/samplers.h (Apache-2.0).
|
|
15
|
+
export const zSobolPermutations = [
|
|
16
|
+
[0, 1, 2, 3], [0, 1, 3, 2], [0, 2, 1, 3], [0, 2, 3, 1], [0, 3, 2, 1], [0, 3, 1, 2],
|
|
17
|
+
[1, 0, 2, 3], [1, 0, 3, 2], [1, 2, 0, 3], [1, 2, 3, 0], [1, 3, 2, 0], [1, 3, 0, 2],
|
|
18
|
+
[2, 1, 0, 3], [2, 1, 3, 0], [2, 0, 1, 3], [2, 0, 3, 1], [2, 3, 0, 1], [2, 3, 1, 0],
|
|
19
|
+
[3, 1, 2, 0], [3, 1, 0, 2], [3, 2, 1, 0], [3, 2, 0, 1], [3, 0, 2, 1], [3, 0, 1, 2]
|
|
20
|
+
].map(p => p.reduce((v, digit, i) => v | digit << (2 * i), 0));
|
|
21
|
+
/** Four eight-bit permutations per word, avoiding shader array indexing. */
|
|
22
|
+
export const zSobolPackedPermutations = Array.from({ length: 6 }, (_, word) => zSobolPermutations.slice(word * 4, word * 4 + 4).reduce((packed, permutation, byte) => packed | permutation << (byte * 8), 0) >>> 0);
|
|
23
|
+
/** Pascal-mod-2 butterfly for Sobol's second direction-number column. */
|
|
24
|
+
export const sobolD1Steps = [
|
|
25
|
+
[1, 0xaaaaaaaa], [2, 0xcccccccc], [4, 0xf0f0f0f0],
|
|
26
|
+
[8, 0xff00ff00], [16, 0xffff0000]
|
|
27
|
+
];
|
|
28
|
+
//# sourceMappingURL=sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampling.js","sourceRoot":"","sources":["../../src/renderer/sampling.ts"],"names":[],"mappings":"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","sourcesContent":["/** Public sampling choices; independent of the denoiser. */\nexport type SamplingPattern = 'sobol' | 'zsobol' | 'random';\nexport function samplingPatternCode(pattern: SamplingPattern) {\n const code = { sobol: 0, zsobol: 1, random: 2 }[pattern];\n if (code === undefined) throw new Error(`Unknown sampling pattern: ${pattern}`);\n return code;\n}\n/** 256² pixel tiles leave 16 bits for samples in a 32-bit Morton index. */\nexport function zSobolLog2SPP(maxSamples: number) {\n return Number.isFinite(maxSamples)\n ? Math.min(16, Math.max(0, Math.ceil(Math.log2(Math.max(1, maxSamples)))))\n : 16;\n}\n// ZSobol digit permutations/order adapted from pbrt-v4 ZSobolSampler,\n// https://github.com/mmp/pbrt-v4/blob/master/src/pbrt/samplers.h (Apache-2.0).\nexport const zSobolPermutations = [\n [0,1,2,3],[0,1,3,2],[0,2,1,3],[0,2,3,1],[0,3,2,1],[0,3,1,2],\n [1,0,2,3],[1,0,3,2],[1,2,0,3],[1,2,3,0],[1,3,2,0],[1,3,0,2],\n [2,1,0,3],[2,1,3,0],[2,0,1,3],[2,0,3,1],[2,3,0,1],[2,3,1,0],\n [3,1,2,0],[3,1,0,2],[3,2,1,0],[3,2,0,1],[3,0,2,1],[3,0,1,2]\n].map(p => p.reduce((v, digit, i) => v | digit << (2*i), 0));\n\n/** Four eight-bit permutations per word, avoiding shader array indexing. */\nexport const zSobolPackedPermutations = Array.from({length: 6}, (_, word) =>\n zSobolPermutations.slice(word * 4, word * 4 + 4).reduce(\n (packed, permutation, byte) => packed | permutation << (byte * 8), 0\n ) >>> 0\n);\n\n/** Pascal-mod-2 butterfly for Sobol's second direction-number column. */\nexport const sobolD1Steps = [\n [1, 0xaaaaaaaa], [2, 0xcccccccc], [4, 0xf0f0f0f0],\n [8, 0xff00ff00], [16, 0xffff0000]\n] as const;\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { materialParametersEqual } from './materialComparison.generated.js';
|
|
2
|
+
import Mesh from '../scene/Mesh.js';
|
|
3
|
+
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
4
|
+
import Geometry from '../scene/Geometry.js';
|
|
5
|
+
import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
|
|
6
|
+
import { Scene } from '../scene/Scene.js';
|
|
7
|
+
export interface SceneChanges {
|
|
8
|
+
meshes: 'none' | 'incremental' | 'full';
|
|
9
|
+
transforms: Mesh[];
|
|
10
|
+
colors: InstancedMesh[];
|
|
11
|
+
geometries: Geometry[];
|
|
12
|
+
materials: OpenPBRMaterial[];
|
|
13
|
+
lights: boolean;
|
|
14
|
+
background: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */
|
|
17
|
+
export declare function snapshotFields(object: object): unknown[];
|
|
18
|
+
export declare function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]): boolean;
|
|
19
|
+
export declare function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]): (number | boolean | any[] | "a" | "b" | "r" | "g" | "openpbr" | "gltf" | "auto" | "opaque" | "mask" | "blend" | "alpha" | "transmission" | "none" | "triplanar" | "spherical" | "cylindrical")[];
|
|
20
|
+
/** Detects edits without accepting them until the pipeline has received the scene. */
|
|
21
|
+
export declare class SceneChangeDetector {
|
|
22
|
+
private _snapshot?;
|
|
23
|
+
private _pending?;
|
|
24
|
+
private _spare?;
|
|
25
|
+
private _seen;
|
|
26
|
+
detect(scene: Scene): SceneChanges;
|
|
27
|
+
commit(): void;
|
|
28
|
+
reset(): void;
|
|
29
|
+
}
|