@meimu/mutracer 0.1.5 → 0.2.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 +7 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +10407 -8353
- package/docs/api.md +200 -10
- package/docs/denoising.md +30 -15
- package/docs/materials.md +1 -1
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +32 -1
- package/docs/threejs.md +14 -5
- package/docs/updates.md +44 -2
- package/docs/viewer.md +11 -6
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +27 -6
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +52 -25
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +44 -9
- package/lib/Render.js +115 -17
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -1
- package/lib/RenderLoop.js +94 -13
- 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 +10 -0
- package/lib/renderer/GPUTraceQueue.js +31 -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 +32 -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/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/WGPURayTraceOutput.js +26 -17
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +36 -40
- package/lib/renderer/WGPURayTracePass.js +399 -550
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +239 -60
- 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 +5 -3
- package/lib/renderer/WebGLFullQuadPass.js +18 -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 +12 -2
- package/lib/renderer/WebGLRayTracePass.js +82 -7
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +116 -8
- 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 +5 -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/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/envMap.glsl.js +80 -74
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
- 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.js +49 -49
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
- 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.js +191 -191
- package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
- 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 +20 -17
- package/lib/renderer/lightSampling.js +123 -56
- 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 +3 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +3 -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/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 +118 -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/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/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 +15 -0
- package/lib/renderer/wgpuShaderSource.js +31 -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/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 +43 -37
- 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 +742 -705
- 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 +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
- 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 +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -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 -148
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
- 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 +26 -13
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
- 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/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 +17 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
- 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 +25 -3
- package/lib/settings/render.js +3 -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 +18 -5
- 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 +4 -0
- package/package.json +31 -5
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -1,111 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';
|
|
3
|
-
import { vec2 } from '../math.js';
|
|
1
|
+
import type { MaterialTableOptions, TextureAtlasStats } from './textureAtlas.js';
|
|
4
2
|
import { Texture2DArray as WebGLTexture2DArray } from './webgl.js';
|
|
5
|
-
import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
export interface TextureAtlasStats {
|
|
16
|
-
estimatedBytes: number;
|
|
17
|
-
height: number;
|
|
18
|
-
layers: number;
|
|
19
|
-
packTimeMs: number;
|
|
20
|
-
scale: number;
|
|
21
|
-
sourcePixels: number;
|
|
22
|
-
textureCount: number;
|
|
23
|
-
width: number;
|
|
24
|
-
}
|
|
25
|
-
export declare function materialUsesMedium(material: OpenPBRMaterial): boolean;
|
|
26
|
-
export declare const uvProjectionConstants: {
|
|
27
|
-
none: number;
|
|
28
|
-
spherical: number;
|
|
29
|
-
cylindrical: number;
|
|
30
|
-
triplanar: number;
|
|
31
|
-
};
|
|
32
|
-
export interface BufferData extends Record<MaterialTextureIndex, number[]> {
|
|
33
|
-
color: ColorRGB[];
|
|
34
|
-
roughness: number[];
|
|
35
|
-
metallic: number[];
|
|
36
|
-
emission: ColorRGB[];
|
|
37
|
-
ior: number[];
|
|
38
|
-
transmission: number[];
|
|
39
|
-
dispersion: number[];
|
|
40
|
-
thinFilmThickness: number[];
|
|
41
|
-
thinFilmThicknessMinimum: number[];
|
|
42
|
-
thinFilmMapChannel: number[];
|
|
43
|
-
thinFilmIor: number[];
|
|
44
|
-
anisotropy: number[];
|
|
45
|
-
thin: number[];
|
|
46
|
-
doubleSided: number[];
|
|
47
|
-
bevelSize: number[];
|
|
48
|
-
mapAlphaUsage: number[];
|
|
49
|
-
normalScale: vec2.Vec2Array[];
|
|
50
|
-
type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];
|
|
51
|
-
mapInfo: number[];
|
|
52
|
-
mapTransform: number[];
|
|
53
|
-
mapWrap: number[];
|
|
54
|
-
mapUvChannel: number[];
|
|
55
|
-
mapColorLinear: number[];
|
|
56
|
-
mediumType: number[];
|
|
57
|
-
specularAnisotropyModel: number[];
|
|
58
|
-
specularAnisotropyRotation: number[];
|
|
59
|
-
coatAnisotropyRotation: number[];
|
|
60
|
-
coatNormalScale: vec2.Vec2Array[];
|
|
61
|
-
uvProjection: number[];
|
|
62
|
-
uvScale: vec2.Vec2Array[];
|
|
63
|
-
displacementUvProjection: number[];
|
|
64
|
-
displacementUvProjectionScale: number[];
|
|
65
|
-
displacementStepSize: number[];
|
|
66
|
-
displacementBias: number[];
|
|
67
|
-
alpha: number[];
|
|
68
|
-
alphaMode: number[];
|
|
69
|
-
alphaCutoff: number[];
|
|
70
|
-
baseWeight: number[];
|
|
71
|
-
baseDiffuseRoughness: number[];
|
|
72
|
-
specularWeight: number[];
|
|
73
|
-
specularColor: ColorRGB[];
|
|
74
|
-
transmissionColor: ColorRGB[];
|
|
75
|
-
transmissionDepth: number[];
|
|
76
|
-
transmissionScatter: ColorRGB[];
|
|
77
|
-
transmissionScatterAnisotropy: number[];
|
|
78
|
-
subsurfaceWeight: number[];
|
|
79
|
-
subsurfaceColor: ColorRGB[];
|
|
80
|
-
subsurfaceRadius: number[];
|
|
81
|
-
subsurfaceRadiusScale: ColorRGB[];
|
|
82
|
-
subsurfaceScatterAnisotropy: number[];
|
|
83
|
-
fuzzWeight: number[];
|
|
84
|
-
fuzzColor: ColorRGB[];
|
|
85
|
-
fuzzRoughness: number[];
|
|
86
|
-
coatWeight: number[];
|
|
87
|
-
coatColor: ColorRGB[];
|
|
88
|
-
coatRoughness: number[];
|
|
89
|
-
coatAnisotropy: number[];
|
|
90
|
-
coatIor: number[];
|
|
91
|
-
coatDarkening: number[];
|
|
92
|
-
thinFilmWeight: number[];
|
|
93
|
-
dispersionAbbeNumber: number[];
|
|
94
|
-
mediumExtinction: ColorRGB[];
|
|
95
|
-
mediumScattering: ColorRGB[];
|
|
96
|
-
mediumAnisotropy: number[];
|
|
97
|
-
}
|
|
3
|
+
import type OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
|
|
4
|
+
import type Texture from '../scene/Texture.js';
|
|
5
|
+
import type { SceneLight } from '../scene/Scene.js';
|
|
6
|
+
export { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './textureAtlas.js';
|
|
7
|
+
export type { MaterialTableOptions, TextureAtlasStats } from './textureAtlas.js';
|
|
8
|
+
export { materialUsesMedium } from './materialParams.js';
|
|
9
|
+
export { uvProjectionConstants } from './materialConstants.js';
|
|
10
|
+
export type { BufferData } from './materialBufferData.js';
|
|
11
|
+
import type { BufferData } from './materialBufferData.js';
|
|
98
12
|
declare class MaterialTable {
|
|
99
13
|
texture: WebGLTexture2DArray | undefined;
|
|
100
14
|
textureAtlasStats: TextureAtlasStats;
|
|
101
|
-
defines: Record<string,
|
|
15
|
+
defines: Record<string, number>;
|
|
102
16
|
bufferData: BufferData;
|
|
103
17
|
private _matBufferTex;
|
|
104
18
|
private _materialBufferColumnsLog;
|
|
105
19
|
private _displacementMaps;
|
|
106
20
|
private _lightTexturesIndices;
|
|
107
21
|
constructor(materials: OpenPBRMaterial[], lights: SceneLight[], options?: MaterialTableOptions);
|
|
108
|
-
private _packParams;
|
|
109
22
|
/** Repack parameters with the same material slots and unchanged texture metadata. */
|
|
110
23
|
repackParams(materials: OpenPBRMaterial[]): void;
|
|
111
24
|
getBufferArray(): Float32Array<ArrayBufferLike>;
|
|
@@ -1,106 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS } from './materialTextureSlots.js';
|
|
1
|
+
import { isProceduralSkyImage } from '../scene/skyParameters.js';
|
|
2
|
+
import MaterialData from './MaterialData.js';
|
|
4
3
|
import { packMaterialBuffer } from './materialLayout.js';
|
|
4
|
+
import { repackMaterialParams } from './materialParams.js';
|
|
5
|
+
import { writeAtlasPixel, writeRawAtlasPlacement } from './textureAtlasPixels.js';
|
|
5
6
|
import { float16Bits } from './float16.js';
|
|
6
7
|
import { createCanvas } from '../util/canvas.js';
|
|
7
|
-
import { mapAlphaUsageConstants } from './materialConstants.js';
|
|
8
8
|
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
9
9
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
10
10
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
11
|
-
import { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';
|
|
12
|
-
import { materialEmission } from './materialEmission.js';
|
|
13
11
|
import { Texture2DArray as WebGLTexture2DArray, constants, Texture2D } from './webgl.js';
|
|
14
|
-
import {
|
|
15
|
-
import { mergeTexturesFromMaterials } from './texturesFromMaterials.js';
|
|
16
|
-
import { isTextureDataSource, textureWrapIndex } from '../scene/Texture.js';
|
|
12
|
+
import { isTextureDataSource } from '../scene/Texture.js';
|
|
17
13
|
import { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
|
|
21
|
-
material.subsurfaceWeight > 0);
|
|
22
|
-
}
|
|
23
|
-
export const uvProjectionConstants = {
|
|
24
|
-
none: 0,
|
|
25
|
-
spherical: 1,
|
|
26
|
-
cylindrical: 2,
|
|
27
|
-
triplanar: 3
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Packs material textures into a small 2D-array atlas.
|
|
31
|
-
*
|
|
32
|
-
* The input rectangles are sorted from tallest/largest to smallest, then
|
|
33
|
-
* placed with a shelf allocator. Each atlas layer contains horizontal shelves;
|
|
34
|
-
* a texture is inserted into the first shelf with enough remaining width, or a
|
|
35
|
-
* new shelf is opened below the existing ones. A new array layer is allocated
|
|
36
|
-
* only when none of the current layers has enough room.
|
|
37
|
-
*
|
|
38
|
-
* `makeTextureArray` first tries this packing at full resolution. If the result
|
|
39
|
-
* exceeds the adapter layer limit or the configured memory budget, it performs
|
|
40
|
-
* a binary search for the largest uniform scale that fits. This preserves full
|
|
41
|
-
* resolution whenever packing alone is sufficient and degrades predictably on
|
|
42
|
-
* constrained hardware.
|
|
43
|
-
*
|
|
44
|
-
* The returned placements keep the original logical texture indices. Shaders
|
|
45
|
-
* use per-texture atlas metadata instead of treating the logical index as the
|
|
46
|
-
* physical array layer.
|
|
47
|
-
*/
|
|
48
|
-
function packTextureAtlas(textures, pageSize, scale) {
|
|
49
|
-
const pages = [];
|
|
50
|
-
const placements = new Array(textures.length);
|
|
51
|
-
const items = textures
|
|
52
|
-
.map((texture, index) => ({
|
|
53
|
-
height: Math.max(1, Math.floor(texture.image.height * scale)),
|
|
54
|
-
index,
|
|
55
|
-
width: Math.max(1, Math.floor(texture.image.width * scale))
|
|
56
|
-
}))
|
|
57
|
-
.sort((a, b) => b.height - a.height || b.width - a.width);
|
|
58
|
-
for (const item of items) {
|
|
59
|
-
let placement;
|
|
60
|
-
for (let layer = 0; layer < pages.length && !placement; layer++) {
|
|
61
|
-
const page = pages[layer];
|
|
62
|
-
for (const shelf of page.shelves) {
|
|
63
|
-
if (item.height <= shelf.height &&
|
|
64
|
-
shelf.x + item.width <= pageSize) {
|
|
65
|
-
placement = {
|
|
66
|
-
...item,
|
|
67
|
-
layer,
|
|
68
|
-
x: shelf.x,
|
|
69
|
-
y: shelf.y
|
|
70
|
-
};
|
|
71
|
-
shelf.x += item.width;
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (!placement && page.nextY + item.height <= pageSize) {
|
|
76
|
-
placement = {
|
|
77
|
-
...item,
|
|
78
|
-
layer,
|
|
79
|
-
x: 0,
|
|
80
|
-
y: page.nextY
|
|
81
|
-
};
|
|
82
|
-
page.shelves.push({
|
|
83
|
-
height: item.height,
|
|
84
|
-
x: item.width,
|
|
85
|
-
y: page.nextY
|
|
86
|
-
});
|
|
87
|
-
page.nextY += item.height;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (!placement) {
|
|
91
|
-
const layer = pages.length;
|
|
92
|
-
placement = { ...item, layer, x: 0, y: 0 };
|
|
93
|
-
pages.push({
|
|
94
|
-
nextY: item.height,
|
|
95
|
-
placements: [],
|
|
96
|
-
shelves: [{ height: item.height, x: item.width, y: 0 }]
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
pages[placement.layer].placements.push(placement);
|
|
100
|
-
placements[item.index] = placement;
|
|
101
|
-
}
|
|
102
|
-
return { pages, placements };
|
|
103
|
-
}
|
|
14
|
+
export { DEFAULT_MAX_TEXTURE_ARRAY_BYTES } from './textureAtlas.js';
|
|
15
|
+
export { materialUsesMedium } from './materialParams.js';
|
|
16
|
+
export { uvProjectionConstants } from './materialConstants.js';
|
|
104
17
|
function createAtlasCanvas(width, height) {
|
|
105
18
|
return createCanvas(width, height);
|
|
106
19
|
}
|
|
@@ -118,34 +31,14 @@ function createDataAtlasPage(width, height, page, textures, floatStorage) {
|
|
|
118
31
|
drawAtlasImage(context, placement, textures[placement.index]);
|
|
119
32
|
const pixels = context.getImageData(0, 0, width, height).data;
|
|
120
33
|
for (let i = 0; i < pixels.length; i++)
|
|
121
|
-
data
|
|
34
|
+
writeAtlasPixel(data, i, floatStorage ? float16Bits(pixels[i] / 255) : pixels[i]);
|
|
122
35
|
}
|
|
123
36
|
for (const placement of page.placements) {
|
|
124
37
|
const texture = textures[placement.index];
|
|
125
38
|
const source = texture.image;
|
|
126
39
|
if (!isTextureDataSource(source))
|
|
127
40
|
continue;
|
|
128
|
-
|
|
129
|
-
if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {
|
|
130
|
-
throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');
|
|
131
|
-
}
|
|
132
|
-
if (source.data.length !== source.width * source.height * 4) {
|
|
133
|
-
throw new Error('Material texture RGBA source length does not match its dimensions.');
|
|
134
|
-
}
|
|
135
|
-
for (let y = 0; y < placement.height; y++) {
|
|
136
|
-
let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));
|
|
137
|
-
if (texture.flipY)
|
|
138
|
-
sourceY = source.height - 1 - sourceY;
|
|
139
|
-
for (let x = 0; x < placement.width; x++) {
|
|
140
|
-
const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));
|
|
141
|
-
const sourceOffset = (sourceY * source.width + sourceX) * 4;
|
|
142
|
-
const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;
|
|
143
|
-
for (let c = 0; c < 4; c++) {
|
|
144
|
-
const value = source.data[sourceOffset + c];
|
|
145
|
-
data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
41
|
+
writeRawAtlasPlacement(data, width, placement, { image: source, flipY: texture.flipY }, floatStorage);
|
|
149
42
|
}
|
|
150
43
|
return { data, width, height };
|
|
151
44
|
}
|
|
@@ -161,15 +54,10 @@ function drawAtlasImage(context, placement, texture) {
|
|
|
161
54
|
context.drawImage(texture.image, placement.x, placement.y, placement.width, placement.height);
|
|
162
55
|
}
|
|
163
56
|
}
|
|
164
|
-
function makeTextureArray(textures, sRGB = false
|
|
57
|
+
function makeTextureArray(textures, plan, sRGB = false) {
|
|
165
58
|
const packStart = performance.now();
|
|
166
59
|
if (!textures.length) {
|
|
167
60
|
return {
|
|
168
|
-
mapInfo: [],
|
|
169
|
-
mapTransform: [],
|
|
170
|
-
mapUvChannel: [],
|
|
171
|
-
mapColorLinear: [],
|
|
172
|
-
mapWrap: [],
|
|
173
61
|
stats: {
|
|
174
62
|
estimatedBytes: 0,
|
|
175
63
|
height: 1,
|
|
@@ -192,54 +80,9 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
192
80
|
})
|
|
193
81
|
};
|
|
194
82
|
}
|
|
195
|
-
const dataBacked = textures.some(
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
return Number(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) &&
|
|
199
|
-
!(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
|
|
200
|
-
});
|
|
201
|
-
// Storage precision depends on the pixels, independently of their transfer function.
|
|
202
|
-
const floatStorage = textures.some(({ image }) => isTextureDataSource(image) &&
|
|
203
|
-
!(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
|
|
204
|
-
const bytesPerPixel = floatStorage ? 8 : 4;
|
|
205
|
-
const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;
|
|
206
|
-
const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;
|
|
207
|
-
const maxTextureArrayBytes = options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;
|
|
208
|
-
const sourcePixels = textures.reduce((sum, texture) => sum + texture.image.width * texture.image.height, 0);
|
|
209
|
-
const maxSourceDimension = textures.reduce((max, texture) => Math.max(max, texture.image.width, texture.image.height), 1);
|
|
210
|
-
const maxPageSizeFromBudget = Math.max(1, Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel)));
|
|
211
|
-
const pageSize = Math.max(1, Math.floor(Math.min(maxSourceDimension, maxTextureDimension2D, maxPageSizeFromBudget)));
|
|
212
|
-
const pageBytes = pageSize * pageSize * bytesPerPixel;
|
|
213
|
-
const maxPageCount = Math.max(1, Math.min(maxTextureArrayLayers, Math.floor(maxTextureArrayBytes / pageBytes)));
|
|
214
|
-
const maxScale = Math.min(1, pageSize / maxSourceDimension);
|
|
215
|
-
let packed = packTextureAtlas(textures, pageSize, maxScale);
|
|
216
|
-
let scale = maxScale;
|
|
217
|
-
if (packed.pages.length > maxPageCount) {
|
|
218
|
-
let low = 0;
|
|
219
|
-
let high = maxScale;
|
|
220
|
-
let bestPacked;
|
|
221
|
-
let bestScale = 0;
|
|
222
|
-
for (let i = 0; i < 14; i++) {
|
|
223
|
-
const candidateScale = (low + high) / 2;
|
|
224
|
-
const candidate = packTextureAtlas(textures, pageSize, candidateScale);
|
|
225
|
-
if (candidate.pages.length <= maxPageCount) {
|
|
226
|
-
low = candidateScale;
|
|
227
|
-
bestScale = candidateScale;
|
|
228
|
-
bestPacked = candidate;
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
high = candidateScale;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
if (!bestPacked) {
|
|
235
|
-
throw new Error(`Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`);
|
|
236
|
-
}
|
|
237
|
-
packed = bestPacked;
|
|
238
|
-
scale = bestScale;
|
|
239
|
-
}
|
|
240
|
-
const atlasWidth = Math.max(1, ...packed.placements.map((placement) => placement.x + placement.width));
|
|
241
|
-
const atlasHeight = Math.max(1, ...packed.placements.map((placement) => placement.y + placement.height));
|
|
242
|
-
const pages = packed.pages.map((page) => {
|
|
83
|
+
const dataBacked = textures.some(texture => isTextureDataSource(texture.image));
|
|
84
|
+
const atlasWidth = plan.width, atlasHeight = plan.height, floatStorage = plan.floatStorage;
|
|
85
|
+
const pages = plan.pages.map((page) => {
|
|
243
86
|
if (dataBacked) {
|
|
244
87
|
return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);
|
|
245
88
|
}
|
|
@@ -252,22 +95,8 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
252
95
|
drawAtlasImage(context, placement, textures[placement.index]);
|
|
253
96
|
return canvas;
|
|
254
97
|
});
|
|
255
|
-
if (scale < 0.999)
|
|
256
|
-
console.warn(`Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`);
|
|
257
|
-
}
|
|
258
|
-
// mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].
|
|
259
|
-
// Packing layer and X offset into one float keeps the shader metadata to one
|
|
260
|
-
// vec4 per logical texture; floor(z) restores the layer and fract(z) the X.
|
|
261
|
-
const mapInfo = packed.placements.flatMap((placement) => {
|
|
262
|
-
const offsetX = (placement.x + 0.5) / atlasWidth;
|
|
263
|
-
const offsetY = (placement.y + 0.5) / atlasHeight;
|
|
264
|
-
return [
|
|
265
|
-
Math.max(placement.width - 1, 0) / atlasWidth,
|
|
266
|
-
Math.max(placement.height - 1, 0) / atlasHeight,
|
|
267
|
-
placement.layer + offsetX,
|
|
268
|
-
offsetY
|
|
269
|
-
];
|
|
270
|
-
});
|
|
98
|
+
if (plan.stats.scale < 0.999)
|
|
99
|
+
console.warn(`Texture atlas downscaled to ${(plan.stats.scale * 100).toFixed(1)}% to fit the GPU budget.`);
|
|
271
100
|
const texture = new WebGLTexture2DArray({
|
|
272
101
|
width: atlasWidth,
|
|
273
102
|
height: atlasHeight,
|
|
@@ -281,114 +110,7 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
281
110
|
wrapS: constants.CLAMP_TO_EDGE,
|
|
282
111
|
wrapT: constants.CLAMP_TO_EDGE
|
|
283
112
|
});
|
|
284
|
-
return {
|
|
285
|
-
texture,
|
|
286
|
-
mapInfo,
|
|
287
|
-
mapTransform: textures.flatMap((texture) => [
|
|
288
|
-
texture.uvScale[0],
|
|
289
|
-
texture.uvScale[1],
|
|
290
|
-
texture.uvOffset[0],
|
|
291
|
-
texture.uvOffset[1]
|
|
292
|
-
]),
|
|
293
|
-
mapUvChannel: textures.map((texture) => texture.uvChannel),
|
|
294
|
-
mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),
|
|
295
|
-
mapColorLinear,
|
|
296
|
-
stats: {
|
|
297
|
-
estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,
|
|
298
|
-
height: atlasHeight,
|
|
299
|
-
layers: pages.length,
|
|
300
|
-
packTimeMs: performance.now() - packStart,
|
|
301
|
-
scale,
|
|
302
|
-
sourcePixels,
|
|
303
|
-
textureCount: textures.length,
|
|
304
|
-
width: atlasWidth
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
function clampColor(color, fallback = 0) {
|
|
309
|
-
return [0, 1, 2].map((channel) => {
|
|
310
|
-
const value = Number(color[channel]);
|
|
311
|
-
return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
function emptyOpenPbrMedium() {
|
|
315
|
-
return {
|
|
316
|
-
anisotropy: 0,
|
|
317
|
-
extinction: [0, 0, 0],
|
|
318
|
-
scattering: [0, 0, 0]
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
function transmissionMedium(material) {
|
|
322
|
-
const weight = Math.min(1, Math.max(0, material.transmissionWeight));
|
|
323
|
-
const depth = Math.max(0, material.transmissionDepth);
|
|
324
|
-
if (weight <= 0 || depth <= 0 || material.thinWalled)
|
|
325
|
-
return undefined;
|
|
326
|
-
const color = clampColor(material.transmissionColor, 1);
|
|
327
|
-
const scatterColor = clampColor(material.transmissionScatter);
|
|
328
|
-
const extinction = color.map((channel) => Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth));
|
|
329
|
-
const scattering = scatterColor.map((channel, index) => extinction[index] * channel);
|
|
330
|
-
return {
|
|
331
|
-
anisotropy: Math.min(0.999, Math.max(-0.999, material.transmissionScatterAnisotropy)),
|
|
332
|
-
extinction,
|
|
333
|
-
scattering
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
|
-
function subsurfaceMedium(material) {
|
|
337
|
-
const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));
|
|
338
|
-
if (weight <= 0 || material.thinWalled)
|
|
339
|
-
return undefined;
|
|
340
|
-
// OpenPBR's radius is the extinction mean free path. The van de Hulst
|
|
341
|
-
// mapping converts the artist-facing multiple-scattering color to a
|
|
342
|
-
// single-scattering albedo while compensating for phase anisotropy.
|
|
343
|
-
const radius = Math.max(material.subsurfaceRadius, 1e-3);
|
|
344
|
-
const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);
|
|
345
|
-
const color = clampColor(material.subsurfaceColor);
|
|
346
|
-
const anisotropy = Math.min(0.999, Math.max(-0.999, material.subsurfaceAnisotropy));
|
|
347
|
-
const extinction = radiusScale.map((scale) => 1 / Math.max(radius * scale, 1e-3));
|
|
348
|
-
const scattering = color.map((channel, index) => {
|
|
349
|
-
const s = 4.09712 + 4.20863 * channel - Math.sqrt(9.59217 + 41.6808 * channel + 17.7126 * channel * channel);
|
|
350
|
-
const sSquared = s * s;
|
|
351
|
-
const albedo = Math.min(1, Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared)));
|
|
352
|
-
return extinction[index] * albedo;
|
|
353
|
-
});
|
|
354
|
-
return { anisotropy, extinction, scattering };
|
|
355
|
-
}
|
|
356
|
-
function combineOpenPbrMedia(material, transmission, subsurface) {
|
|
357
|
-
const transmissionFraction = transmission
|
|
358
|
-
? Math.min(1, Math.max(0, material.transmissionWeight))
|
|
359
|
-
: 0;
|
|
360
|
-
const subsurfaceFraction = subsurface
|
|
361
|
-
? (1 - transmissionFraction)
|
|
362
|
-
* Math.min(1, Math.max(0, material.subsurfaceWeight))
|
|
363
|
-
: 0;
|
|
364
|
-
const total = transmissionFraction + subsurfaceFraction;
|
|
365
|
-
if (total <= 0)
|
|
366
|
-
return undefined;
|
|
367
|
-
const transmissionWeight = transmissionFraction / total;
|
|
368
|
-
const subsurfaceWeight = subsurfaceFraction / total;
|
|
369
|
-
const extinction = [0, 1, 2].map((channel) => {
|
|
370
|
-
const transmissionAbsorption = transmission
|
|
371
|
-
? transmission.extinction[channel] - transmission.scattering[channel]
|
|
372
|
-
: 0;
|
|
373
|
-
const subsurfaceAbsorption = subsurface
|
|
374
|
-
? subsurface.extinction[channel] - subsurface.scattering[channel]
|
|
375
|
-
: 0;
|
|
376
|
-
const absorption = transmissionAbsorption * transmissionWeight
|
|
377
|
-
+ subsurfaceAbsorption * subsurfaceWeight;
|
|
378
|
-
const scattering = (transmission?.scattering[channel] || 0)
|
|
379
|
-
* transmissionWeight
|
|
380
|
-
+ (subsurface?.scattering[channel] || 0) * subsurfaceWeight;
|
|
381
|
-
return Math.max(0, absorption + scattering);
|
|
382
|
-
});
|
|
383
|
-
const scattering = [0, 1, 2].map((channel) => (transmission?.scattering[channel] || 0) * transmissionWeight
|
|
384
|
-
+ (subsurface?.scattering[channel] || 0) * subsurfaceWeight);
|
|
385
|
-
const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight
|
|
386
|
-
+ (subsurface?.anisotropy || 0) * subsurfaceWeight;
|
|
387
|
-
return { anisotropy, extinction, scattering };
|
|
388
|
-
}
|
|
389
|
-
function openPbrMedium(material) {
|
|
390
|
-
const volume = combineOpenPbrMedia(material, transmissionMedium(material), subsurfaceMedium(material));
|
|
391
|
-
return volume ?? emptyOpenPbrMedium();
|
|
113
|
+
return { texture, stats: { ...plan.stats, packTimeMs: performance.now() - packStart } };
|
|
392
114
|
}
|
|
393
115
|
class MaterialTable {
|
|
394
116
|
texture;
|
|
@@ -400,128 +122,28 @@ class MaterialTable {
|
|
|
400
122
|
_displacementMaps = [];
|
|
401
123
|
_lightTexturesIndices = [];
|
|
402
124
|
constructor(materials, lights, options = {}) {
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
const light = lights[i];
|
|
415
|
-
if (light.type === 'RectLight' && light.texture) {
|
|
416
|
-
lightTexturesIndices.push(allTextures.length);
|
|
417
|
-
allTextures.push(light.texture);
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
lightTexturesIndices.push(-1);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, mapWrap, stats, texture } = makeTextureArray(allTextures, false, options);
|
|
125
|
+
const packStart = performance.now();
|
|
126
|
+
const data = new MaterialData(materials, lights.map(light => light.type === 'RectLight' ? light.texture : undefined), texture => {
|
|
127
|
+
const image = texture.image;
|
|
128
|
+
return Number(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) && !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
|
|
129
|
+
}, options, texture => {
|
|
130
|
+
const image = texture.image;
|
|
131
|
+
return isTextureDataSource(image) && !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray);
|
|
132
|
+
});
|
|
133
|
+
if (data.textures.some(texture => isProceduralSkyImage(texture.image)))
|
|
134
|
+
throw new Error('ProceduralSky is only supported as an environment or background.');
|
|
135
|
+
const { texture, stats } = makeTextureArray(data.textures, data.atlas);
|
|
424
136
|
this.texture = texture;
|
|
425
|
-
this.textureAtlasStats = stats;
|
|
426
|
-
bufferData
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
bufferData.mapColorLinear = mapColorLinear;
|
|
431
|
-
for (const slot of MATERIAL_TEXTURE_SLOTS) {
|
|
432
|
-
bufferData[slot.index] = maps.indices[slot.property];
|
|
433
|
-
}
|
|
434
|
-
this.bufferData = bufferData;
|
|
435
|
-
this._lightTexturesIndices = lightTexturesIndices;
|
|
436
|
-
function countMaps(indices) {
|
|
437
|
-
return indices.filter((idx) => idx >= 0).length;
|
|
438
|
-
}
|
|
439
|
-
this.defines = {
|
|
440
|
-
NUM_MAPS: allTextures.length,
|
|
441
|
-
...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define
|
|
442
|
-
? [[slot.define, countMaps(maps.indices[slot.property])]] : []))
|
|
443
|
-
};
|
|
137
|
+
this.textureAtlasStats = { ...stats, packTimeMs: performance.now() - packStart };
|
|
138
|
+
this.bufferData = data.bufferData;
|
|
139
|
+
this.defines = data.defines;
|
|
140
|
+
this._displacementMaps = data.displacementMaps;
|
|
141
|
+
this._lightTexturesIndices = data.lightTexturesIndices;
|
|
444
142
|
this._updateBuffer();
|
|
445
143
|
}
|
|
446
|
-
_packParams(materials) {
|
|
447
|
-
const media = materials.map(openPbrMedium);
|
|
448
|
-
return {
|
|
449
|
-
color: materials.map((m) => m.baseColor.slice(0, 3)),
|
|
450
|
-
roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),
|
|
451
|
-
emission: materials.map(materialEmission),
|
|
452
|
-
metallic: materials.map((m) => m.baseMetalness),
|
|
453
|
-
ior: materials.map((m) => m.specularIor),
|
|
454
|
-
dispersion: materials.map((m) => m.transmissionDispersionScale),
|
|
455
|
-
thin: materials.map((m) => +m.thinWalled),
|
|
456
|
-
bevelSize: materials.map((m) => m.bevelSize),
|
|
457
|
-
transmission: materials.map((m) => m.transmissionWeight),
|
|
458
|
-
anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),
|
|
459
|
-
specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),
|
|
460
|
-
thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),
|
|
461
|
-
thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),
|
|
462
|
-
thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),
|
|
463
|
-
thinFilmIor: materials.map((m) => m.thinFilmIor),
|
|
464
|
-
normalScale: materials.map((m) => m.normalScale),
|
|
465
|
-
mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),
|
|
466
|
-
type: materials.map((m) => {
|
|
467
|
-
if (m.shadowCatcher) {
|
|
468
|
-
return ShadowCatcherMaterial;
|
|
469
|
-
}
|
|
470
|
-
if (m.unlit) {
|
|
471
|
-
return UnlitMaterial;
|
|
472
|
-
}
|
|
473
|
-
// Standard material
|
|
474
|
-
return 0;
|
|
475
|
-
}),
|
|
476
|
-
// Retain mediumType until both legacy readers are migrated; the
|
|
477
|
-
// direction and coat-normal inputs are reserved for later C1 steps.
|
|
478
|
-
mediumType: materials.map((m) => Number(materialUsesMedium(m))),
|
|
479
|
-
specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),
|
|
480
|
-
coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),
|
|
481
|
-
coatNormalScale: materials.map(m => m.coatNormalScale),
|
|
482
|
-
uvProjection: materials.map((m) => uvProjectionConstants[m.uvProjection] || 0),
|
|
483
|
-
uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),
|
|
484
|
-
displacementUvProjection: materials.map((m) => uvProjectionConstants[m.displacementUvProjection] || 0),
|
|
485
|
-
displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),
|
|
486
|
-
displacementBias: materials.map((m) => m.displacementBias),
|
|
487
|
-
displacementStepSize: materials.map((m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0),
|
|
488
|
-
// Alpha
|
|
489
|
-
alpha: materials.map((m) => m.opacity),
|
|
490
|
-
alphaMode: materials.map((m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]),
|
|
491
|
-
alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),
|
|
492
|
-
doubleSided: materials.map((m) => Number(m.doubleSided)),
|
|
493
|
-
baseWeight: materials.map((m) => m.baseWeight),
|
|
494
|
-
baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),
|
|
495
|
-
specularWeight: materials.map((m) => m.specularWeight),
|
|
496
|
-
specularColor: materials.map((m) => clampColor(m.specularColor, 1)),
|
|
497
|
-
transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),
|
|
498
|
-
transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),
|
|
499
|
-
transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),
|
|
500
|
-
transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),
|
|
501
|
-
subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),
|
|
502
|
-
subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),
|
|
503
|
-
subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),
|
|
504
|
-
subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),
|
|
505
|
-
subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),
|
|
506
|
-
fuzzWeight: materials.map((m) => m.fuzzWeight),
|
|
507
|
-
fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),
|
|
508
|
-
fuzzRoughness: materials.map((m) => m.fuzzRoughness),
|
|
509
|
-
coatWeight: materials.map((m) => m.coatWeight),
|
|
510
|
-
coatColor: materials.map((m) => clampColor(m.coatColor, 1)),
|
|
511
|
-
coatRoughness: materials.map((m) => m.coatRoughness),
|
|
512
|
-
coatAnisotropy: materials.map((m) => m.coatAnisotropy),
|
|
513
|
-
coatIor: materials.map((m) => m.coatIor),
|
|
514
|
-
coatDarkening: materials.map((m) => m.coatDarkening),
|
|
515
|
-
thinFilmWeight: materials.map((m) => m.thinFilmWeight),
|
|
516
|
-
dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),
|
|
517
|
-
mediumExtinction: media.map((medium) => medium.extinction),
|
|
518
|
-
mediumScattering: media.map((medium) => medium.scattering),
|
|
519
|
-
mediumAnisotropy: media.map((medium) => medium.anisotropy),
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
144
|
/** Repack parameters with the same material slots and unchanged texture metadata. */
|
|
523
145
|
repackParams(materials) {
|
|
524
|
-
|
|
146
|
+
repackMaterialParams(this.bufferData, materials);
|
|
525
147
|
this._updateBuffer();
|
|
526
148
|
}
|
|
527
149
|
getBufferArray() {
|