@meimu/mutracer 0.1.5 → 0.3.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/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +10 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +12316 -9228
- package/docs/api.md +232 -21
- package/docs/caustics.md +80 -0
- package/docs/denoising.md +30 -15
- package/docs/materials.md +6 -5
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +73 -1
- package/docs/technical/continuous-spectrum.md +93 -0
- package/docs/threejs.md +14 -5
- package/docs/updates.md +46 -2
- package/docs/viewer-checklist.md +65 -0
- package/docs/viewer.md +15 -8
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +28 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +4 -0
- package/lib/Engine.js +99 -37
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +98 -15
- package/lib/Render.js +275 -27
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +11 -1
- package/lib/RenderLoop.js +120 -15
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +11 -0
- package/lib/renderer/GPUTraceQueue.js +33 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +36 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.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/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- 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 +132 -29
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +83 -56
- package/lib/renderer/WGPURayTracePass.js +884 -837
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +297 -82
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
- package/lib/renderer/WebGLFullQuadPass.js +22 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
- package/lib/renderer/WebGLRayTracePass.js +121 -9
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +126 -22
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +6 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- 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/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- 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 -67
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
- 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 +160 -157
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
- 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 +72 -67
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
- 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 +143 -120
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
- 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/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +271 -248
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +22 -18
- package/lib/renderer/lightSampling.js +135 -62
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +7 -3
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- 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 +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- 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/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- 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/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +22 -0
- package/lib/renderer/wgpuShaderSource.js +33 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
- package/lib/renderer/wgsl/causticLight.compute.js +537 -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.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
- 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 +152 -144
- 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 +269 -245
- 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 +27 -14
- 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 +91 -95
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- 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.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- 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.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +6 -168
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +36 -3
- package/lib/settings/render.js +4 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +20 -7
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +5 -0
- package/package.json +33 -7
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displacementPreparation.js","sourceRoot":"","sources":["../../src/renderer/displacementPreparation.ts"],"names":[],"mappings":"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","sourcesContent":["import Geometry, {Attribute} from '../scene/Geometry.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport { vec2, vec3 } from '../math.js';\nimport { read, write } from '../math/access.js';\nimport { attributeValue, attributeLength } from '../scene/attributeData.js';\n\n// Use the same normal offset for software BLASes and native procedural AABBs.\nexport function displacementBaseGeometry(geometry: Geometry, bias: number): Geometry {\n if (bias === 0) return geometry;\n const positions = geometry.position.array.slice();\n const normals = geometry.normal.array;\n for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {\n const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;\n const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);\n if (length > 0) {\n for (let axis = 0; axis < 3; axis++) positions[p + axis] += normals[n + axis] / length * bias;\n }\n }\n const result = new Geometry(geometry);\n result.position = new Attribute(positions, geometry.position.itemSize);\n return result;\n}\n\n// Shared CPU displacement math. Pixel acquisition and caching belong to adapters.\nexport function computeDisplacementMinmax(w: number, sourceChannels: number,\n readHeight: (index: number) => number) {\n const minmaxData: Uint8Array[] = [];\n const maxMipLevel = Math.log2(w);\n let mipmapSize = w;\n for (let lod = 0; lod <= maxMipLevel; lod++) {\n const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];\n const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);\n minmaxData.push(minmax);\n const channels = lod === 0 ? sourceChannels : 2;\n for (let y = 0; y < mipmapSize; y++) {\n for (let x = 0; x < mipmapSize; x++) {\n const yx = y * mipmapSize + x;\n const idx = yx * channels;\n let min = 0;\n let max = 0;\n if (lod == 0) {\n min = readHeight(idx);\n max = min;\n if (y < mipmapSize - 1 && x < mipmapSize - 1) {\n const h = readHeight(idx + (mipmapSize + 1) * channels);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (y < mipmapSize - 1) {\n const h = readHeight(idx + mipmapSize * channels);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (x < mipmapSize - 1) {\n const h = readHeight(idx + channels);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n } else {\n const x2 = x * 2;\n const y2 = y * 2;\n const prevMipmapSize = mipmapSize * 2;\n const idx2 = (y2 * prevMipmapSize + x2) * channels;\n const idx2_0 = idx2;\n const idx2_1 = idx2 + channels;\n const idx2_2 = idx2 + prevMipmapSize * channels;\n const idx2_3 = idx2 + prevMipmapSize * channels + channels;\n min = Math.min(\n prevMinmaxData[idx2_0],\n prevMinmaxData[idx2_1],\n prevMinmaxData[idx2_2],\n prevMinmaxData[idx2_3]\n );\n max = Math.max(\n prevMinmaxData[idx2_0 + 1],\n prevMinmaxData[idx2_1 + 1],\n prevMinmaxData[idx2_2 + 1],\n prevMinmaxData[idx2_3 + 1]\n );\n }\n minmax[yx * 2] = min;\n minmax[yx * 2 + 1] = max;\n }\n }\n mipmapSize = mipmapSize / 2;\n }\n\n return minmaxData;\n}\n\nfunction sphericalProjection<T0 extends vec3.Vec3Array, T1 extends vec2.Vec2Array>(n: T0, uv: T1) {\n const theta = Math.atan2(read(n, 0), read(n, 2)) / (2.0 * Math.PI) + 0.5;\n const phi = Math.acos(read(n, 1)) / Math.PI;\n vec2.set(uv, theta, 1.0 - phi);\n}\n\nexport function sphericalProjectionTriangle<T0 extends vec3.Vec3Array, T1 extends vec3.Vec3Array, T2 extends vec3.Vec3Array, T3 extends vec2.Vec2Array, T4 extends vec2.Vec2Array, T5 extends vec2.Vec2Array>(\n na: T0,\n nb: T1,\n nc: T2,\n uvA: T3,\n uvB: T4,\n uvC: T5\n) {\n sphericalProjection(na, uvA);\n sphericalProjection(nb, uvB);\n sphericalProjection(nc, uvC);\n let onSeam = false;\n for (let i = 0; i < 2; i++) {\n if (\n Math.abs(read(uvA, i) - read(uvB, i)) > 0.5 ||\n Math.abs(read(uvA, i) - read(uvC, i)) > 0.5 ||\n Math.abs(read(uvB, i) - read(uvC, i)) > 0.5\n ) {\n const maxU = Math.max(read(uvA, i), read(uvB, i), read(uvC, i));\n if (maxU - read(uvA, i) > 0.5) {\n write(uvA, i, read(uvA, i) + 1.0);\n onSeam = true;\n }\n if (maxU - read(uvB, i) > 0.5) {\n write(uvB, i, read(uvB, i) + 1.0);\n onSeam = true;\n }\n if (maxU - read(uvC, i) > 0.5) {\n write(uvC, i, read(uvC, i) + 1.0);\n onSeam = true;\n }\n }\n }\n\n return onSeam;\n}\n\nfunction getMaxAxisIndex<T0 extends vec3.Vec3Array>(n: T0) {\n const x = Math.abs(read(n, 0));\n const y = Math.abs(read(n, 1));\n const z = Math.abs(read(n, 2));\n return x > y && x > z ? 0 : y > z ? 1 : 2;\n}\n\nexport function triplanarProjectionTriangle<T0 extends vec3.Vec3Array, T1 extends vec3.Vec3Array, T2 extends vec3.Vec3Array, T3 extends vec3.Vec3Array, T4 extends vec3.Vec3Array, T5 extends vec3.Vec3Array, T6 extends vec2.Vec2Array, T7 extends vec2.Vec2Array, T8 extends vec2.Vec2Array>(\n a: T0,\n b: T1,\n c: T2,\n na: T3,\n nb: T4,\n nc: T5,\n uvA: T6,\n uvB: T7,\n uvC: T8\n) {\n const tmpMaxX = Math.max(Math.abs(read(na, 0)), Math.abs(read(nb, 0)), Math.abs(read(nc, 0)));\n const tmpMaxY = Math.max(Math.abs(read(na, 1)), Math.abs(read(nb, 1)), Math.abs(read(nc, 1)));\n const tmpMaxZ = Math.max(Math.abs(read(na, 2)), Math.abs(read(nb, 2)), Math.abs(read(nc, 2)));\n\n if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {\n // yz\n vec2.set(uvA, read(a, 1), read(a, 2));\n vec2.set(uvB, read(b, 1), read(b, 2));\n vec2.set(uvC, read(c, 1), read(c, 2));\n } else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {\n // xz\n vec2.set(uvA, read(a, 0), read(a, 2));\n vec2.set(uvB, read(b, 0), read(b, 2));\n vec2.set(uvC, read(c, 0), read(c, 2));\n } else {\n // xy\n vec2.set(uvA, read(a, 0), read(a, 1));\n vec2.set(uvB, read(b, 0), read(b, 1));\n vec2.set(uvC, read(c, 0), read(c, 1));\n }\n}\n\nfunction findRoots(\n triAabbMinP: Float32Array,\n triAabbMaxP: Float32Array,\n maxDepth: number,\n roots: Float64Array[]\n) {\n let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);\n let size = Math.max(d[0], d[1]);\n let startMipLevel =\n maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;\n if (!isFinite(startMipLevel)) {\n startMipLevel = maxDepth;\n }\n startMipLevel = Math.max(startMipLevel, 0);\n let rootCount = 0;\n while (true) {\n const mipSize = Math.pow(2.0, maxDepth - startMipLevel);\n const minTexelX = Math.floor(mipSize * read(triAabbMinP, 0));\n const minTexelY = Math.floor(mipSize * read(triAabbMinP, 1));\n const maxTexelX = Math.floor(mipSize * read(triAabbMaxP, 0));\n const maxTexelY = Math.floor(mipSize * read(triAabbMaxP, 1));\n\n if (\n (maxTexelX - minTexelX < 2 &&\n maxTexelY - minTexelY < 2 &&\n startMipLevel >= 0) ||\n startMipLevel >= maxDepth\n ) {\n for (let y = minTexelY; y <= maxTexelY; y++) {\n for (let x = minTexelX; x <= maxTexelX; x++) {\n if (rootCount < roots.length) {\n vec3.set(\n roots[rootCount],\n Math.floor(x),\n Math.floor(y),\n startMipLevel\n );\n rootCount++;\n }\n }\n }\n break;\n }\n\n startMipLevel++;\n }\n\n return rootCount;\n}\n\nexport function conservativeTrianglesDisplacementRange(triangleCount: number): Float32Array | undefined {\n if (triangleCount < 100_000) return undefined;\n const ranges = new Float32Array(triangleCount * 2);\n for (let i = 0; i < triangleCount; i++) ranges[i * 2 + 1] = 1;\n return ranges;\n}\n\nexport function computeTrianglesDisplacementRange(geometry: Geometry,\n minmaxData: Uint8Array[], width: number, isFlipY: boolean, material: MaterialState) {\n const indices = geometry.indexArray;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!uvs && uvProjection === 'none') throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.');\n const conservative = conservativeTrianglesDisplacementRange(attributeLength(indices) / 3);\n if (conservative) return conservative;\n const maxDepth = Math.log2(width);\n const trianglesDisplacementRange = new Float32Array((attributeLength(indices) / 3) * 2);\n const normal = geometry.normal!.array;\n const position = geometry.position!.array;\n\n const uv1 = vec2.create();\n const uv2 = vec2.create();\n const uv3 = vec2.create();\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const n1 = vec3.create();\n const n2 = vec3.create();\n const n3 = vec3.create();\n\n const isTriplanar = uvProjection === 'triplanar';\n const isSpherical = uvProjection === 'spherical';\n const isCylindrical = uvProjection === 'cylindrical';\n const uvScale = material.displacementUvProjectionScale;\n\n const minUv = vec2.create();\n const maxUv = vec2.create();\n\n const roots: Float64Array[] = [];\n for (let i = 0; i < 100; i++) {\n roots.push(new Float64Array(3));\n }\n for (let i = 0; i < attributeLength(indices); i += 3) {\n const i1 = attributeValue(indices, i);\n const i2 = attributeValue(indices, i + 1);\n const i3 = attributeValue(indices, i + 2);\n const i1_2 = i1 * 2;\n const i2_2 = i2 * 2;\n const i3_2 = i3 * 2;\n const i1_3 = i1 * 3;\n const i2_3 = i2 * 3;\n const i3_3 = i3 * 3;\n\n if (uvs) {\n vec2.set(uv1, attributeValue(uvs, i1_2), attributeValue(uvs, i1_2 + 1));\n vec2.set(uv2, attributeValue(uvs, i2_2), attributeValue(uvs, i2_2 + 1));\n vec2.set(uv3, attributeValue(uvs, i3_2), attributeValue(uvs, i3_2 + 1));\n } else {\n vec2.set(uv1, 0, 0);\n vec2.set(uv2, 0, 0);\n vec2.set(uv3, 0, 0);\n }\n\n let onSeam = false;\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(n1, attributeValue(normal, i1_3), attributeValue(normal, i1_3 + 1), attributeValue(normal, i1_3 + 2));\n vec3.set(n2, attributeValue(normal, i2_3), attributeValue(normal, i2_3 + 1), attributeValue(normal, i2_3 + 2));\n vec3.set(n3, attributeValue(normal, i3_3), attributeValue(normal, i3_3 + 1), attributeValue(normal, i3_3 + 2));\n vec3.normalize(n1, n1);\n vec3.normalize(n2, n2);\n vec3.normalize(n3, n3);\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(p1, attributeValue(position, i1_3), attributeValue(position, i1_3 + 1), attributeValue(position, i1_3 + 2));\n vec3.set(p2, attributeValue(position, i2_3), attributeValue(position, i2_3 + 1), attributeValue(position, i2_3 + 2));\n vec3.set(p3, attributeValue(position, i3_3), attributeValue(position, i3_3 + 1), attributeValue(position, i3_3 + 2));\n }\n if (isTriplanar) {\n // Is on the seam. Needs full prism to avoid empty seams.\n const xMaxIndex = getMaxAxisIndex(n1);\n const yMaxIndex = getMaxAxisIndex(n2);\n const zMaxIndex = getMaxAxisIndex(n3);\n if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {\n onSeam = true;\n }\n /* prettier-ignore */\n triplanarProjectionTriangle(\n p1, p2, p3,\n n1, n2, n3,\n uv1, uv2, uv3\n );\n } else if (isSpherical) {\n vec3.normalize(p1, p1);\n vec3.normalize(p2, p2);\n vec3.normalize(p3, p3);\n onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);\n } else {\n const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;\n const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;\n const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;\n vec2.set(uv1, u1, p1[1]);\n vec2.set(uv2, u2, p2[1]);\n vec2.set(uv3, u3, p3[1]);\n onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;\n }\n }\n vec2.scale(uv1, uv1, uvScale);\n vec2.scale(uv2, uv2, uvScale);\n vec2.scale(uv3, uv3, uvScale);\n\n // TODO PDM don't have zero area triangle issue.\n\n let minHeight = Infinity;\n let maxHeight = -Infinity;\n\n if (onSeam) {\n minHeight = 0.0;\n maxHeight = 255.0;\n } else {\n vec2.copy(maxUv, uv1);\n vec2.copy(minUv, uv1);\n vec2.min(minUv, minUv, uv2);\n vec2.min(minUv, minUv, uv3);\n vec2.max(maxUv, maxUv, uv2);\n vec2.max(maxUv, maxUv, uv3);\n\n const rootCount = findRoots(minUv, maxUv, maxDepth, roots);\n\n for (let k = 0; k < rootCount; k++) {\n const mipLevel = read(roots[k], 2);\n const mipSize = Math.pow(2, maxDepth - mipLevel);\n const minmax = minmaxData[mipLevel];\n const x = ((read(roots[k], 0) % mipSize) + mipSize) % mipSize;\n let y = ((read(roots[k], 1) % mipSize) + mipSize) % mipSize;\n if (isFlipY) {\n y = mipSize - y - 1;\n }\n const idx = (y * mipSize + x) * 2;\n\n minHeight = Math.min(minHeight, minmax[idx]);\n maxHeight = Math.max(maxHeight, minmax[idx + 1]);\n }\n }\n\n // TODO this will cause flat surface optimization fail.\n // But not adding bias will leads to small gap between flat surface and displaced surface.\n trianglesDisplacementRange[(i / 3) * 2] = Math.max(\n (Math.floor(minHeight) - 4) / 255,\n 0\n );\n trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min(\n (Math.ceil(maxHeight) + 4) / 255,\n 1\n );\n }\n\n return trianglesDisplacementRange;\n}\n\n/** Conservative source-order AABBs for the actual displacement prism. */\nexport function displacementPrismAabbs(geometry: Geometry, displacementScale: number): Float32Array {\n const indices = geometry.indexArray;\n const count = Math.floor(indices.length / 3);\n const boxes = new Float32Array(count * 6);\n for (let t = 0; t < count; t++) {\n const minimum = [Infinity, Infinity, Infinity], maximum = [-Infinity, -Infinity, -Infinity];\n const ia = indices[t * 3] * 3;\n const ib = indices[t * 3 + 1] * 3;\n const ic = indices[t * 3 + 2] * 3;\n const positions = geometry.position.array;\n const ux = positions[ib]-positions[ia], uy = positions[ib+1]-positions[ia+1], uz = positions[ib+2]-positions[ia+2];\n const vx = positions[ic]-positions[ia], vy = positions[ic+1]-positions[ia+1], vz = positions[ic+2]-positions[ia+2];\n const fx = uy*vz-uz*vy, fy = uz*vx-ux*vz, fz = ux*vy-uy*vx;\n const faceLength = Math.hypot(fx,fy,fz);\n for (let c = 0; c < 3; c++) {\n const v = indices[t * 3 + c];\n const nx = geometry.normal.array[v * 3], ny = geometry.normal.array[v * 3 + 1], nz = geometry.normal.array[v * 3 + 2];\n const length = Math.hypot(nx, ny, nz);\n const cosine = Math.abs((nx*fx+ny*fy+nz*fz)/((length || 1)*(faceLength || 1)));\n const extrusion = cosine > 0 ? displacementScale/cosine : 0;\n for (let a = 0; a < 3; a++) {\n const position = geometry.position.array[v * 3 + a], n = geometry.normal.array[v * 3 + a] / (length || 1);\n const p0 = position;\n const p1 = position + n * extrusion;\n minimum[a] = Math.min(minimum[a], p0, p1); maximum[a] = Math.max(maximum[a], p0, p1);\n }\n }\n for (let a = 0; a < 3; a++) {\n const padding = Math.max(1, Math.abs(minimum[a]), Math.abs(maximum[a])) * 1e-6;\n minimum[a] -= padding; maximum[a] += padding;\n }\n for (let a = 0; a < 3; a++) {\n boxes[t * 6 + a] = minimum[a]; boxes[t * 6 + a + 3] = maximum[a];\n }\n }\n return boxes;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function quantizeDisplacementRange(minimum: number, maximum: number): number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Generated by native/scripts/generate-layout-schema.mjs; edit src/renderer/sceneLayoutSchema.ts.
|
|
2
|
+
export function quantizeDisplacementRange(minimum, maximum) {
|
|
3
|
+
const lo = Math.fround(minimum), hi = Math.fround(maximum);
|
|
4
|
+
const lower = Math.max(0, Math.min(255, Math.floor(Math.fround(lo * 255))));
|
|
5
|
+
const upper = Math.abs(Math.fround(hi - lo)) < Math.fround(0.000001) ? lower
|
|
6
|
+
: Math.max(0, Math.min(255, Math.ceil(Math.fround(hi * 255))));
|
|
7
|
+
return (lower << 8) | upper;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=displacementRange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displacementRange.js","sourceRoot":"","sources":["../../src/renderer/displacementRange.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,OAAe;IACxE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK;QAC1E,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;AAC9B,CAAC","sourcesContent":["// Generated by native/scripts/generate-layout-schema.mjs; edit src/renderer/sceneLayoutSchema.ts.\nexport function quantizeDisplacementRange(minimum: number, maximum: number): number {\n const lo = Math.fround(minimum), hi = Math.fround(maximum);\n const lower = Math.max(0, Math.min(255, Math.floor(Math.fround(lo * 255))));\n const upper = Math.abs(Math.fround(hi - lo)) < Math.fround(0.000001) ? lower\n : Math.max(0, Math.min(255, Math.ceil(Math.fround(hi * 255))));\n return (lower << 8) | upper;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"displayParityDiagnostics.js","sourceRoot":"","sources":["../../src/renderer/displayParityDiagnostics.ts"],"names":[],"mappings":"","sourcesContent":["// Internal fixture input: additive accumulation in bottom-row-first order.\n// Not part of src/main.ts or the supported rendering diagnostics contract.\nexport interface DisplayParityAccumulation {\n width: number; height: number; samples: number; catcher: boolean;\n color: Float32Array; albedo: Float32Array; normal: Float32Array;\n shadow: Float32Array; moments: Float32Array;\n}\n\n/** @internal Test-only access on concrete backend targets, never public diagnostics. */\nexport interface DisplayParityTarget {\n /** @internal */\n _displayParity(): {\n record(trace?: string[]): void;\n load(input: DisplayParityAccumulation): void;\n };\n}\n"]}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { ColorRGBA } from '../types.js';
|
|
2
|
-
import { TextureDataSource } from '../scene/Texture.js';
|
|
1
|
+
import type { ColorRGBA } from '../types.js';
|
|
2
|
+
import { type TextureDataSource } from '../scene/Texture.js';
|
|
3
3
|
import AmbientLight from '../scene/AmbientLight.js';
|
|
4
4
|
import EnvironmentLight from '../scene/EnvironmentLight.js';
|
|
5
|
-
import { SceneBackground, SceneLight } from '../scene/Scene.js';
|
|
6
|
-
import type { EnvironmentMapSource } from './envMapDistribution.js';
|
|
7
|
-
/** Rotation only: translation does not affect a light at infinity. */
|
|
5
|
+
import type { SceneBackground, SceneLight } from '../scene/Scene.js';
|
|
6
|
+
import type { EnvironmentSource, EnvironmentMapSource, ProceduralEnvironmentSource } from './envMapDistribution.js';
|
|
8
7
|
export declare function environmentRotation(lights: readonly SceneLight[]): Float32Array;
|
|
8
|
+
/** Map-to-world orientation for explicit equirect backgrounds; grounded yaw is packed separately. */
|
|
9
|
+
export declare function backgroundMapRotation(background?: SceneBackground): Float32Array;
|
|
9
10
|
/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */
|
|
10
11
|
export declare function backgroundMapTransform(background?: SceneBackground): Float32Array;
|
|
11
|
-
export declare function generateBackgroundMapFromSceneBackground(background: SceneBackground): TextureDataSource | undefined;
|
|
12
|
-
export declare function generateEnvMapFromSceneComponents(ambientLights: AmbientLight[], environmentLights: EnvironmentLight[]): EnvironmentMapSource;
|
|
13
|
-
export declare function initializeEnvMap(environmentLights: EnvironmentLight[]):
|
|
12
|
+
export declare function generateBackgroundMapFromSceneBackground(background: SceneBackground): TextureDataSource | ProceduralEnvironmentSource | undefined;
|
|
13
|
+
export declare function generateEnvMapFromSceneComponents(ambientLights: AmbientLight[], environmentLights: EnvironmentLight[]): EnvironmentMapSource | ProceduralEnvironmentSource;
|
|
14
|
+
export declare function initializeEnvMap(environmentLights: EnvironmentLight[]): EnvironmentSource;
|
|
14
15
|
export declare function generateSolidMap(width: number, height: number, color?: ColorRGBA, intensity?: number): TextureDataSource;
|
|
@@ -2,26 +2,35 @@
|
|
|
2
2
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
3
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
4
4
|
import { isTextureDataSource } from '../scene/Texture.js';
|
|
5
|
+
import { isProceduralSkyImage } from '../scene/skyParameters.js';
|
|
5
6
|
/** Rotation only: translation does not affect a light at infinity. */
|
|
6
|
-
|
|
7
|
+
function mapRotation(transform) {
|
|
7
8
|
const matrix = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
|
|
8
|
-
|
|
9
|
-
if (light?.type === 'EnvironmentLight') {
|
|
9
|
+
if (transform) {
|
|
10
10
|
for (let column = 0; column < 3; column++) {
|
|
11
11
|
const offset = column * 4;
|
|
12
|
-
const length = Math.hypot(
|
|
12
|
+
const length = Math.hypot(transform[offset], transform[offset + 1], transform[offset + 2]);
|
|
13
13
|
if (length > 0)
|
|
14
14
|
for (let row = 0; row < 3; row++)
|
|
15
|
-
matrix[offset + row] =
|
|
15
|
+
matrix[offset + row] = transform[offset + row] / length;
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
return matrix;
|
|
19
19
|
}
|
|
20
|
+
export function environmentRotation(lights) {
|
|
21
|
+
const light = lights.find(light => light.type === 'EnvironmentLight');
|
|
22
|
+
return mapRotation(light?.type === 'EnvironmentLight' ? light.transform : undefined);
|
|
23
|
+
}
|
|
24
|
+
/** Map-to-world orientation for explicit equirect backgrounds; grounded yaw is packed separately. */
|
|
25
|
+
export function backgroundMapRotation(background) {
|
|
26
|
+
return mapRotation(background && !Array.isArray(background) && 'type' in background && background.type === 'Equirect'
|
|
27
|
+
? background.transform : undefined);
|
|
28
|
+
}
|
|
20
29
|
/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */
|
|
21
30
|
export function backgroundMapTransform(background) {
|
|
22
|
-
const
|
|
23
|
-
const angle =
|
|
24
|
-
return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0,
|
|
31
|
+
const described = background && !Array.isArray(background) && 'type' in background ? background : undefined;
|
|
32
|
+
const angle = described?.type === 'GroundedSkybox' ? described.rotation ?? 0 : 0;
|
|
33
|
+
return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0, described?.intensity ?? 1), 0]);
|
|
25
34
|
}
|
|
26
35
|
const backgroundImages = new WeakMap();
|
|
27
36
|
const DEFAULT_MAP_RESOLUTION = {
|
|
@@ -37,19 +46,27 @@ export function generateBackgroundMapFromSceneBackground(background) {
|
|
|
37
46
|
}
|
|
38
47
|
else {
|
|
39
48
|
const texture = 'map' in background ? background.map : background;
|
|
40
|
-
if (!isTextureDataSource(texture.image))
|
|
41
|
-
return;
|
|
42
|
-
// Is rgbe data
|
|
43
49
|
const cached = backgroundImages.get(texture);
|
|
44
50
|
if (cached?.image === texture.image && cached.version === texture.version)
|
|
45
51
|
return cached.result;
|
|
46
|
-
|
|
52
|
+
if (isProceduralSkyImage(texture.image))
|
|
53
|
+
backgroundImage = skySource(texture.image, 1);
|
|
54
|
+
else if (isTextureDataSource(texture.image))
|
|
55
|
+
backgroundImage = { width: texture.image.width, height: texture.image.height, data: texture.image.data };
|
|
56
|
+
else
|
|
57
|
+
return;
|
|
47
58
|
backgroundImages.set(texture, { image: texture.image, version: texture.version, result: backgroundImage });
|
|
48
59
|
}
|
|
49
60
|
return backgroundImage;
|
|
50
61
|
}
|
|
51
62
|
export function generateEnvMapFromSceneComponents(ambientLights, environmentLights) {
|
|
52
63
|
let envImage = initializeEnvMap(environmentLights);
|
|
64
|
+
if ('sky' in envImage) {
|
|
65
|
+
for (const light of ambientLights)
|
|
66
|
+
for (let c = 0; c < 3; c++)
|
|
67
|
+
envImage.ambient[c] += light.color[c] * light.intensity;
|
|
68
|
+
return envImage;
|
|
69
|
+
}
|
|
53
70
|
if (ambientLights.length > 0 && environmentLights.length > 0) {
|
|
54
71
|
envImage = {
|
|
55
72
|
width: envImage.width,
|
|
@@ -69,6 +86,10 @@ export function initializeEnvMap(environmentLights) {
|
|
|
69
86
|
if (environmentLights.length > 0) {
|
|
70
87
|
// TODO: support multiple environment lights (what if they have different resolutions?)
|
|
71
88
|
const environmentLight = environmentLights[0];
|
|
89
|
+
if (isProceduralSkyImage(environmentLight.map.image)) {
|
|
90
|
+
const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;
|
|
91
|
+
return skySource(environmentLight.map.image, intensity);
|
|
92
|
+
}
|
|
72
93
|
envImage = {
|
|
73
94
|
width: environmentLight.map.image.width,
|
|
74
95
|
height: environmentLight.map.image.height,
|
|
@@ -130,4 +151,7 @@ function addAmbientLightToEnvMap(light, image) {
|
|
|
130
151
|
i++;
|
|
131
152
|
}
|
|
132
153
|
}
|
|
154
|
+
function skySource(sky, intensity) {
|
|
155
|
+
return { sky, width: sky.width, height: sky.height, intensity, ambient: [0, 0, 0] };
|
|
156
|
+
}
|
|
133
157
|
//# sourceMappingURL=envMapCreation.js.map
|
|
@@ -1 +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, SceneLight } from '../scene/Scene.js';\nimport type { EnvironmentMapSource } from './envMapDistribution.js';\n\n/** Rotation only: translation does not affect a light at infinity. */\nexport function environmentRotation(lights: readonly SceneLight[]): Float32Array {\n const matrix = new Float32Array([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n const light = lights.find(light => light.type === 'EnvironmentLight');\n if (light?.type === 'EnvironmentLight') {\n for (let column = 0; column < 3; column++) {\n const offset = column * 4;\n const length = Math.hypot(light.transform[offset], light.transform[offset+1], light.transform[offset+2]);\n if (length > 0) for (let row = 0; row < 3; row++) matrix[offset+row] = light.transform[offset+row] / length;\n }\n }\n return matrix;\n}\n\n/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */\nexport function backgroundMapTransform(background?: SceneBackground): Float32Array {\n const grounded = background && !Array.isArray(background) && 'type' in background && background.type === 'GroundedSkybox' ? background : undefined;\n const angle = grounded?.rotation ?? 0;\n return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0, grounded?.intensity ?? 1), 0]);\n}\n\nconst backgroundImages = new WeakMap<Texture, {image: Texture['image']; version: number; result: EnvironmentMapSource}>();\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 const cached = backgroundImages.get(texture);\n if (cached?.image === texture.image && cached.version === texture.version) return cached.result;\n backgroundImage = {width: texture.image.width, height: texture.image.height, data: texture.image.data};\n backgroundImages.set(texture, {image:texture.image, version:texture.version, result:backgroundImage});\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\nconst scaledEnvironments = new WeakMap<EnvironmentLight, {\n data: TextureDataSource['data']; width: number; height: number; version: number;\n intensity: number; image: EnvironmentMapSource;\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 const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n if (intensity !== 1 || !(envImage.data instanceof Float32Array)) {\n const previous = scaledEnvironments.get(environmentLight);\n if (previous && previous.data === envImage.data && previous.width === envImage.width &&\n previous.height === envImage.height && previous.version === environmentLight.map.version && previous.intensity === intensity) {\n return previous.image;\n }\n const scale = envImage.data instanceof Uint8Array || envImage.data instanceof Uint8ClampedArray ? 1 / 255 : 1;\n const data = Float32Array.from(envImage.data, (value, index) => value * scale * (index % 4 === 3 ? 1 : intensity));\n const image = {width: envImage.width, height: envImage.height, data};\n scaledEnvironments.set(environmentLight, {data: envImage.data, width: envImage.width, height: envImage.height,\n version: environmentLight.map.version, intensity, image});\n envImage = image;\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"]}
|
|
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 type { ColorRGBA, Mat4, WritableArrayLike } from '../types.js';\nimport Texture, {\n isTextureDataSource,\n type TextureDataSource\n} from '../scene/Texture.js';\nimport AmbientLight from '../scene/AmbientLight.js';\nimport EnvironmentLight from '../scene/EnvironmentLight.js';\nimport type { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isProceduralSkyImage } from '../scene/skyParameters.js';\nimport type { EnvironmentSource, EnvironmentMapSource, ProceduralEnvironmentSource } from './envMapDistribution.js';\n\n/** Rotation only: translation does not affect a light at infinity. */\nfunction mapRotation(transform?: Mat4): Float32Array {\n const matrix = new Float32Array([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n if (transform) {\n for (let column = 0; column < 3; column++) {\n const offset = column * 4;\n const length = Math.hypot(transform[offset], transform[offset+1], transform[offset+2]);\n if (length > 0) for (let row = 0; row < 3; row++) matrix[offset+row] = transform[offset+row] / length;\n }\n }\n return matrix;\n}\n\nexport function environmentRotation(lights: readonly SceneLight[]): Float32Array {\n const light = lights.find(light => light.type === 'EnvironmentLight');\n return mapRotation(light?.type === 'EnvironmentLight' ? light.transform : undefined);\n}\n\n/** Map-to-world orientation for explicit equirect backgrounds; grounded yaw is packed separately. */\nexport function backgroundMapRotation(background?: SceneBackground): Float32Array {\n return mapRotation(background && !Array.isArray(background) && 'type' in background && background.type === 'Equirect'\n ? background.transform : undefined);\n}\n\n/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */\nexport function backgroundMapTransform(background?: SceneBackground): Float32Array {\n const described = background && !Array.isArray(background) && 'type' in background ? background : undefined;\n const angle = described?.type === 'GroundedSkybox' ? described.rotation ?? 0 : 0;\n return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0, described?.intensity ?? 1), 0]);\n}\n\nconst backgroundImages = new WeakMap<Texture, {image: Texture['image']; version: number; result: EnvironmentSource}>();\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 const cached = backgroundImages.get(texture);\n if (cached?.image === texture.image && cached.version === texture.version) return cached.result;\n if (isProceduralSkyImage(texture.image)) backgroundImage = skySource(texture.image, 1);\n else if (isTextureDataSource(texture.image)) backgroundImage = {width: texture.image.width, height: texture.image.height, data: texture.image.data};\n else return;\n backgroundImages.set(texture, {image:texture.image, version:texture.version, result:backgroundImage});\n }\n return backgroundImage;\n}\n\nexport function generateEnvMapFromSceneComponents(\n ambientLights: AmbientLight[],\n environmentLights: EnvironmentLight[]\n) {\n let envImage = initializeEnvMap(environmentLights);\n if ('sky' in envImage) {\n for (const light of ambientLights) for (let c = 0; c < 3; c++) envImage.ambient[c] += light.color[c] * light.intensity;\n return envImage;\n }\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\nconst scaledEnvironments = new WeakMap<EnvironmentLight, {\n data: TextureDataSource['data']; width: number; height: number; version: number;\n intensity: number; image: EnvironmentMapSource;\n}>();\n\nexport function initializeEnvMap(environmentLights: EnvironmentLight[]): EnvironmentSource {\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 if (isProceduralSkyImage(environmentLight.map.image)) {\n const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n return skySource(environmentLight.map.image, intensity);\n }\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 const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n if (intensity !== 1 || !(envImage.data instanceof Float32Array)) {\n const previous = scaledEnvironments.get(environmentLight);\n if (previous && previous.data === envImage.data && previous.width === envImage.width &&\n previous.height === envImage.height && previous.version === environmentLight.map.version && previous.intensity === intensity) {\n return previous.image;\n }\n const scale = envImage.data instanceof Uint8Array || envImage.data instanceof Uint8ClampedArray ? 1 / 255 : 1;\n const data = Float32Array.from(envImage.data, (value, index) => value * scale * (index % 4 === 3 ? 1 : intensity));\n const image = {width: envImage.width, height: envImage.height, data};\n scaledEnvironments.set(environmentLight, {data: envImage.data, width: envImage.width, height: envImage.height,\n version: environmentLight.map.version, intensity, image});\n envImage = image;\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\nfunction skySource(sky: import('../scene/skyParameters.js').ProceduralSkyImage, intensity: number): ProceduralEnvironmentSource {\n return { sky, width: sky.width, height: sky.height, intensity, ambient: [0, 0, 0] };\n}\n"]}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ProceduralSkyImage } from '../scene/skyParameters.js';
|
|
2
|
+
import type { TextureDataSource } from '../scene/textureData.js';
|
|
2
3
|
export interface EnvironmentMapSource extends TextureDataSource {
|
|
3
4
|
/** Stable identity shared by adapters that recreate source wrappers. */
|
|
4
5
|
distributionCacheKey?: object;
|
|
5
6
|
/** Incremented whenever the source pixels change in place. */
|
|
6
7
|
distributionCacheVersion?: number;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
+
/** GPU-generated radiance, including the scene's linear intensity and ambient fill. */
|
|
10
|
+
export interface ProceduralEnvironmentSource {
|
|
11
|
+
sky: ProceduralSkyImage;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
intensity: number;
|
|
15
|
+
ambient: [number, number, number];
|
|
16
|
+
}
|
|
17
|
+
export type EnvironmentSource = EnvironmentMapSource | ProceduralEnvironmentSource;
|
|
18
|
+
export declare function environmentMapSourcesMatch(first: EnvironmentSource | undefined, second: EnvironmentSource | undefined): boolean;
|
|
9
19
|
export declare function envMapDistribution(image: EnvironmentMapSource): TextureDataSource;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
|
-
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
1
|
+
import { pixelLength, pixelValue } from '../scene/texturePixels.js';
|
|
4
2
|
const distributionCache = new WeakMap();
|
|
5
3
|
function distributionCacheIdentity(image) {
|
|
6
|
-
return image.distributionCacheKey ?? image.data;
|
|
4
|
+
return 'sky' in image ? image : image.distributionCacheKey ?? image.data;
|
|
7
5
|
}
|
|
8
6
|
export function environmentMapSourcesMatch(first, second) {
|
|
9
7
|
if (first === second)
|
|
@@ -13,8 +11,8 @@ export function environmentMapSourcesMatch(first, second) {
|
|
|
13
11
|
return (distributionCacheIdentity(first) === distributionCacheIdentity(second) &&
|
|
14
12
|
first.width === second.width &&
|
|
15
13
|
first.height === second.height &&
|
|
16
|
-
(first.distributionCacheVersion ?? 0) ===
|
|
17
|
-
(second.distributionCacheVersion ?? 0));
|
|
14
|
+
('sky' in first ? 0 : first.distributionCacheVersion ?? 0) ===
|
|
15
|
+
('sky' in second ? 0 : second.distributionCacheVersion ?? 0));
|
|
18
16
|
}
|
|
19
17
|
export function envMapDistribution(image) {
|
|
20
18
|
const cacheKey = distributionCacheIdentity(image);
|
|
@@ -27,43 +25,31 @@ export function envMapDistribution(image) {
|
|
|
27
25
|
return cached.distribution;
|
|
28
26
|
}
|
|
29
27
|
const data = image.data;
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
}
|
|
28
|
+
const width = image.width + 2, height = image.height + 1;
|
|
29
|
+
const cdf = makeTextureArray(width, height, 2);
|
|
30
|
+
const cdfImage = { width, height, data: cdf.array };
|
|
31
|
+
const luminance = environmentLuminance(data, image.width, image.height);
|
|
47
32
|
// Environment radiance is read with bilinear filtering while the CDF is
|
|
48
33
|
// piecewise constant. Dilating luminance over the filter footprint keeps a
|
|
49
34
|
// sharp HDR sun from leaking into a neighbouring low-PDF cell and producing
|
|
50
35
|
// fireflies. This only changes the importance distribution, not the
|
|
51
36
|
// radiance integral, so the estimator remains unbiased.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
37
|
+
// A separable max filter has the same clamped 3×3 footprint, with three
|
|
38
|
+
// reads per pass instead of nine clamped reads for every output texel.
|
|
39
|
+
const horizontal = new Float32Array(image.width * image.height);
|
|
40
|
+
for (let y = 0; y < image.height; y++) {
|
|
41
|
+
const row = y * image.width;
|
|
42
|
+
for (let x = 0; x < image.width; x++) {
|
|
43
|
+
horizontal[row + x] = Math.max(0, luminance[row + Math.max(0, x - 1)], luminance[row + x], luminance[row + Math.min(image.width - 1, x + 1)]);
|
|
60
44
|
}
|
|
61
|
-
|
|
62
|
-
};
|
|
45
|
+
}
|
|
63
46
|
for (let y = 0; y < image.height; y++) {
|
|
64
47
|
const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);
|
|
48
|
+
const above = Math.max(0, y - 1) * image.width;
|
|
49
|
+
const row = y * image.width;
|
|
50
|
+
const below = Math.min(image.height - 1, y + 1) * image.width;
|
|
65
51
|
for (let x = 0; x < image.width; x++) {
|
|
66
|
-
const weight =
|
|
52
|
+
const weight = Math.max(horizontal[above + x], horizontal[row + x], horizontal[below + x], 1e-12) * sinTheta;
|
|
67
53
|
cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);
|
|
68
54
|
cdf.set(x + 1, y, 1, weight);
|
|
69
55
|
}
|
|
@@ -104,4 +90,27 @@ function makeTextureArray(width, height, channels) {
|
|
|
104
90
|
array
|
|
105
91
|
};
|
|
106
92
|
}
|
|
93
|
+
function environmentLuminance(data, width, height) {
|
|
94
|
+
if (data instanceof Uint8Array)
|
|
95
|
+
return environmentLuminanceKernel(data, width, height, 1 / 255);
|
|
96
|
+
if (data instanceof Uint8ClampedArray)
|
|
97
|
+
return environmentLuminanceKernel(data, width, height, 1 / 255);
|
|
98
|
+
if (data instanceof Float32Array)
|
|
99
|
+
return environmentLuminanceKernel(data, width, height, 1);
|
|
100
|
+
return environmentLuminanceKernel(data, width, height, 1);
|
|
101
|
+
}
|
|
102
|
+
function environmentLuminanceKernel(data, width, height, sourceScale) {
|
|
103
|
+
const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);
|
|
104
|
+
const luminance = new Float32Array(width * height);
|
|
105
|
+
for (let y = 0; y < height; y++) {
|
|
106
|
+
for (let x = 0; x < width; x++) {
|
|
107
|
+
const sourceIndex = channels * (y * width + x);
|
|
108
|
+
luminance[y * width + x] =
|
|
109
|
+
sourceScale * (0.2126 * pixelValue(data, sourceIndex)
|
|
110
|
+
+ 0.7152 * pixelValue(data, sourceIndex + Math.min(1, channels - 1))
|
|
111
|
+
+ 0.0722 * pixelValue(data, sourceIndex + Math.min(2, channels - 1)));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return luminance;
|
|
115
|
+
}
|
|
107
116
|
//# sourceMappingURL=envMapDistribution.js.map
|
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"file":"envMapDistribution.js","sourceRoot":"","sources":["../../src/renderer/envMapDistribution.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA0BpE,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAkC,CAAC;AAExE,SAAS,yBAAyB,CAAC,KAAwB;IACzD,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,IAAI,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAoC,EACpC,MAAqC;IAErC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,CACL,yBAAyB,CAAC,KAAK,CAAC,KAAK,yBAAyB,CAAC,MAAM,CAAC;QACtE,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;QAC5B,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAC9B,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,CAAC;YACxD,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,IAAI,CAAC,CAAC,CAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAA2B;IAE3B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,wBAAwB,IAAI,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/C,IACE,MAAM;QACN,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;QAC5B,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9B,MAAM,CAAC,OAAO,KAAK,OAAO,EAC1B,CAAC;QACD,OAAO,MAAM,CAAC,YAAY,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAsB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAEvE,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAExE,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,oEAAoE;IACpE,wDAAwD;IACxD,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC9B,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,EACvD,SAAS,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;YAC7G,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAClE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;QACnD,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IAE1B,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;QACP,YAAY,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,MAAc,EAAE,QAAgB;IACvE,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IAE1D,OAAO;QACL,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,OAAe,EAAE,GAAW;YACpD,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC;QACpD,CAAC;QACD,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,OAAe;YACvC,OAAO,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACrD,CAAC;QACD,KAAK;QACL,MAAM;QACN,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAA+B,EAAE,KAAa,EAAE,MAAc;IAC1F,IAAI,IAAI,YAAY,UAAU;QAAE,OAAO,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAChG,IAAI,IAAI,YAAY,iBAAiB;QAAE,OAAO,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACvG,IAAI,IAAI,YAAY,YAAY;QAAE,OAAO,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5F,OAAO,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,0BAA0B,CAAsC,IAAO,EAAE,KAAa,EAAE,MAAc,EAAE,WAAmB;IAClI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,EAChD,CAAC,CACF,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/C,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBACtB,WAAW,GAAG,CACZ,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC;sBACpC,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;sBAClE,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CACrE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import type { ProceduralSkyImage } from '../scene/skyParameters.js';\n// 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 type { TextureDataSource } from '../scene/textureData.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.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\n/** GPU-generated radiance, including the scene's linear intensity and ambient fill. */\nexport interface ProceduralEnvironmentSource {\n sky: ProceduralSkyImage;\n width: number;\n height: number;\n intensity: number;\n ambient: [number, number, number];\n}\nexport type EnvironmentSource = EnvironmentMapSource | ProceduralEnvironmentSource;\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: EnvironmentSource) {\n return 'sky' in image ? image : image.distributionCacheKey ?? image.data;\n}\n\nexport function environmentMapSourcesMatch(\n first: EnvironmentSource | undefined,\n second: EnvironmentSource | 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 ('sky' in first ? 0 : first.distributionCacheVersion ?? 0) ===\n ('sky' in second ? 0 : 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 width = image.width + 2, height = image.height + 1;\n const cdf = makeTextureArray(width, height, 2);\n const cdfImage: TextureDataSource = { width, height, data: cdf.array };\n\n const luminance = environmentLuminance(data, image.width, image.height);\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 // A separable max filter has the same clamped 3×3 footprint, with three\n // reads per pass instead of nine clamped reads for every output texel.\n const horizontal = new Float32Array(image.width * image.height);\n for (let y = 0; y < image.height; y++) {\n const row = y * image.width;\n for (let x = 0; x < image.width; x++) {\n horizontal[row + x] = Math.max(0,\n luminance[row + Math.max(0, x - 1)], luminance[row + x],\n luminance[row + Math.min(image.width - 1, x + 1)]);\n }\n }\n\n for (let y = 0; y < image.height; y++) {\n const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);\n const above = Math.max(0, y - 1) * image.width;\n const row = y * image.width;\n const below = Math.min(image.height - 1, y + 1) * image.width;\n for (let x = 0; x < image.width; x++) {\n const weight = Math.max(horizontal[above + x], horizontal[row + x], horizontal[below + x], 1e-12) * 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\nfunction environmentLuminance(data: TextureDataSource['data'], width: number, height: number): Float32Array {\n if (data instanceof Uint8Array) return environmentLuminanceKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentLuminanceKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentLuminanceKernel(data, width, height, 1);\n return environmentLuminanceKernel(data, width, height, 1);\n}\n\nfunction environmentLuminanceKernel<T extends TextureDataSource['data']>(data: T, width: number, height: number, sourceScale: number): Float32Array {\n const channels = Math.max(\n Math.floor(pixelLength(data) / (width * height)),\n 1\n );\n const luminance = new Float32Array(width * height);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const sourceIndex = channels * (y * width + x);\n luminance[y * width + x] =\n sourceScale * (\n 0.2126 * pixelValue(data, sourceIndex)\n + 0.7152 * pixelValue(data, sourceIndex + Math.min(1, channels - 1))\n + 0.0722 * pixelValue(data, sourceIndex + Math.min(2, channels - 1))\n );\n }\n }\n\n return luminance;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type Geometry from '../scene/Geometry.js';
|
|
2
|
+
import { vec3 } from '../math.js';
|
|
3
|
+
export declare function computeGeometryBounds(geometry: Geometry): [vec3.Vec3Array, vec3.Vec3Array];
|
|
4
|
+
export declare function getBvhBounds(geometry: Geometry): [vec3.Vec3Array, vec3.Vec3Array];
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { vec3 } from '../math.js';
|
|
2
|
+
import { getGeometryBvh } from './geometryBvh.js';
|
|
3
|
+
export function computeGeometryBounds(geometry) {
|
|
4
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
5
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
6
|
+
const positions = geometry.position.array, stride = geometry.position.itemSize;
|
|
7
|
+
for (let offset = 0; offset + 2 < positions.length; offset += stride) {
|
|
8
|
+
const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];
|
|
9
|
+
if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z))
|
|
10
|
+
continue;
|
|
11
|
+
// Each selected value is already float32. Keep the reduction in scalars,
|
|
12
|
+
// avoiding six typed-array loads/stores per vertex with identical rounding.
|
|
13
|
+
minX = Math.min(minX, x);
|
|
14
|
+
minY = Math.min(minY, y);
|
|
15
|
+
minZ = Math.min(minZ, z);
|
|
16
|
+
maxX = Math.max(maxX, x);
|
|
17
|
+
maxY = Math.max(maxY, y);
|
|
18
|
+
maxZ = Math.max(maxZ, z);
|
|
19
|
+
}
|
|
20
|
+
return [vec3.fromValues(minX, minY, minZ), vec3.fromValues(maxX, maxY, maxZ)];
|
|
21
|
+
}
|
|
22
|
+
export function getBvhBounds(geometry) {
|
|
23
|
+
const bvh = getGeometryBvh(geometry);
|
|
24
|
+
const floats = new Float32Array(bvh.buffer);
|
|
25
|
+
if (bvh.layout === 'bvh4') {
|
|
26
|
+
return [
|
|
27
|
+
[floats[0], floats[1], floats[2]],
|
|
28
|
+
[
|
|
29
|
+
floats[0] + floats[3],
|
|
30
|
+
floats[1] + floats[4],
|
|
31
|
+
floats[2] + floats[5]
|
|
32
|
+
]
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
if (bvh.layout === 'bvh-gpu') {
|
|
36
|
+
const words = new Uint32Array(bvh.buffer);
|
|
37
|
+
if (words[11] === 0) {
|
|
38
|
+
return [
|
|
39
|
+
[
|
|
40
|
+
Math.min(floats[0], floats[8]),
|
|
41
|
+
Math.min(floats[1], floats[9]),
|
|
42
|
+
Math.min(floats[2], floats[10])
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
Math.max(floats[4], floats[12]),
|
|
46
|
+
Math.max(floats[5], floats[13]),
|
|
47
|
+
Math.max(floats[6], floats[14])
|
|
48
|
+
]
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
// A single-leaf BVH_GPU node does not store its own bounds.
|
|
52
|
+
return computeGeometryBounds(geometry);
|
|
53
|
+
}
|
|
54
|
+
if (bvh.layout === 'cwbvh') {
|
|
55
|
+
const words = new Uint32Array(bvh.buffer);
|
|
56
|
+
const header = words[3];
|
|
57
|
+
const signedByte = (value) => (value << 24) >> 24;
|
|
58
|
+
const scale = [
|
|
59
|
+
2 ** signedByte(header),
|
|
60
|
+
2 ** signedByte(header >> 8),
|
|
61
|
+
2 ** signedByte(header >> 16)
|
|
62
|
+
];
|
|
63
|
+
const min = [floats[0], floats[1], floats[2]];
|
|
64
|
+
const max = [...min];
|
|
65
|
+
for (let slot = 0; slot < 8; slot++) {
|
|
66
|
+
const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;
|
|
67
|
+
if (!meta)
|
|
68
|
+
continue;
|
|
69
|
+
const shift = (slot & 3) * 8;
|
|
70
|
+
const half = slot >> 2;
|
|
71
|
+
max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);
|
|
72
|
+
max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);
|
|
73
|
+
max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);
|
|
74
|
+
}
|
|
75
|
+
return [min, max];
|
|
76
|
+
}
|
|
77
|
+
return [
|
|
78
|
+
[floats[0], floats[1], floats[2]],
|
|
79
|
+
[floats[4], floats[5], floats[6]]
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=geometryBvhBounds.js.map
|