@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":"bvhAccel.js","sourceRoot":"","sources":["../../src/renderer/bvhAccel.ts"],"names":[],"mappings":"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","sourcesContent":["import { readMeshInstance, type MeshInstances } from './meshInstances.js';\n// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances\n// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written\n// directly in the BVH2 layout read by the traversal shaders.\n\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { Mat4Array } from '../math.js';\nimport { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';\n\nconst vec3Min = vec3.min;\nconst vec3Max = vec3.max;\n\nexport const INSTANCE_VEC4_STRIDE = 10;\nexport const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;\n\nexport type BvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nexport interface FlattendBVH {\n /** CPU builder that produced the GPU traversal data. */\n builder?: 'builtin' | 'tinybvh';\n buildSurfaceArea?: number;\n maxDepth: number;\n /** Largest leaf fan-out; used with maxDepth to size the traversal stack. */\n maxLeafPrimitives?: number;\n buffer: ArrayBuffer;\n /** Precomputed data without a layout field uses the legacy BVH2 layout. */\n layout?: BvhLayout;\n\n instancesBuffer?: ArrayBuffer;\n}\n\nconst BLAS_LAYOUT_SHIFT = 30;\nconst BLAS_OFFSET_MASK = 0x3fffffff;\nconst blasLayoutCodes: Record<BvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\n\nfunction encodeBlasOffset(offset: number, layout: BvhLayout) {\n if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {\n throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);\n }\n return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;\n}\n\nexport class Box3 {\n min: vec3.Vec3Array;\n max: vec3.Vec3Array;\n\n constructor() {\n this.min = [Infinity, Infinity, Infinity];\n this.max = [-Infinity, -Infinity, -Infinity];\n }\n}\n\nfunction unionBounds(bounds: Box3, a: Box3, b: Box3) {\n vec3Min(bounds.min, a.min, b.min);\n vec3Max(bounds.max, a.max, b.max);\n return bounds;\n}\n\nexport interface TLASInstance {\n blasIndex: number;\n bounds: Box3;\n transform: Mat4Array;\n materialsIndices: number[];\n displacementScale?: number;\n color?: [number, number, number];\n}\n\nexport interface BLASInstance {\n bvh: FlattendBVH;\n trainglesCount: number;\n verticesCount: number;\n}\n\n// Keep a bounded specialization range for unusually deep hierarchies while\n// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).\n// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.\nexport const MAX_TRAVERSAL_STACK_SIZE = 64;\n\nexport interface TraversalStackSizes {\n tlas: number;\n blas: number;\n}\n\n/**\n * Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.\n * A TLAS leaf is consumed in place, so its instance fan-out no longer needs\n * pending stack entries. TinyBVH converted layouts store their exact stack\n * requirement in maxDepth; BVH2 stores its tree depth.\n */\nexport function getTraversalStackSizes(\n tlas: FlattendBVH,\n blases: readonly BLASInstance[]\n): TraversalStackSizes {\n return {\n tlas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n Math.max(1, tlas.maxDepth)\n ),\n blas: Math.min(\n MAX_TRAVERSAL_STACK_SIZE,\n blases.reduce(\n (stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth),\n 1\n )\n )\n };\n}\n\nexport function concatBLASBuffers(blases: BLASInstance[]): ArrayBuffer {\n const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));\n const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < blases.length; i++) {\n result.set(buffers[i], offset);\n offset += buffers[i].length;\n }\n return result.buffer;\n}\n\nfunction packH(minH: number, maxH: number): number {\n const roundedMinH = Math.min(Math.floor(minH * 255), 255);\n const roundedMaxH =\n Math.abs(maxH - minH) < 1e-6\n ? roundedMinH\n : Math.min(Math.ceil(maxH * 255), 255);\n return (roundedMinH << 8) + roundedMaxH;\n}\n\n/** Writes min and max of a triangle, or of its displacement prism, to out. */\nfunction triangleBounds(\n positions: ArrayLike<number>,\n stride: number,\n normals: ArrayLike<number> | undefined,\n normalStride: number,\n i0: number,\n i1: number,\n i2: number,\n minHeight: number,\n maxHeight: number,\n out: Float32Array,\n o: number\n) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n for (let corner = 0; corner < 3; corner++) {\n const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;\n const p = vertex * stride;\n const x = positions[p], y = positions[p + 1], z = positions[p + 2];\n if (normals) {\n const n = vertex * normalStride;\n let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];\n const length = Math.sqrt(nx * nx + ny * ny + nz * nz);\n if (length > 0) {\n nx /= length; ny /= length; nz /= length;\n }\n for (let side = 0; side < 2; side++) {\n const h = side === 0 ? minHeight : maxHeight;\n const px = x + nx * h, py = y + ny * h, pz = z + nz * h;\n minX = Math.min(minX, px); minY = Math.min(minY, py); minZ = Math.min(minZ, pz);\n maxX = Math.max(maxX, px); maxY = Math.max(maxY, py); maxZ = Math.max(maxZ, pz);\n }\n } else {\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n out[o] = minX; out[o + 1] = minY; out[o + 2] = minZ;\n out[o + 3] = maxX; out[o + 4] = maxY; out[o + 5] = maxZ;\n return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&\n isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);\n}\n\nfunction emptyBvh(isTLAS: boolean): FlattendBVH {\n return {\n builder: 'builtin',\n buildSurfaceArea: isTLAS ? undefined : 0,\n maxDepth: 0,\n maxLeafPrimitives: 0,\n buffer: new ArrayBuffer(0),\n layout: 'bvh2',\n instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined\n };\n}\n\n/** BLAS without triangles. */\nexport function emptyBLAS() {\n return emptyBvh(false);\n}\n\n/**\n * Builds a BVH2 BLAS over the geometry's triangles. Triangles with\n * non-finite bounds are skipped. With per-triangle displacement ranges\n * (min, max pairs scaled by displacementScale), leaves bound the\n * displacement prisms along the vertex normals and store the packed ranges.\n */\nexport function buildBLAS(\n geometry: Pick<Geometry, 'position' | 'indices' | 'normal'>,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array\n): FlattendBVH {\n const position = geometry.position;\n const indices = geometry.indices?.array;\n if (!position || !indices || !Attribute.getCount(position)) {\n return emptyBvh(false);\n }\n const positions = position.array;\n const stride = position.itemSize;\n const normal = trianglesDisplacement ? geometry.normal : undefined;\n const normals = normal?.array;\n const normalStride = normal?.itemSize ?? 0;\n const triangleCount = Math.floor(indices.length / 3);\n const aabbs = new Float32Array(triangleCount * 6);\n const triangles = new Uint32Array(triangleCount);\n let count = 0;\n for (let t = 0; t < triangleCount; t++) {\n let minHeight = 0, maxHeight = 0;\n if (normals) {\n minHeight = trianglesDisplacement![t * 2] * displacementScale;\n maxHeight = trianglesDisplacement![t * 2 + 1] * displacementScale;\n if (isNaN(minHeight) || isNaN(maxHeight)) {\n minHeight = 0;\n maxHeight = displacementScale;\n }\n }\n if (triangleBounds(\n positions, stride, normals, normalStride,\n indices[t * 3], indices[t * 3 + 1], indices[t * 3 + 2],\n minHeight, maxHeight, aabbs, count * 6\n )) {\n triangles[count++] = t;\n }\n }\n if (!count) return emptyBvh(false);\n\n const bvh = buildBinnedSahBvh(aabbs, count);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n let buildSurfaceArea = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];\n buildSurfaceArea += 2 * (x * z + x * y + z * y);\n const prims = primCount[node];\n if (!prims) {\n // Pointer to the second child.\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n // Negative signals to the shader that this node is a leaf.\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const t = triangles[primIndices[leftFirst[node] + i]];\n const e = o + 8 + i * 4;\n ints[e] = indices[t * 3];\n ints[e + 1] = indices[t * 3 + 1];\n ints[e + 2] = indices[t * 3 + 2];\n // Pack minH, maxH to one channel.\n ints[e + 3] = trianglesDisplacement\n ? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])\n : 0;\n }\n }\n\n return {\n builder: 'builtin',\n buildSurfaceArea,\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2'\n };\n}\n\ninterface BlasPlacement {\n blasOffsets: number[];\n vertexOffsets: number[];\n layouts: BvhLayout[];\n}\n\nfunction getBlasPlacement(blases: BLASInstance[]): BlasPlacement {\n let blasOffset = 0;\n let vertexOffset = 0;\n const placement: BlasPlacement = { blasOffsets: [], vertexOffsets: [], layouts: [] };\n blases.forEach((blas) => {\n placement.blasOffsets.push(blasOffset);\n placement.vertexOffsets.push(vertexOffset);\n placement.layouts.push(blas.bvh.layout ?? 'bvh2');\n blasOffset += blas.bvh.buffer.byteLength / 16;\n vertexOffset += blas.verticesCount;\n });\n return placement;\n}\n\n/** Writes the instance's world bounds, padded by its displacement, to out. */\nfunction instanceBounds(instance: TLASInstance, out: Float32Array, o: number) {\n const { min, max } = instance.bounds;\n let padX = 0, padY = 0, padZ = 0;\n const displacementScale = instance.displacementScale;\n if (displacementScale) {\n const m = instance.transform;\n padX = Math.max(0, displacementScale * Math.hypot(m[0], m[1], m[2]));\n padY = Math.max(0, displacementScale * Math.hypot(m[4], m[5], m[6]));\n padZ = Math.max(0, displacementScale * Math.hypot(m[8], m[9], m[10]));\n }\n out[o] = min[0] - padX; out[o + 1] = min[1] - padY; out[o + 2] = min[2] - padZ;\n out[o + 3] = max[0] + padX; out[o + 4] = max[1] + padY; out[o + 5] = max[2] + padZ;\n}\n\nfunction writeInstanceRecord(\n instanceInts: Int32Array,\n instanceFloats: Float32Array,\n targetIndex: number,\n instance: TLASInstance,\n placement: BlasPlacement\n) {\n const offset = targetIndex * INSTANCE_WORD_STRIDE;\n instanceInts[offset] = encodeBlasOffset(\n placement.blasOffsets[instance.blasIndex],\n placement.layouts[instance.blasIndex]\n );\n instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];\n instanceInts[offset + 2] = instance.materialsIndices[0] || 0;\n instanceFloats[offset + 3] = instance.displacementScale || 0;\n instanceFloats.set(instance.color ?? [1, 1, 1], offset + 36);\n instanceFloats[offset + 39] = 0;\n const inverse = mat4.invert(mat4.create(), instance.transform);\n for (let i = 0; i < 16; i++) {\n instanceFloats[offset + 4 + i] = inverse[i];\n instanceFloats[offset + 20 + i] = instance.transform[i];\n }\n}\n\n/**\n * Builds a BVH2 TLAS over the instances. Leaves store\n * (instance record, BLAS offset, source instance index, 0); instance records\n * are written in leaf order to instancesBuffer.\n */\nexport function buildTLAS(\n instances: MeshInstances,\n blases: BLASInstance[]\n): FlattendBVH {\n if (!instances.length) return emptyBvh(true);\n const placement = getBlasPlacement(blases);\n const aabbs = new Float32Array(instances.length * 6);\n for (let i = 0; i < instances.length; i++) {\n instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);\n }\n\n const bvh = buildBinnedSahBvh(aabbs, instances.length);\n const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);\n const { bounds, leftFirst, primCount, primIndices } = bvh;\n const buffer = new ArrayBuffer(vec4Count * 16);\n const floats = new Float32Array(buffer);\n const ints = new Int32Array(buffer);\n const instancesBuffer = new ArrayBuffer(instances.length * INSTANCE_WORD_STRIDE * 4);\n const instanceInts = new Int32Array(instancesBuffer);\n const instanceFloats = new Float32Array(instancesBuffer);\n let target = 0;\n for (let k = 0; k < order.length; k++) {\n const node = order[k];\n const o = offsets[node] * 4, b = node * 6;\n floats[o] = bounds[b]; floats[o + 1] = bounds[b + 1]; floats[o + 2] = bounds[b + 2];\n floats[o + 4] = bounds[b + 3]; floats[o + 5] = bounds[b + 4]; floats[o + 6] = bounds[b + 5];\n const prims = primCount[node];\n if (!prims) {\n ints[o + 3] = offsets[leftFirst[node] + 1];\n continue;\n }\n ints[o + 3] = -prims;\n for (let i = 0; i < prims; i++) {\n const source = primIndices[leftFirst[node] + i];\n const instance = readMeshInstance(instances, source);\n const e = o + 8 + i * 4;\n ints[e] = target;\n ints[e + 1] = placement.blasOffsets[instance.blasIndex];\n // Keep the source instance index in the otherwise-unused z lane so\n // the TLAS can be refitted without rebuilding its topology.\n ints[e + 2] = source;\n writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);\n target++;\n }\n }\n\n return {\n builder: 'builtin',\n maxDepth,\n maxLeafPrimitives,\n buffer,\n layout: 'bvh2',\n instancesBuffer\n };\n}\n\nexport interface TLASRefitRange {\n offset: number;\n size: number;\n}\n\nexport interface TLASRefitResult {\n tlasRanges: TLASRefitRange[];\n instanceRanges: TLASRefitRange[];\n}\n\ninterface TLASRefitMetadata {\n parent: Map<number, number>;\n depth: Map<number, number>;\n leavesBySource: Map<number, Set<number>>;\n instancesByLeaf: Map<number, { source: number; target: number }[]>;\n}\n\nconst tlasRefitMetadata = new WeakMap<FlattendBVH, TLASRefitMetadata>();\n\nfunction getTLASRefitMetadata(flattened: FlattendBVH, ints: Int32Array) {\n const cached = tlasRefitMetadata.get(flattened);\n if (cached) return cached;\n const metadata: TLASRefitMetadata = {\n parent: new Map(),\n depth: new Map(),\n leavesBySource: new Map(),\n instancesByLeaf: new Map()\n };\n const visit = (index: number, parent: number | undefined, depth: number) => {\n metadata.depth.set(index, depth);\n if (parent != null) metadata.parent.set(index, parent);\n const base = index * 4;\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n visit(index + 2, index, depth + 1);\n visit(primitiveCountOrChild, index, depth + 1);\n return;\n }\n const entries: { source: number; target: number }[] = [];\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const target = ints[primitiveOffset];\n const source = ints[primitiveOffset + 2];\n entries.push({ source, target });\n const leaves = metadata.leavesBySource.get(source) ?? new Set<number>();\n leaves.add(index);\n metadata.leavesBySource.set(source, leaves);\n }\n metadata.instancesByLeaf.set(index, entries);\n };\n visit(0, undefined, 0);\n tlasRefitMetadata.set(flattened, metadata);\n return metadata;\n}\n\nexport function mergeRefitRanges(ranges: TLASRefitRange[]) {\n const sorted = ranges\n .filter(({ size }) => size > 0)\n .sort((left, right) => left.offset - right.offset);\n const merged: TLASRefitRange[] = [];\n for (const range of sorted) {\n const previous = merged[merged.length - 1];\n if (previous && range.offset <= previous.offset + previous.size) {\n previous.size = Math.max(\n previous.size,\n range.offset + range.size - previous.offset\n );\n } else {\n merged.push({ ...range });\n }\n }\n return merged;\n}\n\nexport function refitTLAS(\n flattened: FlattendBVH,\n instances: MeshInstances,\n blases: BLASInstance[],\n dirtySourceIndices?: ReadonlySet<number>\n): TLASRefitResult {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {\n return { tlasRanges: [], instanceRanges: [] };\n }\n const floats = new Float32Array(flattened.buffer);\n const ints = new Int32Array(flattened.buffer);\n const instanceFloats = new Float32Array(flattened.instancesBuffer);\n const instanceInts = new Int32Array(flattened.instancesBuffer);\n\n const placement = getBlasPlacement(blases);\n const scratch = new Float32Array(6);\n\n function writeInstance(targetIndex: number, sourceIndex: number) {\n writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);\n }\n\n function addInstanceBounds(bounds: Box3, instance: TLASInstance) {\n instanceBounds(instance, scratch, 0);\n bounds.min[0] = Math.min(bounds.min[0], scratch[0]);\n bounds.min[1] = Math.min(bounds.min[1], scratch[1]);\n bounds.min[2] = Math.min(bounds.min[2], scratch[2]);\n bounds.max[0] = Math.max(bounds.max[0], scratch[3]);\n bounds.max[1] = Math.max(bounds.max[1], scratch[4]);\n bounds.max[2] = Math.max(bounds.max[2], scratch[5]);\n }\n\n function writeNodeBounds(index: number, bounds: Box3) {\n const base = index * 4;\n floats[base] = bounds.min[0];\n floats[base + 1] = bounds.min[1];\n floats[base + 2] = bounds.min[2];\n floats[base + 4] = bounds.max[0];\n floats[base + 5] = bounds.max[1];\n floats[base + 6] = bounds.max[2];\n }\n\n function readNodeBounds(index: number) {\n const base = index * 4;\n const bounds = new Box3();\n vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);\n vec3.set(\n bounds.max,\n floats[base + 4],\n floats[base + 5],\n floats[base + 6]\n );\n return bounds;\n }\n\n function refitNode(index: number): Box3 {\n const base = index * 4;\n const bounds = new Box3();\n const primitiveCountOrChild = ints[base + 3];\n if (primitiveCountOrChild >= 0) {\n const left = refitNode(index + 2);\n const right = refitNode(primitiveCountOrChild);\n unionBounds(bounds, left, right);\n } else {\n for (let i = 0; i < -primitiveCountOrChild; i++) {\n const primitiveOffset = base + 8 + i * 4;\n const targetInstance = ints[primitiveOffset];\n const sourceInstance = ints[primitiveOffset + 2];\n const instance = readMeshInstance(instances, sourceInstance);\n if (!instance) continue;\n addInstanceBounds(bounds, instance);\n writeInstance(targetInstance, sourceInstance);\n }\n }\n writeNodeBounds(index, bounds);\n return bounds;\n }\n\n if (!dirtySourceIndices) {\n refitNode(0);\n return {\n tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],\n instanceRanges: [\n { offset: 0, size: flattened.instancesBuffer.byteLength }\n ]\n };\n }\n\n const metadata = getTLASRefitMetadata(flattened, ints);\n const dirtyLeaves = new Set<number>();\n const instanceRanges: TLASRefitRange[] = [];\n for (const source of dirtySourceIndices) {\n const leaves = metadata.leavesBySource.get(source);\n if (!leaves) continue;\n leaves.forEach((leaf) => dirtyLeaves.add(leaf));\n for (const leaf of leaves) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n writeInstance(entry.target, source);\n instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });\n }\n }\n }\n\n const dirtyNodes = new Set<number>();\n for (const leaf of dirtyLeaves) {\n const bounds = new Box3();\n for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {\n const instance = readMeshInstance(instances, source);\n if (instance) addInstanceBounds(bounds, instance);\n }\n writeNodeBounds(leaf, bounds);\n dirtyNodes.add(leaf);\n let parent = metadata.parent.get(leaf);\n while (parent != null) {\n dirtyNodes.add(parent);\n parent = metadata.parent.get(parent);\n }\n }\n\n const internalNodes = [...dirtyNodes]\n .filter((index) => ints[index * 4 + 3] >= 0)\n .sort(\n (left, right) =>\n (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0)\n );\n for (const index of internalNodes) {\n const right = ints[index * 4 + 3];\n const bounds = new Box3();\n unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));\n writeNodeBounds(index, bounds);\n }\n\n return {\n tlasRanges: mergeRefitRanges(\n [...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))\n ),\n instanceRanges: mergeRefitRanges(instanceRanges)\n };\n}\n\n/** Dynamic BLASes rebuild when their total node surface area doubles. */\nexport const DYNAMIC_BLAS_REBUILD_RATIO = 2;\n\ninterface BlasRefitData {\n /** Per leaf (vec4 index): offset of its vertex list in vertices. */\n offsets: Int32Array;\n /** Per leaf: unique vertex count followed by the vertices. */\n vertices: Uint32Array;\n /** Node indices (vec4 units) with descendants before their ancestors. */\n postorder: Int32Array;\n}\n\n// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle\n// corners once so deformation refits read each leaf's vertex only once.\nconst blasRefitData = new WeakMap<ArrayBuffer, BlasRefitData>();\n\nfunction getBlasRefitData(buffer: ArrayBuffer): BlasRefitData {\n const cached = blasRefitData.get(buffer);\n if (cached) return cached;\n const ints = new Int32Array(buffer);\n const offsets = new Int32Array(ints.length / 4);\n const vertices: number[] = [];\n const preorder: number[] = [];\n const stack = [0];\n while (stack.length) {\n const index = stack.pop()!;\n preorder.push(index);\n const base = index * 4;\n const child = ints[base + 3];\n if (child >= 0) {\n stack.push(child, index + 2);\n continue;\n }\n offsets[index] = vertices.length;\n const countSlot = vertices.length;\n vertices.push(0);\n for (let i = 0; i < -child; i++) {\n for (let j = 0; j < 3; j++) {\n const vertex = ints[base + 8 + i * 4 + j];\n let seen = false;\n for (let k = countSlot + 1; k < vertices.length; k++) {\n if (vertices[k] === vertex) { seen = true; break; }\n }\n if (!seen) vertices.push(vertex);\n }\n }\n vertices[countSlot] = vertices.length - countSlot - 1;\n }\n const data = {\n offsets,\n vertices: new Uint32Array(vertices),\n postorder: new Int32Array(preorder.reverse())\n };\n blasRefitData.set(buffer, data);\n return data;\n}\n\n/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */\nexport function refitBLAS(\n flattened: FlattendBVH,\n geometry: Pick<Geometry, 'position'> & Partial<Pick<Geometry, 'dynamic'>>\n) {\n if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {\n return false;\n }\n const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);\n const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n if (flattened.buildSurfaceArea == null) {\n let area = 0;\n for (const index of postorder) {\n const b = index * 4;\n const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];\n area += 2 * (x * z + x * y + z * y);\n }\n flattened.buildSurfaceArea = area;\n }\n let area = 0;\n for (let node = 0; node < postorder.length; node++) {\n const index = postorder[node], base = index * 4, child = ints[base + 3];\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n if (child >= 0) {\n const left = base + 8, right = child * 4;\n minX = Math.min(floats[left], floats[right]); minY = Math.min(floats[left + 1], floats[right + 1]); minZ = Math.min(floats[left + 2], floats[right + 2]);\n maxX = Math.max(floats[left + 4], floats[right + 4]); maxY = Math.max(floats[left + 5], floats[right + 5]); maxZ = Math.max(floats[left + 6], floats[right + 6]);\n } else {\n const start = offsets[index], end = start + 1 + vertices[start];\n for (let i = start + 1; i < end; i++) {\n const offset = vertices[i] * stride;\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!isFinite(x) || !isFinite(y) || !isFinite(z)) continue;\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n }\n const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;\n area += 2 * (x * z + x * y + z * y);\n floats[base] = minX; floats[base + 1] = minY; floats[base + 2] = minZ;\n floats[base + 4] = maxX; floats[base + 5] = maxY; floats[base + 6] = maxZ;\n }\n return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);\n}\n\n/** Writes only instance colors; TLAS topology and bounds remain untouched. */\nexport function updateTLASInstanceColors(flattened: FlattendBVH, instances: MeshInstances, dirty: ReadonlySet<number>): TLASRefitRange[] {\n if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size) return [];\n const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));\n const floats = new Float32Array(flattened.instancesBuffer);\n const ranges: TLASRefitRange[] = [];\n for (const source of dirty) for (const leaf of metadata.leavesBySource.get(source) ?? []) {\n for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {\n if (entry.source !== source) continue;\n const offset = entry.target * INSTANCE_WORD_STRIDE + 36;\n floats.set(readMeshInstance(instances, source).color ?? [1, 1, 1], offset);\n ranges.push({offset: offset * 4, size: 16});\n }\n }\n return mergeRefitRanges(ranges);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BvhBuildRequest } from './bvhWorkerClient.js';
|
|
2
|
+
/** Shared worker operation, also executable without browser globals in tests. */
|
|
3
|
+
export declare function executeBvhBuild(request: BvhBuildRequest): Promise<{
|
|
4
|
+
bvhTimeMs: number;
|
|
5
|
+
builder?: "builtin" | "tinybvh";
|
|
6
|
+
buildSurfaceArea?: number;
|
|
7
|
+
maxDepth: number;
|
|
8
|
+
maxLeafPrimitives?: number;
|
|
9
|
+
buffer: ArrayBuffer;
|
|
10
|
+
layout?: import("./bvhAccel.js").BvhLayout;
|
|
11
|
+
instancesBuffer?: ArrayBuffer;
|
|
12
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { buildTinyBvh } from '../tinybvh/TinyBvhBuilder.js';
|
|
2
|
+
import Geometry from '../scene/Geometry.js';
|
|
3
|
+
import { buildBLAS } from './bvhAccel.js';
|
|
4
|
+
/** Shared worker operation, also executable without browser globals in tests. */
|
|
5
|
+
export async function executeBvhBuild(request) {
|
|
6
|
+
const geometry = new Geometry({
|
|
7
|
+
position: request.position, normal: request.normal, indices: request.indices
|
|
8
|
+
});
|
|
9
|
+
geometry.dynamic = request.dynamic;
|
|
10
|
+
if (request.builder === 'tinybvh' && !geometry.dynamic) {
|
|
11
|
+
return buildTinyBvh(geometry, request.displacementScale, request.trianglesDisplacement, request.layout, request.spatialSplits);
|
|
12
|
+
}
|
|
13
|
+
const start = performance.now();
|
|
14
|
+
return { ...buildBLAS(geometry, request.displacementScale, request.trianglesDisplacement),
|
|
15
|
+
bvhTimeMs: performance.now() - start };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=bvhWorkerBuild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhWorkerBuild.js","sourceRoot":"","sources":["../../src/renderer/bvhWorkerBuild.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC5D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO;KAC7E,CAAC,CAAC;IACH,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACnC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACvD,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,qBAAqB,EACpF,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,OAAO,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,qBAAqB,CAAC;QACvF,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AAC3C,CAAC","sourcesContent":["import { buildTinyBvh } from '../tinybvh/TinyBvhBuilder.js';\nimport Geometry from '../scene/Geometry.js';\nimport { buildBLAS } from './bvhAccel.js';\nimport type { BvhBuildRequest } from './bvhWorkerClient.js';\n\n/** Shared worker operation, also executable without browser globals in tests. */\nexport async function executeBvhBuild(request: BvhBuildRequest) {\n const geometry = new Geometry({\n position: request.position, normal: request.normal, indices: request.indices\n });\n geometry.dynamic = request.dynamic;\n if (request.builder === 'tinybvh' && !geometry.dynamic) {\n return buildTinyBvh(geometry, request.displacementScale, request.trianglesDisplacement,\n request.layout, request.spatialSplits);\n }\n const start = performance.now();\n return { ...buildBLAS(geometry, request.displacementScale, request.trianglesDisplacement),\n bvhTimeMs: performance.now() - start };\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type Geometry from '../scene/Geometry.js';
|
|
2
|
+
import type { FlattendBVH, BvhLayout } from './bvhAccel.js';
|
|
3
|
+
export interface BvhBuildRequest {
|
|
4
|
+
id: number;
|
|
5
|
+
position: Geometry['position'];
|
|
6
|
+
normal?: Geometry['normal'];
|
|
7
|
+
indices: Geometry['indices'];
|
|
8
|
+
dynamic: boolean;
|
|
9
|
+
builder: 'builtin' | 'tinybvh';
|
|
10
|
+
layout: BvhLayout;
|
|
11
|
+
displacementScale: number;
|
|
12
|
+
trianglesDisplacement?: Float32Array;
|
|
13
|
+
spatialSplits: boolean;
|
|
14
|
+
}
|
|
15
|
+
export type BvhBuildResponse = {
|
|
16
|
+
id: number;
|
|
17
|
+
bvh: FlattendBVH;
|
|
18
|
+
} | {
|
|
19
|
+
id: number;
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
/** Worker transport or startup failure; retry the builder on the calling thread. */
|
|
23
|
+
export declare class BvhWorkerUnavailableError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
/** Explicit pool shutdown; callers must not retry cancelled builds. */
|
|
27
|
+
export declare class BvhWorkerDisposedError extends Error {
|
|
28
|
+
constructor();
|
|
29
|
+
}
|
|
30
|
+
/** Conservative automatic limit; explicit counts are not capped by CPU count. */
|
|
31
|
+
export declare function resolveBvhWorkerCount(count: number | 'auto'): number;
|
|
32
|
+
/** Internal reusable client; transfer owned copies, keeping source arrays attached. */
|
|
33
|
+
export declare class BvhWorkerClient {
|
|
34
|
+
private worker;
|
|
35
|
+
private nextId;
|
|
36
|
+
private pending;
|
|
37
|
+
private failed;
|
|
38
|
+
constructor(worker: Worker);
|
|
39
|
+
private fail;
|
|
40
|
+
dispose(): void;
|
|
41
|
+
build(request: Omit<BvhBuildRequest, 'id'>): Promise<FlattendBVH>;
|
|
42
|
+
}
|
|
43
|
+
/** Lazy reusable pool: at most one cloned input is in flight per Worker. */
|
|
44
|
+
export declare class BvhWorkerPool {
|
|
45
|
+
readonly size: number;
|
|
46
|
+
private slots;
|
|
47
|
+
private queue;
|
|
48
|
+
private stopped?;
|
|
49
|
+
constructor(size: number);
|
|
50
|
+
build(request: Omit<BvhBuildRequest, 'id'>): Promise<FlattendBVH>;
|
|
51
|
+
private stop;
|
|
52
|
+
private dispatch;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
/** Supports nested workers too; startup/transport failures use the existing calling-thread fallback. */
|
|
56
|
+
export declare function canUseBvhWorker(): boolean;
|
|
57
|
+
export declare function buildBvhInWorker(geometry: Geometry, displacementScale?: number, trianglesDisplacement?: Float32Array, builder?: 'builtin' | 'tinybvh', layout?: BvhLayout, spatialSplits?: boolean, pool?: BvhWorkerPool): Promise<FlattendBVH>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** Worker transport or startup failure; retry the builder on the calling thread. */
|
|
2
|
+
export class BvhWorkerUnavailableError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'BvhWorkerUnavailableError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/** Explicit pool shutdown; callers must not retry cancelled builds. */
|
|
9
|
+
export class BvhWorkerDisposedError extends Error {
|
|
10
|
+
constructor() {
|
|
11
|
+
super('BVH worker pool was disposed.');
|
|
12
|
+
this.name = 'BvhWorkerDisposedError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Conservative automatic limit; explicit counts are not capped by CPU count. */
|
|
16
|
+
export function resolveBvhWorkerCount(count) {
|
|
17
|
+
if (count !== 'auto') {
|
|
18
|
+
if (!Number.isSafeInteger(count) || count < 1) {
|
|
19
|
+
throw new RangeError('bvhWorkerCount must be "auto" or a positive safe integer.');
|
|
20
|
+
}
|
|
21
|
+
return count;
|
|
22
|
+
}
|
|
23
|
+
const cores = typeof navigator === 'undefined' ? 2 : navigator.hardwareConcurrency;
|
|
24
|
+
return Number.isFinite(cores) ? Math.max(1, Math.min(4, Math.floor(cores) - 1)) : 1;
|
|
25
|
+
}
|
|
26
|
+
/** Internal reusable client; transfer owned copies, keeping source arrays attached. */
|
|
27
|
+
export class BvhWorkerClient {
|
|
28
|
+
worker;
|
|
29
|
+
nextId = 0;
|
|
30
|
+
pending = new Map();
|
|
31
|
+
failed = false;
|
|
32
|
+
constructor(worker) {
|
|
33
|
+
this.worker = worker;
|
|
34
|
+
worker.onmessage = ({ data }) => {
|
|
35
|
+
const task = this.pending.get(data.id);
|
|
36
|
+
if (!task)
|
|
37
|
+
return;
|
|
38
|
+
this.pending.delete(data.id);
|
|
39
|
+
if ('error' in data)
|
|
40
|
+
task.reject(new Error(data.error));
|
|
41
|
+
else
|
|
42
|
+
task.resolve(data.bvh);
|
|
43
|
+
};
|
|
44
|
+
worker.onerror = (event) => {
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
this.fail(new BvhWorkerUnavailableError(event.message || 'BVH worker failed.'));
|
|
47
|
+
};
|
|
48
|
+
worker.onmessageerror = () => this.fail(new BvhWorkerUnavailableError('Unable to receive BVH worker result.'));
|
|
49
|
+
}
|
|
50
|
+
fail(error) {
|
|
51
|
+
if (this.failed)
|
|
52
|
+
return;
|
|
53
|
+
this.failed = true;
|
|
54
|
+
this.worker.onmessage = this.worker.onerror = this.worker.onmessageerror = null;
|
|
55
|
+
this.worker.terminate();
|
|
56
|
+
this.pending.forEach(task => task.reject(error));
|
|
57
|
+
this.pending.clear();
|
|
58
|
+
}
|
|
59
|
+
dispose() {
|
|
60
|
+
this.fail(new BvhWorkerDisposedError());
|
|
61
|
+
}
|
|
62
|
+
build(request) {
|
|
63
|
+
if (this.failed)
|
|
64
|
+
return Promise.reject(new BvhWorkerUnavailableError('BVH worker is unavailable.'));
|
|
65
|
+
const id = this.nextId++;
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
this.pending.set(id, { resolve, reject });
|
|
68
|
+
try {
|
|
69
|
+
// Copy only each view's range: a GLTF accessor may reference a much
|
|
70
|
+
// larger backing buffer. Transfer these owned copies, never the source.
|
|
71
|
+
const position = { ...request.position, array: request.position.array.slice() };
|
|
72
|
+
const indices = { ...request.indices, array: request.indices.array.slice() };
|
|
73
|
+
const normal = request.normal && { ...request.normal, array: request.normal.array.slice() };
|
|
74
|
+
const trianglesDisplacement = request.trianglesDisplacement?.slice();
|
|
75
|
+
const transfers = [position.array.buffer, indices.array.buffer];
|
|
76
|
+
if (normal)
|
|
77
|
+
transfers.push(normal.array.buffer);
|
|
78
|
+
if (trianglesDisplacement)
|
|
79
|
+
transfers.push(trianglesDisplacement.buffer);
|
|
80
|
+
this.worker.postMessage({ ...request, id, position, indices, normal, trianglesDisplacement }, transfers);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.fail(new BvhWorkerUnavailableError(error instanceof Error ? error.message : String(error)));
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Lazy reusable pool: at most one cloned input is in flight per Worker. */
|
|
89
|
+
export class BvhWorkerPool {
|
|
90
|
+
size;
|
|
91
|
+
slots = [];
|
|
92
|
+
queue = [];
|
|
93
|
+
stopped;
|
|
94
|
+
constructor(size) {
|
|
95
|
+
this.size = size;
|
|
96
|
+
resolveBvhWorkerCount(size);
|
|
97
|
+
}
|
|
98
|
+
build(request) {
|
|
99
|
+
if (this.stopped)
|
|
100
|
+
return Promise.reject(this.stopped);
|
|
101
|
+
return new Promise((resolve, reject) => {
|
|
102
|
+
this.queue.push({ request, resolve, reject });
|
|
103
|
+
this.dispatch();
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
stop(error) {
|
|
107
|
+
this.stopped ??= error;
|
|
108
|
+
for (const job of this.queue.splice(0))
|
|
109
|
+
job.reject(this.stopped);
|
|
110
|
+
}
|
|
111
|
+
dispatch() {
|
|
112
|
+
while (this.queue.length && !this.stopped) {
|
|
113
|
+
let slot = this.slots.find(slot => !slot.busy);
|
|
114
|
+
if (!slot) {
|
|
115
|
+
if (this.slots.length >= this.size)
|
|
116
|
+
return;
|
|
117
|
+
try {
|
|
118
|
+
slot = { client: new BvhWorkerClient(new Worker(new URL('./bvh.worker.js', import.meta.url), { type: 'module' })), busy: false };
|
|
119
|
+
this.slots.push(slot);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
this.stop(new BvhWorkerUnavailableError(error instanceof Error ? error.message : String(error)));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const job = this.queue.shift();
|
|
127
|
+
const active = slot;
|
|
128
|
+
active.busy = true;
|
|
129
|
+
void active.client.build(job.request).then(job.resolve, error => {
|
|
130
|
+
if (error instanceof BvhWorkerUnavailableError)
|
|
131
|
+
this.stop(error);
|
|
132
|
+
job.reject(error);
|
|
133
|
+
}).finally(() => {
|
|
134
|
+
active.busy = false;
|
|
135
|
+
this.dispatch();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
dispose() {
|
|
140
|
+
this.stop(new BvhWorkerDisposedError());
|
|
141
|
+
for (const slot of this.slots)
|
|
142
|
+
slot.client.dispose();
|
|
143
|
+
this.slots = [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Supports nested workers too; startup/transport failures use the existing calling-thread fallback. */
|
|
147
|
+
export function canUseBvhWorker() {
|
|
148
|
+
return typeof Worker !== 'undefined';
|
|
149
|
+
}
|
|
150
|
+
export async function buildBvhInWorker(geometry, displacementScale = 0, trianglesDisplacement, builder = 'builtin', layout = 'bvh2', spatialSplits = false, pool) {
|
|
151
|
+
const activePool = pool ?? new BvhWorkerPool(1);
|
|
152
|
+
try {
|
|
153
|
+
return await activePool.build({
|
|
154
|
+
position: geometry.position,
|
|
155
|
+
normal: trianglesDisplacement ? geometry.normal : undefined,
|
|
156
|
+
indices: geometry.indices,
|
|
157
|
+
dynamic: geometry.dynamic,
|
|
158
|
+
builder, layout, displacementScale, trianglesDisplacement, spatialSplits
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
if (!pool)
|
|
163
|
+
activePool.dispose();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=bvhWorkerClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhWorkerClient.js","sourceRoot":"","sources":["../../src/renderer/bvhWorkerClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type Geometry from '../scene/Geometry.js';\nimport type { FlattendBVH, BvhLayout } from './bvhAccel.js';\n\nexport interface BvhBuildRequest {\n id: number;\n position: Geometry['position'];\n normal?: Geometry['normal'];\n indices: Geometry['indices'];\n dynamic: boolean;\n builder: 'builtin' | 'tinybvh';\n layout: BvhLayout;\n displacementScale: number;\n trianglesDisplacement?: Float32Array;\n spatialSplits: boolean;\n}\n\nexport type BvhBuildResponse =\n | { id: number; bvh: FlattendBVH }\n | { id: number; error: string };\n\n/** Worker transport or startup failure; retry the builder on the calling thread. */\nexport class BvhWorkerUnavailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BvhWorkerUnavailableError';\n }\n}\n\n/** Explicit pool shutdown; callers must not retry cancelled builds. */\nexport class BvhWorkerDisposedError extends Error {\n constructor() {\n super('BVH worker pool was disposed.');\n this.name = 'BvhWorkerDisposedError';\n }\n}\n\n/** Conservative automatic limit; explicit counts are not capped by CPU count. */\nexport function resolveBvhWorkerCount(count: number | 'auto') {\n if (count !== 'auto') {\n if (!Number.isSafeInteger(count) || count < 1) {\n throw new RangeError('bvhWorkerCount must be \"auto\" or a positive safe integer.');\n }\n return count;\n }\n const cores = typeof navigator === 'undefined' ? 2 : navigator.hardwareConcurrency;\n return Number.isFinite(cores) ? Math.max(1, Math.min(4, Math.floor(cores) - 1)) : 1;\n}\n\n/** Internal reusable client; transfer owned copies, keeping source arrays attached. */\nexport class BvhWorkerClient {\n private nextId = 0;\n private pending = new Map<number, {\n resolve: (bvh: FlattendBVH) => void;\n reject: (error: Error) => void;\n }>();\n private failed = false;\n\n constructor(private worker: Worker) {\n worker.onmessage = ({ data }: MessageEvent<BvhBuildResponse>) => {\n const task = this.pending.get(data.id);\n if (!task) return;\n this.pending.delete(data.id);\n if ('error' in data) task.reject(new Error(data.error));\n else task.resolve(data.bvh);\n };\n worker.onerror = (event) => {\n event.preventDefault();\n this.fail(new BvhWorkerUnavailableError(event.message || 'BVH worker failed.'));\n };\n worker.onmessageerror = () => this.fail(new BvhWorkerUnavailableError('Unable to receive BVH worker result.'));\n }\n\n private fail(error: Error) {\n if (this.failed) return;\n this.failed = true;\n this.worker.onmessage = this.worker.onerror = this.worker.onmessageerror = null;\n this.worker.terminate();\n this.pending.forEach(task => task.reject(error));\n this.pending.clear();\n }\n\n dispose() {\n this.fail(new BvhWorkerDisposedError());\n }\n\n build(request: Omit<BvhBuildRequest, 'id'>): Promise<FlattendBVH> {\n if (this.failed) return Promise.reject(new BvhWorkerUnavailableError('BVH worker is unavailable.'));\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject });\n try {\n // Copy only each view's range: a GLTF accessor may reference a much\n // larger backing buffer. Transfer these owned copies, never the source.\n const position = { ...request.position, array: request.position.array.slice() };\n const indices = { ...request.indices, array: request.indices.array.slice() };\n const normal = request.normal && { ...request.normal, array: request.normal.array.slice() };\n const trianglesDisplacement = request.trianglesDisplacement?.slice();\n const transfers = [position.array.buffer, indices.array.buffer];\n if (normal) transfers.push(normal.array.buffer);\n if (trianglesDisplacement) transfers.push(trianglesDisplacement.buffer);\n this.worker.postMessage({ ...request, id, position, indices, normal, trianglesDisplacement }, transfers);\n } catch (error) {\n this.fail(new BvhWorkerUnavailableError(error instanceof Error ? error.message : String(error)));\n }\n });\n }\n}\n\ntype PoolJob = {\n request: Omit<BvhBuildRequest, 'id'>;\n resolve: (bvh: FlattendBVH) => void;\n reject: (error: Error) => void;\n};\ntype PoolSlot = { client: BvhWorkerClient; busy: boolean };\n\n/** Lazy reusable pool: at most one cloned input is in flight per Worker. */\nexport class BvhWorkerPool {\n private slots: PoolSlot[] = [];\n private queue: PoolJob[] = [];\n private stopped?: Error;\n\n constructor(readonly size: number) {\n resolveBvhWorkerCount(size);\n }\n\n build(request: Omit<BvhBuildRequest, 'id'>): Promise<FlattendBVH> {\n if (this.stopped) return Promise.reject(this.stopped);\n return new Promise((resolve, reject) => {\n this.queue.push({ request, resolve, reject });\n this.dispatch();\n });\n }\n\n private stop(error: Error) {\n this.stopped ??= error;\n for (const job of this.queue.splice(0)) job.reject(this.stopped);\n }\n\n private dispatch() {\n while (this.queue.length && !this.stopped) {\n let slot = this.slots.find(slot => !slot.busy);\n if (!slot) {\n if (this.slots.length >= this.size) return;\n try {\n slot = { client: new BvhWorkerClient(\n new Worker(new URL('./bvh.worker.ts', import.meta.url), { type: 'module' })\n ), busy: false };\n this.slots.push(slot);\n } catch (error) {\n this.stop(new BvhWorkerUnavailableError(error instanceof Error ? error.message : String(error)));\n return;\n }\n }\n const job = this.queue.shift()!;\n const active = slot;\n active.busy = true;\n void active.client.build(job.request).then(job.resolve, error => {\n if (error instanceof BvhWorkerUnavailableError) this.stop(error);\n job.reject(error);\n }).finally(() => {\n active.busy = false;\n this.dispatch();\n });\n }\n }\n\n dispose() {\n this.stop(new BvhWorkerDisposedError());\n for (const slot of this.slots) slot.client.dispose();\n this.slots = [];\n }\n}\n\n/** Supports nested workers too; startup/transport failures use the existing calling-thread fallback. */\nexport function canUseBvhWorker() {\n return typeof Worker !== 'undefined';\n}\n\nexport async function buildBvhInWorker(\n geometry: Geometry,\n displacementScale = 0,\n trianglesDisplacement?: Float32Array,\n builder: 'builtin' | 'tinybvh' = 'builtin',\n layout: BvhLayout = 'bvh2',\n spatialSplits = false,\n pool?: BvhWorkerPool\n) {\n const activePool = pool ?? new BvhWorkerPool(1);\n try {\n return await activePool.build({\n position: geometry.position,\n normal: trianglesDisplacement ? geometry.normal : undefined,\n indices: geometry.indices,\n dynamic: geometry.dynamic,\n builder, layout, displacementScale, trianglesDisplacement, spatialSplits\n });\n } finally {\n if (!pool) activePool.dispose();\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type Camera from '../scene/Camera.js';
|
|
2
|
+
/** Internal perspective lens focal length in millimetres, including zoom. */
|
|
3
|
+
export declare function cameraFocalLength(camera: Camera): number;
|
|
4
|
+
/** Internal aperture radius in scene units; invalid or disabled lenses return zero. */
|
|
5
|
+
export declare function cameraApertureRadius(camera: Camera): number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Internal perspective lens focal length in millimetres, including zoom. */
|
|
2
|
+
export function cameraFocalLength(camera) {
|
|
3
|
+
if (camera.projection !== 'perspective')
|
|
4
|
+
return 0;
|
|
5
|
+
return 0.5 * camera.sensorHeight * Math.max(camera.zoom, Number.EPSILON) /
|
|
6
|
+
Math.tan(camera.fov * Math.PI / 360);
|
|
7
|
+
}
|
|
8
|
+
/** Internal aperture radius in scene units; invalid or disabled lenses return zero. */
|
|
9
|
+
export function cameraApertureRadius(camera) {
|
|
10
|
+
if (!(camera.fStop > 0) || !(camera.metersPerUnit > 0))
|
|
11
|
+
return 0;
|
|
12
|
+
const radius = cameraFocalLength(camera) / (2 * camera.fStop) / 1000 / camera.metersPerUnit;
|
|
13
|
+
return Number.isFinite(radius) && radius > 0 ? radius : 0;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=cameraLens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cameraLens.js","sourceRoot":"","sources":["../../src/renderer/cameraLens.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,MAAM,CAAC,UAAU,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC;IAClD,OAAO,GAAG,GAAG,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5F,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import type Camera from '../scene/Camera.js';\n\n/** Internal perspective lens focal length in millimetres, including zoom. */\nexport function cameraFocalLength(camera: Camera): number {\n if (camera.projection !== 'perspective') return 0;\n return 0.5 * camera.sensorHeight * Math.max(camera.zoom, Number.EPSILON) /\n Math.tan(camera.fov * Math.PI / 360);\n}\n\n/** Internal aperture radius in scene units; invalid or disabled lenses return zero. */\nexport function cameraApertureRadius(camera: Camera): number {\n if (!(camera.fStop > 0) || !(camera.metersPerUnit > 0)) return 0;\n const radius = cameraFocalLength(camera) / (2 * camera.fStop) / 1000 / camera.metersPerUnit;\n return Number.isFinite(radius) && radius > 0 ? radius : 0;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cameraSnapshot.js","sourceRoot":"","sources":["../../src/renderer/cameraSnapshot.ts"],"names":[],"mappings":"AACA,kFAAkF;AAClF,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type Camera from '../scene/Camera.js';\n/** Freeze camera values without rounding Three.js's double-precision matrices. */\nexport function cameraSnapshot(source: Camera): Camera {\n const copy = source.clone();\n copy.transform = source.transform.slice();\n return copy;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Scene } from '../scene/Scene.js';
|
|
2
|
+
import type { SceneChanges } from './sceneChangeDetector.js';
|
|
3
|
+
/** Stable engine-owned mirrors isolate deferred GPU uploads from external edits. */
|
|
4
|
+
export declare class CommittedScene {
|
|
5
|
+
private readonly copies;
|
|
6
|
+
private readonly geometryVersions;
|
|
7
|
+
private readonly instanceVersions;
|
|
8
|
+
private value?;
|
|
9
|
+
private readonly copying;
|
|
10
|
+
private copy;
|
|
11
|
+
mirror<T extends object>(source: T): T;
|
|
12
|
+
capture(scene: Scene, changes: SceneChanges): Scene;
|
|
13
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { createCanvas } from '../util/canvas.js';
|
|
2
|
+
import Geometry from '../scene/Geometry.js';
|
|
3
|
+
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
4
|
+
import Texture from '../scene/Texture.js';
|
|
5
|
+
import { copyGeometryChangeState } from '../scene/geometryChanges.js';
|
|
6
|
+
import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';
|
|
7
|
+
/** Stable engine-owned mirrors isolate deferred GPU uploads from external edits. */
|
|
8
|
+
export class CommittedScene {
|
|
9
|
+
copies = new WeakMap();
|
|
10
|
+
geometryVersions = new WeakMap();
|
|
11
|
+
instanceVersions = new WeakMap();
|
|
12
|
+
value;
|
|
13
|
+
copying = new WeakSet();
|
|
14
|
+
copy(value) {
|
|
15
|
+
if (!value || typeof value !== 'object')
|
|
16
|
+
return value;
|
|
17
|
+
const object = value;
|
|
18
|
+
if ((typeof HTMLImageElement !== 'undefined' && object instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && object instanceof HTMLCanvasElement) ||
|
|
19
|
+
(typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) ||
|
|
20
|
+
(typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap)) {
|
|
21
|
+
const source = object;
|
|
22
|
+
let canvas = this.copies.get(object);
|
|
23
|
+
if (!canvas) {
|
|
24
|
+
canvas = createCanvas(source.width, source.height);
|
|
25
|
+
this.copies.set(object, canvas);
|
|
26
|
+
}
|
|
27
|
+
canvas.width = source.width;
|
|
28
|
+
canvas.height = source.height;
|
|
29
|
+
const context = canvas.getContext('2d');
|
|
30
|
+
if (!context)
|
|
31
|
+
throw new Error('Texture snapshot context is not available.');
|
|
32
|
+
context.drawImage(source, 0, 0);
|
|
33
|
+
return canvas;
|
|
34
|
+
}
|
|
35
|
+
if (typeof Node !== 'undefined' && object instanceof Node)
|
|
36
|
+
return value;
|
|
37
|
+
if (value instanceof Geometry && this.geometryVersions.get(value) === value.version)
|
|
38
|
+
return this.copies.get(value);
|
|
39
|
+
if (ArrayBuffer.isView(value)) {
|
|
40
|
+
const previous = this.copies.get(object);
|
|
41
|
+
if (previous?.constructor === value.constructor && previous.length === value.length) {
|
|
42
|
+
previous.set(value);
|
|
43
|
+
return previous;
|
|
44
|
+
}
|
|
45
|
+
const cloned = value.slice();
|
|
46
|
+
this.copies.set(object, cloned);
|
|
47
|
+
return cloned;
|
|
48
|
+
}
|
|
49
|
+
if (value instanceof ArrayBuffer)
|
|
50
|
+
return value.slice(0);
|
|
51
|
+
let cloned = this.copies.get(object);
|
|
52
|
+
if (!cloned) {
|
|
53
|
+
cloned = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value));
|
|
54
|
+
this.copies.set(object, cloned);
|
|
55
|
+
}
|
|
56
|
+
if (this.copying.has(object))
|
|
57
|
+
return cloned;
|
|
58
|
+
this.copying.add(object);
|
|
59
|
+
try {
|
|
60
|
+
for (const key of Object.keys(value)) {
|
|
61
|
+
if (value instanceof InstancedMesh && (key === 'transforms' || key === 'colors')) {
|
|
62
|
+
const previous = this.instanceVersions.get(value);
|
|
63
|
+
const version = key === 'transforms' ? value.transformsVersion : value.colorsVersion;
|
|
64
|
+
const priorVersion = key === 'transforms' ? previous?.transformsVersion : previous?.colorsVersion;
|
|
65
|
+
const array = value[key];
|
|
66
|
+
if (!previous || priorVersion !== version || previous[key] !== array) {
|
|
67
|
+
// Each batch owns its snapshot even when callers share source storage.
|
|
68
|
+
if (!array)
|
|
69
|
+
cloned[key] = undefined;
|
|
70
|
+
else if (previous?.[key] === array && cloned[key]?.length === array.length)
|
|
71
|
+
cloned[key].set(array);
|
|
72
|
+
else
|
|
73
|
+
cloned[key] = array.slice();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else
|
|
77
|
+
cloned[key] = value instanceof Texture && key === 'source' ? value.source : this.copy(value[key]);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
this.copying.delete(object);
|
|
82
|
+
}
|
|
83
|
+
if (Array.isArray(value))
|
|
84
|
+
cloned.length = value.length;
|
|
85
|
+
if (value instanceof InstancedMesh)
|
|
86
|
+
this.instanceVersions.set(value, {
|
|
87
|
+
transformsVersion: value.transformsVersion, transforms: value.transforms,
|
|
88
|
+
colorsVersion: value.colorsVersion, colors: value.colors
|
|
89
|
+
});
|
|
90
|
+
if (value instanceof Geometry) {
|
|
91
|
+
this.geometryVersions.set(value, value.version);
|
|
92
|
+
setGeometryBvh(cloned, getGeometryBvh(value));
|
|
93
|
+
copyGeometryChangeState(value, cloned);
|
|
94
|
+
}
|
|
95
|
+
return cloned;
|
|
96
|
+
}
|
|
97
|
+
mirror(source) { return this.copies.get(source); }
|
|
98
|
+
capture(scene, changes) {
|
|
99
|
+
if (!this.value || changes.meshes === 'full')
|
|
100
|
+
this.value = { meshes: this.copy(scene.meshes), lights: this.copy(scene.lights), background: this.copy(scene.background) };
|
|
101
|
+
else {
|
|
102
|
+
for (const mesh of changes.transforms) {
|
|
103
|
+
this.copy(mesh.transform);
|
|
104
|
+
if (mesh instanceof InstancedMesh)
|
|
105
|
+
this.copy(mesh);
|
|
106
|
+
}
|
|
107
|
+
for (const mesh of changes.colors)
|
|
108
|
+
this.copy(mesh);
|
|
109
|
+
for (const geometry of changes.geometries)
|
|
110
|
+
this.copy(geometry);
|
|
111
|
+
for (const material of changes.materials)
|
|
112
|
+
this.copy(material);
|
|
113
|
+
if (changes.lights)
|
|
114
|
+
this.value.lights = this.copy(scene.lights);
|
|
115
|
+
if (changes.background)
|
|
116
|
+
this.value.background = this.copy(scene.background);
|
|
117
|
+
}
|
|
118
|
+
return this.value;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=committedScene.js.map
|