@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,178 @@
|
|
|
1
|
+
import type Render from '../Render.js';
|
|
2
|
+
import type { TraceSettings } from '../renderer/renderPipeline.js';
|
|
3
|
+
import { normalizeBevelSamples, normalizeDirectLightCandidates } from '../renderer/RenderingPipeline.js';
|
|
4
|
+
export declare const traceSchema: {
|
|
5
|
+
bounces: {
|
|
6
|
+
key: "bounces";
|
|
7
|
+
default: number;
|
|
8
|
+
kind: "image";
|
|
9
|
+
backends: readonly ["webgpu", "webgl"];
|
|
10
|
+
};
|
|
11
|
+
clamping: {
|
|
12
|
+
key: "clamping";
|
|
13
|
+
default: number;
|
|
14
|
+
kind: "image";
|
|
15
|
+
backends: readonly ["webgpu", "webgl"];
|
|
16
|
+
};
|
|
17
|
+
bevel: {
|
|
18
|
+
key: "bevel";
|
|
19
|
+
default: true;
|
|
20
|
+
kind: "image";
|
|
21
|
+
backends: readonly ["webgpu", "webgl"];
|
|
22
|
+
};
|
|
23
|
+
bevelSamples: {
|
|
24
|
+
key: "bevelSamples";
|
|
25
|
+
default: number;
|
|
26
|
+
kind: "image";
|
|
27
|
+
backends: readonly ["webgpu", "webgl"];
|
|
28
|
+
normalize: typeof normalizeBevelSamples;
|
|
29
|
+
};
|
|
30
|
+
dispersionWavelengths: {
|
|
31
|
+
key: "dispersionWavelengths";
|
|
32
|
+
default: 3;
|
|
33
|
+
kind: "image";
|
|
34
|
+
backends: readonly ["webgpu", "webgl"];
|
|
35
|
+
};
|
|
36
|
+
directLightCandidates: {
|
|
37
|
+
key: "directLightCandidates";
|
|
38
|
+
default: number;
|
|
39
|
+
kind: "image";
|
|
40
|
+
backends: "webgpu"[];
|
|
41
|
+
normalize: typeof normalizeDirectLightCandidates;
|
|
42
|
+
};
|
|
43
|
+
alphaBlendStrategy: {
|
|
44
|
+
key: "alphaBlendStrategy";
|
|
45
|
+
default: "stochastic";
|
|
46
|
+
kind: "image";
|
|
47
|
+
backends: "webgpu"[];
|
|
48
|
+
};
|
|
49
|
+
transmissiveOutputAlphaMin: {
|
|
50
|
+
key: "transmissiveOutputAlphaMin";
|
|
51
|
+
default: number;
|
|
52
|
+
kind: "image";
|
|
53
|
+
backends: readonly ["webgpu", "webgl"];
|
|
54
|
+
};
|
|
55
|
+
samplingPattern: {
|
|
56
|
+
key: "samplingPattern";
|
|
57
|
+
default: "sobol";
|
|
58
|
+
kind: "image";
|
|
59
|
+
backends: readonly ["webgpu", "webgl"];
|
|
60
|
+
};
|
|
61
|
+
maxSamples: {
|
|
62
|
+
key: "maxSamples";
|
|
63
|
+
default: number;
|
|
64
|
+
kind: "sample-cap";
|
|
65
|
+
backends: readonly ["webgpu", "webgl"];
|
|
66
|
+
};
|
|
67
|
+
timeBudgetMs: {
|
|
68
|
+
key: "timeBudgetMs";
|
|
69
|
+
default: number;
|
|
70
|
+
kind: "execution";
|
|
71
|
+
backends: readonly ["webgpu", "webgl"];
|
|
72
|
+
};
|
|
73
|
+
maxTiles: {
|
|
74
|
+
key: "maxTiles";
|
|
75
|
+
default: number;
|
|
76
|
+
kind: "execution";
|
|
77
|
+
backends: readonly ["webgpu", "webgl"];
|
|
78
|
+
};
|
|
79
|
+
allowMultipleSamplesPerFrame: {
|
|
80
|
+
key: "allowMultipleSamplesPerFrame";
|
|
81
|
+
default: false;
|
|
82
|
+
kind: "execution";
|
|
83
|
+
backends: readonly ["webgpu", "webgl"];
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
export declare const renderSchema: readonly [...({
|
|
87
|
+
key: "bounces";
|
|
88
|
+
default: number;
|
|
89
|
+
kind: "image";
|
|
90
|
+
backends: readonly ["webgpu", "webgl"];
|
|
91
|
+
} | {
|
|
92
|
+
key: "clamping";
|
|
93
|
+
default: number;
|
|
94
|
+
kind: "image";
|
|
95
|
+
backends: readonly ["webgpu", "webgl"];
|
|
96
|
+
} | {
|
|
97
|
+
key: "bevel";
|
|
98
|
+
default: true;
|
|
99
|
+
kind: "image";
|
|
100
|
+
backends: readonly ["webgpu", "webgl"];
|
|
101
|
+
} | {
|
|
102
|
+
key: "bevelSamples";
|
|
103
|
+
default: number;
|
|
104
|
+
kind: "image";
|
|
105
|
+
backends: readonly ["webgpu", "webgl"];
|
|
106
|
+
normalize: typeof normalizeBevelSamples;
|
|
107
|
+
} | {
|
|
108
|
+
key: "dispersionWavelengths";
|
|
109
|
+
default: 3;
|
|
110
|
+
kind: "image";
|
|
111
|
+
backends: readonly ["webgpu", "webgl"];
|
|
112
|
+
} | {
|
|
113
|
+
key: "directLightCandidates";
|
|
114
|
+
default: number;
|
|
115
|
+
kind: "image";
|
|
116
|
+
backends: "webgpu"[];
|
|
117
|
+
normalize: typeof normalizeDirectLightCandidates;
|
|
118
|
+
} | {
|
|
119
|
+
key: "alphaBlendStrategy";
|
|
120
|
+
default: "stochastic";
|
|
121
|
+
kind: "image";
|
|
122
|
+
backends: "webgpu"[];
|
|
123
|
+
} | {
|
|
124
|
+
key: "transmissiveOutputAlphaMin";
|
|
125
|
+
default: number;
|
|
126
|
+
kind: "image";
|
|
127
|
+
backends: readonly ["webgpu", "webgl"];
|
|
128
|
+
} | {
|
|
129
|
+
key: "samplingPattern";
|
|
130
|
+
default: "sobol";
|
|
131
|
+
kind: "image";
|
|
132
|
+
backends: readonly ["webgpu", "webgl"];
|
|
133
|
+
} | {
|
|
134
|
+
key: "maxSamples";
|
|
135
|
+
default: number;
|
|
136
|
+
kind: "sample-cap";
|
|
137
|
+
backends: readonly ["webgpu", "webgl"];
|
|
138
|
+
} | {
|
|
139
|
+
key: "timeBudgetMs";
|
|
140
|
+
default: number;
|
|
141
|
+
kind: "execution";
|
|
142
|
+
backends: readonly ["webgpu", "webgl"];
|
|
143
|
+
} | {
|
|
144
|
+
key: "maxTiles";
|
|
145
|
+
default: number;
|
|
146
|
+
kind: "execution";
|
|
147
|
+
backends: readonly ["webgpu", "webgl"];
|
|
148
|
+
} | {
|
|
149
|
+
key: "allowMultipleSamplesPerFrame";
|
|
150
|
+
default: false;
|
|
151
|
+
kind: "execution";
|
|
152
|
+
backends: readonly ["webgpu", "webgl"];
|
|
153
|
+
})[], {
|
|
154
|
+
readonly key: "resolutionScale";
|
|
155
|
+
readonly default: 1;
|
|
156
|
+
readonly kind: "resolution";
|
|
157
|
+
readonly backends: readonly ["webgpu", "webgl"];
|
|
158
|
+
}, {
|
|
159
|
+
readonly key: "adaptiveResolution";
|
|
160
|
+
readonly default: false;
|
|
161
|
+
readonly kind: "resolution";
|
|
162
|
+
readonly backends: readonly ["webgpu", "webgl"];
|
|
163
|
+
}, {
|
|
164
|
+
readonly key: "fallback";
|
|
165
|
+
readonly default: null;
|
|
166
|
+
readonly kind: "fallback";
|
|
167
|
+
readonly backends: readonly ["webgpu", "webgl"];
|
|
168
|
+
}, {
|
|
169
|
+
readonly key: "denoiser";
|
|
170
|
+
readonly default: null;
|
|
171
|
+
readonly kind: "denoiser";
|
|
172
|
+
readonly backends: readonly ["webgpu", "webgl"];
|
|
173
|
+
}];
|
|
174
|
+
export declare function collectTraceSettings(render: Render, sampleCap: number): TraceSettings;
|
|
175
|
+
export declare function imageSettingsKey(settings: TraceSettings, size: {
|
|
176
|
+
width: number;
|
|
177
|
+
height: number;
|
|
178
|
+
}): string;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { normalizeBevelSamples, normalizeDirectLightCandidates } from '../renderer/RenderingPipeline.js';
|
|
2
|
+
const both = ['webgpu', 'webgl'];
|
|
3
|
+
// Trace fields are exhaustive: adding a pipeline setting requires a descriptor.
|
|
4
|
+
export const traceSchema = {
|
|
5
|
+
bounces: { key: 'bounces', default: 3, kind: 'image', backends: both },
|
|
6
|
+
clamping: { key: 'clamping', default: 0, kind: 'image', backends: both },
|
|
7
|
+
bevel: { key: 'bevel', default: true, kind: 'image', backends: both },
|
|
8
|
+
bevelSamples: { key: 'bevelSamples', default: 8, kind: 'image', backends: both, normalize: normalizeBevelSamples },
|
|
9
|
+
dispersionWavelengths: { key: 'dispersionWavelengths', default: 3, kind: 'image', backends: both },
|
|
10
|
+
directLightCandidates: { key: 'directLightCandidates', default: 4, kind: 'image', backends: ['webgpu'], normalize: normalizeDirectLightCandidates },
|
|
11
|
+
alphaBlendStrategy: { key: 'alphaBlendStrategy', default: 'stochastic', kind: 'image', backends: ['webgpu'] },
|
|
12
|
+
transmissiveOutputAlphaMin: { key: 'transmissiveOutputAlphaMin', default: 1, kind: 'image', backends: both },
|
|
13
|
+
samplingPattern: { key: 'samplingPattern', default: 'sobol', kind: 'image', backends: both },
|
|
14
|
+
maxSamples: { key: 'maxSamples', default: 2048, kind: 'sample-cap', backends: both },
|
|
15
|
+
timeBudgetMs: { key: 'timeBudgetMs', default: 21, kind: 'execution', backends: both },
|
|
16
|
+
maxTiles: { key: 'maxTiles', default: Infinity, kind: 'execution', backends: both },
|
|
17
|
+
allowMultipleSamplesPerFrame: { key: 'allowMultipleSamplesPerFrame', default: false, kind: 'execution', backends: both },
|
|
18
|
+
};
|
|
19
|
+
export const renderSchema = [
|
|
20
|
+
...Object.values(traceSchema),
|
|
21
|
+
{ key: 'resolutionScale', default: 1, kind: 'resolution', backends: both },
|
|
22
|
+
{ key: 'adaptiveResolution', default: false, kind: 'resolution', backends: both },
|
|
23
|
+
{ key: 'fallback', default: null, kind: 'fallback', backends: both },
|
|
24
|
+
{ key: 'denoiser', default: null, kind: 'denoiser', backends: both },
|
|
25
|
+
];
|
|
26
|
+
export function collectTraceSettings(render, sampleCap) {
|
|
27
|
+
return Object.fromEntries(Object.values(traceSchema).map(field => [field.key,
|
|
28
|
+
field.key === 'maxSamples' ? sampleCap : 'normalize' in field ? field.normalize(render[field.key]) : render[field.key]
|
|
29
|
+
]));
|
|
30
|
+
}
|
|
31
|
+
export function imageSettingsKey(settings, size) {
|
|
32
|
+
const fields = Object.values(traceSchema).filter(field => field.kind === 'image');
|
|
33
|
+
return JSON.stringify({ ...Object.fromEntries(fields.map(field => [field.key, settings[field.key]])),
|
|
34
|
+
samples: settings.samplingPattern === 'zsobol' ? settings.maxSamples : undefined, ...size });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/settings/render.ts"],"names":[],"mappings":"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","sourcesContent":["import type Render from '../Render.js';\nimport type { TraceSettings } from '../renderer/renderPipeline.js';\nimport { normalizeBevelSamples, normalizeDirectLightCandidates } from '../renderer/RenderingPipeline.js';\n\ntype Descriptor<K extends keyof Render> = {\n key: K; default: Render[K]; kind: 'image' | 'execution' | 'sample-cap' | 'resolution' | 'denoiser' | 'fallback';\n backends: readonly ('webgpu' | 'webgl')[]; normalize?: (value: Render[K]) => Render[K];\n};\nconst both = ['webgpu', 'webgl'] as const;\n// Trace fields are exhaustive: adding a pipeline setting requires a descriptor.\nexport const traceSchema = {\n bounces: {key: 'bounces', default: 3, kind: 'image', backends: both},\n clamping: {key: 'clamping', default: 0, kind: 'image', backends: both},\n bevel: {key: 'bevel', default: true, kind: 'image', backends: both},\n bevelSamples: {key: 'bevelSamples', default: 8, kind: 'image', backends: both, normalize: normalizeBevelSamples},\n dispersionWavelengths: {key: 'dispersionWavelengths', default: 3, kind: 'image', backends: both},\n directLightCandidates: {key: 'directLightCandidates', default: 4, kind: 'image', backends: ['webgpu'], normalize: normalizeDirectLightCandidates},\n alphaBlendStrategy: {key: 'alphaBlendStrategy', default: 'stochastic', kind: 'image', backends: ['webgpu']},\n transmissiveOutputAlphaMin: {key: 'transmissiveOutputAlphaMin', default: 1, kind: 'image', backends: both},\n samplingPattern: {key: 'samplingPattern', default: 'sobol', kind: 'image', backends: both},\n maxSamples: {key: 'maxSamples', default: 2048, kind: 'sample-cap', backends: both},\n timeBudgetMs: {key: 'timeBudgetMs', default: 21, kind: 'execution', backends: both},\n maxTiles: {key: 'maxTiles', default: Infinity, kind: 'execution', backends: both},\n allowMultipleSamplesPerFrame: {key: 'allowMultipleSamplesPerFrame', default: false, kind: 'execution', backends: both},\n} satisfies {[K in keyof TraceSettings]: Descriptor<K>};\nexport const renderSchema = [\n ...Object.values(traceSchema),\n {key: 'resolutionScale', default: 1, kind: 'resolution', backends: both},\n {key: 'adaptiveResolution', default: false, kind: 'resolution', backends: both},\n {key: 'fallback', default: null, kind: 'fallback', backends: both},\n {key: 'denoiser', default: null, kind: 'denoiser', backends: both},\n] as const;\n\nexport function collectTraceSettings(render: Render, sampleCap: number): TraceSettings {\n return Object.fromEntries(Object.values(traceSchema).map(field => [field.key,\n field.key === 'maxSamples' ? sampleCap : 'normalize' in field ? field.normalize(render[field.key]) : render[field.key]\n ])) as unknown as TraceSettings;\n}\nexport function imageSettingsKey(settings: TraceSettings, size: {width: number; height: number}) {\n const fields = Object.values(traceSchema).filter(field => field.kind === 'image');\n return JSON.stringify({...Object.fromEntries(fields.map(field => [field.key, settings[field.key]])),\n samples: settings.samplingPattern === 'zsobol' ? settings.maxSamples : undefined, ...size});\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026, Jacco Bikker / Breda University of Applied Sciences.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type FlattendBVH } from '../renderer/bvhAccel.js';
|
|
2
|
+
import type Geometry from '../scene/Geometry.js';
|
|
3
|
+
/** Static TinyBVH BLAS layout; supported on WebGPU and WebGL 2. Default `'bvh2'`. */
|
|
4
|
+
export type TinyBvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';
|
|
5
|
+
export interface TinyBvhBuildResult extends FlattendBVH {
|
|
6
|
+
builder: 'tinybvh';
|
|
7
|
+
bvhTimeMs: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Computes the exact stack used by TinyBVH's official CWBVH node-group
|
|
11
|
+
* traversal. A group containing all remaining interior siblings occupies one
|
|
12
|
+
* entry, so the generic wide-BVH child-address stack requirement is far too
|
|
13
|
+
* conservative for this layout.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCwbvhTraversalStackSize(buffer: ArrayBuffer): number;
|
|
16
|
+
export declare function initializeTinyBvh(): Promise<void>;
|
|
17
|
+
export declare function buildTinyBvh(geometry: Geometry, displacementScale: number, trianglesDisplacement?: Float32Array, requestedLayout?: TinyBvhLayout, spatialSplits?: boolean): Promise<TinyBvhBuildResult>;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { MAX_TRAVERSAL_STACK_SIZE } from '../renderer/bvhAccel.js';
|
|
2
|
+
import { VERSION } from '../version.js';
|
|
3
|
+
const wasmUrl = new URL('./tinybvh.wasm', import.meta.url);
|
|
4
|
+
const tinyBvhLayoutCodes = {
|
|
5
|
+
bvh2: 0,
|
|
6
|
+
bvh4: 1,
|
|
7
|
+
'bvh-gpu': 2,
|
|
8
|
+
cwbvh: 3
|
|
9
|
+
};
|
|
10
|
+
const tinyBvhLayouts = [
|
|
11
|
+
'bvh2',
|
|
12
|
+
'bvh4',
|
|
13
|
+
'bvh-gpu',
|
|
14
|
+
'cwbvh'
|
|
15
|
+
];
|
|
16
|
+
let warnedWasmFallback = false;
|
|
17
|
+
async function fetchTinyBvhWasm(url) {
|
|
18
|
+
const response = await fetch(url);
|
|
19
|
+
if (!response.ok)
|
|
20
|
+
throw new Error(`Unable to load TinyBVH WASM from ${url} (${response.status})`);
|
|
21
|
+
const buffer = await response.arrayBuffer();
|
|
22
|
+
const bytes = new Uint8Array(buffer);
|
|
23
|
+
if (bytes[0] !== 0 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {
|
|
24
|
+
throw new Error(`Invalid TinyBVH WASM from ${url}: expected \"\\0asm\" signature (received non-WASM content).`);
|
|
25
|
+
}
|
|
26
|
+
return buffer;
|
|
27
|
+
}
|
|
28
|
+
let exportsPromise;
|
|
29
|
+
let wasmModulePromise;
|
|
30
|
+
let buildQueue = Promise.resolve();
|
|
31
|
+
async function instantiateTinyBvh() {
|
|
32
|
+
const imports = {
|
|
33
|
+
env: {
|
|
34
|
+
emscripten_notify_memory_growth: () => undefined
|
|
35
|
+
},
|
|
36
|
+
wasi_snapshot_preview1: {
|
|
37
|
+
proc_exit: (code) => {
|
|
38
|
+
throw new Error(`tinybvh exited with status ${code}`);
|
|
39
|
+
},
|
|
40
|
+
fd_close: () => 0,
|
|
41
|
+
fd_write: () => 0,
|
|
42
|
+
fd_seek: () => 0
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
if (!wasmModulePromise) {
|
|
46
|
+
wasmModulePromise = (async () => {
|
|
47
|
+
let buffer;
|
|
48
|
+
try {
|
|
49
|
+
buffer = await fetchTinyBvhWasm(wasmUrl);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (!warnedWasmFallback) {
|
|
53
|
+
warnedWasmFallback = true;
|
|
54
|
+
console.warn('Bundled TinyBVH WASM failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: ["@meimu/mutracer"] }. For OIDN assets you can also pass weightsBaseUrl.', error);
|
|
55
|
+
}
|
|
56
|
+
buffer = await fetchTinyBvhWasm(`https://cdn.jsdelivr.net/npm/@meimu/mutracer@${VERSION}/lib/tinybvh/tinybvh.wasm`);
|
|
57
|
+
}
|
|
58
|
+
return WebAssembly.compile(buffer);
|
|
59
|
+
})();
|
|
60
|
+
}
|
|
61
|
+
const instance = await WebAssembly.instantiate(await wasmModulePromise, imports);
|
|
62
|
+
const tinyBvh = instance.exports;
|
|
63
|
+
tinyBvh._initialize();
|
|
64
|
+
return tinyBvh;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Computes the exact stack used by TinyBVH's official CWBVH node-group
|
|
68
|
+
* traversal. A group containing all remaining interior siblings occupies one
|
|
69
|
+
* entry, so the generic wide-BVH child-address stack requirement is far too
|
|
70
|
+
* conservative for this layout.
|
|
71
|
+
*/
|
|
72
|
+
export function getCwbvhTraversalStackSize(buffer) {
|
|
73
|
+
const words = new Uint32Array(buffer);
|
|
74
|
+
const active = new Set();
|
|
75
|
+
const memo = new Map();
|
|
76
|
+
const visit = (nodeIndex) => {
|
|
77
|
+
const cached = memo.get(nodeIndex);
|
|
78
|
+
if (cached != null)
|
|
79
|
+
return cached;
|
|
80
|
+
const nodeOffset = nodeIndex * 20;
|
|
81
|
+
if (nodeOffset < 0 || nodeOffset + 20 > words.length) {
|
|
82
|
+
throw new Error(`CWBVH node ${nodeIndex} is outside the serialized buffer`);
|
|
83
|
+
}
|
|
84
|
+
if (active.has(nodeIndex)) {
|
|
85
|
+
throw new Error(`CWBVH node ${nodeIndex} forms a cycle`);
|
|
86
|
+
}
|
|
87
|
+
active.add(nodeIndex);
|
|
88
|
+
const childBase = words[nodeOffset + 4];
|
|
89
|
+
const internalMask = words[nodeOffset + 3] >>> 24;
|
|
90
|
+
let relativeIndex = 0;
|
|
91
|
+
let interiorChildren = 0;
|
|
92
|
+
let childRequirement = 0;
|
|
93
|
+
for (let slot = 0; slot < 8; slot++) {
|
|
94
|
+
if ((internalMask & (1 << slot)) === 0)
|
|
95
|
+
continue;
|
|
96
|
+
interiorChildren++;
|
|
97
|
+
childRequirement = Math.max(childRequirement, visit(childBase + relativeIndex));
|
|
98
|
+
relativeIndex++;
|
|
99
|
+
}
|
|
100
|
+
active.delete(nodeIndex);
|
|
101
|
+
const requirement = (interiorChildren > 1 ? 1 : 0) + childRequirement;
|
|
102
|
+
memo.set(nodeIndex, requirement);
|
|
103
|
+
return requirement;
|
|
104
|
+
};
|
|
105
|
+
return Math.max(1, visit(0));
|
|
106
|
+
}
|
|
107
|
+
async function loadTinyBvh() {
|
|
108
|
+
if (!exportsPromise) {
|
|
109
|
+
exportsPromise = instantiateTinyBvh();
|
|
110
|
+
}
|
|
111
|
+
return exportsPromise;
|
|
112
|
+
}
|
|
113
|
+
export async function initializeTinyBvh() {
|
|
114
|
+
await loadTinyBvh();
|
|
115
|
+
}
|
|
116
|
+
function allocateAndCopy(tinyBvh, values) {
|
|
117
|
+
if (!values?.byteLength)
|
|
118
|
+
return 0;
|
|
119
|
+
const pointer = tinyBvh.malloc(values.byteLength);
|
|
120
|
+
if (!pointer)
|
|
121
|
+
throw new Error('tinybvh could not allocate WASM memory');
|
|
122
|
+
new Uint8Array(tinyBvh.memory.buffer, pointer, values.byteLength).set(new Uint8Array(values.buffer, values.byteOffset, values.byteLength));
|
|
123
|
+
return pointer;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Builds a renderer-compatible BLAS with TinyBVH's binned SAH builder, or
|
|
127
|
+
* with spatial splits (SBVH) when requested.
|
|
128
|
+
*/
|
|
129
|
+
async function buildTinyBvhUnlocked(geometry, displacementScale, trianglesDisplacement, requestedLayout = 'bvh2', spatialSplits = false) {
|
|
130
|
+
// CWBVH conversion is recursive and experimental. Isolate each static
|
|
131
|
+
// conversion so a trap in one pathological mesh cannot poison the allocator
|
|
132
|
+
// used by every later BLAS in this worker.
|
|
133
|
+
const isolated = requestedLayout === 'cwbvh';
|
|
134
|
+
const tinyBvh = isolated ? await instantiateTinyBvh() : await loadTinyBvh();
|
|
135
|
+
const positions = geometry.position.array;
|
|
136
|
+
const normals = geometry.normal?.array;
|
|
137
|
+
const indices = geometry.indices.array instanceof Uint32Array
|
|
138
|
+
? geometry.indices.array
|
|
139
|
+
: Uint32Array.from(geometry.indices.array);
|
|
140
|
+
const pointers = [];
|
|
141
|
+
let result = 0;
|
|
142
|
+
let poisoned = false;
|
|
143
|
+
const buildStart = performance.now();
|
|
144
|
+
try {
|
|
145
|
+
const positionsPointer = allocateAndCopy(tinyBvh, positions);
|
|
146
|
+
pointers.push(positionsPointer);
|
|
147
|
+
const normalsPointer = allocateAndCopy(tinyBvh, normals);
|
|
148
|
+
if (normalsPointer)
|
|
149
|
+
pointers.push(normalsPointer);
|
|
150
|
+
const indicesPointer = allocateAndCopy(tinyBvh, indices);
|
|
151
|
+
pointers.push(indicesPointer);
|
|
152
|
+
const displacementPointer = allocateAndCopy(tinyBvh, trianglesDisplacement);
|
|
153
|
+
if (displacementPointer)
|
|
154
|
+
pointers.push(displacementPointer);
|
|
155
|
+
result = tinyBvh.tinybvh_build(positionsPointer, positions.length / geometry.position.itemSize, geometry.position.itemSize, normalsPointer, geometry.normal?.itemSize ?? 0, indicesPointer, indices.length, displacementScale, displacementPointer, tinyBvhLayoutCodes[requestedLayout], spatialSplits ? 1 : 0);
|
|
156
|
+
if (!result)
|
|
157
|
+
throw new Error('tinybvh did not return a build result');
|
|
158
|
+
const byteLength = tinyBvh.tinybvh_result_size(result);
|
|
159
|
+
if (!byteLength)
|
|
160
|
+
throw new Error('tinybvh generated an empty BVH');
|
|
161
|
+
const reportedMaxDepth = tinyBvh.tinybvh_result_max_depth(result);
|
|
162
|
+
const dataPointer = tinyBvh.tinybvh_result_data(result);
|
|
163
|
+
const layoutCode = tinyBvh.tinybvh_result_layout(result);
|
|
164
|
+
const layout = tinyBvhLayouts[layoutCode];
|
|
165
|
+
if (!layout)
|
|
166
|
+
throw new Error(`tinybvh returned unknown layout ${layoutCode}`);
|
|
167
|
+
const buffer = byteLength
|
|
168
|
+
? tinyBvh.memory.buffer.slice(dataPointer, dataPointer + byteLength)
|
|
169
|
+
: new ArrayBuffer(0);
|
|
170
|
+
const maxDepth = layout === 'cwbvh'
|
|
171
|
+
? getCwbvhTraversalStackSize(buffer)
|
|
172
|
+
: reportedMaxDepth;
|
|
173
|
+
if (maxDepth > MAX_TRAVERSAL_STACK_SIZE) {
|
|
174
|
+
throw new Error('tinybvh traversal requires more stack entries than available ' +
|
|
175
|
+
`(${maxDepth} > ${MAX_TRAVERSAL_STACK_SIZE})`);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
builder: 'tinybvh',
|
|
179
|
+
buffer,
|
|
180
|
+
maxDepth,
|
|
181
|
+
layout,
|
|
182
|
+
bvhTimeMs: performance.now() - buildStart
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
// A TinyBVH stack overflow or out-of-bounds trap can leave emmalloc's
|
|
187
|
+
// state unusable. Do not let one pathological mesh turn every later BLAS
|
|
188
|
+
// in the scene into a built-in-builder fallback.
|
|
189
|
+
if (error instanceof WebAssembly.RuntimeError ||
|
|
190
|
+
error instanceof RangeError) {
|
|
191
|
+
poisoned = true;
|
|
192
|
+
if (!isolated) {
|
|
193
|
+
exportsPromise = undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
if (!poisoned) {
|
|
200
|
+
if (result)
|
|
201
|
+
tinyBvh.tinybvh_result_destroy(result);
|
|
202
|
+
pointers.forEach((pointer) => tinyBvh.free(pointer));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
export function buildTinyBvh(geometry, displacementScale, trianglesDisplacement, requestedLayout = 'bvh2', spatialSplits = false) {
|
|
207
|
+
const task = buildQueue.then(() => buildTinyBvhUnlocked(geometry, displacementScale, trianglesDisplacement, requestedLayout, spatialSplits));
|
|
208
|
+
buildQueue = task.then(() => undefined, () => undefined);
|
|
209
|
+
return task;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=TinyBvhBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TinyBvhBuilder.js","sourceRoot":"","sources":["../../src/tinybvh/TinyBvhBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EAEzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAK3D,MAAM,kBAAkB,GAAkC;IACxD,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,CAAC;CACT,CAAC;AACF,MAAM,cAAc,GAAoB;IACtC,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;CACR,CAAC;AA2BF,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,KAAK,UAAU,gBAAgB,CAAC,GAAiB;IAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,8DAA8D,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,IAAI,cAAmD,CAAC;AACxD,IAAI,iBAA0D,CAAC;AAC/D,IAAI,UAAU,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;AAOlD,KAAK,UAAU,kBAAkB;IAC/B,MAAM,OAAO,GAAG;QACd,GAAG,EAAE;YACH,+BAA+B,EAAE,GAAG,EAAE,CAAC,SAAS;SACjD;QACD,sBAAsB,EAAE;YACtB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;gBAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACjB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;SACjB;KACF,CAAC;IACF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9B,IAAI,MAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACxB,kBAAkB,GAAG,IAAI,CAAC;oBAC1B,OAAO,CAAC,IAAI,CAAC,0LAA0L,EAAE,KAAK,CAAC,CAAC;gBAClN,CAAC;gBACD,MAAM,GAAG,MAAM,gBAAgB,CAAC,gDAAgD,OAAO,2BAA2B,CAAC,CAAC;YACtH,CAAC;YACD,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAC5C,MAAM,iBAAiB,EACvB,OAAO,CACR,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAyB,CAAC;IACnD,OAAO,CAAC,WAAW,EAAE,CAAC;IACtB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAmB;IAC5D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAU,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC;QAClC,MAAM,UAAU,GAAG,SAAS,GAAG,EAAE,CAAC;QAClC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,mCAAmC,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,cAAc,SAAS,gBAAgB,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;gBAAE,SAAS;YACjD,gBAAgB,EAAE,CAAC;YACnB,gBAAgB,GAAG,IAAI,CAAC,GAAG,CACzB,gBAAgB,EAChB,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC,CACjC,CAAC;YACF,aAAa,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;QACtE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACjC,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,kBAAkB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,WAAW,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CACtB,OAAuB,EACvB,MAAmC;IAEnC,IAAI,CAAC,MAAM,EAAE,UAAU;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CACnE,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CACpE,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,QAAkB,EAClB,iBAAyB,EACzB,qBAAoC,EACpC,kBAAiC,MAAM,EACvC,aAAa,GAAG,KAAK;IAErB,sEAAsE;IACtE,4EAA4E;IAC5E,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,eAAe,KAAK,OAAO,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC;IAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvC,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,CAAC,KAAK,YAAY,WAAW;QAC3C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;QACxB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7D,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChC,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,IAAI,cAAc;YAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;QAC5E,IAAI,mBAAmB;YAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,GAAG,OAAO,CAAC,aAAa,CAC5B,gBAAgB,EAChB,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAC7C,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAC1B,cAAc,EACd,QAAQ,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,EAC9B,cAAc,EACd,OAAO,CAAC,MAAM,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,CAAC,eAAe,CAAC,EACnC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAEtE,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,OAAO,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,UAAU;YACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,UAAU,CAAC;YACpE,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,OAAO;YACjC,CAAC,CAAC,0BAA0B,CAAC,MAAM,CAAC;YACpC,CAAC,CAAC,gBAAgB,CAAC;QACrB,IAAI,QAAQ,GAAG,wBAAwB,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,+DAA+D;gBAC7D,IAAI,QAAQ,MAAM,wBAAwB,GAAG,CAChD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,MAAM;YACN,QAAQ;YACR,MAAM;YACN,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU;SAC1C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sEAAsE;QACtE,yEAAyE;QACzE,iDAAiD;QACjD,IACE,KAAK,YAAY,WAAW,CAAC,YAAY;YACzC,KAAK,YAAY,UAAU,EAC3B,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,cAAc,GAAG,SAAS,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,MAAM;gBAAE,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;YACnD,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAkB,EAClB,iBAAyB,EACzB,qBAAoC,EACpC,kBAAiC,MAAM,EACvC,aAAa,GAAG,KAAK;IAErB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,oBAAoB,CACrD,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,aAAa,CACd,CAAC,CAAC;IACH,UAAU,GAAG,IAAI,CAAC,IAAI,CACpB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import {\n MAX_TRAVERSAL_STACK_SIZE,\n type FlattendBVH\n} from '../renderer/bvhAccel.js';\nimport type Geometry from '../scene/Geometry.js';\nimport { VERSION } from '../version.js';\n\nconst wasmUrl = new URL('./tinybvh.wasm', import.meta.url);\n\n/** Static TinyBVH BLAS layout; supported on WebGPU and WebGL 2. Default `'bvh2'`. */\nexport type TinyBvhLayout = 'bvh2' | 'bvh4' | 'bvh-gpu' | 'cwbvh';\n\nconst tinyBvhLayoutCodes: Record<TinyBvhLayout, number> = {\n bvh2: 0,\n bvh4: 1,\n 'bvh-gpu': 2,\n cwbvh: 3\n};\nconst tinyBvhLayouts: TinyBvhLayout[] = [\n 'bvh2',\n 'bvh4',\n 'bvh-gpu',\n 'cwbvh'\n];\n\ninterface TinyBvhExports extends WebAssembly.Exports {\n memory: WebAssembly.Memory;\n malloc(size: number): number;\n free(pointer: number): void;\n tinybvh_build(\n positions: number,\n vertexCount: number,\n positionStride: number,\n normals: number,\n normalStride: number,\n indices: number,\n indexCount: number,\n displacementScale: number,\n displacement: number,\n requestedLayout: number,\n spatialSplits: number\n ): number;\n tinybvh_result_data(result: number): number;\n tinybvh_result_size(result: number): number;\n tinybvh_result_max_depth(result: number): number;\n tinybvh_result_layout(result: number): number;\n tinybvh_result_destroy(result: number): void;\n _initialize(): void;\n}\n\nlet warnedWasmFallback = false;\n\nasync function fetchTinyBvhWasm(url: URL | string) {\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Unable to load TinyBVH WASM from ${url} (${response.status})`);\n const buffer = await response.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n if (bytes[0] !== 0 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n throw new Error(`Invalid TinyBVH WASM from ${url}: expected \\\"\\\\0asm\\\" signature (received non-WASM content).`);\n }\n return buffer;\n}\n\nlet exportsPromise: Promise<TinyBvhExports> | undefined;\nlet wasmModulePromise: Promise<WebAssembly.Module> | undefined;\nlet buildQueue: Promise<void> = Promise.resolve();\n\nexport interface TinyBvhBuildResult extends FlattendBVH {\n builder: 'tinybvh';\n bvhTimeMs: number;\n}\n\nasync function instantiateTinyBvh() {\n const imports = {\n env: {\n emscripten_notify_memory_growth: () => undefined\n },\n wasi_snapshot_preview1: {\n proc_exit: (code: number) => {\n throw new Error(`tinybvh exited with status ${code}`);\n },\n fd_close: () => 0,\n fd_write: () => 0,\n fd_seek: () => 0\n }\n };\n if (!wasmModulePromise) {\n wasmModulePromise = (async () => {\n let buffer: ArrayBuffer;\n try {\n buffer = await fetchTinyBvhWasm(wasmUrl);\n } catch (error) {\n if (!warnedWasmFallback) {\n warnedWasmFallback = true;\n console.warn('Bundled TinyBVH WASM failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: [\"@meimu/mutracer\"] }. For OIDN assets you can also pass weightsBaseUrl.', error);\n }\n buffer = await fetchTinyBvhWasm(`https://cdn.jsdelivr.net/npm/@meimu/mutracer@${VERSION}/lib/tinybvh/tinybvh.wasm`);\n }\n return WebAssembly.compile(buffer);\n })();\n }\n const instance = await WebAssembly.instantiate(\n await wasmModulePromise,\n imports\n );\n const tinyBvh = instance.exports as TinyBvhExports;\n tinyBvh._initialize();\n return tinyBvh;\n}\n\n/**\n * Computes the exact stack used by TinyBVH's official CWBVH node-group\n * traversal. A group containing all remaining interior siblings occupies one\n * entry, so the generic wide-BVH child-address stack requirement is far too\n * conservative for this layout.\n */\nexport function getCwbvhTraversalStackSize(buffer: ArrayBuffer) {\n const words = new Uint32Array(buffer);\n const active = new Set<number>();\n const memo = new Map<number, number>();\n const visit = (nodeIndex: number): number => {\n const cached = memo.get(nodeIndex);\n if (cached != null) return cached;\n const nodeOffset = nodeIndex * 20;\n if (nodeOffset < 0 || nodeOffset + 20 > words.length) {\n throw new Error(`CWBVH node ${nodeIndex} is outside the serialized buffer`);\n }\n if (active.has(nodeIndex)) {\n throw new Error(`CWBVH node ${nodeIndex} forms a cycle`);\n }\n active.add(nodeIndex);\n const childBase = words[nodeOffset + 4];\n const internalMask = words[nodeOffset + 3] >>> 24;\n let relativeIndex = 0;\n let interiorChildren = 0;\n let childRequirement = 0;\n for (let slot = 0; slot < 8; slot++) {\n if ((internalMask & (1 << slot)) === 0) continue;\n interiorChildren++;\n childRequirement = Math.max(\n childRequirement,\n visit(childBase + relativeIndex)\n );\n relativeIndex++;\n }\n active.delete(nodeIndex);\n const requirement = (interiorChildren > 1 ? 1 : 0) + childRequirement;\n memo.set(nodeIndex, requirement);\n return requirement;\n };\n return Math.max(1, visit(0));\n}\n\nasync function loadTinyBvh() {\n if (!exportsPromise) {\n exportsPromise = instantiateTinyBvh();\n }\n return exportsPromise;\n}\n\nexport async function initializeTinyBvh() {\n await loadTinyBvh();\n}\n\nfunction allocateAndCopy(\n tinyBvh: TinyBvhExports,\n values: ArrayBufferView | undefined\n) {\n if (!values?.byteLength) return 0;\n const pointer = tinyBvh.malloc(values.byteLength);\n if (!pointer) throw new Error('tinybvh could not allocate WASM memory');\n new Uint8Array(tinyBvh.memory.buffer, pointer, values.byteLength).set(\n new Uint8Array(values.buffer, values.byteOffset, values.byteLength)\n );\n return pointer;\n}\n\n/**\n * Builds a renderer-compatible BLAS with TinyBVH's binned SAH builder, or\n * with spatial splits (SBVH) when requested.\n */\nasync function buildTinyBvhUnlocked(\n geometry: Geometry,\n displacementScale: number,\n trianglesDisplacement?: Float32Array,\n requestedLayout: TinyBvhLayout = 'bvh2',\n spatialSplits = false\n): Promise<TinyBvhBuildResult> {\n // CWBVH conversion is recursive and experimental. Isolate each static\n // conversion so a trap in one pathological mesh cannot poison the allocator\n // used by every later BLAS in this worker.\n const isolated = requestedLayout === 'cwbvh';\n const tinyBvh = isolated ? await instantiateTinyBvh() : await loadTinyBvh();\n const positions = geometry.position.array;\n const normals = geometry.normal?.array;\n const indices =\n geometry.indices.array instanceof Uint32Array\n ? geometry.indices.array\n : Uint32Array.from(geometry.indices.array);\n const pointers: number[] = [];\n let result = 0;\n let poisoned = false;\n const buildStart = performance.now();\n\n try {\n const positionsPointer = allocateAndCopy(tinyBvh, positions);\n pointers.push(positionsPointer);\n const normalsPointer = allocateAndCopy(tinyBvh, normals);\n if (normalsPointer) pointers.push(normalsPointer);\n const indicesPointer = allocateAndCopy(tinyBvh, indices);\n pointers.push(indicesPointer);\n const displacementPointer = allocateAndCopy(tinyBvh, trianglesDisplacement);\n if (displacementPointer) pointers.push(displacementPointer);\n result = tinyBvh.tinybvh_build(\n positionsPointer,\n positions.length / geometry.position.itemSize,\n geometry.position.itemSize,\n normalsPointer,\n geometry.normal?.itemSize ?? 0,\n indicesPointer,\n indices.length,\n displacementScale,\n displacementPointer,\n tinyBvhLayoutCodes[requestedLayout],\n spatialSplits ? 1 : 0\n );\n if (!result) throw new Error('tinybvh did not return a build result');\n\n const byteLength = tinyBvh.tinybvh_result_size(result);\n if (!byteLength) throw new Error('tinybvh generated an empty BVH');\n const reportedMaxDepth = tinyBvh.tinybvh_result_max_depth(result);\n const dataPointer = tinyBvh.tinybvh_result_data(result);\n const layoutCode = tinyBvh.tinybvh_result_layout(result);\n const layout = tinyBvhLayouts[layoutCode];\n if (!layout) throw new Error(`tinybvh returned unknown layout ${layoutCode}`);\n const buffer = byteLength\n ? tinyBvh.memory.buffer.slice(dataPointer, dataPointer + byteLength)\n : new ArrayBuffer(0);\n const maxDepth = layout === 'cwbvh'\n ? getCwbvhTraversalStackSize(buffer)\n : reportedMaxDepth;\n if (maxDepth > MAX_TRAVERSAL_STACK_SIZE) {\n throw new Error(\n 'tinybvh traversal requires more stack entries than available ' +\n `(${maxDepth} > ${MAX_TRAVERSAL_STACK_SIZE})`\n );\n }\n return {\n builder: 'tinybvh',\n buffer,\n maxDepth,\n layout,\n bvhTimeMs: performance.now() - buildStart\n };\n } catch (error) {\n // A TinyBVH stack overflow or out-of-bounds trap can leave emmalloc's\n // state unusable. Do not let one pathological mesh turn every later BLAS\n // in the scene into a built-in-builder fallback.\n if (\n error instanceof WebAssembly.RuntimeError ||\n error instanceof RangeError\n ) {\n poisoned = true;\n if (!isolated) {\n exportsPromise = undefined;\n }\n }\n throw error;\n } finally {\n if (!poisoned) {\n if (result) tinyBvh.tinybvh_result_destroy(result);\n pointers.forEach((pointer) => tinyBvh.free(pointer));\n }\n }\n}\n\nexport function buildTinyBvh(\n geometry: Geometry,\n displacementScale: number,\n trianglesDisplacement?: Float32Array,\n requestedLayout: TinyBvhLayout = 'bvh2',\n spatialSplits = false\n): Promise<TinyBvhBuildResult> {\n const task = buildQueue.then(() => buildTinyBvhUnlocked(\n geometry,\n displacementScale,\n trianglesDisplacement,\n requestedLayout,\n spatialSplits\n ));\n buildQueue = task.then(\n () => undefined,\n () => undefined\n );\n return task;\n}\n"]}
|
|
Binary file
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Two-component vector, as a tuple or float32 storage. */
|
|
2
|
+
export type Vec2 = [number, number] | Float32Array;
|
|
3
|
+
/** Three-component vector, as a tuple or float32 storage. */
|
|
4
|
+
export type Vec3 = [number, number, number] | Float32Array;
|
|
5
|
+
/** Column-major 4×4 matrix (16 elements). */
|
|
6
|
+
export type Mat4 = Float32Array | number[];
|
|
7
|
+
export type ColorRGB = [number, number, number];
|
|
8
|
+
export type ColorRGBA = [number, number, number, number];
|
|
9
|
+
export type Color = ColorRGB | ColorRGBA;
|
|
10
|
+
export interface WritableArrayLike<T> {
|
|
11
|
+
readonly length: number;
|
|
12
|
+
[n: number]: T;
|
|
13
|
+
}
|
package/lib/types.js
ADDED
package/lib/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["/** Two-component vector, as a tuple or float32 storage. */\nexport type Vec2 = [number, number] | Float32Array;\n/** Three-component vector, as a tuple or float32 storage. */\nexport type Vec3 = [number, number, number] | Float32Array;\n/** Column-major 4×4 matrix (16 elements). */\nexport type Mat4 = Float32Array | number[];\n\nexport type ColorRGB = [number, number, number];\nexport type ColorRGBA = [number, number, number, number];\nexport type Color = ColorRGB | ColorRGBA;\n\nexport interface WritableArrayLike<T> {\n readonly length: number;\n [n: number]: T;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Internal canvas creation shared by uploads, snapshots, presentation and export. */
|
|
2
|
+
export function createCanvas(width = 300, height = 150, offscreen = false) {
|
|
3
|
+
if (!offscreen && typeof document !== 'undefined') {
|
|
4
|
+
const canvas = document.createElement('canvas');
|
|
5
|
+
canvas.width = width;
|
|
6
|
+
canvas.height = height;
|
|
7
|
+
return canvas;
|
|
8
|
+
}
|
|
9
|
+
if (typeof OffscreenCanvas !== 'undefined')
|
|
10
|
+
return new OffscreenCanvas(width, height);
|
|
11
|
+
throw new Error('Canvas creation requires document or OffscreenCanvas.');
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=canvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/util/canvas.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,SAAS,GAAG,KAAK;IACvE,IAAI,CAAC,SAAS,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,MAAM,CAAC;IAC/G,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,WAAW;QAAE,OAAO,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtF,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;AAC3E,CAAC","sourcesContent":["/** Internal canvas creation shared by uploads, snapshots, presentation and export. */\nexport function createCanvas(width = 300, height = 150, offscreen = false): HTMLCanvasElement | OffscreenCanvas {\n if (!offscreen && typeof document !== 'undefined') {\n const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; return canvas;\n }\n if (typeof OffscreenCanvas !== 'undefined') return new OffscreenCanvas(width, height);\n throw new Error('Canvas creation requires document or OffscreenCanvas.');\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Geometry from '../scene/Geometry.js';
|
|
2
|
+
/** Unit sphere (radius 1) centered at the origin, with normals and UVs. */
|
|
3
|
+
export declare function createSphereGeometry(phiSegments?: number, thetaSegments?: number, phiStart?: number, phiLength?: number, thetaStart?: number, thetaLength?: number): Geometry;
|
|
4
|
+
/**
|
|
5
|
+
* 2x2 plane centered at the origin. `horizontal` lies in XZ facing +Y,
|
|
6
|
+
* `vertical` lies in XY facing +Z.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createPlaneGeometry(widthSegments?: number, heightSegments?: number, orient?: 'horizontal' | 'vertical'): Geometry;
|
|
9
|
+
/** 2x2x2 cube centered at the origin. */
|
|
10
|
+
export declare function createCubeGeometry(widthSegments?: number, heightSegments?: number, depthSegments?: number): Geometry;
|
|
11
|
+
/**
|
|
12
|
+
* Studio backdrop ("infinity cove"): a floor that curves up into a back wall.
|
|
13
|
+
* `curveSize` is the fraction of the profile taken by the bend.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createCurvePlaneGeometry(curveSize?: number): Geometry;
|