@meimu/mutracer 0.3.0 → 0.3.1
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/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +29 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/viewer.md +11 -1
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +12 -6
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.js +2 -2
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +2 -2
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
- 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.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +21 -14
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -2
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export declare const
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/** Backend bounds on configured scattering depth and total path-loop events. */
|
|
2
|
+
export declare const MAX_PATH_EVENTS_WGPU = 50;
|
|
3
|
+
export declare const MAX_PATH_EVENTS_WEBGL = 20;
|
|
4
|
+
/** Round and clamp depth; the legacy/native default stays 20. NaN selects 1. */
|
|
5
|
+
export declare function normalizeBounces(bounces: number, maxPathEvents?: number): number;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
/** Backend bounds on configured scattering depth and total path-loop events. */
|
|
2
|
+
export const MAX_PATH_EVENTS_WGPU = 50;
|
|
3
|
+
export const MAX_PATH_EVENTS_WEBGL = 20;
|
|
4
|
+
/** Round and clamp depth; the legacy/native default stays 20. NaN selects 1. */
|
|
5
|
+
export function normalizeBounces(bounces, maxPathEvents = MAX_PATH_EVENTS_WEBGL) {
|
|
6
|
+
return Math.min(maxPathEvents, Math.max(1, Number.isNaN(bounces) ? 1 : Math.round(bounces)));
|
|
6
7
|
}
|
|
7
8
|
//# sourceMappingURL=pathLimits.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathLimits.js","sourceRoot":"","sources":["../../src/renderer/pathLimits.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"pathLimits.js","sourceRoot":"","sources":["../../src/renderer/pathLimits.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,aAAa,GAAG,qBAAqB;IACrF,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC","sourcesContent":["/** Backend bounds on configured scattering depth and total path-loop events. */\nexport const MAX_PATH_EVENTS_WGPU = 50;\nexport const MAX_PATH_EVENTS_WEBGL = 20;\n\n/** Round and clamp depth; the legacy/native default stays 20. NaN selects 1. */\nexport function normalizeBounces(bounces: number, maxPathEvents = MAX_PATH_EVENTS_WEBGL): number {\n return Math.min(maxPathEvents, Math.max(1, Number.isNaN(bounces) ? 1 : Math.round(bounces)));\n}\n"]}
|
|
@@ -45,8 +45,10 @@ export declare function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry): {
|
|
|
45
45
|
export declare function meshBlasSnapshotIsCurrent(mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>): boolean;
|
|
46
46
|
export declare function updateMeshInstances(meshes: Mesh[], options?: {
|
|
47
47
|
displacement?: boolean;
|
|
48
|
+
mergeAttributes?: boolean;
|
|
48
49
|
}): {
|
|
49
50
|
geometry: Geometry;
|
|
51
|
+
mergedAttributes: boolean;
|
|
50
52
|
geometries: Geometry[];
|
|
51
53
|
geometryRegions: Map<Geometry, {
|
|
52
54
|
vertexOffset: number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { materialNeedsVertexTangents } from './tangentRequirements.js';
|
|
1
2
|
import { isProceduralSkyImage } from '../scene/skyParameters.js';
|
|
2
3
|
import { prepareSceneMeshes, computeGeometryNormals } from './scenePreparation.js';
|
|
3
4
|
import InstancedMesh from '../scene/InstancedMesh.js';
|
|
@@ -10,6 +11,7 @@ import Geometry from '../scene/Geometry.js';
|
|
|
10
11
|
import { buildBLAS } from './bvhAccel.js';
|
|
11
12
|
import { isTextureDataSource } from '../scene/Texture.js';
|
|
12
13
|
import { generateVertexTangents } from '../util/geometry.js';
|
|
14
|
+
import { getBvhBounds } from './geometryBvhBounds.js';
|
|
13
15
|
export { getBvhBounds } from './geometryBvhBounds.js';
|
|
14
16
|
export { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';
|
|
15
17
|
/** Returns the first material used for CPU displacement. */
|
|
@@ -166,7 +168,7 @@ export function ensureMeshGeometryAttributes(meshes) {
|
|
|
166
168
|
continue;
|
|
167
169
|
if (!geometry.normal)
|
|
168
170
|
computeGeometryNormals(geometry);
|
|
169
|
-
if (!geometry.tangent && geometry.uv)
|
|
171
|
+
if (!geometry.tangent && geometry.uv && materials.some(materialNeedsVertexTangents))
|
|
170
172
|
generateVertexTangents(geometry);
|
|
171
173
|
}
|
|
172
174
|
}
|
|
@@ -174,7 +176,7 @@ function getMeshBlasGeometry(mesh, displacement = true) {
|
|
|
174
176
|
const geometry = displacement ? getPreparedMeshGeometry(mesh) : mesh.geometry;
|
|
175
177
|
if (!geometry.normal)
|
|
176
178
|
computeGeometryNormals(geometry);
|
|
177
|
-
if (!geometry.tangent && geometry.uv)
|
|
179
|
+
if (!geometry.tangent && geometry.uv && mesh.materials.some(materialNeedsVertexTangents))
|
|
178
180
|
generateVertexTangents(geometry);
|
|
179
181
|
return geometry;
|
|
180
182
|
}
|
|
@@ -232,7 +234,7 @@ function prepareMeshGeometryBvh(mesh, displacement = true) {
|
|
|
232
234
|
return { geometry, displacementScale };
|
|
233
235
|
}
|
|
234
236
|
export function updateMeshInstances(meshes, options = {}) {
|
|
235
|
-
return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false));
|
|
237
|
+
return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false), getBvhBounds, true, options.mergeAttributes !== false);
|
|
236
238
|
}
|
|
237
239
|
export { dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices } from './scenePreparation.js';
|
|
238
240
|
/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"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","sourcesContent":["import { isProceduralSkyImage } from '../scene/skyParameters.js';\nimport { prepareSceneMeshes, computeGeometryNormals, type PreparedMeshInstanceBinding as SharedInstanceBinding } from './scenePreparation.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { displacementBaseGeometry, computeDisplacementMinmax, computeTrianglesDisplacementRange, conservativeTrianglesDisplacementRange } from './displacementPreparation.js';\nexport { sphericalProjectionTriangle, triplanarProjectionTriangle } from './displacementPreparation.js';\nimport Geometry from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS } from './bvhAccel.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents } from '../util/geometry.js';\n\nexport { getBvhBounds } from './geometryBvhBounds.js';\n\nexport { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';\nexport type PreparedMeshInstanceBinding = SharedInstanceBinding<Mesh>;\n\n/** Returns the first material used for CPU displacement. */\nexport function getMeshDisplacementMaterial(mesh: Mesh) {\n return mesh.materials[0];\n}\n\nexport function getMeshDisplacementMap(mesh: Mesh) {\n // Not support multiple materials for displacement.\n const material = getMeshDisplacementMaterial(mesh);\n return material.displacementMap;\n}\n\nexport function getMeshDisplacementScale(mesh: Mesh) {\n return mesh.materials[0].displacementScale;\n}\n\nconst preparedGeometryCache = new WeakMap<Geometry, Map<string, Geometry>>();\nlet displacementTextureId = 1;\nconst displacementTextureIds = new WeakMap<object, number>();\n\nfunction getDisplacementResourceId(identity: object) {\n let id = displacementTextureIds.get(identity);\n if (id == null) {\n id = displacementTextureId++;\n displacementTextureIds.set(identity, id);\n }\n return id;\n}\n\nexport function getDisplacementTextureDataCacheKey(texture: Texture) {\n const image = texture.image;\n return [\n getDisplacementResourceId(texture.source ?? texture),\n getDisplacementResourceId(image),\n texture.version,\n image.width,\n image.height\n ].join('|');\n}\n\nconst displacementMinmaxCache = new Map<string, Uint8Array[]>();\n\nexport function getPreparedMeshGeometryCacheKey(mesh: Mesh) {\n const source = mesh.geometry;\n const material = getMeshDisplacementMaterial(mesh);\n const texture = material?.displacementMap;\n if (!material) return undefined;\n // UV and procedural displacement both need height-aware BLAS bounds and\n // packed triangle ranges. Never reuse the source's undisplaced tree, or a\n // different material's height field, when a texture/scale changes.\n const scale = getMeshDisplacementScale(mesh);\n if (texture && (scale !== 0 || material.displacementBias !== 0)) {\n return ['displacement', source.version, getDisplacementTextureDataCacheKey(texture),\n +texture.flipY, texture.uvScale.join(','), texture.uvOffset.join(','), texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace,\n scale, material.displacementBias, material.displacementUvProjectionScale, material.displacementUvProjection].join('|');\n }\n return undefined;\n}\n\nexport function getCachedPreparedMeshGeometry(mesh: Mesh) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n const cached = preparedGeometryCache.get(mesh.geometry)?.get(key);\n if (!cached) {\n const geometry = new Geometry(mesh.geometry);\n geometry.dynamic = mesh.geometry.dynamic;\n geometry.version = mesh.geometry.version;\n return cachePreparedMeshGeometry(mesh, geometry);\n }\n return cached;\n}\n\nexport function cachePreparedMeshGeometry(mesh: Mesh, generated: Geometry) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n let entries = preparedGeometryCache.get(mesh.geometry);\n if (!entries) {\n entries = new Map();\n preparedGeometryCache.set(mesh.geometry, entries);\n }\n if (entries.size >= 4 && !entries.has(key)) entries.clear();\n entries.set(key, generated);\n return generated;\n}\n\n/** Returns cached prepared geometry, or the source while asynchronous preparation is pending. */\nexport function getPreparedMeshGeometry(mesh: Mesh) {\n return getCachedPreparedMeshGeometry(mesh) ?? mesh.geometry;\n}\n\nexport function computeMinmaxCPU(\n _geometry: Geometry,\n heightImage: Texture['image']\n) {\n const w = heightImage.width;\n let heightPixels: ArrayLike<number>;\n let sourceChannels: number;\n let normalizeHeight: (value: number) => number;\n if (isTextureDataSource(heightImage)) {\n heightPixels = heightImage.data;\n sourceChannels = Math.max(\n 1,\n Math.floor(heightImage.data.length / (heightImage.width * heightImage.height))\n );\n const normalized =\n heightImage.data instanceof Uint8Array ||\n heightImage.data instanceof Uint8ClampedArray;\n normalizeHeight = normalized\n ? (value) => value\n : (value) => Math.round(Math.min(Math.max(value, 0), 1) * 255);\n } else {\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) throw new Error('The displacement texture is not CPU-readable.');\n canvas.width = w;\n canvas.height = w;\n if (isProceduralSkyImage(heightImage)) throw new Error('ProceduralSky is only supported as an environment or background.');\n ctx.drawImage(heightImage, 0, 0, w, w);\n heightPixels = ctx.getImageData(0, 0, w, w).data;\n sourceChannels = 4;\n normalizeHeight = (value) => value;\n }\n return computeDisplacementMinmax(w, sourceChannels, index => normalizeHeight(heightPixels[index]));\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indexArray;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!heightTexture) return;\n if (!uvs && uvProjection === 'none') {\n throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.'\n );\n }\n const heightImage = heightTexture.image;\n const isFlipY = heightTexture.flipY;\n if (!heightImage.width || !heightImage.height) {\n return;\n }\n const triangleCount = indices.length / 3;\n // Dense meshes retain the shared conservative full-height prism path.\n const conservative = conservativeTrianglesDisplacementRange(triangleCount);\n if (conservative) return conservative;\n const minmaxCacheKey =\n getDisplacementTextureDataCacheKey(heightTexture);\n let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);\n if (!minmaxData) {\n minmaxData = computeMinmaxCPU(geometry, heightImage);\n if (displacementMinmaxCache.size >= 4) {\n displacementMinmaxCache.delete(\n displacementMinmaxCache.keys().next().value!\n );\n }\n displacementMinmaxCache.set(minmaxCacheKey, minmaxData);\n }\n\n return computeTrianglesDisplacementRange(geometry, minmaxData, heightImage.width, isFlipY, material);\n}\n\nconst warnedDirectionGeometry = new WeakSet<Geometry>();\n\n/** Prepare auto-generated source attributes before the renderer captures array identities. */\nexport function ensureMeshGeometryAttributes(meshes: readonly Mesh[]) {\n for (const { geometry, materials } of meshes) {\n if (!geometry.tangent && !warnedDirectionGeometry.has(geometry) && materials.some(m => m.anisotropyMap || m.specularAnisotropyRotation !== 0 || m.coatAnisotropyRotation !== 0 || (m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0))) {\n console.warn('MuTracer: anisotropy direction has no vertex tangent; deriving a frame from the selected UV set with a stable fallback for degenerate UVs.');\n warnedDirectionGeometry.add(geometry);\n }\n if (!geometry.position?.array.length) continue;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n }\n}\n\nfunction getMeshBlasGeometry(mesh: Mesh, displacement = true) {\n const geometry = displacement ? getPreparedMeshGeometry(mesh) : mesh.geometry;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv) generateVertexTangents(geometry);\n return geometry;\n}\n\n/** Geometry and displacement inputs shared by synchronous and Worker BLAS builds. */\nexport function getMeshBlasInput(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const heightMap = getMeshDisplacementMap(mesh);\n const displacementScale = heightMap ? getMeshDisplacementScale(mesh) : 0;\n const trianglesDisplacement = displacementScale !== 0\n ? getTrianglesDisplacementRange(geometry, heightMap, getMeshDisplacementMaterial(mesh))\n : undefined;\n // Build bounds around a normal-offset base while retaining original vertex\n // attributes for texture coordinates and shading. This same input works for\n // built-in, TinyBVH and Worker builds; the shader offsets its base identically.\n const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;\n return { geometry: displacementBaseGeometry(geometry, bias), displacementScale, trianglesDisplacement };\n}\n\n/** Whether a static mesh still needs a BLAS before it can be rendered. */\nexport function meshNeedsStaticBvh(mesh: Mesh, config?: BvhBuildConfig) {\n return !!mesh.geometry.position?.array.length && !mesh.geometry.dynamic &&\n (!getGeometryBvh(getPreparedMeshGeometry(mesh)) || !!config && !geometryBvhConfigMatches(getPreparedMeshGeometry(mesh), config));\n}\n\n/** Capture inputs whose changes invalidate an asynchronous BLAS result. */\nexport function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry) {\n const displacementMap = getMeshDisplacementMap(mesh);\n return {\n geometry: mesh.geometry,\n version: mesh.geometry.version,\n cacheKey: getPreparedMeshGeometryCacheKey(mesh),\n bvh: getGeometryBvh(target),\n displacementMap,\n displacementScale: getMeshDisplacementScale(mesh),\n displacementTextureKey: displacementMap\n ? getDisplacementTextureDataCacheKey(displacementMap) : undefined\n };\n}\n\n/** Check that a result still belongs to the captured mesh inputs. */\nexport function meshBlasSnapshotIsCurrent(\n mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>\n) {\n return mesh.geometry === snapshot.geometry && mesh.geometry.version === snapshot.version &&\n getPreparedMeshGeometryCacheKey(mesh) === snapshot.cacheKey && getGeometryBvh(target) === snapshot.bvh &&\n getMeshDisplacementMap(mesh) === snapshot.displacementMap &&\n getMeshDisplacementScale(mesh) === snapshot.displacementScale &&\n (!snapshot.displacementMap || getDisplacementTextureDataCacheKey(snapshot.displacementMap) ===\n snapshot.displacementTextureKey);\n}\n\nfunction prepareMeshGeometryBvh(mesh: Mesh, displacement = true) {\n const geometry = getMeshBlasGeometry(mesh, displacement);\n const displacementScale = displacement && getMeshDisplacementMap(mesh) ? getMeshDisplacementScale(mesh) : 0;\n if (geometry.dynamic && getGeometryBvh(geometry)?.builder !== 'builtin') setGeometryBvh(geometry, undefined);\n if (!getGeometryBvh(geometry)) {\n const input = displacement ? getMeshBlasInput(mesh) : { geometry, displacementScale, trianglesDisplacement: undefined };\n setGeometryBvh(geometry, buildBLAS(input.geometry, input.displacementScale, input.trianglesDisplacement));\n }\n return { geometry, displacementScale };\n}\n\nexport function updateMeshInstances(meshes: Mesh[], options: { displacement?: boolean } = {}) {\n return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false));\n}\n\nexport {dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices} from './scenePreparation.js';\n\n/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */\nexport function updateMeshInstanceColors(bindings: PreparedMeshInstanceBinding[], instances: MeshInstances, meshes: ReadonlySet<Mesh>) {\n const dirty = new Set<number>();\n if (Array.isArray(instances)) return dirty;\n let sourceStart = 0, packedIndex = 0;\n for (const {mesh} of bindings) {\n const count = meshInstanceCount(mesh), sourceEnd = sourceStart + count;\n while (packedIndex < instances.length && instances.sourceIndices[packedIndex] < sourceEnd) {\n if (meshes.has(mesh)) {\n const localIndex = instances.sourceIndices[packedIndex] - sourceStart;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) instances.colors[packedIndex * 3 + k] = colors?.[localIndex * 3 + k] ?? 1;\n dirty.add(packedIndex);\n }\n packedIndex++;\n }\n sourceStart = sourceEnd;\n }\n return dirty;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"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","sourcesContent":["import {materialNeedsVertexTangents} from './tangentRequirements.js';\nimport { isProceduralSkyImage } from '../scene/skyParameters.js';\nimport { prepareSceneMeshes, computeGeometryNormals, type PreparedMeshInstanceBinding as SharedInstanceBinding } from './scenePreparation.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { displacementBaseGeometry, computeDisplacementMinmax, computeTrianglesDisplacementRange, conservativeTrianglesDisplacementRange } from './displacementPreparation.js';\nexport { sphericalProjectionTriangle, triplanarProjectionTriangle } from './displacementPreparation.js';\nimport Geometry from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS } from './bvhAccel.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents } from '../util/geometry.js';\n\nimport { getBvhBounds } from './geometryBvhBounds.js';\nexport { getBvhBounds } from './geometryBvhBounds.js';\n\nexport { computeBounds, updateMeshInstanceTransforms } from './scenePreparation.js';\nexport type PreparedMeshInstanceBinding = SharedInstanceBinding<Mesh>;\n\n/** Returns the first material used for CPU displacement. */\nexport function getMeshDisplacementMaterial(mesh: Mesh) {\n return mesh.materials[0];\n}\n\nexport function getMeshDisplacementMap(mesh: Mesh) {\n // Not support multiple materials for displacement.\n const material = getMeshDisplacementMaterial(mesh);\n return material.displacementMap;\n}\n\nexport function getMeshDisplacementScale(mesh: Mesh) {\n return mesh.materials[0].displacementScale;\n}\n\nconst preparedGeometryCache = new WeakMap<Geometry, Map<string, Geometry>>();\nlet displacementTextureId = 1;\nconst displacementTextureIds = new WeakMap<object, number>();\n\nfunction getDisplacementResourceId(identity: object) {\n let id = displacementTextureIds.get(identity);\n if (id == null) {\n id = displacementTextureId++;\n displacementTextureIds.set(identity, id);\n }\n return id;\n}\n\nexport function getDisplacementTextureDataCacheKey(texture: Texture) {\n const image = texture.image;\n return [\n getDisplacementResourceId(texture.source ?? texture),\n getDisplacementResourceId(image),\n texture.version,\n image.width,\n image.height\n ].join('|');\n}\n\nconst displacementMinmaxCache = new Map<string, Uint8Array[]>();\n\nexport function getPreparedMeshGeometryCacheKey(mesh: Mesh) {\n const source = mesh.geometry;\n const material = getMeshDisplacementMaterial(mesh);\n const texture = material?.displacementMap;\n if (!material) return undefined;\n // UV and procedural displacement both need height-aware BLAS bounds and\n // packed triangle ranges. Never reuse the source's undisplaced tree, or a\n // different material's height field, when a texture/scale changes.\n const scale = getMeshDisplacementScale(mesh);\n if (texture && (scale !== 0 || material.displacementBias !== 0)) {\n return ['displacement', source.version, getDisplacementTextureDataCacheKey(texture),\n +texture.flipY, texture.uvScale.join(','), texture.uvOffset.join(','), texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace,\n scale, material.displacementBias, material.displacementUvProjectionScale, material.displacementUvProjection].join('|');\n }\n return undefined;\n}\n\nexport function getCachedPreparedMeshGeometry(mesh: Mesh) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n const cached = preparedGeometryCache.get(mesh.geometry)?.get(key);\n if (!cached) {\n const geometry = new Geometry(mesh.geometry);\n geometry.dynamic = mesh.geometry.dynamic;\n geometry.version = mesh.geometry.version;\n return cachePreparedMeshGeometry(mesh, geometry);\n }\n return cached;\n}\n\nexport function cachePreparedMeshGeometry(mesh: Mesh, generated: Geometry) {\n const key = getPreparedMeshGeometryCacheKey(mesh);\n if (key == null) return mesh.geometry;\n let entries = preparedGeometryCache.get(mesh.geometry);\n if (!entries) {\n entries = new Map();\n preparedGeometryCache.set(mesh.geometry, entries);\n }\n if (entries.size >= 4 && !entries.has(key)) entries.clear();\n entries.set(key, generated);\n return generated;\n}\n\n/** Returns cached prepared geometry, or the source while asynchronous preparation is pending. */\nexport function getPreparedMeshGeometry(mesh: Mesh) {\n return getCachedPreparedMeshGeometry(mesh) ?? mesh.geometry;\n}\n\nexport function computeMinmaxCPU(\n _geometry: Geometry,\n heightImage: Texture['image']\n) {\n const w = heightImage.width;\n let heightPixels: ArrayLike<number>;\n let sourceChannels: number;\n let normalizeHeight: (value: number) => number;\n if (isTextureDataSource(heightImage)) {\n heightPixels = heightImage.data;\n sourceChannels = Math.max(\n 1,\n Math.floor(heightImage.data.length / (heightImage.width * heightImage.height))\n );\n const normalized =\n heightImage.data instanceof Uint8Array ||\n heightImage.data instanceof Uint8ClampedArray;\n normalizeHeight = normalized\n ? (value) => value\n : (value) => Math.round(Math.min(Math.max(value, 0), 1) * 255);\n } else {\n const canvas = createCanvas();\n const ctx = canvas.getContext('2d') as CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D | null;\n if (!ctx) throw new Error('The displacement texture is not CPU-readable.');\n canvas.width = w;\n canvas.height = w;\n if (isProceduralSkyImage(heightImage)) throw new Error('ProceduralSky is only supported as an environment or background.');\n ctx.drawImage(heightImage, 0, 0, w, w);\n heightPixels = ctx.getImageData(0, 0, w, w).data;\n sourceChannels = 4;\n normalizeHeight = (value) => value;\n }\n return computeDisplacementMinmax(w, sourceChannels, index => normalizeHeight(heightPixels[index]));\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indexArray;\n const uvs = geometry.uv?.array;\n const uvProjection = material.displacementUvProjection;\n if (!heightTexture) return;\n if (!uvs && uvProjection === 'none') {\n throw new Error(\n 'UV displacement requires texture coordinates; use triplanar, spherical, or cylindrical projection for a UV-less mesh.'\n );\n }\n const heightImage = heightTexture.image;\n const isFlipY = heightTexture.flipY;\n if (!heightImage.width || !heightImage.height) {\n return;\n }\n const triangleCount = indices.length / 3;\n // Dense meshes retain the shared conservative full-height prism path.\n const conservative = conservativeTrianglesDisplacementRange(triangleCount);\n if (conservative) return conservative;\n const minmaxCacheKey =\n getDisplacementTextureDataCacheKey(heightTexture);\n let minmaxData = displacementMinmaxCache.get(minmaxCacheKey);\n if (!minmaxData) {\n minmaxData = computeMinmaxCPU(geometry, heightImage);\n if (displacementMinmaxCache.size >= 4) {\n displacementMinmaxCache.delete(\n displacementMinmaxCache.keys().next().value!\n );\n }\n displacementMinmaxCache.set(minmaxCacheKey, minmaxData);\n }\n\n return computeTrianglesDisplacementRange(geometry, minmaxData, heightImage.width, isFlipY, material);\n}\n\nconst warnedDirectionGeometry = new WeakSet<Geometry>();\n\n/** Prepare auto-generated source attributes before the renderer captures array identities. */\nexport function ensureMeshGeometryAttributes(meshes: readonly Mesh[]) {\n for (const { geometry, materials } of meshes) {\n if (!geometry.tangent && !warnedDirectionGeometry.has(geometry) && materials.some(m => m.anisotropyMap || m.specularAnisotropyRotation !== 0 || m.coatAnisotropyRotation !== 0 || (m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0))) {\n console.warn('MuTracer: anisotropy direction has no vertex tangent; deriving a frame from the selected UV set with a stable fallback for degenerate UVs.');\n warnedDirectionGeometry.add(geometry);\n }\n if (!geometry.position?.array.length) continue;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv && materials.some(materialNeedsVertexTangents)) generateVertexTangents(geometry);\n }\n}\n\nfunction getMeshBlasGeometry(mesh: Mesh, displacement = true) {\n const geometry = displacement ? getPreparedMeshGeometry(mesh) : mesh.geometry;\n if (!geometry.normal) computeGeometryNormals(geometry);\n if (!geometry.tangent && geometry.uv && mesh.materials.some(materialNeedsVertexTangents)) generateVertexTangents(geometry);\n return geometry;\n}\n\n/** Geometry and displacement inputs shared by synchronous and Worker BLAS builds. */\nexport function getMeshBlasInput(mesh: Mesh) {\n const geometry = getMeshBlasGeometry(mesh);\n const heightMap = getMeshDisplacementMap(mesh);\n const displacementScale = heightMap ? getMeshDisplacementScale(mesh) : 0;\n const trianglesDisplacement = displacementScale !== 0\n ? getTrianglesDisplacementRange(geometry, heightMap, getMeshDisplacementMaterial(mesh))\n : undefined;\n // Build bounds around a normal-offset base while retaining original vertex\n // attributes for texture coordinates and shading. This same input works for\n // built-in, TinyBVH and Worker builds; the shader offsets its base identically.\n const bias = heightMap ? getMeshDisplacementMaterial(mesh).displacementBias : 0;\n return { geometry: displacementBaseGeometry(geometry, bias), displacementScale, trianglesDisplacement };\n}\n\n/** Whether a static mesh still needs a BLAS before it can be rendered. */\nexport function meshNeedsStaticBvh(mesh: Mesh, config?: BvhBuildConfig) {\n return !!mesh.geometry.position?.array.length && !mesh.geometry.dynamic &&\n (!getGeometryBvh(getPreparedMeshGeometry(mesh)) || !!config && !geometryBvhConfigMatches(getPreparedMeshGeometry(mesh), config));\n}\n\n/** Capture inputs whose changes invalidate an asynchronous BLAS result. */\nexport function captureMeshBlasSnapshot(mesh: Mesh, target: Geometry) {\n const displacementMap = getMeshDisplacementMap(mesh);\n return {\n geometry: mesh.geometry,\n version: mesh.geometry.version,\n cacheKey: getPreparedMeshGeometryCacheKey(mesh),\n bvh: getGeometryBvh(target),\n displacementMap,\n displacementScale: getMeshDisplacementScale(mesh),\n displacementTextureKey: displacementMap\n ? getDisplacementTextureDataCacheKey(displacementMap) : undefined\n };\n}\n\n/** Check that a result still belongs to the captured mesh inputs. */\nexport function meshBlasSnapshotIsCurrent(\n mesh: Mesh, target: Geometry, snapshot: ReturnType<typeof captureMeshBlasSnapshot>\n) {\n return mesh.geometry === snapshot.geometry && mesh.geometry.version === snapshot.version &&\n getPreparedMeshGeometryCacheKey(mesh) === snapshot.cacheKey && getGeometryBvh(target) === snapshot.bvh &&\n getMeshDisplacementMap(mesh) === snapshot.displacementMap &&\n getMeshDisplacementScale(mesh) === snapshot.displacementScale &&\n (!snapshot.displacementMap || getDisplacementTextureDataCacheKey(snapshot.displacementMap) ===\n snapshot.displacementTextureKey);\n}\n\nfunction prepareMeshGeometryBvh(mesh: Mesh, displacement = true) {\n const geometry = getMeshBlasGeometry(mesh, displacement);\n const displacementScale = displacement && getMeshDisplacementMap(mesh) ? getMeshDisplacementScale(mesh) : 0;\n if (geometry.dynamic && getGeometryBvh(geometry)?.builder !== 'builtin') setGeometryBvh(geometry, undefined);\n if (!getGeometryBvh(geometry)) {\n const input = displacement ? getMeshBlasInput(mesh) : { geometry, displacementScale, trianglesDisplacement: undefined };\n setGeometryBvh(geometry, buildBLAS(input.geometry, input.displacementScale, input.trianglesDisplacement));\n }\n return { geometry, displacementScale };\n}\n\nexport function updateMeshInstances(meshes: Mesh[], options: { displacement?: boolean; mergeAttributes?: boolean } = {}) {\n return prepareSceneMeshes(meshes, mesh => prepareMeshGeometryBvh(mesh, options.displacement !== false), getBvhBounds, true, options.mergeAttributes !== false);\n}\n\nexport {dirtyPreparedInstanceIndices as dirtyMeshInstanceIndices} from './scenePreparation.js';\n\n/** Refreshes color storage without computing transforms or bounds. Returns packed source slots. */\nexport function updateMeshInstanceColors(bindings: PreparedMeshInstanceBinding[], instances: MeshInstances, meshes: ReadonlySet<Mesh>) {\n const dirty = new Set<number>();\n if (Array.isArray(instances)) return dirty;\n let sourceStart = 0, packedIndex = 0;\n for (const {mesh} of bindings) {\n const count = meshInstanceCount(mesh), sourceEnd = sourceStart + count;\n while (packedIndex < instances.length && instances.sourceIndices[packedIndex] < sourceEnd) {\n if (meshes.has(mesh)) {\n const localIndex = instances.sourceIndices[packedIndex] - sourceStart;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) instances.colors[packedIndex * 3 + k] = colors?.[localIndex * 3 + k] ?? 1;\n dirty.add(packedIndex);\n }\n packedIndex++;\n }\n sourceStart = sourceEnd;\n }\n return dirty;\n}\n"]}
|
|
@@ -12,7 +12,7 @@ export function loopImageState(render, display) {
|
|
|
12
12
|
return JSON.stringify([
|
|
13
13
|
render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),
|
|
14
14
|
render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,
|
|
15
|
-
render.aovs, render.aovSamples,
|
|
15
|
+
render.aovs, render.aovSamples, render.aovResolution,
|
|
16
16
|
display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,
|
|
17
17
|
display.contrast, display.saturation, display.temperature, display.tint, display.vignette,
|
|
18
18
|
display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,mEAAmE;AACnE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAG/G,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"progressiveScheduler.js","sourceRoot":"","sources":["../../src/renderer/progressiveScheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,IAAI,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,mEAAmE;AACnE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAG/G,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,OAAgB,EAAE,MAAe,EAAE,GAAW,EAAE,MAAc;IAC5H,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACtH,OAAO,EAAC,eAAe,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,GAAG,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,EAAC,CAAC;AAC3I,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS;QACpF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,aAAa;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,mBAAmB;QAC7F,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ;QACzF,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB;QAC7F,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QACvE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc;KAChG,CAAC,CAAC;AACL,CAAC","sourcesContent":["export {displayAovKind as aovChannel} from './aovDisplay.js';\nimport type Render from '../Render.js';\nimport type Display from '../Display.js';\nimport { traceSchema } from '../settings/render.js';\n\n// Every setting that changes the traced image, including caustics.\nconst imageFields = Object.values(traceSchema).filter(field => field.kind === 'image').map(field => field.key);\n\nexport interface ProgressiveState { previousChanged: boolean; lastContinuousChange: number; changing: boolean; }\n/** Pure consecutive-edit policy; isolated changes start final immediately. */\nexport function updateProgressiveState(state: ProgressiveState, changed: boolean, active: boolean, now: number, idleMs: number): ProgressiveState {\n const lastContinuousChange = active ? -Infinity : changed && state.previousChanged ? now : state.lastContinuousChange;\n return {previousChanged: changed && !active, lastContinuousChange, changing: active || now - lastContinuousChange < Math.max(0, idleMs)};\n}\n\n/** Public state used to leave a finished canvas idle while still noticing settings edits. */\nexport function loopImageState(render: Render, display: Display): string {\n return JSON.stringify([\n render.samples, render.width, render.height, render.maxSamples, imageFields.map(key => render[key]),\n render.resolutionScale, render.adaptiveResolution, render.denoiser, render.denoising,\n render.aovs, render.aovSamples, render.aovResolution,\n display.canvas.width, display.canvas.height, display.toneMapping, display.toneMappingExposure,\n display.contrast, display.saturation, display.temperature, display.tint, display.vignette,\n display.bloomIntensity, display.bloomThreshold, display.bloomRadius, display.hdrOutputEnabled,\n display.channel, display.shadowCatcherColor, display.shadowCatcherAlpha,\n display.aovDepthRange, display.aovPositionScale, display.aovMotionScale, display.aovIdComponent,\n ]);\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SurfaceHit } from './surfaceHit.js';
|
|
1
2
|
import type { ScratchPool } from './ScratchPool.js';
|
|
2
3
|
import type Camera from '../scene/Camera.js';
|
|
3
4
|
import type { Scene } from '../scene/Scene.js';
|
|
@@ -8,6 +9,7 @@ import type { TargetPipeline } from './accumulationTarget.js';
|
|
|
8
9
|
export interface TraceSettings {
|
|
9
10
|
aovs?: readonly import('./aov.js').AovKind[];
|
|
10
11
|
aovSamples?: number;
|
|
12
|
+
aovResolution?: 'render' | 'display';
|
|
11
13
|
transmissiveOutputAlphaMin: number;
|
|
12
14
|
bounces: number;
|
|
13
15
|
clamping: number;
|
|
@@ -49,6 +51,7 @@ export interface RenderPipeline {
|
|
|
49
51
|
setBackground: SceneResources['setBackground'];
|
|
50
52
|
setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];
|
|
51
53
|
readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;
|
|
54
|
+
pickSurface?(camera: Camera, x: number, y: number): Promise<SurfaceHit | null | undefined>;
|
|
52
55
|
getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;
|
|
53
56
|
dispose(): void;
|
|
54
57
|
}
|
|
@@ -56,5 +59,6 @@ export interface RenderPipeline {
|
|
|
56
59
|
export declare function makeRenderPipeline(scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {
|
|
57
60
|
setCamera(camera: Camera): void;
|
|
58
61
|
readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;
|
|
62
|
+
pickSurface?: SceneResources['pickSurface'];
|
|
59
63
|
setBounce(bounces: number): boolean;
|
|
60
64
|
}, create: () => TargetPipeline, webgl?: boolean, scratch?: ScratchPool): RenderPipeline;
|
|
@@ -39,6 +39,7 @@ export function makeRenderPipeline(scene, create, webgl = false, scratch) {
|
|
|
39
39
|
},
|
|
40
40
|
setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),
|
|
41
41
|
async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },
|
|
42
|
+
async pickSurface(camera, x, y) { scene.setCamera(camera); return scene.pickSurface?.(x, y, camera.aspect); },
|
|
42
43
|
getDiagnostics() {
|
|
43
44
|
return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({ label: t.label, ...t.getMemory() })) };
|
|
44
45
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderPipeline.js","sourceRoot":"","sources":["../../src/renderer/renderPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {SurfaceHit} from './surfaceHit.js';\nimport type {ScratchPool} from './ScratchPool.js';\nimport type Camera from '../scene/Camera.js';\nimport type { Scene } from '../scene/Scene.js';\nimport type { SceneResources, AlphaBlendStrategy, ToneMappingParams, DisplayChannel } from './RenderingPipeline.js';\nimport type { SamplingPattern } from './sampling.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\n\n/** Immutable execution settings restored before every operation on a target. */\nexport interface TraceSettings {\n aovs?: readonly import('./aov.js').AovKind[]; aovSamples?: number; aovResolution?: 'render' | 'display';\n transmissiveOutputAlphaMin: number;\n bounces: number; clamping: number; bevel: boolean; bevelSamples: number;\n dispersionWavelengths: 1 | 3; directLightCandidates: number;\n caustics?: import('../Render.js').CausticSettings;\n alphaBlendStrategy: AlphaBlendStrategy; samplingPattern: SamplingPattern; maxSamples: number;\n timeBudgetMs: number; maxTiles: number; batchSamples: boolean;\n}\nexport interface DisplaySettings {\n toneMapping: ToneMappingParams;\n bloom: { intensity: number; threshold: number; radius: number };\n hdrOutputEnabled: boolean; channel: DisplayChannel;\n shadowCatcherColor: [number, number, number]; shadowCatcherAlpha: number;\n}\nexport interface RenderTarget extends TargetPipeline {\n readonly label: string;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n}\nexport interface RenderPipeline {\n getSharedMemoryBytes(): number;\n createTarget(label: string): RenderTarget;\n releaseTarget(target: RenderTarget): void;\n setMeshes: SceneResources['setMeshes'];\n setLights: SceneResources['setLights'];\n setBackground: SceneResources['setBackground'];\n setTextureAtlasBudget: SceneResources['setTextureAtlasBudget'];\n readDepthSamples(camera: Camera, area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n pickSurface?(camera: Camera, x: number, y: number): Promise<SurfaceHit | null | undefined>;\n getDiagnostics(): ReturnType<SceneResources['getDiagnostics']>;\n dispose(): void;\n}\n\n/** Shared scene ownership; every image operation explicitly selects its target. */\nexport function makeRenderPipeline(\n scene: Pick<RenderPipeline, 'setMeshes' | 'setLights' | 'setBackground' | 'setTextureAtlasBudget' | 'getDiagnostics' | 'dispose'> & {\n setCamera(camera: Camera): void;\n readDepthSamples(area: Parameters<SceneResources['readDepthSamples']>[0], aspect?: number): ReturnType<SceneResources['readDepthSamples']>;\n pickSurface?: SceneResources['pickSurface'];\n setBounce(bounces: number): boolean;\n },\n create: () => TargetPipeline,\n webgl = false,\n scratch?: ScratchPool\n): RenderPipeline {\n const targets = new Set<RenderTarget>();\n const settings = new Map<RenderTarget, TraceSettings>();\n let latest: RenderTarget | undefined;\n let background: Scene['background'];\n return {\n getSharedMemoryBytes: () => scratch?.getMemoryBytes() ?? 0,\n createTarget(label) {\n const backend = create();\n const target: RenderTarget = {\n ...backend,\n get presentationComplete() { return backend.presentationComplete; },\n get presentationDenoised() { return backend.presentationDenoised; },\n label,\n configure(options) { settings.set(target, { ...options }); backend.configure(options); },\n activate() {\n latest = target;\n if (webgl) scene.setBounce(Math.max(1, ...Array.from(settings.values(), s => s.bounces)));\n backend.activate();\n }\n };\n target.synchronizeBackground(background);\n targets.add(target);\n return target;\n },\n releaseTarget(target) { if (targets.delete(target)) { settings.delete(target); target.dispose(); } },\n setMeshes: (meshes, update) => scene.setMeshes(meshes, update),\n setLights: lights => scene.setLights(lights),\n setBackground(value) {\n background = value; scene.setBackground(value);\n for (const target of targets) target.synchronizeBackground(value);\n },\n setTextureAtlasBudget: bytes => scene.setTextureAtlasBudget(bytes),\n async readDepthSamples(camera, area) { scene.setCamera(camera); return scene.readDepthSamples(area, camera.aspect); },\n async pickSurface(camera, x, y) {scene.setCamera(camera); return scene.pickSurface?.(x, y, camera.aspect);},\n getDiagnostics() {\n return { ...scene.getDiagnostics(), ...latest?.getDiagnostics(), targets: Array.from(targets, t => ({label: t.label, ...t.getMemory()})) };\n },\n dispose() { for (const target of targets) target.dispose(); targets.clear(); settings.clear(); scene.dispose(); scratch?.dispose(); }\n };\n}\n"]}
|
|
@@ -22,7 +22,7 @@ export interface ResearchTransport {
|
|
|
22
22
|
compute(options: object): ResearchShaderParts;
|
|
23
23
|
fragment(options: readonly unknown[]): ResearchShaderParts;
|
|
24
24
|
constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;
|
|
25
|
-
configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;
|
|
25
|
+
configure(pass: object, backend: 'webgpu' | 'webgl', disabled?: boolean): ResearchPassState;
|
|
26
26
|
prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;
|
|
27
27
|
capture(pass: object): void;
|
|
28
28
|
dispose(pass: object, backend: 'webgpu' | 'webgl'): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"researchTransport.js","sourceRoot":"","sources":["../../src/renderer/researchTransport.ts"],"names":[],"mappings":"AA+BA,IAAI,SAAwC,CAAC;AAC7C,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,KAAoC,IAAU,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5G,MAAM,UAAU,iBAAiB,KAAoC,OAAO,SAAS,CAAC,CAAC,CAAC","sourcesContent":["import type {ShaderMixin} from './shader.js';\n\n/** Optional transport experiment. Production entry points never import its implementation. */\nexport interface ResearchShaderParts {\n enabled: boolean;\n maxDepth: number;\n debugGroup: number;\n declarations: string;\n contribution: string;\n debugOutput: string;\n mixin?: ShaderMixin;\n fragments?: Record<string, string>;\n}\nexport interface ResearchPassState {\n debugGroup: number;\n enabled: boolean;\n key: string;\n workgroupSize: number;\n features: object;\n uniform: object;\n}\nexport interface ResearchTransport {\n compute(options: object): ResearchShaderParts;\n fragment(options: readonly unknown[]): ResearchShaderParts;\n constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;\n configure(pass: object, backend: 'webgpu' | 'webgl'): ResearchPassState;\n prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;\n capture(pass: object): void;\n dispose(pass: object, backend: 'webgpu' | 'webgl'): void;\n packUniform(data: ArrayBuffer, options: object): void;\n}\nlet extension: ResearchTransport | undefined;\n/** @internal Registers an explicitly imported experiment; call before allocating renders. */\nexport function registerResearchTransport(value: ResearchTransport | undefined): void { extension = value; }\nexport function researchTransport(): ResearchTransport | undefined { return extension; }\n"]}
|
|
1
|
+
{"version":3,"file":"researchTransport.js","sourceRoot":"","sources":["../../src/renderer/researchTransport.ts"],"names":[],"mappings":"AA+BA,IAAI,SAAwC,CAAC;AAC7C,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CAAC,KAAoC,IAAU,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAC5G,MAAM,UAAU,iBAAiB,KAAoC,OAAO,SAAS,CAAC,CAAC,CAAC","sourcesContent":["import type {ShaderMixin} from './shader.js';\n\n/** Optional transport experiment. Production entry points never import its implementation. */\nexport interface ResearchShaderParts {\n enabled: boolean;\n maxDepth: number;\n debugGroup: number;\n declarations: string;\n contribution: string;\n debugOutput: string;\n mixin?: ShaderMixin;\n fragments?: Record<string, string>;\n}\nexport interface ResearchPassState {\n debugGroup: number;\n enabled: boolean;\n key: string;\n workgroupSize: number;\n features: object;\n uniform: object;\n}\nexport interface ResearchTransport {\n compute(options: object): ResearchShaderParts;\n fragment(options: readonly unknown[]): ResearchShaderParts;\n constants(constants: Record<string, boolean | number>, features: object): Record<string, boolean | number>;\n configure(pass: object, backend: 'webgpu' | 'webgl', disabled?: boolean): ResearchPassState;\n prepare(pass: object, backend: 'webgpu' | 'webgl', lighting?: unknown): void;\n capture(pass: object): void;\n dispose(pass: object, backend: 'webgpu' | 'webgl'): void;\n packUniform(data: ArrayBuffer, options: object): void;\n}\nlet extension: ResearchTransport | undefined;\n/** @internal Registers an explicitly imported experiment; call before allocating renders. */\nexport function registerResearchTransport(value: ResearchTransport | undefined): void { extension = value; }\nexport function researchTransport(): ResearchTransport | undefined { return extension; }\n"]}
|
|
@@ -19,7 +19,7 @@ export declare function writeTraceQuality(views: TraceViews, options: {
|
|
|
19
19
|
bevel: boolean;
|
|
20
20
|
dispersionWavelengths: 1 | 3;
|
|
21
21
|
directLightCandidates: number;
|
|
22
|
-
}): void;
|
|
22
|
+
}, maxPathEvents?: number): void;
|
|
23
23
|
export declare function traceSampling(pattern: SamplingPattern, maxSamples: number, sequenceSeed: number): {
|
|
24
24
|
code: number;
|
|
25
25
|
logSPP: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { retainedShaderCapacity } from './shaderCapacity.js';
|
|
2
2
|
import { packWgpuAnalyticLights } from './wgpuSceneUniform.js';
|
|
3
|
-
import { normalizeBounces } from './pathLimits.js';
|
|
3
|
+
import { normalizeBounces, MAX_PATH_EVENTS_WEBGL } from './pathLimits.js';
|
|
4
4
|
import { normalizeDirectLightCandidates, DEFAULT_BEVEL_SAMPLES } from './renderingLimits.js';
|
|
5
5
|
import { samplingPatternCode, zSobolLog2SPP } from './sampling.js';
|
|
6
6
|
import { LightChoiceBuffer, buildLightAliasTable, buildShadowCatcherLightAliasTable, estimateAnalyticLightPower, packEmissiveTriangles, packIESProfiles, LIGHT_CHOICE_ENVIRONMENT, LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_DOMAIN_ENVIRONMENT, LIGHT_DOMAIN_INFINITE, LIGHT_DOMAIN_LOCAL_AND_EMISSIVE } from './lightSampling.js';
|
|
@@ -26,8 +26,9 @@ export function sceneTraversalConstants(tlas, blas, previous = {}) {
|
|
|
26
26
|
return { TLAS_STACK_SIZE: retainedShaderCapacity(tlas, Number(previous.TLAS_STACK_SIZE ?? 0)),
|
|
27
27
|
BLAS_STACK_SIZE: retainedShaderCapacity(blas, Number(previous.BLAS_STACK_SIZE ?? 0), 32) };
|
|
28
28
|
}
|
|
29
|
-
export function writeTraceQuality(views, options) {
|
|
30
|
-
|
|
29
|
+
export function writeTraceQuality(views, options, maxPathEvents = MAX_PATH_EVENTS_WEBGL) {
|
|
30
|
+
// The AOT caller retains its existing 20-event contract; WebGPU opts into 50.
|
|
31
|
+
views.bounces[0] = normalizeBounces(options.bounces, maxPathEvents);
|
|
31
32
|
views.bevel[0] = Number(options.bevel);
|
|
32
33
|
views.dispersionWavelengths[0] = options.dispersionWavelengths;
|
|
33
34
|
views.directLightCandidates[0] = normalizeDirectLightCandidates(options.directLightCandidates);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneAssembly.js","sourceRoot":"","sources":["../../src/renderer/sceneAssembly.ts"],"names":[],"mappings":"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","sourcesContent":["import type Geometry from '../scene/Geometry.js';\nimport type {AnalyticLightState} from '../scene/lightState.js';\nimport {retainedShaderCapacity} from './shaderCapacity.js';\nimport {makeRayTraceUniform, packWgpuAnalyticLights} from './wgpuSceneUniform.js';\nimport {normalizeBounces} from './pathLimits.js';\nimport {normalizeDirectLightCandidates, DEFAULT_BEVEL_SAMPLES} from './renderingLimits.js';\nimport {samplingPatternCode, zSobolLog2SPP, type SamplingPattern} from './sampling.js';\nimport {LightChoiceBuffer, buildLightAliasTable, buildShadowCatcherLightAliasTable, estimateAnalyticLightPower, packEmissiveTriangles, packIESProfiles,\n LIGHT_CHOICE_ENVIRONMENT, LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE,\n LIGHT_DOMAIN_ENVIRONMENT, LIGHT_DOMAIN_INFINITE, LIGHT_DOMAIN_LOCAL_AND_EMISSIVE,\n type EmissiveTriangle} from './lightSampling.js';\n\ntype TraceViews = ReturnType<typeof makeRayTraceUniform>['views'];\n\nexport function initialSceneConstants(): Record<string, boolean | number> {\n return {USE_BACKGROUND: false, USE_BACKGROUND_MAP: false, USE_GROUNDED_BACKGROUND: false,\n SAMPLING_PATTERN: 0, BEVEL_SAMPLES: DEFAULT_BEVEL_SAMPLES};\n}\n\nexport function sceneAttributeLayout(geometry: Geometry) {\n const names = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\n const offsets: number[] = [];\n const constants: Record<string, boolean | number> = {USE_UV: geometry.uv != null, USE_VERTEX_COLOR: geometry.color != null};\n let stride = 0;\n for (const name of names) {\n offsets.push(stride); constants[name.toUpperCase() + '_OFF'] = stride / 4;\n if (geometry[name]) stride += 4;\n }\n constants.ATTR_STRIDE = stride / 4;\n return {stride, offsets, constants};\n}\n\nexport function sceneTraversalConstants(tlas: number, blas: number, previous: Record<string, boolean | number> = {}) {\n return {TLAS_STACK_SIZE: retainedShaderCapacity(tlas, Number(previous.TLAS_STACK_SIZE ?? 0)),\n BLAS_STACK_SIZE: retainedShaderCapacity(blas, Number(previous.BLAS_STACK_SIZE ?? 0), 32)};\n}\n\nexport function writeTraceQuality(views: TraceViews, options: {bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number}) {\n views.bounces[0] = normalizeBounces(options.bounces);\n views.bevel[0] = Number(options.bevel);\n views.dispersionWavelengths[0] = options.dispersionWavelengths;\n views.directLightCandidates[0] = normalizeDirectLightCandidates(options.directLightCandidates);\n}\n\nexport function traceSampling(pattern: SamplingPattern, maxSamples: number, sequenceSeed: number) {\n const code = samplingPatternCode(pattern);\n return {code, logSPP: zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples), seed: sequenceSeed >>> 0};\n}\nexport function writeTraceSampling(views: TraceViews, sampling: ReturnType<typeof traceSampling>) {\n views.sequenceSeed[0] = sampling.seed; views.zSobolLogSPP[0] = sampling.logSPP;\n}\n\n// The Web path may reuse its choice/texture scratch allocations. Native consumes\n// exactly the same assembly without a GPU device, canvas or browser light facade.\nexport function prepareSceneLightSampling(lights: AnalyticLightState[], emissive: EmissiveTriangle[], environmentPower: number,\n maxDimension: number, choices = new LightChoiceBuffer(), scratch?: Float32Array, catcherChoices?: LightChoiceBuffer) {\n choices.reserve(1 + lights.length + emissive.length);\n choices.push(LIGHT_CHOICE_ENVIRONMENT, 0, environmentPower);\n for (let i = 0; i < lights.length; i++) choices.push(LIGHT_CHOICE_ANALYTIC, i, estimateAnalyticLightPower(lights[i]));\n for (let i = 0; i < emissive.length; i++) choices.push(LIGHT_CHOICE_EMISSIVE_TRIANGLE, i, emissive[i].area * emissive[i].samplingLuminance);\n const distribution = buildLightAliasTable(choices);\n // Without emissive triangles the catcher shares the main table; otherwise\n // its own table follows the main choices in the texture.\n const catcherDistribution = buildShadowCatcherLightAliasTable(choices, catcherChoices);\n const shadowCatcherChoiceOffset = catcherDistribution ? choices.count : 0;\n const shadowCatcherChoiceCount = catcherDistribution ? catcherDistribution.pmfs.length : choices.count;\n const domains = {environment: {count: 0, weight: 0, pmf: 0}, infinite: {count: 0, weight: 0, pmf: 0}, localAndEmissive: {count: 0, weight: 0, pmf: 0}};\n const domainList = [domains.environment, domains.infinite, domains.localAndEmissive];\n const analyticPmfs = new Array<number>(lights.length).fill(0);\n let environmentPmf = 0;\n for (let i = 0; i < choices.count; i++) {\n const type = choices.sourceTypes[i], source = choices.sourceIndices[i], pmf = distribution.pmfs[i];\n const domainIndex = type === LIGHT_CHOICE_ENVIRONMENT ? LIGHT_DOMAIN_ENVIRONMENT :\n type === LIGHT_CHOICE_ANALYTIC && lights[source]?.type === 'DirectionalLight' ? LIGHT_DOMAIN_INFINITE : LIGHT_DOMAIN_LOCAL_AND_EMISSIVE;\n const domain = domainList[domainIndex]; domain.count++; domain.weight += choices.weights[i]; domain.pmf += pmf;\n if (type === LIGHT_CHOICE_ENVIRONMENT) environmentPmf = pmf;\n else if (type === LIGHT_CHOICE_ANALYTIC) analyticPmfs[source] = pmf;\n else emissive[source].selectionPmf = pmf;\n }\n const choiceTexels = Math.max(choices.count + (catcherDistribution ? shadowCatcherChoiceCount : 0), 1);\n const emissiveTexels = emissive.length * 6, profileStart = emissiveTexels + choiceTexels;\n const profiles = packIESProfiles(lights, profileStart), totalTexels = Math.max(profileStart + profiles.texelCount, 1);\n const width = Math.min(maxDimension, Math.max(16, Math.ceil(Math.sqrt(totalTexels) / 16) * 16));\n const height = Math.ceil(totalTexels / width);\n if (height > maxDimension) throw new Error('Too many emissive triangles for the light sampling texture.');\n const lightData = scratch?.length === width * height * 4 ? scratch : new Float32Array(width * height * 4);\n lightData.fill(0);\n if (emissive.length) packEmissiveTriangles(emissive, lightData);\n new Uint32Array(lightData.buffer).set(distribution.choices, emissiveTexels * 4);\n if (catcherDistribution && shadowCatcherChoiceCount) {\n new Uint32Array(lightData.buffer).set(catcherDistribution.choices, (emissiveTexels + choices.count) * 4);\n }\n lightData.set(profiles.data, profileStart * 4);\n return {lightData, lightWidth: width, lightHeight: height, analyticPmfs, profiles, environmentPmf,\n choiceCount: choices.count, totalWeight: distribution.totalWeight, emissiveTexels, domains,\n shadowCatcherChoiceOffset, shadowCatcherChoiceCount};\n}\n\nexport function writeTraceLighting(views: TraceViews, data: {environmentPmf: number; choiceCount: number; totalWeight: number; lightWidth: number; emissiveTexels: number;\n shadowCatcherChoiceOffset: number; shadowCatcherChoiceCount: number}) {\n views.envLightPmf[0] = data.environmentPmf; views.lightChoiceCount[0] = data.choiceCount;\n views.shadowCatcherChoiceOffset[0] = data.shadowCatcherChoiceOffset; views.shadowCatcherChoiceCount[0] = data.shadowCatcherChoiceCount;\n views.lightWeightTotal[0] = data.totalWeight; views.lightSamplingTextureWidth[0] = data.lightWidth;\n views.lightChoiceTexelOffset[0] = data.emissiveTexels;\n}\n\nexport function packSceneAnalyticLights(lights: AnalyticLightState[], textureIndices: number[], pmfs: number[], profileOffset: (index: number) => number) {\n return packWgpuAnalyticLights(lights, textureIndices, pmfs, profileOffset);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sceneAssembly.js","sourceRoot":"","sources":["../../src/renderer/sceneAssembly.ts"],"names":[],"mappings":"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","sourcesContent":["import type Geometry from '../scene/Geometry.js';\nimport type {AnalyticLightState} from '../scene/lightState.js';\nimport {retainedShaderCapacity} from './shaderCapacity.js';\nimport {makeRayTraceUniform, packWgpuAnalyticLights} from './wgpuSceneUniform.js';\nimport {normalizeBounces, MAX_PATH_EVENTS_WEBGL} from './pathLimits.js';\nimport {normalizeDirectLightCandidates, DEFAULT_BEVEL_SAMPLES} from './renderingLimits.js';\nimport {samplingPatternCode, zSobolLog2SPP, type SamplingPattern} from './sampling.js';\nimport {LightChoiceBuffer, buildLightAliasTable, buildShadowCatcherLightAliasTable, estimateAnalyticLightPower, packEmissiveTriangles, packIESProfiles,\n LIGHT_CHOICE_ENVIRONMENT, LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE,\n LIGHT_DOMAIN_ENVIRONMENT, LIGHT_DOMAIN_INFINITE, LIGHT_DOMAIN_LOCAL_AND_EMISSIVE,\n type EmissiveTriangle} from './lightSampling.js';\n\ntype TraceViews = ReturnType<typeof makeRayTraceUniform>['views'];\n\nexport function initialSceneConstants(): Record<string, boolean | number> {\n return {USE_BACKGROUND: false, USE_BACKGROUND_MAP: false, USE_GROUNDED_BACKGROUND: false,\n SAMPLING_PATTERN: 0, BEVEL_SAMPLES: DEFAULT_BEVEL_SAMPLES};\n}\n\nexport function sceneAttributeLayout(geometry: Geometry) {\n const names = ['position', 'normal', 'uv', 'uv1', 'color', 'tangent', 'materialIndex'] as const;\n const offsets: number[] = [];\n const constants: Record<string, boolean | number> = {USE_UV: geometry.uv != null, USE_VERTEX_COLOR: geometry.color != null};\n let stride = 0;\n for (const name of names) {\n offsets.push(stride); constants[name.toUpperCase() + '_OFF'] = stride / 4;\n if (geometry[name]) stride += 4;\n }\n constants.ATTR_STRIDE = stride / 4;\n return {stride, offsets, constants};\n}\n\nexport function sceneTraversalConstants(tlas: number, blas: number, previous: Record<string, boolean | number> = {}) {\n return {TLAS_STACK_SIZE: retainedShaderCapacity(tlas, Number(previous.TLAS_STACK_SIZE ?? 0)),\n BLAS_STACK_SIZE: retainedShaderCapacity(blas, Number(previous.BLAS_STACK_SIZE ?? 0), 32)};\n}\n\nexport function writeTraceQuality(views: TraceViews, options: {bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number}, maxPathEvents = MAX_PATH_EVENTS_WEBGL) {\n // The AOT caller retains its existing 20-event contract; WebGPU opts into 50.\n views.bounces[0] = normalizeBounces(options.bounces, maxPathEvents);\n views.bevel[0] = Number(options.bevel);\n views.dispersionWavelengths[0] = options.dispersionWavelengths;\n views.directLightCandidates[0] = normalizeDirectLightCandidates(options.directLightCandidates);\n}\n\nexport function traceSampling(pattern: SamplingPattern, maxSamples: number, sequenceSeed: number) {\n const code = samplingPatternCode(pattern);\n return {code, logSPP: zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples), seed: sequenceSeed >>> 0};\n}\nexport function writeTraceSampling(views: TraceViews, sampling: ReturnType<typeof traceSampling>) {\n views.sequenceSeed[0] = sampling.seed; views.zSobolLogSPP[0] = sampling.logSPP;\n}\n\n// The Web path may reuse its choice/texture scratch allocations. Native consumes\n// exactly the same assembly without a GPU device, canvas or browser light facade.\nexport function prepareSceneLightSampling(lights: AnalyticLightState[], emissive: EmissiveTriangle[], environmentPower: number,\n maxDimension: number, choices = new LightChoiceBuffer(), scratch?: Float32Array, catcherChoices?: LightChoiceBuffer) {\n choices.reserve(1 + lights.length + emissive.length);\n choices.push(LIGHT_CHOICE_ENVIRONMENT, 0, environmentPower);\n for (let i = 0; i < lights.length; i++) choices.push(LIGHT_CHOICE_ANALYTIC, i, estimateAnalyticLightPower(lights[i]));\n for (let i = 0; i < emissive.length; i++) choices.push(LIGHT_CHOICE_EMISSIVE_TRIANGLE, i, emissive[i].area * emissive[i].samplingLuminance);\n const distribution = buildLightAliasTable(choices);\n // Without emissive triangles the catcher shares the main table; otherwise\n // its own table follows the main choices in the texture.\n const catcherDistribution = buildShadowCatcherLightAliasTable(choices, catcherChoices);\n const shadowCatcherChoiceOffset = catcherDistribution ? choices.count : 0;\n const shadowCatcherChoiceCount = catcherDistribution ? catcherDistribution.pmfs.length : choices.count;\n const domains = {environment: {count: 0, weight: 0, pmf: 0}, infinite: {count: 0, weight: 0, pmf: 0}, localAndEmissive: {count: 0, weight: 0, pmf: 0}};\n const domainList = [domains.environment, domains.infinite, domains.localAndEmissive];\n const analyticPmfs = new Array<number>(lights.length).fill(0);\n let environmentPmf = 0;\n for (let i = 0; i < choices.count; i++) {\n const type = choices.sourceTypes[i], source = choices.sourceIndices[i], pmf = distribution.pmfs[i];\n const domainIndex = type === LIGHT_CHOICE_ENVIRONMENT ? LIGHT_DOMAIN_ENVIRONMENT :\n type === LIGHT_CHOICE_ANALYTIC && lights[source]?.type === 'DirectionalLight' ? LIGHT_DOMAIN_INFINITE : LIGHT_DOMAIN_LOCAL_AND_EMISSIVE;\n const domain = domainList[domainIndex]; domain.count++; domain.weight += choices.weights[i]; domain.pmf += pmf;\n if (type === LIGHT_CHOICE_ENVIRONMENT) environmentPmf = pmf;\n else if (type === LIGHT_CHOICE_ANALYTIC) analyticPmfs[source] = pmf;\n else emissive[source].selectionPmf = pmf;\n }\n const choiceTexels = Math.max(choices.count + (catcherDistribution ? shadowCatcherChoiceCount : 0), 1);\n const emissiveTexels = emissive.length * 6, profileStart = emissiveTexels + choiceTexels;\n const profiles = packIESProfiles(lights, profileStart), totalTexels = Math.max(profileStart + profiles.texelCount, 1);\n const width = Math.min(maxDimension, Math.max(16, Math.ceil(Math.sqrt(totalTexels) / 16) * 16));\n const height = Math.ceil(totalTexels / width);\n if (height > maxDimension) throw new Error('Too many emissive triangles for the light sampling texture.');\n const lightData = scratch?.length === width * height * 4 ? scratch : new Float32Array(width * height * 4);\n lightData.fill(0);\n if (emissive.length) packEmissiveTriangles(emissive, lightData);\n new Uint32Array(lightData.buffer).set(distribution.choices, emissiveTexels * 4);\n if (catcherDistribution && shadowCatcherChoiceCount) {\n new Uint32Array(lightData.buffer).set(catcherDistribution.choices, (emissiveTexels + choices.count) * 4);\n }\n lightData.set(profiles.data, profileStart * 4);\n return {lightData, lightWidth: width, lightHeight: height, analyticPmfs, profiles, environmentPmf,\n choiceCount: choices.count, totalWeight: distribution.totalWeight, emissiveTexels, domains,\n shadowCatcherChoiceOffset, shadowCatcherChoiceCount};\n}\n\nexport function writeTraceLighting(views: TraceViews, data: {environmentPmf: number; choiceCount: number; totalWeight: number; lightWidth: number; emissiveTexels: number;\n shadowCatcherChoiceOffset: number; shadowCatcherChoiceCount: number}) {\n views.envLightPmf[0] = data.environmentPmf; views.lightChoiceCount[0] = data.choiceCount;\n views.shadowCatcherChoiceOffset[0] = data.shadowCatcherChoiceOffset; views.shadowCatcherChoiceCount[0] = data.shadowCatcherChoiceCount;\n views.lightWeightTotal[0] = data.totalWeight; views.lightSamplingTextureWidth[0] = data.lightWidth;\n views.lightChoiceTexelOffset[0] = data.emissiveTexels;\n}\n\nexport function packSceneAnalyticLights(lights: AnalyticLightState[], textureIndices: number[], pmfs: number[], profileOffset: (index: number) => number) {\n return packWgpuAnalyticLights(lights, textureIndices, pmfs, profileOffset);\n}\n"]}
|
|
@@ -16,7 +16,7 @@ export interface SceneChanges {
|
|
|
16
16
|
/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */
|
|
17
17
|
export declare function snapshotFields(object: object): unknown[];
|
|
18
18
|
export declare function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]): boolean;
|
|
19
|
-
export declare function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]): (number | boolean | any[] | "
|
|
19
|
+
export declare function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]): (number | boolean | any[] | "r" | "g" | "b" | "a" | "openpbr" | "gltf" | "auto" | "opaque" | "mask" | "blend" | "alpha" | "transmission" | "none" | "triplanar" | "spherical" | "cylindrical")[];
|
|
20
20
|
/** Detects edits without accepting them until the pipeline has received the scene. */
|
|
21
21
|
export declare class SceneChangeDetector {
|
|
22
22
|
private _tracker;
|
|
@@ -102,7 +102,9 @@ const webAdapter = {
|
|
|
102
102
|
/** Detects edits without accepting them until the pipeline has received the scene. */
|
|
103
103
|
export class SceneChangeDetector {
|
|
104
104
|
_tracker = new SceneChangeTracker(webAdapter);
|
|
105
|
-
detect(scene) {
|
|
105
|
+
detect(scene) {
|
|
106
|
+
return this._tracker.detect(scene);
|
|
107
|
+
}
|
|
106
108
|
commit() { this._tracker.commit(); }
|
|
107
109
|
reset() { this._tracker.reset(); }
|
|
108
110
|
}
|
|
@@ -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 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"]}
|
|
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 {\n return this._tracker.detect(scene) as SceneChanges;\n }\n commit() { this._tracker.commit(); }\n reset() { this._tracker.reset(); }\n}\n"]}
|
|
@@ -39,7 +39,7 @@ export function sceneRecords() {
|
|
|
39
39
|
EXTENSION: record([field('ID'), field('X'), field('Y'), field('Z')]),
|
|
40
40
|
SETTINGS: record([field('STRUCT_SIZE'), field('SAMPLING_PATTERN'), field('SEED'), field('MAX_SAMPLES'),
|
|
41
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')]),
|
|
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'), field('TEXTURE_DIMENSION'), field('TEXTURE_BINDINGS'), field('TEXTURE_BUDGET_BYTES', 2)]),
|
|
43
43
|
WRITE_ENTRY: record([field('ID'), field('KIND'), field('LENGTH'), field('DESTINATION'), field('WIDTH'), field('HEIGHT'), field('FORMAT'), field('BYTE_OFFSET')]),
|
|
44
44
|
GEOMETRY_KERNEL_HEADER: record([field('VERSION'), field('COUNT'), field('LENGTH'), field('RESERVED')]),
|
|
45
45
|
GEOMETRY_KERNEL_ENTRY: record([field('SOURCE'), field('VERTEX_COUNT'), field('BOUNDS'), field('TANGENTS')]),
|
|
@@ -55,7 +55,7 @@ export const resourceIds = {
|
|
|
55
55
|
HWRT_SHADER: 33, HIT_SHADER: 34, INDICES: 35, SOFTWARE_PATH_SHADER: 36, HWRT_PATH_SHADER: 37,
|
|
56
56
|
DISPLACEMENT_BOUNDS: 38, SOFTWARE_HIT_SHADER: 39, PRIMITIVE_IDS: 40, AS_POSITIONS: 41, AS_INDICES: 42,
|
|
57
57
|
PATH_EVENTS: 50, PATH_PARAMETERS: 51, QUERY_COUNTS: 52,
|
|
58
|
-
SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55
|
|
58
|
+
SOFTWARE_FRAME_SHADER: 54, HWRT_FRAME_SHADER: 55, MATERIAL_TEXTURE_BASE: 1000
|
|
59
59
|
};
|
|
60
60
|
export const packetKinds = { BUFFER: 0, TEXTURE: 1, WGSL: 2, METADATA: 3 };
|
|
61
61
|
export const samplerIds = { MATERIAL: 40 };
|