@meimu/mutracer 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +240 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14360 -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 +160 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +274 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +123 -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 +265 -0
- package/lib/Render.js +742 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +79 -0
- package/lib/RenderLoop.js +236 -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 +1448 -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 +126 -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 +623 -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 +927 -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 +105 -0
- package/lib/util/fromTHREE.js +1111 -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,621 @@
|
|
|
1
|
+
import { readMeshInstance } from './meshInstances.js';
|
|
2
|
+
// Bounding volume hierarchies of scene geometry (BLAS) and mesh instances
|
|
3
|
+
// (TLAS), built with the binned SAH builder in ./binnedSahBvh and written
|
|
4
|
+
// directly in the BVH2 layout read by the traversal shaders.
|
|
5
|
+
import { Attribute } from '../scene/Geometry.js';
|
|
6
|
+
import { mat4, vec3 } from '../math.js';
|
|
7
|
+
import { buildBinnedSahBvh, layoutBvh2 } from './binnedSahBvh.js';
|
|
8
|
+
const vec3Min = vec3.min;
|
|
9
|
+
const vec3Max = vec3.max;
|
|
10
|
+
export const INSTANCE_VEC4_STRIDE = 10;
|
|
11
|
+
export const INSTANCE_WORD_STRIDE = INSTANCE_VEC4_STRIDE * 4;
|
|
12
|
+
const BLAS_LAYOUT_SHIFT = 30;
|
|
13
|
+
const BLAS_OFFSET_MASK = 0x3fffffff;
|
|
14
|
+
const blasLayoutCodes = {
|
|
15
|
+
bvh2: 0,
|
|
16
|
+
bvh4: 1,
|
|
17
|
+
'bvh-gpu': 2,
|
|
18
|
+
cwbvh: 3
|
|
19
|
+
};
|
|
20
|
+
function encodeBlasOffset(offset, layout) {
|
|
21
|
+
if (!Number.isSafeInteger(offset) || offset < 0 || offset > BLAS_OFFSET_MASK) {
|
|
22
|
+
throw new Error(`BLAS offset ${offset} exceeds the packed 30-bit range`);
|
|
23
|
+
}
|
|
24
|
+
return (offset | (blasLayoutCodes[layout] << BLAS_LAYOUT_SHIFT)) | 0;
|
|
25
|
+
}
|
|
26
|
+
export class Box3 {
|
|
27
|
+
min;
|
|
28
|
+
max;
|
|
29
|
+
constructor() {
|
|
30
|
+
this.min = [Infinity, Infinity, Infinity];
|
|
31
|
+
this.max = [-Infinity, -Infinity, -Infinity];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function unionBounds(bounds, a, b) {
|
|
35
|
+
vec3Min(bounds.min, a.min, b.min);
|
|
36
|
+
vec3Max(bounds.max, a.max, b.max);
|
|
37
|
+
return bounds;
|
|
38
|
+
}
|
|
39
|
+
// Keep a bounded specialization range for unusually deep hierarchies while
|
|
40
|
+
// allowing large TinyBVH converted builds (for example Mustang_Red requires 51).
|
|
41
|
+
// WebGPU still specializes each TLAS/BLAS stack to the scene's exact need.
|
|
42
|
+
export const MAX_TRAVERSAL_STACK_SIZE = 64;
|
|
43
|
+
/**
|
|
44
|
+
* Sizes independent TLAS and BLAS stacks for the nested WebGPU traversal.
|
|
45
|
+
* A TLAS leaf is consumed in place, so its instance fan-out no longer needs
|
|
46
|
+
* pending stack entries. TinyBVH converted layouts store their exact stack
|
|
47
|
+
* requirement in maxDepth; BVH2 stores its tree depth.
|
|
48
|
+
*/
|
|
49
|
+
export function getTraversalStackSizes(tlas, blases) {
|
|
50
|
+
return {
|
|
51
|
+
tlas: Math.min(MAX_TRAVERSAL_STACK_SIZE, Math.max(1, tlas.maxDepth)),
|
|
52
|
+
blas: Math.min(MAX_TRAVERSAL_STACK_SIZE, blases.reduce((stackSize, blas) => Math.max(stackSize, blas.bvh.maxDepth), 1))
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function concatBLASBuffers(blases) {
|
|
56
|
+
const buffers = blases.map((blas) => new Float32Array(blas.bvh.buffer));
|
|
57
|
+
const totalLength = buffers.reduce((sum, buffer) => sum + buffer.length, 0);
|
|
58
|
+
const result = new Float32Array(totalLength);
|
|
59
|
+
let offset = 0;
|
|
60
|
+
for (let i = 0; i < blases.length; i++) {
|
|
61
|
+
result.set(buffers[i], offset);
|
|
62
|
+
offset += buffers[i].length;
|
|
63
|
+
}
|
|
64
|
+
return result.buffer;
|
|
65
|
+
}
|
|
66
|
+
function packH(minH, maxH) {
|
|
67
|
+
const roundedMinH = Math.min(Math.floor(minH * 255), 255);
|
|
68
|
+
const roundedMaxH = Math.abs(maxH - minH) < 1e-6
|
|
69
|
+
? roundedMinH
|
|
70
|
+
: Math.min(Math.ceil(maxH * 255), 255);
|
|
71
|
+
return (roundedMinH << 8) + roundedMaxH;
|
|
72
|
+
}
|
|
73
|
+
/** Writes min and max of a triangle, or of its displacement prism, to out. */
|
|
74
|
+
function triangleBounds(positions, stride, normals, normalStride, i0, i1, i2, minHeight, maxHeight, out, o) {
|
|
75
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
76
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
77
|
+
for (let corner = 0; corner < 3; corner++) {
|
|
78
|
+
const vertex = corner === 0 ? i0 : corner === 1 ? i1 : i2;
|
|
79
|
+
const p = vertex * stride;
|
|
80
|
+
const x = positions[p], y = positions[p + 1], z = positions[p + 2];
|
|
81
|
+
if (normals) {
|
|
82
|
+
const n = vertex * normalStride;
|
|
83
|
+
let nx = normals[n], ny = normals[n + 1], nz = normals[n + 2];
|
|
84
|
+
const length = Math.sqrt(nx * nx + ny * ny + nz * nz);
|
|
85
|
+
if (length > 0) {
|
|
86
|
+
nx /= length;
|
|
87
|
+
ny /= length;
|
|
88
|
+
nz /= length;
|
|
89
|
+
}
|
|
90
|
+
for (let side = 0; side < 2; side++) {
|
|
91
|
+
const h = side === 0 ? minHeight : maxHeight;
|
|
92
|
+
const px = x + nx * h, py = y + ny * h, pz = z + nz * h;
|
|
93
|
+
minX = Math.min(minX, px);
|
|
94
|
+
minY = Math.min(minY, py);
|
|
95
|
+
minZ = Math.min(minZ, pz);
|
|
96
|
+
maxX = Math.max(maxX, px);
|
|
97
|
+
maxY = Math.max(maxY, py);
|
|
98
|
+
maxZ = Math.max(maxZ, pz);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
minX = Math.min(minX, x);
|
|
103
|
+
minY = Math.min(minY, y);
|
|
104
|
+
minZ = Math.min(minZ, z);
|
|
105
|
+
maxX = Math.max(maxX, x);
|
|
106
|
+
maxY = Math.max(maxY, y);
|
|
107
|
+
maxZ = Math.max(maxZ, z);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
out[o] = minX;
|
|
111
|
+
out[o + 1] = minY;
|
|
112
|
+
out[o + 2] = minZ;
|
|
113
|
+
out[o + 3] = maxX;
|
|
114
|
+
out[o + 4] = maxY;
|
|
115
|
+
out[o + 5] = maxZ;
|
|
116
|
+
return isFinite(minX) && isFinite(minY) && isFinite(minZ) &&
|
|
117
|
+
isFinite(maxX) && isFinite(maxY) && isFinite(maxZ);
|
|
118
|
+
}
|
|
119
|
+
function emptyBvh(isTLAS) {
|
|
120
|
+
return {
|
|
121
|
+
builder: 'builtin',
|
|
122
|
+
buildSurfaceArea: isTLAS ? undefined : 0,
|
|
123
|
+
maxDepth: 0,
|
|
124
|
+
maxLeafPrimitives: 0,
|
|
125
|
+
buffer: new ArrayBuffer(0),
|
|
126
|
+
layout: 'bvh2',
|
|
127
|
+
instancesBuffer: isTLAS ? new ArrayBuffer(0) : undefined
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** BLAS without triangles. */
|
|
131
|
+
export function emptyBLAS() {
|
|
132
|
+
return emptyBvh(false);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Builds a BVH2 BLAS over the geometry's triangles. Triangles with
|
|
136
|
+
* non-finite bounds are skipped. With per-triangle displacement ranges
|
|
137
|
+
* (min, max pairs scaled by displacementScale), leaves bound the
|
|
138
|
+
* displacement prisms along the vertex normals and store the packed ranges.
|
|
139
|
+
*/
|
|
140
|
+
export function buildBLAS(geometry, displacementScale = 0, trianglesDisplacement) {
|
|
141
|
+
const position = geometry.position;
|
|
142
|
+
const indices = geometry.indices?.array;
|
|
143
|
+
if (!position || !indices || !Attribute.getCount(position)) {
|
|
144
|
+
return emptyBvh(false);
|
|
145
|
+
}
|
|
146
|
+
const positions = position.array;
|
|
147
|
+
const stride = position.itemSize;
|
|
148
|
+
const normal = trianglesDisplacement ? geometry.normal : undefined;
|
|
149
|
+
const normals = normal?.array;
|
|
150
|
+
const normalStride = normal?.itemSize ?? 0;
|
|
151
|
+
const triangleCount = Math.floor(indices.length / 3);
|
|
152
|
+
const aabbs = new Float32Array(triangleCount * 6);
|
|
153
|
+
const triangles = new Uint32Array(triangleCount);
|
|
154
|
+
let count = 0;
|
|
155
|
+
for (let t = 0; t < triangleCount; t++) {
|
|
156
|
+
let minHeight = 0, maxHeight = 0;
|
|
157
|
+
if (normals) {
|
|
158
|
+
minHeight = trianglesDisplacement[t * 2] * displacementScale;
|
|
159
|
+
maxHeight = trianglesDisplacement[t * 2 + 1] * displacementScale;
|
|
160
|
+
if (isNaN(minHeight) || isNaN(maxHeight)) {
|
|
161
|
+
minHeight = 0;
|
|
162
|
+
maxHeight = displacementScale;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (triangleBounds(positions, stride, normals, normalStride, indices[t * 3], indices[t * 3 + 1], indices[t * 3 + 2], minHeight, maxHeight, aabbs, count * 6)) {
|
|
166
|
+
triangles[count++] = t;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!count)
|
|
170
|
+
return emptyBvh(false);
|
|
171
|
+
const bvh = buildBinnedSahBvh(aabbs, count);
|
|
172
|
+
const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);
|
|
173
|
+
const { bounds, leftFirst, primCount, primIndices } = bvh;
|
|
174
|
+
const buffer = new ArrayBuffer(vec4Count * 16);
|
|
175
|
+
const floats = new Float32Array(buffer);
|
|
176
|
+
const ints = new Int32Array(buffer);
|
|
177
|
+
let buildSurfaceArea = 0;
|
|
178
|
+
for (let k = 0; k < order.length; k++) {
|
|
179
|
+
const node = order[k];
|
|
180
|
+
const o = offsets[node] * 4, b = node * 6;
|
|
181
|
+
floats[o] = bounds[b];
|
|
182
|
+
floats[o + 1] = bounds[b + 1];
|
|
183
|
+
floats[o + 2] = bounds[b + 2];
|
|
184
|
+
floats[o + 4] = bounds[b + 3];
|
|
185
|
+
floats[o + 5] = bounds[b + 4];
|
|
186
|
+
floats[o + 6] = bounds[b + 5];
|
|
187
|
+
const x = bounds[b + 3] - bounds[b], y = bounds[b + 4] - bounds[b + 1], z = bounds[b + 5] - bounds[b + 2];
|
|
188
|
+
buildSurfaceArea += 2 * (x * z + x * y + z * y);
|
|
189
|
+
const prims = primCount[node];
|
|
190
|
+
if (!prims) {
|
|
191
|
+
// Pointer to the second child.
|
|
192
|
+
ints[o + 3] = offsets[leftFirst[node] + 1];
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Negative signals to the shader that this node is a leaf.
|
|
196
|
+
ints[o + 3] = -prims;
|
|
197
|
+
for (let i = 0; i < prims; i++) {
|
|
198
|
+
const t = triangles[primIndices[leftFirst[node] + i]];
|
|
199
|
+
const e = o + 8 + i * 4;
|
|
200
|
+
ints[e] = indices[t * 3];
|
|
201
|
+
ints[e + 1] = indices[t * 3 + 1];
|
|
202
|
+
ints[e + 2] = indices[t * 3 + 2];
|
|
203
|
+
// Pack minH, maxH to one channel.
|
|
204
|
+
ints[e + 3] = trianglesDisplacement
|
|
205
|
+
? packH(trianglesDisplacement[t * 2], trianglesDisplacement[t * 2 + 1])
|
|
206
|
+
: 0;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
builder: 'builtin',
|
|
211
|
+
buildSurfaceArea,
|
|
212
|
+
maxDepth,
|
|
213
|
+
maxLeafPrimitives,
|
|
214
|
+
buffer,
|
|
215
|
+
layout: 'bvh2'
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function getBlasPlacement(blases) {
|
|
219
|
+
let blasOffset = 0;
|
|
220
|
+
let vertexOffset = 0;
|
|
221
|
+
const placement = { blasOffsets: [], vertexOffsets: [], layouts: [] };
|
|
222
|
+
blases.forEach((blas) => {
|
|
223
|
+
placement.blasOffsets.push(blasOffset);
|
|
224
|
+
placement.vertexOffsets.push(vertexOffset);
|
|
225
|
+
placement.layouts.push(blas.bvh.layout ?? 'bvh2');
|
|
226
|
+
blasOffset += blas.bvh.buffer.byteLength / 16;
|
|
227
|
+
vertexOffset += blas.verticesCount;
|
|
228
|
+
});
|
|
229
|
+
return placement;
|
|
230
|
+
}
|
|
231
|
+
/** Writes the instance's world bounds, padded by its displacement, to out. */
|
|
232
|
+
function instanceBounds(instance, out, o) {
|
|
233
|
+
const { min, max } = instance.bounds;
|
|
234
|
+
let padX = 0, padY = 0, padZ = 0;
|
|
235
|
+
const displacementScale = instance.displacementScale;
|
|
236
|
+
if (displacementScale) {
|
|
237
|
+
const m = instance.transform;
|
|
238
|
+
padX = Math.max(0, displacementScale * Math.hypot(m[0], m[1], m[2]));
|
|
239
|
+
padY = Math.max(0, displacementScale * Math.hypot(m[4], m[5], m[6]));
|
|
240
|
+
padZ = Math.max(0, displacementScale * Math.hypot(m[8], m[9], m[10]));
|
|
241
|
+
}
|
|
242
|
+
out[o] = min[0] - padX;
|
|
243
|
+
out[o + 1] = min[1] - padY;
|
|
244
|
+
out[o + 2] = min[2] - padZ;
|
|
245
|
+
out[o + 3] = max[0] + padX;
|
|
246
|
+
out[o + 4] = max[1] + padY;
|
|
247
|
+
out[o + 5] = max[2] + padZ;
|
|
248
|
+
}
|
|
249
|
+
function writeInstanceRecord(instanceInts, instanceFloats, targetIndex, instance, placement) {
|
|
250
|
+
const offset = targetIndex * INSTANCE_WORD_STRIDE;
|
|
251
|
+
instanceInts[offset] = encodeBlasOffset(placement.blasOffsets[instance.blasIndex], placement.layouts[instance.blasIndex]);
|
|
252
|
+
instanceInts[offset + 1] = placement.vertexOffsets[instance.blasIndex];
|
|
253
|
+
instanceInts[offset + 2] = instance.materialsIndices[0] || 0;
|
|
254
|
+
instanceFloats[offset + 3] = instance.displacementScale || 0;
|
|
255
|
+
instanceFloats.set(instance.color ?? [1, 1, 1], offset + 36);
|
|
256
|
+
instanceFloats[offset + 39] = 0;
|
|
257
|
+
const inverse = mat4.invert(mat4.create(), instance.transform);
|
|
258
|
+
for (let i = 0; i < 16; i++) {
|
|
259
|
+
instanceFloats[offset + 4 + i] = inverse[i];
|
|
260
|
+
instanceFloats[offset + 20 + i] = instance.transform[i];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Builds a BVH2 TLAS over the instances. Leaves store
|
|
265
|
+
* (instance record, BLAS offset, source instance index, 0); instance records
|
|
266
|
+
* are written in leaf order to instancesBuffer.
|
|
267
|
+
*/
|
|
268
|
+
export function buildTLAS(instances, blases) {
|
|
269
|
+
if (!instances.length)
|
|
270
|
+
return emptyBvh(true);
|
|
271
|
+
const placement = getBlasPlacement(blases);
|
|
272
|
+
const aabbs = new Float32Array(instances.length * 6);
|
|
273
|
+
for (let i = 0; i < instances.length; i++) {
|
|
274
|
+
instanceBounds(readMeshInstance(instances, i), aabbs, i * 6);
|
|
275
|
+
}
|
|
276
|
+
const bvh = buildBinnedSahBvh(aabbs, instances.length);
|
|
277
|
+
const { order, offsets, vec4Count, maxDepth, maxLeafPrimitives } = layoutBvh2(bvh);
|
|
278
|
+
const { bounds, leftFirst, primCount, primIndices } = bvh;
|
|
279
|
+
const buffer = new ArrayBuffer(vec4Count * 16);
|
|
280
|
+
const floats = new Float32Array(buffer);
|
|
281
|
+
const ints = new Int32Array(buffer);
|
|
282
|
+
const instancesBuffer = new ArrayBuffer(instances.length * INSTANCE_WORD_STRIDE * 4);
|
|
283
|
+
const instanceInts = new Int32Array(instancesBuffer);
|
|
284
|
+
const instanceFloats = new Float32Array(instancesBuffer);
|
|
285
|
+
let target = 0;
|
|
286
|
+
for (let k = 0; k < order.length; k++) {
|
|
287
|
+
const node = order[k];
|
|
288
|
+
const o = offsets[node] * 4, b = node * 6;
|
|
289
|
+
floats[o] = bounds[b];
|
|
290
|
+
floats[o + 1] = bounds[b + 1];
|
|
291
|
+
floats[o + 2] = bounds[b + 2];
|
|
292
|
+
floats[o + 4] = bounds[b + 3];
|
|
293
|
+
floats[o + 5] = bounds[b + 4];
|
|
294
|
+
floats[o + 6] = bounds[b + 5];
|
|
295
|
+
const prims = primCount[node];
|
|
296
|
+
if (!prims) {
|
|
297
|
+
ints[o + 3] = offsets[leftFirst[node] + 1];
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
ints[o + 3] = -prims;
|
|
301
|
+
for (let i = 0; i < prims; i++) {
|
|
302
|
+
const source = primIndices[leftFirst[node] + i];
|
|
303
|
+
const instance = readMeshInstance(instances, source);
|
|
304
|
+
const e = o + 8 + i * 4;
|
|
305
|
+
ints[e] = target;
|
|
306
|
+
ints[e + 1] = placement.blasOffsets[instance.blasIndex];
|
|
307
|
+
// Keep the source instance index in the otherwise-unused z lane so
|
|
308
|
+
// the TLAS can be refitted without rebuilding its topology.
|
|
309
|
+
ints[e + 2] = source;
|
|
310
|
+
writeInstanceRecord(instanceInts, instanceFloats, target, instance, placement);
|
|
311
|
+
target++;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
builder: 'builtin',
|
|
316
|
+
maxDepth,
|
|
317
|
+
maxLeafPrimitives,
|
|
318
|
+
buffer,
|
|
319
|
+
layout: 'bvh2',
|
|
320
|
+
instancesBuffer
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const tlasRefitMetadata = new WeakMap();
|
|
324
|
+
function getTLASRefitMetadata(flattened, ints) {
|
|
325
|
+
const cached = tlasRefitMetadata.get(flattened);
|
|
326
|
+
if (cached)
|
|
327
|
+
return cached;
|
|
328
|
+
const metadata = {
|
|
329
|
+
parent: new Map(),
|
|
330
|
+
depth: new Map(),
|
|
331
|
+
leavesBySource: new Map(),
|
|
332
|
+
instancesByLeaf: new Map()
|
|
333
|
+
};
|
|
334
|
+
const visit = (index, parent, depth) => {
|
|
335
|
+
metadata.depth.set(index, depth);
|
|
336
|
+
if (parent != null)
|
|
337
|
+
metadata.parent.set(index, parent);
|
|
338
|
+
const base = index * 4;
|
|
339
|
+
const primitiveCountOrChild = ints[base + 3];
|
|
340
|
+
if (primitiveCountOrChild >= 0) {
|
|
341
|
+
visit(index + 2, index, depth + 1);
|
|
342
|
+
visit(primitiveCountOrChild, index, depth + 1);
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const entries = [];
|
|
346
|
+
for (let i = 0; i < -primitiveCountOrChild; i++) {
|
|
347
|
+
const primitiveOffset = base + 8 + i * 4;
|
|
348
|
+
const target = ints[primitiveOffset];
|
|
349
|
+
const source = ints[primitiveOffset + 2];
|
|
350
|
+
entries.push({ source, target });
|
|
351
|
+
const leaves = metadata.leavesBySource.get(source) ?? new Set();
|
|
352
|
+
leaves.add(index);
|
|
353
|
+
metadata.leavesBySource.set(source, leaves);
|
|
354
|
+
}
|
|
355
|
+
metadata.instancesByLeaf.set(index, entries);
|
|
356
|
+
};
|
|
357
|
+
visit(0, undefined, 0);
|
|
358
|
+
tlasRefitMetadata.set(flattened, metadata);
|
|
359
|
+
return metadata;
|
|
360
|
+
}
|
|
361
|
+
export function mergeRefitRanges(ranges) {
|
|
362
|
+
const sorted = ranges
|
|
363
|
+
.filter(({ size }) => size > 0)
|
|
364
|
+
.sort((left, right) => left.offset - right.offset);
|
|
365
|
+
const merged = [];
|
|
366
|
+
for (const range of sorted) {
|
|
367
|
+
const previous = merged[merged.length - 1];
|
|
368
|
+
if (previous && range.offset <= previous.offset + previous.size) {
|
|
369
|
+
previous.size = Math.max(previous.size, range.offset + range.size - previous.offset);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
merged.push({ ...range });
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return merged;
|
|
376
|
+
}
|
|
377
|
+
export function refitTLAS(flattened, instances, blases, dirtySourceIndices) {
|
|
378
|
+
if (!flattened.instancesBuffer || !flattened.buffer.byteLength) {
|
|
379
|
+
return { tlasRanges: [], instanceRanges: [] };
|
|
380
|
+
}
|
|
381
|
+
const floats = new Float32Array(flattened.buffer);
|
|
382
|
+
const ints = new Int32Array(flattened.buffer);
|
|
383
|
+
const instanceFloats = new Float32Array(flattened.instancesBuffer);
|
|
384
|
+
const instanceInts = new Int32Array(flattened.instancesBuffer);
|
|
385
|
+
const placement = getBlasPlacement(blases);
|
|
386
|
+
const scratch = new Float32Array(6);
|
|
387
|
+
function writeInstance(targetIndex, sourceIndex) {
|
|
388
|
+
writeInstanceRecord(instanceInts, instanceFloats, targetIndex, readMeshInstance(instances, sourceIndex), placement);
|
|
389
|
+
}
|
|
390
|
+
function addInstanceBounds(bounds, instance) {
|
|
391
|
+
instanceBounds(instance, scratch, 0);
|
|
392
|
+
bounds.min[0] = Math.min(bounds.min[0], scratch[0]);
|
|
393
|
+
bounds.min[1] = Math.min(bounds.min[1], scratch[1]);
|
|
394
|
+
bounds.min[2] = Math.min(bounds.min[2], scratch[2]);
|
|
395
|
+
bounds.max[0] = Math.max(bounds.max[0], scratch[3]);
|
|
396
|
+
bounds.max[1] = Math.max(bounds.max[1], scratch[4]);
|
|
397
|
+
bounds.max[2] = Math.max(bounds.max[2], scratch[5]);
|
|
398
|
+
}
|
|
399
|
+
function writeNodeBounds(index, bounds) {
|
|
400
|
+
const base = index * 4;
|
|
401
|
+
floats[base] = bounds.min[0];
|
|
402
|
+
floats[base + 1] = bounds.min[1];
|
|
403
|
+
floats[base + 2] = bounds.min[2];
|
|
404
|
+
floats[base + 4] = bounds.max[0];
|
|
405
|
+
floats[base + 5] = bounds.max[1];
|
|
406
|
+
floats[base + 6] = bounds.max[2];
|
|
407
|
+
}
|
|
408
|
+
function readNodeBounds(index) {
|
|
409
|
+
const base = index * 4;
|
|
410
|
+
const bounds = new Box3();
|
|
411
|
+
vec3.set(bounds.min, floats[base], floats[base + 1], floats[base + 2]);
|
|
412
|
+
vec3.set(bounds.max, floats[base + 4], floats[base + 5], floats[base + 6]);
|
|
413
|
+
return bounds;
|
|
414
|
+
}
|
|
415
|
+
function refitNode(index) {
|
|
416
|
+
const base = index * 4;
|
|
417
|
+
const bounds = new Box3();
|
|
418
|
+
const primitiveCountOrChild = ints[base + 3];
|
|
419
|
+
if (primitiveCountOrChild >= 0) {
|
|
420
|
+
const left = refitNode(index + 2);
|
|
421
|
+
const right = refitNode(primitiveCountOrChild);
|
|
422
|
+
unionBounds(bounds, left, right);
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
for (let i = 0; i < -primitiveCountOrChild; i++) {
|
|
426
|
+
const primitiveOffset = base + 8 + i * 4;
|
|
427
|
+
const targetInstance = ints[primitiveOffset];
|
|
428
|
+
const sourceInstance = ints[primitiveOffset + 2];
|
|
429
|
+
const instance = readMeshInstance(instances, sourceInstance);
|
|
430
|
+
if (!instance)
|
|
431
|
+
continue;
|
|
432
|
+
addInstanceBounds(bounds, instance);
|
|
433
|
+
writeInstance(targetInstance, sourceInstance);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
writeNodeBounds(index, bounds);
|
|
437
|
+
return bounds;
|
|
438
|
+
}
|
|
439
|
+
if (!dirtySourceIndices) {
|
|
440
|
+
refitNode(0);
|
|
441
|
+
return {
|
|
442
|
+
tlasRanges: [{ offset: 0, size: flattened.buffer.byteLength }],
|
|
443
|
+
instanceRanges: [
|
|
444
|
+
{ offset: 0, size: flattened.instancesBuffer.byteLength }
|
|
445
|
+
]
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
const metadata = getTLASRefitMetadata(flattened, ints);
|
|
449
|
+
const dirtyLeaves = new Set();
|
|
450
|
+
const instanceRanges = [];
|
|
451
|
+
for (const source of dirtySourceIndices) {
|
|
452
|
+
const leaves = metadata.leavesBySource.get(source);
|
|
453
|
+
if (!leaves)
|
|
454
|
+
continue;
|
|
455
|
+
leaves.forEach((leaf) => dirtyLeaves.add(leaf));
|
|
456
|
+
for (const leaf of leaves) {
|
|
457
|
+
for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {
|
|
458
|
+
if (entry.source !== source)
|
|
459
|
+
continue;
|
|
460
|
+
writeInstance(entry.target, source);
|
|
461
|
+
instanceRanges.push({ offset: entry.target * INSTANCE_WORD_STRIDE * 4, size: INSTANCE_WORD_STRIDE * 4 });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const dirtyNodes = new Set();
|
|
466
|
+
for (const leaf of dirtyLeaves) {
|
|
467
|
+
const bounds = new Box3();
|
|
468
|
+
for (const { source } of metadata.instancesByLeaf.get(leaf) ?? []) {
|
|
469
|
+
const instance = readMeshInstance(instances, source);
|
|
470
|
+
if (instance)
|
|
471
|
+
addInstanceBounds(bounds, instance);
|
|
472
|
+
}
|
|
473
|
+
writeNodeBounds(leaf, bounds);
|
|
474
|
+
dirtyNodes.add(leaf);
|
|
475
|
+
let parent = metadata.parent.get(leaf);
|
|
476
|
+
while (parent != null) {
|
|
477
|
+
dirtyNodes.add(parent);
|
|
478
|
+
parent = metadata.parent.get(parent);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
const internalNodes = [...dirtyNodes]
|
|
482
|
+
.filter((index) => ints[index * 4 + 3] >= 0)
|
|
483
|
+
.sort((left, right) => (metadata.depth.get(right) ?? 0) - (metadata.depth.get(left) ?? 0));
|
|
484
|
+
for (const index of internalNodes) {
|
|
485
|
+
const right = ints[index * 4 + 3];
|
|
486
|
+
const bounds = new Box3();
|
|
487
|
+
unionBounds(bounds, readNodeBounds(index + 2), readNodeBounds(right));
|
|
488
|
+
writeNodeBounds(index, bounds);
|
|
489
|
+
}
|
|
490
|
+
return {
|
|
491
|
+
tlasRanges: mergeRefitRanges([...dirtyNodes].map((index) => ({ offset: index * 16, size: 32 }))),
|
|
492
|
+
instanceRanges: mergeRefitRanges(instanceRanges)
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
/** Dynamic BLASes rebuild when their total node surface area doubles. */
|
|
496
|
+
export const DYNAMIC_BLAS_REBUILD_RATIO = 2;
|
|
497
|
+
// Leaf topology is immutable between BLAS builds. Deduplicate shared triangle
|
|
498
|
+
// corners once so deformation refits read each leaf's vertex only once.
|
|
499
|
+
const blasRefitData = new WeakMap();
|
|
500
|
+
function getBlasRefitData(buffer) {
|
|
501
|
+
const cached = blasRefitData.get(buffer);
|
|
502
|
+
if (cached)
|
|
503
|
+
return cached;
|
|
504
|
+
const ints = new Int32Array(buffer);
|
|
505
|
+
const offsets = new Int32Array(ints.length / 4);
|
|
506
|
+
const vertices = [];
|
|
507
|
+
const preorder = [];
|
|
508
|
+
const stack = [0];
|
|
509
|
+
while (stack.length) {
|
|
510
|
+
const index = stack.pop();
|
|
511
|
+
preorder.push(index);
|
|
512
|
+
const base = index * 4;
|
|
513
|
+
const child = ints[base + 3];
|
|
514
|
+
if (child >= 0) {
|
|
515
|
+
stack.push(child, index + 2);
|
|
516
|
+
continue;
|
|
517
|
+
}
|
|
518
|
+
offsets[index] = vertices.length;
|
|
519
|
+
const countSlot = vertices.length;
|
|
520
|
+
vertices.push(0);
|
|
521
|
+
for (let i = 0; i < -child; i++) {
|
|
522
|
+
for (let j = 0; j < 3; j++) {
|
|
523
|
+
const vertex = ints[base + 8 + i * 4 + j];
|
|
524
|
+
let seen = false;
|
|
525
|
+
for (let k = countSlot + 1; k < vertices.length; k++) {
|
|
526
|
+
if (vertices[k] === vertex) {
|
|
527
|
+
seen = true;
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
if (!seen)
|
|
532
|
+
vertices.push(vertex);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
vertices[countSlot] = vertices.length - countSlot - 1;
|
|
536
|
+
}
|
|
537
|
+
const data = {
|
|
538
|
+
offsets,
|
|
539
|
+
vertices: new Uint32Array(vertices),
|
|
540
|
+
postorder: new Int32Array(preorder.reverse())
|
|
541
|
+
};
|
|
542
|
+
blasRefitData.set(buffer, data);
|
|
543
|
+
return data;
|
|
544
|
+
}
|
|
545
|
+
/** Refit a BVH2 BLAS after vertex deformation, preserving topology. */
|
|
546
|
+
export function refitBLAS(flattened, geometry) {
|
|
547
|
+
if ((flattened.layout ?? 'bvh2') !== 'bvh2' || !flattened.buffer.byteLength) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
const { offsets, vertices, postorder } = getBlasRefitData(flattened.buffer);
|
|
551
|
+
const floats = new Float32Array(flattened.buffer), ints = new Int32Array(flattened.buffer);
|
|
552
|
+
const positions = geometry.position.array, stride = geometry.position.itemSize;
|
|
553
|
+
if (flattened.buildSurfaceArea == null) {
|
|
554
|
+
let area = 0;
|
|
555
|
+
for (const index of postorder) {
|
|
556
|
+
const b = index * 4;
|
|
557
|
+
const x = floats[b + 4] - floats[b], y = floats[b + 5] - floats[b + 1], z = floats[b + 6] - floats[b + 2];
|
|
558
|
+
area += 2 * (x * z + x * y + z * y);
|
|
559
|
+
}
|
|
560
|
+
flattened.buildSurfaceArea = area;
|
|
561
|
+
}
|
|
562
|
+
let area = 0;
|
|
563
|
+
for (let node = 0; node < postorder.length; node++) {
|
|
564
|
+
const index = postorder[node], base = index * 4, child = ints[base + 3];
|
|
565
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
566
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
567
|
+
if (child >= 0) {
|
|
568
|
+
const left = base + 8, right = child * 4;
|
|
569
|
+
minX = Math.min(floats[left], floats[right]);
|
|
570
|
+
minY = Math.min(floats[left + 1], floats[right + 1]);
|
|
571
|
+
minZ = Math.min(floats[left + 2], floats[right + 2]);
|
|
572
|
+
maxX = Math.max(floats[left + 4], floats[right + 4]);
|
|
573
|
+
maxY = Math.max(floats[left + 5], floats[right + 5]);
|
|
574
|
+
maxZ = Math.max(floats[left + 6], floats[right + 6]);
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
const start = offsets[index], end = start + 1 + vertices[start];
|
|
578
|
+
for (let i = start + 1; i < end; i++) {
|
|
579
|
+
const offset = vertices[i] * stride;
|
|
580
|
+
const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];
|
|
581
|
+
if (!isFinite(x) || !isFinite(y) || !isFinite(z))
|
|
582
|
+
continue;
|
|
583
|
+
minX = Math.min(minX, x);
|
|
584
|
+
minY = Math.min(minY, y);
|
|
585
|
+
minZ = Math.min(minZ, z);
|
|
586
|
+
maxX = Math.max(maxX, x);
|
|
587
|
+
maxY = Math.max(maxY, y);
|
|
588
|
+
maxZ = Math.max(maxZ, z);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;
|
|
592
|
+
area += 2 * (x * z + x * y + z * y);
|
|
593
|
+
floats[base] = minX;
|
|
594
|
+
floats[base + 1] = minY;
|
|
595
|
+
floats[base + 2] = minZ;
|
|
596
|
+
floats[base + 4] = maxX;
|
|
597
|
+
floats[base + 5] = maxY;
|
|
598
|
+
floats[base + 6] = maxZ;
|
|
599
|
+
}
|
|
600
|
+
return !geometry.dynamic || !(area > flattened.buildSurfaceArea * DYNAMIC_BLAS_REBUILD_RATIO);
|
|
601
|
+
}
|
|
602
|
+
/** Writes only instance colors; TLAS topology and bounds remain untouched. */
|
|
603
|
+
export function updateTLASInstanceColors(flattened, instances, dirty) {
|
|
604
|
+
if (!flattened.instancesBuffer || !flattened.buffer.byteLength || !dirty.size)
|
|
605
|
+
return [];
|
|
606
|
+
const metadata = getTLASRefitMetadata(flattened, new Int32Array(flattened.buffer));
|
|
607
|
+
const floats = new Float32Array(flattened.instancesBuffer);
|
|
608
|
+
const ranges = [];
|
|
609
|
+
for (const source of dirty)
|
|
610
|
+
for (const leaf of metadata.leavesBySource.get(source) ?? []) {
|
|
611
|
+
for (const entry of metadata.instancesByLeaf.get(leaf) ?? []) {
|
|
612
|
+
if (entry.source !== source)
|
|
613
|
+
continue;
|
|
614
|
+
const offset = entry.target * INSTANCE_WORD_STRIDE + 36;
|
|
615
|
+
floats.set(readMeshInstance(instances, source).color ?? [1, 1, 1], offset);
|
|
616
|
+
ranges.push({ offset: offset * 4, size: 16 });
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
return mergeRefitRanges(ranges);
|
|
620
|
+
}
|
|
621
|
+
//# sourceMappingURL=bvhAccel.js.map
|