@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
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { matrixStorage } from '../math/storage.js';
|
|
1
2
|
import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';
|
|
2
|
-
import {
|
|
3
|
+
import { mergeGeometry, computeGeometryNormals } from './scenePreparation.js';
|
|
3
4
|
// Portions adapted from ray-tracing-renderer@0.10.15
|
|
4
5
|
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
5
6
|
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
@@ -7,28 +8,21 @@ import { mat3, vec3 } from '../math.js';
|
|
|
7
8
|
import Geometry, { Attribute } from '../scene/Geometry.js';
|
|
8
9
|
import { getMaterialHashKey, resetMaterialTextureId } from '../scene/OpenPBRMaterial.js';
|
|
9
10
|
export function mergeMeshesToGeometry(meshes) {
|
|
10
|
-
let vertexCount = 0;
|
|
11
|
-
let indexCount = 0;
|
|
12
11
|
const geometryAndMaterialIndex = [];
|
|
13
12
|
const materialIndexMap = new Map();
|
|
14
13
|
const materials = [];
|
|
15
14
|
resetMaterialTextureId();
|
|
16
15
|
for (const mesh of meshes) {
|
|
16
|
+
const parent = matrixStorage(mesh.transform);
|
|
17
17
|
for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {
|
|
18
18
|
let geometry = mesh.geometry;
|
|
19
|
-
|
|
20
|
-
if (!index) {
|
|
21
|
-
addFlatGeometryIndices(geometry);
|
|
22
|
-
}
|
|
23
|
-
geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));
|
|
19
|
+
geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, new Float64Array(16), parent));
|
|
24
20
|
if (!geometry.normal) {
|
|
25
21
|
computeGeometryNormals(geometry);
|
|
26
22
|
}
|
|
27
23
|
else {
|
|
28
24
|
vec3.forEach(geometry.normal.array, 3, 0, undefined, vec3.normalize, undefined);
|
|
29
25
|
}
|
|
30
|
-
vertexCount += Attribute.getCount(geometry.position);
|
|
31
|
-
indexCount += Attribute.getCount(geometry.indices);
|
|
32
26
|
const materialIndices = mesh.materials.map((material) => {
|
|
33
27
|
const key = getMaterialHashKey(material);
|
|
34
28
|
let materialIndex = materialIndexMap.get(key);
|
|
@@ -45,101 +39,13 @@ export function mergeMeshesToGeometry(meshes) {
|
|
|
45
39
|
});
|
|
46
40
|
}
|
|
47
41
|
}
|
|
48
|
-
const geometry = mergeGeometry(geometryAndMaterialIndex,
|
|
42
|
+
const geometry = mergeGeometry(geometryAndMaterialIndex.map(({ geometry }) => geometry), geometryAndMaterialIndex.map(({ materialIndex }) => materialIndex), new Map(), true);
|
|
49
43
|
return {
|
|
50
44
|
geometry,
|
|
51
45
|
// TODO compress materials. Reuse materials with same props.
|
|
52
46
|
materials
|
|
53
47
|
};
|
|
54
48
|
}
|
|
55
|
-
function mergeGeometry(geometryAndMaterialIndex, totalVertexCount, totalIndexCount) {
|
|
56
|
-
const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
57
|
-
const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
58
|
-
const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
59
|
-
const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
60
|
-
const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
|
|
61
|
-
const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
|
|
62
|
-
const mergedGeometry = new Geometry({
|
|
63
|
-
position: positionAttrib,
|
|
64
|
-
normal: normalAttrib,
|
|
65
|
-
uv: uvAttrib,
|
|
66
|
-
uv1: uv1Attrib,
|
|
67
|
-
materialIndex: materialIndexAttrib,
|
|
68
|
-
// color: colorAttrib,
|
|
69
|
-
indices: indexAttrib
|
|
70
|
-
});
|
|
71
|
-
let currentVertex = 0;
|
|
72
|
-
let currentIndex = 0;
|
|
73
|
-
let currentMesh = 1;
|
|
74
|
-
for (const { geometry } of geometryAndMaterialIndex) {
|
|
75
|
-
if (geometry.color) {
|
|
76
|
-
mergedGeometry.color = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
if (geometry.tangent) {
|
|
80
|
-
mergedGeometry.tangent = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
81
|
-
break;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
for (const { geometry, materialIndex: globalMaterialIndex } of geometryAndMaterialIndex) {
|
|
85
|
-
const vertexCount = Attribute.getCount(geometry.position);
|
|
86
|
-
['position', 'normal', 'uv'].forEach((attr) => {
|
|
87
|
-
if (!geometry[attr]) {
|
|
88
|
-
if (attr == 'normal' || attr === 'position') {
|
|
89
|
-
console.error('Geometry must have at least position and normal attributes.');
|
|
90
|
-
}
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
mergedGeometry[attr].array.set(geometry[attr].array, currentVertex * geometry[attr].itemSize);
|
|
94
|
-
});
|
|
95
|
-
uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
|
|
96
|
-
if (mergedGeometry.color) {
|
|
97
|
-
const itemSize = 3;
|
|
98
|
-
if (geometry.color) {
|
|
99
|
-
mergedGeometry.color.array.set(geometry.color.array, currentVertex * itemSize);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
// Set to white
|
|
103
|
-
for (let i = 0; i < vertexCount * itemSize; i++) {
|
|
104
|
-
mergedGeometry.color.array[currentVertex * itemSize + i] = 1;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (mergedGeometry.tangent) {
|
|
109
|
-
const itemSize = 3;
|
|
110
|
-
if (geometry.tangent) {
|
|
111
|
-
mergedGeometry.tangent.array.set(geometry.tangent.array, currentVertex * itemSize);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
for (let i = 0; i < vertexCount * itemSize; i++) {
|
|
115
|
-
mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const meshIndices = geometry.indices.array;
|
|
120
|
-
for (let i = 0; i < meshIndices.length; i++) {
|
|
121
|
-
indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
|
|
122
|
-
}
|
|
123
|
-
writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);
|
|
124
|
-
currentVertex += vertexCount;
|
|
125
|
-
currentIndex += meshIndices.length;
|
|
126
|
-
currentMesh++;
|
|
127
|
-
}
|
|
128
|
-
return mergedGeometry;
|
|
129
|
-
}
|
|
130
|
-
function addFlatGeometryIndices(geometry) {
|
|
131
|
-
const position = geometry.position;
|
|
132
|
-
if (!position) {
|
|
133
|
-
console.warn('No position attribute');
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
const index = new Uint32Array(Attribute.getCount(position));
|
|
137
|
-
for (let i = 0; i < index.length; i++) {
|
|
138
|
-
index[i] = i;
|
|
139
|
-
}
|
|
140
|
-
geometry.indices = new Attribute(index, 1);
|
|
141
|
-
return geometry;
|
|
142
|
-
}
|
|
143
49
|
function transformGeometry(geometry, matrix) {
|
|
144
50
|
const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {
|
|
145
51
|
position: geometry.position.array,
|
|
@@ -149,7 +55,7 @@ function transformGeometry(geometry, matrix) {
|
|
|
149
55
|
color: geometry.color && geometry.color.array,
|
|
150
56
|
tangent: geometry.tangent && geometry.tangent.array,
|
|
151
57
|
materialIndex: geometry.materialIndex && geometry.materialIndex.array,
|
|
152
|
-
indices: geometry.
|
|
58
|
+
indices: geometry.indexArray
|
|
153
59
|
};
|
|
154
60
|
const newGeometry = new Geometry({
|
|
155
61
|
position: new Attribute(
|
|
@@ -186,51 +92,4 @@ function transformGeometry(geometry, matrix) {
|
|
|
186
92
|
}
|
|
187
93
|
return newGeometry;
|
|
188
94
|
}
|
|
189
|
-
function computeGeometryNormals(geometry) {
|
|
190
|
-
const indices = geometry.indices;
|
|
191
|
-
const positions = geometry.position.array;
|
|
192
|
-
geometry.normal = new Attribute(new Float32Array(positions.length), 3);
|
|
193
|
-
const normals = geometry.normal.array;
|
|
194
|
-
const p1 = vec3.create();
|
|
195
|
-
const p2 = vec3.create();
|
|
196
|
-
const p3 = vec3.create();
|
|
197
|
-
const v21 = vec3.create();
|
|
198
|
-
const v32 = vec3.create();
|
|
199
|
-
const n = vec3.create();
|
|
200
|
-
const len = indices
|
|
201
|
-
? indices.array.length
|
|
202
|
-
: geometry.vertexCount;
|
|
203
|
-
let i1, i2, i3;
|
|
204
|
-
for (let f = 0; f < len;) {
|
|
205
|
-
if (indices) {
|
|
206
|
-
i1 = indices.array[f++];
|
|
207
|
-
i2 = indices.array[f++];
|
|
208
|
-
i3 = indices.array[f++];
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
i1 = f++;
|
|
212
|
-
i2 = f++;
|
|
213
|
-
i3 = f++;
|
|
214
|
-
}
|
|
215
|
-
vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
|
|
216
|
-
vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
|
|
217
|
-
vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
|
|
218
|
-
vec3.sub(v21, p1, p2);
|
|
219
|
-
vec3.sub(v32, p2, p3);
|
|
220
|
-
vec3.cross(n, v21, v32);
|
|
221
|
-
// Already be weighted by the triangle area
|
|
222
|
-
for (let i = 0; i < 3; i++) {
|
|
223
|
-
normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
|
|
224
|
-
normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
|
|
225
|
-
normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
for (let i = 0; i < normals.length;) {
|
|
229
|
-
vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
|
|
230
|
-
vec3.normalize(n, n);
|
|
231
|
-
normals[i++] = n[0];
|
|
232
|
-
normals[i++] = n[1];
|
|
233
|
-
normals[i++] = n[2];
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
95
|
//# sourceMappingURL=mergeMeshesToGeometry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { writeMaterialIndices } from './materialIndices.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n let vertexCount = 0;\n let indexCount = 0;\n\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n const index = geometry.indices;\n if (!index) {\n addFlatGeometryIndices(geometry);\n }\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, Array(16).fill(0)));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n vertexCount += Attribute.getCount(geometry.position);\n indexCount += Attribute.getCount(geometry.indices);\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex,\n vertexCount,\n indexCount\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction mergeGeometry(\n geometryAndMaterialIndex: {\n geometry: Geometry;\n materialIndex: number[];\n }[],\n totalVertexCount: number,\n totalIndexCount: number\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 const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n // color: colorAttrib,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n let currentMesh = 1;\n\n for (const { geometry } of geometryAndMaterialIndex) {\n if (geometry.color) {\n mergedGeometry.color = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n if (geometry.tangent) {\n mergedGeometry.tangent = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n break;\n }\n }\n\n for (const {\n geometry,\n materialIndex: globalMaterialIndex\n } of geometryAndMaterialIndex) {\n const vertexCount = Attribute.getCount(geometry.position);\n\n (['position', 'normal', 'uv'] as const).forEach((attr) => {\n if (!geometry[attr]) {\n if (attr == 'normal' || attr === 'position') {\n console.error(\n 'Geometry must have at least position and normal attributes.'\n );\n }\n return;\n }\n mergedGeometry[attr]!.array.set(\n geometry[attr]!.array,\n currentVertex * geometry[attr]!.itemSize\n );\n });\n\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n\n if (mergedGeometry.color) {\n const itemSize = 3;\n if (geometry.color) {\n mergedGeometry.color.array.set(\n geometry.color.array,\n currentVertex * itemSize\n );\n } else {\n // Set to white\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.color.array[currentVertex * itemSize + i] = 1;\n }\n }\n }\n if (mergedGeometry.tangent) {\n const itemSize = 3;\n if (geometry.tangent) {\n mergedGeometry.tangent.array.set(\n geometry.tangent.array,\n currentVertex * itemSize\n );\n } else {\n for (let i = 0; i < vertexCount * itemSize; i++) {\n mergedGeometry.tangent.array[currentVertex * itemSize + i] = 0;\n }\n }\n }\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex, true);\n\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n currentMesh++;\n }\n\n return mergedGeometry;\n}\n\nfunction addFlatGeometryIndices(geometry: Geometry) {\n const position = geometry.position;\n\n if (!position) {\n console.warn('No position attribute');\n return;\n }\n\n const index = new Uint32Array(Attribute.getCount(position));\n\n for (let i = 0; i < index.length; i++) {\n index[i] = i;\n }\n\n geometry.indices = new Attribute(index, 1);\n\n return geometry;\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indices.array\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\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.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[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"]}
|
|
1
|
+
{"version":3,"file":"mergeMeshesToGeometry.js","sourceRoot":"","sources":["../../src/renderer/mergeMeshesToGeometry.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport { meshInstanceCount, meshInstanceTransform } from './meshInstances.js';\nimport { mergeGeometry, computeGeometryNormals } from './scenePreparation.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { mat3, mat4, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial, {\n getMaterialHashKey,\n resetMaterialTextureId\n} from '../scene/OpenPBRMaterial.js';\n\nexport interface InternalMergedMesh {\n geometry: Geometry;\n materials: OpenPBRMaterial[];\n}\n\nexport function mergeMeshesToGeometry(meshes: Mesh[]): InternalMergedMesh {\n const geometryAndMaterialIndex = [];\n const materialIndexMap = new Map<string, number>();\n const materials: OpenPBRMaterial[] = [];\n\n resetMaterialTextureId();\n\n for (const mesh of meshes) {\n const parent = matrixStorage(mesh.transform);\n for (let instance = 0; instance < meshInstanceCount(mesh); instance++) {\n let geometry = mesh.geometry;\n\n geometry = transformGeometry(geometry, meshInstanceTransform(mesh, instance, new Float64Array(16), parent));\n\n if (!geometry.normal) {\n computeGeometryNormals(geometry);\n } else {\n vec3.forEach(\n geometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.normalize,\n undefined\n );\n }\n\n const materialIndices = mesh.materials.map((material) => {\n const key = getMaterialHashKey(material);\n let materialIndex = materialIndexMap.get(key);\n if (materialIndex === undefined) {\n materialIndex = materialIndexMap.size;\n materialIndexMap.set(key, materialIndex);\n materials.push(material);\n }\n return materialIndex;\n });\n\n geometryAndMaterialIndex.push({\n geometry,\n materialIndex: materialIndices\n });\n }\n }\n\n const geometry = mergeGeometry(\n geometryAndMaterialIndex.map(({geometry}) => geometry),\n geometryAndMaterialIndex.map(({materialIndex}) => materialIndex),\n new Map(),\n true\n );\n\n return {\n geometry,\n // TODO compress materials. Reuse materials with same props.\n materials\n };\n}\n\nfunction transformGeometry(geometry: Geometry, matrix: mat4.Mat4Array) {\n const { position, normal, uv, uv1, color, tangent, materialIndex, indices } = {\n position: geometry.position.array,\n normal: geometry.normal.array,\n uv: geometry.uv && geometry.uv.array,\n uv1: geometry.uv1 && geometry.uv1.array,\n color: geometry.color && geometry.color.array,\n tangent: geometry.tangent && geometry.tangent.array,\n materialIndex: geometry.materialIndex && geometry.materialIndex.array,\n indices: geometry.indexArray\n };\n const newGeometry = new Geometry({\n position: new Attribute(\n // TODO only copy when necessary\n new Float32Array(position),\n geometry.position.itemSize\n ),\n normal: new Attribute(new Float32Array(normal), geometry.normal.itemSize),\n // No need to clone uv\n uv: uv && new Attribute(uv, geometry.uv!.itemSize),\n uv1: uv1 && new Attribute(uv1, geometry.uv1!.itemSize),\n color: color && new Attribute(color, geometry.color!.itemSize),\n tangent:\n tangent &&\n new Attribute(new Float32Array(tangent), geometry.tangent!.itemSize),\n materialIndex: materialIndex && new Attribute(materialIndex, geometry.materialIndex!.itemSize),\n indices: indices && new Attribute(indices, geometry.indices.itemSize)\n });\n\n // Normal Matrix\n let normalMatrix = mat3.normalFromMat4(mat3.create(), matrix);\n if (normalMatrix == null) {\n // If matrix has NaN value. normalMatrix may be null.\n // Create an identity one.\n // TODO remove scale information\n normalMatrix = mat3.create();\n }\n\n vec3.forEach(\n newGeometry.position.array,\n 3,\n 0,\n undefined,\n vec3.transformMat4,\n matrix\n );\n\n if (newGeometry.normal) {\n vec3.forEach(\n newGeometry.normal.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n vec3.forEach(newGeometry.normal.array, 3, 0, undefined, vec3.normalize);\n }\n if (newGeometry.tangent) {\n vec3.forEach(\n newGeometry.tangent.array,\n 3,\n 0,\n undefined,\n vec3.transformMat3,\n normalMatrix!\n );\n // Try not to normalize the tangent.\n // The anisotropic needs radial tangent. The interpolation inside the triangle will be wrong if we normalize it.\n // vec3.forEach(newGeometry.tangent.array, 3, 0, undefined, vec3.normalize);\n }\n return newGeometry;\n}\n"]}
|
|
@@ -1,23 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type MeshState from '../scene/MeshState.js';
|
|
2
2
|
import { mat4 } from '../math.js';
|
|
3
|
-
|
|
4
|
-
export declare function meshInstanceCount(mesh: Mesh): number;
|
|
3
|
+
export declare function meshInstanceCount(mesh: MeshState): number;
|
|
5
4
|
/** Writes a world matrix without allocating per-instance Mesh objects or views. */
|
|
6
|
-
export declare function meshInstanceTransform(mesh:
|
|
7
|
-
|
|
8
|
-
export declare class PackedMeshInstances {
|
|
9
|
-
length: number;
|
|
10
|
-
readonly transforms: Float64Array;
|
|
11
|
-
readonly colors: Float32Array;
|
|
12
|
-
readonly bounds: Float32Array;
|
|
13
|
-
readonly blasIndices: Uint32Array;
|
|
14
|
-
readonly materials: Int32Array;
|
|
15
|
-
readonly displacement: Float64Array;
|
|
16
|
-
readonly sourceIndices: Uint32Array;
|
|
17
|
-
private readonly view;
|
|
18
|
-
constructor(capacity: number);
|
|
19
|
-
read(index: number): TLASInstance;
|
|
20
|
-
}
|
|
21
|
-
export type MeshInstances = TLASInstance[] | PackedMeshInstances;
|
|
22
|
-
export declare function readMeshInstance(instances: MeshInstances, index: number): TLASInstance;
|
|
23
|
-
export declare function sameInstanceMembership(a: MeshInstances, b: MeshInstances): boolean;
|
|
5
|
+
export declare function meshInstanceTransform<T extends mat4.Mat4Array>(mesh: MeshState, index: number, out: T, parent?: Float64Array<ArrayBufferLike>): T;
|
|
6
|
+
export { PackedMeshInstances, readMeshInstance, sameInstanceMembership, type MeshInstances } from './packedMeshInstances.js';
|
|
@@ -1,66 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { matrixStorage } from '../math/storage.js';
|
|
2
|
+
import { read, write } from '../math/access.js';
|
|
2
3
|
import { mat4 } from '../math.js';
|
|
3
|
-
export function meshInstanceCount(mesh) { return mesh
|
|
4
|
+
export function meshInstanceCount(mesh) { return mesh.instanceData?.count ?? 1; }
|
|
4
5
|
/** Writes a world matrix without allocating per-instance Mesh objects or views. */
|
|
5
|
-
export function meshInstanceTransform(mesh, index, out) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export function meshInstanceTransform(mesh, index, out, parent = matrixStorage(mesh.transform)) {
|
|
7
|
+
const instances = mesh.instanceData;
|
|
8
|
+
if (!instances)
|
|
9
|
+
return mat4.copy(out, parent);
|
|
10
|
+
const local = instances.transforms, offset = index * 16;
|
|
9
11
|
for (let column = 0; column < 4; column++) {
|
|
10
12
|
const o = offset + column * 4;
|
|
11
13
|
const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];
|
|
12
14
|
for (let row = 0; row < 4; row++)
|
|
13
|
-
out
|
|
15
|
+
write(out, column * 4 + row, read(parent, row) * x + read(parent, row + 4) * y + read(parent, row + 8) * z + read(parent, row + 12) * w);
|
|
14
16
|
}
|
|
15
17
|
return out;
|
|
16
18
|
}
|
|
17
|
-
|
|
18
|
-
export class PackedMeshInstances {
|
|
19
|
-
length = 0;
|
|
20
|
-
transforms;
|
|
21
|
-
colors;
|
|
22
|
-
bounds;
|
|
23
|
-
blasIndices;
|
|
24
|
-
materials;
|
|
25
|
-
displacement;
|
|
26
|
-
sourceIndices;
|
|
27
|
-
view = { blasIndex: 0, bounds: { min: [0, 0, 0], max: [0, 0, 0] }, transform: Array(16).fill(0), materialsIndices: [0], color: [1, 1, 1] };
|
|
28
|
-
constructor(capacity) {
|
|
29
|
-
this.colors = new Float32Array(capacity * 3);
|
|
30
|
-
this.transforms = new Float64Array(capacity * 16);
|
|
31
|
-
this.bounds = new Float32Array(capacity * 6);
|
|
32
|
-
this.blasIndices = new Uint32Array(capacity);
|
|
33
|
-
this.materials = new Int32Array(capacity);
|
|
34
|
-
this.displacement = new Float64Array(capacity);
|
|
35
|
-
this.sourceIndices = new Uint32Array(capacity);
|
|
36
|
-
}
|
|
37
|
-
read(index) {
|
|
38
|
-
const v = this.view;
|
|
39
|
-
v.blasIndex = this.blasIndices[index];
|
|
40
|
-
v.materialsIndices[0] = this.materials[index];
|
|
41
|
-
v.displacementScale = this.displacement[index];
|
|
42
|
-
for (let i = 0; i < 16; i++)
|
|
43
|
-
v.transform[i] = this.transforms[index * 16 + i];
|
|
44
|
-
for (let i = 0; i < 3; i++)
|
|
45
|
-
v.color[i] = this.colors[index * 3 + i];
|
|
46
|
-
for (let i = 0; i < 3; i++) {
|
|
47
|
-
v.bounds.min[i] = this.bounds[index * 6 + i];
|
|
48
|
-
v.bounds.max[i] = this.bounds[index * 6 + i + 3];
|
|
49
|
-
}
|
|
50
|
-
return v;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export function readMeshInstance(instances, index) {
|
|
54
|
-
return instances instanceof PackedMeshInstances ? instances.read(index) : instances[index];
|
|
55
|
-
}
|
|
56
|
-
export function sameInstanceMembership(a, b) {
|
|
57
|
-
if (a.length !== b.length)
|
|
58
|
-
return false;
|
|
59
|
-
if (a instanceof PackedMeshInstances && b instanceof PackedMeshInstances) {
|
|
60
|
-
for (let i = 0; i < a.length; i++)
|
|
61
|
-
if (a.sourceIndices[i] !== b.sourceIndices[i])
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
19
|
+
export { PackedMeshInstances, readMeshInstance, sameInstanceMembership } from './packedMeshInstances.js';
|
|
66
20
|
//# sourceMappingURL=meshInstances.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshInstances.js","sourceRoot":"","sources":["../../src/renderer/meshInstances.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meshInstances.js","sourceRoot":"","sources":["../../src/renderer/meshInstances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,UAAU,iBAAiB,CAAC,IAAe,IAAI,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5F,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAA2B,IAAe,EAAE,KAAa,EAAE,GAAM,EAAE,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5I,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,EAAE,CAAC;IACxD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE;YAAE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7K,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAsB,MAAM,0BAA0B,CAAC","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type MeshState from '../scene/MeshState.js';\nimport { read, write } from '../math/access.js';\nimport { mat4 } from '../math.js';\n\nexport function meshInstanceCount(mesh: MeshState) { return mesh.instanceData?.count ?? 1; }\n/** Writes a world matrix without allocating per-instance Mesh objects or views. */\nexport function meshInstanceTransform<T extends mat4.Mat4Array>(mesh: MeshState, index: number, out: T, parent = matrixStorage(mesh.transform)): T {\n const instances = mesh.instanceData;\n if (!instances) return mat4.copy(out, parent);\n const local = instances.transforms, offset = index * 16;\n for (let column = 0; column < 4; column++) {\n const o = offset + column * 4;\n const x = local[o], y = local[o + 1], z = local[o + 2], w = local[o + 3];\n for (let row = 0; row < 4; row++) write(out, column * 4 + row, read(parent, row) * x + read(parent, row + 4) * y + read(parent, row + 8) * z + read(parent, row + 12) * w);\n }\n return out;\n}\n\nexport { PackedMeshInstances, readMeshInstance, sameInstanceMembership, type MeshInstances } from './packedMeshInstances.js';\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="@webgpu/types" preserve="true" />
|
|
2
|
-
import { type UNet } from 'oidn-
|
|
2
|
+
import { type UNet } from 'oidn-webgpu';
|
|
3
3
|
import type Engine from '../Engine.js';
|
|
4
4
|
import type { OIDNDenoiserOptions } from '../Render.js';
|
|
5
5
|
export interface OIDNAuxiliaryDenoisers {
|
|
@@ -11,7 +11,7 @@ export interface OIDNAuxiliaryDenoisers {
|
|
|
11
11
|
export type OIDNDenoiser = UNet & {
|
|
12
12
|
/** Optional RT auxiliary filters used before a clean-aux beauty model. */
|
|
13
13
|
auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;
|
|
14
|
-
/** Optional shape preparation supported by newer oidn-
|
|
14
|
+
/** Optional shape preparation supported by newer oidn-webgpu runtimes. */
|
|
15
15
|
prepareForImage?: (width: number, height: number, options?: {
|
|
16
16
|
tileOverlap?: number;
|
|
17
17
|
}) => Promise<void>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="@webgpu/types" preserve="true" />
|
|
2
|
-
import { initUNetFromBuffer } from 'oidn-
|
|
2
|
+
import { initUNetFromBuffer } from 'oidn-webgpu';
|
|
3
3
|
import { resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL, OIDN_WEIGHTS_PACKAGE } from '../oidn.js';
|
|
4
4
|
async function fetchOIDNWeights(url, signal) {
|
|
5
5
|
const response = await fetch(String(url), { signal });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidnNetwork.js","sourceRoot":"","sources":["../../src/renderer/oidnNetwork.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\nimport { initUNetFromBuffer, type UNet } from 'oidn-web';\nimport type Engine from '../Engine.js';\nimport type { OIDNDenoiserOptions } from '../Render.js';\nimport {\n resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL,\n OIDN_WEIGHTS_PACKAGE\n} from '../oidn.js';\nimport type {\n OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer,\n OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls\n} from '../oidn.js';\n\nexport interface OIDNAuxiliaryDenoisers {\n /** Loaded albedo prefilter; supplied by the clean-aux loader. */\n albedo: OIDNDenoiser;\n /** Loaded normal prefilter; supplied by the clean-aux loader. */\n normal: OIDNDenoiser;\n}\nexport type OIDNDenoiser = UNet & {\n /** Optional RT auxiliary filters used before a clean-aux beauty model. */\n auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;\n /** Optional shape preparation supported by newer oidn-web runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n};\n\ninterface OIDNLoadOptions {\n /** Maximum OIDN tile size. By default oidn-web chooses the tile size. */\n maxTileSize?: number;\n /** Optional signal used while downloading the weights. */\n signal?: AbortSignal;\n /** OIDN execution engine. `webnn` enables the experimental WebNN FP16 path. */\n engine?: OIDNEngine;\n /** Native WGSL precision. `auto` uses FP16 when shader-f16 is available. */\n precision?: OIDNPrecision;\n /** Adaptive tile controller settings, or false for fixed tiles. */\n dynamicTile?: OIDNDynamicTileSetting;\n}\n\ninterface InitializeOIDNOptions extends OIDNLoadOptions {\n /** Packaged model to load. Defaults to the standard model. */\n model?: OIDNModel;\n /** Override directory for all weights. Defaults to bundled standard/small assets and the oidn-weights CDN for large networks. */\n weightsBaseUrl?: string | URL;\n /** Override the packaged albedo/normal prefilter weights for a clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\ninterface CustomOIDNModelOptions extends OIDNLoadOptions {\n /** Whether the custom model consumes albedo and normal guides. Defaults to true. */\n aux?: boolean;\n /** Whether the custom model consumes HDR color. Defaults to true. */\n hdr?: boolean;\n /** HDR encoding expected by the weights. OIDN's RT models use PU. */\n hdrTransfer?: OIDNHDRTransfer;\n /** Optional albedo/normal filters to run before the custom clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\nasync function fetchOIDNWeights(url: string | URL, signal?: AbortSignal) {\n const response = await fetch(String(url), { signal });\n if (!response.ok) {\n throw new Error(\n `Failed to load OIDN weights from ${url}: ${response.status} ${response.statusText}`\n );\n }\n const buffer = await response.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n if (bytes[0] !== 0xD7 || bytes[1] !== 0x41) {\n throw new Error(`Invalid OIDN TZA weights from ${url}: expected magic D7 41 (received non-TZA content).`);\n }\n return buffer;\n}\n\n/**\n * Loads an HDR OIDN model with albedo/normal guides on the engine's WebGPU\n * device and returns it without attaching it to a render.\n */\nasync function loadOIDN(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {},\n fetchWeights = fetchOIDNWeights\n): Promise<OIDNDenoiser> {\n await engine.init();\n const device = engine.device;\n if (engine.backend !== 'webgpu' || !device) {\n throw new Error('OIDN requires a WebGPU engine.');\n }\n\n const auxiliaryUrls = options.auxiliaryModelUrls;\n const weightBuffers = await Promise.all([\n engine._getWeights(String(weightsUrl), () => fetchWeights(weightsUrl, options.signal)),\n ...(auxiliaryUrls\n ? [\n engine._getWeights(String(auxiliaryUrls.albedo), () => fetchWeights(auxiliaryUrls.albedo, options.signal)),\n engine._getWeights(String(auxiliaryUrls.normal), () => fetchWeights(auxiliaryUrls.normal, options.signal))\n ]\n : [])\n ]);\n const backend = { device };\n const runtimeOptions = {\n hdrTransfer: options.hdrTransfer ?? 'pu',\n maxTileSize: options.maxTileSize,\n engine: options.engine,\n precision: options.precision,\n dynamicTile: options.dynamicTile\n };\n let denoiser: OIDNDenoiser | undefined;\n let albedoDenoiser: OIDNDenoiser | undefined;\n try {\n denoiser = await initUNetFromBuffer(weightBuffers[0], backend, {\n aux: options.aux ?? true,\n hdr: options.hdr ?? true,\n ...runtimeOptions\n });\n if (auxiliaryUrls) {\n // Auxiliary RT networks are color-only three-channel UNets. The render\n // pipeline supplies their feature-specific transfer functions.\n albedoDenoiser = await initUNetFromBuffer(weightBuffers[1], backend, {\n aux: false,\n hdr: false,\n ...runtimeOptions\n });\n const normalDenoiser = await initUNetFromBuffer(\n weightBuffers[2],\n backend,\n {\n aux: false,\n hdr: false,\n ...runtimeOptions\n }\n );\n denoiser.auxiliaryDenoisers = {\n albedo: albedoDenoiser,\n normal: normalDenoiser\n };\n }\n } catch (error) {\n albedoDenoiser?.dispose();\n denoiser?.dispose();\n throw error;\n }\n return denoiser;\n}\n\n/** Loads an explicit HDR network URL; download failures never fall back to a CDN. */\nfunction initializeOIDNFromURL(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {}\n): Promise<OIDNDenoiser> {\n return loadOIDN(engine, weightsUrl, options);\n}\n\nlet warnedBundledWeights = false;\n\n/** Loads one of the packaged OIDN models. */\nfunction initializeOIDN(\n engine: Engine,\n options: InitializeOIDNOptions = {}\n) {\n const {\n model = 'standard',\n weightsBaseUrl,\n auxiliaryModelUrls,\n ...loadOptions\n } = options;\n const mainUrl = resolveOIDNModelUrl(model, weightsBaseUrl);\n const defaultBundled = weightsBaseUrl === undefined && model !== 'cleanAuxLarge';\n const defaultLarge = new Set<string>(weightsBaseUrl === undefined && model === 'cleanAuxLarge'\n ? [mainUrl, ...(!auxiliaryModelUrls ? Object.values(resolveOIDNAuxiliaryModelUrls()).map(String) : [])]\n : []);\n const fetchWeights = async (url: string | URL, signal?: AbortSignal) => {\n try {\n return await fetchOIDNWeights(url, signal);\n } catch (error) {\n if (signal?.aborted) throw error;\n if (defaultBundled && String(url) === mainUrl) {\n if (!warnedBundledWeights) {\n warnedBundledWeights = true;\n console.warn('Bundled OIDN weights failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: [\"@meimu/mutracer\"] }, or pass weightsBaseUrl to self-host the weights.', error);\n }\n return fetchOIDNWeights(resolveOIDNModelUrl(model, DEFAULT_OIDN_WEIGHTS_BASE_URL), signal);\n }\n if (defaultLarge.has(String(url))) {\n throw new Error(`Failed to load ${OIDN_WEIGHTS_PACKAGE} network from ${url}. Self-host node_modules/oidn-weights/*.tza and pass weightsBaseUrl. ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n };\n return loadOIDN(\n engine,\n mainUrl,\n {\n ...loadOptions,\n auxiliaryModelUrls:\n auxiliaryModelUrls ?? (model === 'cleanAuxLarge'\n ? resolveOIDNAuxiliaryModelUrls(weightsBaseUrl) : undefined)\n },\n fetchWeights\n );\n}\n\n/** Internal lazy loader; both public OIDN option branches use this path. */\nexport function loadOIDNNetwork(engine: Engine, options: Readonly<OIDNDenoiserOptions>): Promise<OIDNDenoiser> {\n if (options.weightsUrl !== undefined) return initializeOIDNFromURL(engine, options.weightsUrl, options);\n return initializeOIDN(engine, options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oidnNetwork.js","sourceRoot":"","sources":["../../src/renderer/oidnNetwork.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\nimport { initUNetFromBuffer, type UNet } from 'oidn-webgpu';\nimport type Engine from '../Engine.js';\nimport type { OIDNDenoiserOptions } from '../Render.js';\nimport {\n resolveOIDNModelUrl, resolveOIDNAuxiliaryModelUrls, DEFAULT_OIDN_WEIGHTS_BASE_URL,\n OIDN_WEIGHTS_PACKAGE\n} from '../oidn.js';\nimport type {\n OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer,\n OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls\n} from '../oidn.js';\n\nexport interface OIDNAuxiliaryDenoisers {\n /** Loaded albedo prefilter; supplied by the clean-aux loader. */\n albedo: OIDNDenoiser;\n /** Loaded normal prefilter; supplied by the clean-aux loader. */\n normal: OIDNDenoiser;\n}\nexport type OIDNDenoiser = UNet & {\n /** Optional RT auxiliary filters used before a clean-aux beauty model. */\n auxiliaryDenoisers?: OIDNAuxiliaryDenoisers;\n /** Optional shape preparation supported by newer oidn-webgpu runtimes. */\n prepareForImage?: (\n width: number,\n height: number,\n options?: { tileOverlap?: number }\n ) => Promise<void>;\n};\n\ninterface OIDNLoadOptions {\n /** Maximum OIDN tile size. By default oidn-webgpu chooses the tile size. */\n maxTileSize?: number;\n /** Optional signal used while downloading the weights. */\n signal?: AbortSignal;\n /** OIDN execution engine. `webnn` enables the experimental WebNN FP16 path. */\n engine?: OIDNEngine;\n /** Native WGSL precision. `auto` uses FP16 when shader-f16 is available. */\n precision?: OIDNPrecision;\n /** Adaptive tile controller settings, or false for fixed tiles. */\n dynamicTile?: OIDNDynamicTileSetting;\n}\n\ninterface InitializeOIDNOptions extends OIDNLoadOptions {\n /** Packaged model to load. Defaults to the standard model. */\n model?: OIDNModel;\n /** Override directory for all weights. Defaults to bundled standard/small assets and the oidn-weights CDN for large networks. */\n weightsBaseUrl?: string | URL;\n /** Override the packaged albedo/normal prefilter weights for a clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\ninterface CustomOIDNModelOptions extends OIDNLoadOptions {\n /** Whether the custom model consumes albedo and normal guides. Defaults to true. */\n aux?: boolean;\n /** Whether the custom model consumes HDR color. Defaults to true. */\n hdr?: boolean;\n /** HDR encoding expected by the weights. OIDN's RT models use PU. */\n hdrTransfer?: OIDNHDRTransfer;\n /** Optional albedo/normal filters to run before the custom clean-aux model. */\n auxiliaryModelUrls?: OIDNAuxiliaryModelUrls;\n}\n\nasync function fetchOIDNWeights(url: string | URL, signal?: AbortSignal) {\n const response = await fetch(String(url), { signal });\n if (!response.ok) {\n throw new Error(\n `Failed to load OIDN weights from ${url}: ${response.status} ${response.statusText}`\n );\n }\n const buffer = await response.arrayBuffer();\n const bytes = new Uint8Array(buffer);\n if (bytes[0] !== 0xD7 || bytes[1] !== 0x41) {\n throw new Error(`Invalid OIDN TZA weights from ${url}: expected magic D7 41 (received non-TZA content).`);\n }\n return buffer;\n}\n\n/**\n * Loads an HDR OIDN model with albedo/normal guides on the engine's WebGPU\n * device and returns it without attaching it to a render.\n */\nasync function loadOIDN(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {},\n fetchWeights = fetchOIDNWeights\n): Promise<OIDNDenoiser> {\n await engine.init();\n const device = engine.device;\n if (engine.backend !== 'webgpu' || !device) {\n throw new Error('OIDN requires a WebGPU engine.');\n }\n\n const auxiliaryUrls = options.auxiliaryModelUrls;\n const weightBuffers = await Promise.all([\n engine._getWeights(String(weightsUrl), () => fetchWeights(weightsUrl, options.signal)),\n ...(auxiliaryUrls\n ? [\n engine._getWeights(String(auxiliaryUrls.albedo), () => fetchWeights(auxiliaryUrls.albedo, options.signal)),\n engine._getWeights(String(auxiliaryUrls.normal), () => fetchWeights(auxiliaryUrls.normal, options.signal))\n ]\n : [])\n ]);\n const backend = { device };\n const runtimeOptions = {\n hdrTransfer: options.hdrTransfer ?? 'pu',\n maxTileSize: options.maxTileSize,\n engine: options.engine,\n precision: options.precision,\n dynamicTile: options.dynamicTile\n };\n let denoiser: OIDNDenoiser | undefined;\n let albedoDenoiser: OIDNDenoiser | undefined;\n try {\n denoiser = await initUNetFromBuffer(weightBuffers[0], backend, {\n aux: options.aux ?? true,\n hdr: options.hdr ?? true,\n ...runtimeOptions\n });\n if (auxiliaryUrls) {\n // Auxiliary RT networks are color-only three-channel UNets. The render\n // pipeline supplies their feature-specific transfer functions.\n albedoDenoiser = await initUNetFromBuffer(weightBuffers[1], backend, {\n aux: false,\n hdr: false,\n ...runtimeOptions\n });\n const normalDenoiser = await initUNetFromBuffer(\n weightBuffers[2],\n backend,\n {\n aux: false,\n hdr: false,\n ...runtimeOptions\n }\n );\n denoiser.auxiliaryDenoisers = {\n albedo: albedoDenoiser,\n normal: normalDenoiser\n };\n }\n } catch (error) {\n albedoDenoiser?.dispose();\n denoiser?.dispose();\n throw error;\n }\n return denoiser;\n}\n\n/** Loads an explicit HDR network URL; download failures never fall back to a CDN. */\nfunction initializeOIDNFromURL(\n engine: Engine,\n weightsUrl: string | URL,\n options: CustomOIDNModelOptions = {}\n): Promise<OIDNDenoiser> {\n return loadOIDN(engine, weightsUrl, options);\n}\n\nlet warnedBundledWeights = false;\n\n/** Loads one of the packaged OIDN models. */\nfunction initializeOIDN(\n engine: Engine,\n options: InitializeOIDNOptions = {}\n) {\n const {\n model = 'standard',\n weightsBaseUrl,\n auxiliaryModelUrls,\n ...loadOptions\n } = options;\n const mainUrl = resolveOIDNModelUrl(model, weightsBaseUrl);\n const defaultBundled = weightsBaseUrl === undefined && model !== 'cleanAuxLarge';\n const defaultLarge = new Set<string>(weightsBaseUrl === undefined && model === 'cleanAuxLarge'\n ? [mainUrl, ...(!auxiliaryModelUrls ? Object.values(resolveOIDNAuxiliaryModelUrls()).map(String) : [])]\n : []);\n const fetchWeights = async (url: string | URL, signal?: AbortSignal) => {\n try {\n return await fetchOIDNWeights(url, signal);\n } catch (error) {\n if (signal?.aborted) throw error;\n if (defaultBundled && String(url) === mainUrl) {\n if (!warnedBundledWeights) {\n warnedBundledWeights = true;\n console.warn('Bundled OIDN weights failed to load; falling back to jsDelivr. In Vite development add optimizeDeps: { exclude: [\"@meimu/mutracer\"] }, or pass weightsBaseUrl to self-host the weights.', error);\n }\n return fetchOIDNWeights(resolveOIDNModelUrl(model, DEFAULT_OIDN_WEIGHTS_BASE_URL), signal);\n }\n if (defaultLarge.has(String(url))) {\n throw new Error(`Failed to load ${OIDN_WEIGHTS_PACKAGE} network from ${url}. Self-host node_modules/oidn-weights/*.tza and pass weightsBaseUrl. ${error instanceof Error ? error.message : String(error)}`);\n }\n throw error;\n }\n };\n return loadOIDN(\n engine,\n mainUrl,\n {\n ...loadOptions,\n auxiliaryModelUrls:\n auxiliaryModelUrls ?? (model === 'cleanAuxLarge'\n ? resolveOIDNAuxiliaryModelUrls(weightsBaseUrl) : undefined)\n },\n fetchWeights\n );\n}\n\n/** Internal lazy loader; both public OIDN option branches use this path. */\nexport function loadOIDNNetwork(engine: Engine, options: Readonly<OIDNDenoiserOptions>): Promise<OIDNDenoiser> {\n if (options.weightsUrl !== undefined) return initializeOIDNFromURL(engine, options.weightsUrl, options);\n return initializeOIDN(engine, options);\n}\n"]}
|