@meimu/mutracer 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/README.md +3 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +9328 -7614
- package/docs/api.md +83 -35
- package/docs/caustics.md +80 -0
- package/docs/materials.md +9 -6
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +53 -9
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +122 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/updates.md +3 -1
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +18 -6
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -1
- package/lib/Engine.js +77 -14
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +81 -24
- package/lib/Render.js +201 -26
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -3
- package/lib/RenderLoop.js +68 -44
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +4 -2
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/GPUTraceQueue.d.ts +2 -1
- package/lib/renderer/GPUTraceQueue.js +3 -1
- package/lib/renderer/GPUTraceQueue.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +11 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
- package/lib/renderer/WGPUCausticLightPass.js +217 -0
- package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
- package/lib/renderer/WGPUPhotonMap.js +191 -0
- package/lib/renderer/WGPUPhotonMap.js.map +1 -0
- package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
- package/lib/renderer/WGPURayTraceOutput.js +122 -28
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +65 -21
- package/lib/renderer/WGPURayTracePass.js +730 -409
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +110 -68
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
- package/lib/renderer/WebGLFullQuadPass.js +10 -0
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
- package/lib/renderer/WebGLRayTracePass.js +157 -116
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +17 -14
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +60 -60
- package/lib/renderer/accumulationTarget.d.ts +2 -1
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/causticDiagnostics.d.ts +31 -0
- package/lib/renderer/causticDiagnostics.js +5 -0
- package/lib/renderer/causticDiagnostics.js.map +1 -0
- package/lib/renderer/causticEmission.d.ts +10 -0
- package/lib/renderer/causticEmission.js +40 -0
- package/lib/renderer/causticEmission.js.map +1 -0
- package/lib/renderer/causticUniform.d.ts +12 -0
- package/lib/renderer/causticUniform.js +22 -0
- package/lib/renderer/causticUniform.js.map +1 -0
- package/lib/renderer/caustics.d.ts +16 -0
- package/lib/renderer/caustics.js +93 -0
- package/lib/renderer/caustics.js.map +1 -0
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +45 -37
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
- package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
- package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +13 -7
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +338 -252
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/lightSampling.d.ts +3 -2
- package/lib/renderer/lightSampling.js +14 -8
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +5 -4
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +5 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +31 -0
- package/lib/renderer/researchTransport.js +5 -0
- package/lib/renderer/researchTransport.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
- package/lib/renderer/sceneLayoutSchema.js +3 -3
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.d.ts +21 -0
- package/lib/renderer/spectrum.js +154 -0
- package/lib/renderer/spectrum.js.map +1 -0
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglLightSampling.d.ts +39 -0
- package/lib/renderer/webglLightSampling.js +15 -0
- package/lib/renderer/webglLightSampling.js.map +1 -0
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +3 -3
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +3 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +539 -0
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
- package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
- package/lib/renderer/wgsl/photonMap.compute.js +352 -0
- package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +2 -2
- package/lib/scene/MaterialState.js +2 -2
- package/lib/scene/MaterialState.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +22 -0
- package/lib/settings/render.js +2 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +23 -16
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +2 -1
- package/package.json +7 -4
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightSampling.js","sourceRoot":"","sources":["../../src/renderer/lightSampling.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\nimport { materialEmission } from './materialEmission.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getSpotLightShapingFluxFactor } from './lightsData.js';\nimport { localMaterialIndex } from './materialIndices.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { type TexturePixelSource, vec3 } from '../math.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport Geometry from '../scene/Geometry.js';\nimport type Mesh from '../scene/MeshState.js';\nimport type RectLight from '../scene/RectLightState.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport IESProfile from '../scene/IESProfile.js';\nimport type OpenPBRMaterial from '../scene/MaterialState.js';\n\nimport { LIGHT_CHOICE_EMISSIVE_TRIANGLE } from './lightConstants.js';\nexport * from './lightConstants.js';\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n\nexport interface EmissiveTriangle {\n p0: Float32Array;\n p1: Float32Array;\n p2: Float32Array;\n uv0: [number, number];\n uv1: [number, number];\n uv2: [number, number];\n secondaryUv0: [number, number];\n secondaryUv1: [number, number];\n secondaryUv2: [number, number];\n materialIndex: number;\n area: number;\n samplingLuminance: number;\n selectionPmf: number;\n}\n\nexport interface EmissiveMeshBinding {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n}\n\nexport interface LightChoiceInput {\n sourceType: number;\n sourceIndex: number;\n weight: number;\n}\n\nexport interface LightSamplingDistribution {\n choices: Uint32Array;\n pmfs: Float32Array;\n totalWeight: number;\n}\n\nconst luminanceCoefficients = [0.2126, 0.7152, 0.0722] as const;\n\nexport function colorLuminance<T extends ArrayLike<number>>(color: T) {\n return Math.max(\n color[0] * luminanceCoefficients[0] +\n color[1] * luminanceCoefficients[1] +\n color[2] * luminanceCoefficients[2],\n 0\n );\n}\n\nexport function estimateAnalyticLightPower(light: AnalyticLight) {\n const emittedLuminance = colorLuminance(light.color) * light.intensity;\n if (!(emittedLuminance > 0)) return 0;\n if (light.type === 'RectLight') {\n return emittedLuminance * Math.PI * Math.max(getRectLightArea(light), 0);\n }\n if (light.type === 'SphereLight') {\n if (light.radius === 0) return emittedLuminance * 4 * Math.PI;\n return emittedLuminance * Math.PI * Math.max(getSphereLightArea(light), 0);\n }\n if (light.type === 'SpotLight') {\n const radianceLuminance =\n colorLuminance(light.color) * getSpotLightRadiance(light);\n // The selection power is an approximation and ignores the IES profile.\n if (light.radius === 0) {\n return emittedLuminance *\n 4 * Math.PI *\n getSpotLightShapingFluxFactor(light);\n }\n return (\n radianceLuminance *\n Math.PI *\n getSpotLightArea(light) *\n getSpotLightShapingFluxFactor(light)\n );\n }\n // A directional light has no finite emitting area. 4π keeps its heuristic\n // weight on roughly the same scale as an environment map integral.\n return emittedLuminance * 4 * Math.PI;\n}\n\nexport function sphereSolidAnglePdf(distanceToCenter: number, radius: number) {\n if (distanceToCenter <= radius) return 1 / (4 * Math.PI);\n const cosThetaMax = Math.sqrt(\n Math.max(0, 1 - radius * radius / (distanceToCenter * distanceToCenter))\n );\n return 1 / Math.max(2 * Math.PI * (1 - cosThetaMax), 1e-8);\n}\n\n/** Packs unique 128² peak-normalized IES profiles four scalar samples per texel. */\nexport function packIESProfiles(lights: AnalyticLight[], firstTexel = 0) {\n const offsets = new Int32Array(lights.length).fill(-1);\n const profiles: IESProfile[] = [];\n const indices = new Map<IESProfile, number>();\n lights.forEach((light, index) => {\n if (light.type !== 'SpotLight' || !light.iesProfile) return;\n let profileIndex = indices.get(light.iesProfile);\n if (profileIndex == null) {\n profileIndex = profiles.length;\n indices.set(light.iesProfile, profileIndex);\n profiles.push(light.iesProfile);\n }\n offsets[index] = firstTexel + profileIndex * ((128 * 128) / 4);\n });\n const data = new Float32Array(profiles.length * 128 * 128);\n profiles.forEach((profile, index) => data.set(profile.data, index * 128 * 128));\n return { data, offsets, texelCount: data.length / 4 };\n}\n\n// Keep the input object identity across native record-width conversions.\nconst environmentPowers = new WeakMap<object, number>();\n\nexport function estimateEnvironmentPower<T extends TexturePixelSource>(image?: T) {\n if (!image?.data || !image.width || !image.height) return 0;\n const cached = environmentPowers.get(image);\n if (cached !== undefined) return cached;\n const { data, width, height } = image;\n const power = environmentPower(data, width, height);\n environmentPowers.set(image, power);\n return power;\n}\n\n/** Reusable typed choices; insertion order matches the sampling distribution. */\nexport class LightChoiceBuffer {\n count = 0;\n sourceTypes = new Uint32Array(0);\n sourceIndices = new Uint32Array(0);\n weights = new Float64Array(0);\n reserve(capacity: number) {\n this.count = 0;\n if (this.weights.length < capacity) {\n this.sourceTypes = new Uint32Array(capacity);\n this.sourceIndices = new Uint32Array(capacity);\n this.weights = new Float64Array(capacity);\n }\n }\n push(sourceType: number, sourceIndex: number, weight: number) {\n if (!(weight > 0) || !isFinite(weight)) return;\n const i = this.count++;\n this.sourceTypes[i] = sourceType; this.sourceIndices[i] = sourceIndex; this.weights[i] = weight;\n }\n}\n\n/** Builds a Walker alias table. Each 16-byte entry is probability/alias/type/index. */\nexport function buildLightAliasTable(inputs: LightChoiceInput[] | LightChoiceBuffer): LightSamplingDistribution {\n let active: LightChoiceBuffer;\n if (!Array.isArray(inputs)) active = inputs;\n else {\n active = new LightChoiceBuffer(); active.reserve(inputs.length);\n for (const input of inputs) active.push(input.sourceType, input.sourceIndex, input.weight);\n }\n const count = active.count;\n let totalWeight = 0;\n for (let i = 0; i < count; i++) totalWeight += active.weights[i];\n if (!count || !(totalWeight > 0)) return { choices: new Uint32Array(4), pmfs: new Float32Array(0), totalWeight: 0 };\n const pmfs = new Float32Array(count);\n const scaled = new Float64Array(count);\n const small = new Uint32Array(count), large = new Uint32Array(count);\n let smallCount = 0, largeCount = 0;\n for (let i = 0; i < count; i++) {\n pmfs[i] = active.weights[i] / totalWeight;\n scaled[i] = pmfs[i] * count;\n if (scaled[i] < 1) small[smallCount++] = i; else large[largeCount++] = i;\n }\n const buffer = new ArrayBuffer(count * 16);\n const floats = new Float32Array(buffer), ints = new Int32Array(buffer);\n while (smallCount && largeCount) {\n const low = small[--smallCount] + 0, high = large[--largeCount] + 0;\n floats[low * 4] = scaled[low]; ints[low * 4 + 1] = high;\n scaled[high] = scaled[high] + scaled[low] - 1;\n if (scaled[high] < 1) small[smallCount++] = high; else large[largeCount++] = high;\n }\n for (let i = 0; i < smallCount; i++) { const index = small[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < largeCount; i++) { const index = large[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < count; i++) { ints[i * 4 + 2] = active.sourceTypes[i]; ints[i * 4 + 3] = active.sourceIndices[i]; }\n return { choices: new Uint32Array(buffer), pmfs, totalWeight };\n}\n\n/**\n * Builds the table a shadow catcher draws its occlusion tests from: the\n * environment and analytic lights of `choices` at their relative weights.\n * Emissive meshes are scene objects, not light already present in the plate\n * the catcher darkens, so their occlusion is not catcher shadow. Returns\n * `undefined` when `choices` holds no emissive triangle and the catcher can\n * share the main table.\n */\nexport function buildShadowCatcherLightAliasTable(\n choices: LightChoiceBuffer,\n scratch = new LightChoiceBuffer()\n): LightSamplingDistribution | undefined {\n let emissive = 0;\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] === LIGHT_CHOICE_EMISSIVE_TRIANGLE) emissive++;\n }\n if (!emissive) return undefined;\n scratch.reserve(choices.count - emissive);\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] !== LIGHT_CHOICE_EMISSIVE_TRIANGLE) {\n scratch.push(choices.sourceTypes[i], choices.sourceIndices[i], choices.weights[i]);\n }\n }\n return buildLightAliasTable(scratch);\n}\n\nfunction dominantLocalMaterial(geometry: Geometry, indices: Uint32Array, triangleOffset: number, materialCount: number) {\n // Public triangles have the same raw material index on all three corners.\n return localMaterialIndex(geometry, indices[triangleOffset], materialCount);\n}\n\nexport function collectEmissiveTriangles(\n bindings: EmissiveMeshBinding[],\n materials: OpenPBRMaterial[]\n) {\n const triangles: EmissiveTriangle[] = [];\n const local = [vec3.create(), vec3.create(), vec3.create()];\n const world = [vec3.create(), vec3.create(), vec3.create()];\n const edge0 = vec3.create();\n const edge1 = vec3.create();\n const cross = vec3.create();\n\n for (const { mesh, geometry, materialIndices } of bindings) {\n // Emission is constant during this synchronous collection. Compute it once\n // per local material table instead of allocating an RGB array per triangle.\n const samplingLuminances: number[] = [];\n for (let local = 0; local < Math.max(1, materialIndices.length); local++) {\n const material = materials[materialIndices[local] ?? materialIndices[0] ?? 0];\n samplingLuminances.push(!material || material.shadowCatcher || material.unlit\n ? 0 : colorLuminance(materialEmission(material)));\n }\n const matrix = new Float64Array(16), parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n meshInstanceTransform(mesh, instance, matrix, parent);\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n const uvs = geometry.uv?.array;\n const secondaryUvs = geometry.uv1?.array ?? uvs;\n for (let triangleOffset = 0; triangleOffset < attributeLength(indices); triangleOffset += 3) {\n const localMaterialIndex = dominantLocalMaterial(geometry, indices, triangleOffset, materialIndices.length);\n const materialIndex = materialIndices[localMaterialIndex] ?? materialIndices[0] ?? 0;\n const samplingLuminance = samplingLuminances[localMaterialIndex];\n if (!(samplingLuminance > 1e-8)) continue;\n\n const triangleIndices = [\n attributeValue(indices, triangleOffset),\n attributeValue(indices, triangleOffset + 1),\n attributeValue(indices, triangleOffset + 2)\n ];\n for (let corner = 0; corner < 3; corner++) {\n const vertex = triangleIndices[corner];\n vec3.set(\n local[corner],\n positions[vertex * geometry.position.itemSize],\n positions[vertex * geometry.position.itemSize + 1],\n positions[vertex * geometry.position.itemSize + 2]\n );\n vec3.transformMat4(world[corner], local[corner], matrix);\n }\n vec3.sub(edge0, world[1], world[0]);\n vec3.sub(edge1, world[2], world[0]);\n vec3.cross(cross, edge0, edge1);\n const area = 0.5 * vec3.length(cross);\n if (!(area > 1e-10) || !isFinite(area)) continue;\n\n const triangleUvs = triangleIndices.map((vertex) =>\n uvs\n ? [uvs[vertex * 2], uvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n const triangleSecondaryUvs = triangleIndices.map((vertex) =>\n secondaryUvs\n ? [secondaryUvs[vertex * 2], secondaryUvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n triangles.push({\n p0: vec3.clone(world[0]),\n p1: vec3.clone(world[1]),\n p2: vec3.clone(world[2]),\n uv0: triangleUvs[0],\n uv1: triangleUvs[1],\n uv2: triangleUvs[2],\n secondaryUv0: triangleSecondaryUvs[0],\n secondaryUv1: triangleSecondaryUvs[1],\n secondaryUv2: triangleSecondaryUvs[2],\n materialIndex,\n area,\n samplingLuminance,\n selectionPmf: 0\n });\n }\n }\n }\n return triangles;\n}\n\nfunction packEmissivePoint(data: Float32Array, offset: number, point: Float32Array) {\n // Preserve TypedArray.set's overlapping-view semantics for callers with aliases.\n if (data.buffer === point.buffer) {data.set(point, offset); return;}\n data[offset] = point[0]; data[offset + 1] = point[1]; data[offset + 2] = point[2];\n}\nexport function packEmissiveTriangles(triangles: EmissiveTriangle[], data: Float32Array = new Float32Array(Math.max(triangles.length, 1) * 24)) {\n triangles.forEach((triangle, index) => {\n const offset = index * 24;\n packEmissivePoint(data, offset, triangle.p0);\n data[offset + 3] = triangle.selectionPmf;\n packEmissivePoint(data, offset + 4, triangle.p1);\n data[offset + 7] = triangle.area;\n packEmissivePoint(data, offset + 8, triangle.p2);\n data[offset + 11] = triangle.materialIndex;\n data[offset + 12] = triangle.uv0[0]; data[offset + 13] = triangle.uv0[1];\n data[offset + 14] = triangle.uv1[0]; data[offset + 15] = triangle.uv1[1];\n data[offset + 16] = triangle.uv2[0]; data[offset + 17] = triangle.uv2[1];\n data[offset + 18] = triangle.secondaryUv0[0]; data[offset + 19] = triangle.secondaryUv0[1];\n data[offset + 20] = triangle.secondaryUv1[0]; data[offset + 21] = triangle.secondaryUv1[1];\n data[offset + 22] = triangle.secondaryUv2[0]; data[offset + 23] = triangle.secondaryUv2[1];\n });\n return data;\n}\n\n\ninterface EmissiveCacheEntry { geometry: Geometry; version: number; instanceVersion: number; instanceCount: number; instanceTransforms?: Float32Array; matrix: Float64Array;\n indices: number[]; activity: boolean[]; triangles: EmissiveTriangle[] }\n\n// WeakMap class fields have no native representation in scriptc 0.3.2.\n// Keep the same per-cache weak ownership in a module-owned registry.\nconst emissiveBindings = new WeakMap<EmissiveTriangleCache, WeakMap<Mesh, EmissiveCacheEntry>>();\n\n/** Caches world-space vertices per mesh, independently of emission strength. */\nexport class EmissiveTriangleCache {\n constructor() { emissiveBindings.set(this, new WeakMap()); }\n private _triangles: EmissiveTriangle[] = [];\n collect(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]) {\n const cachedBindings = emissiveBindings.get(this)!;\n this._triangles.length = 0;\n for (const binding of bindings) {\n const { mesh, geometry, materialIndices } = binding;\n const isActive = (index: number) => {\n const m = materials[index];\n return !!m && !m.unlit && !m.shadowCatcher && colorLuminance(materialEmission(m)) > 1e-8;\n };\n const instanceVersion = mesh.instanceData?.transformsVersion ?? 0;\n const instanceCount = meshInstanceCount(mesh);\n const instanceTransforms = mesh.instanceData?.transforms;\n let cached = cachedBindings.get(mesh);\n if (!cached || cached.geometry !== geometry || cached.version !== geometry.version || cached.instanceVersion !== instanceVersion || cached.instanceCount !== instanceCount || cached.instanceTransforms !== instanceTransforms ||\n cached.indices.length !== materialIndices.length || materialIndices.some((index, i) =>\n cached!.indices[i] !== index || cached!.activity[i] !== isActive(index)) ||\n meshMatrixChanged(mesh, cached.matrix)) {\n cached = { geometry, version: geometry.version, instanceVersion, instanceCount, instanceTransforms, matrix: copyMeshMatrix(mesh),\n indices: materialIndices.slice(), activity: materialIndices.map(isActive),\n triangles: collectEmissiveTriangles([binding], materials) };\n cachedBindings.set(mesh, cached);\n } else {\n for (const triangle of cached.triangles) {\n const m = materials[triangle.materialIndex];\n triangle.samplingLuminance = colorLuminance(materialEmission(m));\n }\n }\n for (const triangle of cached.triangles) this._triangles.push(triangle);\n }\n return this._triangles;\n }\n}\n\nfunction copyMeshMatrix(mesh: Mesh): Float64Array { return matrixStorage(mesh.transform); }\nfunction meshMatrixChanged(mesh: Mesh, previous: Float64Array): boolean {\n const matrix = matrixStorage(mesh.transform);\n for (let i = 0; i < matrix.length; i++) if (!Object.is(matrix[i], previous[i])) return true;\n return false;\n}\n\nfunction environmentPower(data: NonNullable<TexturePixelSource['data']>, width: number, height: number): number {\n if (data instanceof Uint8Array) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentPowerKernel(data, width, height, 1);\n return environmentPowerKernel(data, width, height, 1);\n}\n\nfunction environmentPowerKernel<T extends NonNullable<TexturePixelSource['data']>>(data: T, width: number, height: number, scale: number): number {\n const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);\n let weightedLuminance = 0;\n for (let y = 0; y < height; y++) {\n const sinTheta = Math.sin(Math.PI * (y + 0.5) / height);\n for (let x = 0; x < width; x++) {\n const offset = (y * width + x) * channels;\n weightedLuminance +=\n colorLuminance([\n pixelValue(data, offset) * scale,\n pixelValue(data, offset + Math.min(1, channels - 1)) * scale,\n pixelValue(data, offset + Math.min(2, channels - 1)) * scale\n ]) * sinTheta;\n }\n }\n return weightedLuminance * (2 * Math.PI * Math.PI) / (width * height);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lightSampling.js","sourceRoot":"","sources":["../../src/renderer/lightSampling.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\nimport { materialEmission } from './materialEmission.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getSpotLightShapingFluxFactor } from './lightsData.js';\nimport { localMaterialIndex } from './materialIndices.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { type TexturePixelSource, vec3 } from '../math.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport Geometry from '../scene/Geometry.js';\nimport type Mesh from '../scene/MeshState.js';\nimport type RectLight from '../scene/RectLightState.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport IESProfile from '../scene/IESProfile.js';\nimport type OpenPBRMaterial from '../scene/MaterialState.js';\n\nimport { LIGHT_CHOICE_EMISSIVE_TRIANGLE } from './lightConstants.js';\nexport * from './lightConstants.js';\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n\nexport interface EmissiveTriangle {\n p0: Float32Array;\n p1: Float32Array;\n p2: Float32Array;\n uv0: [number, number];\n uv1: [number, number];\n uv2: [number, number];\n secondaryUv0: [number, number];\n secondaryUv1: [number, number];\n secondaryUv2: [number, number];\n materialIndex: number;\n area: number;\n samplingLuminance: number;\n selectionPmf: number;\n}\n\nexport interface EmissiveMeshBinding {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n}\n\nexport interface LightChoiceInput {\n sourceType: number;\n sourceIndex: number;\n weight: number;\n}\n\nexport interface LightSamplingDistribution {\n choices: Uint32Array;\n pmfs: Float32Array;\n totalWeight: number;\n}\n\nconst luminanceCoefficients = [0.2126, 0.7152, 0.0722] as const;\n\nexport function colorLuminance<T extends ArrayLike<number>>(color: T) {\n return Math.max(\n color[0] * luminanceCoefficients[0] +\n color[1] * luminanceCoefficients[1] +\n color[2] * luminanceCoefficients[2],\n 0\n );\n}\n\nexport function estimateAnalyticLightPower(light: AnalyticLight) {\n const emittedLuminance = colorLuminance(light.color) * light.intensity;\n if (!(emittedLuminance > 0)) return 0;\n if (light.type === 'RectLight') {\n return emittedLuminance * Math.PI * Math.max(getRectLightArea(light), 0);\n }\n if (light.type === 'SphereLight') {\n if (light.radius === 0) return emittedLuminance * 4 * Math.PI;\n return emittedLuminance * Math.PI * Math.max(getSphereLightArea(light), 0);\n }\n if (light.type === 'SpotLight') {\n const radianceLuminance =\n colorLuminance(light.color) * getSpotLightRadiance(light);\n // The selection power is an approximation and ignores the IES profile.\n if (light.radius === 0) {\n return emittedLuminance *\n 4 * Math.PI *\n getSpotLightShapingFluxFactor(light);\n }\n return (\n radianceLuminance *\n Math.PI *\n getSpotLightArea(light) *\n getSpotLightShapingFluxFactor(light)\n );\n }\n // A directional light has no finite emitting area. 4π keeps its heuristic\n // weight on roughly the same scale as an environment map integral.\n return emittedLuminance * 4 * Math.PI;\n}\n\nexport function sphereSolidAnglePdf(distanceToCenter: number, radius: number) {\n if (distanceToCenter <= radius) return 1 / (4 * Math.PI);\n const sinThetaMaxSquared = Math.min(1, radius * radius / (distanceToCenter * distanceToCenter));\n const cosThetaMax = Math.sqrt(Math.max(0, 1 - sinThetaMaxSquared));\n const oneMinusCosThetaMax = sinThetaMaxSquared / (1 + cosThetaMax);\n return 1 / Math.max(2 * Math.PI * oneMinusCosThetaMax, 1e-8);\n}\n\n/** Packs unique 128² peak-normalized IES profiles four scalar samples per texel. */\nexport function packIESProfiles(lights: AnalyticLight[], firstTexel = 0) {\n const offsets = new Int32Array(lights.length).fill(-1);\n const profiles: IESProfile[] = [];\n const indices = new Map<IESProfile, number>();\n lights.forEach((light, index) => {\n if (light.type !== 'SpotLight' || !light.iesProfile) return;\n let profileIndex = indices.get(light.iesProfile);\n if (profileIndex == null) {\n profileIndex = profiles.length;\n indices.set(light.iesProfile, profileIndex);\n profiles.push(light.iesProfile);\n }\n offsets[index] = firstTexel + profileIndex * ((128 * 128) / 4);\n });\n const data = new Float32Array(profiles.length * 128 * 128);\n profiles.forEach((profile, index) => data.set(profile.data, index * 128 * 128));\n return { data, offsets, texelCount: data.length / 4 };\n}\n\n// Keep the input object identity across native record-width conversions.\nconst environmentPowers = new WeakMap<object, number>();\n\nexport function estimateEnvironmentPower<T extends TexturePixelSource>(image?: T) {\n if (!image?.data || !image.width || !image.height) return 0;\n const cached = environmentPowers.get(image);\n if (cached !== undefined) return cached;\n const { data, width, height } = image;\n const power = environmentPower(data, width, height);\n environmentPowers.set(image, power);\n return power;\n}\n\n/** Reusable typed choices; insertion order matches the sampling distribution. */\nexport class LightChoiceBuffer {\n count = 0;\n sourceTypes = new Uint32Array(0);\n sourceIndices = new Uint32Array(0);\n weights = new Float64Array(0);\n reserve(capacity: number) {\n this.count = 0;\n if (this.weights.length < capacity) {\n this.sourceTypes = new Uint32Array(capacity);\n this.sourceIndices = new Uint32Array(capacity);\n this.weights = new Float64Array(capacity);\n }\n }\n push(sourceType: number, sourceIndex: number, weight: number) {\n if (!(weight > 0) || !isFinite(weight)) return;\n const i = this.count++;\n this.sourceTypes[i] = sourceType; this.sourceIndices[i] = sourceIndex; this.weights[i] = weight;\n }\n}\n\n/** Builds a Walker alias table. Each 16-byte entry is probability/alias/type/index. */\nexport function buildLightAliasTable(inputs: LightChoiceInput[] | LightChoiceBuffer): LightSamplingDistribution {\n let active: LightChoiceBuffer;\n if (!Array.isArray(inputs)) active = inputs;\n else {\n active = new LightChoiceBuffer(); active.reserve(inputs.length);\n for (const input of inputs) active.push(input.sourceType, input.sourceIndex, input.weight);\n }\n const count = active.count;\n let totalWeight = 0;\n for (let i = 0; i < count; i++) totalWeight += active.weights[i];\n if (!count || !(totalWeight > 0)) return { choices: new Uint32Array(4), pmfs: new Float32Array(0), totalWeight: 0 };\n const pmfs = new Float32Array(count);\n const scaled = new Float64Array(count);\n const small = new Uint32Array(count), large = new Uint32Array(count);\n let smallCount = 0, largeCount = 0;\n for (let i = 0; i < count; i++) {\n pmfs[i] = active.weights[i] / totalWeight;\n scaled[i] = pmfs[i] * count;\n if (scaled[i] < 1) small[smallCount++] = i; else large[largeCount++] = i;\n }\n const buffer = new ArrayBuffer(count * 16);\n const floats = new Float32Array(buffer), ints = new Int32Array(buffer);\n while (smallCount && largeCount) {\n const low = small[--smallCount] + 0, high = large[--largeCount] + 0;\n floats[low * 4] = scaled[low]; ints[low * 4 + 1] = high;\n scaled[high] = scaled[high] + scaled[low] - 1;\n if (scaled[high] < 1) small[smallCount++] = high; else large[largeCount++] = high;\n }\n for (let i = 0; i < smallCount; i++) { const index = small[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < largeCount; i++) { const index = large[i]; floats[index * 4] = 1; ints[index * 4 + 1] = index; }\n for (let i = 0; i < count; i++) { ints[i * 4 + 2] = active.sourceTypes[i]; ints[i * 4 + 3] = active.sourceIndices[i]; }\n return { choices: new Uint32Array(buffer), pmfs, totalWeight };\n}\n\n/**\n * Builds the table a shadow catcher draws its occlusion tests from: the\n * environment and analytic lights of `choices` at their relative weights.\n * Emissive meshes are scene objects, not light already present in the plate\n * the catcher darkens, so their occlusion is not catcher shadow. Returns\n * `undefined` when `choices` holds no emissive triangle and the catcher can\n * share the main table.\n */\nexport function buildShadowCatcherLightAliasTable(\n choices: LightChoiceBuffer,\n scratch = new LightChoiceBuffer()\n): LightSamplingDistribution | undefined {\n let emissive = 0;\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] === LIGHT_CHOICE_EMISSIVE_TRIANGLE) emissive++;\n }\n if (!emissive) return undefined;\n scratch.reserve(choices.count - emissive);\n for (let i = 0; i < choices.count; i++) {\n if (choices.sourceTypes[i] !== LIGHT_CHOICE_EMISSIVE_TRIANGLE) {\n scratch.push(choices.sourceTypes[i], choices.sourceIndices[i], choices.weights[i]);\n }\n }\n return buildLightAliasTable(scratch);\n}\n\nfunction dominantLocalMaterial(geometry: Geometry, indices: Uint32Array, triangleOffset: number, materialCount: number) {\n // Public triangles have the same raw material index on all three corners.\n return localMaterialIndex(geometry, indices[triangleOffset], materialCount);\n}\n\nexport function collectEmissiveTriangles(\n bindings: EmissiveMeshBinding[],\n materials: OpenPBRMaterial[],\n samplingWeight?: (material:OpenPBRMaterial)=>number\n) {\n const triangles: EmissiveTriangle[] = [];\n const local = [vec3.create(), vec3.create(), vec3.create()];\n const world = [vec3.create(), vec3.create(), vec3.create()];\n const edge0 = vec3.create();\n const edge1 = vec3.create();\n const cross = vec3.create();\n\n for (const { mesh, geometry, materialIndices } of bindings) {\n // Emission is constant during this synchronous collection. Compute it once\n // per local material table instead of allocating an RGB array per triangle.\n const samplingLuminances: number[] = [];\n for (let local = 0; local < Math.max(1, materialIndices.length); local++) {\n const material = materials[materialIndices[local] ?? materialIndices[0] ?? 0];\n samplingLuminances.push(!material || material.shadowCatcher || material.unlit\n ? 0 : (samplingWeight?samplingWeight(material):colorLuminance(materialEmission(material))));\n }\n const matrix = new Float64Array(16), parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n meshInstanceTransform(mesh, instance, matrix, parent);\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n const uvs = geometry.uv?.array;\n const secondaryUvs = geometry.uv1?.array ?? uvs;\n for (let triangleOffset = 0; triangleOffset < attributeLength(indices); triangleOffset += 3) {\n const localMaterialIndex = dominantLocalMaterial(geometry, indices, triangleOffset, materialIndices.length);\n const materialIndex = materialIndices[localMaterialIndex] ?? materialIndices[0] ?? 0;\n const samplingLuminance = samplingLuminances[localMaterialIndex];\n if (!(samplingLuminance > 1e-8)) continue;\n\n const triangleIndices = [\n attributeValue(indices, triangleOffset),\n attributeValue(indices, triangleOffset + 1),\n attributeValue(indices, triangleOffset + 2)\n ];\n for (let corner = 0; corner < 3; corner++) {\n const vertex = triangleIndices[corner];\n vec3.set(\n local[corner],\n positions[vertex * geometry.position.itemSize],\n positions[vertex * geometry.position.itemSize + 1],\n positions[vertex * geometry.position.itemSize + 2]\n );\n vec3.transformMat4(world[corner], local[corner], matrix);\n }\n vec3.sub(edge0, world[1], world[0]);\n vec3.sub(edge1, world[2], world[0]);\n vec3.cross(cross, edge0, edge1);\n const area = 0.5 * vec3.length(cross);\n if (!(area > 1e-10) || !isFinite(area)) continue;\n\n const triangleUvs = triangleIndices.map((vertex) =>\n uvs\n ? [uvs[vertex * 2], uvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n const triangleSecondaryUvs = triangleIndices.map((vertex) =>\n secondaryUvs\n ? [secondaryUvs[vertex * 2], secondaryUvs[vertex * 2 + 1]] as [number, number]\n : [0, 0] as [number, number]\n );\n triangles.push({\n p0: vec3.clone(world[0]),\n p1: vec3.clone(world[1]),\n p2: vec3.clone(world[2]),\n uv0: triangleUvs[0],\n uv1: triangleUvs[1],\n uv2: triangleUvs[2],\n secondaryUv0: triangleSecondaryUvs[0],\n secondaryUv1: triangleSecondaryUvs[1],\n secondaryUv2: triangleSecondaryUvs[2],\n materialIndex,\n area,\n samplingLuminance,\n selectionPmf: 0\n });\n }\n }\n }\n return triangles;\n}\n\nfunction packEmissivePoint(data: Float32Array, offset: number, point: Float32Array) {\n // Preserve TypedArray.set's overlapping-view semantics for callers with aliases.\n if (data.buffer === point.buffer) {data.set(point, offset); return;}\n data[offset] = point[0]; data[offset + 1] = point[1]; data[offset + 2] = point[2];\n}\nexport function packEmissiveTriangles(triangles: EmissiveTriangle[], data: Float32Array = new Float32Array(Math.max(triangles.length, 1) * 24)) {\n triangles.forEach((triangle, index) => {\n const offset = index * 24;\n packEmissivePoint(data, offset, triangle.p0);\n data[offset + 3] = triangle.selectionPmf;\n packEmissivePoint(data, offset + 4, triangle.p1);\n data[offset + 7] = triangle.area;\n packEmissivePoint(data, offset + 8, triangle.p2);\n data[offset + 11] = triangle.materialIndex;\n data[offset + 12] = triangle.uv0[0]; data[offset + 13] = triangle.uv0[1];\n data[offset + 14] = triangle.uv1[0]; data[offset + 15] = triangle.uv1[1];\n data[offset + 16] = triangle.uv2[0]; data[offset + 17] = triangle.uv2[1];\n data[offset + 18] = triangle.secondaryUv0[0]; data[offset + 19] = triangle.secondaryUv0[1];\n data[offset + 20] = triangle.secondaryUv1[0]; data[offset + 21] = triangle.secondaryUv1[1];\n data[offset + 22] = triangle.secondaryUv2[0]; data[offset + 23] = triangle.secondaryUv2[1];\n });\n return data;\n}\n\n\ninterface EmissiveCacheEntry { geometry: Geometry; version: number; instanceVersion: number; instanceCount: number; instanceTransforms?: Float32Array; matrix: Float64Array;\n indices: number[]; activity: boolean[]; triangles: EmissiveTriangle[] }\n\n// WeakMap class fields have no native representation in scriptc 0.3.2.\n// Keep the same per-cache weak ownership in a module-owned registry.\nconst emissiveBindings = new WeakMap<EmissiveTriangleCache, WeakMap<Mesh, EmissiveCacheEntry>>();\n\n/** Caches world-space vertices per mesh, independently of emission strength. */\nexport class EmissiveTriangleCache {\n constructor(private readonly samplingWeight?:(material:OpenPBRMaterial)=>number) { emissiveBindings.set(this, new WeakMap()); }\n private _triangles: EmissiveTriangle[] = [];\n collect(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]) {\n const cachedBindings = emissiveBindings.get(this)!;\n this._triangles.length = 0;\n for (const binding of bindings) {\n const { mesh, geometry, materialIndices } = binding;\n const isActive = (index: number) => {\n const m = materials[index];\n return !!m && !m.unlit && !m.shadowCatcher && (this.samplingWeight?this.samplingWeight(m):colorLuminance(materialEmission(m))) > 1e-8;\n };\n const instanceVersion = mesh.instanceData?.transformsVersion ?? 0;\n const instanceCount = meshInstanceCount(mesh);\n const instanceTransforms = mesh.instanceData?.transforms;\n let cached = cachedBindings.get(mesh);\n if (!cached || cached.geometry !== geometry || cached.version !== geometry.version || cached.instanceVersion !== instanceVersion || cached.instanceCount !== instanceCount || cached.instanceTransforms !== instanceTransforms ||\n cached.indices.length !== materialIndices.length || materialIndices.some((index, i) =>\n cached!.indices[i] !== index || cached!.activity[i] !== isActive(index)) ||\n meshMatrixChanged(mesh, cached.matrix)) {\n cached = { geometry, version: geometry.version, instanceVersion, instanceCount, instanceTransforms, matrix: copyMeshMatrix(mesh),\n indices: materialIndices.slice(), activity: materialIndices.map(isActive),\n triangles: collectEmissiveTriangles([binding], materials,this.samplingWeight) };\n cachedBindings.set(mesh, cached);\n } else {\n for (const triangle of cached.triangles) {\n const m = materials[triangle.materialIndex];\n triangle.samplingLuminance = this.samplingWeight?this.samplingWeight(m):colorLuminance(materialEmission(m));\n }\n }\n for (const triangle of cached.triangles) this._triangles.push(triangle);\n }\n return this._triangles;\n }\n}\n\nfunction copyMeshMatrix(mesh: Mesh): Float64Array { return matrixStorage(mesh.transform); }\nfunction meshMatrixChanged(mesh: Mesh, previous: Float64Array): boolean {\n const matrix = matrixStorage(mesh.transform);\n for (let i = 0; i < matrix.length; i++) if (!Object.is(matrix[i], previous[i])) return true;\n return false;\n}\n\nfunction environmentPower(data: NonNullable<TexturePixelSource['data']>, width: number, height: number): number {\n if (data instanceof Uint8Array) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentPowerKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentPowerKernel(data, width, height, 1);\n return environmentPowerKernel(data, width, height, 1);\n}\n\nfunction environmentPowerKernel<T extends NonNullable<TexturePixelSource['data']>>(data: T, width: number, height: number, scale: number): number {\n const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);\n let weightedLuminance = 0;\n for (let y = 0; y < height; y++) {\n const sinTheta = Math.sin(Math.PI * (y + 0.5) / height);\n for (let x = 0; x < width; x++) {\n const offset = (y * width + x) * channels;\n weightedLuminance +=\n colorLuminance([\n pixelValue(data, offset) * scale,\n pixelValue(data, offset + Math.min(1, channels - 1)) * scale,\n pixelValue(data, offset + Math.min(2, channels - 1)) * scale\n ]) * sinTheta;\n }\n }\n return weightedLuminance * (2 * Math.PI * Math.PI) / (width * height);\n}\n"]}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* This repository re-quantized the Adobe data to 8-bit row-normalized values.
|
|
9
9
|
* Directional rows store Uint16 min/max followed by 32 Uint8 samples.
|
|
10
10
|
* Metal and ideal-dielectric averages store exact little-endian Uint16 values.
|
|
11
|
-
*
|
|
11
|
+
* Dielectric averages decode directly to Float32. Metal averages are normalized
|
|
12
|
+
* to the decoded piecewise-linear directional rows (see below).
|
|
12
13
|
* Storage uses differences from the previous row: little-endian min/max
|
|
13
14
|
* modulo 65536 and samples modulo 256. The first row is relative to zero;
|
|
14
15
|
* differences continue across all concatenated energy tables.
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* This repository re-quantized the Adobe data to 8-bit row-normalized values.
|
|
9
9
|
* Directional rows store Uint16 min/max followed by 32 Uint8 samples.
|
|
10
10
|
* Metal and ideal-dielectric averages store exact little-endian Uint16 values.
|
|
11
|
-
*
|
|
11
|
+
* Dielectric averages decode directly to Float32. Metal averages are normalized
|
|
12
|
+
* to the decoded piecewise-linear directional rows (see below).
|
|
12
13
|
* Storage uses differences from the previous row: little-endian min/max
|
|
13
14
|
* modulo 65536 and samples modulo 256. The first row is relative to zero;
|
|
14
15
|
* differences continue across all concatenated energy tables.
|
|
@@ -963,6 +964,22 @@ export function getOpenPbrEnergyLutData() {
|
|
|
963
964
|
: OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW * 32 + index - 32;
|
|
964
965
|
data[offset] = value;
|
|
965
966
|
}
|
|
967
|
+
// Integrating before interpolation in roughness commutes with that linear
|
|
968
|
+
// interpolation. Use the exact integral of 2*mu times each linear segment,
|
|
969
|
+
// rather than the separately tabulated u16 average: low-roughness rows have
|
|
970
|
+
// narrow grazing features that the 32 cosine samples cannot resolve exactly.
|
|
971
|
+
// This makes the compensation lobe integrate to its directional loss for any
|
|
972
|
+
// roughness without changing the directional table or the Fresnel model.
|
|
973
|
+
for (let row = 0; row < OPENPBR_ENERGY_LUT_SIZE; row++) {
|
|
974
|
+
const offset = (OPENPBR_METAL_ENERGY_LUT_ROW + row) * OPENPBR_ENERGY_LUT_WIDTH;
|
|
975
|
+
const h = 1 / (OPENPBR_ENERGY_LUT_SIZE - 1);
|
|
976
|
+
let average = 0;
|
|
977
|
+
for (let i = 0; i < OPENPBR_ENERGY_LUT_SIZE - 1; i++) {
|
|
978
|
+
const a = data[offset + i], b = data[offset + i + 1];
|
|
979
|
+
average += h * (i * h * (a + b) + h * (a + 2 * b) / 3);
|
|
980
|
+
}
|
|
981
|
+
data[OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW * OPENPBR_ENERGY_LUT_WIDTH + row] = average;
|
|
982
|
+
}
|
|
966
983
|
cachedData = data;
|
|
967
984
|
return data;
|
|
968
985
|
}
|