@meimu/mutracer 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/GLSL-PathTracer-MIT.txt +21 -0
- package/LICENSES/GlMatrix-MIT.txt +19 -0
- package/LICENSES/KinoBloom-MIT.txt +21 -0
- package/LICENSES/OIDNWeb-MIT.txt +21 -0
- package/LICENSES/Octicons-MIT.txt +21 -0
- package/LICENSES/RayTracingRenderer-MIT.txt +21 -0
- package/LICENSES/TinyBVH-MIT.txt +21 -0
- package/LICENSES/WebGPUUtils-MIT.txt +21 -0
- package/LICENSES/ZetaRay-MIT.txt +21 -0
- package/README.md +195 -2
- package/THIRD_PARTY_NOTICES.md +160 -0
- package/dist/assets/bvh.worker.js +1 -0
- package/dist/mutracer.umd.js +14352 -0
- package/docs/api.md +394 -0
- package/docs/bvh.md +141 -0
- package/docs/denoising.md +301 -0
- package/docs/getting-started.md +308 -0
- package/docs/materials.md +281 -0
- package/docs/performance.md +85 -0
- package/docs/post-processing.md +87 -0
- package/docs/progressive-rendering.md +144 -0
- package/docs/sampling.md +40 -0
- package/docs/threejs.md +273 -0
- package/docs/todo.md +61 -0
- package/docs/updates.md +208 -0
- package/lib/Display.d.ts +72 -0
- package/lib/Display.js +121 -0
- package/lib/Display.js.map +1 -0
- package/lib/Engine.d.ts +161 -0
- package/lib/Engine.js +681 -0
- package/lib/Engine.js.map +1 -0
- package/lib/Render.d.ts +256 -0
- package/lib/Render.js +671 -0
- package/lib/Render.js.map +1 -0
- package/lib/RenderLoop.d.ts +76 -0
- package/lib/RenderLoop.js +204 -0
- package/lib/RenderLoop.js.map +1 -0
- package/lib/Sync.d.ts +19 -0
- package/lib/Sync.js +19 -0
- package/lib/Sync.js.map +1 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +3 -0
- package/lib/constants.js.map +1 -0
- package/lib/main.d.ts +56 -0
- package/lib/main.js +43 -0
- package/lib/main.js.map +1 -0
- package/lib/math.d.ts +23 -0
- package/lib/math.js +56 -0
- package/lib/math.js.map +1 -0
- package/lib/oidn.d.ts +45 -0
- package/lib/oidn.js +42 -0
- package/lib/oidn.js.map +1 -0
- package/lib/oidnBundledWeights.cdn.d.ts +2 -0
- package/lib/oidnBundledWeights.cdn.js +5 -0
- package/lib/oidnBundledWeights.cdn.js.map +1 -0
- package/lib/oidnBundledWeights.d.ts +2 -0
- package/lib/oidnBundledWeights.js +4 -0
- package/lib/oidnBundledWeights.js.map +1 -0
- package/lib/renderer/DisplayPostProcess.d.ts +14 -0
- package/lib/renderer/DisplayPostProcess.js +41 -0
- package/lib/renderer/DisplayPostProcess.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +119 -0
- package/lib/renderer/MaterialTable.js +550 -0
- package/lib/renderer/MaterialTable.js.map +1 -0
- package/lib/renderer/OfflineAdaptiveSampling.d.ts +47 -0
- package/lib/renderer/OfflineAdaptiveSampling.js +36 -0
- package/lib/renderer/OfflineAdaptiveSampling.js.map +1 -0
- package/lib/renderer/RenderingPipeline.d.ts +232 -0
- package/lib/renderer/RenderingPipeline.js +18 -0
- package/lib/renderer/RenderingPipeline.js.map +1 -0
- package/lib/renderer/ScratchPool.d.ts +13 -0
- package/lib/renderer/ScratchPool.js +21 -0
- package/lib/renderer/ScratchPool.js.map +1 -0
- package/lib/renderer/TileRender.d.ts +44 -0
- package/lib/renderer/TileRender.js +283 -0
- package/lib/renderer/TileRender.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.d.ts +17 -0
- package/lib/renderer/WGPUBloomPass.js +243 -0
- package/lib/renderer/WGPUBloomPass.js.map +1 -0
- package/lib/renderer/WGPUCanvasSurface.d.ts +21 -0
- package/lib/renderer/WGPUCanvasSurface.js +48 -0
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -0
- package/lib/renderer/WGPUComputePass.d.ts +73 -0
- package/lib/renderer/WGPUComputePass.js +317 -0
- package/lib/renderer/WGPUComputePass.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.d.ts +73 -0
- package/lib/renderer/WGPUFullQuadPass.js +389 -0
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -0
- package/lib/renderer/WGPUHDRPeakMeter.d.ts +19 -0
- package/lib/renderer/WGPUHDRPeakMeter.js +112 -0
- package/lib/renderer/WGPUHDRPeakMeter.js.map +1 -0
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +61 -0
- package/lib/renderer/WGPUJNLMDenoiser.js +412 -0
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +44 -0
- package/lib/renderer/WGPURayTraceOutput.js +368 -0
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -0
- package/lib/renderer/WGPURayTracePass.d.ts +284 -0
- package/lib/renderer/WGPURayTracePass.js +2323 -0
- package/lib/renderer/WGPURayTracePass.js.map +1 -0
- package/lib/renderer/WGPURenderingPipeline.d.ts +9 -0
- package/lib/renderer/WGPURenderingPipeline.js +1446 -0
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -0
- package/lib/renderer/WGPUSceneFeatures.d.ts +3 -0
- package/lib/renderer/WGPUSceneFeatures.js +20 -0
- package/lib/renderer/WGPUSceneFeatures.js.map +1 -0
- package/lib/renderer/WGPUScratchBuffer.d.ts +9 -0
- package/lib/renderer/WGPUScratchBuffer.js +21 -0
- package/lib/renderer/WGPUScratchBuffer.js.map +1 -0
- package/lib/renderer/WGPUScratchTexture.d.ts +10 -0
- package/lib/renderer/WGPUScratchTexture.js +27 -0
- package/lib/renderer/WGPUScratchTexture.js.map +1 -0
- package/lib/renderer/WGPUShaderCache.d.ts +26 -0
- package/lib/renderer/WGPUShaderCache.js +103 -0
- package/lib/renderer/WGPUShaderCache.js.map +1 -0
- package/lib/renderer/WebGLBloomPass.d.ts +18 -0
- package/lib/renderer/WebGLBloomPass.js +113 -0
- package/lib/renderer/WebGLBloomPass.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +65 -0
- package/lib/renderer/WebGLFullQuadPass.js +208 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -0
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +32 -0
- package/lib/renderer/WebGLJNLMDenoiser.js +328 -0
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -0
- package/lib/renderer/WebGLRayTraceOutputPass.d.ts +20 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js +106 -0
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -0
- package/lib/renderer/WebGLRayTracePass.d.ts +142 -0
- package/lib/renderer/WebGLRayTracePass.js +845 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -0
- package/lib/renderer/WebGLReadback.d.ts +4 -0
- package/lib/renderer/WebGLReadback.js +75 -0
- package/lib/renderer/WebGLReadback.js.map +1 -0
- package/lib/renderer/WebGLRenderingPipeline.d.ts +4 -0
- package/lib/renderer/WebGLRenderingPipeline.js +510 -0
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -0
- package/lib/renderer/WebGLScratchCopy.d.ts +10 -0
- package/lib/renderer/WebGLScratchCopy.js +27 -0
- package/lib/renderer/WebGLScratchCopy.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +26 -0
- package/lib/renderer/accumulationTarget.js +2 -0
- package/lib/renderer/accumulationTarget.js.map +1 -0
- package/lib/renderer/binnedSahBvh.d.ts +31 -0
- package/lib/renderer/binnedSahBvh.js +263 -0
- package/lib/renderer/binnedSahBvh.js.map +1 -0
- package/lib/renderer/bvh.worker.d.ts +1 -0
- package/lib/renderer/bvh.worker.js +16 -0
- package/lib/renderer/bvh.worker.js.map +1 -0
- package/lib/renderer/bvhAccel.d.ts +81 -0
- package/lib/renderer/bvhAccel.js +621 -0
- package/lib/renderer/bvhAccel.js.map +1 -0
- package/lib/renderer/bvhWorkerBuild.d.ts +12 -0
- package/lib/renderer/bvhWorkerBuild.js +17 -0
- package/lib/renderer/bvhWorkerBuild.js.map +1 -0
- package/lib/renderer/bvhWorkerClient.d.ts +57 -0
- package/lib/renderer/bvhWorkerClient.js +166 -0
- package/lib/renderer/bvhWorkerClient.js.map +1 -0
- package/lib/renderer/cameraLens.d.ts +5 -0
- package/lib/renderer/cameraLens.js +15 -0
- package/lib/renderer/cameraLens.js.map +1 -0
- package/lib/renderer/cameraSnapshot.d.ts +3 -0
- package/lib/renderer/cameraSnapshot.js +7 -0
- package/lib/renderer/cameraSnapshot.js.map +1 -0
- package/lib/renderer/committedScene.d.ts +13 -0
- package/lib/renderer/committedScene.js +121 -0
- package/lib/renderer/committedScene.js.map +1 -0
- package/lib/renderer/dataTextureUtil.d.ts +32 -0
- package/lib/renderer/dataTextureUtil.js +46 -0
- package/lib/renderer/dataTextureUtil.js.map +1 -0
- package/lib/renderer/denoiser.d.ts +65 -0
- package/lib/renderer/denoiser.js +2 -0
- package/lib/renderer/denoiser.js.map +1 -0
- package/lib/renderer/depthQuery.d.ts +14 -0
- package/lib/renderer/depthQuery.js +14 -0
- package/lib/renderer/depthQuery.js.map +1 -0
- package/lib/renderer/deviceRequirements.d.ts +23 -0
- package/lib/renderer/deviceRequirements.js +50 -0
- package/lib/renderer/deviceRequirements.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +10 -0
- package/lib/renderer/envMapCreation.js +96 -0
- package/lib/renderer/envMapCreation.js.map +1 -0
- package/lib/renderer/envMapDistribution.d.ts +9 -0
- package/lib/renderer/envMapDistribution.js +107 -0
- package/lib/renderer/envMapDistribution.js.map +1 -0
- package/lib/renderer/float16.d.ts +1 -0
- package/lib/renderer/float16.js +19 -0
- package/lib/renderer/float16.js.map +1 -0
- package/lib/renderer/geometryBvh.d.ts +11 -0
- package/lib/renderer/geometryBvh.js +24 -0
- package/lib/renderer/geometryBvh.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +28 -0
- package/lib/renderer/geometryUpdates.js +131 -0
- package/lib/renderer/geometryUpdates.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +37 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/common.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/common.glsl.js +17 -0
- package/lib/renderer/glsl/chunks/common.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +192 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js +1091 -0
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +371 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +1767 -0
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rand.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js +26 -0
- package/lib/renderer/glsl/chunks/rand.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/random.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/random.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/random.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +287 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +254 -0
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +279 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +48 -0
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js +194 -0
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js +170 -0
- package/lib/renderer/glsl/chunks/sobol.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +27 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +72 -0
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/depthQuery.frag.d.ts +3 -0
- package/lib/renderer/glsl/depthQuery.frag.js +55 -0
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.d.ts +6 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +46 -0
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -0
- package/lib/renderer/glsl/rayTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/rayTrace.frag.js +619 -0
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/shadowCatcher.frag.d.ts +3 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js +119 -0
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -0
- package/lib/renderer/glsl/webglPipeline.frag.d.ts +4 -0
- package/lib/renderer/glsl/webglPipeline.frag.js +208 -0
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -0
- package/lib/renderer/gpuMemory.d.ts +2 -0
- package/lib/renderer/gpuMemory.js +10 -0
- package/lib/renderer/gpuMemory.js.map +1 -0
- package/lib/renderer/halton.d.ts +1 -0
- package/lib/renderer/halton.js +15 -0
- package/lib/renderer/halton.js.map +1 -0
- package/lib/renderer/jnlm.d.ts +85 -0
- package/lib/renderer/jnlm.js +87 -0
- package/lib/renderer/jnlm.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +75 -0
- package/lib/renderer/lightSampling.js +305 -0
- package/lib/renderer/lightSampling.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +26 -0
- package/lib/renderer/lightsUtil.js +154 -0
- package/lib/renderer/lightsUtil.js.map +1 -0
- package/lib/renderer/materialChanges.d.ts +13 -0
- package/lib/renderer/materialChanges.js +59 -0
- package/lib/renderer/materialChanges.js.map +1 -0
- package/lib/renderer/materialComparison.generated.d.ts +5 -0
- package/lib/renderer/materialComparison.generated.js +655 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +6 -0
- package/lib/renderer/materialConstants.js +3 -0
- package/lib/renderer/materialConstants.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +9 -0
- package/lib/renderer/materialEmission.js +21 -0
- package/lib/renderer/materialEmission.js.map +1 -0
- package/lib/renderer/materialIndices.d.ts +7 -0
- package/lib/renderer/materialIndices.js +34 -0
- package/lib/renderer/materialIndices.js.map +1 -0
- package/lib/renderer/materialLayout.d.ts +102 -0
- package/lib/renderer/materialLayout.js +189 -0
- package/lib/renderer/materialLayout.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +537 -0
- package/lib/renderer/materialTextureSlots.js +219 -0
- package/lib/renderer/materialTextureSlots.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.d.ts +8 -0
- package/lib/renderer/mergeMeshesToGeometry.js +236 -0
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -0
- package/lib/renderer/meshInstances.d.ts +23 -0
- package/lib/renderer/meshInstances.js +66 -0
- package/lib/renderer/meshInstances.js.map +1 -0
- package/lib/renderer/meshMembership.d.ts +10 -0
- package/lib/renderer/meshMembership.js +72 -0
- package/lib/renderer/meshMembership.js.map +1 -0
- package/lib/renderer/oidnNetwork.d.ts +20 -0
- package/lib/renderer/oidnNetwork.js +123 -0
- package/lib/renderer/oidnNetwork.js.map +1 -0
- package/lib/renderer/openPbrEnergyLut.d.ts +32 -0
- package/lib/renderer/openPbrEnergyLut.js +965 -0
- package/lib/renderer/openPbrEnergyLut.js.map +1 -0
- package/lib/renderer/pathLimits.d.ts +4 -0
- package/lib/renderer/pathLimits.js +7 -0
- package/lib/renderer/pathLimits.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +110 -0
- package/lib/renderer/prepareMeshBVH.js +857 -0
- package/lib/renderer/prepareMeshBVH.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +11 -0
- package/lib/renderer/progressiveScheduler.js +19 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -0
- package/lib/renderer/renderPipeline.d.ts +57 -0
- package/lib/renderer/renderPipeline.js +49 -0
- package/lib/renderer/renderPipeline.js.map +1 -0
- package/lib/renderer/sampling.d.ts +10 -0
- package/lib/renderer/sampling.js +28 -0
- package/lib/renderer/sampling.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +29 -0
- package/lib/renderer/sceneChangeDetector.js +232 -0
- package/lib/renderer/sceneChangeDetector.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +14 -0
- package/lib/renderer/sceneLightChanges.js +34 -0
- package/lib/renderer/sceneLightChanges.js.map +1 -0
- package/lib/renderer/scratchSampling.d.ts +3 -0
- package/lib/renderer/scratchSampling.js +39 -0
- package/lib/renderer/scratchSampling.js.map +1 -0
- package/lib/renderer/shader.d.ts +37 -0
- package/lib/renderer/shader.js +41 -0
- package/lib/renderer/shader.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +24 -0
- package/lib/renderer/staticBvhPreparation.js +116 -0
- package/lib/renderer/staticBvhPreparation.js.map +1 -0
- package/lib/renderer/textureRegion.d.ts +8 -0
- package/lib/renderer/textureRegion.js +9 -0
- package/lib/renderer/textureRegion.js.map +1 -0
- package/lib/renderer/texturesFromMaterials.d.ts +6 -0
- package/lib/renderer/texturesFromMaterials.js +37 -0
- package/lib/renderer/texturesFromMaterials.js.map +1 -0
- package/lib/renderer/util.d.ts +17 -0
- package/lib/renderer/util.js +56 -0
- package/lib/renderer/util.js.map +1 -0
- package/lib/renderer/webgl.d.ts +131 -0
- package/lib/renderer/webgl.js +586 -0
- package/lib/renderer/webgl.js.map +1 -0
- package/lib/renderer/webglShaders.d.ts +4 -0
- package/lib/renderer/webglShaders.js +41 -0
- package/lib/renderer/webglShaders.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +23 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +128 -0
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +1441 -0
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +85 -0
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +7 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +315 -0
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +1737 -0
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +352 -0
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +25 -0
- package/lib/renderer/wgsl/chunks/rand.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js +2 -0
- package/lib/renderer/wgsl/chunks/random.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +328 -0
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +400 -0
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +439 -0
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +40 -0
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +198 -0
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +8 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +170 -0
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +42 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +218 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js +28 -0
- package/lib/renderer/wgsl/customDenoise.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +3 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js +34 -0
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.d.ts +2 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +108 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +16 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +923 -0
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -0
- package/lib/scene/AmbientLight.d.ts +17 -0
- package/lib/scene/AmbientLight.js +15 -0
- package/lib/scene/AmbientLight.js.map +1 -0
- package/lib/scene/Camera.d.ts +78 -0
- package/lib/scene/Camera.js +111 -0
- package/lib/scene/Camera.js.map +1 -0
- package/lib/scene/DirectionalLight.d.ts +18 -0
- package/lib/scene/DirectionalLight.js +17 -0
- package/lib/scene/DirectionalLight.js.map +1 -0
- package/lib/scene/EnvironmentLight.d.ts +14 -0
- package/lib/scene/EnvironmentLight.js +14 -0
- package/lib/scene/EnvironmentLight.js.map +1 -0
- package/lib/scene/Geometry.d.ts +87 -0
- package/lib/scene/Geometry.js +108 -0
- package/lib/scene/Geometry.js.map +1 -0
- package/lib/scene/IESProfile.d.ts +19 -0
- package/lib/scene/IESProfile.js +165 -0
- package/lib/scene/IESProfile.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +43 -0
- package/lib/scene/InstancedMesh.js +79 -0
- package/lib/scene/InstancedMesh.js.map +1 -0
- package/lib/scene/Mesh.d.ts +14 -0
- package/lib/scene/Mesh.js +17 -0
- package/lib/scene/Mesh.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +224 -0
- package/lib/scene/OpenPBRMaterial.js +240 -0
- package/lib/scene/OpenPBRMaterial.js.map +1 -0
- package/lib/scene/RectLight.d.ts +31 -0
- package/lib/scene/RectLight.js +26 -0
- package/lib/scene/RectLight.js.map +1 -0
- package/lib/scene/Scene.d.ts +55 -0
- package/lib/scene/Scene.js +2 -0
- package/lib/scene/Scene.js.map +1 -0
- package/lib/scene/SceneNode.d.ts +16 -0
- package/lib/scene/SceneNode.js +33 -0
- package/lib/scene/SceneNode.js.map +1 -0
- package/lib/scene/SphereLight.d.ts +22 -0
- package/lib/scene/SphereLight.js +20 -0
- package/lib/scene/SphereLight.js.map +1 -0
- package/lib/scene/SpotLight.d.ts +35 -0
- package/lib/scene/SpotLight.js +29 -0
- package/lib/scene/SpotLight.js.map +1 -0
- package/lib/scene/Texture.d.ts +38 -0
- package/lib/scene/Texture.js +37 -0
- package/lib/scene/Texture.js.map +1 -0
- package/lib/scene/anisotropyParameters.d.ts +1 -0
- package/lib/scene/anisotropyParameters.js +13 -0
- package/lib/scene/anisotropyParameters.js.map +1 -0
- package/lib/scene/geometryChanges.d.ts +5 -0
- package/lib/scene/geometryChanges.js +18 -0
- package/lib/scene/geometryChanges.js.map +1 -0
- package/lib/scene/materialTextureNames.d.ts +2 -0
- package/lib/scene/materialTextureNames.js +9 -0
- package/lib/scene/materialTextureNames.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +400 -0
- package/lib/scene/openPbrSchema.js +149 -0
- package/lib/scene/openPbrSchema.js.map +1 -0
- package/lib/scene/thinFilmParameters.d.ts +4 -0
- package/lib/scene/thinFilmParameters.js +12 -0
- package/lib/scene/thinFilmParameters.js.map +1 -0
- package/lib/settings/display.d.ts +118 -0
- package/lib/settings/display.js +34 -0
- package/lib/settings/display.js.map +1 -0
- package/lib/settings/engine.d.ts +37 -0
- package/lib/settings/engine.js +26 -0
- package/lib/settings/engine.js.map +1 -0
- package/lib/settings/render.d.ts +178 -0
- package/lib/settings/render.js +36 -0
- package/lib/settings/render.js.map +1 -0
- package/lib/tinybvh/LICENSE +21 -0
- package/lib/tinybvh/TinyBvhBuilder.d.ts +17 -0
- package/lib/tinybvh/TinyBvhBuilder.js +211 -0
- package/lib/tinybvh/TinyBvhBuilder.js.map +1 -0
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/types.d.ts +13 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/util/canvas.d.ts +2 -0
- package/lib/util/canvas.js +13 -0
- package/lib/util/canvas.js.map +1 -0
- package/lib/util/commonGeometry.d.ts +15 -0
- package/lib/util/commonGeometry.js +240 -0
- package/lib/util/commonGeometry.js.map +1 -0
- package/lib/util/events.d.ts +7 -0
- package/lib/util/events.js +23 -0
- package/lib/util/events.js.map +1 -0
- package/lib/util/frame.d.ts +2 -0
- package/lib/util/frame.js +10 -0
- package/lib/util/frame.js.map +1 -0
- package/lib/util/fromTHREE.d.ts +100 -0
- package/lib/util/fromTHREE.js +1063 -0
- package/lib/util/fromTHREE.js.map +1 -0
- package/lib/util/geometry.d.ts +13 -0
- package/lib/util/geometry.js +292 -0
- package/lib/util/geometry.js.map +1 -0
- package/lib/util/loadRGBE.d.ts +7 -0
- package/lib/util/loadRGBE.js +168 -0
- package/lib/util/loadRGBE.js.map +1 -0
- package/lib/util/math.d.ts +8 -0
- package/lib/util/math.js +64 -0
- package/lib/util/math.js.map +1 -0
- package/lib/util/mesh.d.ts +7 -0
- package/lib/util/mesh.js +20 -0
- package/lib/util/mesh.js.map +1 -0
- package/lib/util/threeDeformation.d.ts +20 -0
- package/lib/util/threeDeformation.js +218 -0
- package/lib/util/threeDeformation.js.map +1 -0
- package/lib/version.d.ts +2 -0
- package/lib/version.js +3 -0
- package/lib/version.js.map +1 -0
- package/llms.txt +62 -0
- package/oidn/weights/LICENSE.txt +202 -0
- package/oidn/weights/README.md +43 -0
- package/oidn/weights/rt_hdr_alb_nrm.tza +0 -0
- package/oidn/weights/rt_hdr_alb_nrm_small.tza +0 -0
- package/package.json +124 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"committedScene.js","sourceRoot":"","sources":["../../src/renderer/committedScene.ts"],"names":[],"mappings":"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","sourcesContent":["import {createCanvas} from '../util/canvas.js';\nimport Geometry from '../scene/Geometry.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Texture from '../scene/Texture.js';\nimport { copyGeometryChangeState } from '../scene/geometryChanges.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneChanges } from './sceneChangeDetector.js';\n\n/** Stable engine-owned mirrors isolate deferred GPU uploads from external edits. */\nexport class CommittedScene {\n private readonly copies = new WeakMap<object, any>();\n private readonly geometryVersions = new WeakMap<Geometry, number>();\n private readonly instanceVersions = new WeakMap<InstancedMesh, {transformsVersion: number; transforms: Float32Array; colorsVersion: number; colors?: Float32Array}>();\n private value?: Scene;\n private readonly copying = new WeakSet<object>();\n\n private copy<T>(value: T): T {\n if (!value || typeof value !== 'object') return value;\n const object = value as object;\n if ((typeof HTMLImageElement !== 'undefined' && object instanceof HTMLImageElement) || (typeof HTMLCanvasElement !== 'undefined' && object instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && object instanceof OffscreenCanvas) ||\n (typeof ImageBitmap !== 'undefined' && object instanceof ImageBitmap)) {\n const source = object as HTMLImageElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap;\n let canvas = this.copies.get(object) as HTMLCanvasElement | OffscreenCanvas | undefined;\n if (!canvas) { canvas = createCanvas(source.width, source.height); this.copies.set(object, canvas); }\n canvas.width = source.width; canvas.height = source.height;\n const context = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!context) throw new Error('Texture snapshot context is not available.');\n context.drawImage(source, 0, 0);\n return canvas as T;\n }\n if (typeof Node !== 'undefined' && object instanceof Node) return value;\n if (value instanceof Geometry && this.geometryVersions.get(value) === value.version) return this.copies.get(value);\n if (ArrayBuffer.isView(value)) {\n const previous = this.copies.get(object);\n if (previous?.constructor === value.constructor && previous.length === (value as any).length) {\n previous.set(value); return previous;\n }\n const cloned = (value as any).slice(); this.copies.set(object, cloned); return cloned;\n }\n if (value instanceof ArrayBuffer) return value.slice(0) as T;\n let cloned = this.copies.get(object);\n if (!cloned) { cloned = Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value)); this.copies.set(object, cloned); }\n if (this.copying.has(object)) return cloned;\n this.copying.add(object);\n try {\n for (const key of Object.keys(value)) {\n if (value instanceof InstancedMesh && (key === 'transforms' || key === 'colors')) {\n const previous = this.instanceVersions.get(value);\n const version = key === 'transforms' ? value.transformsVersion : value.colorsVersion;\n const priorVersion = key === 'transforms' ? previous?.transformsVersion : previous?.colorsVersion;\n const array = value[key];\n if (!previous || priorVersion !== version || previous[key] !== array) {\n // Each batch owns its snapshot even when callers share source storage.\n if (!array) cloned[key] = undefined;\n else if (previous?.[key] === array && cloned[key]?.length === array.length) cloned[key].set(array);\n else cloned[key] = array.slice();\n }\n } else cloned[key] = value instanceof Texture && key === 'source' ? value.source : this.copy((value as any)[key]);\n }\n } finally { this.copying.delete(object); }\n if (Array.isArray(value)) cloned.length = value.length;\n if (value instanceof InstancedMesh) this.instanceVersions.set(value, {\n transformsVersion: value.transformsVersion, transforms: value.transforms,\n colorsVersion: value.colorsVersion, colors: value.colors\n });\n if (value instanceof Geometry) {\n this.geometryVersions.set(value, value.version);\n setGeometryBvh(cloned, getGeometryBvh(value));\n copyGeometryChangeState(value, cloned);\n }\n return cloned;\n }\n\n mirror<T extends object>(source: T): T { return this.copies.get(source); }\n\n capture(scene: Scene, changes: SceneChanges): Scene {\n if (!this.value || changes.meshes === 'full') this.value = { meshes: this.copy(scene.meshes), lights: this.copy(scene.lights), background: this.copy(scene.background) };\n else {\n for (const mesh of changes.transforms) {\n this.copy(mesh.transform);\n if (mesh instanceof InstancedMesh) this.copy(mesh);\n }\n for (const mesh of changes.colors) this.copy(mesh);\n for (const geometry of changes.geometries) this.copy(geometry);\n for (const material of changes.materials) this.copy(material);\n if (changes.lights) this.value.lights = this.copy(scene.lights);\n if (changes.background) this.value.background = this.copy(scene.background);\n }\n return this.value;\n }\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Texture2D } from './webgl.js';
|
|
2
|
+
export declare function padArray(typedArray: Float32Array | Int32Array, length: number): Float32Array | Int32Array;
|
|
3
|
+
export declare function textureDimensionsFromArray(count: number): {
|
|
4
|
+
columnsLog: number;
|
|
5
|
+
columns: number;
|
|
6
|
+
rows: number;
|
|
7
|
+
size: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function setDataTexture(texture: Texture2D, dataArray: Float32Array | Int32Array, channels: 1 | 2 | 3 | 4): {
|
|
10
|
+
columnsLog: number;
|
|
11
|
+
columns: number;
|
|
12
|
+
rows: number;
|
|
13
|
+
size: number;
|
|
14
|
+
};
|
|
15
|
+
export declare const commonLinearFloatProps: {
|
|
16
|
+
wrapS: 33071;
|
|
17
|
+
wrapT: 33071;
|
|
18
|
+
type: 5126;
|
|
19
|
+
minFilter: 9729;
|
|
20
|
+
magFilter: 9729;
|
|
21
|
+
flipY: boolean;
|
|
22
|
+
useMipmap: boolean;
|
|
23
|
+
};
|
|
24
|
+
export declare const commonNearestFloatProps: {
|
|
25
|
+
wrapS: 33071;
|
|
26
|
+
wrapT: 33071;
|
|
27
|
+
minFilter: 9728;
|
|
28
|
+
magFilter: 9728;
|
|
29
|
+
type: 5126;
|
|
30
|
+
flipY: boolean;
|
|
31
|
+
useMipmap: boolean;
|
|
32
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { constants } from './webgl.js';
|
|
2
|
+
export function padArray(typedArray, length) {
|
|
3
|
+
const newArray = new typedArray.constructor(length);
|
|
4
|
+
newArray.set(typedArray);
|
|
5
|
+
return newArray;
|
|
6
|
+
}
|
|
7
|
+
export function textureDimensionsFromArray(count) {
|
|
8
|
+
const columnsLog = Math.round(Math.log2(Math.sqrt(count)));
|
|
9
|
+
const columns = 2 ** columnsLog;
|
|
10
|
+
const rows = Math.ceil(count / columns);
|
|
11
|
+
return {
|
|
12
|
+
columnsLog,
|
|
13
|
+
columns,
|
|
14
|
+
rows,
|
|
15
|
+
size: rows * columns
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function setDataTexture(texture, dataArray, channels) {
|
|
19
|
+
const textureDim = textureDimensionsFromArray(dataArray.length / channels);
|
|
20
|
+
texture.source = {
|
|
21
|
+
data: padArray(dataArray, textureDim.size * channels),
|
|
22
|
+
width: textureDim.columns,
|
|
23
|
+
height: textureDim.rows
|
|
24
|
+
};
|
|
25
|
+
return textureDim;
|
|
26
|
+
}
|
|
27
|
+
export const commonLinearFloatProps = {
|
|
28
|
+
wrapS: constants.CLAMP_TO_EDGE,
|
|
29
|
+
wrapT: constants.CLAMP_TO_EDGE,
|
|
30
|
+
// TODO HALF_FLOAT needs Uint16Array. Float32Array not work
|
|
31
|
+
type: constants.FLOAT,
|
|
32
|
+
minFilter: constants.LINEAR,
|
|
33
|
+
magFilter: constants.LINEAR,
|
|
34
|
+
flipY: false,
|
|
35
|
+
useMipmap: false
|
|
36
|
+
};
|
|
37
|
+
export const commonNearestFloatProps = {
|
|
38
|
+
wrapS: constants.CLAMP_TO_EDGE,
|
|
39
|
+
wrapT: constants.CLAMP_TO_EDGE,
|
|
40
|
+
minFilter: constants.NEAREST,
|
|
41
|
+
magFilter: constants.NEAREST,
|
|
42
|
+
type: constants.FLOAT,
|
|
43
|
+
flipY: false,
|
|
44
|
+
useMipmap: false
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=dataTextureUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTextureUtil.js","sourceRoot":"","sources":["../../src/renderer/dataTextureUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,SAAS,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,UAAU,QAAQ,CACtB,UAAqC,EACrC,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAK,UAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7D,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;IACxC,OAAO;QACL,UAAU;QACV,OAAO;QACP,IAAI;QACJ,IAAI,EAAE,IAAI,GAAG,OAAO;KACrB,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,cAAc,CAC5B,OAAkB,EAClB,SAAoC,EACpC,QAAuB;IAEvB,MAAM,UAAU,GAAG,0BAA0B,CAAC,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC3E,OAAO,CAAC,MAAM,GAAG;QACf,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrD,KAAK,EAAE,UAAU,CAAC,OAAO;QACzB,MAAM,EAAE,UAAU,CAAC,IAAI;KACxB,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,KAAK,EAAE,SAAS,CAAC,aAAa;IAC9B,KAAK,EAAE,SAAS,CAAC,aAAa;IAC9B,2DAA2D;IAC3D,IAAI,EAAE,SAAS,CAAC,KAAK;IACrB,SAAS,EAAE,SAAS,CAAC,MAAM;IAC3B,SAAS,EAAE,SAAS,CAAC,MAAM;IAC3B,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,KAAK;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,SAAS,CAAC,aAAa;IAC9B,KAAK,EAAE,SAAS,CAAC,aAAa;IAC9B,SAAS,EAAE,SAAS,CAAC,OAAO;IAC5B,SAAS,EAAE,SAAS,CAAC,OAAO;IAC5B,IAAI,EAAE,SAAS,CAAC,KAAK;IACrB,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,KAAK;CACjB,CAAC","sourcesContent":["import { Texture2D, constants } from './webgl.js';\n\nexport function padArray(\n typedArray: Float32Array | Int32Array,\n length: number\n): Float32Array | Int32Array {\n const newArray = new (typedArray as any).constructor(length);\n newArray.set(typedArray);\n return newArray;\n}\n\nexport function textureDimensionsFromArray(count: number) {\n const columnsLog = Math.round(Math.log2(Math.sqrt(count)));\n const columns = 2 ** columnsLog;\n const rows = Math.ceil(count / columns);\n return {\n columnsLog,\n columns,\n rows,\n size: rows * columns\n };\n}\nexport function setDataTexture(\n texture: Texture2D,\n dataArray: Float32Array | Int32Array,\n channels: 1 | 2 | 3 | 4\n) {\n const textureDim = textureDimensionsFromArray(dataArray.length / channels);\n texture.source = {\n data: padArray(dataArray, textureDim.size * channels),\n width: textureDim.columns,\n height: textureDim.rows\n };\n return textureDim;\n}\n\nexport const commonLinearFloatProps = {\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE,\n // TODO HALF_FLOAT needs Uint16Array. Float32Array not work\n type: constants.FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n flipY: false,\n useMipmap: false\n};\n\nexport const commonNearestFloatProps = {\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE,\n minFilter: constants.NEAREST,\n magFilter: constants.NEAREST,\n type: constants.FLOAT,\n flipY: false,\n useMipmap: false\n};\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Denoiser } from '../Render.js';
|
|
2
|
+
import type { JNLMDenoiser } from './jnlm.js';
|
|
3
|
+
import type { OIDNDenoiser } from './oidnNetwork.js';
|
|
4
|
+
export interface OIDNWebGPUData {
|
|
5
|
+
data: GPUBuffer | GPUTexture;
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface OIDNWebGPUOutputData {
|
|
10
|
+
data: GPUBuffer;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
export interface OIDNWeb {
|
|
15
|
+
auxiliaryDenoisers?: {
|
|
16
|
+
albedo: OIDNWeb;
|
|
17
|
+
normal: OIDNWeb;
|
|
18
|
+
};
|
|
19
|
+
/** Optional serializable execution details exposed by native oidn-web. */
|
|
20
|
+
getRuntimeInfo?: () => unknown;
|
|
21
|
+
/** Optional shape preparation supported by newer oidn-web runtimes. */
|
|
22
|
+
prepareForImage?: (width: number, height: number, options?: {
|
|
23
|
+
tileOverlap?: number;
|
|
24
|
+
}) => Promise<void>;
|
|
25
|
+
tileExecute: (opts: {
|
|
26
|
+
color: OIDNWebGPUData;
|
|
27
|
+
albedo?: OIDNWebGPUData;
|
|
28
|
+
normal?: OIDNWebGPUData;
|
|
29
|
+
denoiseAlpha?: boolean;
|
|
30
|
+
wholeImage?: boolean;
|
|
31
|
+
tileOverlap?: number;
|
|
32
|
+
scheduling?: 'animation-frame' | 'event-loop';
|
|
33
|
+
done: (outputData: {
|
|
34
|
+
data: GPUBuffer;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}) => void;
|
|
38
|
+
error?: (reason: unknown) => void;
|
|
39
|
+
progress?: (outputData: OIDNWebGPUOutputData, tileData: OIDNWebGPUOutputData | undefined, tile: {
|
|
40
|
+
x: number;
|
|
41
|
+
y: number;
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
}, currentIdx: number, totalIdx: number) => void;
|
|
45
|
+
}) => () => void;
|
|
46
|
+
}
|
|
47
|
+
/** Explicit private dispatch; built-ins do not implement the public custom interface. */
|
|
48
|
+
export type DenoiserHandle = {
|
|
49
|
+
kind: 'jnlm';
|
|
50
|
+
denoiser: JNLMDenoiser;
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'oidn';
|
|
53
|
+
denoiser: OIDNWeb;
|
|
54
|
+
} | {
|
|
55
|
+
kind: 'custom';
|
|
56
|
+
denoiser: Denoiser;
|
|
57
|
+
};
|
|
58
|
+
/** Only these handles are owned and released by the engine. */
|
|
59
|
+
export type OwnedDenoiser = {
|
|
60
|
+
kind: 'jnlm';
|
|
61
|
+
denoiser: JNLMDenoiser;
|
|
62
|
+
} | {
|
|
63
|
+
kind: 'oidn';
|
|
64
|
+
denoiser: OIDNDenoiser;
|
|
65
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"denoiser.js","sourceRoot":"","sources":["../../src/renderer/denoiser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Denoiser} from '../Render.js';\nimport type {JNLMDenoiser} from './jnlm.js';\nimport type {OIDNDenoiser} from './oidnNetwork.js';\n\nexport interface OIDNWebGPUData {\n data: GPUBuffer | GPUTexture;\n width: number;\n height: number;\n}\nexport interface OIDNWebGPUOutputData {\n data: GPUBuffer;\n width: number;\n height: number;\n}\n\nexport interface OIDNWeb {\n auxiliaryDenoisers?: {\n albedo: OIDNWeb;\n normal: OIDNWeb;\n };\n /** Optional serializable execution details exposed by native oidn-web. */\n getRuntimeInfo?: () => unknown;\n /** Optional shape preparation supported by newer oidn-web runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n tileExecute: (opts: {\n color: OIDNWebGPUData;\n albedo?: OIDNWebGPUData;\n normal?: OIDNWebGPUData;\n denoiseAlpha?: boolean;\n wholeImage?: boolean;\n tileOverlap?: number;\n scheduling?: 'animation-frame' | 'event-loop';\n done: (outputData: {\n data: GPUBuffer;\n width: number;\n height: number;\n }) => void;\n error?: (reason: unknown) => void;\n progress?: (\n outputData: OIDNWebGPUOutputData,\n tileData: OIDNWebGPUOutputData | undefined,\n tile: { x: number; y: number; width: number; height: number },\n currentIdx: number,\n totalIdx: number\n ) => void;\n }) => () => void;\n}\n\n/** Explicit private dispatch; built-ins do not implement the public custom interface. */\nexport type DenoiserHandle =\n | {kind: 'jnlm'; denoiser: JNLMDenoiser}\n | {kind: 'oidn'; denoiser: OIDNWeb}\n | {kind: 'custom'; denoiser: Denoiser};\n/** Only these handles are owned and released by the engine. */\nexport type OwnedDenoiser =\n | {kind: 'jnlm'; denoiser: JNLMDenoiser}\n | {kind: 'oidn'; denoiser: OIDNDenoiser};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** A square depth sampling area in viewport coordinates. */
|
|
2
|
+
export interface DepthSampleArea {
|
|
3
|
+
/** Horizontal center, 0..1 from the left. Required. */
|
|
4
|
+
x: number;
|
|
5
|
+
/** Vertical center, 0..1 from the top. Required. */
|
|
6
|
+
y: number;
|
|
7
|
+
/** Half height as a fraction of viewport height; 0 samples one point. Required. */
|
|
8
|
+
size: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const DEPTH_SAMPLE_GRID = 7;
|
|
11
|
+
export declare const DEPTH_SAMPLE_COUNT: number;
|
|
12
|
+
/** Bottom-left UV center and half extent, matching both camera-ray shaders. */
|
|
13
|
+
export declare function packDepthSampleArea(area: DepthSampleArea, aspect: number): Float32Array<ArrayBuffer>;
|
|
14
|
+
export declare function unpackDepthSamples(rgba: Float32Array): Float32Array<ArrayBuffer>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const DEPTH_SAMPLE_GRID = 7;
|
|
2
|
+
export const DEPTH_SAMPLE_COUNT = DEPTH_SAMPLE_GRID ** 2;
|
|
3
|
+
/** Bottom-left UV center and half extent, matching both camera-ray shaders. */
|
|
4
|
+
export function packDepthSampleArea(area, aspect) {
|
|
5
|
+
if (![area.x, area.y, area.size, aspect].every(Number.isFinite) ||
|
|
6
|
+
area.x < 0 || area.x > 1 || area.y < 0 || area.y > 1 || area.size < 0 || aspect <= 0) {
|
|
7
|
+
throw new RangeError('Depth sampling requires a viewport center in 0..1, a non-negative size and a positive aspect.');
|
|
8
|
+
}
|
|
9
|
+
return new Float32Array([area.x, 1 - area.y, area.size / aspect, area.size]);
|
|
10
|
+
}
|
|
11
|
+
export function unpackDepthSamples(rgba) {
|
|
12
|
+
return Float32Array.from({ length: DEPTH_SAMPLE_COUNT }, (_, i) => rgba[i * 4]);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=depthQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depthQuery.js","sourceRoot":"","sources":["../../src/renderer/depthQuery.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,IAAI,CAAC,CAAC;AAEzD,+EAA+E;AAC/E,MAAM,UAAU,mBAAmB,CAAC,IAAqB,EAAE,MAAc;IACvE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,UAAU,CAAC,+FAA+F,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAkB;IACnD,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC","sourcesContent":["/** A square depth sampling area in viewport coordinates. */\nexport interface DepthSampleArea {\n /** Horizontal center, 0..1 from the left. Required. */\n x: number;\n /** Vertical center, 0..1 from the top. Required. */\n y: number;\n /** Half height as a fraction of viewport height; 0 samples one point. Required. */\n size: number;\n}\n\nexport const DEPTH_SAMPLE_GRID = 7;\nexport const DEPTH_SAMPLE_COUNT = DEPTH_SAMPLE_GRID ** 2;\n\n/** Bottom-left UV center and half extent, matching both camera-ray shaders. */\nexport function packDepthSampleArea(area: DepthSampleArea, aspect: number) {\n if (![area.x, area.y, area.size, aspect].every(Number.isFinite) ||\n area.x < 0 || area.x > 1 || area.y < 0 || area.y > 1 || area.size < 0 || aspect <= 0) {\n throw new RangeError('Depth sampling requires a viewport center in 0..1, a non-negative size and a positive aspect.');\n }\n return new Float32Array([area.x, 1 - area.y, area.size / aspect, area.size]);\n}\n\nexport function unpackDepthSamples(rgba: Float32Array) {\n return Float32Array.from({ length: DEPTH_SAMPLE_COUNT }, (_, i) => rgba[i * 4]);\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Internal pipeline floor: 4 scene + 4 accumulation buffers, 8 textures
|
|
2
|
+
* including displacement, one adaptive storage texture, and 16×16 compute.
|
|
3
|
+
* Buffer capacity covers one aligned 16×16 shadow-catcher target (48 B/pixel).
|
|
4
|
+
* Larger scenes/images and OIDN impose additional, size-dependent requirements.
|
|
5
|
+
*/
|
|
6
|
+
export declare const minimumDeviceLimits: {
|
|
7
|
+
readonly maxStorageBuffersPerShaderStage: 8;
|
|
8
|
+
readonly maxStorageBufferBindingSize: 12288;
|
|
9
|
+
readonly maxBufferSize: 12288;
|
|
10
|
+
readonly maxSampledTexturesPerShaderStage: 8;
|
|
11
|
+
readonly maxStorageTexturesPerShaderStage: 1;
|
|
12
|
+
readonly maxComputeWorkgroupStorageSize: 0;
|
|
13
|
+
readonly maxComputeWorkgroupSizeX: 64;
|
|
14
|
+
readonly maxComputeWorkgroupSizeY: 16;
|
|
15
|
+
readonly maxComputeInvocationsPerWorkgroup: 256;
|
|
16
|
+
readonly maxBindGroups: 4;
|
|
17
|
+
};
|
|
18
|
+
export declare function validateDevice(device: GPUDevice): void;
|
|
19
|
+
/** Recommended descriptor for MuTracer and OIDN on this adapter. Requests
|
|
20
|
+
* supported optional features and adapter limits; defaults depend on adapter.
|
|
21
|
+
* The resulting device remains owned by the caller.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getRecommendedDeviceDescriptor(adapter: GPUAdapter): GPUDeviceDescriptor;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Internal pipeline floor: 4 scene + 4 accumulation buffers, 8 textures
|
|
2
|
+
* including displacement, one adaptive storage texture, and 16×16 compute.
|
|
3
|
+
* Buffer capacity covers one aligned 16×16 shadow-catcher target (48 B/pixel).
|
|
4
|
+
* Larger scenes/images and OIDN impose additional, size-dependent requirements.
|
|
5
|
+
*/
|
|
6
|
+
export const minimumDeviceLimits = {
|
|
7
|
+
maxStorageBuffersPerShaderStage: 8,
|
|
8
|
+
maxStorageBufferBindingSize: 12288,
|
|
9
|
+
maxBufferSize: 12288,
|
|
10
|
+
maxSampledTexturesPerShaderStage: 8,
|
|
11
|
+
maxStorageTexturesPerShaderStage: 1,
|
|
12
|
+
maxComputeWorkgroupStorageSize: 0,
|
|
13
|
+
maxComputeWorkgroupSizeX: 64,
|
|
14
|
+
maxComputeWorkgroupSizeY: 16,
|
|
15
|
+
maxComputeInvocationsPerWorkgroup: 256,
|
|
16
|
+
maxBindGroups: 4,
|
|
17
|
+
};
|
|
18
|
+
export function validateDevice(device) {
|
|
19
|
+
const missing = [];
|
|
20
|
+
for (const [key, required] of Object.entries(minimumDeviceLimits)) {
|
|
21
|
+
const actual = device.limits[key];
|
|
22
|
+
if (typeof actual !== 'number' || actual < required)
|
|
23
|
+
missing.push(`${key}: requires ${required}, actual ${actual}`);
|
|
24
|
+
}
|
|
25
|
+
// No mandatory optional features: tracing uses f32, manual float filtering
|
|
26
|
+
// and render attachments; timestamp queries have a wall-clock fallback.
|
|
27
|
+
if (missing.length)
|
|
28
|
+
throw new Error(`GPUDevice does not meet MuTracer requirements:\n${missing.join('\n')}`);
|
|
29
|
+
}
|
|
30
|
+
/** Recommended descriptor for MuTracer and OIDN on this adapter. Requests
|
|
31
|
+
* supported optional features and adapter limits; defaults depend on adapter.
|
|
32
|
+
* The resulting device remains owned by the caller.
|
|
33
|
+
*/
|
|
34
|
+
export function getRecommendedDeviceDescriptor(adapter) {
|
|
35
|
+
const features = [];
|
|
36
|
+
for (const feature of ['timestamp-query', 'bgra8unorm-storage', 'shader-f16', 'subgroups',
|
|
37
|
+
'texture-formats-tier1', 'texture-formats-tier2', 'float32-filterable']) {
|
|
38
|
+
if (adapter.features.has(feature))
|
|
39
|
+
features.push(feature);
|
|
40
|
+
}
|
|
41
|
+
const limits = adapter.limits;
|
|
42
|
+
const requiredLimits = {};
|
|
43
|
+
for (const key of ['maxComputeWorkgroupStorageSize', 'maxComputeWorkgroupsPerDimension',
|
|
44
|
+
'maxStorageBufferBindingSize', 'maxStorageBuffersPerShaderStage', 'maxSampledTexturesPerShaderStage',
|
|
45
|
+
'maxStorageTexturesPerShaderStage', 'maxBufferSize', 'maxTextureArrayLayers',
|
|
46
|
+
'maxComputeWorkgroupSizeX', 'maxComputeInvocationsPerWorkgroup'])
|
|
47
|
+
requiredLimits[key] = limits[key];
|
|
48
|
+
return { requiredFeatures: features, requiredLimits };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=deviceRequirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceRequirements.js","sourceRoot":"","sources":["../../src/renderer/deviceRequirements.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,+BAA+B,EAAE,CAAC;IAClC,2BAA2B,EAAE,KAAK;IAClC,aAAa,EAAE,KAAK;IACpB,gCAAgC,EAAE,CAAC;IACnC,gCAAgC,EAAE,CAAC;IACnC,8BAA8B,EAAE,CAAC;IACjC,wBAAwB,EAAE,EAAE;IAC5B,wBAAwB,EAAE,EAAE;IAC5B,iCAAiC,EAAE,GAAG;IACtC,aAAa,EAAE,CAAC;CACR,CAAC;AAEX,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAA+B,CAAC,CAAC;QAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,QAAQ,YAAY,MAAM,EAAE,CAAC,CAAC;IACtH,CAAC;IACD,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAAmB;IAChE,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,YAAY,EAAE,WAAW;QACvF,uBAAuB,EAAE,uBAAuB,EAAE,oBAAoB,CAAqB,EAAE,CAAC;QAC9F,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,KAAK,MAAM,GAAG,IAAI,CAAC,gCAAgC,EAAE,kCAAkC;QACrF,6BAA6B,EAAE,iCAAiC,EAAE,kCAAkC;QACpG,kCAAkC,EAAE,eAAe,EAAE,uBAAuB;QAC5E,0BAA0B,EAAE,mCAAmC,CAAU;QAAE,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/G,OAAO,EAAC,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAC,CAAC;AACtD,CAAC","sourcesContent":["/** Internal pipeline floor: 4 scene + 4 accumulation buffers, 8 textures\n * including displacement, one adaptive storage texture, and 16×16 compute.\n * Buffer capacity covers one aligned 16×16 shadow-catcher target (48 B/pixel).\n * Larger scenes/images and OIDN impose additional, size-dependent requirements.\n */\nexport const minimumDeviceLimits = {\n maxStorageBuffersPerShaderStage: 8,\n maxStorageBufferBindingSize: 12288,\n maxBufferSize: 12288,\n maxSampledTexturesPerShaderStage: 8,\n maxStorageTexturesPerShaderStage: 1,\n maxComputeWorkgroupStorageSize: 0,\n maxComputeWorkgroupSizeX: 64,\n maxComputeWorkgroupSizeY: 16,\n maxComputeInvocationsPerWorkgroup: 256,\n maxBindGroups: 4,\n} as const;\n\nexport function validateDevice(device: GPUDevice): void {\n const missing: string[] = [];\n for (const [key, required] of Object.entries(minimumDeviceLimits)) {\n const actual = device.limits[key as keyof GPUSupportedLimits];\n if (typeof actual !== 'number' || actual < required) missing.push(`${key}: requires ${required}, actual ${actual}`);\n }\n // No mandatory optional features: tracing uses f32, manual float filtering\n // and render attachments; timestamp queries have a wall-clock fallback.\n if (missing.length) throw new Error(`GPUDevice does not meet MuTracer requirements:\\n${missing.join('\\n')}`);\n}\n\n/** Recommended descriptor for MuTracer and OIDN on this adapter. Requests\n * supported optional features and adapter limits; defaults depend on adapter.\n * The resulting device remains owned by the caller.\n */\nexport function getRecommendedDeviceDescriptor(adapter: GPUAdapter): GPUDeviceDescriptor {\n const features: GPUFeatureName[] = [];\n for (const feature of ['timestamp-query', 'bgra8unorm-storage', 'shader-f16', 'subgroups',\n 'texture-formats-tier1', 'texture-formats-tier2', 'float32-filterable'] as GPUFeatureName[]) {\n if (adapter.features.has(feature)) features.push(feature);\n }\n const limits = adapter.limits;\n const requiredLimits: Record<string, number> = {};\n for (const key of ['maxComputeWorkgroupStorageSize', 'maxComputeWorkgroupsPerDimension',\n 'maxStorageBufferBindingSize', 'maxStorageBuffersPerShaderStage', 'maxSampledTexturesPerShaderStage',\n 'maxStorageTexturesPerShaderStage', 'maxBufferSize', 'maxTextureArrayLayers',\n 'maxComputeWorkgroupSizeX', 'maxComputeInvocationsPerWorkgroup'] as const) requiredLimits[key] = limits[key];\n return {requiredFeatures: features, requiredLimits};\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColorRGBA } from '../types.js';
|
|
2
|
+
import { TextureDataSource } from '../scene/Texture.js';
|
|
3
|
+
import AmbientLight from '../scene/AmbientLight.js';
|
|
4
|
+
import EnvironmentLight from '../scene/EnvironmentLight.js';
|
|
5
|
+
import { SceneBackground } from '../scene/Scene.js';
|
|
6
|
+
import type { EnvironmentMapSource } from './envMapDistribution.js';
|
|
7
|
+
export declare function generateBackgroundMapFromSceneBackground(background: SceneBackground): TextureDataSource | undefined;
|
|
8
|
+
export declare function generateEnvMapFromSceneComponents(ambientLights: AmbientLight[], environmentLights: EnvironmentLight[]): EnvironmentMapSource;
|
|
9
|
+
export declare function initializeEnvMap(environmentLights: EnvironmentLight[]): EnvironmentMapSource;
|
|
10
|
+
export declare function generateSolidMap(width: number, height: number, color?: ColorRGBA, intensity?: number): TextureDataSource;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
2
|
+
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
|
+
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
|
+
import { isTextureDataSource } from '../scene/Texture.js';
|
|
5
|
+
const DEFAULT_MAP_RESOLUTION = {
|
|
6
|
+
width: 8,
|
|
7
|
+
height: 4
|
|
8
|
+
};
|
|
9
|
+
// Tools for generating and modify env maps for lighting from scene component data
|
|
10
|
+
export function generateBackgroundMapFromSceneBackground(background) {
|
|
11
|
+
let backgroundImage;
|
|
12
|
+
// Is [r,g,b,a] color
|
|
13
|
+
if (Array.isArray(background)) {
|
|
14
|
+
backgroundImage = generateSolidMap(1, 1, background);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
const texture = 'map' in background ? background.map : background;
|
|
18
|
+
if (!isTextureDataSource(texture.image))
|
|
19
|
+
return;
|
|
20
|
+
// Is rgbe data
|
|
21
|
+
backgroundImage = {
|
|
22
|
+
width: texture.image.width,
|
|
23
|
+
height: texture.image.height,
|
|
24
|
+
data: texture.image.data
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return backgroundImage;
|
|
28
|
+
}
|
|
29
|
+
export function generateEnvMapFromSceneComponents(ambientLights, environmentLights) {
|
|
30
|
+
let envImage = initializeEnvMap(environmentLights);
|
|
31
|
+
if (ambientLights.length > 0 && environmentLights.length > 0) {
|
|
32
|
+
envImage = {
|
|
33
|
+
width: envImage.width,
|
|
34
|
+
height: envImage.height,
|
|
35
|
+
data: envImage.data.slice()
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
ambientLights.forEach((light) => {
|
|
39
|
+
addAmbientLightToEnvMap(light, envImage);
|
|
40
|
+
});
|
|
41
|
+
return envImage;
|
|
42
|
+
}
|
|
43
|
+
export function initializeEnvMap(environmentLights) {
|
|
44
|
+
let envImage;
|
|
45
|
+
// Initialize map from environment light if present
|
|
46
|
+
if (environmentLights.length > 0) {
|
|
47
|
+
// TODO: support multiple environment lights (what if they have different resolutions?)
|
|
48
|
+
const environmentLight = environmentLights[0];
|
|
49
|
+
envImage = {
|
|
50
|
+
width: environmentLight.map.image.width,
|
|
51
|
+
height: environmentLight.map.image.height,
|
|
52
|
+
data: environmentLight.map.image.data,
|
|
53
|
+
distributionCacheKey: environmentLight.map.source ??
|
|
54
|
+
environmentLight.map.image.data,
|
|
55
|
+
distributionCacheVersion: environmentLight.map.version
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// initialize blank map
|
|
60
|
+
envImage = generateSolidMap(DEFAULT_MAP_RESOLUTION.width, DEFAULT_MAP_RESOLUTION.height, [0, 0, 0, 1]);
|
|
61
|
+
}
|
|
62
|
+
return envImage;
|
|
63
|
+
}
|
|
64
|
+
export function generateSolidMap(width, height, color, intensity) {
|
|
65
|
+
const texels = width * height;
|
|
66
|
+
const floatBuffer = new Float32Array(texels * 4);
|
|
67
|
+
if (color && Array.isArray(color)) {
|
|
68
|
+
setBufferToColor(floatBuffer, color, intensity);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
width: width,
|
|
72
|
+
height: height,
|
|
73
|
+
data: floatBuffer
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function setBufferToColor(buffer, color, intensity = 1) {
|
|
77
|
+
for (let i = 0; i < buffer.length;) {
|
|
78
|
+
buffer[i++] = color[0] * intensity;
|
|
79
|
+
buffer[i++] = color[1] * intensity;
|
|
80
|
+
buffer[i++] = color[2] * intensity;
|
|
81
|
+
buffer[i++] = color[3];
|
|
82
|
+
}
|
|
83
|
+
return buffer;
|
|
84
|
+
}
|
|
85
|
+
function addAmbientLightToEnvMap(light, image) {
|
|
86
|
+
const color = light.color;
|
|
87
|
+
const intensity = light.intensity;
|
|
88
|
+
const buffer = image.data;
|
|
89
|
+
for (let i = 0; i < buffer.length;) {
|
|
90
|
+
buffer[i++] += color[0] * intensity;
|
|
91
|
+
buffer[i++] += color[1] * intensity;
|
|
92
|
+
buffer[i++] += color[2] * intensity;
|
|
93
|
+
i++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=envMapCreation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envMapCreation.js","sourceRoot":"","sources":["../../src/renderer/envMapCreation.ts"],"names":[],"mappings":"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","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Convert image data from the RGBE format to a 32-bit floating point format\n// See https://www.cg.tuwien.ac.at/research/theses/matkovic/node84.html for a description of the RGBE format\n\nimport { ColorRGBA, WritableArrayLike } from '../types.js';\nimport Texture, {\n isTextureDataSource,\n TextureDataSource\n} from '../scene/Texture.js';\nimport AmbientLight from '../scene/AmbientLight.js';\nimport EnvironmentLight from '../scene/EnvironmentLight.js';\nimport { SceneBackground } from '../scene/Scene.js';\nimport type { EnvironmentMapSource } from './envMapDistribution.js';\n\nconst DEFAULT_MAP_RESOLUTION = {\n width: 8,\n height: 4\n};\n\n// Tools for generating and modify env maps for lighting from scene component data\n\nexport function generateBackgroundMapFromSceneBackground(\n background: SceneBackground\n) {\n let backgroundImage;\n\n // Is [r,g,b,a] color\n if (Array.isArray(background)) {\n backgroundImage = generateSolidMap(1, 1, background);\n } else {\n const texture: Texture =\n 'map' in background ? background.map : (background as Texture);\n if (!isTextureDataSource(texture.image)) return;\n // Is rgbe data\n backgroundImage = {\n width: texture.image.width,\n height: texture.image.height,\n data: texture.image.data\n };\n }\n return backgroundImage;\n}\n\nexport function generateEnvMapFromSceneComponents(\n ambientLights: AmbientLight[],\n environmentLights: EnvironmentLight[]\n) {\n let envImage = initializeEnvMap(environmentLights);\n if (ambientLights.length > 0 && environmentLights.length > 0) {\n envImage = {\n width: envImage.width,\n height: envImage.height,\n data: envImage.data.slice() as TextureDataSource['data']\n };\n }\n ambientLights.forEach((light) => {\n addAmbientLightToEnvMap(light, envImage);\n });\n\n return envImage;\n}\n\nexport function initializeEnvMap(environmentLights: EnvironmentLight[]) {\n let envImage: EnvironmentMapSource;\n\n // Initialize map from environment light if present\n if (environmentLights.length > 0) {\n // TODO: support multiple environment lights (what if they have different resolutions?)\n const environmentLight = environmentLights[0];\n envImage = {\n width: environmentLight.map.image.width,\n height: environmentLight.map.image.height,\n data: (environmentLight.map.image as TextureDataSource).data,\n distributionCacheKey:\n environmentLight.map.source ??\n (environmentLight.map.image as TextureDataSource).data,\n distributionCacheVersion: environmentLight.map.version\n };\n } else {\n // initialize blank map\n envImage = generateSolidMap(\n DEFAULT_MAP_RESOLUTION.width,\n DEFAULT_MAP_RESOLUTION.height,\n [0, 0, 0, 1]\n );\n }\n\n return envImage;\n}\n\nexport function generateSolidMap(\n width: number,\n height: number,\n color?: ColorRGBA,\n intensity?: number\n): TextureDataSource {\n const texels = width * height;\n const floatBuffer = new Float32Array(texels * 4);\n if (color && Array.isArray(color)) {\n setBufferToColor(floatBuffer, color, intensity);\n }\n return {\n width: width,\n height: height,\n data: floatBuffer\n };\n}\n\nfunction setBufferToColor(\n buffer: WritableArrayLike<number>,\n color: ColorRGBA,\n intensity = 1\n) {\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] = color[0] * intensity;\n buffer[i++] = color[1] * intensity;\n buffer[i++] = color[2] * intensity;\n buffer[i++] = color[3];\n }\n\n return buffer;\n}\n\nfunction addAmbientLightToEnvMap(\n light: AmbientLight,\n image: TextureDataSource\n) {\n const color = light.color;\n const intensity = light.intensity;\n const buffer = image.data;\n\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] += color[0] * intensity;\n buffer[i++] += color[1] * intensity;\n buffer[i++] += color[2] * intensity;\n i++;\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TextureDataSource } from '../scene/Texture.js';
|
|
2
|
+
export interface EnvironmentMapSource extends TextureDataSource {
|
|
3
|
+
/** Stable identity shared by adapters that recreate source wrappers. */
|
|
4
|
+
distributionCacheKey?: object;
|
|
5
|
+
/** Incremented whenever the source pixels change in place. */
|
|
6
|
+
distributionCacheVersion?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function environmentMapSourcesMatch(first: EnvironmentMapSource | undefined, second: EnvironmentMapSource | undefined): boolean;
|
|
9
|
+
export declare function envMapDistribution(image: EnvironmentMapSource): TextureDataSource;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
2
|
+
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
|
+
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
|
+
const distributionCache = new WeakMap();
|
|
5
|
+
function distributionCacheIdentity(image) {
|
|
6
|
+
return image.distributionCacheKey ?? image.data;
|
|
7
|
+
}
|
|
8
|
+
export function environmentMapSourcesMatch(first, second) {
|
|
9
|
+
if (first === second)
|
|
10
|
+
return true;
|
|
11
|
+
if (!first || !second)
|
|
12
|
+
return false;
|
|
13
|
+
return (distributionCacheIdentity(first) === distributionCacheIdentity(second) &&
|
|
14
|
+
first.width === second.width &&
|
|
15
|
+
first.height === second.height &&
|
|
16
|
+
(first.distributionCacheVersion ?? 0) ===
|
|
17
|
+
(second.distributionCacheVersion ?? 0));
|
|
18
|
+
}
|
|
19
|
+
export function envMapDistribution(image) {
|
|
20
|
+
const cacheKey = distributionCacheIdentity(image);
|
|
21
|
+
const version = image.distributionCacheVersion ?? 0;
|
|
22
|
+
const cached = distributionCache.get(cacheKey);
|
|
23
|
+
if (cached &&
|
|
24
|
+
cached.width === image.width &&
|
|
25
|
+
cached.height === image.height &&
|
|
26
|
+
cached.version === version) {
|
|
27
|
+
return cached.distribution;
|
|
28
|
+
}
|
|
29
|
+
const data = image.data;
|
|
30
|
+
const cdfImage = {
|
|
31
|
+
width: image.width + 2,
|
|
32
|
+
height: image.height + 1
|
|
33
|
+
};
|
|
34
|
+
const cdf = makeTextureArray(cdfImage.width, cdfImage.height, 2);
|
|
35
|
+
const channels = Math.max(Math.floor(data.length / (image.width * image.height)), 1);
|
|
36
|
+
const sourceScale = (data instanceof Uint8Array || data instanceof Uint8ClampedArray) ? 1 / 255 : 1;
|
|
37
|
+
const luminance = new Float32Array(image.width * image.height);
|
|
38
|
+
for (let y = 0; y < image.height; y++) {
|
|
39
|
+
for (let x = 0; x < image.width; x++) {
|
|
40
|
+
const sourceIndex = channels * (y * image.width + x);
|
|
41
|
+
luminance[y * image.width + x] =
|
|
42
|
+
sourceScale * (0.2126 * data[sourceIndex]
|
|
43
|
+
+ 0.7152 * data[sourceIndex + Math.min(1, channels - 1)]
|
|
44
|
+
+ 0.0722 * data[sourceIndex + Math.min(2, channels - 1)]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Environment radiance is read with bilinear filtering while the CDF is
|
|
48
|
+
// piecewise constant. Dilating luminance over the filter footprint keeps a
|
|
49
|
+
// sharp HDR sun from leaking into a neighbouring low-PDF cell and producing
|
|
50
|
+
// fireflies. This only changes the importance distribution, not the
|
|
51
|
+
// radiance integral, so the estimator remains unbiased.
|
|
52
|
+
const filteredLuminance = (x, y) => {
|
|
53
|
+
let maximum = 0;
|
|
54
|
+
for (let dy = -1; dy <= 1; dy++) {
|
|
55
|
+
const sourceY = Math.min(image.height - 1, Math.max(0, y + dy));
|
|
56
|
+
for (let dx = -1; dx <= 1; dx++) {
|
|
57
|
+
const sourceX = Math.min(image.width - 1, Math.max(0, x + dx));
|
|
58
|
+
maximum = Math.max(maximum, luminance[sourceY * image.width + sourceX]);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return Math.max(maximum, 1e-12);
|
|
62
|
+
};
|
|
63
|
+
for (let y = 0; y < image.height; y++) {
|
|
64
|
+
const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);
|
|
65
|
+
for (let x = 0; x < image.width; x++) {
|
|
66
|
+
const weight = filteredLuminance(x, y) * sinTheta;
|
|
67
|
+
cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);
|
|
68
|
+
cdf.set(x + 1, y, 1, weight);
|
|
69
|
+
}
|
|
70
|
+
const rowIntegral = cdf.get(cdfImage.width - 1, y, 0);
|
|
71
|
+
for (let x = 1; x < cdf.width; x++) {
|
|
72
|
+
cdf.set(x, y, 0, cdf.get(x, y, 0) / rowIntegral);
|
|
73
|
+
cdf.set(x, y, 1, cdf.get(x, y, 1) / rowIntegral);
|
|
74
|
+
}
|
|
75
|
+
cdf.set(0, y + 1, 0, cdf.get(0, y, 0) + rowIntegral / image.height);
|
|
76
|
+
cdf.set(0, y, 1, rowIntegral);
|
|
77
|
+
}
|
|
78
|
+
const integral = cdf.get(0, cdf.height - 1, 0);
|
|
79
|
+
for (let y = 0; y < cdf.height; y++) {
|
|
80
|
+
cdf.set(0, y, 0, cdf.get(0, y, 0) / integral);
|
|
81
|
+
cdf.set(0, y, 1, cdf.get(0, y, 1) / integral);
|
|
82
|
+
}
|
|
83
|
+
cdfImage.data = cdf.array;
|
|
84
|
+
distributionCache.set(cacheKey, {
|
|
85
|
+
width: image.width,
|
|
86
|
+
height: image.height,
|
|
87
|
+
version,
|
|
88
|
+
distribution: cdfImage
|
|
89
|
+
});
|
|
90
|
+
return cdfImage;
|
|
91
|
+
}
|
|
92
|
+
function makeTextureArray(width, height, channels) {
|
|
93
|
+
const array = new Float32Array(channels * width * height);
|
|
94
|
+
return {
|
|
95
|
+
set(x, y, channel, val) {
|
|
96
|
+
array[channels * (y * width + x) + channel] = val;
|
|
97
|
+
},
|
|
98
|
+
get(x, y, channel) {
|
|
99
|
+
return array[channels * (y * width + x) + channel];
|
|
100
|
+
},
|
|
101
|
+
width,
|
|
102
|
+
height,
|
|
103
|
+
channels,
|
|
104
|
+
array
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=envMapDistribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envMapDistribution.js","sourceRoot":"","sources":["../../src/renderer/envMapDistribution.ts"],"names":[],"mappings":"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","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Create a piecewise 2D cumulative distribution function of light intensity from an env map\n// http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/2D_Sampling_with_Multidimensional_Transformations.html#Piecewise-Constant2DDistributions\n\nimport { TextureDataSource } from '../scene/Texture.js';\n\nexport interface EnvironmentMapSource extends TextureDataSource {\n /** Stable identity shared by adapters that recreate source wrappers. */\n distributionCacheKey?: object;\n /** Incremented whenever the source pixels change in place. */\n distributionCacheVersion?: number;\n}\n\ninterface DistributionCacheEntry {\n width: number;\n height: number;\n version: number;\n distribution: TextureDataSource;\n}\n\nconst distributionCache = new WeakMap<object, DistributionCacheEntry>();\n\nfunction distributionCacheIdentity(image: EnvironmentMapSource) {\n return image.distributionCacheKey ?? image.data;\n}\n\nexport function environmentMapSourcesMatch(\n first: EnvironmentMapSource | undefined,\n second: EnvironmentMapSource | undefined\n) {\n if (first === second) return true;\n if (!first || !second) return false;\n return (\n distributionCacheIdentity(first) === distributionCacheIdentity(second) &&\n first.width === second.width &&\n first.height === second.height &&\n (first.distributionCacheVersion ?? 0) ===\n (second.distributionCacheVersion ?? 0)\n );\n}\n\nexport function envMapDistribution(\n image: EnvironmentMapSource\n): TextureDataSource {\n const cacheKey = distributionCacheIdentity(image);\n const version = image.distributionCacheVersion ?? 0;\n const cached = distributionCache.get(cacheKey);\n if (\n cached &&\n cached.width === image.width &&\n cached.height === image.height &&\n cached.version === version\n ) {\n return cached.distribution;\n }\n const data = image.data;\n\n const cdfImage = {\n width: image.width + 2,\n height: image.height + 1\n } as TextureDataSource;\n\n const cdf = makeTextureArray(cdfImage.width, cdfImage.height, 2);\n\n const channels = Math.max(\n Math.floor(data.length / (image.width * image.height)),\n 1\n );\n const sourceScale = (data instanceof Uint8Array || data instanceof Uint8ClampedArray) ? 1 / 255 : 1;\n const luminance = new Float32Array(image.width * image.height);\n for (let y = 0; y < image.height; y++) {\n for (let x = 0; x < image.width; x++) {\n const sourceIndex = channels * (y * image.width + x);\n luminance[y * image.width + x] =\n sourceScale * (\n 0.2126 * data[sourceIndex]\n + 0.7152 * data[sourceIndex + Math.min(1, channels - 1)]\n + 0.0722 * data[sourceIndex + Math.min(2, channels - 1)]\n );\n }\n }\n\n // Environment radiance is read with bilinear filtering while the CDF is\n // piecewise constant. Dilating luminance over the filter footprint keeps a\n // sharp HDR sun from leaking into a neighbouring low-PDF cell and producing\n // fireflies. This only changes the importance distribution, not the\n // radiance integral, so the estimator remains unbiased.\n const filteredLuminance = (x: number, y: number) => {\n let maximum = 0;\n for (let dy = -1; dy <= 1; dy++) {\n const sourceY = Math.min(image.height - 1, Math.max(0, y + dy));\n for (let dx = -1; dx <= 1; dx++) {\n const sourceX = Math.min(image.width - 1, Math.max(0, x + dx));\n maximum = Math.max(\n maximum,\n luminance[sourceY * image.width + sourceX]\n );\n }\n }\n return Math.max(maximum, 1e-12);\n };\n\n for (let y = 0; y < image.height; y++) {\n const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);\n for (let x = 0; x < image.width; x++) {\n const weight = filteredLuminance(x, y) * sinTheta;\n cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);\n cdf.set(x + 1, y, 1, weight);\n }\n\n const rowIntegral = cdf.get(cdfImage.width - 1, y, 0);\n\n for (let x = 1; x < cdf.width; x++) {\n cdf.set(x, y, 0, cdf.get(x, y, 0) / rowIntegral);\n cdf.set(x, y, 1, cdf.get(x, y, 1) / rowIntegral);\n }\n\n cdf.set(0, y + 1, 0, cdf.get(0, y, 0) + rowIntegral / image.height);\n cdf.set(0, y, 1, rowIntegral);\n }\n\n const integral = cdf.get(0, cdf.height - 1, 0);\n\n for (let y = 0; y < cdf.height; y++) {\n cdf.set(0, y, 0, cdf.get(0, y, 0) / integral);\n cdf.set(0, y, 1, cdf.get(0, y, 1) / integral);\n }\n cdfImage.data = cdf.array;\n\n distributionCache.set(cacheKey, {\n width: image.width,\n height: image.height,\n version,\n distribution: cdfImage\n });\n\n return cdfImage;\n}\n\nfunction makeTextureArray(width: number, height: number, channels: number) {\n const array = new Float32Array(channels * width * height);\n\n return {\n set(x: number, y: number, channel: number, val: number) {\n array[channels * (y * width + x) + channel] = val;\n },\n get(x: number, y: number, channel: number) {\n return array[channels * (y * width + x) + channel];\n },\n width,\n height,\n channels,\n array\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function float16Bits(value: number): number;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Round to nearest, ties to even, matching RGBA16F storage on both backends.
|
|
2
|
+
function roundEven(value) {
|
|
3
|
+
const integer = Math.floor(value);
|
|
4
|
+
const fraction = value - integer;
|
|
5
|
+
return integer + Number(fraction > 0.5 || fraction === 0.5 && integer % 2 === 1);
|
|
6
|
+
}
|
|
7
|
+
export function float16Bits(value) {
|
|
8
|
+
const sign = value < 0 || Object.is(value, -0) ? 0x8000 : 0;
|
|
9
|
+
const absolute = Math.abs(value);
|
|
10
|
+
if (Number.isNaN(absolute))
|
|
11
|
+
return 0x7e00;
|
|
12
|
+
if (absolute >= 65520)
|
|
13
|
+
return sign | 0x7c00;
|
|
14
|
+
if (absolute < 2 ** -14)
|
|
15
|
+
return sign | roundEven(absolute * 2 ** 24);
|
|
16
|
+
const exponent = Math.floor(Math.log2(absolute));
|
|
17
|
+
return sign | ((exponent + 14) * 1024 + roundEven(absolute / 2 ** (exponent - 10)));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=float16.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"float16.js","sourceRoot":"","sources":["../../src/renderer/float16.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACjC,OAAO,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,GAAG,IAAI,QAAQ,KAAK,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,QAAQ,IAAI,KAAK;QAAE,OAAO,IAAI,GAAG,MAAM,CAAC;IAC5C,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC","sourcesContent":["// Round to nearest, ties to even, matching RGBA16F storage on both backends.\nfunction roundEven(value: number) {\n const integer = Math.floor(value);\n const fraction = value - integer;\n return integer + Number(fraction > 0.5 || fraction === 0.5 && integer % 2 === 1);\n}\n\nexport function float16Bits(value: number): number {\n const sign = value < 0 || Object.is(value, -0) ? 0x8000 : 0;\n const absolute = Math.abs(value);\n if (Number.isNaN(absolute)) return 0x7e00;\n if (absolute >= 65520) return sign | 0x7c00;\n if (absolute < 2 ** -14) return sign | roundEven(absolute * 2 ** 24);\n const exponent = Math.floor(Math.log2(absolute));\n return sign | ((exponent + 14) * 1024 + roundEven(absolute / 2 ** (exponent - 10)));\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TinyBvhLayout } from '../tinybvh/TinyBvhBuilder.js';
|
|
2
|
+
import type Geometry from '../scene/Geometry.js';
|
|
3
|
+
import type { FlattendBVH } from './bvhAccel.js';
|
|
4
|
+
export interface BvhBuildConfig {
|
|
5
|
+
builder: 'builtin' | 'tinybvh';
|
|
6
|
+
layout: TinyBvhLayout;
|
|
7
|
+
spatialSplits: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function geometryBvhConfigMatches(geometry: Geometry, config: BvhBuildConfig): boolean;
|
|
10
|
+
export declare function getGeometryBvh(geometry: Geometry): FlattendBVH | undefined;
|
|
11
|
+
export declare function setGeometryBvh(geometry: Geometry, bvh: FlattendBVH | undefined, config?: BvhBuildConfig): void;
|