@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,55 @@
|
|
|
1
|
+
import { Box3 } from './Box3.js';
|
|
2
|
+
import MeshState from '../scene/MeshState.js';
|
|
3
|
+
import Geometry from '../scene/Geometry.js';
|
|
4
|
+
import { mat4, vec3 } from '../math.js';
|
|
5
|
+
import { PackedMeshInstances, type MeshInstances } from './meshInstances.js';
|
|
6
|
+
import { type TLASInstance } from './bvhAccel.js';
|
|
7
|
+
import { getBvhBounds } from './geometryBvhBounds.js';
|
|
8
|
+
export declare function computeBounds(_geometry: Geometry, m: mat4.Mat4Array, bvhBounds: [vec3.Vec3Array, vec3.Vec3Array], result?: Box3, p?: Float32Array<ArrayBufferLike>): Box3;
|
|
9
|
+
export interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {
|
|
10
|
+
mesh: M;
|
|
11
|
+
geometry: Geometry;
|
|
12
|
+
blasIndex: number;
|
|
13
|
+
materialIndices: number[];
|
|
14
|
+
displacementScale: number;
|
|
15
|
+
bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];
|
|
16
|
+
}
|
|
17
|
+
export declare function updateMeshInstanceTransforms<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], current?: MeshInstances, dirtyIndices?: ReadonlySet<number>): PackedMeshInstances | TLASInstance[];
|
|
18
|
+
/** Dirty slots shared by Web refits and native range uploads. */
|
|
19
|
+
export declare function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances): Set<number>;
|
|
20
|
+
export declare function prepareSceneMeshes<M extends MeshState>(meshes: M[], prepareGeometry: (mesh: M) => {
|
|
21
|
+
geometry: Geometry;
|
|
22
|
+
displacementScale: number;
|
|
23
|
+
}, boundsForGeometry?: typeof getBvhBounds, softwareBvhs?: boolean): {
|
|
24
|
+
geometry: Geometry;
|
|
25
|
+
geometries: Geometry[];
|
|
26
|
+
geometryRegions: Map<Geometry, {
|
|
27
|
+
vertexOffset: number;
|
|
28
|
+
indexOffset: number;
|
|
29
|
+
materialIndices: number[];
|
|
30
|
+
}>;
|
|
31
|
+
geometryStates: Map<Geometry, {
|
|
32
|
+
topologyVersion: number;
|
|
33
|
+
indices: Uint16Array<ArrayBufferLike> | Uint32Array<ArrayBufferLike> | Uint16Array<ArrayBufferLike> | Uint32Array<ArrayBufferLike>;
|
|
34
|
+
indexCount: number;
|
|
35
|
+
}>;
|
|
36
|
+
instances: MeshInstances;
|
|
37
|
+
materials: M["materials"];
|
|
38
|
+
instanceBindings: PreparedMeshInstanceBinding<M>[];
|
|
39
|
+
emissiveBindings: {
|
|
40
|
+
mesh: M;
|
|
41
|
+
geometry: Geometry;
|
|
42
|
+
materialIndices: number[];
|
|
43
|
+
}[];
|
|
44
|
+
blases: {
|
|
45
|
+
bvh: import("./bvhAccel.js").FlattendBVH;
|
|
46
|
+
verticesCount: number;
|
|
47
|
+
trainglesCount: number;
|
|
48
|
+
}[];
|
|
49
|
+
};
|
|
50
|
+
export declare function mergeGeometry(geometries: Geometry[], globalMaterialIndicesMap: number[][], regions: Map<Geometry, {
|
|
51
|
+
vertexOffset: number;
|
|
52
|
+
indexOffset: number;
|
|
53
|
+
materialIndices: number[];
|
|
54
|
+
}>, webgl?: boolean): Geometry;
|
|
55
|
+
export declare function computeGeometryNormals(geometry: Geometry): void;
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { matrixStorage } from '../math/storage.js';
|
|
2
|
+
import { Box3 } from './Box3.js';
|
|
3
|
+
import Geometry, { Attribute } from '../scene/Geometry.js';
|
|
4
|
+
import { vec3 } from '../math.js';
|
|
5
|
+
import { meshInstanceCount, meshInstanceTransform, PackedMeshInstances } from './meshInstances.js';
|
|
6
|
+
import { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';
|
|
7
|
+
import { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';
|
|
8
|
+
import { colorLuminance } from './lightSampling.js';
|
|
9
|
+
import { getBvhBounds } from './geometryBvhBounds.js';
|
|
10
|
+
import { attributeLength, attributeValue } from '../scene/attributeData.js';
|
|
11
|
+
import { read } from '../math/access.js';
|
|
12
|
+
import { hasGeneratedVertexTangents } from '../util/geometry.js';
|
|
13
|
+
// Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.
|
|
14
|
+
export function computeBounds(_geometry, m, bvhBounds, result = makeBounds(), p = vec3.create()) {
|
|
15
|
+
const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);
|
|
16
|
+
const { min, max } = result;
|
|
17
|
+
vec3.set(min, Infinity, Infinity, Infinity);
|
|
18
|
+
vec3.set(max, -Infinity, -Infinity, -Infinity);
|
|
19
|
+
// Transforming the eight BLAS AABB corners is exact for an affine transform
|
|
20
|
+
// and independent of mesh vertex count. The previous rotated path scanned
|
|
21
|
+
// every vertex on every instance update.
|
|
22
|
+
for (let corner = 0; corner < 8; corner++) {
|
|
23
|
+
vec3.set(p, (corner & 1 ? upper[0] : lower[0]), (corner & 2 ? upper[1] : lower[1]), (corner & 4 ? upper[2] : lower[2]));
|
|
24
|
+
vec3.transformMat4(p, p, matrix);
|
|
25
|
+
if (!finiteValues(p))
|
|
26
|
+
continue;
|
|
27
|
+
vec3.min(min, min, p);
|
|
28
|
+
vec3.max(max, max, p);
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
export function updateMeshInstanceTransforms(bindings, current, dirtyIndices) {
|
|
33
|
+
// Dirty indices are packed source slots, as consumed by refitTLAS. Preserve
|
|
34
|
+
// the previous candidate until membership and GPU validation have succeeded.
|
|
35
|
+
if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&
|
|
36
|
+
current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {
|
|
37
|
+
const next = current.copy(), matrix = new Float64Array(16);
|
|
38
|
+
const boundsScratch = makeBounds(), pointScratch = vec3.create();
|
|
39
|
+
let membershipChanged = false;
|
|
40
|
+
const parents = new Map();
|
|
41
|
+
for (const index of dirtyIndices) {
|
|
42
|
+
const binding = bindings[current.bindingIndices[index]];
|
|
43
|
+
const local = current.localIndices[index];
|
|
44
|
+
if (!binding || local >= meshInstanceCount(binding.mesh)) {
|
|
45
|
+
membershipChanged = true;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
let parent = parents.get(binding.mesh);
|
|
49
|
+
if (!parent) {
|
|
50
|
+
parent = matrixStorage(binding.mesh.transform);
|
|
51
|
+
parents.set(binding.mesh, parent);
|
|
52
|
+
}
|
|
53
|
+
meshInstanceTransform(binding.mesh, local, matrix, parent);
|
|
54
|
+
const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);
|
|
55
|
+
if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {
|
|
56
|
+
membershipChanged = true;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
next.transforms.set(matrix, index * 16);
|
|
60
|
+
next.bounds.set(bounds.min, index * 6);
|
|
61
|
+
next.bounds.set(bounds.max, index * 6 + 3);
|
|
62
|
+
}
|
|
63
|
+
if (!membershipChanged)
|
|
64
|
+
return next;
|
|
65
|
+
}
|
|
66
|
+
if (bindings.some(binding => binding.mesh.instanceData != null)) {
|
|
67
|
+
const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));
|
|
68
|
+
const matrix = new Float64Array(16);
|
|
69
|
+
const boundsScratch = makeBounds(), pointScratch = vec3.create();
|
|
70
|
+
let sourceIndex = 0;
|
|
71
|
+
for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {
|
|
72
|
+
const binding = bindings[bindingIndex];
|
|
73
|
+
const slots = [];
|
|
74
|
+
packed.bindingSlots.push(slots);
|
|
75
|
+
const { mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale } = binding;
|
|
76
|
+
const parent = matrixStorage(mesh.transform);
|
|
77
|
+
for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {
|
|
78
|
+
meshInstanceTransform(mesh, i, matrix, parent);
|
|
79
|
+
const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);
|
|
80
|
+
if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix))
|
|
81
|
+
continue;
|
|
82
|
+
const index = packed.length++;
|
|
83
|
+
packed.sourceIndices[index] = sourceIndex;
|
|
84
|
+
packed.bindingIndices[index] = bindingIndex;
|
|
85
|
+
packed.localIndices[index] = i;
|
|
86
|
+
slots.push(index);
|
|
87
|
+
packed.transforms.set(matrix, index * 16);
|
|
88
|
+
packed.bounds.set(bounds.min, index * 6);
|
|
89
|
+
packed.bounds.set(bounds.max, index * 6 + 3);
|
|
90
|
+
packed.blasIndices[index] = blasIndex;
|
|
91
|
+
packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);
|
|
92
|
+
packed.displacement[index] = displacementScale;
|
|
93
|
+
const colors = mesh.instanceData?.colors;
|
|
94
|
+
for (let k = 0; k < 3; k++)
|
|
95
|
+
packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return packed;
|
|
99
|
+
}
|
|
100
|
+
const update = ({ mesh, geometry, blasIndex, materialIndices, displacementScale, bvhBounds }) => ({
|
|
101
|
+
bounds: computeBounds(geometry, mesh.transform, bvhBounds),
|
|
102
|
+
blasIndex,
|
|
103
|
+
transform: matrixStorage(mesh.transform),
|
|
104
|
+
materialsIndices: materialIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
|
|
105
|
+
displacementScale
|
|
106
|
+
});
|
|
107
|
+
if (!current || !dirtyIndices || !Array.isArray(current))
|
|
108
|
+
return bindings.map(update);
|
|
109
|
+
const next = current.slice();
|
|
110
|
+
dirtyIndices.forEach((index) => {
|
|
111
|
+
const binding = bindings[index];
|
|
112
|
+
if (binding)
|
|
113
|
+
next[index] = update(binding);
|
|
114
|
+
});
|
|
115
|
+
return next;
|
|
116
|
+
}
|
|
117
|
+
/** Dirty slots shared by Web refits and native range uploads. */
|
|
118
|
+
export function dirtyPreparedInstanceIndices(bindings, meshes, instances) {
|
|
119
|
+
const dirty = new Set();
|
|
120
|
+
for (let i = 0; i < bindings.length; i++) {
|
|
121
|
+
if (!meshes.has(bindings[i].mesh))
|
|
122
|
+
continue;
|
|
123
|
+
if (!Array.isArray(instances)) {
|
|
124
|
+
for (const slot of instances.bindingSlots[i] ?? [])
|
|
125
|
+
dirty.add(slot);
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
dirty.add(i);
|
|
129
|
+
}
|
|
130
|
+
return dirty;
|
|
131
|
+
}
|
|
132
|
+
export function prepareSceneMeshes(meshes, prepareGeometry, boundsForGeometry = getBvhBounds, softwareBvhs = true) {
|
|
133
|
+
const materialIndexMap = new Map();
|
|
134
|
+
const geometryIndexMap = new Map();
|
|
135
|
+
const geometryBounds = new Map();
|
|
136
|
+
const geometries = [];
|
|
137
|
+
const materials = [];
|
|
138
|
+
const globalMaterialIndicesMap = [];
|
|
139
|
+
const emissiveBindings = [];
|
|
140
|
+
const instanceBindings = [];
|
|
141
|
+
const instances = meshes
|
|
142
|
+
.filter((mesh) => mesh.geometry.position?.array.length > 0)
|
|
143
|
+
.map((mesh) => {
|
|
144
|
+
let { geometry, displacementScale } = prepareGeometry(mesh);
|
|
145
|
+
let cachedBounds = geometryBounds.get(geometry);
|
|
146
|
+
if (!cachedBounds) {
|
|
147
|
+
const rawBounds = boundsForGeometry(geometry);
|
|
148
|
+
cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];
|
|
149
|
+
geometryBounds.set(geometry, cachedBounds);
|
|
150
|
+
}
|
|
151
|
+
// Instances share the scan, while retained updates keep independent arrays.
|
|
152
|
+
const bvhBounds = [cachedBounds[0].slice(), cachedBounds[1].slice()];
|
|
153
|
+
const bounds = computeBounds(geometry, mesh.transform, bvhBounds);
|
|
154
|
+
let geoIdx = geometryIndexMap.get(geometry);
|
|
155
|
+
const materialsIndices = mesh.materials.map((material) => {
|
|
156
|
+
const key = material;
|
|
157
|
+
if (!materialIndexMap.has(key)) {
|
|
158
|
+
materialIndexMap.set(key, materials.length);
|
|
159
|
+
materials.push(material);
|
|
160
|
+
}
|
|
161
|
+
return materialIndexMap.get(key);
|
|
162
|
+
});
|
|
163
|
+
// Explicit vertex indices are global after merging. Batches with a
|
|
164
|
+
// different material table need their own vertex region, even when the
|
|
165
|
+
// table contains just one material. Equal tables can share the region.
|
|
166
|
+
if (geoIdx != null && geometry.materialIndex &&
|
|
167
|
+
(materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||
|
|
168
|
+
materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx][i]))) {
|
|
169
|
+
const bvh = getGeometryBvh(geometry);
|
|
170
|
+
geometry = new Geometry(geometry);
|
|
171
|
+
setGeometryBvh(geometry, bvh);
|
|
172
|
+
geoIdx = undefined;
|
|
173
|
+
}
|
|
174
|
+
if (geoIdx == null) {
|
|
175
|
+
geoIdx = geometries.length;
|
|
176
|
+
geometryIndexMap.set(geometry, geometries.length);
|
|
177
|
+
geometries.push(geometry);
|
|
178
|
+
// Same number with geometries.
|
|
179
|
+
globalMaterialIndicesMap.push(materialsIndices);
|
|
180
|
+
}
|
|
181
|
+
const instance = {
|
|
182
|
+
bounds,
|
|
183
|
+
blasIndex: geoIdx,
|
|
184
|
+
transform: matrixStorage(mesh.transform),
|
|
185
|
+
materialsIndices: materialsIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
|
|
186
|
+
displacementScale
|
|
187
|
+
};
|
|
188
|
+
if (mesh.instanceData == null && (!finiteValues(bounds.min) ||
|
|
189
|
+
!finiteValues(bounds.max) ||
|
|
190
|
+
!finiteValues(mesh.transform))) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
if (mesh.materials.some((material) => !material.unlit && !material.shadowCatcher &&
|
|
194
|
+
colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8)) {
|
|
195
|
+
emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });
|
|
196
|
+
}
|
|
197
|
+
instanceBindings.push({
|
|
198
|
+
mesh,
|
|
199
|
+
geometry,
|
|
200
|
+
blasIndex: geoIdx,
|
|
201
|
+
materialIndices: materialsIndices,
|
|
202
|
+
displacementScale,
|
|
203
|
+
bvhBounds
|
|
204
|
+
});
|
|
205
|
+
return instance;
|
|
206
|
+
})
|
|
207
|
+
.filter((instance) => instance != null);
|
|
208
|
+
const geometryRegions = new Map();
|
|
209
|
+
const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);
|
|
210
|
+
return {
|
|
211
|
+
geometry,
|
|
212
|
+
geometries,
|
|
213
|
+
geometryRegions,
|
|
214
|
+
geometryStates: new Map(instanceBindings.map(binding => {
|
|
215
|
+
const source = binding.mesh.geometry;
|
|
216
|
+
return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,
|
|
217
|
+
indexCount: source.indexArray.length }];
|
|
218
|
+
})),
|
|
219
|
+
instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances),
|
|
220
|
+
materials,
|
|
221
|
+
instanceBindings,
|
|
222
|
+
emissiveBindings,
|
|
223
|
+
blases: softwareBvhs ? geometries.map((geo) => ({
|
|
224
|
+
bvh: getGeometryBvh(geo),
|
|
225
|
+
verticesCount: geo.vertexCount,
|
|
226
|
+
trainglesCount: geo.indexArray.length / 3
|
|
227
|
+
})) : []
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
export function mergeGeometry(geometries, globalMaterialIndicesMap, regions, webgl = false) {
|
|
231
|
+
const totalVertexCount = geometries.reduce((sum, geo) => sum + geo.vertexCount, 0);
|
|
232
|
+
const totalIndexCount = geometries.reduce((sum, geo) => sum + geo.indexArray.length, 0);
|
|
233
|
+
const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
234
|
+
const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
235
|
+
const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
236
|
+
const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
237
|
+
const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
|
|
238
|
+
const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
|
|
239
|
+
// The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute
|
|
240
|
+
// selection; instanced preparation uses XYZW tangents and independent channels.
|
|
241
|
+
const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;
|
|
242
|
+
const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);
|
|
243
|
+
const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);
|
|
244
|
+
const tangentSize = webgl ? 3 : 4;
|
|
245
|
+
const mergedGeometry = new Geometry({
|
|
246
|
+
position: positionAttrib,
|
|
247
|
+
normal: normalAttrib,
|
|
248
|
+
uv: uvAttrib,
|
|
249
|
+
uv1: uv1Attrib,
|
|
250
|
+
materialIndex: materialIndexAttrib,
|
|
251
|
+
color: hasColor
|
|
252
|
+
? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)
|
|
253
|
+
: undefined,
|
|
254
|
+
tangent: hasTangent
|
|
255
|
+
? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)
|
|
256
|
+
: undefined,
|
|
257
|
+
indices: indexAttrib
|
|
258
|
+
});
|
|
259
|
+
let currentVertex = 0;
|
|
260
|
+
let currentIndex = 0;
|
|
261
|
+
geometries.forEach((geometry, idx) => {
|
|
262
|
+
const vertexCount = geometry.vertexCount;
|
|
263
|
+
const globalMaterialIndex = globalMaterialIndicesMap[idx];
|
|
264
|
+
regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });
|
|
265
|
+
positionAttrib.array.set(geometry.position.array, currentVertex * 3);
|
|
266
|
+
normalAttrib.array.set(geometry.normal.array, currentVertex * 3);
|
|
267
|
+
if (geometry.uv) {
|
|
268
|
+
uvAttrib.array.set(geometry.uv.array, currentVertex * 2);
|
|
269
|
+
}
|
|
270
|
+
uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
|
|
271
|
+
if (mergedGeometry.color && geometry.color) {
|
|
272
|
+
mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);
|
|
273
|
+
}
|
|
274
|
+
if (mergedGeometry.tangent && geometry.tangent) {
|
|
275
|
+
const source = geometry.tangent;
|
|
276
|
+
if (webgl) {
|
|
277
|
+
mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);
|
|
278
|
+
}
|
|
279
|
+
else
|
|
280
|
+
for (let v = 0; v < vertexCount; v++) {
|
|
281
|
+
for (let c = 0; c < 4; c++)
|
|
282
|
+
mergedGeometry.tangent.array[(currentVertex + v) * 4 + c] =
|
|
283
|
+
c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);
|
|
287
|
+
const meshIndices = geometry.indexArray;
|
|
288
|
+
for (let i = 0; i < attributeLength(meshIndices); i++) {
|
|
289
|
+
indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);
|
|
290
|
+
}
|
|
291
|
+
currentVertex += vertexCount;
|
|
292
|
+
currentIndex += attributeLength(meshIndices);
|
|
293
|
+
});
|
|
294
|
+
return mergedGeometry;
|
|
295
|
+
}
|
|
296
|
+
export function computeGeometryNormals(geometry) {
|
|
297
|
+
const indices = geometry.indexArray;
|
|
298
|
+
const positions = geometry.position.array;
|
|
299
|
+
geometry.normal = new Attribute(new Float32Array(positions.length), 3);
|
|
300
|
+
const normals = geometry.normal.array;
|
|
301
|
+
const p1 = vec3.create();
|
|
302
|
+
const p2 = vec3.create();
|
|
303
|
+
const p3 = vec3.create();
|
|
304
|
+
const v21 = vec3.create();
|
|
305
|
+
const v32 = vec3.create();
|
|
306
|
+
const n = vec3.create();
|
|
307
|
+
const len = indices
|
|
308
|
+
? indices.length
|
|
309
|
+
: geometry.vertexCount;
|
|
310
|
+
let i1, i2, i3;
|
|
311
|
+
for (let f = 0; f < len;) {
|
|
312
|
+
if (indices) {
|
|
313
|
+
i1 = attributeValue(indices, f++);
|
|
314
|
+
i2 = attributeValue(indices, f++);
|
|
315
|
+
i3 = attributeValue(indices, f++);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
i1 = f++;
|
|
319
|
+
i2 = f++;
|
|
320
|
+
i3 = f++;
|
|
321
|
+
}
|
|
322
|
+
vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
|
|
323
|
+
vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
|
|
324
|
+
vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
|
|
325
|
+
vec3.sub(v21, p1, p2);
|
|
326
|
+
vec3.sub(v32, p2, p3);
|
|
327
|
+
vec3.cross(n, v21, v32);
|
|
328
|
+
// Already be weighted by the triangle area
|
|
329
|
+
for (let i = 0; i < 3; i++) {
|
|
330
|
+
normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
|
|
331
|
+
normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
|
|
332
|
+
normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
for (let i = 0; i < normals.length;) {
|
|
336
|
+
vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
|
|
337
|
+
vec3.normalize(n, n);
|
|
338
|
+
normals[i++] = n[0];
|
|
339
|
+
normals[i++] = n[1];
|
|
340
|
+
normals[i++] = n[2];
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function finiteValues(values) {
|
|
344
|
+
if (values instanceof Float32Array)
|
|
345
|
+
return finiteStorage(values);
|
|
346
|
+
if (values instanceof Float64Array)
|
|
347
|
+
return finiteStorage(values);
|
|
348
|
+
return finiteStorage(values);
|
|
349
|
+
}
|
|
350
|
+
function finiteStorage(values) {
|
|
351
|
+
const length = values.length;
|
|
352
|
+
for (let i = 0; i < length; i++)
|
|
353
|
+
if (!Number.isFinite(read(values, i)))
|
|
354
|
+
return false;
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
function makeBounds() {
|
|
358
|
+
return new Box3();
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=scenePreparation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenePreparation.js","sourceRoot":"","sources":["../../src/renderer/scenePreparation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAQ,IAAI,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AACvH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAC3B,SAAmB,EACnB,CAAiB,EACjB,SAA2C,EAC3C,SAAe,UAAU,EAAE,EAC3B,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;IAEjB,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1G,MAAM,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC/C,4EAA4E;IAC5E,0EAA0E;IAC1E,yCAAyC;IACzC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,GAAG,CACN,CAAC,EACD,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAClC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAClC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACnC,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD,MAAM,UAAU,4BAA4B,CAC1C,QAA0C,EAC1C,OAAuB,EACvB,YAAkC;IAElC,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QACvG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,UAAU,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACjE,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAA,iBAAiB,GAAG,IAAI,CAAC;gBAAC,MAAM;YAAA,CAAC;YAC5F,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YACnG,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;YACvG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAA,iBAAiB,GAAG,IAAI,CAAC;gBAAC,MAAM;YAAA,CAAC;YACvH,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9H,CAAC;QACD,IAAI,CAAC,iBAAiB;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,UAAU,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACjE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YACvC,MAAM,KAAK,GAAa,EAAE,CAAC;YAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAC,GAAG,OAAO,CAAC;YAC3F,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;gBAChE,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;gBACvF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAC9F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC;gBAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1I,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;gBAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxH,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,CACb,EACE,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,SAAS,EACsB,EACnB,EAAE,CAChB,CAAC;QACC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;QAC1D,SAAS;QACT,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QACxC,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5C,+BAA+B,CAAC,GAAG,EAAE,CAAC,CAAC,CACxC;QACD,iBAAiB;KAClB,CAAwB,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC7B,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,4BAA4B,CAAsB,QAA0C,EAAE,MAAsB,EAAE,SAAwB;IAC5J,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE,CAAC;;YAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAsB,MAAW,EACjE,eAA6E,EAC7E,iBAAiB,GAAG,YAAY,EAAE,YAAY,GAAG,IAAI;IACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACrD,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0C,CAAC;IACzE,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,MAAM,wBAAwB,GAAe,EAAE,CAAC;IAChD,MAAM,gBAAgB,GAIhB,EAAE,CAAC;IACT,MAAM,gBAAgB,GAAqC,EAAE,CAAC;IAG9D,MAAM,SAAS,GAAmB,MAAM;SACrC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC9C,YAAY,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC;QACD,4EAA4E;QAC5E,MAAM,SAAS,GAAiC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACnG,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACvD,MAAM,GAAG,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,uEAAuE;QACvE,uEAAuE;QACvE,IAAI,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,aAAa;YAC1C,CAAC,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,MAAM,CAAC,CAAC,MAAM;gBAClE,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,wBAAwB,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrC,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAClC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAC3B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,+BAA+B;YAC/B,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAiB;YAC7B,MAAM;YACN,SAAS,EAAE,MAAO;YAClB,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;YACxC,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,+BAA+B,CAAC,GAAG,EAAE,CAAC,CAAC,CACxC;YACD,iBAAiB;SACK,CAAC;QACzB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,IAAI,CAC/B,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;YACzB,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;YACzB,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAC9B,EAAE,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAC3E,EAAE,CAAC;YACF,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC;YACpB,IAAI;YACJ,QAAQ;YACR,SAAS,EAAE,MAAM;YACjB,eAAe,EAAE,gBAAgB;YACjC,iBAAiB;YACjB,SAAS;SACV,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAmB,CAAC;IAE5D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsF,CAAC;IACtH,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,eAAe,CAAC,CAAC;IAEtF,OAAO;QACL,QAAQ;QACR,UAAU;QACV,eAAe;QACf,cAAc,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,OAAO,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;oBACtF,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAkB;QACzI,SAAS;QACT,gBAAgB;QAChB,gBAAgB;QAChB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9C,GAAG,EAAE,cAAc,CAAC,GAAG,CAAE;YACzB,aAAa,EAAE,GAAG,CAAC,WAAW;YAC9B,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;SAC1C,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAAsB,EACtB,wBAAoC,EACpC,OAAgG,EAChG,KAAK,GAAG,KAAK;IAEb,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,EACnC,CAAC,CACF,CAAC;IACF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,EACzC,CAAC,CACF,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,SAAS,CAClC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EACtC,CAAC,CACF,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,mBAAmB,GAAG,IAAI,SAAS,CACvC,IAAI,UAAU,CAAC,CAAC,GAAG,gBAAgB,CAAC,EACpC,CAAC,CACF,CAAC;IAEF,+EAA+E;IAC/E,gFAAgF;IAChF,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnH,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,MAAM,cAAc,GAAG,IAAI,QAAQ,CAAC;QAClC,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,YAAY;QACpB,EAAE,EAAE,QAAQ;QACZ,GAAG,EAAE,SAAS;QACd,aAAa,EAAE,mBAAmB;QAClC,KAAK,EAAE,QAAQ;YACb,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClE,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,WAAW,GAAG,gBAAgB,CAAC,EAAE,WAAW,CAAC;YAC9E,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACzC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAExH,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAS,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QACtE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAO,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,GAAG,CACjB,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,EACzE,aAAa,GAAG,CAAC,CAClB,CAAC;QACF,IAAI,cAAc,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC3C,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;YAChC,IAAI,KAAK,EAAE,CAAC;gBACV,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW,CAAC,CAAC;YAC9E,CAAC;;gBAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;wBAAE,cAAc,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BACpF,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/G,CAAC;QACH,CAAC;QAED,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QAErG,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtD,WAAW,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;QACD,aAAa,IAAI,WAAW,CAAC;QAC7B,YAAY,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAkB;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAE1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAExB,MAAM,GAAG,GAAG,OAAO;QACjB,CAAC,CAAC,OAAO,CAAC,MAAM;QAChB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACzB,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAI,CAAC;QAC1B,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAClC,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,CAAC,EAAE,CAAC;YACT,EAAE,GAAG,CAAC,EAAE,CAAC;YACT,EAAE,GAAG,CAAC,EAAE,CAAC;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAI,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAGD,SAAS,YAAY,CAAC,MAA8C;IAClE,IAAI,MAAM,YAAY,YAAY;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,IAAI,MAAM,YAAY,YAAY;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AACD,SAAS,aAAa,CAAmD,MAAS;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IACrF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC;AACpB,CAAC","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { Box3 } from './Box3.js';\nimport MeshState from '../scene/MeshState.js';\nimport MaterialState from '../scene/MaterialState.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { mat4, vec3 } from '../math.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { packMaterialIndexAndWeightToInt, writeMaterialIndices } from './materialIndices.js';\nimport { type TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport { getBvhBounds } from './geometryBvhBounds.js';\nimport { attributeLength, attributeValue } from '../scene/attributeData.js';\nimport { read } from '../math/access.js';\nimport { hasGeneratedVertexTangents } from '../util/geometry.js';\n\n// Platform adapters prepare displacement/BLAS inputs; assembly is shared by both hosts.\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result: Box3 = makeBounds(),\n p = vec3.create()\n) {\n const matrix = matrixStorage(m), lower = matrixStorage(bvhBounds[0]), upper = matrixStorage(bvhBounds[1]);\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n (corner & 1 ? upper[0] : lower[0]),\n (corner & 2 ? upper[1] : lower[1]),\n (corner & 4 ? upper[2] : lower[2])\n );\n vec3.transformMat4(p, p, matrix);\n if (!finiteValues(p)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding<M extends MeshState = MeshState> {\n mesh: M;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms<M extends MeshState>(\n bindings: PreparedMeshInstanceBinding<M>[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n // Dirty indices are packed source slots, as consumed by refitTLAS. Preserve\n // the previous candidate until membership and GPU validation have succeeded.\n if (current && !Array.isArray(current) && dirtyIndices && current.bindingSlots.length === bindings.length &&\n current.bindingSlots.every((slots, i) => slots.length === meshInstanceCount(bindings[i].mesh))) {\n const next = current.copy(), matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let membershipChanged = false;\n const parents = new Map<M, Float64Array>();\n for (const index of dirtyIndices) {\n const binding = bindings[current.bindingIndices[index]];\n const local = current.localIndices[index];\n if (!binding || local >= meshInstanceCount(binding.mesh)) {membershipChanged = true; break;}\n let parent = parents.get(binding.mesh);\n if (!parent) { parent = matrixStorage(binding.mesh.transform); parents.set(binding.mesh, parent); }\n meshInstanceTransform(binding.mesh, local, matrix, parent);\n const bounds = computeBounds(binding.geometry, matrix, binding.bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) {membershipChanged = true; break;}\n next.transforms.set(matrix, index * 16); next.bounds.set(bounds.min, index * 6); next.bounds.set(bounds.max, index * 6 + 3);\n }\n if (!membershipChanged) return next;\n }\n if (bindings.some(binding => binding.mesh.instanceData != null)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = new Float64Array(16);\n const boundsScratch = makeBounds(), pointScratch = vec3.create();\n let sourceIndex = 0;\n for (let bindingIndex = 0; bindingIndex < bindings.length; bindingIndex++) {\n const binding = bindings[bindingIndex];\n const slots: number[] = []; packed.bindingSlots.push(slots);\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n const parent = matrixStorage(mesh.transform);\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix, parent);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!finiteValues(bounds.min) || !finiteValues(bounds.max) || !finiteValues(matrix)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex; packed.bindingIndices[index] = bindingIndex; packed.localIndices[index] = i; slots.push(index);\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh.instanceData?.colors;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding<M>\n ): TLASInstance =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices || !Array.isArray(current)) return bindings.map(update);\n const next = current.slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\n\n/** Dirty slots shared by Web refits and native range uploads. */\nexport function dirtyPreparedInstanceIndices<M extends MeshState>(bindings: PreparedMeshInstanceBinding<M>[], meshes: ReadonlySet<M>, instances: MeshInstances) {\n const dirty = new Set<number>();\n for (let i = 0; i < bindings.length; i++) {\n if (!meshes.has(bindings[i].mesh)) continue;\n if (!Array.isArray(instances)) {\n for (const slot of instances.bindingSlots[i] ?? []) dirty.add(slot);\n } else dirty.add(i);\n }\n return dirty;\n}\n\nexport function prepareSceneMeshes<M extends MeshState>(meshes: M[],\n prepareGeometry: (mesh: M) => {geometry: Geometry; displacementScale: number},\n boundsForGeometry = getBvhBounds, softwareBvhs = true) {\n const materialIndexMap = new Map<MaterialState, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometryBounds = new Map<Geometry, [Float64Array, Float64Array]>();\n const geometries: Geometry[] = [];\n const materials: M['materials'] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: M;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding<M>[] = [];\n\n\n const instances: TLASInstance[] = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareGeometry(mesh);\n let cachedBounds = geometryBounds.get(geometry);\n if (!cachedBounds) {\n const rawBounds = boundsForGeometry(geometry);\n cachedBounds = [matrixStorage(rawBounds[0]), matrixStorage(rawBounds[1])];\n geometryBounds.set(geometry, cachedBounds);\n }\n // Instances share the scan, while retained updates keep independent arrays.\n const bvhBounds: [Float64Array, Float64Array] = [cachedBounds[0].slice(), cachedBounds[1].slice()];\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance: TLASInstance = {\n bounds,\n blasIndex: geoIdx!,\n transform: matrixStorage(mesh.transform),\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (mesh.instanceData == null && (\n !finiteValues(bounds.min) ||\n !finiteValues(bounds.max) ||\n !finiteValues(mesh.transform)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indexArray.length }];\n })),\n instances: (meshes.some(mesh => mesh.instanceData != null) ? updateMeshInstanceTransforms(instanceBindings) : instances) as MeshInstances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: softwareBvhs ? geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indexArray.length / 3\n })) : []\n };\n}\n\nexport function mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>,\n webgl = false\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indexArray.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n // The flat WebGL buffer keeps its existing XYZ tangents and optional-attribute\n // selection; instanced preparation uses XYZW tangents and independent channels.\n const firstOptional = webgl ? geometries.find(geo => geo.color || geo.tangent) : undefined;\n const hasColor = webgl ? !!firstOptional?.color : geometries.some(geo => geo.color);\n const hasTangent = webgl ? !firstOptional?.color && !!firstOptional?.tangent : geometries.some(geo => geo.tangent);\n const tangentSize = webgl ? 3 : 4;\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(tangentSize * totalVertexCount), tangentSize)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (mergedGeometry.color && geometry.color) {\n mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);\n }\n if (mergedGeometry.tangent && geometry.tangent) {\n const source = geometry.tangent;\n if (webgl) {\n mergedGeometry.tangent.array.set(source.array, currentVertex * tangentSize);\n } else for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, webgl);\n\n const meshIndices = geometry.indexArray;\n for (let i = 0; i < attributeLength(meshIndices); i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + attributeValue(meshIndices, i);\n }\n currentVertex += vertexCount;\n currentIndex += attributeLength(meshIndices);\n });\n\n return mergedGeometry;\n}\n\nexport function computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indexArray;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = attributeValue(indices, f++);\n i2 = attributeValue(indices, f++);\n i3 = attributeValue(indices, f++);\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n\nfunction finiteValues(values: Float32Array | Float64Array | number[]): boolean {\n if (values instanceof Float32Array) return finiteStorage(values);\n if (values instanceof Float64Array) return finiteStorage(values);\n return finiteStorage(values);\n}\nfunction finiteStorage<T extends Float32Array | Float64Array | number[]>(values: T): boolean {\n const length = values.length;\n for (let i = 0; i < length; i++) if (!Number.isFinite(read(values, i))) return false;\n return true;\n}\n\nfunction makeBounds(): Box3 {\n return new Box3();\n}\n"]}
|
|
@@ -4,18 +4,18 @@ export function scratchWGSLFunctions(textures, samplers, scratch = false) {
|
|
|
4
4
|
fn ${name}Region() -> vec2u {
|
|
5
5
|
return ${scratch ? `imageRegions[${index}].xy` : `textureDimensions(${name})`};
|
|
6
6
|
}
|
|
7
|
-
fn load_${name}(
|
|
8
|
-
${scratch ? `if (any(
|
|
9
|
-
return textureLoad(${name},
|
|
7
|
+
fn load_${name}(pixel: vec2i, level: i32) -> vec4f {
|
|
8
|
+
${scratch ? `if (any(pixel < vec2i(0)) || any(pixel >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}
|
|
9
|
+
return textureLoad(${name}, pixel, level);
|
|
10
10
|
}
|
|
11
11
|
${samplers.map(sampler => /* wgsl */ `
|
|
12
|
-
fn sample_${name}_${sampler}(
|
|
12
|
+
fn sample_${name}_${sampler}(coord: vec2f) -> vec4f {
|
|
13
13
|
${scratch ? /* wgsl */ `
|
|
14
|
-
let
|
|
15
|
-
if (all(
|
|
16
|
-
let
|
|
17
|
-
return textureSampleLevel(${name}, ${sampler},
|
|
18
|
-
: `return textureSample(${name}, ${sampler},
|
|
14
|
+
let kk = textureDimensions(${name});
|
|
15
|
+
if (all(kk == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }
|
|
16
|
+
let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
|
|
17
|
+
return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(kk), 0.0);`
|
|
18
|
+
: `return textureSample(${name}, ${sampler}, coord);`}
|
|
19
19
|
}`).join('')}`).join('');
|
|
20
20
|
}
|
|
21
21
|
export function scratchGLSLFunctions(textures, scratch = false) {
|
|
@@ -23,17 +23,17 @@ export function scratchGLSLFunctions(textures, scratch = false) {
|
|
|
23
23
|
ivec2 ${name}Region() {
|
|
24
24
|
return ${scratch ? `${name}RegionSize` : `textureSize(${name}, 0)`};
|
|
25
25
|
}
|
|
26
|
-
vec4 load_${name}(ivec2
|
|
27
|
-
${scratch ? `if (any(lessThan(
|
|
28
|
-
return texelFetch(${name},
|
|
26
|
+
vec4 load_${name}(ivec2 pixel, int level) {
|
|
27
|
+
${scratch ? `if (any(lessThan(pixel, ivec2(0))) || any(greaterThanEqual(pixel, ${name}Region()))) return vec4(0.0);` : ''}
|
|
28
|
+
return texelFetch(${name}, pixel, level);
|
|
29
29
|
}
|
|
30
|
-
vec4 sample_${name}(vec2
|
|
30
|
+
vec4 sample_${name}(vec2 coord) {
|
|
31
31
|
${scratch ? /* glsl */ `
|
|
32
|
-
ivec2
|
|
33
|
-
if (all(equal(
|
|
34
|
-
vec2
|
|
35
|
-
return texture(${name},
|
|
36
|
-
: `return texture(${name},
|
|
32
|
+
ivec2 kk = textureSize(${name}, 0);
|
|
33
|
+
if (all(equal(kk, ${name}Region()))) return texture(${name}, coord);
|
|
34
|
+
vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
|
|
35
|
+
return texture(${name}, pixel / vec2(kk));`
|
|
36
|
+
: `return texture(${name}, coord);`}
|
|
37
37
|
}`).join('');
|
|
38
38
|
}
|
|
39
39
|
//# sourceMappingURL=scratchSampling.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scratchSampling.js","sourceRoot":"","sources":["../../src/renderer/scratchSampling.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAClC,QAA2B,EAC3B,QAA2B,EAC3B,OAAO,GAAG,KAAK;IAEf,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC;KAC7C,IAAI;SACE,OAAO,CAAC,CAAC,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,IAAI,GAAG;;UAErE,IAAI;EACV,OAAO,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"scratchSampling.js","sourceRoot":"","sources":["../../src/renderer/scratchSampling.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAClC,QAA2B,EAC3B,QAA2B,EAC3B,OAAO,GAAG,KAAK;IAEf,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC;KAC7C,IAAI;SACE,OAAO,CAAC,CAAC,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,IAAI,GAAG;;UAErE,IAAI;EACV,OAAO,CAAC,CAAC,CAAC,mDAAmD,IAAI,oCAAoC,CAAC,CAAC,CAAC,EAAE;qBACvF,IAAI;;EAEzB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC;YACzB,IAAI,IAAI,OAAO;EACvB,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;6BACgB,IAAI;gBACjB,IAAI,0CAA0C,IAAI,KAAK,OAAO;kCACtD,IAAI,gCAAgC,IAAI;4BAC9C,IAAI,KAAK,OAAO,4BAAsC;QAClF,CAAC,CAAC,wBAAwB,IAAI,KAAK,OAAO,WAAW;EACrD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAA2B,EAAE,OAAO,GAAG,KAAK;IAC/E,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;QACjC,IAAI;SACD,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,eAAe,IAAI,MAAM;;YAExD,IAAI;EACZ,OAAO,CAAC,CAAC,CAAC,qEAAqE,IAAI,+BAA+B,CAAC,CAAC,CAAC,EAAE;oBACrG,IAAI;;cAEZ,IAAI;EACd,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;yBACY,IAAI;oBACT,IAAI,8BAA8B,IAAI;kCAClC,IAAI,8BAA8B,IAAI;iBACvD,IAAI,sBAAgC;QACrD,CAAC,CAAC,kBAAkB,IAAI,WAAW;EACnC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACb,CAAC","sourcesContent":["/** Generate sampling wrappers; shader callers always use these explicit names. */\nexport function scratchWGSLFunctions(\n textures: readonly string[],\n samplers: readonly string[],\n scratch = false\n) {\n return textures.map((name, index) => /* wgsl */ `\nfn ${name}Region() -> vec2u {\n return ${scratch ? `imageRegions[${index}].xy` : `textureDimensions(${name})`};\n}\nfn load_${name}(pixel: vec2i, level: i32) -> vec4f {\n ${scratch ? `if (any(pixel < vec2i(0)) || any(pixel >= vec2i(${name}Region()))) { return vec4f(0.0); }` : ''}\n return textureLoad(${name}, pixel, level);\n}\n${samplers.map(sampler => /* wgsl */ `\nfn sample_${name}_${sampler}(coord: vec2f) -> vec4f {\n ${scratch ? /* wgsl */ `\n let physicalSize = textureDimensions(${name});\n if (all(physicalSize == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, coord, 0.0); }\n let pixel = clamp(coord * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));\n return textureSampleLevel(${name}, ${sampler}, pixel / vec2f(physicalSize), 0.0);`\n : `return textureSample(${name}, ${sampler}, coord);`}\n}`).join('')}`).join('');\n}\n\nexport function scratchGLSLFunctions(textures: readonly string[], scratch = false) {\n return textures.map(name => /* glsl */ `\nivec2 ${name}Region() {\n return ${scratch ? `${name}RegionSize` : `textureSize(${name}, 0)`};\n}\nvec4 load_${name}(ivec2 pixel, int level) {\n ${scratch ? `if (any(lessThan(pixel, ivec2(0))) || any(greaterThanEqual(pixel, ${name}Region()))) return vec4(0.0);` : ''}\n return texelFetch(${name}, pixel, level);\n}\nvec4 sample_${name}(vec2 coord) {\n ${scratch ? /* glsl */ `\n ivec2 physicalSize = textureSize(${name}, 0);\n if (all(equal(physicalSize, ${name}Region()))) return texture(${name}, coord);\n vec2 pixel = clamp(coord * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));\n return texture(${name}, pixel / vec2(physicalSize));`\n : `return texture(${name}, coord);`}\n}`).join('');\n}\n"]}
|
package/lib/renderer/shader.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export declare class Shader {
|
|
|
20
20
|
export interface FragmentShaderOptions {
|
|
21
21
|
name?: string;
|
|
22
22
|
outputs?: string[];
|
|
23
|
+
outputTypes?: Record<string, 'vec4' | 'uvec4'>;
|
|
23
24
|
defines?: Record<string, ShaderDefineValue>;
|
|
24
25
|
uniforms?: Record<string, ShaderUniform>;
|
|
25
26
|
includes?: ShaderMixin[];
|
|
@@ -28,6 +29,7 @@ export interface FragmentShaderOptions {
|
|
|
28
29
|
export declare class FragmentShader<TDefines extends Record<string, ShaderDefineValue> = Record<string, ShaderDefineValue>, TUniforms extends Record<string, ShaderUniform> = Record<string, ShaderUniform>> {
|
|
29
30
|
readonly name: string;
|
|
30
31
|
readonly outputs: string[];
|
|
32
|
+
readonly outputTypes: Record<string, 'vec4' | 'uvec4'>;
|
|
31
33
|
readonly defines: TDefines;
|
|
32
34
|
readonly uniforms: TUniforms;
|
|
33
35
|
readonly functions: Array<(name?: string) => string>;
|
package/lib/renderer/shader.js
CHANGED
|
@@ -23,6 +23,7 @@ export class Shader {
|
|
|
23
23
|
export class FragmentShader {
|
|
24
24
|
name;
|
|
25
25
|
outputs;
|
|
26
|
+
outputTypes;
|
|
26
27
|
defines;
|
|
27
28
|
uniforms;
|
|
28
29
|
functions;
|
|
@@ -32,6 +33,7 @@ export class FragmentShader {
|
|
|
32
33
|
const includes = options.includes || [];
|
|
33
34
|
this.name = options.name || '';
|
|
34
35
|
this.outputs = options.outputs || ['color'];
|
|
36
|
+
this.outputTypes = options.outputTypes ?? {};
|
|
35
37
|
this.defines = Object.assign({}, ...includes.map((item) => item.defines), options.defines || {});
|
|
36
38
|
this.uniforms = Object.assign({}, ...includes.map((item) => item.uniforms), options.uniforms || {});
|
|
37
39
|
this.functions = includes.flatMap((item) => item.functions || []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader.js","sourceRoot":"","sources":["../../src/renderer/shader.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAiB;IACtE,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CACtB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAChE,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,MAAM;IACjB,MAAM,CAAC,OAAO,CAAI,IAAY,EAAE,KAAS;QACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,IAAY,EACZ,GAAoB,EACpB,KAAS;QAET,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"shader.js","sourceRoot":"","sources":["../../src/renderer/shader.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAiB;IACtE,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CACtB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,EAChE,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAsC;IAEtC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,MAAM;IACjB,MAAM,CAAC,OAAO,CAAI,IAAY,EAAE,KAAS;QACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,IAAY,EACZ,GAAoB,EACpB,KAAS;QAET,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF;AAYD,MAAM,OAAO,cAAc;IAUhB,IAAI,CAAS;IACb,OAAO,CAAW;IAClB,WAAW,CAAmC;IAC9C,OAAO,CAAW;IAClB,QAAQ,CAAY;IACpB,SAAS,CAAmC;IAC5C,IAAI,CAAS;IACtB,eAAe,GAAG,KAAK,CAAC;IAExB,YAAY,OAA8B;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAC1B,EAAE,EACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EACvC,OAAO,CAAC,OAAO,IAAI,EAAE,CACV,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC3B,EAAE,EACF,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxC,OAAO,CAAC,QAAQ,IAAI,EAAE,CACV,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;CACF","sourcesContent":["export type ShaderDefineValue = string | number | boolean | null;\n\nexport interface ShaderUniform<T = unknown> {\n type: string;\n value?: T;\n len?: string | number;\n array?: boolean;\n}\n\nexport interface ShaderMixin {\n defines: Record<string, ShaderDefineValue>;\n uniforms: Record<string, ShaderUniform>;\n main: string;\n functions?: Array<(name?: string) => string>;\n}\n\nexport function glsl(strings: TemplateStringsArray, ...values: unknown[]) {\n return strings.reduce(\n (result, part, index) =>\n result + (index ? String(values[index - 1] ?? '') : '') + part,\n ''\n );\n}\n\nexport function createShaderMixin(\n options: Partial<ShaderMixin> | string\n): ShaderMixin {\n if (typeof options === 'string') {\n options = { main: options };\n }\n return {\n defines: options.defines || {},\n uniforms: options.uniforms || {},\n main: options.main || '',\n functions: options.functions || []\n };\n}\n\nexport class Shader {\n static uniform<T>(type: string, value?: T): ShaderUniform<T> {\n return { type, value };\n }\n\n static arrayUniform<T>(\n type: string,\n len: string | number,\n value?: T\n ): ShaderUniform<T> {\n return { type, len, value, array: true };\n }\n}\n\nexport interface FragmentShaderOptions {\n name?: string;\n outputs?: string[];\n outputTypes?: Record<string, 'vec4' | 'uvec4'>;\n defines?: Record<string, ShaderDefineValue>;\n uniforms?: Record<string, ShaderUniform>;\n includes?: ShaderMixin[];\n main: string;\n}\n\nexport class FragmentShader<\n TDefines extends Record<string, ShaderDefineValue> = Record<\n string,\n ShaderDefineValue\n >,\n TUniforms extends Record<string, ShaderUniform> = Record<\n string,\n ShaderUniform\n >\n> {\n readonly name: string;\n readonly outputs: string[];\n readonly outputTypes: Record<string, 'vec4' | 'uvec4'>;\n readonly defines: TDefines;\n readonly uniforms: TUniforms;\n readonly functions: Array<(name?: string) => string>;\n readonly main: string;\n parallelCompile = false;\n\n constructor(options: FragmentShaderOptions) {\n const includes = options.includes || [];\n this.name = options.name || '';\n this.outputs = options.outputs || ['color'];\n this.outputTypes = options.outputTypes ?? {};\n this.defines = Object.assign(\n {},\n ...includes.map((item) => item.defines),\n options.defines || {}\n ) as TDefines;\n this.uniforms = Object.assign(\n {},\n ...includes.map((item) => item.uniforms),\n options.uniforms || {}\n ) as TUniforms;\n this.functions = includes.flatMap((item) => item.functions || []);\n this.main = options.main;\n }\n}\n"]}
|