@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,158 +1,17 @@
|
|
|
1
|
+
import { isProceduralSkyImage } from '../scene/skyParameters.js';
|
|
2
|
+
import { prepareSceneMeshes, computeGeometryNormals } from './scenePreparation.js';
|
|
1
3
|
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
2
|
-
import { meshInstanceCount
|
|
4
|
+
import { meshInstanceCount } from './meshInstances.js';
|
|
3
5
|
import { createCanvas } from '../util/canvas.js';
|
|
4
|
-
import { packMaterialIndexAndWeightToInt } from './materialIndices.js';
|
|
5
6
|
import { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches } from './geometryBvh.js';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import Geometry
|
|
7
|
+
import { displacementBaseGeometry, computeDisplacementMinmax, computeTrianglesDisplacementRange, conservativeTrianglesDisplacementRange } from './displacementPreparation.js';
|
|
8
|
+
export { sphericalProjectionTriangle, triplanarProjectionTriangle } from './displacementPreparation.js';
|
|
9
|
+
import Geometry from '../scene/Geometry.js';
|
|
9
10
|
import { buildBLAS } from './bvhAccel.js';
|
|
10
|
-
import { colorLuminance } from './lightSampling.js';
|
|
11
11
|
import { isTextureDataSource } from '../scene/Texture.js';
|
|
12
|
-
import { generateVertexTangents
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);
|
|
16
|
-
const positions = geometry.position.array;
|
|
17
|
-
const stride = geometry.position.itemSize;
|
|
18
|
-
for (let offset = 0; offset + 2 < positions.length; offset += stride) {
|
|
19
|
-
const x = positions[offset];
|
|
20
|
-
const y = positions[offset + 1];
|
|
21
|
-
const z = positions[offset + 2];
|
|
22
|
-
if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
min[0] = Math.min(min[0], x);
|
|
26
|
-
min[1] = Math.min(min[1], y);
|
|
27
|
-
min[2] = Math.min(min[2], z);
|
|
28
|
-
max[0] = Math.max(max[0], x);
|
|
29
|
-
max[1] = Math.max(max[1], y);
|
|
30
|
-
max[2] = Math.max(max[2], z);
|
|
31
|
-
}
|
|
32
|
-
return [min, max];
|
|
33
|
-
}
|
|
34
|
-
export function getBvhBounds(geometry) {
|
|
35
|
-
const bvh = getGeometryBvh(geometry);
|
|
36
|
-
const floats = new Float32Array(bvh.buffer);
|
|
37
|
-
if (bvh.layout === 'bvh4') {
|
|
38
|
-
return [
|
|
39
|
-
[floats[0], floats[1], floats[2]],
|
|
40
|
-
[
|
|
41
|
-
floats[0] + floats[3],
|
|
42
|
-
floats[1] + floats[4],
|
|
43
|
-
floats[2] + floats[5]
|
|
44
|
-
]
|
|
45
|
-
];
|
|
46
|
-
}
|
|
47
|
-
if (bvh.layout === 'bvh-gpu') {
|
|
48
|
-
const words = new Uint32Array(bvh.buffer);
|
|
49
|
-
if (words[11] === 0) {
|
|
50
|
-
return [
|
|
51
|
-
[
|
|
52
|
-
Math.min(floats[0], floats[8]),
|
|
53
|
-
Math.min(floats[1], floats[9]),
|
|
54
|
-
Math.min(floats[2], floats[10])
|
|
55
|
-
],
|
|
56
|
-
[
|
|
57
|
-
Math.max(floats[4], floats[12]),
|
|
58
|
-
Math.max(floats[5], floats[13]),
|
|
59
|
-
Math.max(floats[6], floats[14])
|
|
60
|
-
]
|
|
61
|
-
];
|
|
62
|
-
}
|
|
63
|
-
// A single-leaf BVH_GPU node does not store its own bounds.
|
|
64
|
-
return computeGeometryBounds(geometry);
|
|
65
|
-
}
|
|
66
|
-
if (bvh.layout === 'cwbvh') {
|
|
67
|
-
const words = new Uint32Array(bvh.buffer);
|
|
68
|
-
const header = words[3];
|
|
69
|
-
const signedByte = (value) => (value << 24) >> 24;
|
|
70
|
-
const scale = [
|
|
71
|
-
2 ** signedByte(header),
|
|
72
|
-
2 ** signedByte(header >> 8),
|
|
73
|
-
2 ** signedByte(header >> 16)
|
|
74
|
-
];
|
|
75
|
-
const min = [floats[0], floats[1], floats[2]];
|
|
76
|
-
const max = [...min];
|
|
77
|
-
for (let slot = 0; slot < 8; slot++) {
|
|
78
|
-
const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;
|
|
79
|
-
if (!meta)
|
|
80
|
-
continue;
|
|
81
|
-
const shift = (slot & 3) * 8;
|
|
82
|
-
const half = slot >> 2;
|
|
83
|
-
max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);
|
|
84
|
-
max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);
|
|
85
|
-
max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);
|
|
86
|
-
}
|
|
87
|
-
return [min, max];
|
|
88
|
-
}
|
|
89
|
-
return [
|
|
90
|
-
[floats[0], floats[1], floats[2]],
|
|
91
|
-
[floats[4], floats[5], floats[6]]
|
|
92
|
-
];
|
|
93
|
-
}
|
|
94
|
-
export function computeBounds(_geometry, m, bvhBounds, result = { min: vec3.create(), max: vec3.create() }, p = vec3.create()) {
|
|
95
|
-
const { min, max } = result;
|
|
96
|
-
vec3.set(min, Infinity, Infinity, Infinity);
|
|
97
|
-
vec3.set(max, -Infinity, -Infinity, -Infinity);
|
|
98
|
-
// Transforming the eight BLAS AABB corners is exact for an affine transform
|
|
99
|
-
// and independent of mesh vertex count. The previous rotated path scanned
|
|
100
|
-
// every vertex on every instance update.
|
|
101
|
-
for (let corner = 0; corner < 8; corner++) {
|
|
102
|
-
vec3.set(p, bvhBounds[(corner >> 0) & 1][0], bvhBounds[(corner >> 1) & 1][1], bvhBounds[(corner >> 2) & 1][2]);
|
|
103
|
-
vec3.transformMat4(p, p, m);
|
|
104
|
-
if (!p.every(isFinite))
|
|
105
|
-
continue;
|
|
106
|
-
vec3.min(min, min, p);
|
|
107
|
-
vec3.max(max, max, p);
|
|
108
|
-
}
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
export function updateMeshInstanceTransforms(bindings, current, dirtyIndices) {
|
|
112
|
-
if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {
|
|
113
|
-
const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));
|
|
114
|
-
const matrix = Array(16).fill(0);
|
|
115
|
-
const boundsScratch = { min: vec3.create(), max: vec3.create() }, pointScratch = vec3.create();
|
|
116
|
-
let sourceIndex = 0;
|
|
117
|
-
for (const binding of bindings) {
|
|
118
|
-
const { mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale } = binding;
|
|
119
|
-
for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {
|
|
120
|
-
meshInstanceTransform(mesh, i, matrix);
|
|
121
|
-
const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);
|
|
122
|
-
if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite))
|
|
123
|
-
continue;
|
|
124
|
-
const index = packed.length++;
|
|
125
|
-
packed.sourceIndices[index] = sourceIndex;
|
|
126
|
-
packed.transforms.set(matrix, index * 16);
|
|
127
|
-
packed.bounds.set(bounds.min, index * 6);
|
|
128
|
-
packed.bounds.set(bounds.max, index * 6 + 3);
|
|
129
|
-
packed.blasIndices[index] = blasIndex;
|
|
130
|
-
packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);
|
|
131
|
-
packed.displacement[index] = displacementScale;
|
|
132
|
-
const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;
|
|
133
|
-
for (let k = 0; k < 3; k++)
|
|
134
|
-
packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return packed;
|
|
138
|
-
}
|
|
139
|
-
const update = ({ mesh, geometry, blasIndex, materialIndices, displacementScale, bvhBounds }) => ({
|
|
140
|
-
bounds: computeBounds(geometry, mesh.transform, bvhBounds),
|
|
141
|
-
blasIndex,
|
|
142
|
-
transform: mesh.transform,
|
|
143
|
-
materialsIndices: materialIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
|
|
144
|
-
displacementScale
|
|
145
|
-
});
|
|
146
|
-
if (!current || !dirtyIndices)
|
|
147
|
-
return bindings.map(update);
|
|
148
|
-
const next = current.slice();
|
|
149
|
-
dirtyIndices.forEach((index) => {
|
|
150
|
-
const binding = bindings[index];
|
|
151
|
-
if (binding)
|
|
152
|
-
next[index] = update(binding);
|
|
153
|
-
});
|
|
154
|
-
return next;
|
|
155
|
-
}
|
|
12
|
+
import { generateVertexTangents } from '../util/geometry.js';
|
|
13
|
+
export { getBvhBounds } from './geometryBvhBounds.js';
|
|
14
|
+
export { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';
|
|
156
15
|
/** Returns the first material used for CPU displacement. */
|
|
157
16
|
export function getMeshDisplacementMaterial(mesh) {
|
|
158
17
|
return mesh.materials[0];
|
|
@@ -186,7 +45,6 @@ export function getDisplacementTextureDataCacheKey(texture) {
|
|
|
186
45
|
image.height
|
|
187
46
|
].join('|');
|
|
188
47
|
}
|
|
189
|
-
const detailedProjectiveRangeTriangleLimit = 100_000;
|
|
190
48
|
const displacementMinmaxCache = new Map();
|
|
191
49
|
export function getPreparedMeshGeometryCacheKey(mesh) {
|
|
192
50
|
const source = mesh.geometry;
|
|
@@ -238,8 +96,6 @@ export function getPreparedMeshGeometry(mesh) {
|
|
|
238
96
|
}
|
|
239
97
|
export function computeMinmaxCPU(_geometry, heightImage) {
|
|
240
98
|
const w = heightImage.width;
|
|
241
|
-
const minmaxData = [];
|
|
242
|
-
const maxMipLevel = Math.log2(w);
|
|
243
99
|
let heightPixels;
|
|
244
100
|
let sourceChannels;
|
|
245
101
|
let normalizeHeight;
|
|
@@ -259,157 +115,17 @@ export function computeMinmaxCPU(_geometry, heightImage) {
|
|
|
259
115
|
throw new Error('The displacement texture is not CPU-readable.');
|
|
260
116
|
canvas.width = w;
|
|
261
117
|
canvas.height = w;
|
|
118
|
+
if (isProceduralSkyImage(heightImage))
|
|
119
|
+
throw new Error('ProceduralSky is only supported as an environment or background.');
|
|
262
120
|
ctx.drawImage(heightImage, 0, 0, w, w);
|
|
263
121
|
heightPixels = ctx.getImageData(0, 0, w, w).data;
|
|
264
122
|
sourceChannels = 4;
|
|
265
123
|
normalizeHeight = (value) => value;
|
|
266
124
|
}
|
|
267
|
-
|
|
268
|
-
for (let lod = 0; lod <= maxMipLevel; lod++) {
|
|
269
|
-
const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];
|
|
270
|
-
const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);
|
|
271
|
-
minmaxData.push(minmax);
|
|
272
|
-
const channels = lod === 0 ? sourceChannels : 2;
|
|
273
|
-
for (let y = 0; y < mipmapSize; y++) {
|
|
274
|
-
for (let x = 0; x < mipmapSize; x++) {
|
|
275
|
-
const yx = y * mipmapSize + x;
|
|
276
|
-
const idx = yx * channels;
|
|
277
|
-
let min = 0;
|
|
278
|
-
let max = 0;
|
|
279
|
-
if (lod == 0) {
|
|
280
|
-
min = normalizeHeight(heightPixels[idx]);
|
|
281
|
-
max = min;
|
|
282
|
-
if (y < mipmapSize - 1 && x < mipmapSize - 1) {
|
|
283
|
-
const h = normalizeHeight(heightPixels[idx + (mipmapSize + 1) * channels]);
|
|
284
|
-
min = Math.min(min, h);
|
|
285
|
-
max = Math.max(max, h);
|
|
286
|
-
}
|
|
287
|
-
if (y < mipmapSize - 1) {
|
|
288
|
-
const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);
|
|
289
|
-
min = Math.min(min, h);
|
|
290
|
-
max = Math.max(max, h);
|
|
291
|
-
}
|
|
292
|
-
if (x < mipmapSize - 1) {
|
|
293
|
-
const h = normalizeHeight(heightPixels[idx + channels]);
|
|
294
|
-
min = Math.min(min, h);
|
|
295
|
-
max = Math.max(max, h);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
const x2 = x * 2;
|
|
300
|
-
const y2 = y * 2;
|
|
301
|
-
const prevMipmapSize = mipmapSize * 2;
|
|
302
|
-
const idx2 = (y2 * prevMipmapSize + x2) * channels;
|
|
303
|
-
const idx2_0 = idx2;
|
|
304
|
-
const idx2_1 = idx2 + channels;
|
|
305
|
-
const idx2_2 = idx2 + prevMipmapSize * channels;
|
|
306
|
-
const idx2_3 = idx2 + prevMipmapSize * channels + channels;
|
|
307
|
-
min = Math.min(prevMinmaxData[idx2_0], prevMinmaxData[idx2_1], prevMinmaxData[idx2_2], prevMinmaxData[idx2_3]);
|
|
308
|
-
max = Math.max(prevMinmaxData[idx2_0 + 1], prevMinmaxData[idx2_1 + 1], prevMinmaxData[idx2_2 + 1], prevMinmaxData[idx2_3 + 1]);
|
|
309
|
-
}
|
|
310
|
-
minmax[yx * 2] = min;
|
|
311
|
-
minmax[yx * 2 + 1] = max;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
mipmapSize = mipmapSize / 2;
|
|
315
|
-
}
|
|
316
|
-
return minmaxData;
|
|
317
|
-
}
|
|
318
|
-
function sphericalProjection(n, uv) {
|
|
319
|
-
const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;
|
|
320
|
-
const phi = Math.acos(n[1]) / Math.PI;
|
|
321
|
-
vec2.set(uv, theta, 1.0 - phi);
|
|
322
|
-
}
|
|
323
|
-
export function sphericalProjectionTriangle(na, nb, nc, uvA, uvB, uvC) {
|
|
324
|
-
sphericalProjection(na, uvA);
|
|
325
|
-
sphericalProjection(nb, uvB);
|
|
326
|
-
sphericalProjection(nc, uvC);
|
|
327
|
-
let onSeam = false;
|
|
328
|
-
for (let i = 0; i < 2; i++) {
|
|
329
|
-
if (Math.abs(uvA[i] - uvB[i]) > 0.5 ||
|
|
330
|
-
Math.abs(uvA[i] - uvC[i]) > 0.5 ||
|
|
331
|
-
Math.abs(uvB[i] - uvC[i]) > 0.5) {
|
|
332
|
-
const maxU = Math.max(uvA[i], uvB[i], uvC[i]);
|
|
333
|
-
if (maxU - uvA[i] > 0.5) {
|
|
334
|
-
uvA[i] += 1.0;
|
|
335
|
-
onSeam = true;
|
|
336
|
-
}
|
|
337
|
-
if (maxU - uvB[i] > 0.5) {
|
|
338
|
-
uvB[i] += 1.0;
|
|
339
|
-
onSeam = true;
|
|
340
|
-
}
|
|
341
|
-
if (maxU - uvC[i] > 0.5) {
|
|
342
|
-
uvC[i] += 1.0;
|
|
343
|
-
onSeam = true;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return onSeam;
|
|
348
|
-
}
|
|
349
|
-
function getMaxAxisIndex(n) {
|
|
350
|
-
const x = Math.abs(n[0]);
|
|
351
|
-
const y = Math.abs(n[1]);
|
|
352
|
-
const z = Math.abs(n[2]);
|
|
353
|
-
return x > y && x > z ? 0 : y > z ? 1 : 2;
|
|
354
|
-
}
|
|
355
|
-
export function triplanarProjectionTriangle(a, b, c, na, nb, nc, uvA, uvB, uvC) {
|
|
356
|
-
const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));
|
|
357
|
-
const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));
|
|
358
|
-
const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));
|
|
359
|
-
if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {
|
|
360
|
-
// yz
|
|
361
|
-
vec2.set(uvA, a[1], a[2]);
|
|
362
|
-
vec2.set(uvB, b[1], b[2]);
|
|
363
|
-
vec2.set(uvC, c[1], c[2]);
|
|
364
|
-
}
|
|
365
|
-
else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {
|
|
366
|
-
// xz
|
|
367
|
-
vec2.set(uvA, a[0], a[2]);
|
|
368
|
-
vec2.set(uvB, b[0], b[2]);
|
|
369
|
-
vec2.set(uvC, c[0], c[2]);
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
// xy
|
|
373
|
-
vec2.set(uvA, a[0], a[1]);
|
|
374
|
-
vec2.set(uvB, b[0], b[1]);
|
|
375
|
-
vec2.set(uvC, c[0], c[1]);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
function findRoots(triAabbMinP, triAabbMaxP, maxDepth, roots) {
|
|
379
|
-
let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);
|
|
380
|
-
let size = Math.max(d[0], d[1]);
|
|
381
|
-
let startMipLevel = maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;
|
|
382
|
-
if (!isFinite(startMipLevel)) {
|
|
383
|
-
startMipLevel = maxDepth;
|
|
384
|
-
}
|
|
385
|
-
startMipLevel = Math.max(startMipLevel, 0);
|
|
386
|
-
let rootCount = 0;
|
|
387
|
-
while (true) {
|
|
388
|
-
const mipSize = Math.pow(2.0, maxDepth - startMipLevel);
|
|
389
|
-
const minTexelX = Math.floor(mipSize * triAabbMinP[0]);
|
|
390
|
-
const minTexelY = Math.floor(mipSize * triAabbMinP[1]);
|
|
391
|
-
const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);
|
|
392
|
-
const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);
|
|
393
|
-
if ((maxTexelX - minTexelX < 2 &&
|
|
394
|
-
maxTexelY - minTexelY < 2 &&
|
|
395
|
-
startMipLevel >= 0) ||
|
|
396
|
-
startMipLevel >= maxDepth) {
|
|
397
|
-
for (let y = minTexelY; y <= maxTexelY; y++) {
|
|
398
|
-
for (let x = minTexelX; x <= maxTexelX; x++) {
|
|
399
|
-
if (rootCount < roots.length) {
|
|
400
|
-
vec3.set(roots[rootCount], Math.floor(x), Math.floor(y), startMipLevel);
|
|
401
|
-
rootCount++;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
break;
|
|
406
|
-
}
|
|
407
|
-
startMipLevel++;
|
|
408
|
-
}
|
|
409
|
-
return rootCount;
|
|
125
|
+
return computeDisplacementMinmax(w, sourceChannels, index => normalizeHeight(heightPixels[index]));
|
|
410
126
|
}
|
|
411
127
|
export function getTrianglesDisplacementRange(geometry, heightTexture, material) {
|
|
412
|
-
const indices = geometry.
|
|
128
|
+
const indices = geometry.indexArray;
|
|
413
129
|
const uvs = geometry.uv?.array;
|
|
414
130
|
const uvProjection = material.displacementUvProjection;
|
|
415
131
|
if (!heightTexture)
|
|
@@ -423,16 +139,10 @@ export function getTrianglesDisplacementRange(geometry, heightTexture, material)
|
|
|
423
139
|
return;
|
|
424
140
|
}
|
|
425
141
|
const triangleCount = indices.length / 3;
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
// retained for smaller meshes where tighter BVH nodes matter more.
|
|
430
|
-
const conservative = new Float32Array(triangleCount * 2);
|
|
431
|
-
for (let triangle = 0; triangle < triangleCount; triangle++) {
|
|
432
|
-
conservative[triangle * 2 + 1] = 1;
|
|
433
|
-
}
|
|
142
|
+
// Dense meshes retain the shared conservative full-height prism path.
|
|
143
|
+
const conservative = conservativeTrianglesDisplacementRange(triangleCount);
|
|
144
|
+
if (conservative)
|
|
434
145
|
return conservative;
|
|
435
|
-
}
|
|
436
146
|
const minmaxCacheKey = getDisplacementTextureDataCacheKey(heightTexture);
|
|
437
147
|
let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);
|
|
438
148
|
if (!minmaxData) {
|
|
@@ -442,127 +152,7 @@ export function getTrianglesDisplacementRange(geometry, heightTexture, material)
|
|
|
442
152
|
}
|
|
443
153
|
displacementMinmaxCache.set(minmaxCacheKey, minmaxData);
|
|
444
154
|
}
|
|
445
|
-
|
|
446
|
-
const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);
|
|
447
|
-
const normal = geometry.normal.array;
|
|
448
|
-
const position = geometry.position.array;
|
|
449
|
-
const uv1 = vec2.create();
|
|
450
|
-
const uv2 = vec2.create();
|
|
451
|
-
const uv3 = vec2.create();
|
|
452
|
-
const p1 = vec3.create();
|
|
453
|
-
const p2 = vec3.create();
|
|
454
|
-
const p3 = vec3.create();
|
|
455
|
-
const n1 = vec3.create();
|
|
456
|
-
const n2 = vec3.create();
|
|
457
|
-
const n3 = vec3.create();
|
|
458
|
-
const isTriplanar = uvProjection === 'triplanar';
|
|
459
|
-
const isSpherical = uvProjection === 'spherical';
|
|
460
|
-
const isCylindrical = uvProjection === 'cylindrical';
|
|
461
|
-
const uvScale = material.displacementUvProjectionScale;
|
|
462
|
-
const minUv = vec2.create();
|
|
463
|
-
const maxUv = vec2.create();
|
|
464
|
-
const roots = [];
|
|
465
|
-
for (let i = 0; i < 100; i++) {
|
|
466
|
-
roots.push([0, 0, 0]);
|
|
467
|
-
}
|
|
468
|
-
for (let i = 0; i < indices.length; i += 3) {
|
|
469
|
-
const i1 = indices[i];
|
|
470
|
-
const i2 = indices[i + 1];
|
|
471
|
-
const i3 = indices[i + 2];
|
|
472
|
-
const i1_2 = i1 * 2;
|
|
473
|
-
const i2_2 = i2 * 2;
|
|
474
|
-
const i3_2 = i3 * 2;
|
|
475
|
-
const i1_3 = i1 * 3;
|
|
476
|
-
const i2_3 = i2 * 3;
|
|
477
|
-
const i3_3 = i3 * 3;
|
|
478
|
-
if (uvs) {
|
|
479
|
-
vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);
|
|
480
|
-
vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);
|
|
481
|
-
vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);
|
|
482
|
-
}
|
|
483
|
-
else {
|
|
484
|
-
vec2.set(uv1, 0, 0);
|
|
485
|
-
vec2.set(uv2, 0, 0);
|
|
486
|
-
vec2.set(uv3, 0, 0);
|
|
487
|
-
}
|
|
488
|
-
let onSeam = false;
|
|
489
|
-
if (isTriplanar || isSpherical || isCylindrical) {
|
|
490
|
-
vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);
|
|
491
|
-
vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);
|
|
492
|
-
vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);
|
|
493
|
-
vec3.normalize(n1, n1);
|
|
494
|
-
vec3.normalize(n2, n2);
|
|
495
|
-
vec3.normalize(n3, n3);
|
|
496
|
-
if (isTriplanar || isSpherical || isCylindrical) {
|
|
497
|
-
vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);
|
|
498
|
-
vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);
|
|
499
|
-
vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);
|
|
500
|
-
}
|
|
501
|
-
if (isTriplanar) {
|
|
502
|
-
// Is on the seam. Needs full prism to avoid empty seams.
|
|
503
|
-
const xMaxIndex = getMaxAxisIndex(n1);
|
|
504
|
-
const yMaxIndex = getMaxAxisIndex(n2);
|
|
505
|
-
const zMaxIndex = getMaxAxisIndex(n3);
|
|
506
|
-
if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {
|
|
507
|
-
onSeam = true;
|
|
508
|
-
}
|
|
509
|
-
/* prettier-ignore */
|
|
510
|
-
triplanarProjectionTriangle(p1, p2, p3, n1, n2, n3, uv1, uv2, uv3);
|
|
511
|
-
}
|
|
512
|
-
else if (isSpherical) {
|
|
513
|
-
vec3.normalize(p1, p1);
|
|
514
|
-
vec3.normalize(p2, p2);
|
|
515
|
-
vec3.normalize(p3, p3);
|
|
516
|
-
onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);
|
|
517
|
-
}
|
|
518
|
-
else {
|
|
519
|
-
const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;
|
|
520
|
-
const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;
|
|
521
|
-
const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;
|
|
522
|
-
vec2.set(uv1, u1, p1[1]);
|
|
523
|
-
vec2.set(uv2, u2, p2[1]);
|
|
524
|
-
vec2.set(uv3, u3, p3[1]);
|
|
525
|
-
onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
vec2.scale(uv1, uv1, uvScale);
|
|
529
|
-
vec2.scale(uv2, uv2, uvScale);
|
|
530
|
-
vec2.scale(uv3, uv3, uvScale);
|
|
531
|
-
// TODO PDM don't have zero area triangle issue.
|
|
532
|
-
let minHeight = Infinity;
|
|
533
|
-
let maxHeight = -Infinity;
|
|
534
|
-
if (onSeam) {
|
|
535
|
-
minHeight = 0.0;
|
|
536
|
-
maxHeight = 255.0;
|
|
537
|
-
}
|
|
538
|
-
else {
|
|
539
|
-
vec2.copy(maxUv, uv1);
|
|
540
|
-
vec2.copy(minUv, uv1);
|
|
541
|
-
vec2.min(minUv, minUv, uv2);
|
|
542
|
-
vec2.min(minUv, minUv, uv3);
|
|
543
|
-
vec2.max(maxUv, maxUv, uv2);
|
|
544
|
-
vec2.max(maxUv, maxUv, uv3);
|
|
545
|
-
const rootCount = findRoots(minUv, maxUv, maxDepth, roots);
|
|
546
|
-
for (let k = 0; k < rootCount; k++) {
|
|
547
|
-
const mipLevel = roots[k][2];
|
|
548
|
-
const mipSize = Math.pow(2, maxDepth - mipLevel);
|
|
549
|
-
const minmax = minmaxData[mipLevel];
|
|
550
|
-
const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;
|
|
551
|
-
let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;
|
|
552
|
-
if (isFlipY) {
|
|
553
|
-
y = mipSize - y - 1;
|
|
554
|
-
}
|
|
555
|
-
const idx = (y * mipSize + x) * 2;
|
|
556
|
-
minHeight = Math.min(minHeight, minmax[idx]);
|
|
557
|
-
maxHeight = Math.max(maxHeight, minmax[idx + 1]);
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
// TODO this will cause flat surface optimization fail.
|
|
561
|
-
// But not adding bias will leads to small gap between flat surface and displaced surface.
|
|
562
|
-
trianglesDisplacementRange[(i / 3) * 2] = Math.max((Math.floor(minHeight) - 4) / 255, 0);
|
|
563
|
-
trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min((Math.ceil(maxHeight) + 4) / 255, 1);
|
|
564
|
-
}
|
|
565
|
-
return trianglesDisplacementRange;
|
|
155
|
+
return computeTrianglesDisplacementRange(geometry, minmaxData, heightImage.width, isFlipY, material);
|
|
566
156
|
}
|
|
567
157
|
const warnedDirectionGeometry = new WeakSet();
|
|
568
158
|
/** Prepare auto-generated source attributes before the renderer captures array identities. */
|
|
@@ -600,21 +190,7 @@ export function getMeshBlasInput(mesh) {
|
|
|
600
190
|
// attributes for texture coordinates and shading. This same input works for
|
|
601
191
|
// built-in, TinyBVH and Worker builds; the shader offsets its base identically.
|
|
602
192
|
const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;
|
|
603
|
-
|
|
604
|
-
const positions = geometry.position.array.slice();
|
|
605
|
-
const normals = geometry.normal.array;
|
|
606
|
-
for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {
|
|
607
|
-
const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;
|
|
608
|
-
const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);
|
|
609
|
-
if (length > 0) {
|
|
610
|
-
for (let axis = 0; axis < 3; axis++)
|
|
611
|
-
positions[p + axis] += normals[n + axis] / length * bias;
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
return { geometry: new Geometry({ ...geometry, position: new Attribute(positions, geometry.position.itemSize) }),
|
|
615
|
-
displacementScale, trianglesDisplacement };
|
|
616
|
-
}
|
|
617
|
-
return { geometry, displacementScale, trianglesDisplacement };
|
|
193
|
+
return { geometry: displacementBaseGeometry(geometry, bias), displacementScale, trianglesDisplacement };
|
|
618
194
|
}
|
|
619
195
|
/** Whether a static mesh still needs a BLAS before it can be rendered. */
|
|
620
196
|
export function meshNeedsStaticBvh(mesh, config) {
|
|
@@ -656,210 +232,13 @@ function prepareMeshGeometryBvh(mesh, displacement = true) {
|
|
|
656
232
|
return { geometry, displacementScale };
|
|
657
233
|
}
|
|
658
234
|
export function updateMeshInstances(meshes, options = {}) {
|
|
659
|
-
|
|
660
|
-
const geometryIndexMap = new Map();
|
|
661
|
-
const geometries = [];
|
|
662
|
-
const materials = [];
|
|
663
|
-
const globalMaterialIndicesMap = [];
|
|
664
|
-
const emissiveBindings = [];
|
|
665
|
-
const instanceBindings = [];
|
|
666
|
-
const instances = meshes
|
|
667
|
-
.filter((mesh) => mesh.geometry.position?.array.length > 0)
|
|
668
|
-
.map((mesh) => {
|
|
669
|
-
let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh, options.displacement !== false);
|
|
670
|
-
const bvhBounds = getBvhBounds(geometry);
|
|
671
|
-
const bounds = computeBounds(geometry, mesh.transform, bvhBounds);
|
|
672
|
-
let geoIdx = geometryIndexMap.get(geometry);
|
|
673
|
-
const materialsIndices = mesh.materials.map((material) => {
|
|
674
|
-
const key = material;
|
|
675
|
-
if (!materialIndexMap.has(key)) {
|
|
676
|
-
materialIndexMap.set(key, materials.length);
|
|
677
|
-
materials.push(material);
|
|
678
|
-
}
|
|
679
|
-
return materialIndexMap.get(key);
|
|
680
|
-
});
|
|
681
|
-
// Explicit vertex indices are global after merging. Batches with a
|
|
682
|
-
// different material table need their own vertex region, even when the
|
|
683
|
-
// table contains just one material. Equal tables can share the region.
|
|
684
|
-
if (geoIdx != null && geometry.materialIndex &&
|
|
685
|
-
(materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||
|
|
686
|
-
materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx][i]))) {
|
|
687
|
-
const bvh = getGeometryBvh(geometry);
|
|
688
|
-
geometry = new Geometry(geometry);
|
|
689
|
-
setGeometryBvh(geometry, bvh);
|
|
690
|
-
geoIdx = undefined;
|
|
691
|
-
}
|
|
692
|
-
if (geoIdx == null) {
|
|
693
|
-
geoIdx = geometries.length;
|
|
694
|
-
geometryIndexMap.set(geometry, geometries.length);
|
|
695
|
-
geometries.push(geometry);
|
|
696
|
-
// Same number with geometries.
|
|
697
|
-
globalMaterialIndicesMap.push(materialsIndices);
|
|
698
|
-
}
|
|
699
|
-
const instance = {
|
|
700
|
-
bounds,
|
|
701
|
-
blasIndex: geoIdx,
|
|
702
|
-
transform: mesh.transform,
|
|
703
|
-
materialsIndices: materialsIndices.map((idx) => packMaterialIndexAndWeightToInt(idx, 1)),
|
|
704
|
-
displacementScale
|
|
705
|
-
};
|
|
706
|
-
if (!(mesh instanceof InstancedMesh) && (!bounds.min.every(isFinite) ||
|
|
707
|
-
!bounds.max.every(isFinite) ||
|
|
708
|
-
!mesh.transform.every(isFinite))) {
|
|
709
|
-
return undefined;
|
|
710
|
-
}
|
|
711
|
-
if (mesh.materials.some((material) => !material.unlit && !material.shadowCatcher &&
|
|
712
|
-
colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8)) {
|
|
713
|
-
emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });
|
|
714
|
-
}
|
|
715
|
-
instanceBindings.push({
|
|
716
|
-
mesh,
|
|
717
|
-
geometry,
|
|
718
|
-
blasIndex: geoIdx,
|
|
719
|
-
materialIndices: materialsIndices,
|
|
720
|
-
displacementScale,
|
|
721
|
-
bvhBounds
|
|
722
|
-
});
|
|
723
|
-
return instance;
|
|
724
|
-
})
|
|
725
|
-
.filter((instance) => instance != null);
|
|
726
|
-
const geometryRegions = new Map();
|
|
727
|
-
const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);
|
|
728
|
-
return {
|
|
729
|
-
geometry,
|
|
730
|
-
geometries,
|
|
731
|
-
geometryRegions,
|
|
732
|
-
geometryStates: new Map(instanceBindings.map(binding => {
|
|
733
|
-
const source = binding.mesh.geometry;
|
|
734
|
-
return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,
|
|
735
|
-
indexCount: source.indices.array.length }];
|
|
736
|
-
})),
|
|
737
|
-
instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,
|
|
738
|
-
materials,
|
|
739
|
-
instanceBindings,
|
|
740
|
-
emissiveBindings,
|
|
741
|
-
blases: geometries.map((geo) => ({
|
|
742
|
-
bvh: getGeometryBvh(geo),
|
|
743
|
-
verticesCount: geo.vertexCount,
|
|
744
|
-
trainglesCount: geo.indices.array.length / 3
|
|
745
|
-
}))
|
|
746
|
-
};
|
|
747
|
-
}
|
|
748
|
-
function mergeGeometry(geometries, globalMaterialIndicesMap, regions) {
|
|
749
|
-
const totalVertexCount = geometries.reduce((sum, geo) => sum + geo.vertexCount, 0);
|
|
750
|
-
const totalIndexCount = geometries.reduce((sum, geo) => sum + geo.indices.array.length, 0);
|
|
751
|
-
const positionAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
752
|
-
const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);
|
|
753
|
-
const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
754
|
-
const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);
|
|
755
|
-
const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);
|
|
756
|
-
const materialIndexAttrib = new Attribute(new Int32Array(4 * totalVertexCount), 4);
|
|
757
|
-
const hasColor = geometries.some((geo) => geo.color);
|
|
758
|
-
const hasTangent = geometries.some((geo) => geo.tangent);
|
|
759
|
-
const mergedGeometry = new Geometry({
|
|
760
|
-
position: positionAttrib,
|
|
761
|
-
normal: normalAttrib,
|
|
762
|
-
uv: uvAttrib,
|
|
763
|
-
uv1: uv1Attrib,
|
|
764
|
-
materialIndex: materialIndexAttrib,
|
|
765
|
-
color: hasColor
|
|
766
|
-
? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)
|
|
767
|
-
: undefined,
|
|
768
|
-
tangent: hasTangent
|
|
769
|
-
? new Attribute(new Float32Array(4 * totalVertexCount), 4)
|
|
770
|
-
: undefined,
|
|
771
|
-
indices: indexAttrib
|
|
772
|
-
});
|
|
773
|
-
let currentVertex = 0;
|
|
774
|
-
let currentIndex = 0;
|
|
775
|
-
geometries.forEach((geometry, idx) => {
|
|
776
|
-
const vertexCount = geometry.vertexCount;
|
|
777
|
-
const globalMaterialIndex = globalMaterialIndicesMap[idx];
|
|
778
|
-
regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });
|
|
779
|
-
positionAttrib.array.set(geometry.position.array, currentVertex * 3);
|
|
780
|
-
normalAttrib.array.set(geometry.normal.array, currentVertex * 3);
|
|
781
|
-
if (geometry.uv) {
|
|
782
|
-
uvAttrib.array.set(geometry.uv.array, currentVertex * 2);
|
|
783
|
-
}
|
|
784
|
-
uv1Attrib.array.set((geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2), currentVertex * 2);
|
|
785
|
-
if (geometry.color) {
|
|
786
|
-
mergedGeometry.color.array.set(geometry.color.array, currentVertex * 3);
|
|
787
|
-
}
|
|
788
|
-
if (geometry.tangent) {
|
|
789
|
-
const source = geometry.tangent;
|
|
790
|
-
for (let v = 0; v < vertexCount; v++) {
|
|
791
|
-
for (let c = 0; c < 4; c++)
|
|
792
|
-
mergedGeometry.tangent.array[(currentVertex + v) * 4 + c] =
|
|
793
|
-
c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);
|
|
797
|
-
const meshIndices = geometry.indices.array;
|
|
798
|
-
for (let i = 0; i < meshIndices.length; i++) {
|
|
799
|
-
indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];
|
|
800
|
-
}
|
|
801
|
-
currentVertex += vertexCount;
|
|
802
|
-
currentIndex += meshIndices.length;
|
|
803
|
-
});
|
|
804
|
-
return mergedGeometry;
|
|
805
|
-
}
|
|
806
|
-
function computeGeometryNormals(geometry) {
|
|
807
|
-
const indices = geometry.indices;
|
|
808
|
-
const positions = geometry.position.array;
|
|
809
|
-
geometry.normal = new Attribute(new Float32Array(positions.length), 3);
|
|
810
|
-
const normals = geometry.normal.array;
|
|
811
|
-
const p1 = vec3.create();
|
|
812
|
-
const p2 = vec3.create();
|
|
813
|
-
const p3 = vec3.create();
|
|
814
|
-
const v21 = vec3.create();
|
|
815
|
-
const v32 = vec3.create();
|
|
816
|
-
const n = vec3.create();
|
|
817
|
-
const len = indices
|
|
818
|
-
? indices.array.length
|
|
819
|
-
: geometry.vertexCount;
|
|
820
|
-
let i1, i2, i3;
|
|
821
|
-
for (let f = 0; f < len;) {
|
|
822
|
-
if (indices) {
|
|
823
|
-
i1 = indices.array[f++];
|
|
824
|
-
i2 = indices.array[f++];
|
|
825
|
-
i3 = indices.array[f++];
|
|
826
|
-
}
|
|
827
|
-
else {
|
|
828
|
-
i1 = f++;
|
|
829
|
-
i2 = f++;
|
|
830
|
-
i3 = f++;
|
|
831
|
-
}
|
|
832
|
-
vec3.set(p1, positions[i1 * 3], positions[i1 * 3 + 1], positions[i1 * 3 + 2]);
|
|
833
|
-
vec3.set(p2, positions[i2 * 3], positions[i2 * 3 + 1], positions[i2 * 3 + 2]);
|
|
834
|
-
vec3.set(p3, positions[i3 * 3], positions[i3 * 3 + 1], positions[i3 * 3 + 2]);
|
|
835
|
-
vec3.sub(v21, p1, p2);
|
|
836
|
-
vec3.sub(v32, p2, p3);
|
|
837
|
-
vec3.cross(n, v21, v32);
|
|
838
|
-
// Already be weighted by the triangle area
|
|
839
|
-
for (let i = 0; i < 3; i++) {
|
|
840
|
-
normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];
|
|
841
|
-
normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];
|
|
842
|
-
normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
for (let i = 0; i < normals.length;) {
|
|
846
|
-
vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);
|
|
847
|
-
vec3.normalize(n, n);
|
|
848
|
-
normals[i++] = n[0];
|
|
849
|
-
normals[i++] = n[1];
|
|
850
|
-
normals[i++] = n[2];
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
/** Batch records are regenerated together; refit all numeric source slots. */
|
|
854
|
-
export function dirtyMeshInstanceIndices(bindings, meshes, instances) {
|
|
855
|
-
if (instances instanceof PackedMeshInstances)
|
|
856
|
-
return new Set(Array.from({ length: instances.length }, (_, i) => i));
|
|
857
|
-
return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));
|
|
235
|
+
return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false));
|
|
858
236
|
}
|
|
237
|
+
export { dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices } from './scenePreparation.js';
|
|
859
238
|
/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */
|
|
860
239
|
export function updateMeshInstanceColors(bindings, instances, meshes) {
|
|
861
240
|
const dirty = new Set();
|
|
862
|
-
if (
|
|
241
|
+
if (Array.isArray(instances))
|
|
863
242
|
return dirty;
|
|
864
243
|
let sourceStart = 0, packedIndex = 0;
|
|
865
244
|
for (const { mesh } of bindings) {
|