@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
|
@@ -4,6 +4,7 @@ export { materialParametersEqual } from './materialComparison.generated.js';
|
|
|
4
4
|
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
5
5
|
import { materialTextureKeys } from '../scene/OpenPBRMaterial.js';
|
|
6
6
|
import Texture from '../scene/Texture.js';
|
|
7
|
+
import { SceneChangeTracker } from './sceneChangeCore.js';
|
|
7
8
|
/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */
|
|
8
9
|
export function snapshotFields(object) {
|
|
9
10
|
const values = [object];
|
|
@@ -79,157 +80,30 @@ export function snapshotMaterialParameters(material, previous) {
|
|
|
79
80
|
return value;
|
|
80
81
|
});
|
|
81
82
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
83
|
+
// Web values may be loosely typed JS; the generated comparisons keep their
|
|
84
|
+
// Object.is and array semantics. Detection rules live in sceneChangeCore.
|
|
85
|
+
const webAdapter = {
|
|
86
|
+
validateMesh: mesh => { if (mesh instanceof InstancedMesh)
|
|
87
|
+
mesh.validate(); },
|
|
88
|
+
captureMaterial: (material, previous, retired) => {
|
|
89
|
+
const item = retired ?? { aovId: material.aovId, values: [], textures: [] };
|
|
90
|
+
item.aovId = material.aovId;
|
|
91
|
+
item.values = snapshotMaterialParameters(material, previous?.values);
|
|
92
|
+
captureMaterialTextures(material, item.textures);
|
|
93
|
+
return item;
|
|
94
|
+
},
|
|
95
|
+
materialMatches: (material, snapshot) => material.aovId === snapshot.aovId && materialParametersEqual(material, snapshot.values) &&
|
|
96
|
+
!materialTexturesChanged(material, snapshot.textures),
|
|
97
|
+
captureLight: light => snapshotFields(light),
|
|
98
|
+
lightsEqual: snapshotsEqual,
|
|
99
|
+
captureBackground: backgroundSnapshot,
|
|
100
|
+
backgroundsEqual: snapshotsEqual
|
|
101
|
+
};
|
|
101
102
|
/** Detects edits without accepting them until the pipeline has received the scene. */
|
|
102
103
|
export class SceneChangeDetector {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
detect(scene) {
|
|
108
|
-
const old = this._snapshot;
|
|
109
|
-
let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;
|
|
110
|
-
const transforms = [];
|
|
111
|
-
const colors = [];
|
|
112
|
-
const geometries = new Set();
|
|
113
|
-
const materials = [];
|
|
114
|
-
const seen = this._seen;
|
|
115
|
-
seen.clear();
|
|
116
|
-
for (let i = 0; i < scene.meshes.length; i++) {
|
|
117
|
-
const mesh = scene.meshes[i];
|
|
118
|
-
const prev = old?.meshes[i];
|
|
119
|
-
let instanceChanged = false;
|
|
120
|
-
if (mesh instanceof InstancedMesh) {
|
|
121
|
-
mesh.validate();
|
|
122
|
-
if (prev?.instanceCount !== mesh.count)
|
|
123
|
-
full = true;
|
|
124
|
-
if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors))
|
|
125
|
-
colors.push(mesh);
|
|
126
|
-
if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {
|
|
127
|
-
transforms.push(mesh);
|
|
128
|
-
instanceChanged = true;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||
|
|
132
|
-
prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||
|
|
133
|
-
prev.materials.some((m, k) => m !== mesh.materials[k]))
|
|
134
|
-
full = true;
|
|
135
|
-
if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version)
|
|
136
|
-
geometries.add(mesh.geometry);
|
|
137
|
-
if (prev?.mesh === mesh) {
|
|
138
|
-
for (let k = 0; k < 16; k++) {
|
|
139
|
-
if (!Object.is(mesh.transform[k], old.matrices[i * 16 + k])) {
|
|
140
|
-
if (!instanceChanged)
|
|
141
|
-
transforms.push(mesh);
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
for (const material of mesh.materials) {
|
|
147
|
-
if (seen.has(material))
|
|
148
|
-
continue;
|
|
149
|
-
seen.add(material);
|
|
150
|
-
const prior = old?.materials.get(material);
|
|
151
|
-
if (!prior || !materialParametersEqual(material, prior.values) ||
|
|
152
|
-
materialTexturesChanged(material, prior.textures))
|
|
153
|
-
materials.push(material);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
const lights = scene.lights.map(snapshotFields);
|
|
157
|
-
const background = backgroundSnapshot(scene.background);
|
|
158
|
-
const changes = {
|
|
159
|
-
meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',
|
|
160
|
-
transforms, colors, materials, geometries: [...geometries],
|
|
161
|
-
lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||
|
|
162
|
-
lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),
|
|
163
|
-
background: !old || !snapshotsEqual(background, old.background)
|
|
164
|
-
};
|
|
165
|
-
if (changes.meshes !== 'none' || changes.lights || changes.background) {
|
|
166
|
-
// Write into the other buffer: detect never mutates committed state.
|
|
167
|
-
// Repeated detects without commit overwrite the same pending buffer.
|
|
168
|
-
let next = this._spare;
|
|
169
|
-
if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {
|
|
170
|
-
next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),
|
|
171
|
-
materials: new Map(), lightList: scene.lights, lights: [], background: [] };
|
|
172
|
-
this._spare = next;
|
|
173
|
-
}
|
|
174
|
-
scene.meshes.forEach((mesh, i) => {
|
|
175
|
-
let item = next.meshes[i];
|
|
176
|
-
if (!item) {
|
|
177
|
-
item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],
|
|
178
|
-
materials: [] };
|
|
179
|
-
next.meshes[i] = item;
|
|
180
|
-
}
|
|
181
|
-
item.mesh = mesh;
|
|
182
|
-
item.geometry = mesh.geometry;
|
|
183
|
-
item.version = mesh.geometry.version;
|
|
184
|
-
item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;
|
|
185
|
-
item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;
|
|
186
|
-
item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;
|
|
187
|
-
item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;
|
|
188
|
-
item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;
|
|
189
|
-
item.dynamic = mesh.geometry.dynamic;
|
|
190
|
-
captureGeometryStorage(mesh.geometry, item.storage);
|
|
191
|
-
item.materials.length = mesh.materials.length;
|
|
192
|
-
for (let k = 0; k < mesh.materials.length; k++)
|
|
193
|
-
item.materials[k] = mesh.materials[k];
|
|
194
|
-
next.matrices.set(mesh.transform, i * 16);
|
|
195
|
-
});
|
|
196
|
-
for (const material of next.materials.keys())
|
|
197
|
-
if (!seen.has(material))
|
|
198
|
-
next.materials.delete(material);
|
|
199
|
-
const changedMaterials = new Set(materials);
|
|
200
|
-
for (const material of seen) {
|
|
201
|
-
const previous = old?.materials.get(material);
|
|
202
|
-
if (previous && !changedMaterials.has(material)) {
|
|
203
|
-
next.materials.set(material, previous);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
// Never overwrite a shared committed entry. The other buffer's
|
|
207
|
-
// retired entry can reuse its texture storage; parameter arrays and
|
|
208
|
-
// their reused vector snapshots remain immutable after capture.
|
|
209
|
-
let item = next.materials.get(material);
|
|
210
|
-
if (!item || item === previous)
|
|
211
|
-
item = { values: [], textures: [] };
|
|
212
|
-
item.values = snapshotMaterialParameters(material, previous?.values);
|
|
213
|
-
captureMaterialTextures(material, item.textures);
|
|
214
|
-
next.materials.set(material, item);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
next.lightList = scene.lights;
|
|
218
|
-
next.lights = lights;
|
|
219
|
-
next.background = background;
|
|
220
|
-
this._pending = next;
|
|
221
|
-
}
|
|
222
|
-
else
|
|
223
|
-
this._pending = old;
|
|
224
|
-
return changes;
|
|
225
|
-
}
|
|
226
|
-
commit() {
|
|
227
|
-
if (this._pending && this._pending !== this._snapshot) {
|
|
228
|
-
this._spare = this._snapshot;
|
|
229
|
-
this._snapshot = this._pending;
|
|
230
|
-
}
|
|
231
|
-
this._pending = undefined;
|
|
232
|
-
}
|
|
233
|
-
reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }
|
|
104
|
+
_tracker = new SceneChangeTracker(webAdapter);
|
|
105
|
+
detect(scene) { return this._tracker.detect(scene); }
|
|
106
|
+
commit() { this._tracker.commit(); }
|
|
107
|
+
reset() { this._tracker.reset(); }
|
|
234
108
|
}
|
|
235
109
|
//# sourceMappingURL=sceneChangeDetector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport { Scene, SceneBackground } from '../scene/Scene.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];\n}\n\nexport function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]) {\n return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n}\n\nfunction backgroundSnapshot(background: SceneBackground | undefined) {\n if (background instanceof Texture) return snapshotTexture(background);\n if (Array.isArray(background)) return [background, ...background];\n return background ? snapshotFields(background) : [undefined];\n}\n\nfunction captureMaterialTextures(material: OpenPBRMaterial, out: unknown[]) {\n let i = 0;\n for (const key of materialTextureKeys) {\n const texture = material[key];\n if (typeof texture === 'number') continue;\n if (!texture) { out[i++] = undefined; continue; }\n out[i++] = texture; out[i++] = texture.version; out[i++] = texture.image;\n out[i++] = texture.flipY; out[i++] = texture.uvScale; out[i++] = texture.uvOffset;\n out[i++] = texture.uvChannel; out[i++] = texture.wrapS; out[i++] = texture.wrapT; out[i++] = texture.colorSpace;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\nconst geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'] as const;\nfunction captureGeometryStorage(geometry: Geometry, out: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n out[i++] = attribute?.array; out[i++] = attribute?.array.length; out[i++] = attribute?.itemSize;\n }\n}\nfunction geometryStorageMatches(geometry: Geometry, storage: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize) return false;\n }\n return true;\n}\n\ninterface MeshSnapshot {\n mesh: Mesh;\n geometry: Mesh['geometry'];\n version: number;\n instanceVersion?: number;\n instanceCount?: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion?: number;\n dynamic: boolean;\n storage: unknown[];\n materials: OpenPBRMaterial[];\n}\ninterface Snapshot {\n meshList: Mesh[];\n meshes: MeshSnapshot[];\n matrices: Float64Array;\n materials: Map<OpenPBRMaterial, { values: readonly unknown[]; textures: unknown[] }>;\n lightList: Scene['lights'];\n lights: unknown[][];\n background: unknown[];\n}\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _snapshot?: Snapshot;\n private _pending?: Snapshot;\n private _spare?: Snapshot;\n private _seen = new Set<OpenPBRMaterial>();\n detect(scene: Scene): SceneChanges {\n const old = this._snapshot;\n let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;\n const transforms: Mesh[] = [];\n const colors: InstancedMesh[] = [];\n const geometries = new Set<Geometry>();\n const materials: OpenPBRMaterial[] = [];\n const seen = this._seen;\n seen.clear();\n for (let i = 0; i < scene.meshes.length; i++) {\n const mesh = scene.meshes[i];\n const prev = old?.meshes[i];\n let instanceChanged = false;\n if (mesh instanceof InstancedMesh) {\n mesh.validate();\n if (prev?.instanceCount !== mesh.count) full = true;\n if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors)) colors.push(mesh);\n if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {\n transforms.push(mesh); instanceChanged = true;\n }\n }\n if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||\n prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||\n prev.materials.some((m, k) => m !== mesh.materials[k])) full = true;\n if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version) geometries.add(mesh.geometry);\n if (prev?.mesh === mesh) {\n for (let k = 0; k < 16; k++) {\n if (!Object.is(mesh.transform[k], old!.matrices[i * 16 + k])) {\n if (!instanceChanged) transforms.push(mesh);\n break;\n }\n }\n }\n for (const material of mesh.materials) {\n if (seen.has(material)) continue;\n seen.add(material);\n const prior = old?.materials.get(material);\n if (!prior || !materialParametersEqual(material, prior.values) ||\n materialTexturesChanged(material, prior.textures)) materials.push(material);\n }\n }\n const lights = scene.lights.map(snapshotFields);\n const background = backgroundSnapshot(scene.background);\n const changes: SceneChanges = {\n meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',\n transforms, colors, materials, geometries: [...geometries],\n lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||\n lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),\n background: !old || !snapshotsEqual(background, old.background)\n };\n if (changes.meshes !== 'none' || changes.lights || changes.background) {\n // Write into the other buffer: detect never mutates committed state.\n // Repeated detects without commit overwrite the same pending buffer.\n let next = this._spare;\n if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {\n next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),\n materials: new Map(), lightList: scene.lights, lights: [], background: [] };\n this._spare = next;\n }\n scene.meshes.forEach((mesh, i) => {\n let item = next!.meshes[i];\n if (!item) {\n item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],\n materials: [] };\n next!.meshes[i] = item;\n }\n item.mesh = mesh; item.geometry = mesh.geometry; item.version = mesh.geometry.version;\n item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;\n item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;\n item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;\n item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;\n item.dynamic = mesh.geometry.dynamic; captureGeometryStorage(mesh.geometry, item.storage);\n item.materials.length = mesh.materials.length;\n for (let k = 0; k < mesh.materials.length; k++) item.materials[k] = mesh.materials[k];\n next!.matrices.set(mesh.transform, i * 16);\n });\n for (const material of next.materials.keys()) if (!seen.has(material)) next.materials.delete(material);\n const changedMaterials = new Set(materials);\n for (const material of seen) {\n const previous = old?.materials.get(material);\n if (previous && !changedMaterials.has(material)) {\n next.materials.set(material, previous);\n } else {\n // Never overwrite a shared committed entry. The other buffer's\n // retired entry can reuse its texture storage; parameter arrays and\n // their reused vector snapshots remain immutable after capture.\n let item = next.materials.get(material);\n if (!item || item === previous) item = { values: [], textures: [] };\n item.values = snapshotMaterialParameters(material, previous?.values);\n captureMaterialTextures(material, item.textures);\n next.materials.set(material, item);\n }\n }\n next.lightList = scene.lights; next.lights = lights; next.background = background;\n this._pending = next;\n } else this._pending = old;\n return changes;\n }\n\n commit() {\n if (this._pending && this._pending !== this._snapshot) {\n this._spare = this._snapshot;\n this._snapshot = this._pending;\n }\n this._pending = undefined;\n }\n reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport type Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport type { Scene, SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { SceneChangeTracker, type SceneSnapshotAdapter } from './sceneChangeCore.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];\n}\n\nexport function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]) {\n return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n}\n\nfunction backgroundSnapshot(background: SceneBackground | undefined) {\n if (background instanceof Texture) return snapshotTexture(background);\n if (Array.isArray(background)) return [background, ...background];\n return background ? snapshotFields(background) : [undefined];\n}\n\nfunction captureMaterialTextures(material: OpenPBRMaterial, out: unknown[]) {\n let i = 0;\n for (const key of materialTextureKeys) {\n const texture = material[key];\n if (typeof texture === 'number') continue;\n if (!texture) { out[i++] = undefined; continue; }\n out[i++] = texture; out[i++] = texture.version; out[i++] = texture.image;\n out[i++] = texture.flipY; out[i++] = texture.uvScale; out[i++] = texture.uvOffset;\n out[i++] = texture.uvChannel; out[i++] = texture.wrapS; out[i++] = texture.wrapT; out[i++] = texture.colorSpace;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\ninterface MaterialSnapshot { aovId: number; values: readonly unknown[]; textures: unknown[]; }\n\n// Web values may be loosely typed JS; the generated comparisons keep their\n// Object.is and array semantics. Detection rules live in sceneChangeCore.\nconst webAdapter: SceneSnapshotAdapter<SceneLight, SceneBackground, MaterialSnapshot, unknown[], unknown[]> = {\n validateMesh: mesh => { if (mesh instanceof InstancedMesh) mesh.validate(); },\n captureMaterial: (material, previous, retired) => {\n const item = retired ?? { aovId: material.aovId, values: [], textures: [] };\n item.aovId = material.aovId;\n item.values = snapshotMaterialParameters(material as OpenPBRMaterial, previous?.values);\n captureMaterialTextures(material as OpenPBRMaterial, item.textures);\n return item;\n },\n materialMatches: (material, snapshot) => material.aovId === snapshot.aovId && materialParametersEqual(material as OpenPBRMaterial, snapshot.values) &&\n !materialTexturesChanged(material as OpenPBRMaterial, snapshot.textures),\n captureLight: light => snapshotFields(light),\n lightsEqual: snapshotsEqual,\n captureBackground: backgroundSnapshot,\n backgroundsEqual: snapshotsEqual\n};\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _tracker = new SceneChangeTracker(webAdapter);\n detect(scene: Scene): SceneChanges { return this._tracker.detect(scene) as SceneChanges; }\n commit() { this._tracker.commit(); }\n reset() { this._tracker.reset(); }\n}\n"]}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export declare const WORD_BYTES = 4;
|
|
2
|
+
export declare const protocolVersions: {
|
|
3
|
+
SCENE: number;
|
|
4
|
+
RESOURCE_PACKET: number;
|
|
5
|
+
RESOURCE_WRITES: number;
|
|
6
|
+
TARGET_PACKET: number;
|
|
7
|
+
GEOMETRY_KERNELS: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function sceneRecords(): {
|
|
10
|
+
HEADER: Record<string, number>;
|
|
11
|
+
GEOMETRY: Record<string, number>;
|
|
12
|
+
MESH: Record<string, number>;
|
|
13
|
+
MATERIAL: Record<string, number>;
|
|
14
|
+
TEXTURE: Record<string, number>;
|
|
15
|
+
LIGHT: Record<string, number>;
|
|
16
|
+
CAMERA: Record<string, number>;
|
|
17
|
+
BATCH: Record<string, number>;
|
|
18
|
+
EXTENSION: Record<string, number>;
|
|
19
|
+
SETTINGS: Record<string, number>;
|
|
20
|
+
WRITE_ENTRY: Record<string, number>;
|
|
21
|
+
GEOMETRY_KERNEL_HEADER: Record<string, number>;
|
|
22
|
+
GEOMETRY_KERNEL_ENTRY: Record<string, number>;
|
|
23
|
+
PACKET_HEADER: Record<string, number>;
|
|
24
|
+
PACKET_ENTRY: Record<string, number>;
|
|
25
|
+
};
|
|
26
|
+
export declare const resourceIds: {
|
|
27
|
+
AS_CHANGED_BLASES: number;
|
|
28
|
+
BVH: number;
|
|
29
|
+
INSTANCES: number;
|
|
30
|
+
ATTRIBUTES: number;
|
|
31
|
+
MATERIALS: number;
|
|
32
|
+
MAP_INFO: number;
|
|
33
|
+
CAMERA: number;
|
|
34
|
+
TRACE_UNIFORM: number;
|
|
35
|
+
LIGHT_UNIFORM: number;
|
|
36
|
+
COLOR: number;
|
|
37
|
+
NORMAL: number;
|
|
38
|
+
ALBEDO: number;
|
|
39
|
+
SHADOW_CATCHER: number;
|
|
40
|
+
ATLAS: number;
|
|
41
|
+
ENVIRONMENT: number;
|
|
42
|
+
ENVIRONMENT_CDF: number;
|
|
43
|
+
BACKGROUND: number;
|
|
44
|
+
LIGHT_SAMPLING: number;
|
|
45
|
+
ENERGY_LUT: number;
|
|
46
|
+
DISPLACEMENT: number;
|
|
47
|
+
SOFTWARE_SHADER: number;
|
|
48
|
+
METADATA: number;
|
|
49
|
+
HWRT_SHADER: number;
|
|
50
|
+
HIT_SHADER: number;
|
|
51
|
+
INDICES: number;
|
|
52
|
+
SOFTWARE_PATH_SHADER: number;
|
|
53
|
+
HWRT_PATH_SHADER: number;
|
|
54
|
+
DISPLACEMENT_BOUNDS: number;
|
|
55
|
+
SOFTWARE_HIT_SHADER: number;
|
|
56
|
+
PRIMITIVE_IDS: number;
|
|
57
|
+
AS_POSITIONS: number;
|
|
58
|
+
AS_INDICES: number;
|
|
59
|
+
PATH_EVENTS: number;
|
|
60
|
+
PATH_PARAMETERS: number;
|
|
61
|
+
QUERY_COUNTS: number;
|
|
62
|
+
SOFTWARE_FRAME_SHADER: number;
|
|
63
|
+
HWRT_FRAME_SHADER: number;
|
|
64
|
+
};
|
|
65
|
+
export declare const packetKinds: {
|
|
66
|
+
BUFFER: number;
|
|
67
|
+
TEXTURE: number;
|
|
68
|
+
WGSL: number;
|
|
69
|
+
METADATA: number;
|
|
70
|
+
};
|
|
71
|
+
export declare const samplerIds: {
|
|
72
|
+
MATERIAL: number;
|
|
73
|
+
};
|
|
74
|
+
export declare const textureFormats: {
|
|
75
|
+
RGBA8_UNORM: number;
|
|
76
|
+
RGBA16_FLOAT: number;
|
|
77
|
+
RGBA32_FLOAT: number;
|
|
78
|
+
R32_FLOAT: number;
|
|
79
|
+
RG32_FLOAT: number;
|
|
80
|
+
};
|
|
81
|
+
export declare const textureFormatInfo: {
|
|
82
|
+
id: number;
|
|
83
|
+
name: string;
|
|
84
|
+
bytes: number;
|
|
85
|
+
}[];
|
|
86
|
+
export declare const rounding: {
|
|
87
|
+
rangeScale: number;
|
|
88
|
+
rangeShift: number;
|
|
89
|
+
rangeEpsilon: number;
|
|
90
|
+
float32Product: boolean;
|
|
91
|
+
float32Difference: boolean;
|
|
92
|
+
};
|
|
93
|
+
interface BindingSchema {
|
|
94
|
+
name: string;
|
|
95
|
+
resource: number;
|
|
96
|
+
kind: 'buffer' | 'texture' | 'sampler';
|
|
97
|
+
layout: GPUBindGroupLayoutEntry;
|
|
98
|
+
}
|
|
99
|
+
export declare const bindGroups: {
|
|
100
|
+
name: string;
|
|
101
|
+
label: string;
|
|
102
|
+
bindings: BindingSchema[];
|
|
103
|
+
}[];
|
|
104
|
+
export declare const hwrtBindings: {
|
|
105
|
+
ACCELERATION: number;
|
|
106
|
+
INDICES: number;
|
|
107
|
+
DIAGNOSTIC: number;
|
|
108
|
+
PATH_PARAMETERS: number;
|
|
109
|
+
};
|
|
110
|
+
export declare function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[];
|
|
111
|
+
export declare function rayTraceUniformOffsets(): {
|
|
112
|
+
[k: string]: number;
|
|
113
|
+
};
|
|
114
|
+
export declare const uniformSizes: {
|
|
115
|
+
CAMERA_BYTES: number;
|
|
116
|
+
LIGHT_BYTES: number;
|
|
117
|
+
};
|
|
118
|
+
export declare const framePixelFields: readonly [readonly ["noisyColor", "noisy_color", "vec4f", "Linear HDR radiance, alpha 1."], readonly ["normalRoughness", "normal_roughness", "vec4f", "Oriented world shading normal xyz, specular roughness w."], readonly ["positionDepth", "position_depth", "vec4f", "World position xyz, linear camera-forward depth w."], readonly ["geometricNormal", "geometric_normal", "vec4f", "Original unflipped geometric normal xyz, zero w."], readonly ["baseColorMetalness", "base_color_metalness", "vec4f", "Resolved base color; not a directional diffuse reflectance."], readonly ["transmission", "transmission", "vec4f", "Transmission color RGB, transmission weight w."], readonly ["roughnessIor", "roughness_ior", "vec4f", "Roughness xy, incident IOR z and transmitted IOR w."], readonly ["absorption", "absorption", "vec4f", "Medium extinction RGB and medium type w."], readonly ["identity", "identity", "vec4u", "Publication-local instance/primitive indices, thin-wall flag, validity."], readonly ["barycentricsFace", "barycentrics_face", "vec4f", "Barycentrics xy, front-face boolean z, resolved material index w."], readonly ["unclampedRadiance", "unclamped_radiance", "vec4f", "Radiance before per-sample clamping, alpha 1."], readonly ["rngState", "rng_state", "vec4u", "Final RNG words for reproducibility, opaque to consumers."], readonly ["rngDimensions", "rng_dimensions", "vec4u", "Counter, bounce, sample index and seed."], readonly ["diffuseAlbedo", "diffuse_albedo", "vec4f", "Directional reflectance RGB, zero w; REFLECTANCE validity is required."], readonly ["specularAlbedo", "specular_albedo", "vec4f", "Directional reflectance RGB, zero w; REFLECTANCE validity is required."]];
|
|
119
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { makeRayTraceUniform } from './wgpuSceneUniform.js';
|
|
2
|
+
const field = (name, words = 1) => [name, words];
|
|
3
|
+
function record(fields) {
|
|
4
|
+
let words = 0;
|
|
5
|
+
const offsets = {};
|
|
6
|
+
for (const [name, length] of fields) {
|
|
7
|
+
offsets[name] = words;
|
|
8
|
+
words += length;
|
|
9
|
+
}
|
|
10
|
+
offsets.WORDS = words;
|
|
11
|
+
return offsets;
|
|
12
|
+
}
|
|
13
|
+
// One source for native wire records, resource identities and shared WebGPU
|
|
14
|
+
// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.
|
|
15
|
+
export const WORD_BYTES = 4;
|
|
16
|
+
export const protocolVersions = { SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3, TARGET_PACKET: 4, GEOMETRY_KERNELS: 1 };
|
|
17
|
+
export function sceneRecords() {
|
|
18
|
+
return {
|
|
19
|
+
HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),
|
|
20
|
+
field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),
|
|
21
|
+
field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),
|
|
22
|
+
field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),
|
|
23
|
+
field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),
|
|
24
|
+
GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),
|
|
25
|
+
field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),
|
|
26
|
+
MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),
|
|
27
|
+
MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),
|
|
28
|
+
field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),
|
|
29
|
+
field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),
|
|
30
|
+
field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),
|
|
31
|
+
TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),
|
|
32
|
+
field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),
|
|
33
|
+
LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),
|
|
34
|
+
field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),
|
|
35
|
+
CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),
|
|
36
|
+
field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),
|
|
37
|
+
field('RESERVED', 3), field('TRANSFORM', 16)]),
|
|
38
|
+
BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),
|
|
39
|
+
EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),
|
|
40
|
+
SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),
|
|
41
|
+
field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),
|
|
42
|
+
field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'), field('CAUSTIC_FLAGS'), field('LIGHT_PHOTONS'), field('PHOTON_MAP_PHOTONS'), field('PHOTON_MAP_RADIUS')]),
|
|
43
|
+
WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),
|
|
44
|
+
GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),
|
|
45
|
+
GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),
|
|
46
|
+
PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),
|
|
47
|
+
PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export const resourceIds = {
|
|
51
|
+
AS_CHANGED_BLASES: 53,
|
|
52
|
+
BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,
|
|
53
|
+
COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,
|
|
54
|
+
BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,
|
|
55
|
+
HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,
|
|
56
|
+
DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,
|
|
57
|
+
PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,
|
|
58
|
+
SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55
|
|
59
|
+
};
|
|
60
|
+
export const packetKinds = { BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3 };
|
|
61
|
+
export const samplerIds = { MATERIAL: 40 };
|
|
62
|
+
export const textureFormats = { RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4 };
|
|
63
|
+
export const textureFormatInfo = [
|
|
64
|
+
{ id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4 }, { id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8 }, { id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16 },
|
|
65
|
+
{ id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4 }, { id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8 }
|
|
66
|
+
];
|
|
67
|
+
export const rounding = { rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true };
|
|
68
|
+
const buffer = (name, resource, binding, type) => ({ name, resource, kind: 'buffer', layout: { binding, visibility: 4, buffer: { type } } });
|
|
69
|
+
const texture = (name, resource, binding, array = false, filter = false) => ({ name, resource, kind: 'texture', layout: { binding, visibility: 4, texture: { viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float' } } });
|
|
70
|
+
export const bindGroups = [
|
|
71
|
+
{ name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),
|
|
72
|
+
buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')] },
|
|
73
|
+
{ name: 'TEXTURES', label: 'Textures', bindings: [
|
|
74
|
+
{ name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: { binding: 0, visibility: 4, sampler: {} } },
|
|
75
|
+
texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),
|
|
76
|
+
texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),
|
|
77
|
+
texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)
|
|
78
|
+
] },
|
|
79
|
+
{ name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')] },
|
|
80
|
+
{ name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')] }
|
|
81
|
+
];
|
|
82
|
+
export const hwrtBindings = { ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8 };
|
|
83
|
+
export function rayTraceBindGroupLayouts() {
|
|
84
|
+
return bindGroups.map(group => ({ label: group.label, entries: group.bindings.map(binding => binding.layout) }));
|
|
85
|
+
}
|
|
86
|
+
export function rayTraceUniformOffsets() {
|
|
87
|
+
const uniform = makeRayTraceUniform();
|
|
88
|
+
const rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) => [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));
|
|
89
|
+
rayTraceUniform.BYTES = uniform.buffer.byteLength;
|
|
90
|
+
return rayTraceUniform;
|
|
91
|
+
}
|
|
92
|
+
export const uniformSizes = { CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES };
|
|
93
|
+
// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.
|
|
94
|
+
export const framePixelFields = [
|
|
95
|
+
['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],
|
|
96
|
+
['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],
|
|
97
|
+
['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],
|
|
98
|
+
['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],
|
|
99
|
+
['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],
|
|
100
|
+
['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],
|
|
101
|
+
['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],
|
|
102
|
+
['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],
|
|
103
|
+
['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],
|
|
104
|
+
['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],
|
|
105
|
+
['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],
|
|
106
|
+
['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],
|
|
107
|
+
['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],
|
|
108
|
+
['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],
|
|
109
|
+
['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],
|
|
110
|
+
];
|
|
111
|
+
//# sourceMappingURL=sceneLayoutSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneLayoutSchema.js","sourceRoot":"","sources":["../../src/renderer/sceneLayoutSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import {makeRayTraceUniform} from './wgpuSceneUniform.js';\n\ntype Field = readonly [string, number];\nconst field = (name: string, words = 1): Field => [name, words];\nfunction record(fields: Field[]): Record<string, number> {\n let words = 0;\n const offsets: Record<string, number> = {};\n for (const [name, length] of fields) { offsets[name] = words; words += length; }\n offsets.WORDS = words;\n return offsets;\n}\n\n// One source for native wire records, resource identities and shared WebGPU\n// bindings. Descriptor offsets are u32 words; uniform offsets are bytes.\nexport const WORD_BYTES = 4;\nexport const protocolVersions = {SCENE: 4, RESOURCE_PACKET: 1, RESOURCE_WRITES: 3,TARGET_PACKET:4, GEOMETRY_KERNELS: 1};\nexport function sceneRecords() { return {\n HEADER: record([field('VERSION'), field('LENGTH'), field('WIDTH'), field('HEIGHT'),\n field('GEOMETRY_COUNT'), field('MESH_COUNT'), field('MATERIAL_COUNT'), field('LIGHT_COUNT'), field('TEXTURE_COUNT'),\n field('GEOMETRY_OFFSET'), field('MESH_OFFSET'), field('MATERIAL_OFFSET'), field('LIGHT_OFFSET'), field('TEXTURE_OFFSET'),\n field('CAMERA_OFFSET'), field('RESERVED'), field('BACKGROUND_COLOR', 4), field('ENVIRONMENT_TEXTURE'),\n field('BACKGROUND_TEXTURE'), field('QUALITY_FLAGS'), field('BATCH_OFFSET'), field('MESH_AOV_IDS'), field('MATERIAL_AOV_IDS'), field('ENVIRONMENT_SETTINGS'), field('GROUNDED_BACKGROUND'), field('RESERVED_END', 4)]),\n GEOMETRY: record([field('VERTEX_COUNT'), field('INDEX_COUNT'), field('POSITION'), field('INDICES'), field('NORMAL'),\n field('UV'), field('UV1'), field('COLOR'), field('TANGENT'), field('MATERIAL_INDEX'), field('RESERVED', 2)]),\n MESH: record([field('GEOMETRY'), field('MATERIAL'), field('MATERIAL_TABLE'), field('MATERIAL_COUNT'), field('TRANSFORM', 16)]),\n MATERIAL: record([field('BASE_COLOR', 3), field('ROUGHNESS'), field('METALNESS'), field('TRANSMISSION'), field('IOR'),\n field('EMISSION_COLOR', 3), field('EMISSION_LUMINANCE'), field('COAT_WEIGHT'), field('COAT_ROUGHNESS'), field('OPACITY'),\n field('THIN_WALLED'), field('MAP'), field('NORMAL_MAP'), field('METALLIC_ROUGHNESS_MAP'), field('EMISSIVE_MAP'),\n field('EXTENSION_COUNT'), field('EXTENSION_OFFSET'), field('RESERVED', 3)]),\n TEXTURE: record([field('WIDTH'), field('HEIGHT'), field('STORAGE'), field('PIXELS'), field('FLIP_Y'), field('UV_CHANNEL'),\n field('UV_SCALE', 2), field('UV_OFFSET', 2), field('WRAP_S'), field('WRAP_T')]),\n LIGHT: record([field('TYPE'), field('COLOR', 3), field('INTENSITY'), field('SIZE'), field('HEIGHT_OR_INNER'),\n field('SPREAD_OR_OUTER'), field('TEXTURE'), field('IES_OFFSET'), field('IES_BYTES'), field('RESERVED'), field('TRANSFORM', 16)]),\n CAMERA: record([field('PROJECTION'), field('FOV'), field('NEAR'), field('FAR'), field('LEFT'), field('RIGHT'), field('BOTTOM'),\n field('TOP'), field('ZOOM'), field('F_STOP'), field('FOCUS_DISTANCE'), field('SENSOR_HEIGHT'), field('METERS_PER_UNIT'),\n field('RESERVED', 3), field('TRANSFORM', 16)]),\n BATCH: record([field('COUNT'), field('TRANSFORMS'), field('COLORS'), field('RESERVED')]),\n EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),\n SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),\n field('BOUNCES', 2), field('DIRECT_LIGHT_CANDIDATES', 2), field('BEVEL_SAMPLES', 2), field('CLAMPING', 2),\n field('TRANSMISSIVE_ALPHA_MIN', 2), field('SEQUENCE_OFFSET'), field('VARIANTS'),field('CAUSTIC_FLAGS'),field('LIGHT_PHOTONS'),field('PHOTON_MAP_PHOTONS'),field('PHOTON_MAP_RADIUS')]),\n WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),\n GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),\n GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),\n PACKET_HEADER: record([field('VERSION'), field('COUNT'), field('WIDTH'), field('HEIGHT')]),\n PACKET_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('WIDTH'), field('HEIGHT'), field('LAYERS'), field('FORMAT'), field('BYTE_OFFSET')])\n};\n}\nexport const resourceIds = {\n AS_CHANGED_BLASES: 53,\n BVH: 1, INSTANCES: 2, ATTRIBUTES: 3, MATERIALS: 4, MAP_INFO: 5, CAMERA: 6, TRACE_UNIFORM: 7, LIGHT_UNIFORM: 8,\n COLOR: 10, NORMAL: 11, ALBEDO: 12, SHADOW_CATCHER: 13, ATLAS: 20, ENVIRONMENT: 21, ENVIRONMENT_CDF: 22,\n BACKGROUND: 23, LIGHT_SAMPLING: 24, ENERGY_LUT: 25, DISPLACEMENT: 26, SOFTWARE_SHADER: 30, METADATA: 31,\n HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,\n DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,\n PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,\n SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55\n};\nexport const packetKinds = {BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3};\nexport const samplerIds = {MATERIAL: 40};\nexport const textureFormats = {RGBA8_UNORM: 0, RGBA16_FLOAT: 1, RGBA32_FLOAT: 2, R32_FLOAT: 3, RG32_FLOAT: 4};\nexport const textureFormatInfo = [\n {id: textureFormats.RGBA8_UNORM, name: 'rgba8unorm', bytes: 4}, {id: textureFormats.RGBA16_FLOAT, name: 'rgba16float', bytes: 8}, {id: textureFormats.RGBA32_FLOAT, name: 'rgba32float', bytes: 16},\n {id: textureFormats.R32_FLOAT, name: 'r32float', bytes: 4}, {id: textureFormats.RG32_FLOAT, name: 'rg32float', bytes: 8}\n];\nexport const rounding = {rangeScale: 255, rangeShift: 8, rangeEpsilon: 1e-6, float32Product: true, float32Difference: true};\n\ninterface BindingSchema {name: string; resource: number; kind: 'buffer' | 'texture' | 'sampler'; layout: GPUBindGroupLayoutEntry}\nconst buffer = (name: string, resource: number, binding: number, type: GPUBufferBindingType): BindingSchema =>\n ({name, resource, kind: 'buffer', layout: {binding, visibility: 4, buffer: {type}}});\nconst texture = (name: string, resource: number, binding: number, array = false, filter = false): BindingSchema =>\n ({name, resource, kind: 'texture', layout: {binding, visibility: 4, texture: {viewDimension: array ? '2d-array' : '2d', sampleType: filter ? 'float' : 'unfilterable-float'}}});\nexport const bindGroups = [\n {name: 'SCENE', label: 'Buffers', bindings: [buffer('BVH', resourceIds.BVH, 0, 'read-only-storage'), buffer('INSTANCES', resourceIds.INSTANCES, 1, 'read-only-storage'),\n buffer('ATTRIBUTES', resourceIds.ATTRIBUTES, 2, 'read-only-storage'), buffer('MATERIALS', resourceIds.MATERIALS, 3, 'read-only-storage')]},\n {name: 'TEXTURES', label: 'Textures', bindings: [\n {name: 'SAMPLER', resource: samplerIds.MATERIAL, kind: 'sampler', layout: {binding: 0, visibility: 4, sampler: {}}} as BindingSchema,\n texture('ATLAS', resourceIds.ATLAS, 1, true, true), buffer('MAP_INFO', resourceIds.MAP_INFO, 3, 'uniform'), texture('ENVIRONMENT', resourceIds.ENVIRONMENT, 4),\n texture('ENVIRONMENT_CDF', resourceIds.ENVIRONMENT_CDF, 5), texture('BACKGROUND', resourceIds.BACKGROUND, 6), texture('LIGHT_SAMPLING', resourceIds.LIGHT_SAMPLING, 8),\n texture('ENERGY_LUT', resourceIds.ENERGY_LUT, 9), texture('DISPLACEMENT', resourceIds.DISPLACEMENT, 10)]},\n {name: 'FRAME', label: 'Uniforms', bindings: [buffer('CAMERA', resourceIds.CAMERA, 0, 'uniform'), buffer('TRACE_UNIFORM', resourceIds.TRACE_UNIFORM, 1, 'uniform'), buffer('LIGHT_UNIFORM', resourceIds.LIGHT_UNIFORM, 2, 'uniform')]},\n {name: 'OUTPUT', label: 'Ray Trace Out Buffers', bindings: [buffer('COLOR', resourceIds.COLOR, 0, 'storage'), buffer('NORMAL', resourceIds.NORMAL, 1, 'storage'), buffer('ALBEDO', resourceIds.ALBEDO, 2, 'storage'), buffer('SHADOW_CATCHER', resourceIds.SHADOW_CATCHER, 3, 'storage')]}\n];\nexport const hwrtBindings = {ACCELERATION: 4, INDICES: 5, DIAGNOSTIC: 7, PATH_PARAMETERS: 8};\nexport function rayTraceBindGroupLayouts(): GPUBindGroupLayoutDescriptor[] {\n return bindGroups.map(group => ({label: group.label, entries: group.bindings.map(binding => binding.layout)}));\n}\n\nexport function rayTraceUniformOffsets() {\nconst uniform = makeRayTraceUniform();\nconst rayTraceUniform = Object.fromEntries(Object.entries(uniform.views).map(([name, view]) =>\n [name.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z])([A-Z][a-z])/g, '$1_$2').toUpperCase(), view.byteOffset]));\nrayTraceUniform.BYTES = uniform.buffer.byteLength;\nreturn rayTraceUniform;\n}\nexport const uniformSizes = {CAMERA_BYTES: 144, LIGHT_BYTES: 64 * 6 * 4 * WORD_BYTES};\n\n// The primary-surface ABI, shared by the trace hook, resolve shader and Rust.\nexport const framePixelFields = [\n ['noisyColor', 'noisy_color', 'vec4f', 'Linear HDR radiance, alpha 1.'],\n ['normalRoughness', 'normal_roughness', 'vec4f', 'Oriented world shading normal xyz, specular roughness w.'],\n ['positionDepth', 'position_depth', 'vec4f', 'World position xyz, linear camera-forward depth w.'],\n ['geometricNormal', 'geometric_normal', 'vec4f', 'Original unflipped geometric normal xyz, zero w.'],\n ['baseColorMetalness', 'base_color_metalness', 'vec4f', 'Resolved base color; not a directional diffuse reflectance.'],\n ['transmission', 'transmission', 'vec4f', 'Transmission color RGB, transmission weight w.'],\n ['roughnessIor', 'roughness_ior', 'vec4f', 'Roughness xy, incident IOR z and transmitted IOR w.'],\n ['absorption', 'absorption', 'vec4f', 'Medium extinction RGB and medium type w.'],\n ['identity', 'identity', 'vec4u', 'Publication-local instance/primitive indices, thin-wall flag, validity.'],\n ['barycentricsFace', 'barycentrics_face', 'vec4f', 'Barycentrics xy, front-face boolean z, resolved material index w.'],\n ['unclampedRadiance', 'unclamped_radiance', 'vec4f', 'Radiance before per-sample clamping, alpha 1.'],\n ['rngState', 'rng_state', 'vec4u', 'Final RNG words for reproducibility, opaque to consumers.'],\n ['rngDimensions', 'rng_dimensions', 'vec4u', 'Counter, bounce, sample index and seed.'],\n ['diffuseAlbedo', 'diffuse_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n ['specularAlbedo', 'specular_albedo', 'vec4f', 'Directional reflectance RGB, zero w; REFLECTANCE validity is required.'],\n] as const;\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { SceneLight } from '../scene/Scene.js';
|
|
2
|
-
import {
|
|
1
|
+
import type { SceneLight } from '../scene/Scene.js';
|
|
2
|
+
import type { EnvironmentSource } from './envMapDistribution.js';
|
|
3
3
|
/** Synthesized environment data is retained across analytic-light edits. */
|
|
4
4
|
export declare class SceneEnvironmentCache {
|
|
5
5
|
private _snapshot;
|
|
6
6
|
private _image?;
|
|
7
|
-
update(lights: readonly SceneLight[]):
|
|
7
|
+
update(lights: readonly SceneLight[]): EnvironmentSource | undefined;
|
|
8
8
|
}
|
|
9
9
|
/** Captures values before callers mutate a RectLight or its Texture in place. */
|
|
10
10
|
export declare class RectLightTextureTracker {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,
|
|
1
|
+
{"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,CAAqB;IACnC,MAAM,CAAC,MAA6B;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,+EAA+E;QAC/E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,uBAAuB;IAC1B,SAAS,GAAc,EAAE,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IAC5B,MAAM,CAAC,MAA6B;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK;YACzF,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAsB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["import type { SceneLight } from '../scene/Scene.js';\nimport { snapshotFields, snapshotsEqual } from './sceneChangeDetector.js';\nimport { generateEnvMapFromSceneComponents } from './envMapCreation.js';\nimport type { EnvironmentSource } from './envMapDistribution.js';\nimport Texture from '../scene/Texture.js';\n\n/** Synthesized environment data is retained across analytic-light edits. */\nexport class SceneEnvironmentCache {\n private _snapshot: unknown[][] = [];\n private _image?: EnvironmentSource;\n update(lights: readonly SceneLight[]) {\n const ambient = lights.filter(light => light.type === 'AmbientLight');\n const environment = lights.filter(light => light.type === 'EnvironmentLight');\n // Orientation changes only the shader directions, not the radiance or its CDF.\n const next = [...ambient.map(snapshotFields), ...environment.map(light =>\n [light, light.map, light.map.image, light.map.version, light.map.source, light.intensity])];\n if (next.length !== this._snapshot.length ||\n next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {\n this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;\n this._snapshot = next;\n }\n return this._image;\n }\n}\n\n/** Captures values before callers mutate a RectLight or its Texture in place. */\nexport class RectLightTextureTracker {\n private _snapshot: unknown[] = [];\n private _hadTexture = false;\n update(lights: readonly SceneLight[]) {\n const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);\n const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,\n texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined]);\n const hasTexture = textures.some((texture): texture is Texture => !!texture);\n const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);\n this._snapshot = next;\n this._hadTexture = hasTexture;\n return changed;\n }\n}\n"]}
|