@meimu/mutracer 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +7 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +10421 -8363
- package/docs/api.md +202 -11
- package/docs/denoising.md +30 -15
- package/docs/materials.md +18 -27
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +32 -1
- package/docs/threejs.md +19 -10
- package/docs/updates.md +44 -2
- package/docs/viewer.md +41 -3
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +27 -6
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +52 -25
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +44 -9
- package/lib/Render.js +115 -17
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -1
- package/lib/RenderLoop.js +94 -13
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +10 -0
- package/lib/renderer/GPUTraceQueue.js +31 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +32 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPURayTraceOutput.js +26 -17
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +36 -40
- package/lib/renderer/WGPURayTracePass.js +399 -548
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +239 -60
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
- package/lib/renderer/WebGLFullQuadPass.js +18 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
- package/lib/renderer/WebGLRayTracePass.js +83 -7
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +116 -8
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +5 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +191 -191
- package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +20 -17
- package/lib/renderer/lightSampling.js +123 -56
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +3 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +3 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +31 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +7 -169
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +25 -3
- package/lib/settings/render.js +3 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +18 -5
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +4 -0
- package/package.json +31 -5
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envMapCreation.js","sourceRoot":"","sources":["../../src/renderer/envMapCreation.ts"],"names":[],"mappings":"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","sourcesContent":["// 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\n// Convert image data from the RGBE format to a 32-bit floating point format\n// See https://www.cg.tuwien.ac.at/research/theses/matkovic/node84.html for a description of the RGBE format\n\nimport { ColorRGBA, WritableArrayLike } from '../types.js';\nimport Texture, {\n isTextureDataSource,\n TextureDataSource\n} from '../scene/Texture.js';\nimport AmbientLight from '../scene/AmbientLight.js';\nimport EnvironmentLight from '../scene/EnvironmentLight.js';\nimport { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport type { EnvironmentMapSource } from './envMapDistribution.js';\n\n/** Rotation only: translation does not affect a light at infinity. */\nexport function environmentRotation(lights: readonly SceneLight[]): Float32Array {\n const matrix = new Float32Array([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n const light = lights.find(light => light.type === 'EnvironmentLight');\n if (light?.type === 'EnvironmentLight') {\n for (let column = 0; column < 3; column++) {\n const offset = column * 4;\n const length = Math.hypot(light.transform[offset], light.transform[offset+1], light.transform[offset+2]);\n if (length > 0) for (let row = 0; row < 3; row++) matrix[offset+row] = light.transform[offset+row] / length;\n }\n }\n return matrix;\n}\n\n/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */\nexport function backgroundMapTransform(background?: SceneBackground): Float32Array {\n const grounded = background && !Array.isArray(background) && 'type' in background && background.type === 'GroundedSkybox' ? background : undefined;\n const angle = grounded?.rotation ?? 0;\n return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0, grounded?.intensity ?? 1), 0]);\n}\n\nconst backgroundImages = new WeakMap<Texture, {image: Texture['image']; version: number; result: EnvironmentMapSource}>();\n\nconst DEFAULT_MAP_RESOLUTION = {\n width: 8,\n height: 4\n};\n\n// Tools for generating and modify env maps for lighting from scene component data\n\nexport function generateBackgroundMapFromSceneBackground(\n background: SceneBackground\n) {\n let backgroundImage;\n\n // Is [r,g,b,a] color\n if (Array.isArray(background)) {\n backgroundImage = generateSolidMap(1, 1, background);\n } else {\n const texture: Texture =\n 'map' in background ? background.map : (background as Texture);\n if (!isTextureDataSource(texture.image)) return;\n // Is rgbe data\n const cached = backgroundImages.get(texture);\n if (cached?.image === texture.image && cached.version === texture.version) return cached.result;\n backgroundImage = {width: texture.image.width, height: texture.image.height, data: texture.image.data};\n backgroundImages.set(texture, {image:texture.image, version:texture.version, result:backgroundImage});\n }\n return backgroundImage;\n}\n\nexport function generateEnvMapFromSceneComponents(\n ambientLights: AmbientLight[],\n environmentLights: EnvironmentLight[]\n) {\n let envImage = initializeEnvMap(environmentLights);\n if (ambientLights.length > 0 && environmentLights.length > 0) {\n envImage = {\n width: envImage.width,\n height: envImage.height,\n data: envImage.data.slice() as TextureDataSource['data']\n };\n }\n ambientLights.forEach((light) => {\n addAmbientLightToEnvMap(light, envImage);\n });\n\n return envImage;\n}\n\nconst scaledEnvironments = new WeakMap<EnvironmentLight, {\n data: TextureDataSource['data']; width: number; height: number; version: number;\n intensity: number; image: EnvironmentMapSource;\n}>();\n\nexport function initializeEnvMap(environmentLights: EnvironmentLight[]) {\n let envImage: EnvironmentMapSource;\n\n // Initialize map from environment light if present\n if (environmentLights.length > 0) {\n // TODO: support multiple environment lights (what if they have different resolutions?)\n const environmentLight = environmentLights[0];\n envImage = {\n width: environmentLight.map.image.width,\n height: environmentLight.map.image.height,\n data: (environmentLight.map.image as TextureDataSource).data,\n distributionCacheKey:\n environmentLight.map.source ??\n (environmentLight.map.image as TextureDataSource).data,\n distributionCacheVersion: environmentLight.map.version\n };\n const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n if (intensity !== 1 || !(envImage.data instanceof Float32Array)) {\n const previous = scaledEnvironments.get(environmentLight);\n if (previous && previous.data === envImage.data && previous.width === envImage.width &&\n previous.height === envImage.height && previous.version === environmentLight.map.version && previous.intensity === intensity) {\n return previous.image;\n }\n const scale = envImage.data instanceof Uint8Array || envImage.data instanceof Uint8ClampedArray ? 1 / 255 : 1;\n const data = Float32Array.from(envImage.data, (value, index) => value * scale * (index % 4 === 3 ? 1 : intensity));\n const image = {width: envImage.width, height: envImage.height, data};\n scaledEnvironments.set(environmentLight, {data: envImage.data, width: envImage.width, height: envImage.height,\n version: environmentLight.map.version, intensity, image});\n envImage = image;\n }\n } else {\n // initialize blank map\n envImage = generateSolidMap(\n DEFAULT_MAP_RESOLUTION.width,\n DEFAULT_MAP_RESOLUTION.height,\n [0, 0, 0, 1]\n );\n }\n\n return envImage;\n}\n\nexport function generateSolidMap(\n width: number,\n height: number,\n color?: ColorRGBA,\n intensity?: number\n): TextureDataSource {\n const texels = width * height;\n const floatBuffer = new Float32Array(texels * 4);\n if (color && Array.isArray(color)) {\n setBufferToColor(floatBuffer, color, intensity);\n }\n return {\n width: width,\n height: height,\n data: floatBuffer\n };\n}\n\nfunction setBufferToColor(\n buffer: WritableArrayLike<number>,\n color: ColorRGBA,\n intensity = 1\n) {\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] = color[0] * intensity;\n buffer[i++] = color[1] * intensity;\n buffer[i++] = color[2] * intensity;\n buffer[i++] = color[3];\n }\n\n return buffer;\n}\n\nfunction addAmbientLightToEnvMap(\n light: AmbientLight,\n image: TextureDataSource\n) {\n const color = light.color;\n const intensity = light.intensity;\n const buffer = image.data;\n\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] += color[0] * intensity;\n buffer[i++] += color[1] * intensity;\n buffer[i++] += color[2] * intensity;\n i++;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"envMapCreation.js","sourceRoot":"","sources":["../../src/renderer/envMapCreation.ts"],"names":[],"mappings":"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","sourcesContent":["// 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\n// Convert image data from the RGBE format to a 32-bit floating point format\n// See https://www.cg.tuwien.ac.at/research/theses/matkovic/node84.html for a description of the RGBE format\n\nimport type { ColorRGBA, Mat4, WritableArrayLike } from '../types.js';\nimport Texture, {\n isTextureDataSource,\n type TextureDataSource\n} from '../scene/Texture.js';\nimport AmbientLight from '../scene/AmbientLight.js';\nimport EnvironmentLight from '../scene/EnvironmentLight.js';\nimport type { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isProceduralSkyImage } from '../scene/skyParameters.js';\nimport type { EnvironmentSource, EnvironmentMapSource, ProceduralEnvironmentSource } from './envMapDistribution.js';\n\n/** Rotation only: translation does not affect a light at infinity. */\nfunction mapRotation(transform?: Mat4): Float32Array {\n const matrix = new Float32Array([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n if (transform) {\n for (let column = 0; column < 3; column++) {\n const offset = column * 4;\n const length = Math.hypot(transform[offset], transform[offset+1], transform[offset+2]);\n if (length > 0) for (let row = 0; row < 3; row++) matrix[offset+row] = transform[offset+row] / length;\n }\n }\n return matrix;\n}\n\nexport function environmentRotation(lights: readonly SceneLight[]): Float32Array {\n const light = lights.find(light => light.type === 'EnvironmentLight');\n return mapRotation(light?.type === 'EnvironmentLight' ? light.transform : undefined);\n}\n\n/** Map-to-world orientation for explicit equirect backgrounds; grounded yaw is packed separately. */\nexport function backgroundMapRotation(background?: SceneBackground): Float32Array {\n return mapRotation(background && !Array.isArray(background) && 'type' in background && background.type === 'Equirect'\n ? background.transform : undefined);\n}\n\n/** Cosine/sine of inverse-lookup yaw and radiance scale; independent of lighting. */\nexport function backgroundMapTransform(background?: SceneBackground): Float32Array {\n const described = background && !Array.isArray(background) && 'type' in background ? background : undefined;\n const angle = described?.type === 'GroundedSkybox' ? described.rotation ?? 0 : 0;\n return new Float32Array([Math.cos(angle), Math.sin(angle), Math.max(0, described?.intensity ?? 1), 0]);\n}\n\nconst backgroundImages = new WeakMap<Texture, {image: Texture['image']; version: number; result: EnvironmentSource}>();\n\nconst DEFAULT_MAP_RESOLUTION = {\n width: 8,\n height: 4\n};\n\n// Tools for generating and modify env maps for lighting from scene component data\n\nexport function generateBackgroundMapFromSceneBackground(\n background: SceneBackground\n) {\n let backgroundImage;\n\n // Is [r,g,b,a] color\n if (Array.isArray(background)) {\n backgroundImage = generateSolidMap(1, 1, background);\n } else {\n const texture: Texture =\n 'map' in background ? background.map : (background as Texture);\n const cached = backgroundImages.get(texture);\n if (cached?.image === texture.image && cached.version === texture.version) return cached.result;\n if (isProceduralSkyImage(texture.image)) backgroundImage = skySource(texture.image, 1);\n else if (isTextureDataSource(texture.image)) backgroundImage = {width: texture.image.width, height: texture.image.height, data: texture.image.data};\n else return;\n backgroundImages.set(texture, {image:texture.image, version:texture.version, result:backgroundImage});\n }\n return backgroundImage;\n}\n\nexport function generateEnvMapFromSceneComponents(\n ambientLights: AmbientLight[],\n environmentLights: EnvironmentLight[]\n) {\n let envImage = initializeEnvMap(environmentLights);\n if ('sky' in envImage) {\n for (const light of ambientLights) for (let c = 0; c < 3; c++) envImage.ambient[c] += light.color[c] * light.intensity;\n return envImage;\n }\n if (ambientLights.length > 0 && environmentLights.length > 0) {\n envImage = {\n width: envImage.width,\n height: envImage.height,\n data: envImage.data.slice() as TextureDataSource['data']\n };\n }\n ambientLights.forEach((light) => {\n addAmbientLightToEnvMap(light, envImage);\n });\n\n return envImage;\n}\n\nconst scaledEnvironments = new WeakMap<EnvironmentLight, {\n data: TextureDataSource['data']; width: number; height: number; version: number;\n intensity: number; image: EnvironmentMapSource;\n}>();\n\nexport function initializeEnvMap(environmentLights: EnvironmentLight[]): EnvironmentSource {\n let envImage: EnvironmentMapSource;\n\n // Initialize map from environment light if present\n if (environmentLights.length > 0) {\n // TODO: support multiple environment lights (what if they have different resolutions?)\n const environmentLight = environmentLights[0];\n if (isProceduralSkyImage(environmentLight.map.image)) {\n const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n return skySource(environmentLight.map.image, intensity);\n }\n envImage = {\n width: environmentLight.map.image.width,\n height: environmentLight.map.image.height,\n data: (environmentLight.map.image as TextureDataSource).data,\n distributionCacheKey:\n environmentLight.map.source ??\n (environmentLight.map.image as TextureDataSource).data,\n distributionCacheVersion: environmentLight.map.version\n };\n const intensity = Number.isFinite(environmentLight.intensity) ? Math.max(0, environmentLight.intensity) : 1;\n if (intensity !== 1 || !(envImage.data instanceof Float32Array)) {\n const previous = scaledEnvironments.get(environmentLight);\n if (previous && previous.data === envImage.data && previous.width === envImage.width &&\n previous.height === envImage.height && previous.version === environmentLight.map.version && previous.intensity === intensity) {\n return previous.image;\n }\n const scale = envImage.data instanceof Uint8Array || envImage.data instanceof Uint8ClampedArray ? 1 / 255 : 1;\n const data = Float32Array.from(envImage.data, (value, index) => value * scale * (index % 4 === 3 ? 1 : intensity));\n const image = {width: envImage.width, height: envImage.height, data};\n scaledEnvironments.set(environmentLight, {data: envImage.data, width: envImage.width, height: envImage.height,\n version: environmentLight.map.version, intensity, image});\n envImage = image;\n }\n } else {\n // initialize blank map\n envImage = generateSolidMap(\n DEFAULT_MAP_RESOLUTION.width,\n DEFAULT_MAP_RESOLUTION.height,\n [0, 0, 0, 1]\n );\n }\n\n return envImage;\n}\n\nexport function generateSolidMap(\n width: number,\n height: number,\n color?: ColorRGBA,\n intensity?: number\n): TextureDataSource {\n const texels = width * height;\n const floatBuffer = new Float32Array(texels * 4);\n if (color && Array.isArray(color)) {\n setBufferToColor(floatBuffer, color, intensity);\n }\n return {\n width: width,\n height: height,\n data: floatBuffer\n };\n}\n\nfunction setBufferToColor(\n buffer: WritableArrayLike<number>,\n color: ColorRGBA,\n intensity = 1\n) {\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] = color[0] * intensity;\n buffer[i++] = color[1] * intensity;\n buffer[i++] = color[2] * intensity;\n buffer[i++] = color[3];\n }\n\n return buffer;\n}\n\nfunction addAmbientLightToEnvMap(\n light: AmbientLight,\n image: TextureDataSource\n) {\n const color = light.color;\n const intensity = light.intensity;\n const buffer = image.data;\n\n for (let i = 0; i < buffer.length; ) {\n buffer[i++] += color[0] * intensity;\n buffer[i++] += color[1] * intensity;\n buffer[i++] += color[2] * intensity;\n i++;\n }\n}\n\nfunction skySource(sky: import('../scene/skyParameters.js').ProceduralSkyImage, intensity: number): ProceduralEnvironmentSource {\n return { sky, width: sky.width, height: sky.height, intensity, ambient: [0, 0, 0] };\n}\n"]}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ProceduralSkyImage } from '../scene/skyParameters.js';
|
|
2
|
+
import type { TextureDataSource } from '../scene/textureData.js';
|
|
2
3
|
export interface EnvironmentMapSource extends TextureDataSource {
|
|
3
4
|
/** Stable identity shared by adapters that recreate source wrappers. */
|
|
4
5
|
distributionCacheKey?: object;
|
|
5
6
|
/** Incremented whenever the source pixels change in place. */
|
|
6
7
|
distributionCacheVersion?: number;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
+
/** GPU-generated radiance, including the scene's linear intensity and ambient fill. */
|
|
10
|
+
export interface ProceduralEnvironmentSource {
|
|
11
|
+
sky: ProceduralSkyImage;
|
|
12
|
+
width: number;
|
|
13
|
+
height: number;
|
|
14
|
+
intensity: number;
|
|
15
|
+
ambient: [number, number, number];
|
|
16
|
+
}
|
|
17
|
+
export type EnvironmentSource = EnvironmentMapSource | ProceduralEnvironmentSource;
|
|
18
|
+
export declare function environmentMapSourcesMatch(first: EnvironmentSource | undefined, second: EnvironmentSource | undefined): boolean;
|
|
9
19
|
export declare function envMapDistribution(image: EnvironmentMapSource): TextureDataSource;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
// (https://github.com/hoverinc/ray-tracing-renderer).
|
|
3
|
-
// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
|
|
1
|
+
import { pixelLength, pixelValue } from '../scene/texturePixels.js';
|
|
4
2
|
const distributionCache = new WeakMap();
|
|
5
3
|
function distributionCacheIdentity(image) {
|
|
6
|
-
return image.distributionCacheKey ?? image.data;
|
|
4
|
+
return 'sky' in image ? image : image.distributionCacheKey ?? image.data;
|
|
7
5
|
}
|
|
8
6
|
export function environmentMapSourcesMatch(first, second) {
|
|
9
7
|
if (first === second)
|
|
@@ -13,8 +11,8 @@ export function environmentMapSourcesMatch(first, second) {
|
|
|
13
11
|
return (distributionCacheIdentity(first) === distributionCacheIdentity(second) &&
|
|
14
12
|
first.width === second.width &&
|
|
15
13
|
first.height === second.height &&
|
|
16
|
-
(first.distributionCacheVersion ?? 0) ===
|
|
17
|
-
(second.distributionCacheVersion ?? 0));
|
|
14
|
+
('sky' in first ? 0 : first.distributionCacheVersion ?? 0) ===
|
|
15
|
+
('sky' in second ? 0 : second.distributionCacheVersion ?? 0));
|
|
18
16
|
}
|
|
19
17
|
export function envMapDistribution(image) {
|
|
20
18
|
const cacheKey = distributionCacheIdentity(image);
|
|
@@ -27,43 +25,31 @@ export function envMapDistribution(image) {
|
|
|
27
25
|
return cached.distribution;
|
|
28
26
|
}
|
|
29
27
|
const data = image.data;
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const cdf = makeTextureArray(cdfImage.width, cdfImage.height, 2);
|
|
35
|
-
const channels = Math.max(Math.floor(data.length / (image.width * image.height)), 1);
|
|
36
|
-
const sourceScale = (data instanceof Uint8Array || data instanceof Uint8ClampedArray) ? 1 / 255 : 1;
|
|
37
|
-
const luminance = new Float32Array(image.width * image.height);
|
|
38
|
-
for (let y = 0; y < image.height; y++) {
|
|
39
|
-
for (let x = 0; x < image.width; x++) {
|
|
40
|
-
const sourceIndex = channels * (y * image.width + x);
|
|
41
|
-
luminance[y * image.width + x] =
|
|
42
|
-
sourceScale * (0.2126 * data[sourceIndex]
|
|
43
|
-
+ 0.7152 * data[sourceIndex + Math.min(1, channels - 1)]
|
|
44
|
-
+ 0.0722 * data[sourceIndex + Math.min(2, channels - 1)]);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
28
|
+
const width = image.width + 2, height = image.height + 1;
|
|
29
|
+
const cdf = makeTextureArray(width, height, 2);
|
|
30
|
+
const cdfImage = { width, height, data: cdf.array };
|
|
31
|
+
const luminance = environmentLuminance(data, image.width, image.height);
|
|
47
32
|
// Environment radiance is read with bilinear filtering while the CDF is
|
|
48
33
|
// piecewise constant. Dilating luminance over the filter footprint keeps a
|
|
49
34
|
// sharp HDR sun from leaking into a neighbouring low-PDF cell and producing
|
|
50
35
|
// fireflies. This only changes the importance distribution, not the
|
|
51
36
|
// radiance integral, so the estimator remains unbiased.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
37
|
+
// A separable max filter has the same clamped 3×3 footprint, with three
|
|
38
|
+
// reads per pass instead of nine clamped reads for every output texel.
|
|
39
|
+
const horizontal = new Float32Array(image.width * image.height);
|
|
40
|
+
for (let y = 0; y < image.height; y++) {
|
|
41
|
+
const row = y * image.width;
|
|
42
|
+
for (let x = 0; x < image.width; x++) {
|
|
43
|
+
horizontal[row + x] = Math.max(0, luminance[row + Math.max(0, x - 1)], luminance[row + x], luminance[row + Math.min(image.width - 1, x + 1)]);
|
|
60
44
|
}
|
|
61
|
-
|
|
62
|
-
};
|
|
45
|
+
}
|
|
63
46
|
for (let y = 0; y < image.height; y++) {
|
|
64
47
|
const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);
|
|
48
|
+
const above = Math.max(0, y - 1) * image.width;
|
|
49
|
+
const row = y * image.width;
|
|
50
|
+
const below = Math.min(image.height - 1, y + 1) * image.width;
|
|
65
51
|
for (let x = 0; x < image.width; x++) {
|
|
66
|
-
const weight =
|
|
52
|
+
const weight = Math.max(horizontal[above + x], horizontal[row + x], horizontal[below + x], 1e-12) * sinTheta;
|
|
67
53
|
cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);
|
|
68
54
|
cdf.set(x + 1, y, 1, weight);
|
|
69
55
|
}
|
|
@@ -104,4 +90,27 @@ function makeTextureArray(width, height, channels) {
|
|
|
104
90
|
array
|
|
105
91
|
};
|
|
106
92
|
}
|
|
93
|
+
function environmentLuminance(data, width, height) {
|
|
94
|
+
if (data instanceof Uint8Array)
|
|
95
|
+
return environmentLuminanceKernel(data, width, height, 1 / 255);
|
|
96
|
+
if (data instanceof Uint8ClampedArray)
|
|
97
|
+
return environmentLuminanceKernel(data, width, height, 1 / 255);
|
|
98
|
+
if (data instanceof Float32Array)
|
|
99
|
+
return environmentLuminanceKernel(data, width, height, 1);
|
|
100
|
+
return environmentLuminanceKernel(data, width, height, 1);
|
|
101
|
+
}
|
|
102
|
+
function environmentLuminanceKernel(data, width, height, sourceScale) {
|
|
103
|
+
const channels = Math.max(Math.floor(pixelLength(data) / (width * height)), 1);
|
|
104
|
+
const luminance = new Float32Array(width * height);
|
|
105
|
+
for (let y = 0; y < height; y++) {
|
|
106
|
+
for (let x = 0; x < width; x++) {
|
|
107
|
+
const sourceIndex = channels * (y * width + x);
|
|
108
|
+
luminance[y * width + x] =
|
|
109
|
+
sourceScale * (0.2126 * pixelValue(data, sourceIndex)
|
|
110
|
+
+ 0.7152 * pixelValue(data, sourceIndex + Math.min(1, channels - 1))
|
|
111
|
+
+ 0.0722 * pixelValue(data, sourceIndex + Math.min(2, channels - 1)));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return luminance;
|
|
115
|
+
}
|
|
107
116
|
//# sourceMappingURL=envMapDistribution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envMapDistribution.js","sourceRoot":"","sources":["../../src/renderer/envMapDistribution.ts"],"names":[],"mappings":"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","sourcesContent":["// 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\n// Create a piecewise 2D cumulative distribution function of light intensity from an env map\n// http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/2D_Sampling_with_Multidimensional_Transformations.html#Piecewise-Constant2DDistributions\n\nimport { TextureDataSource } from '../scene/Texture.js';\n\nexport interface EnvironmentMapSource extends TextureDataSource {\n /** Stable identity shared by adapters that recreate source wrappers. */\n distributionCacheKey?: object;\n /** Incremented whenever the source pixels change in place. */\n distributionCacheVersion?: number;\n}\n\ninterface DistributionCacheEntry {\n width: number;\n height: number;\n version: number;\n distribution: TextureDataSource;\n}\n\nconst distributionCache = new WeakMap<object, DistributionCacheEntry>();\n\nfunction distributionCacheIdentity(image: EnvironmentMapSource) {\n return image.distributionCacheKey ?? image.data;\n}\n\nexport function environmentMapSourcesMatch(\n first: EnvironmentMapSource | undefined,\n second: EnvironmentMapSource | undefined\n) {\n if (first === second) return true;\n if (!first || !second) return false;\n return (\n distributionCacheIdentity(first) === distributionCacheIdentity(second) &&\n first.width === second.width &&\n first.height === second.height &&\n (first.distributionCacheVersion ?? 0) ===\n (second.distributionCacheVersion ?? 0)\n );\n}\n\nexport function envMapDistribution(\n image: EnvironmentMapSource\n): TextureDataSource {\n const cacheKey = distributionCacheIdentity(image);\n const version = image.distributionCacheVersion ?? 0;\n const cached = distributionCache.get(cacheKey);\n if (\n cached &&\n cached.width === image.width &&\n cached.height === image.height &&\n cached.version === version\n ) {\n return cached.distribution;\n }\n const data = image.data;\n\n const cdfImage = {\n width: image.width + 2,\n height: image.height + 1\n } as TextureDataSource;\n\n const cdf = makeTextureArray(cdfImage.width, cdfImage.height, 2);\n\n const channels = Math.max(\n Math.floor(data.length / (image.width * image.height)),\n 1\n );\n const sourceScale = (data instanceof Uint8Array || data instanceof Uint8ClampedArray) ? 1 / 255 : 1;\n const luminance = new Float32Array(image.width * image.height);\n for (let y = 0; y < image.height; y++) {\n for (let x = 0; x < image.width; x++) {\n const sourceIndex = channels * (y * image.width + x);\n luminance[y * image.width + x] =\n sourceScale * (\n 0.2126 * data[sourceIndex]\n + 0.7152 * data[sourceIndex + Math.min(1, channels - 1)]\n + 0.0722 * data[sourceIndex + Math.min(2, channels - 1)]\n );\n }\n }\n\n // Environment radiance is read with bilinear filtering while the CDF is\n // piecewise constant. Dilating luminance over the filter footprint keeps a\n // sharp HDR sun from leaking into a neighbouring low-PDF cell and producing\n // fireflies. This only changes the importance distribution, not the\n // radiance integral, so the estimator remains unbiased.\n const filteredLuminance = (x: number, y: number) => {\n let maximum = 0;\n for (let dy = -1; dy <= 1; dy++) {\n const sourceY = Math.min(image.height - 1, Math.max(0, y + dy));\n for (let dx = -1; dx <= 1; dx++) {\n const sourceX = Math.min(image.width - 1, Math.max(0, x + dx));\n maximum = Math.max(\n maximum,\n luminance[sourceY * image.width + sourceX]\n );\n }\n }\n return Math.max(maximum, 1e-12);\n };\n\n for (let y = 0; y < image.height; y++) {\n const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);\n for (let x = 0; x < image.width; x++) {\n const weight = filteredLuminance(x, y) * sinTheta;\n cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);\n cdf.set(x + 1, y, 1, weight);\n }\n\n const rowIntegral = cdf.get(cdfImage.width - 1, y, 0);\n\n for (let x = 1; x < cdf.width; x++) {\n cdf.set(x, y, 0, cdf.get(x, y, 0) / rowIntegral);\n cdf.set(x, y, 1, cdf.get(x, y, 1) / rowIntegral);\n }\n\n cdf.set(0, y + 1, 0, cdf.get(0, y, 0) + rowIntegral / image.height);\n cdf.set(0, y, 1, rowIntegral);\n }\n\n const integral = cdf.get(0, cdf.height - 1, 0);\n\n for (let y = 0; y < cdf.height; y++) {\n cdf.set(0, y, 0, cdf.get(0, y, 0) / integral);\n cdf.set(0, y, 1, cdf.get(0, y, 1) / integral);\n }\n cdfImage.data = cdf.array;\n\n distributionCache.set(cacheKey, {\n width: image.width,\n height: image.height,\n version,\n distribution: cdfImage\n });\n\n return cdfImage;\n}\n\nfunction makeTextureArray(width: number, height: number, channels: number) {\n const array = new Float32Array(channels * width * height);\n\n return {\n set(x: number, y: number, channel: number, val: number) {\n array[channels * (y * width + x) + channel] = val;\n },\n get(x: number, y: number, channel: number) {\n return array[channels * (y * width + x) + channel];\n },\n width,\n height,\n channels,\n array\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"envMapDistribution.js","sourceRoot":"","sources":["../../src/renderer/envMapDistribution.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProceduralSkyImage } from '../scene/skyParameters.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\n// Create a piecewise 2D cumulative distribution function of light intensity from an env map\n// http://www.pbr-book.org/3ed-2018/Monte_Carlo_Integration/2D_Sampling_with_Multidimensional_Transformations.html#Piecewise-Constant2DDistributions\n\nimport type { TextureDataSource } from '../scene/textureData.js';\nimport { pixelLength, pixelValue } from '../scene/texturePixels.js';\n\nexport interface EnvironmentMapSource extends TextureDataSource {\n /** Stable identity shared by adapters that recreate source wrappers. */\n distributionCacheKey?: object;\n /** Incremented whenever the source pixels change in place. */\n distributionCacheVersion?: number;\n}\n\n/** GPU-generated radiance, including the scene's linear intensity and ambient fill. */\nexport interface ProceduralEnvironmentSource {\n sky: ProceduralSkyImage;\n width: number;\n height: number;\n intensity: number;\n ambient: [number, number, number];\n}\nexport type EnvironmentSource = EnvironmentMapSource | ProceduralEnvironmentSource;\n\ninterface DistributionCacheEntry {\n width: number;\n height: number;\n version: number;\n distribution: TextureDataSource;\n}\n\nconst distributionCache = new WeakMap<object, DistributionCacheEntry>();\n\nfunction distributionCacheIdentity(image: EnvironmentSource) {\n return 'sky' in image ? image : image.distributionCacheKey ?? image.data;\n}\n\nexport function environmentMapSourcesMatch(\n first: EnvironmentSource | undefined,\n second: EnvironmentSource | undefined\n) {\n if (first === second) return true;\n if (!first || !second) return false;\n return (\n distributionCacheIdentity(first) === distributionCacheIdentity(second) &&\n first.width === second.width &&\n first.height === second.height &&\n ('sky' in first ? 0 : first.distributionCacheVersion ?? 0) ===\n ('sky' in second ? 0 : second.distributionCacheVersion ?? 0)\n );\n}\n\nexport function envMapDistribution(\n image: EnvironmentMapSource\n): TextureDataSource {\n const cacheKey = distributionCacheIdentity(image);\n const version = image.distributionCacheVersion ?? 0;\n const cached = distributionCache.get(cacheKey);\n if (\n cached &&\n cached.width === image.width &&\n cached.height === image.height &&\n cached.version === version\n ) {\n return cached.distribution;\n }\n const data = image.data;\n\n const width = image.width + 2, height = image.height + 1;\n const cdf = makeTextureArray(width, height, 2);\n const cdfImage: TextureDataSource = { width, height, data: cdf.array };\n\n const luminance = environmentLuminance(data, image.width, image.height);\n\n // Environment radiance is read with bilinear filtering while the CDF is\n // piecewise constant. Dilating luminance over the filter footprint keeps a\n // sharp HDR sun from leaking into a neighbouring low-PDF cell and producing\n // fireflies. This only changes the importance distribution, not the\n // radiance integral, so the estimator remains unbiased.\n // A separable max filter has the same clamped 3×3 footprint, with three\n // reads per pass instead of nine clamped reads for every output texel.\n const horizontal = new Float32Array(image.width * image.height);\n for (let y = 0; y < image.height; y++) {\n const row = y * image.width;\n for (let x = 0; x < image.width; x++) {\n horizontal[row + x] = Math.max(0,\n luminance[row + Math.max(0, x - 1)], luminance[row + x],\n luminance[row + Math.min(image.width - 1, x + 1)]);\n }\n }\n\n for (let y = 0; y < image.height; y++) {\n const sinTheta = Math.sin((Math.PI * (y + 0.5)) / image.height);\n const above = Math.max(0, y - 1) * image.width;\n const row = y * image.width;\n const below = Math.min(image.height - 1, y + 1) * image.width;\n for (let x = 0; x < image.width; x++) {\n const weight = Math.max(horizontal[above + x], horizontal[row + x], horizontal[below + x], 1e-12) * sinTheta;\n cdf.set(x + 2, y, 0, cdf.get(x + 1, y, 0) + weight / image.width);\n cdf.set(x + 1, y, 1, weight);\n }\n\n const rowIntegral = cdf.get(cdfImage.width - 1, y, 0);\n\n for (let x = 1; x < cdf.width; x++) {\n cdf.set(x, y, 0, cdf.get(x, y, 0) / rowIntegral);\n cdf.set(x, y, 1, cdf.get(x, y, 1) / rowIntegral);\n }\n\n cdf.set(0, y + 1, 0, cdf.get(0, y, 0) + rowIntegral / image.height);\n cdf.set(0, y, 1, rowIntegral);\n }\n\n const integral = cdf.get(0, cdf.height - 1, 0);\n\n for (let y = 0; y < cdf.height; y++) {\n cdf.set(0, y, 0, cdf.get(0, y, 0) / integral);\n cdf.set(0, y, 1, cdf.get(0, y, 1) / integral);\n }\n cdfImage.data = cdf.array;\n\n distributionCache.set(cacheKey, {\n width: image.width,\n height: image.height,\n version,\n distribution: cdfImage\n });\n\n return cdfImage;\n}\n\nfunction makeTextureArray(width: number, height: number, channels: number) {\n const array = new Float32Array(channels * width * height);\n\n return {\n set(x: number, y: number, channel: number, val: number) {\n array[channels * (y * width + x) + channel] = val;\n },\n get(x: number, y: number, channel: number) {\n return array[channels * (y * width + x) + channel];\n },\n width,\n height,\n channels,\n array\n };\n}\n\nfunction environmentLuminance(data: TextureDataSource['data'], width: number, height: number): Float32Array {\n if (data instanceof Uint8Array) return environmentLuminanceKernel(data, width, height, 1 / 255);\n if (data instanceof Uint8ClampedArray) return environmentLuminanceKernel(data, width, height, 1 / 255);\n if (data instanceof Float32Array) return environmentLuminanceKernel(data, width, height, 1);\n return environmentLuminanceKernel(data, width, height, 1);\n}\n\nfunction environmentLuminanceKernel<T extends TextureDataSource['data']>(data: T, width: number, height: number, sourceScale: number): Float32Array {\n const channels = Math.max(\n Math.floor(pixelLength(data) / (width * height)),\n 1\n );\n const luminance = new Float32Array(width * height);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const sourceIndex = channels * (y * width + x);\n luminance[y * width + x] =\n sourceScale * (\n 0.2126 * pixelValue(data, sourceIndex)\n + 0.7152 * pixelValue(data, sourceIndex + Math.min(1, channels - 1))\n + 0.0722 * pixelValue(data, sourceIndex + Math.min(2, channels - 1))\n );\n }\n }\n\n return luminance;\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type Geometry from '../scene/Geometry.js';
|
|
2
|
+
import { vec3 } from '../math.js';
|
|
3
|
+
export declare function computeGeometryBounds(geometry: Geometry): [vec3.Vec3Array, vec3.Vec3Array];
|
|
4
|
+
export declare function getBvhBounds(geometry: Geometry): [vec3.Vec3Array, vec3.Vec3Array];
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { vec3 } from '../math.js';
|
|
2
|
+
import { getGeometryBvh } from './geometryBvh.js';
|
|
3
|
+
export function computeGeometryBounds(geometry) {
|
|
4
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
5
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
6
|
+
const positions = geometry.position.array, stride = geometry.position.itemSize;
|
|
7
|
+
for (let offset = 0; offset + 2 < positions.length; offset += stride) {
|
|
8
|
+
const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];
|
|
9
|
+
if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z))
|
|
10
|
+
continue;
|
|
11
|
+
// Each selected value is already float32. Keep the reduction in scalars,
|
|
12
|
+
// avoiding six typed-array loads/stores per vertex with identical rounding.
|
|
13
|
+
minX = Math.min(minX, x);
|
|
14
|
+
minY = Math.min(minY, y);
|
|
15
|
+
minZ = Math.min(minZ, z);
|
|
16
|
+
maxX = Math.max(maxX, x);
|
|
17
|
+
maxY = Math.max(maxY, y);
|
|
18
|
+
maxZ = Math.max(maxZ, z);
|
|
19
|
+
}
|
|
20
|
+
return [vec3.fromValues(minX, minY, minZ), vec3.fromValues(maxX, maxY, maxZ)];
|
|
21
|
+
}
|
|
22
|
+
export function getBvhBounds(geometry) {
|
|
23
|
+
const bvh = getGeometryBvh(geometry);
|
|
24
|
+
const floats = new Float32Array(bvh.buffer);
|
|
25
|
+
if (bvh.layout === 'bvh4') {
|
|
26
|
+
return [
|
|
27
|
+
[floats[0], floats[1], floats[2]],
|
|
28
|
+
[
|
|
29
|
+
floats[0] + floats[3],
|
|
30
|
+
floats[1] + floats[4],
|
|
31
|
+
floats[2] + floats[5]
|
|
32
|
+
]
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
if (bvh.layout === 'bvh-gpu') {
|
|
36
|
+
const words = new Uint32Array(bvh.buffer);
|
|
37
|
+
if (words[11] === 0) {
|
|
38
|
+
return [
|
|
39
|
+
[
|
|
40
|
+
Math.min(floats[0], floats[8]),
|
|
41
|
+
Math.min(floats[1], floats[9]),
|
|
42
|
+
Math.min(floats[2], floats[10])
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
Math.max(floats[4], floats[12]),
|
|
46
|
+
Math.max(floats[5], floats[13]),
|
|
47
|
+
Math.max(floats[6], floats[14])
|
|
48
|
+
]
|
|
49
|
+
];
|
|
50
|
+
}
|
|
51
|
+
// A single-leaf BVH_GPU node does not store its own bounds.
|
|
52
|
+
return computeGeometryBounds(geometry);
|
|
53
|
+
}
|
|
54
|
+
if (bvh.layout === 'cwbvh') {
|
|
55
|
+
const words = new Uint32Array(bvh.buffer);
|
|
56
|
+
const header = words[3];
|
|
57
|
+
const signedByte = (value) => (value << 24) >> 24;
|
|
58
|
+
const scale = [
|
|
59
|
+
2 ** signedByte(header),
|
|
60
|
+
2 ** signedByte(header >> 8),
|
|
61
|
+
2 ** signedByte(header >> 16)
|
|
62
|
+
];
|
|
63
|
+
const min = [floats[0], floats[1], floats[2]];
|
|
64
|
+
const max = [...min];
|
|
65
|
+
for (let slot = 0; slot < 8; slot++) {
|
|
66
|
+
const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;
|
|
67
|
+
if (!meta)
|
|
68
|
+
continue;
|
|
69
|
+
const shift = (slot & 3) * 8;
|
|
70
|
+
const half = slot >> 2;
|
|
71
|
+
max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);
|
|
72
|
+
max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);
|
|
73
|
+
max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);
|
|
74
|
+
}
|
|
75
|
+
return [min, max];
|
|
76
|
+
}
|
|
77
|
+
return [
|
|
78
|
+
[floats[0], floats[1], floats[2]],
|
|
79
|
+
[floats[4], floats[5], floats[6]]
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=geometryBvhBounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometryBvhBounds.js","sourceRoot":"","sources":["../../src/renderer/geometryBvhBounds.ts"],"names":[],"mappings":"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","sourcesContent":["import type Geometry from '../scene/Geometry.js';\nimport { vec3 } from '../math.js';\nimport { getGeometryBvh } from './geometryBvh.js';\n\nexport function computeGeometryBounds(geometry: Geometry) {\n let minX = Infinity, minY = Infinity, minZ = Infinity;\n let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;\n const positions = geometry.position.array, stride = geometry.position.itemSize;\n for (let offset = 0; offset + 2 < positions.length; offset += stride) {\n const x = positions[offset], y = positions[offset + 1], z = positions[offset + 2];\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) continue;\n // Each selected value is already float32. Keep the reduction in scalars,\n // avoiding six typed-array loads/stores per vertex with identical rounding.\n minX = Math.min(minX, x); minY = Math.min(minY, y); minZ = Math.min(minZ, z);\n maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); maxZ = Math.max(maxZ, z);\n }\n return [vec3.fromValues(minX, minY, minZ), vec3.fromValues(maxX, maxY, maxZ)] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function getBvhBounds(geometry: Geometry) {\n const bvh = getGeometryBvh(geometry)!;\n const floats = new Float32Array(bvh.buffer);\n if (bvh.layout === 'bvh4') {\n return [\n [floats[0], floats[1], floats[2]],\n [\n floats[0] + floats[3],\n floats[1] + floats[4],\n floats[2] + floats[5]\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n if (bvh.layout === 'bvh-gpu') {\n const words = new Uint32Array(bvh.buffer);\n if (words[11] === 0) {\n return [\n [\n Math.min(floats[0], floats[8]),\n Math.min(floats[1], floats[9]),\n Math.min(floats[2], floats[10])\n ],\n [\n Math.max(floats[4], floats[12]),\n Math.max(floats[5], floats[13]),\n Math.max(floats[6], floats[14])\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n // A single-leaf BVH_GPU node does not store its own bounds.\n return computeGeometryBounds(geometry);\n }\n if (bvh.layout === 'cwbvh') {\n const words = new Uint32Array(bvh.buffer);\n const header = words[3];\n const signedByte = (value: number) => (value << 24) >> 24;\n const scale = [\n 2 ** signedByte(header),\n 2 ** signedByte(header >> 8),\n 2 ** signedByte(header >> 16)\n ];\n const min: vec3.Vec3Array = [floats[0], floats[1], floats[2]];\n const max: vec3.Vec3Array = [...min];\n for (let slot = 0; slot < 8; slot++) {\n const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;\n if (!meta) continue;\n const shift = (slot & 3) * 8;\n const half = slot >> 2;\n max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);\n max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);\n max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n return [\n [floats[0], floats[1], floats[2]],\n [floats[4], floats[5], floats[6]]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type Geometry from '../scene/Geometry.js';
|
|
2
|
+
import type MaterialState from '../scene/MaterialState.js';
|
|
3
|
+
import type { vec3 } from '../math.js';
|
|
4
|
+
import type { FlattendBVH } from './bvhAccel.js';
|
|
5
|
+
export interface GeometryUpdateMesh {
|
|
6
|
+
geometry: Geometry;
|
|
7
|
+
materials: MaterialState[];
|
|
8
|
+
}
|
|
9
|
+
export interface GeometryUpdateBinding<M extends GeometryUpdateMesh = GeometryUpdateMesh> {
|
|
10
|
+
mesh: M;
|
|
11
|
+
geometry: Geometry;
|
|
12
|
+
bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];
|
|
13
|
+
}
|
|
14
|
+
export interface GeometryUpdateRegion {
|
|
15
|
+
vertexOffset: number;
|
|
16
|
+
indexOffset: number;
|
|
17
|
+
materialIndices: number[];
|
|
18
|
+
}
|
|
19
|
+
export interface GeometryUpdateState<M extends GeometryUpdateMesh = GeometryUpdateMesh> {
|
|
20
|
+
geometry: Geometry;
|
|
21
|
+
geometries: Geometry[];
|
|
22
|
+
geometryRegions: Map<Geometry, GeometryUpdateRegion>;
|
|
23
|
+
geometryStates: Map<Geometry, {
|
|
24
|
+
topologyVersion: number;
|
|
25
|
+
indices: Geometry['indices']['array'];
|
|
26
|
+
indexCount: number;
|
|
27
|
+
}>;
|
|
28
|
+
instanceBindings: GeometryUpdateBinding<M>[];
|
|
29
|
+
blases: {
|
|
30
|
+
bvh: FlattendBVH;
|
|
31
|
+
}[];
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometryUpdateState.js","sourceRoot":"","sources":["../../src/renderer/geometryUpdateState.ts"],"names":[],"mappings":"","sourcesContent":["import type Geometry from '../scene/Geometry.js';\nimport type MaterialState from '../scene/MaterialState.js';\nimport type { vec3 } from '../math.js';\nimport type { FlattendBVH } from './bvhAccel.js';\n\n// The update algorithm needs no renderer resources or browser scene facade.\nexport interface GeometryUpdateMesh { geometry: Geometry; materials: MaterialState[]; }\nexport interface GeometryUpdateBinding<M extends GeometryUpdateMesh = GeometryUpdateMesh> {\n mesh: M;\n geometry: Geometry;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\nexport interface GeometryUpdateRegion { vertexOffset: number; indexOffset: number; materialIndices: number[]; }\nexport interface GeometryUpdateState<M extends GeometryUpdateMesh = GeometryUpdateMesh> {\n geometry: Geometry;\n geometries: Geometry[];\n geometryRegions: Map<Geometry, GeometryUpdateRegion>;\n geometryStates: Map<Geometry, {topologyVersion: number; indices: Geometry['indices']['array']; indexCount: number}>;\n instanceBindings: GeometryUpdateBinding<M>[];\n blases: {bvh: FlattendBVH}[];\n}\n"]}
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import Geometry from '../scene/Geometry.js';
|
|
1
|
+
import type Geometry from '../scene/Geometry.js';
|
|
2
2
|
import { type FlattendBVH } from './bvhAccel.js';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
type Prepared = ReturnType<typeof updateMeshInstances>;
|
|
3
|
+
import type { GeometryUpdateState, GeometryUpdateMesh } from './geometryUpdateState.js';
|
|
4
|
+
type Prepared = GeometryUpdateState;
|
|
6
5
|
/** Displaced geometry must be prepared as a whole. */
|
|
7
|
-
export declare function canUpdateGeometries(prepared:
|
|
6
|
+
export declare function canUpdateGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, geometries: readonly Geometry[]): boolean;
|
|
8
7
|
/** Constant-time topology detection; markUpdated also covers in-place index edits. */
|
|
9
|
-
export declare function geometryTopologyChanged(prepared:
|
|
8
|
+
export declare function geometryTopologyChanged(prepared: {
|
|
9
|
+
geometryStates: Prepared['geometryStates'];
|
|
10
|
+
} | undefined, source: Geometry): boolean;
|
|
11
|
+
export interface GeometryUpdateOptions {
|
|
12
|
+
softwareBvhs?: boolean;
|
|
13
|
+
displacement?: Map<Geometry, {
|
|
14
|
+
scale: number;
|
|
15
|
+
ranges: Float32Array;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
10
18
|
/** Refits/rebuilds changed BLASes and refreshes all shared instances' cached bounds. */
|
|
11
|
-
export declare function updatePreparedGeometries(prepared:
|
|
19
|
+
export declare function updatePreparedGeometries<M extends GeometryUpdateMesh>(prepared: GeometryUpdateState<M>, changed: ReadonlySet<Geometry>, options?: GeometryUpdateOptions): {
|
|
12
20
|
vertices: {
|
|
13
21
|
first: number;
|
|
14
22
|
count: number;
|
|
@@ -19,10 +27,10 @@ export declare function updatePreparedGeometries(prepared: Prepared, changed: Re
|
|
|
19
27
|
blas: FlattendBVH;
|
|
20
28
|
offset: number;
|
|
21
29
|
}[];
|
|
22
|
-
meshes: Set<
|
|
30
|
+
meshes: Set<M>;
|
|
23
31
|
resized: boolean;
|
|
24
32
|
relocated: boolean;
|
|
25
33
|
};
|
|
26
34
|
/** Packs the same interleaved vertex layout for full and partial GPU uploads. */
|
|
27
|
-
export declare function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number, offsets: readonly number[], first: number, count: number, includeMaterialIndex?: boolean, deformationOnly?: boolean): void;
|
|
35
|
+
export declare function packVertexAttributes(geometry: Geometry, output: Float32Array, stride: number, offsets: readonly number[], first: number, count: number, includeMaterialIndex?: boolean, deformationOnly?: boolean, outputFirst?: number): void;
|
|
28
36
|
export {};
|