@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,192 @@
|
|
|
1
|
+
import { matrixStorage } from '../math/storage.js';
|
|
2
|
+
import { read, write } from '../math/access.js';
|
|
3
|
+
export { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';
|
|
4
|
+
import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';
|
|
5
|
+
export function packLightsData(lights, texturesIndices, selectionPmf, selectionCdf, iesProfileTexelOffset) {
|
|
6
|
+
validateSceneLights(lights);
|
|
7
|
+
const numLights = lights.length;
|
|
8
|
+
const PIXELS_PER_LIGHT = 6;
|
|
9
|
+
const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);
|
|
10
|
+
function packVec3(idx, v) {
|
|
11
|
+
for (let i = 0; i < 3; i++) {
|
|
12
|
+
data[i + idx * 4] = read(v, i);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
for (let i = 0; i < numLights; i++) {
|
|
16
|
+
const light = lights[i];
|
|
17
|
+
const color = light.color;
|
|
18
|
+
const intensity = light.intensity;
|
|
19
|
+
const off = i * PIXELS_PER_LIGHT;
|
|
20
|
+
packVec3(off, [read(light.transform, 12), read(light.transform, 13), read(light.transform, 14)]);
|
|
21
|
+
data[off * 4 + 3] = selectionPmf(i) ?? 1 / Math.max(numLights, 1);
|
|
22
|
+
// emission
|
|
23
|
+
const emissionScale = light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;
|
|
24
|
+
packVec3(off + 1, [
|
|
25
|
+
color[0] * emissionScale,
|
|
26
|
+
color[1] * emissionScale,
|
|
27
|
+
color[2] * emissionScale
|
|
28
|
+
]);
|
|
29
|
+
data[(off + 1) * 4 + 3] = selectionCdf(i) ?? (i + 1) / numLights;
|
|
30
|
+
if (light.type === 'RectLight') {
|
|
31
|
+
packVec3(off + 2, getRectLightUOrV(light, 0));
|
|
32
|
+
data[(off + 2) * 4 + 3] = light.spread;
|
|
33
|
+
packVec3(off + 3, getRectLightUOrV(light, 1));
|
|
34
|
+
data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;
|
|
35
|
+
packVec3(off + 4, [
|
|
36
|
+
light.spread,
|
|
37
|
+
getRectLightArea(light),
|
|
38
|
+
CONSTANT_RECT_LIGHT
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
else if (light.type === 'SphereLight') {
|
|
42
|
+
packVec3(off + 4, [
|
|
43
|
+
light.radius,
|
|
44
|
+
getSphereLightArea(light),
|
|
45
|
+
CONSTANT_SPHERE_LIGHT
|
|
46
|
+
]);
|
|
47
|
+
}
|
|
48
|
+
else if (light.type === 'SpotLight') {
|
|
49
|
+
packVec3(off + 2, getLightDirection(light));
|
|
50
|
+
packVec3(off + 3, [
|
|
51
|
+
Math.cos((light.outerAngle * Math.PI) / 180),
|
|
52
|
+
Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),
|
|
53
|
+
0
|
|
54
|
+
]);
|
|
55
|
+
data[(off + 3) * 4 + 3] = iesProfileTexelOffset(i) ?? -1;
|
|
56
|
+
packVec3(off + 4, [
|
|
57
|
+
light.radius,
|
|
58
|
+
getSpotLightArea(light),
|
|
59
|
+
CONSTANT_SPOT_LIGHT
|
|
60
|
+
]);
|
|
61
|
+
}
|
|
62
|
+
else if (light.type === 'DirectionalLight') {
|
|
63
|
+
packVec3(off + 2, getLightDirection(light));
|
|
64
|
+
packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);
|
|
65
|
+
}
|
|
66
|
+
packVec3(off + 5, getRigidLightFrame(light).x);
|
|
67
|
+
}
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
export function getRigidLightFrame(light) {
|
|
71
|
+
const m = matrixStorage(light.transform);
|
|
72
|
+
const normalize = (v, fallback) => {
|
|
73
|
+
const length = Math.hypot(read(v, 0), read(v, 1), read(v, 2));
|
|
74
|
+
return length > 1e-12 ? [read(v, 0) / length, read(v, 1) / length, read(v, 2) / length] : fallback;
|
|
75
|
+
};
|
|
76
|
+
const z = normalize([read(m, 8), read(m, 9), read(m, 10)], [0, 0, 1]);
|
|
77
|
+
const projection = read(m, 0) * read(z, 0) + read(m, 1) * read(z, 1) + read(m, 2) * read(z, 2);
|
|
78
|
+
let x = [read(m, 0) - projection * read(z, 0), read(m, 1) - projection * read(z, 1), read(m, 2) - projection * read(z, 2)];
|
|
79
|
+
if (Math.hypot(...x) <= 1e-12)
|
|
80
|
+
x = Math.abs(read(z, 1)) < .99 ? [read(z, 2), 0, -read(z, 0)] : [1, 0, 0];
|
|
81
|
+
x = normalize(x, [1, 0, 0]);
|
|
82
|
+
const y = [read(z, 1) * read(x, 2) - read(z, 2) * read(x, 1), read(z, 2) * read(x, 0) - read(z, 0) * read(x, 2), read(z, 0) * read(x, 1) - read(z, 1) * read(x, 0)];
|
|
83
|
+
return { x, y, direction: [-read(z, 0) || 0, -read(z, 1) || 0, -read(z, 2) || 0] };
|
|
84
|
+
}
|
|
85
|
+
export function getLightDirection(light) { return getRigidLightFrame(light).direction; }
|
|
86
|
+
export function getRectLightUOrV(light, uOrV) {
|
|
87
|
+
const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;
|
|
88
|
+
const dimensions = matrixStorage(light.size);
|
|
89
|
+
const size = dimensions[uOrV] * (uOrV ? -1 : 1);
|
|
90
|
+
return [read(axis, 0) * size, read(axis, 1) * size, read(axis, 2) * size];
|
|
91
|
+
}
|
|
92
|
+
export function getRectLightArea(light) {
|
|
93
|
+
const size = matrixStorage(light.size);
|
|
94
|
+
return size[0] * size[1];
|
|
95
|
+
}
|
|
96
|
+
export function getSphereLightArea(light) {
|
|
97
|
+
return 4 * Math.PI * light.radius ** 2;
|
|
98
|
+
}
|
|
99
|
+
export function getSpotLightArea(light) {
|
|
100
|
+
return 4 * Math.PI * light.radius ** 2;
|
|
101
|
+
}
|
|
102
|
+
export function getSpotLightRadiance(light) {
|
|
103
|
+
// A zero-radius spot is a point emitter. Its stored emission is luminous
|
|
104
|
+
// intensity (cd), and the shader applies inverse-square attenuation.
|
|
105
|
+
if (light.radius === 0)
|
|
106
|
+
return light.intensity;
|
|
107
|
+
return light.intensity / (Math.PI * light.radius ** 2);
|
|
108
|
+
}
|
|
109
|
+
export function getSpotLightShapingFluxFactor(light) {
|
|
110
|
+
const cosOuter = Math.cos((light.outerAngle * Math.PI) / 180);
|
|
111
|
+
const cosInner = Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180);
|
|
112
|
+
return 0.5 * (1 - 0.5 * (cosInner + cosOuter));
|
|
113
|
+
}
|
|
114
|
+
const warnedLights = new WeakSet();
|
|
115
|
+
/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */
|
|
116
|
+
export function validateSceneLights(lights, onError) {
|
|
117
|
+
for (const light of lights) {
|
|
118
|
+
if (light.type === 'EnvironmentLight')
|
|
119
|
+
continue;
|
|
120
|
+
let invalid = false;
|
|
121
|
+
const clamp = (value, min, max, fallback) => {
|
|
122
|
+
const normalized = Math.min(max, Math.max(min, Number.isFinite(value) ? value : fallback));
|
|
123
|
+
invalid ||= !Object.is(normalized, value);
|
|
124
|
+
return normalized;
|
|
125
|
+
};
|
|
126
|
+
switch (light.type) {
|
|
127
|
+
case 'AmbientLight':
|
|
128
|
+
sanitizeIntensity(light, clamp);
|
|
129
|
+
break;
|
|
130
|
+
case 'DirectionalLight':
|
|
131
|
+
sanitizeIntensity(light, clamp);
|
|
132
|
+
break;
|
|
133
|
+
case 'RectLight':
|
|
134
|
+
sanitizeIntensity(light, clamp);
|
|
135
|
+
break;
|
|
136
|
+
case 'SphereLight':
|
|
137
|
+
sanitizeIntensity(light, clamp);
|
|
138
|
+
break;
|
|
139
|
+
case 'SpotLight':
|
|
140
|
+
sanitizeIntensity(light, clamp);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
if (light.type !== 'AmbientLight') {
|
|
144
|
+
const matrix = light.transform;
|
|
145
|
+
invalid = (matrix instanceof Float32Array ? sanitizeMatrix(matrix) : sanitizeMatrix(matrix)) || invalid;
|
|
146
|
+
}
|
|
147
|
+
if (light.type === 'RectLight') {
|
|
148
|
+
// A tuple widened to number[] is copied by this native compiler. Mutate
|
|
149
|
+
// each concrete storage directly so invalid edits still sanitize in place.
|
|
150
|
+
const size = light.size;
|
|
151
|
+
if (size instanceof Float32Array) {
|
|
152
|
+
size[0] = clamp(size[0], 0, Number.MAX_VALUE, 1);
|
|
153
|
+
size[1] = clamp(size[1], 0, Number.MAX_VALUE, 1);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
size[0] = clamp(size[0], 0, Number.MAX_VALUE, 1);
|
|
157
|
+
size[1] = clamp(size[1], 0, Number.MAX_VALUE, 1);
|
|
158
|
+
}
|
|
159
|
+
light.spread = clamp(light.spread, 0, 1, 1);
|
|
160
|
+
}
|
|
161
|
+
if (light.type === 'SphereLight')
|
|
162
|
+
light.radius = clamp(light.radius, 0, Number.MAX_VALUE, 1);
|
|
163
|
+
if (light.type === 'SpotLight')
|
|
164
|
+
light.radius = clamp(light.radius, 0, Number.MAX_VALUE, .01);
|
|
165
|
+
if (light.type === 'SpotLight') {
|
|
166
|
+
light.outerAngle = clamp(light.outerAngle, Number.EPSILON, 180, 45);
|
|
167
|
+
light.innerAngle = clamp(light.innerAngle, 0, light.outerAngle, 30);
|
|
168
|
+
}
|
|
169
|
+
if (invalid && !warnedLights.has(light)) {
|
|
170
|
+
warnedLights.add(light);
|
|
171
|
+
const error = new Error(`Invalid ${light.type} values were clamped.`);
|
|
172
|
+
console.warn(error.message);
|
|
173
|
+
onError?.(error);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function sanitizeIntensity(light, clamp) {
|
|
178
|
+
light.intensity = clamp(light.intensity, 0, Number.MAX_VALUE, 1);
|
|
179
|
+
light.color[0] = clamp(light.color[0], 0, Number.MAX_VALUE, 1);
|
|
180
|
+
light.color[1] = clamp(light.color[1], 0, Number.MAX_VALUE, 1);
|
|
181
|
+
light.color[2] = clamp(light.color[2], 0, Number.MAX_VALUE, 1);
|
|
182
|
+
}
|
|
183
|
+
function sanitizeMatrix(matrix) {
|
|
184
|
+
let invalid = false;
|
|
185
|
+
for (let i = 0; i < 16; i++)
|
|
186
|
+
if (!Number.isFinite(read(matrix, i))) {
|
|
187
|
+
write(matrix, i, i % 5 === 0 ? 1 : 0);
|
|
188
|
+
invalid = true;
|
|
189
|
+
}
|
|
190
|
+
return invalid;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=lightsData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightsData.js","sourceRoot":"","sources":["../../src/renderer/lightsData.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type { SceneLightState as SceneLight, AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read, write } from '../math/access.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport type RectLight from '../scene/RectLightState.js';\nimport SpotLight from '../scene/SpotLight.js';\n\nexport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\n\nexport function packLightsData(\n lights: (DirectionalLight | RectLight | SphereLight | SpotLight)[],\n texturesIndices: number[],\n selectionPmf: (index: number) => number | undefined,\n selectionCdf: (index: number) => number | undefined,\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n const PIXELS_PER_LIGHT = 6;\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3(idx: number, v: number[] | Float32Array) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [read(light.transform, 12), read(light.transform, 13), read(light.transform, 14)]\n );\n data[off * 4 + 3] = selectionPmf(i) ?? 1 / Math.max(numLights, 1);\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n data[(off + 1) * 4 + 3] = selectionCdf(i) ?? (i + 1) / numLights;\n if (light.type === 'RectLight') {\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;\n packVec3(off + 4, [\n light.spread,\n getRectLightArea(light),\n CONSTANT_RECT_LIGHT\n ]);\n } else if (light.type === 'SphereLight') {\n packVec3(off + 4, [\n light.radius,\n getSphereLightArea(light),\n CONSTANT_SPHERE_LIGHT\n ]);\n } else if (light.type === 'SpotLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n data[(off + 3) * 4 + 3] = iesProfileTexelOffset(i) ?? -1;\n packVec3(off + 4, [\n light.radius,\n getSpotLightArea(light),\n CONSTANT_SPOT_LIGHT\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);\n }\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n\nexport function getRigidLightFrame(light: AnalyticLight) {\n const m = matrixStorage(light.transform);\n const normalize = (v: number[], fallback: number[]): number[] => {\n const length = Math.hypot(read(v, 0), read(v, 1), read(v, 2));\n return length > 1e-12 ? [read(v, 0)/length, read(v, 1)/length, read(v, 2)/length] : fallback;\n };\n const z = normalize([read(m, 8),read(m, 9),read(m, 10)], [0,0,1]);\n const projection = read(m, 0)*read(z, 0) + read(m, 1)*read(z, 1) + read(m, 2)*read(z, 2);\n let x: number[] = [read(m, 0)-projection*read(z, 0),read(m, 1)-projection*read(z, 1),read(m, 2)-projection*read(z, 2)];\n if (Math.hypot(...x) <= 1e-12) x = Math.abs(read(z, 1)) < .99 ? [read(z, 2),0,-read(z, 0)] : [1,0,0];\n x = normalize(x, [1,0,0]);\n const y: number[] = [read(z, 1)*read(x, 2)-read(z, 2)*read(x, 1), read(z, 2)*read(x, 0)-read(z, 0)*read(x, 2), read(z, 0)*read(x, 1)-read(z, 1)*read(x, 0)];\n return { x, y, direction: [-read(z, 0) || 0,-read(z, 1) || 0,-read(z, 2) || 0] as number[] };\n}\nexport function getLightDirection(light: AnalyticLight) { return getRigidLightFrame(light).direction; }\nexport function getRectLightUOrV(light: RectLight, uOrV: 0 | 1) {\n const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;\n const dimensions = matrixStorage(light.size);\n const size = dimensions[uOrV] * (uOrV ? -1 : 1);\n return [read(axis, 0)*size,read(axis, 1)*size,read(axis, 2)*size];\n}\n\nexport function getRectLightArea(light: RectLight) {\n const size = matrixStorage(light.size);\n return size[0] * size[1];\n}\n\nexport function getSphereLightArea(light: SphereLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightArea(light: SpotLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightRadiance(light: SpotLight) {\n // A zero-radius spot is a point emitter. Its stored emission is luminous\n // intensity (cd), and the shader applies inverse-square attenuation.\n if (light.radius === 0) return light.intensity;\n return light.intensity / (Math.PI * light.radius ** 2);\n}\n\nexport function getSpotLightShapingFluxFactor(light: SpotLight) {\n const cosOuter = Math.cos((light.outerAngle * Math.PI) / 180);\n const cosInner = Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180);\n return 0.5 * (1 - 0.5 * (cosInner + cosOuter));\n}\n\nconst warnedLights = new WeakSet<SceneLight>();\n/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */\nexport function validateSceneLights(lights: readonly SceneLight[], onError?: (error: Error) => void) {\n for (const light of lights) {\n if (light.type === 'EnvironmentLight') continue;\n let invalid = false;\n const clamp = (value: number, min: number, max: number, fallback: number) => {\n const normalized = Math.min(max,Math.max(min,Number.isFinite(value) ? value : fallback));\n invalid ||= !Object.is(normalized,value);\n return normalized;\n };\n switch (light.type) {\n case 'AmbientLight': sanitizeIntensity(light, clamp); break;\n case 'DirectionalLight': sanitizeIntensity(light, clamp); break;\n case 'RectLight': sanitizeIntensity(light, clamp); break;\n case 'SphereLight': sanitizeIntensity(light, clamp); break;\n case 'SpotLight': sanitizeIntensity(light, clamp); break;\n }\n if (light.type !== 'AmbientLight') {\n const matrix = light.transform;\n invalid = (matrix instanceof Float32Array ? sanitizeMatrix(matrix) : sanitizeMatrix(matrix)) || invalid;\n }\n if (light.type === 'RectLight') {\n // A tuple widened to number[] is copied by this native compiler. Mutate\n // each concrete storage directly so invalid edits still sanitize in place.\n const size = light.size;\n if (size instanceof Float32Array) {\n size[0] = clamp(size[0],0,Number.MAX_VALUE,1);\n size[1] = clamp(size[1],0,Number.MAX_VALUE,1);\n } else {\n size[0] = clamp(size[0],0,Number.MAX_VALUE,1);\n size[1] = clamp(size[1],0,Number.MAX_VALUE,1);\n }\n light.spread = clamp(light.spread,0,1,1);\n }\n if (light.type === 'SphereLight') light.radius = clamp(light.radius,0,Number.MAX_VALUE,1);\n if (light.type === 'SpotLight') light.radius = clamp(light.radius,0,Number.MAX_VALUE,.01);\n if (light.type === 'SpotLight') {\n light.outerAngle = clamp(light.outerAngle,Number.EPSILON,180,45);\n light.innerAngle = clamp(light.innerAngle,0,light.outerAngle,30);\n }\n if (invalid && !warnedLights.has(light)) {\n warnedLights.add(light);\n const error = new Error(`Invalid ${light.type} values were clamped.`);\n console.warn(error.message);\n onError?.(error);\n }\n }\n}\n\nfunction sanitizeIntensity<L extends {intensity: number; color: [number, number, number]}>(light: L,\n clamp: (value: number, min: number, max: number, fallback: number) => number) {\n light.intensity = clamp(light.intensity,0,Number.MAX_VALUE,1);\n light.color[0] = clamp(light.color[0],0,Number.MAX_VALUE,1);\n light.color[1] = clamp(light.color[1],0,Number.MAX_VALUE,1);\n light.color[2] = clamp(light.color[2],0,Number.MAX_VALUE,1);\n}\n\nfunction sanitizeMatrix<T extends Float32Array | number[]>(matrix: T): boolean {\n let invalid = false;\n for (let i = 0; i < 16; i++) if (!Number.isFinite(read(matrix, i))) {\n write(matrix, i, i % 5 === 0 ? 1 : 0); invalid = true;\n }\n return invalid;\n}\n"]}
|
|
@@ -1,26 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import SphereLight from '../scene/SphereLight.js';
|
|
5
|
-
import RectLight from '../scene/RectLight.js';
|
|
6
|
-
import SpotLight from '../scene/SpotLight.js';
|
|
7
|
-
export declare const CONSTANT_DIRECTIONAL_LIGHT = 1;
|
|
8
|
-
export declare const CONSTANT_SPHERE_LIGHT = 2;
|
|
9
|
-
export declare const CONSTANT_RECT_LIGHT = 3;
|
|
10
|
-
export declare const CONSTANT_SPOT_LIGHT = 4;
|
|
11
|
-
export declare function packLightsToBuffer(lights: (DirectionalLight | RectLight | SphereLight | SpotLight)[], texturesIndices: number[], selectionPmfs?: ArrayLike<number>, selectionCdfs?: ArrayLike<number>, iesProfileTexelOffsets?: ArrayLike<number>): Float32Array<ArrayBuffer>;
|
|
12
|
-
export declare function getRigidLightFrame(light: AnalyticLight): {
|
|
13
|
-
x: Vec3;
|
|
14
|
-
y: [number, number, number];
|
|
15
|
-
direction: Vec3;
|
|
16
|
-
};
|
|
17
|
-
export declare function getLightDirection(light: AnalyticLight): Vec3;
|
|
18
|
-
export declare function getRectLightUOrV(light: RectLight, uOrV: 0 | 1): number[];
|
|
19
|
-
export declare function getRectLightPosition(light: RectLight): Vec3;
|
|
20
|
-
export declare function getRectLightArea(light: RectLight): number;
|
|
21
|
-
export declare function getSphereLightArea(light: SphereLight): number;
|
|
22
|
-
export declare function getSpotLightArea(light: SpotLight): number;
|
|
23
|
-
export declare function getSpotLightRadiance(light: SpotLight): number;
|
|
24
|
-
export declare function getSpotLightShapingFluxFactor(light: SpotLight): number;
|
|
25
|
-
/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */
|
|
26
|
-
export declare function validateSceneLights(lights: readonly SceneLight[], onError?: (error: Error) => void): void;
|
|
1
|
+
import type { AnalyticLight } from '../scene/Scene.js';
|
|
2
|
+
export * from './lightsData.js';
|
|
3
|
+
export declare function packLightsToBuffer(lights: AnalyticLight[], texturesIndices: number[], selectionPmfs?: ArrayLike<number>, selectionCdfs?: ArrayLike<number>, iesProfileTexelOffsets?: ArrayLike<number>): Float32Array<ArrayBuffer>;
|
|
@@ -1,156 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
export const CONSTANT_RECT_LIGHT = 3;
|
|
4
|
-
export const CONSTANT_SPOT_LIGHT = 4;
|
|
1
|
+
import { packLightsData } from './lightsData.js';
|
|
2
|
+
export * from './lightsData.js';
|
|
5
3
|
export function packLightsToBuffer(lights, texturesIndices, selectionPmfs = [], selectionCdfs = [], iesProfileTexelOffsets = []) {
|
|
6
|
-
|
|
7
|
-
const numLights = lights.length;
|
|
8
|
-
const PIXELS_PER_LIGHT = 6;
|
|
9
|
-
const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);
|
|
10
|
-
function packVec3(idx, v) {
|
|
11
|
-
for (let i = 0; i < 3; i++) {
|
|
12
|
-
data[i + idx * 4] = v[i];
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
for (let i = 0; i < numLights; i++) {
|
|
16
|
-
const light = lights[i];
|
|
17
|
-
const color = light.color;
|
|
18
|
-
const intensity = light.intensity;
|
|
19
|
-
const off = i * PIXELS_PER_LIGHT;
|
|
20
|
-
packVec3(off, light.position);
|
|
21
|
-
data[off * 4 + 3] = selectionPmfs[i] ?? 1 / Math.max(numLights, 1);
|
|
22
|
-
// emission
|
|
23
|
-
const emissionScale = light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;
|
|
24
|
-
packVec3(off + 1, [
|
|
25
|
-
color[0] * emissionScale,
|
|
26
|
-
color[1] * emissionScale,
|
|
27
|
-
color[2] * emissionScale
|
|
28
|
-
]);
|
|
29
|
-
data[(off + 1) * 4 + 3] = selectionCdfs[i] ?? (i + 1) / numLights;
|
|
30
|
-
if (light.type === 'RectLight') {
|
|
31
|
-
packVec3(off + 2, getRectLightUOrV(light, 0));
|
|
32
|
-
data[(off + 2) * 4 + 3] = light.spread;
|
|
33
|
-
packVec3(off + 3, getRectLightUOrV(light, 1));
|
|
34
|
-
data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;
|
|
35
|
-
packVec3(off + 4, [
|
|
36
|
-
light.spread,
|
|
37
|
-
getRectLightArea(light),
|
|
38
|
-
CONSTANT_RECT_LIGHT
|
|
39
|
-
]);
|
|
40
|
-
}
|
|
41
|
-
else if (light.type === 'SphereLight') {
|
|
42
|
-
packVec3(off + 4, [
|
|
43
|
-
light.radius,
|
|
44
|
-
getSphereLightArea(light),
|
|
45
|
-
CONSTANT_SPHERE_LIGHT
|
|
46
|
-
]);
|
|
47
|
-
}
|
|
48
|
-
else if (light.type === 'SpotLight') {
|
|
49
|
-
packVec3(off + 2, getLightDirection(light));
|
|
50
|
-
packVec3(off + 3, [
|
|
51
|
-
Math.cos((light.outerAngle * Math.PI) / 180),
|
|
52
|
-
Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),
|
|
53
|
-
0
|
|
54
|
-
]);
|
|
55
|
-
data[(off + 3) * 4 + 3] = iesProfileTexelOffsets[i] ?? -1;
|
|
56
|
-
packVec3(off + 4, [
|
|
57
|
-
light.radius,
|
|
58
|
-
getSpotLightArea(light),
|
|
59
|
-
CONSTANT_SPOT_LIGHT
|
|
60
|
-
]);
|
|
61
|
-
}
|
|
62
|
-
else if (light.type === 'DirectionalLight') {
|
|
63
|
-
packVec3(off + 2, getLightDirection(light));
|
|
64
|
-
packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);
|
|
65
|
-
}
|
|
66
|
-
packVec3(off + 5, getRigidLightFrame(light).x);
|
|
67
|
-
}
|
|
68
|
-
return data;
|
|
69
|
-
}
|
|
70
|
-
export function getRigidLightFrame(light) {
|
|
71
|
-
const m = light.transform;
|
|
72
|
-
const normalize = (v, fallback) => {
|
|
73
|
-
const length = Math.hypot(v[0], v[1], v[2]);
|
|
74
|
-
return length > 1e-12 ? [v[0] / length, v[1] / length, v[2] / length] : fallback;
|
|
75
|
-
};
|
|
76
|
-
const z = normalize([m[8], m[9], m[10]], [0, 0, 1]);
|
|
77
|
-
const projection = m[0] * z[0] + m[1] * z[1] + m[2] * z[2];
|
|
78
|
-
let x = [m[0] - projection * z[0], m[1] - projection * z[1], m[2] - projection * z[2]];
|
|
79
|
-
if (Math.hypot(...x) <= 1e-12)
|
|
80
|
-
x = Math.abs(z[1]) < .99 ? [z[2], 0, -z[0]] : [1, 0, 0];
|
|
81
|
-
x = normalize(x, [1, 0, 0]);
|
|
82
|
-
const y = [z[1] * x[2] - z[2] * x[1], z[2] * x[0] - z[0] * x[2], z[0] * x[1] - z[1] * x[0]];
|
|
83
|
-
return { x, y, direction: [-z[0] || 0, -z[1] || 0, -z[2] || 0] };
|
|
84
|
-
}
|
|
85
|
-
export function getLightDirection(light) { return getRigidLightFrame(light).direction; }
|
|
86
|
-
export function getRectLightUOrV(light, uOrV) {
|
|
87
|
-
const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;
|
|
88
|
-
const size = light.size[uOrV] * (uOrV ? -1 : 1);
|
|
89
|
-
return [axis[0] * size, axis[1] * size, axis[2] * size];
|
|
90
|
-
}
|
|
91
|
-
export function getRectLightPosition(light) { return light.position; }
|
|
92
|
-
export function getRectLightArea(light) {
|
|
93
|
-
return light.size[0] * light.size[1];
|
|
94
|
-
}
|
|
95
|
-
export function getSphereLightArea(light) {
|
|
96
|
-
return 4 * Math.PI * light.radius ** 2;
|
|
97
|
-
}
|
|
98
|
-
export function getSpotLightArea(light) {
|
|
99
|
-
return 4 * Math.PI * light.radius ** 2;
|
|
100
|
-
}
|
|
101
|
-
export function getSpotLightRadiance(light) {
|
|
102
|
-
// A zero-radius spot is a point emitter. Its stored emission is luminous
|
|
103
|
-
// intensity (cd), and the shader applies inverse-square attenuation.
|
|
104
|
-
if (light.radius === 0)
|
|
105
|
-
return light.intensity;
|
|
106
|
-
return light.intensity / (Math.PI * light.radius ** 2);
|
|
107
|
-
}
|
|
108
|
-
export function getSpotLightShapingFluxFactor(light) {
|
|
109
|
-
// Fraction of the full sphere covered by the cone. The smoothstep falloff
|
|
110
|
-
// between the inner and outer cosines integrates to half its width.
|
|
111
|
-
const cosOuter = Math.cos((light.outerAngle * Math.PI) / 180);
|
|
112
|
-
const cosInner = Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180);
|
|
113
|
-
return 0.5 * (1 - 0.5 * (cosInner + cosOuter));
|
|
114
|
-
}
|
|
115
|
-
const warnedLights = new WeakSet();
|
|
116
|
-
/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */
|
|
117
|
-
export function validateSceneLights(lights, onError) {
|
|
118
|
-
for (const light of lights) {
|
|
119
|
-
if (light.type === 'EnvironmentLight')
|
|
120
|
-
continue;
|
|
121
|
-
let invalid = false;
|
|
122
|
-
const clamp = (value, min, max, fallback) => {
|
|
123
|
-
const normalized = Math.min(max, Math.max(min, Number.isFinite(value) ? value : fallback));
|
|
124
|
-
invalid ||= !Object.is(normalized, value);
|
|
125
|
-
return normalized;
|
|
126
|
-
};
|
|
127
|
-
light.intensity = clamp(light.intensity, 0, Number.MAX_VALUE, 1);
|
|
128
|
-
for (let i = 0; i < 3; i++)
|
|
129
|
-
light.color[i] = clamp(light.color[i], 0, Number.MAX_VALUE, 1);
|
|
130
|
-
if (light.type !== 'AmbientLight') {
|
|
131
|
-
for (let i = 0; i < 16; i++)
|
|
132
|
-
if (!Number.isFinite(light.transform[i])) {
|
|
133
|
-
light.transform[i] = i % 5 === 0 ? 1 : 0;
|
|
134
|
-
invalid = true;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (light.type === 'RectLight') {
|
|
138
|
-
for (let i = 0; i < 2; i++)
|
|
139
|
-
light.size[i] = clamp(light.size[i], 0, Number.MAX_VALUE, 1);
|
|
140
|
-
light.spread = clamp(light.spread, 0, 1, 1);
|
|
141
|
-
}
|
|
142
|
-
if (light.type === 'SphereLight' || light.type === 'SpotLight')
|
|
143
|
-
light.radius = clamp(light.radius, 0, Number.MAX_VALUE, light.type === 'SpotLight' ? .01 : 1);
|
|
144
|
-
if (light.type === 'SpotLight') {
|
|
145
|
-
light.outerAngle = clamp(light.outerAngle, Number.EPSILON, 180, 45);
|
|
146
|
-
light.innerAngle = clamp(light.innerAngle, 0, light.outerAngle, 30);
|
|
147
|
-
}
|
|
148
|
-
if (invalid && !warnedLights.has(light)) {
|
|
149
|
-
warnedLights.add(light);
|
|
150
|
-
const error = new Error(`Invalid ${light.type} values were clamped.`);
|
|
151
|
-
console.warn(error.message);
|
|
152
|
-
onError?.(error);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
4
|
+
return packLightsData(lights, texturesIndices, i => selectionPmfs[i], i => selectionCdfs[i], i => iesProfileTexelOffsets[i]);
|
|
155
5
|
}
|
|
156
6
|
//# sourceMappingURL=lightsUtil.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightsUtil.js","sourceRoot":"","sources":["../../src/renderer/lightsUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SceneLight, AnalyticLight } from '../scene/Scene.js';\nimport type { Vec3 } from '../types.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\n\nexport const CONSTANT_DIRECTIONAL_LIGHT = 1;\nexport const CONSTANT_SPHERE_LIGHT = 2;\nexport const CONSTANT_RECT_LIGHT = 3;\nexport const CONSTANT_SPOT_LIGHT = 4;\n\nexport function packLightsToBuffer(\n lights: (DirectionalLight | RectLight | SphereLight | SpotLight)[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number> = [],\n selectionCdfs: ArrayLike<number> = [],\n iesProfileTexelOffsets: ArrayLike<number> = []\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n const PIXELS_PER_LIGHT = 6;\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3(idx: number, v: number[] | Float32Array) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = v[i];\n }\n }\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n light.position\n );\n data[off * 4 + 3] = selectionPmfs[i] ?? 1 / Math.max(numLights, 1);\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n data[(off + 1) * 4 + 3] = selectionCdfs[i] ?? (i + 1) / numLights;\n if (light.type === 'RectLight') {\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;\n packVec3(off + 4, [\n light.spread,\n getRectLightArea(light),\n CONSTANT_RECT_LIGHT\n ]);\n } else if (light.type === 'SphereLight') {\n packVec3(off + 4, [\n light.radius,\n getSphereLightArea(light),\n CONSTANT_SPHERE_LIGHT\n ]);\n } else if (light.type === 'SpotLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n data[(off + 3) * 4 + 3] = iesProfileTexelOffsets[i] ?? -1;\n packVec3(off + 4, [\n light.radius,\n getSpotLightArea(light),\n CONSTANT_SPOT_LIGHT\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);\n }\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n\nexport function getRigidLightFrame(light: AnalyticLight) {\n const m = light.transform;\n const normalize = (v: Vec3, fallback: Vec3): Vec3 => {\n const length = Math.hypot(v[0], v[1], v[2]);\n return length > 1e-12 ? [v[0]/length, v[1]/length, v[2]/length] : fallback;\n };\n const z = normalize([m[8],m[9],m[10]], [0,0,1]);\n const projection = m[0]*z[0] + m[1]*z[1] + m[2]*z[2];\n let x: Vec3 = [m[0]-projection*z[0],m[1]-projection*z[1],m[2]-projection*z[2]];\n if (Math.hypot(...x) <= 1e-12) x = Math.abs(z[1]) < .99 ? [z[2],0,-z[0]] : [1,0,0];\n x = normalize(x, [1,0,0]);\n const y: Vec3 = [z[1]*x[2]-z[2]*x[1], z[2]*x[0]-z[0]*x[2], z[0]*x[1]-z[1]*x[0]];\n return { x, y, direction: [-z[0] || 0,-z[1] || 0,-z[2] || 0] as Vec3 };\n}\nexport function getLightDirection(light: AnalyticLight) { return getRigidLightFrame(light).direction; }\nexport function getRectLightUOrV(light: RectLight, uOrV: 0 | 1) {\n const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;\n const size = light.size[uOrV] * (uOrV ? -1 : 1);\n return [axis[0]*size,axis[1]*size,axis[2]*size];\n}\nexport function getRectLightPosition(light: RectLight) { return light.position; }\n\nexport function getRectLightArea(light: RectLight) {\n return light.size[0] * light.size[1];\n}\n\nexport function getSphereLightArea(light: SphereLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightArea(light: SpotLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightRadiance(light: SpotLight) {\n // A zero-radius spot is a point emitter. Its stored emission is luminous\n // intensity (cd), and the shader applies inverse-square attenuation.\n if (light.radius === 0) return light.intensity;\n return light.intensity / (Math.PI * light.radius ** 2);\n}\n\nexport function getSpotLightShapingFluxFactor(light: SpotLight) {\n // Fraction of the full sphere covered by the cone. The smoothstep falloff\n // between the inner and outer cosines integrates to half its width.\n const cosOuter = Math.cos((light.outerAngle * Math.PI) / 180);\n const cosInner = Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180);\n return 0.5 * (1 - 0.5 * (cosInner + cosOuter));\n}\n\nconst warnedLights = new WeakSet<SceneLight>();\n/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */\nexport function validateSceneLights(lights: readonly SceneLight[], onError?: (error: Error) => void) {\n for (const light of lights) {\n if (light.type === 'EnvironmentLight') continue;\n let invalid = false;\n const clamp = (value: number, min: number, max: number, fallback: number) => {\n const normalized = Math.min(max,Math.max(min,Number.isFinite(value) ? value : fallback));\n invalid ||= !Object.is(normalized,value);\n return normalized;\n };\n light.intensity = clamp(light.intensity,0,Number.MAX_VALUE,1);\n for(let i=0;i<3;i++)light.color[i] = clamp(light.color[i],0,Number.MAX_VALUE,1);\n if (light.type !== 'AmbientLight') {\n for(let i=0;i<16;i++) if (!Number.isFinite(light.transform[i])) {\n light.transform[i] = i % 5 === 0 ? 1 : 0; invalid = true;\n }\n }\n if (light.type === 'RectLight') {\n for(let i=0;i<2;i++)light.size[i] = clamp(light.size[i],0,Number.MAX_VALUE,1);\n light.spread = clamp(light.spread,0,1,1);\n }\n if (light.type === 'SphereLight' || light.type === 'SpotLight') light.radius = clamp(light.radius,0,Number.MAX_VALUE,light.type === 'SpotLight' ? .01 : 1);\n if (light.type === 'SpotLight') {\n light.outerAngle = clamp(light.outerAngle,Number.EPSILON,180,45);\n light.innerAngle = clamp(light.innerAngle,0,light.outerAngle,30);\n }\n if (invalid && !warnedLights.has(light)) {\n warnedLights.add(light);\n const error = new Error(`Invalid ${light.type} values were clamped.`);\n console.warn(error.message);\n onError?.(error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lightsUtil.js","sourceRoot":"","sources":["../../src/renderer/lightsUtil.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,cAAc,iBAAiB,CAAC;AAEhC,MAAM,UAAU,kBAAkB,CAAC,MAAuB,EAAE,eAAyB,EACnF,gBAAmC,EAAE,EAAE,gBAAmC,EAAE,EAC5E,yBAA4C,EAAE;IAE9C,OAAO,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/H,CAAC","sourcesContent":["import type { AnalyticLight } from '../scene/Scene.js';\nimport { packLightsData } from './lightsData.js';\nexport * from './lightsData.js';\n\nexport function packLightsToBuffer(lights: AnalyticLight[], texturesIndices: number[],\n selectionPmfs: ArrayLike<number> = [], selectionCdfs: ArrayLike<number> = [],\n iesProfileTexelOffsets: ArrayLike<number> = []\n) {\n return packLightsData(lights, texturesIndices, i => selectionPmfs[i], i => selectionCdfs[i], i => iesProfileTexelOffsets[i]);\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { MaterialTextureIndex } from './materialTextureSlots.js';
|
|
2
|
+
import type { ColorRGB } from '../types.js';
|
|
3
|
+
import type { vec2 } from '../math.js';
|
|
4
|
+
import type { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';
|
|
5
|
+
export interface BufferData extends Record<MaterialTextureIndex, number[]> {
|
|
6
|
+
color: ColorRGB[];
|
|
7
|
+
roughness: number[];
|
|
8
|
+
metallic: number[];
|
|
9
|
+
emission: ColorRGB[];
|
|
10
|
+
ior: number[];
|
|
11
|
+
transmission: number[];
|
|
12
|
+
dispersion: number[];
|
|
13
|
+
thinFilmThickness: number[];
|
|
14
|
+
thinFilmThicknessMinimum: number[];
|
|
15
|
+
thinFilmMapChannel: number[];
|
|
16
|
+
thinFilmIor: number[];
|
|
17
|
+
anisotropy: number[];
|
|
18
|
+
thin: number[];
|
|
19
|
+
doubleSided: number[];
|
|
20
|
+
bevelSize: number[];
|
|
21
|
+
mapAlphaUsage: number[];
|
|
22
|
+
normalScale: vec2.Vec2Array[];
|
|
23
|
+
type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];
|
|
24
|
+
mapInfo: number[];
|
|
25
|
+
mapTransform: number[];
|
|
26
|
+
mapWrap: number[];
|
|
27
|
+
mapUvChannel: number[];
|
|
28
|
+
mapColorLinear: number[];
|
|
29
|
+
mediumType: number[];
|
|
30
|
+
specularAnisotropyModel: number[];
|
|
31
|
+
specularAnisotropyRotation: number[];
|
|
32
|
+
coatAnisotropyRotation: number[];
|
|
33
|
+
coatNormalScale: vec2.Vec2Array[];
|
|
34
|
+
uvProjection: number[];
|
|
35
|
+
uvScale: vec2.Vec2Array[];
|
|
36
|
+
displacementUvProjection: number[];
|
|
37
|
+
displacementUvProjectionScale: number[];
|
|
38
|
+
displacementStepSize: number[];
|
|
39
|
+
displacementBias: number[];
|
|
40
|
+
alpha: number[];
|
|
41
|
+
alphaMode: number[];
|
|
42
|
+
alphaCutoff: number[];
|
|
43
|
+
baseWeight: number[];
|
|
44
|
+
baseDiffuseRoughness: number[];
|
|
45
|
+
specularWeight: number[];
|
|
46
|
+
specularColor: ColorRGB[];
|
|
47
|
+
transmissionColor: ColorRGB[];
|
|
48
|
+
transmissionDepth: number[];
|
|
49
|
+
transmissionScatter: ColorRGB[];
|
|
50
|
+
transmissionScatterAnisotropy: number[];
|
|
51
|
+
subsurfaceWeight: number[];
|
|
52
|
+
subsurfaceColor: ColorRGB[];
|
|
53
|
+
subsurfaceRadius: number[];
|
|
54
|
+
subsurfaceRadiusScale: ColorRGB[];
|
|
55
|
+
subsurfaceScatterAnisotropy: number[];
|
|
56
|
+
fuzzWeight: number[];
|
|
57
|
+
fuzzColor: ColorRGB[];
|
|
58
|
+
fuzzRoughness: number[];
|
|
59
|
+
coatWeight: number[];
|
|
60
|
+
coatColor: ColorRGB[];
|
|
61
|
+
coatRoughness: number[];
|
|
62
|
+
coatAnisotropy: number[];
|
|
63
|
+
coatIor: number[];
|
|
64
|
+
coatDarkening: number[];
|
|
65
|
+
thinFilmWeight: number[];
|
|
66
|
+
dispersionAbbeNumber: number[];
|
|
67
|
+
mediumExtinction: ColorRGB[];
|
|
68
|
+
mediumScattering: ColorRGB[];
|
|
69
|
+
mediumAnisotropy: number[];
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialBufferData.js","sourceRoot":"","sources":["../../src/renderer/materialBufferData.ts"],"names":[],"mappings":"","sourcesContent":["import type { MaterialTextureIndex } from './materialTextureSlots.js';\nimport type { ColorRGB } from '../types.js';\nimport type { vec2 } from '../math.js';\nimport type { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';\n\nexport interface BufferData extends Record<MaterialTextureIndex, number[]> {\n color: ColorRGB[];\n roughness: number[];\n metallic: number[];\n emission: ColorRGB[];\n ior: number[];\n transmission: number[];\n dispersion: number[];\n thinFilmThickness: number[];\n thinFilmThicknessMinimum: number[];\n thinFilmMapChannel: number[];\n thinFilmIor: number[];\n anisotropy: number[];\n thin: number[];\n doubleSided: number[];\n bevelSize: number[];\n mapAlphaUsage: number[];\n\n normalScale: vec2.Vec2Array[];\n\n type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];\n mapInfo: number[];\n mapTransform: number[];\n mapWrap: number[];\n mapUvChannel: number[];\n mapColorLinear: number[];\n\n mediumType: number[];\n specularAnisotropyModel: number[];\n specularAnisotropyRotation: number[];\n coatAnisotropyRotation: number[];\n coatNormalScale: vec2.Vec2Array[];\n\n uvProjection: number[];\n uvScale: vec2.Vec2Array[];\n\n displacementUvProjection: number[];\n displacementUvProjectionScale: number[];\n\n // For PDM displacement.\n displacementStepSize: number[];\n displacementBias: number[];\n\n // Alpha\n alpha: number[];\n alphaMode: number[];\n alphaCutoff: number[];\n\n baseWeight: number[];\n baseDiffuseRoughness: number[];\n specularWeight: number[];\n specularColor: ColorRGB[];\n transmissionColor: ColorRGB[];\n transmissionDepth: number[];\n transmissionScatter: ColorRGB[];\n transmissionScatterAnisotropy: number[];\n subsurfaceWeight: number[];\n subsurfaceColor: ColorRGB[];\n subsurfaceRadius: number[];\n subsurfaceRadiusScale: ColorRGB[];\n subsurfaceScatterAnisotropy: number[];\n fuzzWeight: number[];\n fuzzColor: ColorRGB[];\n fuzzRoughness: number[];\n coatWeight: number[];\n coatColor: ColorRGB[];\n coatRoughness: number[];\n coatAnisotropy: number[];\n coatIor: number[];\n coatDarkening: number[];\n thinFilmWeight: number[];\n dispersionAbbeNumber: number[];\n mediumExtinction: ColorRGB[];\n mediumScattering: ColorRGB[];\n mediumAnisotropy: number[];\n}\n"]}
|
|
@@ -4,3 +4,14 @@ export declare const mapAlphaUsageConstants: {
|
|
|
4
4
|
readonly alpha: 2;
|
|
5
5
|
readonly transmission: 3;
|
|
6
6
|
};
|
|
7
|
+
export declare const uvProjectionConstants: {
|
|
8
|
+
none: number;
|
|
9
|
+
spherical: number;
|
|
10
|
+
cylindrical: number;
|
|
11
|
+
triplanar: number;
|
|
12
|
+
};
|
|
13
|
+
export declare const materialAlphaModeConstants: {
|
|
14
|
+
readonly opaque: 0;
|
|
15
|
+
readonly mask: 1;
|
|
16
|
+
readonly blend: 2;
|
|
17
|
+
};
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
/** Numeric shader representation of the public map-alpha strings. */
|
|
2
2
|
export const mapAlphaUsageConstants = { opaque: 0, alpha: 2, transmission: 3 };
|
|
3
|
+
export const uvProjectionConstants = {
|
|
4
|
+
none: 0,
|
|
5
|
+
spherical: 1,
|
|
6
|
+
cylindrical: 2,
|
|
7
|
+
triplanar: 3
|
|
8
|
+
};
|
|
9
|
+
export const materialAlphaModeConstants = {
|
|
10
|
+
opaque: 0,
|
|
11
|
+
mask: 1,
|
|
12
|
+
blend: 2
|
|
13
|
+
};
|
|
3
14
|
//# sourceMappingURL=materialConstants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materialConstants.js","sourceRoot":"","sources":["../../src/renderer/materialConstants.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAW,CAAC","sourcesContent":["/** Numeric shader representation of the public map-alpha strings. */\nexport const mapAlphaUsageConstants = { opaque: 0, alpha: 2, transmission: 3 } as const;\n"]}
|
|
1
|
+
{"version":3,"file":"materialConstants.js","sourceRoot":"","sources":["../../src/renderer/materialConstants.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAW,CAAC;AAExF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;CACb,CAAC;AAGF,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC","sourcesContent":["/** Numeric shader representation of the public map-alpha strings. */\nexport const mapAlphaUsageConstants = { opaque: 0, alpha: 2, transmission: 3 } as const;\n\nexport const uvProjectionConstants = {\n none: 0,\n spherical: 1,\n cylindrical: 2,\n triplanar: 3\n};\n\n\nexport const materialAlphaModeConstants = {\n opaque: 0,\n mask: 1,\n blend: 2\n} as const;\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as MaterialData } from './MaterialData.js';
|
|
2
|
+
export { default as MaterialState } from '../scene/MaterialState.js';
|
|
3
|
+
export { default as TextureState } from '../scene/TextureState.js';
|
|
4
|
+
export { default as PixelTexture } from '../scene/PixelTexture.js';
|
|
5
|
+
export * from './materialParams.js';
|
|
6
|
+
export * from './materialTextures.js';
|
|
7
|
+
export * from './textureAtlas.js';
|
|
8
|
+
export * from './textureAtlasPixels.js';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as MaterialData } from './MaterialData.js';
|
|
2
|
+
export { default as MaterialState } from '../scene/MaterialState.js';
|
|
3
|
+
export { default as TextureState } from '../scene/TextureState.js';
|
|
4
|
+
export { default as PixelTexture } from '../scene/PixelTexture.js';
|
|
5
|
+
export * from './materialParams.js';
|
|
6
|
+
export * from './materialTextures.js';
|
|
7
|
+
export * from './textureAtlas.js';
|
|
8
|
+
export * from './textureAtlasPixels.js';
|
|
9
|
+
//# sourceMappingURL=materialCore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materialCore.js","sourceRoot":"","sources":["../../src/renderer/materialCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAC,OAAO,IAAI,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACjE,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC","sourcesContent":["export {default as MaterialData} from './MaterialData.js';\nexport {default as MaterialState} from '../scene/MaterialState.js';\nexport {default as TextureState} from '../scene/TextureState.js';\nexport {default as PixelTexture} from '../scene/PixelTexture.js';\nexport * from './materialParams.js';\nexport * from './materialTextures.js';\nexport * from './textureAtlas.js';\nexport * from './textureAtlasPixels.js';\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type MaterialState from '../scene/MaterialState.js';
|
|
2
2
|
import type { ColorRGB } from '../types.js';
|
|
3
3
|
/** Normal-incidence, single-passage coat absorption for surface emission.
|
|
4
4
|
* coatColor is squared transmittance; emission crosses the coat once.
|
|
@@ -6,4 +6,4 @@ import type { ColorRGB } from '../types.js';
|
|
|
6
6
|
* the shader applies the UV-dependent absorption exactly once.
|
|
7
7
|
* Keep this shared by material packing and both emissive-distribution paths.
|
|
8
8
|
*/
|
|
9
|
-
export declare function materialEmission(material:
|
|
9
|
+
export declare function materialEmission(material: MaterialState): ColorRGB;
|
|
@@ -13,9 +13,9 @@ export function materialEmission(material) {
|
|
|
13
13
|
if (material.unlit || material.shadowCatcher || material.coatWeight <= 0 || material.coatWeightMap)
|
|
14
14
|
return emission;
|
|
15
15
|
const coatWeight = Math.min(material.coatWeight, 1);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
emission[0] = emission[0] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[0], 0)) - 1));
|
|
17
|
+
emission[1] = emission[1] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[1], 0)) - 1));
|
|
18
|
+
emission[2] = emission[2] * (1 + coatWeight * (Math.sqrt(Math.max(material.coatColor[2], 0)) - 1));
|
|
19
19
|
return emission;
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=materialEmission.js.map
|