@meimu/mutracer 0.1.3 → 0.1.4
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/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +4114 -4015
- package/docs/api.md +11 -9
- package/docs/threejs.md +30 -4
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +12 -6
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +7 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +40 -39
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +78 -78
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- 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 +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +93 -59
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- 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 +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- 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 +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepareMeshBVH.js","sourceRoot":"","sources":["../../src/renderer/prepareMeshBVH.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,EAAsB,MAAM,oBAAoB,CAAC;AACvH,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAuB,MAAM,kBAAkB,CAAC;AACjH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAQ,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,SAAS,EAAgB,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEzF,SAAS,qBAAqB,CAAC,QAAkB;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1C,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,IAAI,MAAM,EAAE,CAAC;QACrE,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,SAAS;QACX,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,GAAG,CAAqC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACjC;gBACE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;gBACrB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;gBACrB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;aACtB;SACkC,CAAC;IACxC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO;gBACL;oBACE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;iBAChC;gBACD;oBACE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;iBAChC;aACkC,CAAC;QACxC,CAAC;QACD,4DAA4D;QAC5D,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG;YACZ,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC;YACvB,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;YAC5B,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,CAAC;QACF,MAAM,GAAG,GAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAmB,CAAC,GAAG,GAAG,CAAC,CAAC;QACrC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACjE,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;YACvB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,GAAG,CAAqC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KACE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,SAAmB,EACnB,CAAiB,EACjB,SAA2C,EAC3C,MAAM,GAAG,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAC,EACjD,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;IAEjB,MAAM,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,MAAM,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC/C,4EAA4E;IAC5E,0EAA0E;IAC1E,yCAAyC;IACzC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,GAAG,CACN,CAAC,EACD,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/B,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/B,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAChC,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,SAAS;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAWD,MAAM,UAAU,4BAA4B,CAC1C,QAAuC,EACvC,OAAuB,EACvB,YAAkC;IAElC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,YAAY,aAAa,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAmB,CAAC;QACnD,MAAM,aAAa,GAAG,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAC,EAAE,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7F,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAC,GAAG,OAAO,CAAC;YAC3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC;gBAChE,qBAAqB,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;gBACvC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;gBACvF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBACzH,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;gBAC1C,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;gBAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;gBAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,+BAA+B,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxH,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,iBAAiB,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAG,CACb,EACE,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,SAAS,EACmB,EAC9B,EAAE,CACF,CAAC;QACC,MAAM,EAAE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;QAC1D,SAAS;QACT,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,gBAAgB,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5C,+BAA+B,CAAC,GAAG,EAAE,CAAC,CAAC,CACxC;QACD,iBAAiB;KAClB,CAAwB,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAI,OAA0B,CAAC,KAAK,EAAE,CAAC;IACjD,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,2BAA2B,CAAC,IAAU;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC/C,mDAAmD;IACnD,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,eAAe,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAU;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC7C,CAAC;AAED,MAAM,qBAAqB,GAAG,IAAI,OAAO,EAAmC,CAAC;AAC7E,IAAI,qBAAqB,GAAG,CAAC,CAAC;AAC9B,MAAM,sBAAsB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAE7D,SAAS,yBAAyB,CAAC,QAAgB;IACjD,IAAI,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,EAAE,GAAG,qBAAqB,EAAE,CAAC;QAC7B,sBAAsB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,OAAgB;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,OAAO;QACL,yBAAyB,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;QACpD,yBAAyB,CAAC,KAAK,CAAC;QAChC,OAAO,CAAC,OAAO;QACf,KAAK,CAAC,KAAK;QACX,KAAK,CAAC,MAAM;KACb,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,oCAAoC,GAAG,OAAO,CAAC;AACrD,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEhE,MAAM,UAAU,+BAA+B,CAAC,IAAU;IACxD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC7B,MAAM,QAAQ,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,QAAQ,EAAE,eAAe,CAAC;IAC1C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,wEAAwE;IACxE,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,kCAAkC,CAAC,OAAO,CAAC;YACjF,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,SAAS;YACxF,KAAK,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,6BAA6B,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,IAAU;IACtD,MAAM,GAAG,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACzC,OAAO,yBAAyB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAU,EAAE,SAAmB;IACvE,MAAM,GAAG,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtC,IAAI,OAAO,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CAAC,IAAU;IAChD,OAAO,6BAA6B,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAmB,EACnB,WAA6B;IAE7B,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC5B,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,YAA+B,CAAC;IACpC,IAAI,cAAsB,CAAC;IAC3B,IAAI,eAA0C,CAAC;IAC/C,IAAI,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;QAChC,cAAc,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAC/E,CAAC;QACF,MAAM,UAAU,GACd,WAAW,CAAC,IAAI,YAAY,UAAU;YACtC,WAAW,CAAC,IAAI,YAAY,iBAAiB,CAAC;QAChD,eAAe,GAAG,UAAU;YAC1B,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;YAClB,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAwE,CAAC;QAC3G,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,cAAc,GAAG,CAAC,CAAC;QACnB,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC;gBAC9B,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,CAAC;gBAC1B,IAAI,GAAG,GAAG,CAAC,CAAC;gBACZ,IAAI,GAAG,GAAG,CAAC,CAAC;gBACZ,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;oBACb,GAAG,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;oBACzC,GAAG,GAAG,GAAG,CAAC;oBACV,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;wBAC7C,MAAM,CAAC,GAAG,eAAe,CACvB,YAAY,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAChD,CAAC;wBACF,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzB,CAAC;oBACD,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACrE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzB,CAAC;oBACD,IAAI,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;wBACvB,MAAM,CAAC,GAAG,eAAe,CAAC,YAAY,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;wBACxD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjB,MAAM,cAAc,GAAG,UAAU,GAAG,CAAC,CAAC;oBACtC,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,cAAc,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC;oBACnD,MAAM,MAAM,GAAG,IAAI,CAAC;oBACpB,MAAM,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;oBAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,QAAQ,CAAC;oBAChD,MAAM,MAAM,GAAG,IAAI,GAAG,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;oBAC3D,GAAG,GAAG,IAAI,CAAC,GAAG,CACZ,cAAc,CAAC,MAAM,CAAC,EACtB,cAAc,CAAC,MAAM,CAAC,EACtB,cAAc,CAAC,MAAM,CAAC,EACtB,cAAc,CAAC,MAAM,CAAC,CACvB,CAAC;oBACF,GAAG,GAAG,IAAI,CAAC,GAAG,CACZ,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAC1B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAC1B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAC1B,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAC3B,CAAC;gBACJ,CAAC;gBACD,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBACrB,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAiB,EAAE,EAAkB;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,EAAkB,EAClB,EAAkB,EAClB,EAAkB,EAClB,GAAmB,EACnB,GAAmB,EACnB,GAAmB;IAEnB,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IACE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;YAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG;YAC/B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAC/B,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBACxB,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBACd,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBACxB,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBACd,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;gBACxB,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;gBACd,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,CAAiB;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,CAAiB,EACjB,CAAiB,EACjB,CAAiB,EACjB,EAAkB,EAClB,EAAkB,EAClB,EAAkB,EAClB,GAAmB,EACnB,GAAmB,EACnB,GAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QAC3C,KAAK;QACL,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QAClD,KAAK;QACL,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,KAAK;QACL,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,WAA2B,EAC3B,WAA2B,EAC3B,QAAgB,EAChB,KAAuB;IAEvB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,aAAa,GACf,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,QAAQ,CAAC;IAC3B,CAAC;IACD,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC3C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,IACE,CAAC,SAAS,GAAG,SAAS,GAAG,CAAC;YACxB,SAAS,GAAG,SAAS,GAAG,CAAC;YACzB,aAAa,IAAI,CAAC,CAAC;YACrB,aAAa,IAAI,QAAQ,EACzB,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC7B,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,SAAS,CAAC,EAChB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACb,aAAa,CACd,CAAC;wBACF,SAAS,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;QAED,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAkB,EAClB,aAAkC,EAClC,QAAyB;IAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;IACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAC/B,MAAM,YAAY,GAAG,QAAQ,CAAC,wBAAwB,CAAC;IACvD,IAAI,CAAC,aAAa;QAAE,OAAO;IAC3B,IAAI,CAAC,GAAG,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC;IACpC,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACzC,IAAI,aAAa,IAAI,oCAAoC,EAAE,CAAC;QAC1D,wEAAwE;QACxE,0EAA0E;QAC1E,mEAAmE;QACnE,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QACzD,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC5D,YAAY,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,MAAM,cAAc,GAClB,kCAAkC,CAAC,aAAa,CAAC,CAAC;IACpD,IAAI,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,uBAAuB,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;YACtC,uBAAuB,CAAC,MAAM,CAC5B,uBAAuB,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAC7C,CAAC;QACJ,CAAC;QACD,uBAAuB,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,0BAA0B,GAAG,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAO,CAAC,KAAK,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAS,CAAC,KAAK,CAAC;IAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAE1B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEzB,MAAM,WAAW,GAAG,YAAY,KAAK,WAAW,CAAC;IACjD,MAAM,WAAW,GAAG,YAAY,KAAK,WAAW,CAAC;IACjD,MAAM,aAAa,GAAG,YAAY,KAAK,aAAa,CAAC;IACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,6BAA6B,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAEpB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,WAAW,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,WAAW,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;gBAChD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,yDAAyD;gBACzD,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC;oBAC1D,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,qBAAqB;gBACrB,2BAA2B,CACzB,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,EAAE,EAAE,EAAE,EAAE,EAAE,EACV,GAAG,EAAE,GAAG,EAAE,GAAG,CACd,CAAC;YACJ,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,MAAM,GAAG,2BAA2B,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC1D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC1D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC1D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9B,gDAAgD;QAEhD,IAAI,SAAS,GAAG,QAAQ,CAAC;QACzB,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;QAE1B,IAAI,MAAM,EAAE,CAAC;YACX,SAAS,GAAG,GAAG,CAAC;YAChB,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAE5B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAE3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;gBACjD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;gBACxD,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;gBACtD,IAAI,OAAO,EAAE,CAAC;oBACZ,CAAC,GAAG,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAElC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,0FAA0F;QAC1F,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAChD,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EACjC,CAAC,CACF,CAAC;QACF,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CACpD,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,EAChC,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAAY,CAAC;AAExD,8FAA8F;AAC9F,MAAM,UAAU,4BAA4B,CAAC,MAAuB;IAClE,KAAK,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,MAAM,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtP,OAAO,CAAC,IAAI,CAAC,4IAA4I,CAAC,CAAC;YAC3J,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM;YAAE,SAAS;QAC/C,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE;YAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAU,EAAE,YAAY,GAAG,IAAI;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC9E,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE;QAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,qBAAqB,GAAG,iBAAiB,KAAK,CAAC;QACnD,CAAC,CAAC,6BAA6B,CAAC,QAAQ,EAAE,SAAS,EAAE,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC,CAAC,SAAS,CAAC;IACd,2EAA2E;IAC3E,4EAA4E;IAC5E,gFAAgF;IAChF,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QACtC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC;YAC7D,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACrF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE;oBAAE,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;YAChG,CAAC;QACH,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,IAAI,QAAQ,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9G,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;AAChE,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,IAAU,EAAE,MAAuB;IACpE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO;QACrE,CAAC,CAAC,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACrI,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,uBAAuB,CAAC,IAAU,EAAE,MAAgB;IAClE,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;QAC9B,QAAQ,EAAE,+BAA+B,CAAC,IAAI,CAAC;QAC/C,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC;QAC3B,eAAe;QACf,iBAAiB,EAAE,wBAAwB,CAAC,IAAI,CAAC;QACjD,sBAAsB,EAAE,eAAe;YACrC,CAAC,CAAC,kCAAkC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;KACpE,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,yBAAyB,CACvC,IAAU,EAAE,MAAgB,EAAE,QAAoD;IAElF,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;QACtF,+BAA+B,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,GAAG;QACtG,sBAAsB,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,eAAe;QACzD,wBAAwB,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,iBAAiB;QAC7D,CAAC,CAAC,QAAQ,CAAC,eAAe,IAAI,kCAAkC,CAAC,QAAQ,CAAC,eAAe,CAAC;YACxF,QAAQ,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAU,EAAE,YAAY,GAAG,IAAI;IAC7D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzD,MAAM,iBAAiB,GAAG,YAAY,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,IAAI,QAAQ,CAAC,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,KAAK,SAAS;QAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7G,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;QACxH,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,UAAsC,EAAE;IAC1F,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC5D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACrD,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,MAAM,wBAAwB,GAAe,EAAE,CAAC;IAChD,MAAM,gBAAgB,GAIhB,EAAE,CAAC;IACT,MAAM,gBAAgB,GAAkC,EAAE,CAAC;IAG3D,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC;QACnG,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAElE,IAAI,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACvD,MAAM,GAAG,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,mEAAmE;QACnE,uEAAuE;QACvE,uEAAuE;QACvE,IAAI,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,aAAa;YAC1C,CAAC,gBAAgB,CAAC,MAAM,KAAK,wBAAwB,CAAC,MAAM,CAAC,CAAC,MAAM;gBAClE,gBAAgB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,wBAAwB,CAAC,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrC,QAAQ,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAClC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAC3B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,+BAA+B;YAC/B,wBAAwB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,QAAQ,GAAG;YACf,MAAM;YACN,SAAS,EAAE,MAAO;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,+BAA+B,CAAC,GAAG,EAAE,CAAC,CAAC,CACxC;YACD,iBAAiB;SACK,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,YAAY,aAAa,CAAC,IAAI,CACtC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3B,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3B,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAChC,EAAE,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI,CAC3E,EAAE,CAAC;YACF,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC;YACpB,IAAI;YACJ,QAAQ;YACR,SAAS,EAAE,MAAM;YACjB,eAAe,EAAE,gBAAgB;YACjC,iBAAiB;YACjB,SAAS;SACV,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAmB,CAAC;IAE5D,MAAM,eAAe,GAAG,IAAI,GAAG,EAAsF,CAAC;IACtH,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,wBAAwB,EAAE,eAAe,CAAC,CAAC;IAEtF,OAAO;QACL,QAAQ;QACR,UAAU;QACV,eAAe;QACf,cAAc,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,OAAO,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;oBACtF,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;QAC1H,SAAS;QACT,gBAAgB;QAChB,gBAAgB;QAChB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAG,EAAE,cAAc,CAAC,GAAG,CAAE;YACzB,aAAa,EAAE,GAAG,CAAC,WAAW;YAC9B,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;SAC7C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,UAAsB,EACtB,wBAAoC,EACpC,OAAgG;IAEhG,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CACxC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,WAAW,EACnC,CAAC,CACF,CAAC;IACF,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAC5C,CAAC,CACF,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,SAAS,CAClC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EACtC,CAAC,CACF,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,IAAI,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvE,MAAM,mBAAmB,GAAG,IAAI,SAAS,CACvC,IAAI,UAAU,CAAC,CAAC,GAAG,gBAAgB,CAAC,EACpC,CAAC,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,IAAI,QAAQ,CAAC;QAClC,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,YAAY;QACpB,EAAE,EAAE,QAAQ;QACZ,GAAG,EAAE,SAAS;QACd,aAAa,EAAE,mBAAmB;QAClC,KAAK,EAAE,QAAQ;YACb,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,UAAU;YACjB,CAAC,CAAC,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,SAAS;QACb,OAAO,EAAE,WAAW;KACrB,CAAC,CAAC;IAEH,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACzC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAExH,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAS,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QACtE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAO,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,SAAS,CAAC,KAAK,CAAC,GAAG,CACjB,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,EACzE,aAAa,GAAG,CAAC,CAClB,CAAC;QACF,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,cAAc,CAAC,KAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,cAAc,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACpF,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC;QAED,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAE9F,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,WAAW,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,aAAa,IAAI,WAAW,CAAC;QAC7B,YAAY,IAAI,WAAW,CAAC,MAAM,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAkB;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1C,QAAQ,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAE1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAExB,MAAM,GAAG,GAAG,OAAO;QACjB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;QACtB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACzB,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAI,CAAC;QAC1B,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,CAAC,EAAE,CAAC;YACT,EAAE,GAAG,CAAC,EAAE,CAAC;YACT,EAAE,GAAG,CAAC,EAAE,CAAC;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QACF,IAAI,CAAC,GAAG,CACN,EAAE,EACF,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EACjB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAI,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,wBAAwB,CAAC,QAAuC,EAAE,MAAyB,EAAE,SAAwB;IACnI,IAAI,SAAS,YAAY,mBAAmB;QAAE,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,wBAAwB,CAAC,QAAuC,EAAE,SAAwB,EAAE,MAAyB;IACnI,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,CAAC,CAAC,SAAS,YAAY,mBAAmB,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC;IACrC,KAAK,MAAM,EAAC,IAAI,EAAC,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC;QACvE,OAAO,WAAW,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,SAAS,EAAE,CAAC;YAC1F,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;gBACtE,MAAM,MAAM,GAAG,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,SAAS,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,CAAC;YACD,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { packMaterialIndexAndWeightToInt } from './materialIndices.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { mat4, vec2, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS, TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents, hasGeneratedVertexTangents } from '../util/geometry.js';\n\nfunction computeGeometryBounds(geometry: Geometry) {\n const min = vec3.fromValues(Infinity, Infinity, Infinity);\n const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n const positions = geometry.position.array;\n const stride = geometry.position.itemSize;\n for (let offset = 0; offset + 2 < positions.length; offset += stride) {\n const x = positions[offset];\n const y = positions[offset + 1];\n const z = positions[offset + 2];\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n continue;\n }\n min[0] = Math.min(min[0], x);\n min[1] = Math.min(min[1], y);\n min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x);\n max[1] = Math.max(max[1], y);\n max[2] = Math.max(max[2], z);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function getBvhBounds(geometry: Geometry) {\n const bvh = getGeometryBvh(geometry)!;\n const floats = new Float32Array(bvh.buffer);\n if (bvh.layout === 'bvh4') {\n return [\n [floats[0], floats[1], floats[2]],\n [\n floats[0] + floats[3],\n floats[1] + floats[4],\n floats[2] + floats[5]\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n if (bvh.layout === 'bvh-gpu') {\n const words = new Uint32Array(bvh.buffer);\n if (words[11] === 0) {\n return [\n [\n Math.min(floats[0], floats[8]),\n Math.min(floats[1], floats[9]),\n Math.min(floats[2], floats[10])\n ],\n [\n Math.max(floats[4], floats[12]),\n Math.max(floats[5], floats[13]),\n Math.max(floats[6], floats[14])\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n // A single-leaf BVH_GPU node does not store its own bounds.\n return computeGeometryBounds(geometry);\n }\n if (bvh.layout === 'cwbvh') {\n const words = new Uint32Array(bvh.buffer);\n const header = words[3];\n const signedByte = (value: number) => (value << 24) >> 24;\n const scale = [\n 2 ** signedByte(header),\n 2 ** signedByte(header >> 8),\n 2 ** signedByte(header >> 16)\n ];\n const min: vec3.Vec3Array = [floats[0], floats[1], floats[2]];\n const max: vec3.Vec3Array = [...min];\n for (let slot = 0; slot < 8; slot++) {\n const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;\n if (!meta) continue;\n const shift = (slot & 3) * 8;\n const half = slot >> 2;\n max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);\n max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);\n max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n return [\n [floats[0], floats[1], floats[2]],\n [floats[4], floats[5], floats[6]]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result = {min: vec3.create(), max: vec3.create()},\n p = vec3.create()\n) {\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n bvhBounds[(corner >> 0) & 1][0],\n bvhBounds[(corner >> 1) & 1][1],\n bvhBounds[(corner >> 2) & 1][2]\n );\n vec3.transformMat4(p, p, m);\n if (!p.every(isFinite)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding {\n mesh: Mesh;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms(\n bindings: PreparedMeshInstanceBinding[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = Array(16).fill(0) as mat4.Mat4Array;\n const boundsScratch = {min: vec3.create(), max: vec3.create()}, pointScratch = vec3.create();\n let sourceIndex = 0;\n for (const binding of bindings) {\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex;\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding\n ) =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: mesh.transform,\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices) return bindings.map(update);\n const next = (current as TLASInstance[]).slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\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 detailedProjectiveRangeTriangleLimit = 100_000;\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,\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 const minmaxData: Uint8Array[] = [];\n const maxMipLevel = Math.log2(w);\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 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 let mipmapSize = w;\n for (let lod = 0; lod <= maxMipLevel; lod++) {\n const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];\n const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);\n minmaxData.push(minmax);\n const channels = lod === 0 ? sourceChannels : 2;\n for (let y = 0; y < mipmapSize; y++) {\n for (let x = 0; x < mipmapSize; x++) {\n const yx = y * mipmapSize + x;\n const idx = yx * channels;\n let min = 0;\n let max = 0;\n if (lod == 0) {\n min = normalizeHeight(heightPixels[idx]);\n max = min;\n if (y < mipmapSize - 1 && x < mipmapSize - 1) {\n const h = normalizeHeight(\n heightPixels[idx + (mipmapSize + 1) * channels]\n );\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (y < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (x < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n } else {\n const x2 = x * 2;\n const y2 = y * 2;\n const prevMipmapSize = mipmapSize * 2;\n const idx2 = (y2 * prevMipmapSize + x2) * channels;\n const idx2_0 = idx2;\n const idx2_1 = idx2 + channels;\n const idx2_2 = idx2 + prevMipmapSize * channels;\n const idx2_3 = idx2 + prevMipmapSize * channels + channels;\n min = Math.min(\n prevMinmaxData[idx2_0],\n prevMinmaxData[idx2_1],\n prevMinmaxData[idx2_2],\n prevMinmaxData[idx2_3]\n );\n max = Math.max(\n prevMinmaxData[idx2_0 + 1],\n prevMinmaxData[idx2_1 + 1],\n prevMinmaxData[idx2_2 + 1],\n prevMinmaxData[idx2_3 + 1]\n );\n }\n minmax[yx * 2] = min;\n minmax[yx * 2 + 1] = max;\n }\n }\n mipmapSize = mipmapSize / 2;\n }\n\n return minmaxData;\n}\n\nfunction sphericalProjection(n: vec3.Vec3Array, uv: vec2.Vec2Array) {\n const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;\n const phi = Math.acos(n[1]) / Math.PI;\n vec2.set(uv, theta, 1.0 - phi);\n}\n\nexport function sphericalProjectionTriangle(\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n sphericalProjection(na, uvA);\n sphericalProjection(nb, uvB);\n sphericalProjection(nc, uvC);\n let onSeam = false;\n for (let i = 0; i < 2; i++) {\n if (\n Math.abs(uvA[i] - uvB[i]) > 0.5 ||\n Math.abs(uvA[i] - uvC[i]) > 0.5 ||\n Math.abs(uvB[i] - uvC[i]) > 0.5\n ) {\n const maxU = Math.max(uvA[i], uvB[i], uvC[i]);\n if (maxU - uvA[i] > 0.5) {\n uvA[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvB[i] > 0.5) {\n uvB[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvC[i] > 0.5) {\n uvC[i] += 1.0;\n onSeam = true;\n }\n }\n }\n\n return onSeam;\n}\n\nfunction getMaxAxisIndex(n: vec3.Vec3Array) {\n const x = Math.abs(n[0]);\n const y = Math.abs(n[1]);\n const z = Math.abs(n[2]);\n return x > y && x > z ? 0 : y > z ? 1 : 2;\n}\n\nexport function triplanarProjectionTriangle(\n a: vec3.Vec3Array,\n b: vec3.Vec3Array,\n c: vec3.Vec3Array,\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));\n const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));\n const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));\n\n if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {\n // yz\n vec2.set(uvA, a[1], a[2]);\n vec2.set(uvB, b[1], b[2]);\n vec2.set(uvC, c[1], c[2]);\n } else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {\n // xz\n vec2.set(uvA, a[0], a[2]);\n vec2.set(uvB, b[0], b[2]);\n vec2.set(uvC, c[0], c[2]);\n } else {\n // xy\n vec2.set(uvA, a[0], a[1]);\n vec2.set(uvB, b[0], b[1]);\n vec2.set(uvC, c[0], c[1]);\n }\n}\n\nfunction findRoots(\n triAabbMinP: vec2.Vec2Array,\n triAabbMaxP: vec2.Vec2Array,\n maxDepth: number,\n roots: vec3.Vec3Array[]\n) {\n let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);\n let size = Math.max(d[0], d[1]);\n let startMipLevel =\n maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;\n if (!isFinite(startMipLevel)) {\n startMipLevel = maxDepth;\n }\n startMipLevel = Math.max(startMipLevel, 0);\n let rootCount = 0;\n while (true) {\n const mipSize = Math.pow(2.0, maxDepth - startMipLevel);\n const minTexelX = Math.floor(mipSize * triAabbMinP[0]);\n const minTexelY = Math.floor(mipSize * triAabbMinP[1]);\n const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);\n const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);\n\n if (\n (maxTexelX - minTexelX < 2 &&\n maxTexelY - minTexelY < 2 &&\n startMipLevel >= 0) ||\n startMipLevel >= maxDepth\n ) {\n for (let y = minTexelY; y <= maxTexelY; y++) {\n for (let x = minTexelX; x <= maxTexelX; x++) {\n if (rootCount < roots.length) {\n vec3.set(\n roots[rootCount],\n Math.floor(x),\n Math.floor(y),\n startMipLevel\n );\n rootCount++;\n }\n }\n }\n break;\n }\n\n startMipLevel++;\n }\n\n return rootCount;\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indices.array;\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 if (triangleCount >= detailedProjectiveRangeTriangleLimit) {\n // A conservative full-height prism is much cheaper to prepare for dense\n // source meshes and remains intersection-safe. Per-triangle UV min/max is\n // retained for smaller meshes where tighter BVH nodes matter more.\n const conservative = new Float32Array(triangleCount * 2);\n for (let triangle = 0; triangle < triangleCount; triangle++) {\n conservative[triangle * 2 + 1] = 1;\n }\n return conservative;\n }\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 const maxDepth = Math.log2(heightImage.width);\n const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);\n const normal = geometry.normal!.array;\n const position = geometry.position!.array;\n\n const uv1 = vec2.create();\n const uv2 = vec2.create();\n const uv3 = vec2.create();\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const n1 = vec3.create();\n const n2 = vec3.create();\n const n3 = vec3.create();\n\n const isTriplanar = uvProjection === 'triplanar';\n const isSpherical = uvProjection === 'spherical';\n const isCylindrical = uvProjection === 'cylindrical';\n const uvScale = material.displacementUvProjectionScale;\n\n const minUv = vec2.create();\n const maxUv = vec2.create();\n\n const roots: vec3.Vec3Array[] = [];\n for (let i = 0; i < 100; i++) {\n roots.push([0, 0, 0]);\n }\n for (let i = 0; i < indices.length; i += 3) {\n const i1 = indices[i];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const i1_2 = i1 * 2;\n const i2_2 = i2 * 2;\n const i3_2 = i3 * 2;\n const i1_3 = i1 * 3;\n const i2_3 = i2 * 3;\n const i3_3 = i3 * 3;\n\n if (uvs) {\n vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);\n vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);\n vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);\n } else {\n vec2.set(uv1, 0, 0);\n vec2.set(uv2, 0, 0);\n vec2.set(uv3, 0, 0);\n }\n\n let onSeam = false;\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);\n vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);\n vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);\n vec3.normalize(n1, n1);\n vec3.normalize(n2, n2);\n vec3.normalize(n3, n3);\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);\n vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);\n vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);\n }\n if (isTriplanar) {\n // Is on the seam. Needs full prism to avoid empty seams.\n const xMaxIndex = getMaxAxisIndex(n1);\n const yMaxIndex = getMaxAxisIndex(n2);\n const zMaxIndex = getMaxAxisIndex(n3);\n if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {\n onSeam = true;\n }\n /* prettier-ignore */\n triplanarProjectionTriangle(\n p1, p2, p3,\n n1, n2, n3,\n uv1, uv2, uv3\n );\n } else if (isSpherical) {\n vec3.normalize(p1, p1);\n vec3.normalize(p2, p2);\n vec3.normalize(p3, p3);\n onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);\n } else {\n const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;\n const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;\n const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;\n vec2.set(uv1, u1, p1[1]);\n vec2.set(uv2, u2, p2[1]);\n vec2.set(uv3, u3, p3[1]);\n onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;\n }\n }\n vec2.scale(uv1, uv1, uvScale);\n vec2.scale(uv2, uv2, uvScale);\n vec2.scale(uv3, uv3, uvScale);\n\n // TODO PDM don't have zero area triangle issue.\n\n let minHeight = Infinity;\n let maxHeight = -Infinity;\n\n if (onSeam) {\n minHeight = 0.0;\n maxHeight = 255.0;\n } else {\n vec2.copy(maxUv, uv1);\n vec2.copy(minUv, uv1);\n vec2.min(minUv, minUv, uv2);\n vec2.min(minUv, minUv, uv3);\n vec2.max(maxUv, maxUv, uv2);\n vec2.max(maxUv, maxUv, uv3);\n\n const rootCount = findRoots(minUv, maxUv, maxDepth, roots);\n\n for (let k = 0; k < rootCount; k++) {\n const mipLevel = roots[k][2];\n const mipSize = Math.pow(2, maxDepth - mipLevel);\n const minmax = minmaxData[mipLevel];\n const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;\n let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;\n if (isFlipY) {\n y = mipSize - y - 1;\n }\n const idx = (y * mipSize + x) * 2;\n\n minHeight = Math.min(minHeight, minmax[idx]);\n maxHeight = Math.max(maxHeight, minmax[idx + 1]);\n }\n }\n\n // TODO this will cause flat surface optimization fail.\n // But not adding bias will leads to small gap between flat surface and displaced surface.\n trianglesDisplacementRange[(i / 3) * 2] = Math.max(\n (Math.floor(minHeight) - 4) / 255,\n 0\n );\n trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min(\n (Math.ceil(maxHeight) + 4) / 255,\n 1\n );\n }\n\n return trianglesDisplacementRange;\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 if (bias !== 0) {\n const positions = geometry.position.array.slice();\n const normals = geometry.normal.array;\n for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {\n const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;\n const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);\n if (length > 0) {\n for (let axis = 0; axis < 3; axis++) positions[p + axis] += normals[n + axis] / length * bias;\n }\n }\n return { geometry: new Geometry({ ...geometry, position: new Attribute(positions, geometry.position.itemSize) }),\n displacementScale, trianglesDisplacement };\n }\n return { geometry, 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 const materialIndexMap = new Map<OpenPBRMaterial, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometries: Geometry[] = [];\n const materials: OpenPBRMaterial[] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding[] = [];\n\n\n const instances = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh, options.displacement !== false);\n const bvhBounds = getBvhBounds(geometry);\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance = {\n bounds,\n blasIndex: geoIdx!,\n transform: mesh.transform,\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (!(mesh instanceof InstancedMesh) && (\n !bounds.min.every(isFinite) ||\n !bounds.max.every(isFinite) ||\n !mesh.transform.every(isFinite)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indices.array.length }];\n })),\n instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indices.array.length / 3\n }))\n };\n}\n\nfunction mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indices.array.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const hasColor = geometries.some((geo) => geo.color);\n const hasTangent = geometries.some((geo) => geo.tangent);\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(4 * totalVertexCount), 4)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (geometry.color) {\n mergedGeometry.color!.array.set(geometry.color.array, currentVertex * 3);\n }\n if (geometry.tangent) {\n const source = geometry.tangent;\n for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n });\n\n return mergedGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/** Batch records are regenerated together; refit all numeric source slots. */\nexport function dirtyMeshInstanceIndices(bindings: PreparedMeshInstanceBinding[], meshes: ReadonlySet<Mesh>, instances: MeshInstances) {\n if (instances instanceof PackedMeshInstances) return new Set(Array.from({length: instances.length}, (_, i) => i));\n return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));\n}\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 (!(instances instanceof PackedMeshInstances)) 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 InstancedMesh from '../scene/InstancedMesh.js';\nimport { meshInstanceCount, meshInstanceTransform, PackedMeshInstances, type MeshInstances } from './meshInstances.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { packMaterialIndexAndWeightToInt } from './materialIndices.js';\nimport { getGeometryBvh, setGeometryBvh, geometryBvhConfigMatches, type BvhBuildConfig } from './geometryBvh.js';\nimport { writeMaterialIndices } from './materialIndices.js';\nimport { mat4, vec2, vec3 } from '../math.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport Mesh from '../scene/Mesh.js';\nimport OpenPBRMaterial from '../scene/OpenPBRMaterial.js';\nimport { buildBLAS, TLASInstance } from './bvhAccel.js';\nimport { colorLuminance } from './lightSampling.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { generateVertexTangents, hasGeneratedVertexTangents } from '../util/geometry.js';\n\nfunction computeGeometryBounds(geometry: Geometry) {\n const min = vec3.fromValues(Infinity, Infinity, Infinity);\n const max = vec3.fromValues(-Infinity, -Infinity, -Infinity);\n const positions = geometry.position.array;\n const stride = geometry.position.itemSize;\n for (let offset = 0; offset + 2 < positions.length; offset += stride) {\n const x = positions[offset];\n const y = positions[offset + 1];\n const z = positions[offset + 2];\n if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(z)) {\n continue;\n }\n min[0] = Math.min(min[0], x);\n min[1] = Math.min(min[1], y);\n min[2] = Math.min(min[2], z);\n max[0] = Math.max(max[0], x);\n max[1] = Math.max(max[1], y);\n max[2] = Math.max(max[2], z);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function getBvhBounds(geometry: Geometry) {\n const bvh = getGeometryBvh(geometry)!;\n const floats = new Float32Array(bvh.buffer);\n if (bvh.layout === 'bvh4') {\n return [\n [floats[0], floats[1], floats[2]],\n [\n floats[0] + floats[3],\n floats[1] + floats[4],\n floats[2] + floats[5]\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n if (bvh.layout === 'bvh-gpu') {\n const words = new Uint32Array(bvh.buffer);\n if (words[11] === 0) {\n return [\n [\n Math.min(floats[0], floats[8]),\n Math.min(floats[1], floats[9]),\n Math.min(floats[2], floats[10])\n ],\n [\n Math.max(floats[4], floats[12]),\n Math.max(floats[5], floats[13]),\n Math.max(floats[6], floats[14])\n ]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n // A single-leaf BVH_GPU node does not store its own bounds.\n return computeGeometryBounds(geometry);\n }\n if (bvh.layout === 'cwbvh') {\n const words = new Uint32Array(bvh.buffer);\n const header = words[3];\n const signedByte = (value: number) => (value << 24) >> 24;\n const scale = [\n 2 ** signedByte(header),\n 2 ** signedByte(header >> 8),\n 2 ** signedByte(header >> 16)\n ];\n const min: vec3.Vec3Array = [floats[0], floats[1], floats[2]];\n const max: vec3.Vec3Array = [...min];\n for (let slot = 0; slot < 8; slot++) {\n const meta = (words[6 + (slot >> 2)] >> ((slot & 3) * 8)) & 0xff;\n if (!meta) continue;\n const shift = (slot & 3) * 8;\n const half = slot >> 2;\n max[0] = Math.max(max[0], min[0] + ((words[14 + half] >> shift) & 0xff) * scale[0]);\n max[1] = Math.max(max[1], min[1] + ((words[16 + half] >> shift) & 0xff) * scale[1]);\n max[2] = Math.max(max[2], min[2] + ((words[18 + half] >> shift) & 0xff) * scale[2]);\n }\n return [min, max] as [vec3.Vec3Array, vec3.Vec3Array];\n }\n return [\n [floats[0], floats[1], floats[2]],\n [floats[4], floats[5], floats[6]]\n ] as [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function computeBounds(\n _geometry: Geometry,\n m: mat4.Mat4Array,\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array],\n result = {min: vec3.create(), max: vec3.create()},\n p = vec3.create()\n) {\n const {min, max} = result;\n vec3.set(min, Infinity, Infinity, Infinity);\n vec3.set(max, -Infinity, -Infinity, -Infinity);\n // Transforming the eight BLAS AABB corners is exact for an affine transform\n // and independent of mesh vertex count. The previous rotated path scanned\n // every vertex on every instance update.\n for (let corner = 0; corner < 8; corner++) {\n vec3.set(\n p,\n bvhBounds[(corner >> 0) & 1][0],\n bvhBounds[(corner >> 1) & 1][1],\n bvhBounds[(corner >> 2) & 1][2]\n );\n vec3.transformMat4(p, p, m);\n if (!p.every(isFinite)) continue;\n vec3.min(min, min, p);\n vec3.max(max, max, p);\n }\n\n return result;\n}\n\nexport interface PreparedMeshInstanceBinding {\n mesh: Mesh;\n geometry: Geometry;\n blasIndex: number;\n materialIndices: number[];\n displacementScale: number;\n bvhBounds: [vec3.Vec3Array, vec3.Vec3Array];\n}\n\nexport function updateMeshInstanceTransforms(\n bindings: PreparedMeshInstanceBinding[],\n current?: MeshInstances,\n dirtyIndices?: ReadonlySet<number>\n) {\n if (bindings.some(binding => binding.mesh instanceof InstancedMesh)) {\n const packed = new PackedMeshInstances(bindings.reduce((count, binding) => count + meshInstanceCount(binding.mesh), 0));\n const matrix = Array(16).fill(0) as mat4.Mat4Array;\n const boundsScratch = {min: vec3.create(), max: vec3.create()}, pointScratch = vec3.create();\n let sourceIndex = 0;\n for (const binding of bindings) {\n const {mesh, geometry, bvhBounds, blasIndex, materialIndices, displacementScale} = binding;\n for (let i = 0; i < meshInstanceCount(mesh); i++, sourceIndex++) {\n meshInstanceTransform(mesh, i, matrix);\n const bounds = computeBounds(geometry, matrix, bvhBounds, boundsScratch, pointScratch);\n if (!bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite) || !matrix.every(Number.isFinite)) continue;\n const index = packed.length++;\n packed.sourceIndices[index] = sourceIndex;\n packed.transforms.set(matrix, index * 16);\n packed.bounds.set(bounds.min, index * 6); packed.bounds.set(bounds.max, index * 6 + 3);\n packed.blasIndices[index] = blasIndex; packed.materials[index] = packMaterialIndexAndWeightToInt(materialIndices[0], 1);\n packed.displacement[index] = displacementScale;\n const colors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n for (let k = 0; k < 3; k++) packed.colors[index * 3 + k] = colors?.[i * 3 + k] ?? 1;\n }\n }\n return packed;\n }\n const update = (\n {\n mesh,\n geometry,\n blasIndex,\n materialIndices,\n displacementScale,\n bvhBounds\n }: PreparedMeshInstanceBinding\n ) =>\n ({\n bounds: computeBounds(geometry, mesh.transform, bvhBounds),\n blasIndex,\n transform: mesh.transform,\n materialsIndices: materialIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n }) satisfies TLASInstance;\n if (!current || !dirtyIndices) return bindings.map(update);\n const next = (current as TLASInstance[]).slice();\n dirtyIndices.forEach((index) => {\n const binding = bindings[index];\n if (binding) next[index] = update(binding);\n });\n return next;\n}\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 detailedProjectiveRangeTriangleLimit = 100_000;\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 const minmaxData: Uint8Array[] = [];\n const maxMipLevel = Math.log2(w);\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 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 let mipmapSize = w;\n for (let lod = 0; lod <= maxMipLevel; lod++) {\n const prevMinmaxData = minmaxData[Math.max(0, lod - 1)];\n const minmax = new Uint8Array(mipmapSize * mipmapSize * 2);\n minmaxData.push(minmax);\n const channels = lod === 0 ? sourceChannels : 2;\n for (let y = 0; y < mipmapSize; y++) {\n for (let x = 0; x < mipmapSize; x++) {\n const yx = y * mipmapSize + x;\n const idx = yx * channels;\n let min = 0;\n let max = 0;\n if (lod == 0) {\n min = normalizeHeight(heightPixels[idx]);\n max = min;\n if (y < mipmapSize - 1 && x < mipmapSize - 1) {\n const h = normalizeHeight(\n heightPixels[idx + (mipmapSize + 1) * channels]\n );\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (y < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + mipmapSize * channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n if (x < mipmapSize - 1) {\n const h = normalizeHeight(heightPixels[idx + channels]);\n min = Math.min(min, h);\n max = Math.max(max, h);\n }\n } else {\n const x2 = x * 2;\n const y2 = y * 2;\n const prevMipmapSize = mipmapSize * 2;\n const idx2 = (y2 * prevMipmapSize + x2) * channels;\n const idx2_0 = idx2;\n const idx2_1 = idx2 + channels;\n const idx2_2 = idx2 + prevMipmapSize * channels;\n const idx2_3 = idx2 + prevMipmapSize * channels + channels;\n min = Math.min(\n prevMinmaxData[idx2_0],\n prevMinmaxData[idx2_1],\n prevMinmaxData[idx2_2],\n prevMinmaxData[idx2_3]\n );\n max = Math.max(\n prevMinmaxData[idx2_0 + 1],\n prevMinmaxData[idx2_1 + 1],\n prevMinmaxData[idx2_2 + 1],\n prevMinmaxData[idx2_3 + 1]\n );\n }\n minmax[yx * 2] = min;\n minmax[yx * 2 + 1] = max;\n }\n }\n mipmapSize = mipmapSize / 2;\n }\n\n return minmaxData;\n}\n\nfunction sphericalProjection(n: vec3.Vec3Array, uv: vec2.Vec2Array) {\n const theta = Math.atan2(n[0], n[2]) / (2.0 * Math.PI) + 0.5;\n const phi = Math.acos(n[1]) / Math.PI;\n vec2.set(uv, theta, 1.0 - phi);\n}\n\nexport function sphericalProjectionTriangle(\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n sphericalProjection(na, uvA);\n sphericalProjection(nb, uvB);\n sphericalProjection(nc, uvC);\n let onSeam = false;\n for (let i = 0; i < 2; i++) {\n if (\n Math.abs(uvA[i] - uvB[i]) > 0.5 ||\n Math.abs(uvA[i] - uvC[i]) > 0.5 ||\n Math.abs(uvB[i] - uvC[i]) > 0.5\n ) {\n const maxU = Math.max(uvA[i], uvB[i], uvC[i]);\n if (maxU - uvA[i] > 0.5) {\n uvA[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvB[i] > 0.5) {\n uvB[i] += 1.0;\n onSeam = true;\n }\n if (maxU - uvC[i] > 0.5) {\n uvC[i] += 1.0;\n onSeam = true;\n }\n }\n }\n\n return onSeam;\n}\n\nfunction getMaxAxisIndex(n: vec3.Vec3Array) {\n const x = Math.abs(n[0]);\n const y = Math.abs(n[1]);\n const z = Math.abs(n[2]);\n return x > y && x > z ? 0 : y > z ? 1 : 2;\n}\n\nexport function triplanarProjectionTriangle(\n a: vec3.Vec3Array,\n b: vec3.Vec3Array,\n c: vec3.Vec3Array,\n na: vec3.Vec3Array,\n nb: vec3.Vec3Array,\n nc: vec3.Vec3Array,\n uvA: vec2.Vec2Array,\n uvB: vec2.Vec2Array,\n uvC: vec2.Vec2Array\n) {\n const tmpMaxX = Math.max(Math.abs(na[0]), Math.abs(nb[0]), Math.abs(nc[0]));\n const tmpMaxY = Math.max(Math.abs(na[1]), Math.abs(nb[1]), Math.abs(nc[1]));\n const tmpMaxZ = Math.max(Math.abs(na[2]), Math.abs(nb[2]), Math.abs(nc[2]));\n\n if (tmpMaxX > tmpMaxY && tmpMaxX > tmpMaxZ) {\n // yz\n vec2.set(uvA, a[1], a[2]);\n vec2.set(uvB, b[1], b[2]);\n vec2.set(uvC, c[1], c[2]);\n } else if (tmpMaxY > tmpMaxX && tmpMaxY > tmpMaxZ) {\n // xz\n vec2.set(uvA, a[0], a[2]);\n vec2.set(uvB, b[0], b[2]);\n vec2.set(uvC, c[0], c[2]);\n } else {\n // xy\n vec2.set(uvA, a[0], a[1]);\n vec2.set(uvB, b[0], b[1]);\n vec2.set(uvC, c[0], c[1]);\n }\n}\n\nfunction findRoots(\n triAabbMinP: vec2.Vec2Array,\n triAabbMaxP: vec2.Vec2Array,\n maxDepth: number,\n roots: vec3.Vec3Array[]\n) {\n let d = vec2.sub(vec2.create(), triAabbMaxP, triAabbMinP);\n let size = Math.max(d[0], d[1]);\n let startMipLevel =\n maxDepth - Math.floor(Math.log2(Math.floor(1.0 / size))) - 1;\n if (!isFinite(startMipLevel)) {\n startMipLevel = maxDepth;\n }\n startMipLevel = Math.max(startMipLevel, 0);\n let rootCount = 0;\n while (true) {\n const mipSize = Math.pow(2.0, maxDepth - startMipLevel);\n const minTexelX = Math.floor(mipSize * triAabbMinP[0]);\n const minTexelY = Math.floor(mipSize * triAabbMinP[1]);\n const maxTexelX = Math.floor(mipSize * triAabbMaxP[0]);\n const maxTexelY = Math.floor(mipSize * triAabbMaxP[1]);\n\n if (\n (maxTexelX - minTexelX < 2 &&\n maxTexelY - minTexelY < 2 &&\n startMipLevel >= 0) ||\n startMipLevel >= maxDepth\n ) {\n for (let y = minTexelY; y <= maxTexelY; y++) {\n for (let x = minTexelX; x <= maxTexelX; x++) {\n if (rootCount < roots.length) {\n vec3.set(\n roots[rootCount],\n Math.floor(x),\n Math.floor(y),\n startMipLevel\n );\n rootCount++;\n }\n }\n }\n break;\n }\n\n startMipLevel++;\n }\n\n return rootCount;\n}\n\nexport function getTrianglesDisplacementRange(\n geometry: Geometry,\n heightTexture: Texture | undefined,\n material: OpenPBRMaterial\n) {\n const indices = geometry.indices.array;\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 if (triangleCount >= detailedProjectiveRangeTriangleLimit) {\n // A conservative full-height prism is much cheaper to prepare for dense\n // source meshes and remains intersection-safe. Per-triangle UV min/max is\n // retained for smaller meshes where tighter BVH nodes matter more.\n const conservative = new Float32Array(triangleCount * 2);\n for (let triangle = 0; triangle < triangleCount; triangle++) {\n conservative[triangle * 2 + 1] = 1;\n }\n return conservative;\n }\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 const maxDepth = Math.log2(heightImage.width);\n const trianglesDisplacementRange = new Float32Array((indices.length / 3) * 2);\n const normal = geometry.normal!.array;\n const position = geometry.position!.array;\n\n const uv1 = vec2.create();\n const uv2 = vec2.create();\n const uv3 = vec2.create();\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const n1 = vec3.create();\n const n2 = vec3.create();\n const n3 = vec3.create();\n\n const isTriplanar = uvProjection === 'triplanar';\n const isSpherical = uvProjection === 'spherical';\n const isCylindrical = uvProjection === 'cylindrical';\n const uvScale = material.displacementUvProjectionScale;\n\n const minUv = vec2.create();\n const maxUv = vec2.create();\n\n const roots: vec3.Vec3Array[] = [];\n for (let i = 0; i < 100; i++) {\n roots.push([0, 0, 0]);\n }\n for (let i = 0; i < indices.length; i += 3) {\n const i1 = indices[i];\n const i2 = indices[i + 1];\n const i3 = indices[i + 2];\n const i1_2 = i1 * 2;\n const i2_2 = i2 * 2;\n const i3_2 = i3 * 2;\n const i1_3 = i1 * 3;\n const i2_3 = i2 * 3;\n const i3_3 = i3 * 3;\n\n if (uvs) {\n vec2.set(uv1, uvs[i1_2], uvs[i1_2 + 1]);\n vec2.set(uv2, uvs[i2_2], uvs[i2_2 + 1]);\n vec2.set(uv3, uvs[i3_2], uvs[i3_2 + 1]);\n } else {\n vec2.set(uv1, 0, 0);\n vec2.set(uv2, 0, 0);\n vec2.set(uv3, 0, 0);\n }\n\n let onSeam = false;\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(n1, normal[i1_3], normal[i1_3 + 1], normal[i1_3 + 2]);\n vec3.set(n2, normal[i2_3], normal[i2_3 + 1], normal[i2_3 + 2]);\n vec3.set(n3, normal[i3_3], normal[i3_3 + 1], normal[i3_3 + 2]);\n vec3.normalize(n1, n1);\n vec3.normalize(n2, n2);\n vec3.normalize(n3, n3);\n if (isTriplanar || isSpherical || isCylindrical) {\n vec3.set(p1, position[i1_3], position[i1_3 + 1], position[i1_3 + 2]);\n vec3.set(p2, position[i2_3], position[i2_3 + 1], position[i2_3 + 2]);\n vec3.set(p3, position[i3_3], position[i3_3 + 1], position[i3_3 + 2]);\n }\n if (isTriplanar) {\n // Is on the seam. Needs full prism to avoid empty seams.\n const xMaxIndex = getMaxAxisIndex(n1);\n const yMaxIndex = getMaxAxisIndex(n2);\n const zMaxIndex = getMaxAxisIndex(n3);\n if (!(xMaxIndex === yMaxIndex && yMaxIndex === zMaxIndex)) {\n onSeam = true;\n }\n /* prettier-ignore */\n triplanarProjectionTriangle(\n p1, p2, p3,\n n1, n2, n3,\n uv1, uv2, uv3\n );\n } else if (isSpherical) {\n vec3.normalize(p1, p1);\n vec3.normalize(p2, p2);\n vec3.normalize(p3, p3);\n onSeam = sphericalProjectionTriangle(p1, p2, p3, uv1, uv2, uv3);\n } else {\n const u1 = Math.atan2(p1[2], p1[0]) / (Math.PI * 2) + 0.5;\n const u2 = Math.atan2(p2[2], p2[0]) / (Math.PI * 2) + 0.5;\n const u3 = Math.atan2(p3[2], p3[0]) / (Math.PI * 2) + 0.5;\n vec2.set(uv1, u1, p1[1]);\n vec2.set(uv2, u2, p2[1]);\n vec2.set(uv3, u3, p3[1]);\n onSeam = Math.max(u1, u2, u3) - Math.min(u1, u2, u3) > 0.5;\n }\n }\n vec2.scale(uv1, uv1, uvScale);\n vec2.scale(uv2, uv2, uvScale);\n vec2.scale(uv3, uv3, uvScale);\n\n // TODO PDM don't have zero area triangle issue.\n\n let minHeight = Infinity;\n let maxHeight = -Infinity;\n\n if (onSeam) {\n minHeight = 0.0;\n maxHeight = 255.0;\n } else {\n vec2.copy(maxUv, uv1);\n vec2.copy(minUv, uv1);\n vec2.min(minUv, minUv, uv2);\n vec2.min(minUv, minUv, uv3);\n vec2.max(maxUv, maxUv, uv2);\n vec2.max(maxUv, maxUv, uv3);\n\n const rootCount = findRoots(minUv, maxUv, maxDepth, roots);\n\n for (let k = 0; k < rootCount; k++) {\n const mipLevel = roots[k][2];\n const mipSize = Math.pow(2, maxDepth - mipLevel);\n const minmax = minmaxData[mipLevel];\n const x = ((roots[k][0] % mipSize) + mipSize) % mipSize;\n let y = ((roots[k][1] % mipSize) + mipSize) % mipSize;\n if (isFlipY) {\n y = mipSize - y - 1;\n }\n const idx = (y * mipSize + x) * 2;\n\n minHeight = Math.min(minHeight, minmax[idx]);\n maxHeight = Math.max(maxHeight, minmax[idx + 1]);\n }\n }\n\n // TODO this will cause flat surface optimization fail.\n // But not adding bias will leads to small gap between flat surface and displaced surface.\n trianglesDisplacementRange[(i / 3) * 2] = Math.max(\n (Math.floor(minHeight) - 4) / 255,\n 0\n );\n trianglesDisplacementRange[(i / 3) * 2 + 1] = Math.min(\n (Math.ceil(maxHeight) + 4) / 255,\n 1\n );\n }\n\n return trianglesDisplacementRange;\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 if (bias !== 0) {\n const positions = geometry.position.array.slice();\n const normals = geometry.normal.array;\n for (let vertex = 0; vertex < geometry.vertexCount; vertex++) {\n const p = vertex * geometry.position.itemSize, n = vertex * geometry.normal.itemSize;\n const length = Math.hypot(normals[n], normals[n + 1], normals[n + 2]);\n if (length > 0) {\n for (let axis = 0; axis < 3; axis++) positions[p + axis] += normals[n + axis] / length * bias;\n }\n }\n return { geometry: new Geometry({ ...geometry, position: new Attribute(positions, geometry.position.itemSize) }),\n displacementScale, trianglesDisplacement };\n }\n return { geometry, 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 const materialIndexMap = new Map<OpenPBRMaterial, number>();\n const geometryIndexMap = new Map<Geometry, number>();\n const geometries: Geometry[] = [];\n const materials: OpenPBRMaterial[] = [];\n const globalMaterialIndicesMap: number[][] = [];\n const emissiveBindings: {\n mesh: Mesh;\n geometry: Geometry;\n materialIndices: number[];\n }[] = [];\n const instanceBindings: PreparedMeshInstanceBinding[] = [];\n\n\n const instances = meshes\n .filter((mesh) => mesh.geometry.position?.array.length > 0)\n .map((mesh) => {\n let { geometry, displacementScale } = prepareMeshGeometryBvh(mesh, options.displacement !== false);\n const bvhBounds = getBvhBounds(geometry);\n const bounds = computeBounds(geometry, mesh.transform, bvhBounds);\n\n let geoIdx = geometryIndexMap.get(geometry);\n const materialsIndices = mesh.materials.map((material) => {\n const key = material;\n if (!materialIndexMap.has(key)) {\n materialIndexMap.set(key, materials.length);\n materials.push(material);\n }\n return materialIndexMap.get(key)!;\n });\n\n // Explicit vertex indices are global after merging. Batches with a\n // different material table need their own vertex region, even when the\n // table contains just one material. Equal tables can share the region.\n if (geoIdx != null && geometry.materialIndex &&\n (materialsIndices.length !== globalMaterialIndicesMap[geoIdx].length ||\n materialsIndices.some((index, i) => index !== globalMaterialIndicesMap[geoIdx!][i]))) {\n const bvh = getGeometryBvh(geometry);\n geometry = new Geometry(geometry);\n setGeometryBvh(geometry, bvh);\n geoIdx = undefined;\n }\n\n if (geoIdx == null) {\n geoIdx = geometries.length;\n geometryIndexMap.set(geometry, geometries.length);\n geometries.push(geometry);\n // Same number with geometries.\n globalMaterialIndicesMap.push(materialsIndices);\n }\n const instance = {\n bounds,\n blasIndex: geoIdx!,\n transform: mesh.transform,\n materialsIndices: materialsIndices.map((idx) =>\n packMaterialIndexAndWeightToInt(idx, 1)\n ),\n displacementScale\n } satisfies TLASInstance;\n if (!(mesh instanceof InstancedMesh) && (\n !bounds.min.every(isFinite) ||\n !bounds.max.every(isFinite) ||\n !mesh.transform.every(isFinite)\n )) {\n return undefined;\n }\n if (mesh.materials.some((material) =>\n !material.unlit && !material.shadowCatcher &&\n colorLuminance(material.emissionColor) * material.emissionLuminance > 1e-8\n )) {\n emissiveBindings.push({ mesh, geometry, materialIndices: materialsIndices });\n }\n instanceBindings.push({\n mesh,\n geometry,\n blasIndex: geoIdx,\n materialIndices: materialsIndices,\n displacementScale,\n bvhBounds\n });\n return instance;\n })\n .filter((instance) => instance != null) as TLASInstance[];\n\n const geometryRegions = new Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>();\n const geometry = mergeGeometry(geometries, globalMaterialIndicesMap, geometryRegions);\n\n return {\n geometry,\n geometries,\n geometryRegions,\n geometryStates: new Map(instanceBindings.map(binding => {\n const source = binding.mesh.geometry;\n return [source, { topologyVersion: source.topologyVersion, indices: source.indices.array,\n indexCount: source.indices.array.length }];\n })),\n instances: meshes.some(mesh => mesh instanceof InstancedMesh) ? updateMeshInstanceTransforms(instanceBindings) : instances,\n materials,\n instanceBindings,\n emissiveBindings,\n blases: geometries.map((geo) => ({\n bvh: getGeometryBvh(geo)!,\n verticesCount: geo.vertexCount,\n trainglesCount: geo.indices.array.length / 3\n }))\n };\n}\n\nfunction mergeGeometry(\n geometries: Geometry[],\n globalMaterialIndicesMap: number[][],\n regions: Map<Geometry, { vertexOffset: number; indexOffset: number; materialIndices: number[] }>\n) {\n const totalVertexCount = geometries.reduce(\n (sum, geo) => sum + geo.vertexCount,\n 0\n );\n const totalIndexCount = geometries.reduce(\n (sum, geo) => sum + geo.indices.array.length,\n 0\n );\n const positionAttrib = new Attribute(\n new Float32Array(3 * totalVertexCount),\n 3\n );\n const normalAttrib = new Attribute(new Float32Array(3 * totalVertexCount), 3);\n const uvAttrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const uv1Attrib = new Attribute(new Float32Array(2 * totalVertexCount), 2);\n const indexAttrib = new Attribute(new Uint32Array(totalIndexCount), 1);\n\n const materialIndexAttrib = new Attribute(\n new Int32Array(4 * totalVertexCount),\n 4\n );\n\n const hasColor = geometries.some((geo) => geo.color);\n const hasTangent = geometries.some((geo) => geo.tangent);\n\n const mergedGeometry = new Geometry({\n position: positionAttrib,\n normal: normalAttrib,\n uv: uvAttrib,\n uv1: uv1Attrib,\n materialIndex: materialIndexAttrib,\n color: hasColor\n ? new Attribute(new Float32Array(3 * totalVertexCount).fill(1), 3)\n : undefined,\n tangent: hasTangent\n ? new Attribute(new Float32Array(4 * totalVertexCount), 4)\n : undefined,\n indices: indexAttrib\n });\n\n let currentVertex = 0;\n let currentIndex = 0;\n\n geometries.forEach((geometry, idx) => {\n const vertexCount = geometry.vertexCount;\n const globalMaterialIndex = globalMaterialIndicesMap[idx];\n regions.set(geometry, { vertexOffset: currentVertex, indexOffset: currentIndex, materialIndices: globalMaterialIndex });\n\n positionAttrib.array.set(geometry.position!.array, currentVertex * 3);\n normalAttrib.array.set(geometry.normal!.array, currentVertex * 3);\n if (geometry.uv) {\n uvAttrib.array.set(geometry.uv.array, currentVertex * 2);\n }\n uv1Attrib.array.set(\n (geometry.uv1 ?? geometry.uv)?.array ?? new Float32Array(vertexCount * 2),\n currentVertex * 2\n );\n if (geometry.color) {\n mergedGeometry.color!.array.set(geometry.color.array, currentVertex * 3);\n }\n if (geometry.tangent) {\n const source = geometry.tangent;\n for (let v = 0; v < vertexCount; v++) {\n for (let c = 0; c < 4; c++) mergedGeometry.tangent!.array[(currentVertex + v) * 4 + c] =\n c < source.itemSize ? source.array[v * source.itemSize + c] : hasGeneratedVertexTangents(geometry) ? 0 : 2;\n }\n }\n\n writeMaterialIndices(geometry, globalMaterialIndex, materialIndexAttrib.array, currentVertex);\n\n const meshIndices = geometry.indices.array;\n for (let i = 0; i < meshIndices.length; i++) {\n indexAttrib.array[currentIndex + i] = currentVertex + meshIndices[i];\n }\n currentVertex += vertexCount;\n currentIndex += meshIndices.length;\n });\n\n return mergedGeometry;\n}\n\nfunction computeGeometryNormals(geometry: Geometry) {\n const indices = geometry.indices;\n const positions = geometry.position.array;\n geometry.normal = new Attribute(new Float32Array(positions.length), 3);\n const normals = geometry.normal.array;\n\n const p1 = vec3.create();\n const p2 = vec3.create();\n const p3 = vec3.create();\n\n const v21 = vec3.create();\n const v32 = vec3.create();\n\n const n = vec3.create();\n\n const len = indices\n ? indices.array.length\n : geometry.vertexCount;\n let i1, i2, i3;\n for (let f = 0; f < len; ) {\n if (indices) {\n i1 = indices.array[f++];\n i2 = indices.array[f++];\n i3 = indices.array[f++];\n } else {\n i1 = f++;\n i2 = f++;\n i3 = f++;\n }\n\n vec3.set(\n p1,\n positions[i1 * 3],\n positions[i1 * 3 + 1],\n positions[i1 * 3 + 2]\n );\n vec3.set(\n p2,\n positions[i2 * 3],\n positions[i2 * 3 + 1],\n positions[i2 * 3 + 2]\n );\n vec3.set(\n p3,\n positions[i3 * 3],\n positions[i3 * 3 + 1],\n positions[i3 * 3 + 2]\n );\n\n vec3.sub(v21, p1, p2);\n vec3.sub(v32, p2, p3);\n vec3.cross(n, v21, v32);\n // Already be weighted by the triangle area\n for (let i = 0; i < 3; i++) {\n normals[i1 * 3 + i] = normals[i1 * 3 + i] + n[i];\n normals[i2 * 3 + i] = normals[i2 * 3 + i] + n[i];\n normals[i3 * 3 + i] = normals[i3 * 3 + i] + n[i];\n }\n }\n\n for (let i = 0; i < normals.length; ) {\n vec3.set(n, normals[i], normals[i + 1], normals[i + 2]);\n vec3.normalize(n, n);\n normals[i++] = n[0];\n normals[i++] = n[1];\n normals[i++] = n[2];\n }\n}\n\n/** Batch records are regenerated together; refit all numeric source slots. */\nexport function dirtyMeshInstanceIndices(bindings: PreparedMeshInstanceBinding[], meshes: ReadonlySet<Mesh>, instances: MeshInstances) {\n if (instances instanceof PackedMeshInstances) return new Set(Array.from({length: instances.length}, (_, i) => i));\n return new Set(bindings.flatMap((binding, i) => meshes.has(binding.mesh) ? [i] : []));\n}\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 (!(instances instanceof PackedMeshInstances)) 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"]}
|
|
@@ -22,7 +22,7 @@ export function snapshotFields(object) {
|
|
|
22
22
|
}
|
|
23
23
|
function snapshotTexture(texture) {
|
|
24
24
|
return texture ? [texture, texture.version, texture.image, texture.flipY,
|
|
25
|
-
texture.uvScale, texture.uvOffset, texture.uvChannel] : [undefined];
|
|
25
|
+
texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];
|
|
26
26
|
}
|
|
27
27
|
export function snapshotsEqual(a, b) {
|
|
28
28
|
return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));
|
|
@@ -51,6 +51,9 @@ function captureMaterialTextures(material, out) {
|
|
|
51
51
|
out[i++] = texture.uvScale;
|
|
52
52
|
out[i++] = texture.uvOffset;
|
|
53
53
|
out[i++] = texture.uvChannel;
|
|
54
|
+
out[i++] = texture.wrapS;
|
|
55
|
+
out[i++] = texture.wrapT;
|
|
56
|
+
out[i++] = texture.colorSpace;
|
|
54
57
|
}
|
|
55
58
|
out.length = i;
|
|
56
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport { Scene, SceneBackground } from '../scene/Scene.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel] : [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;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\nconst geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'] as const;\nfunction captureGeometryStorage(geometry: Geometry, out: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n out[i++] = attribute?.array; out[i++] = attribute?.array.length; out[i++] = attribute?.itemSize;\n }\n}\nfunction geometryStorageMatches(geometry: Geometry, storage: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize) return false;\n }\n return true;\n}\n\ninterface MeshSnapshot {\n mesh: Mesh;\n geometry: Mesh['geometry'];\n version: number;\n instanceVersion?: number;\n instanceCount?: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion?: number;\n dynamic: boolean;\n storage: unknown[];\n materials: OpenPBRMaterial[];\n}\ninterface Snapshot {\n meshList: Mesh[];\n meshes: MeshSnapshot[];\n matrices: Float64Array;\n materials: Map<OpenPBRMaterial, { values: readonly unknown[]; textures: unknown[] }>;\n lightList: Scene['lights'];\n lights: unknown[][];\n background: unknown[];\n}\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _snapshot?: Snapshot;\n private _pending?: Snapshot;\n private _spare?: Snapshot;\n private _seen = new Set<OpenPBRMaterial>();\n detect(scene: Scene): SceneChanges {\n const old = this._snapshot;\n let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;\n const transforms: Mesh[] = [];\n const colors: InstancedMesh[] = [];\n const geometries = new Set<Geometry>();\n const materials: OpenPBRMaterial[] = [];\n const seen = this._seen;\n seen.clear();\n for (let i = 0; i < scene.meshes.length; i++) {\n const mesh = scene.meshes[i];\n const prev = old?.meshes[i];\n let instanceChanged = false;\n if (mesh instanceof InstancedMesh) {\n mesh.validate();\n if (prev?.instanceCount !== mesh.count) full = true;\n if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors)) colors.push(mesh);\n if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {\n transforms.push(mesh); instanceChanged = true;\n }\n }\n if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||\n prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||\n prev.materials.some((m, k) => m !== mesh.materials[k])) full = true;\n if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version) geometries.add(mesh.geometry);\n if (prev?.mesh === mesh) {\n for (let k = 0; k < 16; k++) {\n if (!Object.is(mesh.transform[k], old!.matrices[i * 16 + k])) {\n if (!instanceChanged) transforms.push(mesh);\n break;\n }\n }\n }\n for (const material of mesh.materials) {\n if (seen.has(material)) continue;\n seen.add(material);\n const prior = old?.materials.get(material);\n if (!prior || !materialParametersEqual(material, prior.values) ||\n materialTexturesChanged(material, prior.textures)) materials.push(material);\n }\n }\n const lights = scene.lights.map(snapshotFields);\n const background = backgroundSnapshot(scene.background);\n const changes: SceneChanges = {\n meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',\n transforms, colors, materials, geometries: [...geometries],\n lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||\n lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),\n background: !old || !snapshotsEqual(background, old.background)\n };\n if (changes.meshes !== 'none' || changes.lights || changes.background) {\n // Write into the other buffer: detect never mutates committed state.\n // Repeated detects without commit overwrite the same pending buffer.\n let next = this._spare;\n if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {\n next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),\n materials: new Map(), lightList: scene.lights, lights: [], background: [] };\n this._spare = next;\n }\n scene.meshes.forEach((mesh, i) => {\n let item = next!.meshes[i];\n if (!item) {\n item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],\n materials: [] };\n next!.meshes[i] = item;\n }\n item.mesh = mesh; item.geometry = mesh.geometry; item.version = mesh.geometry.version;\n item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;\n item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;\n item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;\n item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;\n item.dynamic = mesh.geometry.dynamic; captureGeometryStorage(mesh.geometry, item.storage);\n item.materials.length = mesh.materials.length;\n for (let k = 0; k < mesh.materials.length; k++) item.materials[k] = mesh.materials[k];\n next!.matrices.set(mesh.transform, i * 16);\n });\n for (const material of next.materials.keys()) if (!seen.has(material)) next.materials.delete(material);\n const changedMaterials = new Set(materials);\n for (const material of seen) {\n const previous = old?.materials.get(material);\n if (previous && !changedMaterials.has(material)) {\n next.materials.set(material, previous);\n } else {\n // Never overwrite a shared committed entry. The other buffer's\n // retired entry can reuse its texture storage; parameter arrays and\n // their reused vector snapshots remain immutable after capture.\n let item = next.materials.get(material);\n if (!item || item === previous) item = { values: [], textures: [] };\n item.values = snapshotMaterialParameters(material, previous?.values);\n captureMaterialTextures(material, item.textures);\n next.materials.set(material, item);\n }\n }\n next.lightList = scene.lights; next.lights = lights; next.background = background;\n this._pending = next;\n } else this._pending = old;\n return changes;\n }\n\n commit() {\n if (this._pending && this._pending !== this._snapshot) {\n this._spare = this._snapshot;\n this._snapshot = this._pending;\n }\n this._pending = undefined;\n }\n reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sceneChangeDetector.js","sourceRoot":"","sources":["../../src/renderer/sceneChangeDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { openPbrSchema } from '../scene/openPbrSchema.js';\nimport { materialParametersEqual, materialTexturesChanged } from './materialComparison.generated.js';\nexport { materialParametersEqual } from './materialComparison.generated.js';\nimport Mesh from '../scene/Mesh.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport Geometry from '../scene/Geometry.js';\nimport OpenPBRMaterial, { materialTextureKeys } from '../scene/OpenPBRMaterial.js';\nimport Texture from '../scene/Texture.js';\nimport { Scene, SceneBackground } from '../scene/Scene.js';\n\nexport interface SceneChanges {\n meshes: 'none' | 'incremental' | 'full';\n transforms: Mesh[];\n colors: InstancedMesh[];\n geometries: Geometry[];\n materials: OpenPBRMaterial[];\n lights: boolean;\n background: boolean;\n}\n\n/** Small scalar/identity snapshots for lights, backgrounds and texture metadata. */\nexport function snapshotFields(object: object): unknown[] {\n const values: unknown[] = [object];\n for (const key of Object.keys(object)) {\n const value = (object as Record<string, unknown>)[key];\n values.push(key);\n if (value instanceof Texture) values.push(...snapshotTexture(value));\n else if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n values.push(...Array.from(value as ArrayLike<number>));\n } else values.push(value);\n }\n return values;\n}\n\nfunction snapshotTexture(texture: Texture | undefined): unknown[] {\n return texture ? [texture, texture.version, texture.image, texture.flipY,\n texture.uvScale, texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined];\n}\n\nexport function snapshotsEqual(a: readonly unknown[], b: readonly unknown[]) {\n return a.length === b.length && a.every((v, i) => Object.is(v, b[i]));\n}\n\nfunction backgroundSnapshot(background: SceneBackground | undefined) {\n if (background instanceof Texture) return snapshotTexture(background);\n if (Array.isArray(background)) return [background, ...background];\n return background ? snapshotFields(background) : [undefined];\n}\n\nfunction captureMaterialTextures(material: OpenPBRMaterial, out: unknown[]) {\n let i = 0;\n for (const key of materialTextureKeys) {\n const texture = material[key];\n if (typeof texture === 'number') continue;\n if (!texture) { out[i++] = undefined; continue; }\n out[i++] = texture; out[i++] = texture.version; out[i++] = texture.image;\n out[i++] = texture.flipY; out[i++] = texture.uvScale; out[i++] = texture.uvOffset;\n out[i++] = texture.uvChannel; out[i++] = texture.wrapS; out[i++] = texture.wrapT; out[i++] = texture.colorSpace;\n }\n out.length = i;\n}\n\n// Texture references and metadata have their own snapshot.\nconst parameterKeys = openPbrSchema.filter(field => field.type !== 'texture').map(field => field.key);\n\nexport function snapshotMaterialParameters(material: OpenPBRMaterial, previous?: readonly unknown[]) {\n return parameterKeys.map((key, index) => {\n const value = material[key];\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n const array = value as ArrayLike<number>, prior = previous?.[index];\n if (Array.isArray(prior) && prior.length === array.length) {\n let equal = true;\n for (let i = 0; i < array.length; i++) if (!Object.is(array[i], prior[i])) { equal = false; break; }\n if (equal) return prior;\n }\n return Array.from(array);\n }\n return value;\n });\n}\n\nconst geometryAttributes = ['position', 'normal', 'tangent', 'uv', 'uv1', 'color', 'indices', 'materialIndex'] as const;\nfunction captureGeometryStorage(geometry: Geometry, out: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n out[i++] = attribute?.array; out[i++] = attribute?.array.length; out[i++] = attribute?.itemSize;\n }\n}\nfunction geometryStorageMatches(geometry: Geometry, storage: unknown[]) {\n let i = 0;\n for (const key of geometryAttributes) {\n const attribute = geometry[key];\n if (storage[i++] !== attribute?.array || storage[i++] !== attribute?.array.length || storage[i++] !== attribute?.itemSize) return false;\n }\n return true;\n}\n\ninterface MeshSnapshot {\n mesh: Mesh;\n geometry: Mesh['geometry'];\n version: number;\n instanceVersion?: number;\n instanceCount?: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion?: number;\n dynamic: boolean;\n storage: unknown[];\n materials: OpenPBRMaterial[];\n}\ninterface Snapshot {\n meshList: Mesh[];\n meshes: MeshSnapshot[];\n matrices: Float64Array;\n materials: Map<OpenPBRMaterial, { values: readonly unknown[]; textures: unknown[] }>;\n lightList: Scene['lights'];\n lights: unknown[][];\n background: unknown[];\n}\n\n/** Detects edits without accepting them until the pipeline has received the scene. */\nexport class SceneChangeDetector {\n private _snapshot?: Snapshot;\n private _pending?: Snapshot;\n private _spare?: Snapshot;\n private _seen = new Set<OpenPBRMaterial>();\n detect(scene: Scene): SceneChanges {\n const old = this._snapshot;\n let full = !old || old.meshList !== scene.meshes || old.meshes.length !== scene.meshes.length;\n const transforms: Mesh[] = [];\n const colors: InstancedMesh[] = [];\n const geometries = new Set<Geometry>();\n const materials: OpenPBRMaterial[] = [];\n const seen = this._seen;\n seen.clear();\n for (let i = 0; i < scene.meshes.length; i++) {\n const mesh = scene.meshes[i];\n const prev = old?.meshes[i];\n let instanceChanged = false;\n if (mesh instanceof InstancedMesh) {\n mesh.validate();\n if (prev?.instanceCount !== mesh.count) full = true;\n if (prev?.mesh === mesh && (prev.colorVersion !== mesh.colorsVersion || prev.instanceColors !== mesh.colors)) colors.push(mesh);\n if (prev?.mesh === mesh && (prev.instanceVersion !== mesh.transformsVersion || prev.instanceTransforms !== mesh.transforms)) {\n transforms.push(mesh); instanceChanged = true;\n }\n }\n if (!prev || prev.mesh !== mesh || prev.geometry !== mesh.geometry ||\n prev.dynamic !== mesh.geometry.dynamic || !geometryStorageMatches(mesh.geometry, prev.storage) || prev.materials.length !== mesh.materials.length ||\n prev.materials.some((m, k) => m !== mesh.materials[k])) full = true;\n if (prev?.geometry === mesh.geometry && prev.version !== mesh.geometry.version) geometries.add(mesh.geometry);\n if (prev?.mesh === mesh) {\n for (let k = 0; k < 16; k++) {\n if (!Object.is(mesh.transform[k], old!.matrices[i * 16 + k])) {\n if (!instanceChanged) transforms.push(mesh);\n break;\n }\n }\n }\n for (const material of mesh.materials) {\n if (seen.has(material)) continue;\n seen.add(material);\n const prior = old?.materials.get(material);\n if (!prior || !materialParametersEqual(material, prior.values) ||\n materialTexturesChanged(material, prior.textures)) materials.push(material);\n }\n }\n const lights = scene.lights.map(snapshotFields);\n const background = backgroundSnapshot(scene.background);\n const changes: SceneChanges = {\n meshes: full ? 'full' : transforms.length || colors.length || materials.length || geometries.size ? 'incremental' : 'none',\n transforms, colors, materials, geometries: [...geometries],\n lights: !old || old.lightList !== scene.lights || lights.length !== old.lights.length ||\n lights.some((light, i) => !snapshotsEqual(light, old.lights[i])),\n background: !old || !snapshotsEqual(background, old.background)\n };\n if (changes.meshes !== 'none' || changes.lights || changes.background) {\n // Write into the other buffer: detect never mutates committed state.\n // Repeated detects without commit overwrite the same pending buffer.\n let next = this._spare;\n if (!next || next.meshList !== scene.meshes || next.meshes.length !== scene.meshes.length) {\n next = { meshList: scene.meshes, meshes: [], matrices: new Float64Array(scene.meshes.length * 16),\n materials: new Map(), lightList: scene.lights, lights: [], background: [] };\n this._spare = next;\n }\n scene.meshes.forEach((mesh, i) => {\n let item = next!.meshes[i];\n if (!item) {\n item = { mesh, geometry: mesh.geometry, version: mesh.geometry.version, dynamic: mesh.geometry.dynamic, storage: [],\n materials: [] };\n next!.meshes[i] = item;\n }\n item.mesh = mesh; item.geometry = mesh.geometry; item.version = mesh.geometry.version;\n item.instanceVersion = mesh instanceof InstancedMesh ? mesh.transformsVersion : undefined;\n item.colorVersion = mesh instanceof InstancedMesh ? mesh.colorsVersion : undefined;\n item.instanceColors = mesh instanceof InstancedMesh ? mesh.colors : undefined;\n item.instanceCount = mesh instanceof InstancedMesh ? mesh.count : undefined;\n item.instanceTransforms = mesh instanceof InstancedMesh ? mesh.transforms : undefined;\n item.dynamic = mesh.geometry.dynamic; captureGeometryStorage(mesh.geometry, item.storage);\n item.materials.length = mesh.materials.length;\n for (let k = 0; k < mesh.materials.length; k++) item.materials[k] = mesh.materials[k];\n next!.matrices.set(mesh.transform, i * 16);\n });\n for (const material of next.materials.keys()) if (!seen.has(material)) next.materials.delete(material);\n const changedMaterials = new Set(materials);\n for (const material of seen) {\n const previous = old?.materials.get(material);\n if (previous && !changedMaterials.has(material)) {\n next.materials.set(material, previous);\n } else {\n // Never overwrite a shared committed entry. The other buffer's\n // retired entry can reuse its texture storage; parameter arrays and\n // their reused vector snapshots remain immutable after capture.\n let item = next.materials.get(material);\n if (!item || item === previous) item = { values: [], textures: [] };\n item.values = snapshotMaterialParameters(material, previous?.values);\n captureMaterialTextures(material, item.textures);\n next.materials.set(material, item);\n }\n }\n next.lightList = scene.lights; next.lights = lights; next.background = background;\n this._pending = next;\n } else this._pending = old;\n return changes;\n }\n\n commit() {\n if (this._pending && this._pending !== this._snapshot) {\n this._spare = this._snapshot;\n this._snapshot = this._pending;\n }\n this._pending = undefined;\n }\n reset() { this._snapshot = this._pending = this._spare = undefined; this._seen.clear(); }\n}\n"]}
|
|
@@ -7,7 +7,8 @@ export class SceneEnvironmentCache {
|
|
|
7
7
|
update(lights) {
|
|
8
8
|
const ambient = lights.filter(light => light.type === 'AmbientLight');
|
|
9
9
|
const environment = lights.filter(light => light.type === 'EnvironmentLight');
|
|
10
|
-
|
|
10
|
+
// Orientation changes only the shader directions, not the radiance or its CDF.
|
|
11
|
+
const next = [...ambient.map(snapshotFields), ...environment.map(light => [light, light.map, light.map.image, light.map.version, light.map.source, light.intensity])];
|
|
11
12
|
if (next.length !== this._snapshot.length ||
|
|
12
13
|
next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {
|
|
13
14
|
this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;
|
|
@@ -23,7 +24,7 @@ export class RectLightTextureTracker {
|
|
|
23
24
|
update(lights) {
|
|
24
25
|
const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);
|
|
25
26
|
const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,
|
|
26
|
-
texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel] : [undefined]);
|
|
27
|
+
texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined]);
|
|
27
28
|
const hasTexture = textures.some((texture) => !!texture);
|
|
28
29
|
const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);
|
|
29
30
|
this._snapshot = next;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,CAAwB;IACtC,MAAM,CAAC,MAA6B;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"sceneLightChanges.js","sourceRoot":"","sources":["../../src/renderer/sceneLightChanges.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAIxE,4EAA4E;AAC5E,MAAM,OAAO,qBAAqB;IACxB,SAAS,GAAgB,EAAE,CAAC;IAC5B,MAAM,CAAwB;IACtC,MAAM,CAAC,MAA6B;QAClC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC;QAC9E,+EAA+E;QAC/E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAiC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAChG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,uBAAuB;IAC1B,SAAS,GAAc,EAAE,CAAC;IAC1B,WAAW,GAAG,KAAK,CAAC;IAC5B,MAAM,CAAC,MAA6B;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK;YACzF,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAsB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1F,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["import { SceneLight } from '../scene/Scene.js';\nimport { snapshotFields, snapshotsEqual } from './sceneChangeDetector.js';\nimport { generateEnvMapFromSceneComponents } from './envMapCreation.js';\nimport { EnvironmentMapSource } from './envMapDistribution.js';\nimport Texture from '../scene/Texture.js';\n\n/** Synthesized environment data is retained across analytic-light edits. */\nexport class SceneEnvironmentCache {\n private _snapshot: unknown[][] = [];\n private _image?: EnvironmentMapSource;\n update(lights: readonly SceneLight[]) {\n const ambient = lights.filter(light => light.type === 'AmbientLight');\n const environment = lights.filter(light => light.type === 'EnvironmentLight');\n // Orientation changes only the shader directions, not the radiance or its CDF.\n const next = [...ambient.map(snapshotFields), ...environment.map(light =>\n [light, light.map, light.map.image, light.map.version, light.map.source, light.intensity])];\n if (next.length !== this._snapshot.length ||\n next.some((value, i) => !snapshotsEqual(value, this._snapshot[i]))) {\n this._image = next.length ? generateEnvMapFromSceneComponents(ambient, environment) : undefined;\n this._snapshot = next;\n }\n return this._image;\n }\n}\n\n/** Captures values before callers mutate a RectLight or its Texture in place. */\nexport class RectLightTextureTracker {\n private _snapshot: unknown[] = [];\n private _hadTexture = false;\n update(lights: readonly SceneLight[]) {\n const textures = lights.map(light => light.type === 'RectLight' ? light.texture : undefined);\n const next = textures.flatMap(texture => texture ? [texture, texture.version, texture.image,\n texture.flipY, ...texture.uvScale, ...texture.uvOffset, texture.uvChannel, texture.wrapS, texture.wrapT, texture.colorSpace] : [undefined]);\n const hasTexture = textures.some((texture): texture is Texture => !!texture);\n const changed = (this._hadTexture || hasTexture) && !snapshotsEqual(next, this._snapshot);\n this._snapshot = next;\n this._hadTexture = hasTexture;\n return changed;\n }\n}\n"]}
|