rayzee 9.1.0 → 9.1.2
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/rayzee.es.js +646 -640
- package/dist/rayzee.umd.js +21 -21
- package/package.json +1 -1
- package/src/Processor/IESParser.js +1 -2
- package/src/Processor/KernelManager.js +4 -1
- package/src/Processor/SceneProcessor.js +1 -2
- package/src/Stages/PathTracer.js +1 -1
- package/src/Stages/PathTracerStage.js +1 -2
- package/src/TSL/EmissiveSampling.js +1 -1
- package/src/TSL/GenerateKernel.js +1 -2
- package/src/TSL/ShadeKernel.js +3 -3
- package/src/managers/DenoisingManager.js +1 -1
package/dist/rayzee.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`three/webgpu`),require(`three/tsl`),require(`three`),require(`three/addons/lights/RectAreaLightTexturesLib.js`),require(`three/addons/helpers/RectAreaLightHelper.js`),require(`three/addons/loaders/GLTFLoader.js`),require(`three/addons/loaders/HDRLoader.js`),require(`three/addons/loaders/DRACOLoader.js`),require(`three/addons/loaders/KTX2Loader.js`),require(`three/addons/loaders/EXRLoader.js`),require(`three/addons/utils/SceneUtils.js`),require(`three/addons/utils/SkeletonUtils.js`),require(`three/addons/libs/meshopt_decoder.module.js`),require(`three/addons/libs/fflate.module.js`),require(`three/addons/controls/OrbitControls.js`),require(`three/addons/tsl/display/OutlineNode.js`),require(`three/addons/controls/TransformControls.js`)):typeof define==`function`&&define.amd?define([`exports`,`three/webgpu`,`three/tsl`,`three`,`three/addons/lights/RectAreaLightTexturesLib.js`,`three/addons/helpers/RectAreaLightHelper.js`,`three/addons/loaders/GLTFLoader.js`,`three/addons/loaders/HDRLoader.js`,`three/addons/loaders/DRACOLoader.js`,`three/addons/loaders/KTX2Loader.js`,`three/addons/loaders/EXRLoader.js`,`three/addons/utils/SceneUtils.js`,`three/addons/utils/SkeletonUtils.js`,`three/addons/libs/meshopt_decoder.module.js`,`three/addons/libs/fflate.module.js`,`three/addons/controls/OrbitControls.js`,`three/addons/tsl/display/OutlineNode.js`,`three/addons/controls/TransformControls.js`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Rayzee={},e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var v=Object.defineProperty,y=(e,t)=>()=>(e&&(t=e(e=0)),t),b=(e,t)=>{let n={};for(var r in e)v(n,r,{get:e[r],enumerable:!0});return t||v(n,Symbol.toStringTag,{value:`Module`}),n},x=t.WebGPUBackend.prototype.createNodeBuilder;t.WebGPUBackend.prototype.createNodeBuilder=function(e,t){let n=x.call(this,e,t);return Object.defineProperty(n,`allowGlobalVariables`,{get(){return this.material!==null},set(){},configurable:!0}),n};function S(e,n,r=Float32Array){let i=new t.StorageInstancedBufferAttribute(new r(0),n);return i.count=e,i.gpuByteLength=e*n*r.BYTES_PER_ELEMENT,i.isGPUOnly=!0,i}var C=t.WebGPUBackend.prototype.createStorageAttribute;t.WebGPUBackend.prototype.createStorageAttribute=function(e){let t=this.attributeUtils._getBufferAttribute(e);if(!t.isGPUOnly)return C.call(this,e);let n=this.get(t);n.buffer===void 0&&(n.buffer=this.device.createBuffer({label:t.name,size:t.gpuByteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}))};function w(e,t,n){let r=e.backend;r.createStorageAttribute(t);let i=r.get(t).buffer,a=0;for(let e of n)r.device.queue.writeBuffer(i,a,e,0,e.length),a+=e.byteLength;if(a!==t.gpuByteLength)throw RangeError(`uploadStorageChunks wrote ${a} bytes into a ${t.gpuByteLength}-byte buffer`)}function T(e,t,n,r,i){let a=e.backend;a.createStorageAttribute(t);let o=a.get(t).buffer,s=n.recordsPerChunk*n.lanesPerRecord,c=n.chunks[0].BYTES_PER_ELEMENT,l=r+i,u=r;for(;u<l;){let e=Math.floor(u/s),t=n.chunks[e],r=u-e*s,i=Math.min(t.length-r,l-u);a.device.queue.writeBuffer(o,u*c,t,r,i),u+=i}}var E=t.WebGPUBackend.prototype.updateAttribute;t.WebGPUBackend.prototype.updateAttribute=function(e){if(!this.attributeUtils._getBufferAttribute(e).isGPUOnly)return E.call(this,e)};var D=4096;function O(e){if(!this.trackTimestamp||this.isDisposed||this.currentQueryIndex+2>this.maxQueries)return null;let t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}var k=t.WebGPUBackend.prototype.initTimestampQuery;t.WebGPUBackend.prototype.initTimestampQuery=function(e,t,n){let r=this.trackTimestamp&&!this.timestampQueryPool[e];if(k.call(this,e,t,n),r){let r=this.timestampQueryPool[e];if(r&&r.maxQueries<D&&n.timestampWrites){let i=r.constructor,a=new i(this.device,e,D);a.allocateQueriesForContext=O,a.allocateQueriesForContext(t),this.timestampQueryPool[e]=a,n.timestampWrites.querySet=a.querySet,r.dispose()}}let i=n.timestampWrites;i&&i.beginningOfPassWriteIndex==null&&(n.timestampWrites=void 0)};function A(e,t){return new Proxy(e,{get(e,n,r){if(typeof n==`string`&&t.has(n))return e.get(n);let i=Reflect.get(e,n,r);return n===`toVar`&&typeof i==`function`?(...n)=>A(i.apply(e,n),t):i}})}function j(e,t=null){let r=(0,n.struct)(e,t),i=new Set(Object.keys(e)),a=(...e)=>A(r(...e),i);return a.layout=r.layout,a.isStruct=!0,a.wrap=e=>A(e,i),a}t.ContextNode.prototype.setup=function(e){let t=e.addContext(this.value);this.node.build(e),e.setContext(t)};var M=class{constructor(){this.scene=new r.Scene,this._helpers=new Map,this.visible=!1}add(e){if(this._helpers.has(e.uuid))return this._helpers.get(e.uuid);let t=this._createHelper(e);return t?(this._helpers.set(e.uuid,t),this.scene.add(t),t):null}remove(e){let t=this._helpers.get(e.uuid);t&&(t.dispose(),this.scene.remove(t),this._helpers.delete(e.uuid))}has(e){return this._helpers.has(e.uuid)}get isDrawing(){return this.visible&&this._helpers.size>0}update(){for(let e of this._helpers.values())e.update?.()}sync(e){let t=new Set(e.map(e=>e.uuid));for(let[e,n]of this._helpers)t.has(e)||(n.dispose(),this.scene.remove(n),this._helpers.delete(e));for(let t of e)this.add(t)}clear(){for(let e of this._helpers.values())e.dispose(),this.scene.remove(e);this._helpers.clear()}render(e,t){if(!this.isDrawing)return;let n=e.autoClear;e.autoClear=!1,e.clearDepth(),e.setRenderTarget(null),e.render(this.scene,t),e.autoClear=n}dispose(){this.clear()}_createHelper(e){return e.isRectAreaLight?new a.RectAreaLightHelper(e):e.isPointLight?new r.PointLightHelper(e,.5):e.isSpotLight?new r.SpotLightHelper(e):e.isDirectionalLight?new r.DirectionalLightHelper(e,.5):null}},N=(0,n.uniform)(0,`int`),P=N,F=new r.DataTexture(new Float32Array([.5,.5,.5,1]),1,1);F.type=r.FloatType,F.needsUpdate=!0;var I=new r.DataTexture(new Float32Array([.5,.5,0,1]),1,1);I.type=r.FloatType,I.needsUpdate=!0;var L=(0,n.texture)(F);L.setUpdateMatrix(!1);var
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`three/webgpu`),require(`three/tsl`),require(`three`),require(`three/addons/lights/RectAreaLightTexturesLib.js`),require(`three/addons/helpers/RectAreaLightHelper.js`),require(`three/addons/loaders/GLTFLoader.js`),require(`three/addons/loaders/HDRLoader.js`),require(`three/addons/loaders/DRACOLoader.js`),require(`three/addons/loaders/KTX2Loader.js`),require(`three/addons/loaders/EXRLoader.js`),require(`three/addons/utils/SceneUtils.js`),require(`three/addons/utils/SkeletonUtils.js`),require(`three/addons/libs/meshopt_decoder.module.js`),require(`three/addons/libs/fflate.module.js`),require(`three/addons/controls/OrbitControls.js`),require(`three/addons/tsl/display/OutlineNode.js`),require(`three/addons/controls/TransformControls.js`)):typeof define==`function`&&define.amd?define([`exports`,`three/webgpu`,`three/tsl`,`three`,`three/addons/lights/RectAreaLightTexturesLib.js`,`three/addons/helpers/RectAreaLightHelper.js`,`three/addons/loaders/GLTFLoader.js`,`three/addons/loaders/HDRLoader.js`,`three/addons/loaders/DRACOLoader.js`,`three/addons/loaders/KTX2Loader.js`,`three/addons/loaders/EXRLoader.js`,`three/addons/utils/SceneUtils.js`,`three/addons/utils/SkeletonUtils.js`,`three/addons/libs/meshopt_decoder.module.js`,`three/addons/libs/fflate.module.js`,`three/addons/controls/OrbitControls.js`,`three/addons/tsl/display/OutlineNode.js`,`three/addons/controls/TransformControls.js`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Rayzee={},e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE,e.THREE))})(this,function(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var v=Object.defineProperty,y=(e,t)=>()=>(e&&(t=e(e=0)),t),b=(e,t)=>{let n={};for(var r in e)v(n,r,{get:e[r],enumerable:!0});return t||v(n,Symbol.toStringTag,{value:`Module`}),n},x=t.WebGPUBackend.prototype.createNodeBuilder;t.WebGPUBackend.prototype.createNodeBuilder=function(e,t){let n=x.call(this,e,t);return Object.defineProperty(n,`allowGlobalVariables`,{get(){return this.material!==null},set(){},configurable:!0}),n};function S(e,n,r=Float32Array){let i=new t.StorageInstancedBufferAttribute(new r(0),n);return i.count=e,i.gpuByteLength=e*n*r.BYTES_PER_ELEMENT,i.isGPUOnly=!0,i}var C=t.WebGPUBackend.prototype.createStorageAttribute;t.WebGPUBackend.prototype.createStorageAttribute=function(e){let t=this.attributeUtils._getBufferAttribute(e);if(!t.isGPUOnly)return C.call(this,e);let n=this.get(t);n.buffer===void 0&&(n.buffer=this.device.createBuffer({label:t.name,size:t.gpuByteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}))};function w(e,t,n){let r=e.backend;r.createStorageAttribute(t);let i=r.get(t).buffer,a=0;for(let e of n)r.device.queue.writeBuffer(i,a,e,0,e.length),a+=e.byteLength;if(a!==t.gpuByteLength)throw RangeError(`uploadStorageChunks wrote ${a} bytes into a ${t.gpuByteLength}-byte buffer`)}function T(e,t,n,r,i){let a=e.backend;a.createStorageAttribute(t);let o=a.get(t).buffer,s=n.recordsPerChunk*n.lanesPerRecord,c=n.chunks[0].BYTES_PER_ELEMENT,l=r+i,u=r;for(;u<l;){let e=Math.floor(u/s),t=n.chunks[e],r=u-e*s,i=Math.min(t.length-r,l-u);a.device.queue.writeBuffer(o,u*c,t,r,i),u+=i}}var E=t.WebGPUBackend.prototype.updateAttribute;t.WebGPUBackend.prototype.updateAttribute=function(e){if(!this.attributeUtils._getBufferAttribute(e).isGPUOnly)return E.call(this,e)};var D=4096;function O(e){if(!this.trackTimestamp||this.isDisposed||this.currentQueryIndex+2>this.maxQueries)return null;let t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}var k=t.WebGPUBackend.prototype.initTimestampQuery;t.WebGPUBackend.prototype.initTimestampQuery=function(e,t,n){let r=this.trackTimestamp&&!this.timestampQueryPool[e];if(k.call(this,e,t,n),r){let r=this.timestampQueryPool[e];if(r&&r.maxQueries<D&&n.timestampWrites){let i=r.constructor,a=new i(this.device,e,D);a.allocateQueriesForContext=O,a.allocateQueriesForContext(t),this.timestampQueryPool[e]=a,n.timestampWrites.querySet=a.querySet,r.dispose()}}let i=n.timestampWrites;i&&i.beginningOfPassWriteIndex==null&&(n.timestampWrites=void 0)};function A(e,t){return new Proxy(e,{get(e,n,r){if(typeof n==`string`&&t.has(n))return e.get(n);let i=Reflect.get(e,n,r);return n===`toVar`&&typeof i==`function`?(...n)=>A(i.apply(e,n),t):i}})}function j(e,t=null){let r=(0,n.struct)(e,t),i=new Set(Object.keys(e)),a=(...e)=>A(r(...e),i);return a.layout=r.layout,a.isStruct=!0,a.wrap=e=>A(e,i),a}t.ContextNode.prototype.setup=function(e){let t=e.addContext(this.value);this.node.build(e),e.setContext(t)};var M=class{constructor(){this.scene=new r.Scene,this._helpers=new Map,this.visible=!1}add(e){if(this._helpers.has(e.uuid))return this._helpers.get(e.uuid);let t=this._createHelper(e);return t?(this._helpers.set(e.uuid,t),this.scene.add(t),t):null}remove(e){let t=this._helpers.get(e.uuid);t&&(t.dispose(),this.scene.remove(t),this._helpers.delete(e.uuid))}has(e){return this._helpers.has(e.uuid)}get isDrawing(){return this.visible&&this._helpers.size>0}update(){for(let e of this._helpers.values())e.update?.()}sync(e){let t=new Set(e.map(e=>e.uuid));for(let[e,n]of this._helpers)t.has(e)||(n.dispose(),this.scene.remove(n),this._helpers.delete(e));for(let t of e)this.add(t)}clear(){for(let e of this._helpers.values())e.dispose(),this.scene.remove(e);this._helpers.clear()}render(e,t){if(!this.isDrawing)return;let n=e.autoClear;e.autoClear=!1,e.clearDepth(),e.setRenderTarget(null),e.render(this.scene,t),e.autoClear=n}dispose(){this.clear()}_createHelper(e){return e.isRectAreaLight?new a.RectAreaLightHelper(e):e.isPointLight?new r.PointLightHelper(e,.5):e.isSpotLight?new r.SpotLightHelper(e):e.isDirectionalLight?new r.DirectionalLightHelper(e,.5):null}},N=(0,n.uniform)(0,`int`),P=N,F=new r.DataTexture(new Float32Array([.5,.5,.5,1]),1,1);F.type=r.FloatType,F.needsUpdate=!0;var I=new r.DataTexture(new Float32Array([.5,.5,0,1]),1,1);I.type=r.FloatType,I.needsUpdate=!0;var L=(0,n.texture)(F);L.setUpdateMatrix(!1);var R=(0,n.texture)(I);R.setUpdateMatrix(!1);var ee=(0,n.float)(.7548776662466927),te=(0,n.float)(.5698402909980532),ne=(0,n.wgslFn)(`
|
|
2
2
|
fn pcgHash( state: u32 ) -> u32 {
|
|
3
3
|
|
|
4
4
|
var s = state;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
return s;
|
|
9
9
|
|
|
10
10
|
}
|
|
11
|
-
`),
|
|
11
|
+
`),re=(0,n.wgslFn)(`
|
|
12
12
|
fn wang_hash( seed: u32 ) -> u32 {
|
|
13
13
|
|
|
14
14
|
var s = seed;
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
return s;
|
|
21
21
|
|
|
22
22
|
}
|
|
23
|
-
`),
|
|
23
|
+
`),z=e=>(e.assign(e.mul(1664525).add(1013904223)),(0,n.float)(e.shiftRight(8)).mul(1/16777216)),ie=e=>(e.assign(ne({state:e})),(0,n.float)(e.shiftRight(8)).mul(1/16777216)),ae=e=>{let t=z(e).mul(n.TWO_PI).toVar();return(0,n.vec2)((0,n.cos)(t),(0,n.sin)(t)).mul((0,n.sqrt)(z(e)))},oe=4096,se=(e,t,r,i)=>{let a=(0,n.uint)(i).bitAnd((0,n.uint)(63)),o=(0,n.float)(r).add((0,n.float)(t).mul(7)),s=(0,n.int)((0,n.fract)(o.mul(ee).add(.5)).mul(128)),c=(0,n.int)((0,n.fract)(o.mul(te).add(.5)).mul(128)),l=(0,n.int)(e.x).add(s).bitAnd((0,n.int)(127)),u=(0,n.int)(e.y).add(c).bitAnd((0,n.int)(127)),d=(0,n.int)(a).bitAnd((0,n.int)(7)),f=(0,n.int)(a).shiftRight((0,n.int)(3));return(0,n.ivec2)(d.mul((0,n.int)(128)).add(l),f.mul((0,n.int)(128)).add(u))},ce=(e,t,r,i)=>{let a=se(e,t,r,i),o=R.load(a).xy,s=(0,n.float)((0,n.uint)(i).shiftRight((0,n.uint)(6))),c=(0,n.fract)((0,n.vec2)(ee,te).mul(s));return(0,n.fract)(o.add(c))},le=(0,n.wgslFn)(`
|
|
24
24
|
fn haltonScrambled( index: i32, base: i32, scramble: u32 ) -> f32 {
|
|
25
25
|
|
|
26
26
|
var result = 0.0f;
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
return result;
|
|
50
50
|
|
|
51
51
|
}
|
|
52
|
-
`),
|
|
52
|
+
`),ue=(0,n.wgslFn)(`
|
|
53
53
|
fn owen_scramble( x: u32, seed: u32 ) -> u32 {
|
|
54
54
|
|
|
55
55
|
var v = reverseBits( x );
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
return reverseBits( v );
|
|
62
62
|
|
|
63
63
|
}
|
|
64
|
-
`),
|
|
64
|
+
`),de=(0,n.wgslFn)(`
|
|
65
65
|
fn sobol2D( index: u32 ) -> vec2u {
|
|
66
66
|
|
|
67
67
|
let r0 = reverseBits( index );
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
return vec2u( r0, x );
|
|
77
77
|
|
|
78
78
|
}
|
|
79
|
-
`),
|
|
79
|
+
`),fe=(0,n.wgslFn)(`
|
|
80
80
|
fn owen_scrambled_sobol( index: u32, dimension: u32, seed: u32 ) -> f32 {
|
|
81
81
|
|
|
82
82
|
let dimSeed = seed ^ ( dimension * 0x9e3779b9u + 0x6a09e667u );
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
return f32( owen_scramble( raw, dimSeed ) ) / 4294967296.0f;
|
|
87
87
|
|
|
88
88
|
}
|
|
89
|
-
`,[
|
|
89
|
+
`,[de,ue]),pe=(0,n.wgslFn)(`
|
|
90
90
|
fn owen_scrambled_sobol2D( index: u32, seed: u32 ) -> vec2f {
|
|
91
91
|
|
|
92
92
|
let shuffled = owen_scramble( index, seed ^ 0xa511e9b3u );
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
);
|
|
98
98
|
|
|
99
99
|
}
|
|
100
|
-
`,[
|
|
100
|
+
`,[de,ue]),me=(e,t,r,i,a,o,s,c)=>{let l=(0,n.select)(o.notEqual((0,n.int)(-1)),o,P),u=(0,n.vec4)(0).toVar();return(0,n.If)(l.equal((0,n.int)(0)),()=>{(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.x.assign(z(i)),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(z(i))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(z(i))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(z(i))})}).Else(()=>{u.x.assign(ie(i)),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(ie(i))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(ie(i))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(ie(i))})})}).ElseIf(l.equal((0,n.int)(1)),()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(s.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar();u.x.assign(le({index:(0,n.int)(c),base:(0,n.int)(2),scramble:i})),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(le({index:(0,n.int)(c),base:(0,n.int)(3),scramble:i}))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(le({index:(0,n.int)(c),base:(0,n.int)(5),scramble:i}))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(le({index:(0,n.int)(c),base:(0,n.int)(7),scramble:i}))})}).Else(()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(s.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar(),o=pe({index:(0,n.uint)(c),seed:i}).toVar();u.x.assign(o.x),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(o.y)}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{let e=pe({index:(0,n.uint)(c),seed:i.bitXor((0,n.uint)(1934584601))}).toVar();u.z.assign(e.x),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(e.y)})})}),u},he=(e,t,r,i,a,o,s)=>me(e,t,r,i,(0,n.int)(2),a,o,s).xy,ge=(e,t,r,i,a,o)=>{let s=(0,n.vec2)(0).toVar();return(0,n.If)(P.equal((0,n.int)(0)),()=>{let e=ie(i).toVar(),t=ie(i).toVar();s.assign((0,n.vec2)(e,t))}).ElseIf(P.equal((0,n.int)(1)),()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(a.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar();s.assign((0,n.vec2)(le({index:(0,n.int)(o),base:(0,n.int)(2),scramble:i}),le({index:(0,n.int)(o),base:(0,n.int)(3),scramble:i})))}).Else(()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(a.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar();s.assign(pe({index:(0,n.uint)(o),seed:i}))}),s},_e=(e,t,r,i,a,o)=>{let s=(0,n.float)(0).toVar();return(0,n.If)(P.equal((0,n.int)(0)),()=>{s.assign(ie(i))}).ElseIf(P.equal((0,n.int)(1)),()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(a.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar();s.assign(le({index:(0,n.int)(o),base:(0,n.int)(2),scramble:i}))}).Else(()=>{let i=ne({state:(0,n.uint)(e.x).add((0,n.uint)(e.y).mul((0,n.uint)(a.x))).bitXor((0,n.uint)(r).mul((0,n.uint)(1367130551))).bitXor((0,n.uint)(t).mul((0,n.uint)(625341585)))}).toVar();s.assign(fe({index:(0,n.uint)(o),dimension:(0,n.uint)(0),seed:i}))}),s},ve=(e,t,r,i,a,o)=>{let s=(0,n.vec2)(0).toVar();return(0,n.If)(r.lessThanEqual((0,n.int)(1)),()=>{s.assign(he(e,t,(0,n.int)(0),i,(0,n.int)(-1),a,o))}).Else(()=>{let a=(0,n.int)((0,n.sqrt)((0,n.float)(r))),c=r.add(a).sub(1).div(a),l=(0,n.mod)(t,a.mul(c)),u=(0,n.mod)(l,a),d=l.div(a),f=(0,n.vec2)((0,n.float)(u),(0,n.float)(d)).div((0,n.vec2)((0,n.float)(a),(0,n.float)(c))),p=(0,n.vec2)(z(i).toVar(),z(i).toVar()).toVar();(0,n.If)(r.greaterThan((0,n.int)(4)),()=>{let r=ce(e,t,(0,n.int)(0),o).mul(.1);p.assign((0,n.mix)(p,r,.2))}),p.divAssign((0,n.vec2)((0,n.float)(a),(0,n.float)(c))),s.assign(f.add(p))}),s},ye=(0,n.wgslFn)(`
|
|
101
101
|
fn getDecorrelatedSeed( pixelCoord: vec2f, rayIndex: i32, frame: u32 ) -> u32 {
|
|
102
102
|
|
|
103
103
|
// Use multiple primes for better decorrelation
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
return seed;
|
|
113
113
|
|
|
114
114
|
}
|
|
115
|
-
`,[ie,re]),z={ALWAYS:`always`,PER_CYCLE:`per_cycle`,PER_TILE:`per_tile`,CONDITIONAL:`conditional`},xe=class{constructor(e,t={}){this.name=e,this.enabled=t.enabled!==!1,this.executionMode=t.executionMode||z.ALWAYS,this.context=null,this.eventBus=null}initialize(e,t){this.context=e,this.eventBus=t,this.setupEventListeners()}setupEventListeners(){}shouldExecuteThisFrame(e){if(!this.enabled)return!1;let t=e.getState(`renderMode`)||0,n=e.getState(`tileRenderingComplete`);switch(this.executionMode){case z.ALWAYS:return!0;case z.PER_CYCLE:return t===0?!0:n===!0;case z.PER_TILE:return!0;case z.CONDITIONAL:return this.shouldExecute(e);default:return this.warn(`Unknown execution mode: ${this.executionMode}`),!0}}shouldExecute(e){return!0}render(e,t){throw Error(`render() must be implemented in ${this.name}`)}reset(){}setSize(e,t){}dispose(){}emit(e,t){this.eventBus&&this.eventBus.emit(e,t)}on(e,t){this.eventBus&&this.eventBus.on(e,t)}once(e,t){this.eventBus&&this.eventBus.once(e,t)}off(e,t){this.eventBus&&this.eventBus.off(e,t)}enable(){this.enabled||(this.enabled=!0,this.emit(`stage:enabled`,{stage:this.name}))}disable(){this.enabled&&(this.enabled=!1,this.emit(`stage:disabled`,{stage:this.name}))}toggle(){this.enabled?this.disable():this.enable()}isEnabled(){return this.enabled}log(...e){console.log(`[${this.name}]`,...e)}warn(...e){console.warn(`[${this.name}]`,...e)}error(...e){console.error(`[${this.name}]`,...e)}},Se=class{constructor(e,t,n={}){this.renderer=e,this.material=t,this.interactionModeEnabled=n.enabled===void 0?!0:n.enabled,this.interactionDelay=n.delay||100,this.interactionMode=!1,this.interactionTimeout=null,this.originalValues={},this.appliedValues={},this.wasAccumulationEnabled=!0,this.interactionQualitySettings={enableAccumulation:!1,...n.qualitySettings},this.onEnterCallback=n.onEnter||null,this.onExitCallback=n.onExit||null,this.onResetCallback=n.onReset||null}enterInteractionMode(){this.interactionModeEnabled&&(this.interactionMode?clearTimeout(this.interactionTimeout):(this.interactionMode=!0,this.originalValues={},this.appliedValues={},this.material.uniforms.enableAccumulation&&(this.wasAccumulationEnabled=this.material.uniforms.enableAccumulation.value),Object.keys(this.interactionQualitySettings).forEach(e=>{e===`pixelRatio`?(this.originalValues.dpr=this.renderer.getPixelRatio(),this.renderer.setPixelRatio(this.interactionQualitySettings.pixelRatio)):e===`enableAccumulation`||this.material.uniforms[e]&&(this.originalValues[e]=this.material.uniforms[e].value,this.material.uniforms[e].value=this._resolveQualityValue(e,this.interactionQualitySettings[e]),this.appliedValues[e]=this.material.uniforms[e].value)}),this.material.uniforms.enableAccumulation&&(this.originalValues.enableAccumulation=this.material.uniforms.enableAccumulation.value,this.material.uniforms.enableAccumulation.value=!1),this.material.uniforms.cameraIsMoving&&(this.originalValues.cameraIsMoving=this.material.uniforms.cameraIsMoving.value,this.material.uniforms.cameraIsMoving.value=!0),this.onEnterCallback&&this.onEnterCallback()),this.interactionTimeout=setTimeout(()=>{this.exitInteractionMode()},this.interactionDelay))}exitInteractionMode(){this.interactionMode&&(Object.keys(this.originalValues).forEach(e=>{if(e===`dpr`)this.renderer.setPixelRatio(this.originalValues.dpr);else if(this.material.uniforms[e]){let t=this.appliedValues[e];(t===void 0||this.material.uniforms[e].value===t)&&(this.material.uniforms[e].value=this.originalValues[e])}}),this.interactionMode=!1,this.originalValues={},this.appliedValues={},this.onExitCallback&&this.onExitCallback(),this.onResetCallback&&this.onResetCallback())}updateInteractionMode(e){e&&this.enterInteractionMode()}setInteractionModeEnabled(e){this.interactionModeEnabled=e,!e&&this.interactionMode&&(clearTimeout(this.interactionTimeout),this.exitInteractionMode())}updateQualitySettings(e){Object.assign(this.interactionQualitySettings,e),this.interactionMode&&Object.keys(e).forEach(t=>{t===`pixelRatio`?this.renderer.setPixelRatio(e.pixelRatio):this.material.uniforms[t]&&(this.material.uniforms[t].value=this._resolveQualityValue(t,e[t]),this.appliedValues[t]=this.material.uniforms[t].value)})}_resolveQualityValue(e,t){return typeof t==`function`?t(this.originalValues[e]??this.material.uniforms[e].value):t}setInteractionDelay(e){this.interactionDelay=e}getState(){return{interactionMode:this.interactionMode,interactionModeEnabled:this.interactionModeEnabled,interactionDelay:this.interactionDelay,hasTimeout:this.interactionTimeout!==null,qualitySettings:{...this.interactionQualitySettings},originalValues:{...this.originalValues},wasAccumulationEnabled:this.wasAccumulationEnabled}}forceExitInteractionMode(){this.interactionTimeout&&=(clearTimeout(this.interactionTimeout),null),this.exitInteractionMode()}isInInteractionMode(){return this.interactionMode}setCallbacks(e){e.onEnter&&(this.onEnterCallback=e.onEnter),e.onExit&&(this.onExitCallback=e.onExit),e.onReset&&(this.onResetCallback=e.onReset)}static createQualityPreset(e){let t={"ultra-low":{maxBounceCount:1,pixelRatio:.125,enableAccumulation:!1},low:{maxBounceCount:1,pixelRatio:.25,enableAccumulation:!1},medium:{maxBounceCount:2,pixelRatio:.5,enableAccumulation:!1},high:{maxBounceCount:3,pixelRatio:.75,enableAccumulation:!0}};return t[e]||t.low}dispose(){this.interactionTimeout&&=(clearTimeout(this.interactionTimeout),null),this.interactionMode&&this.forceExitInteractionMode(),this.onEnterCallback=null,this.onExitCallback=null,this.onResetCallback=null}},B,Ce=y((()=>{B={RENDER_COMPLETE:`engine:renderComplete`,RENDER_RESET:`engine:renderReset`,FRAME:`engine:frame`,DENOISING_START:`engine:denoisingStart`,DENOISING_END:`engine:denoisingEnd`,UPSCALING_START:`engine:upscalingStart`,UPSCALING_PROGRESS:`engine:upscalingProgress`,UPSCALING_END:`engine:upscalingEnd`,LOADING_UPDATE:`engine:loadingUpdate`,LOADING_RESET:`engine:loadingReset`,STATS_UPDATE:`engine:statsUpdate`,OBJECT_SELECTED:`engine:objectSelected`,OBJECT_DESELECTED:`engine:objectDeselected`,OBJECT_DOUBLE_CLICKED:`engine:objectDoubleClicked`,SELECT_MODE_CHANGED:`engine:selectModeChanged`,OBJECT_TRANSFORM_START:`engine:objectTransformStart`,OBJECT_TRANSFORM_END:`engine:objectTransformEnd`,TRANSFORM_MODE_CHANGED:`engine:transformModeChanged`,AUTO_FOCUS_UPDATED:`engine:autoFocusUpdated`,ORTHO_HEIGHT_UPDATED:`engine:orthoHeightUpdated`,AUTO_EXPOSURE_UPDATED:`engine:autoExposureUpdated`,AF_POINT_PLACED:`engine:afPointPlaced`,SETTING_CHANGED:`engine:settingChanged`,ANIMATION_STARTED:`engine:animationStarted`,ANIMATION_PAUSED:`engine:animationPaused`,ANIMATION_STOPPED:`engine:animationStopped`,ANIMATION_FINISHED:`engine:animationFinished`,TIMELINE_CHANGED:`engine:timelineChanged`,VIDEO_RENDER_PROGRESS:`engine:videoRenderProgress`,VIDEO_RENDER_COMPLETE:`engine:videoRenderComplete`,DISPOSE:`engine:dispose`,DEVICE_LOST:`engine:deviceLost`,ISSUE:`engine:issue`,SCENE_METADATA_APPLIED:`engine:sceneMetadataApplied`,STORAGE_CHANGED:`engine:storageChanged`}}));Ce();var V=null;function we(e){V=e}var Te=()=>V?.({type:B.LOADING_RESET}),H=e=>{V?.({type:B.LOADING_UPDATE,...e})},Ee=e=>{V?.({type:B.STATS_UPDATE,...e})};function De(e){return e.frameCount||0}function Oe(e){if(Array.isArray(e))e.forEach(e=>{e.userData&&e.userData.isFallback||(ke(e),e.dispose())});else{if(e.userData&&e.userData.isFallback)return;ke(e),e.dispose()}}function ke(e){e&&[`alphaMap`,`aoMap`,`bumpMap`,`clearcoatMap`,`clearcoatNormalMap`,`clearcoatRoughnessMap`,`displacementMap`,`emissiveMap`,`envMap`,`gradientMap`,`lightMap`,`map`,`metalnessMap`,`normalMap`,`roughnessMap`,`specularMap`,`sheenColorMap`,`sheenRoughnessMap`,`specularIntensityMap`,`specularColorMap`,`thicknessMap`,`transmissionMap`].forEach(t=>{e[t]&&(e[t].dispose(),e[t]=null)})}function Ae({material:e,geometry:t,children:n}){if(e&&Oe(e),t&&t.dispose(),n.length>0)for(let e of n)Ae(e)}function je(e){if(!e)return;e._canvasTarget&&e._onCanvasTargetResize&&e._canvasTarget.removeEventListener(`resize`,e._onCanvasTargetResize);let t=e.dispose();return e._canvasTarget=null,t}function Me(e,t=[]){if(e&&!(t.includes(e.name)||e.isScene)){if(e.isMaterial){Oe(e);return}for(;e.children.length>0;)for(let t of e.children)Me(t);Ae(e),e.removeFromParent(),e.clear()}}function Ne(e){e?.traverse(e=>{e.geometry?.userData?.__rayzeeOwned&&e.geometry.dispose()})}function Pe(e,t){return t}function Fe(e,t=!1){return t?1:1/(e+1)}function Ie(){let e=0,t=0,n=0,r=0;return{start(){e=performance.now()},end(){t=performance.now();let i=t-e;return r+=i,n++,i},getAverageFrameTime(){return n>0?r/n:0},getFPS(){let e=this.getAverageFrameTime();return e>0?1e3/e:0},reset(){n=0,r=0}}}var Le=Math.PI/180;function Re(e){let t=2*Math.PI*(e-1)/365;return .006918-.399912*Math.cos(t)+.070257*Math.sin(t)-.006758*Math.cos(2*t)+907e-6*Math.sin(2*t)-.002697*Math.cos(3*t)+.00148*Math.sin(3*t)}function ze({hours:e,dayOfYear:t,latitude:n}){let r=Re(t),i=(e-12)*15*Le,a=n*Le,o=Math.sin(a)*Math.sin(r)+Math.cos(a)*Math.cos(r)*Math.cos(i),s=Math.asin(Math.min(1,Math.max(-1,o)))/Le;return{azimuth:(Math.atan2(Math.sin(i),Math.cos(i)*Math.sin(a)-Math.tan(r)*Math.cos(a))/Le+540)%360,elevation:s}}function Be({elevation:e,dayOfYear:t,latitude:n,afternoon:r=!1}){let i=Re(t),a=n*Le,o=(Math.sin(e*Le)-Math.sin(a)*Math.sin(i))/(Math.cos(a)*Math.cos(i)),s=Math.acos(Math.min(1,Math.max(-1,o)))/Le/15;return r?12+s:12-s}var Ve=e=>[0,31,59,90,120,151,181,212,243,273,304,334][e-1]+21,He=Object.freeze({time:10,month:3,latitude:40}),Ue=ze({hours:He.time,dayOfYear:Ve(He.month),latitude:He.latitude}),We=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`look`}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`physical`})});function Ge(e=`viewer`){let t=We[e];if(!t)throw Error(`unknown render profile "${e}" — expected one of ${Object.keys(We).join(`, `)}`);return t}var U={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:We.viewer.toneMapping,exposure:1,saturation:We.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:We.viewer.environmentRotation,groundProjectionEnabled:!1,groundProjectionRadius:100,groundProjectionHeight:15,groundProjectionLevel:0,enableGroundCatcher:!1,groundCatcherHeight:0,globalIlluminationIntensity:1,environmentMode:`hdri`,gradientZenithColor:`#0077BE`,gradientHorizonColor:`#87CEEB`,gradientGroundColor:`#654321`,solidSkyColor:`#87CEEB`,skySunAzimuth:180-Ue.azimuth,skySunElevation:Ue.elevation,skySunStrength:1,skySunSize:.53,skyTurbidity:2,skyOzone:300,skyAirDensity:1,skyGroundAlbedo:`#959595`,skyAltitude:50,skyPreset:`clearDay`,cameraProjection:`perspective`,panoramaLonRange:[-180,180],panoramaLatRange:[-90,90],panoramaLevelHorizon:!0,enableDOF:!1,fov:55,focusDistance:.8,aperture:5.6,focalLength:50,apertureScale:1,anamorphicRatio:1,unitsPerMetre:1,dofMode:We.viewer.dofMode,dofBlur:.05,autoFocusMode:`auto`,afScreenPoint:{x:.5,y:.5},afSmoothingFactor:.15,enablePathTracer:!0,enableAccumulation:!0,pauseRendering:!1,maxSamples:60,bounces:3,transmissiveBounces:5,maxSubsurfaceSteps:8,maxTransparentBounces:32,useAdaptiveSampling:!0,noiseThreshold:.1,adaptiveMinSamples:8,adaptiveStopFraction:.9,usePixelFreeze:!0,pixelFreezeThreshold:.02,pixelFreezeStability:8,convergenceOverlay:!1,samplingTechnique:2,enableEmissiveTriangleSampling:!1,emissiveBoost:1,fireflyThreshold:3,shadowTerminatorOffset:.1,wavefrontSortMaterials:!0,renderLimitMode:`frames`,renderTimeLimit:30,renderMode:0,enableAlphaShadows:!1,tilesHelper:!0,showLightHelper:!1,directionalLightIntensity:0,directionalLightColor:`#ffffff`,directionalLightPosition:[1,1,1],directionalLightAngle:0,filterStrength:1,edgeAtrousIterations:5,edgePhiLuminance:4,edgePhiNormal:64,edgePhiDepth:.1,enableOIDN:!1,oidnQuality:`fast`,continuousDenoise:!1,continuousDenoiseInterval:8,oidnTemporalHistory:!0,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,interactionRenderScale:.5,debugVisScale:100,denoiserStrategy:`none`,enableASVGF:!1,asvgfTemporalAlpha:.1,asvgfAtrousIterations:8,asvgfPhiColor:10,asvgfPhiNormal:128,asvgfPhiDepth:1,asvgfVarianceBoost:1,asvgfMaxAccumFrames:32,asvgfGradientStrength:1,asvgfGradientSigmaScale:2,asvgfGradientNoiseFloor:0,asvgfDebugMode:0,asvgfQualityPreset:`medium`,showAsvgfHeatmap:!1,nrdQualityPreset:`medium`,nrdDebugMode:0,autoExposure:!1,autoExposureKeyValue:.18,autoExposureMinExposure:.1,autoExposureMaxExposure:20,autoExposureAdaptSpeedBright:3,autoExposureAdaptSpeedDark:.5},Ke=Object.freeze({perspective:0,equirectangular:1,orthographic:2}),qe=6e4,Je=3,Ye=.1,Xe=.01,Ze=4096,W=2048;function Qe(e){return W=Math.max(256,Math.min(Ze,Math.floor(e)||256)),W}var $e={low:{temporalAlpha:.1,gradientStrength:.8,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:3,phiColor:1,phiNormal:64,phiDepth:.1,phiLuminance:6,maxAccumFrames:16,varianceBoost:.5},medium:{temporalAlpha:.03,gradientStrength:1,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:4,phiColor:.5,phiNormal:128,phiDepth:.05,phiLuminance:4,maxAccumFrames:64,varianceBoost:1},high:{temporalAlpha:0,gradientStrength:1,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:6,phiColor:.3,phiNormal:256,phiDepth:.02,phiLuminance:2,maxAccumFrames:128,varianceBoost:1.5}},et={maxAccumulatedFrameNum:30,maxFastAccumulatedFrameNum:6,maxStabilizedFrameNum:63,historyFixFrameNum:3,historyFixBasePixelStride:14,prepassBlurRadius:30,minBlurRadius:1,maxBlurRadius:30,lobeAngleFraction:.15,roughnessFraction:.15,planeDistanceSensitivity:.02,minHitDistanceWeight:.1,fastHistoryClampingSigmaScale:2,fireflySuppressorMinRelativeScale:2,enableAntiFirefly:!0,antilagLuminanceSigmaScale:2,antilagLuminanceSensitivity:3,disocclusionThreshold:.01,convergenceS:1,convergenceB:.2,convergenceP:.8,lobeVolumePercent:.1,handoverFrames:0},tt=[`maxAccumulatedFrameNum`,`maxFastAccumulatedFrameNum`,`maxStabilizedFrameNum`,`historyFixFrameNum`,`prepassBlurRadius`,`maxBlurRadius`,`enableAntiFirefly`],nt={low:{maxAccumulatedFrameNum:16,maxFastAccumulatedFrameNum:4,maxStabilizedFrameNum:16,historyFixFrameNum:2,prepassBlurRadius:0,maxBlurRadius:20,enableAntiFirefly:!1},medium:{},high:{maxAccumulatedFrameNum:45,maxFastAccumulatedFrameNum:8,historyFixFrameNum:4,prepassBlurRadius:40,maxBlurRadius:40}},rt={fov:{min:10,max:90,default:U.fov},focusDistance:{min:.3,max:100,default:U.focusDistance},aperture:{options:[1.4,2,2.8,4,5.6,8,11,16],default:U.aperture},focalLength:{min:0,max:200,default:U.focalLength}},it={clearDay:{name:`Clear Day`,sunAzimuth:180-Ue.azimuth,sunElevation:Ue.elevation,turbidity:2,exposure:0},clearMorning:{name:`Clear Morning`,sunAzimuth:90,sunElevation:15,turbidity:2,exposure:1.4},clearNoon:{name:`Clear Noon`,sunAzimuth:180,sunElevation:70,turbidity:2,exposure:0},hazyAfternoon:{name:`Hazy Afternoon`,sunAzimuth:225,sunElevation:35,turbidity:4.5,exposure:.4},goldenHour:{name:`Golden Hour`,sunAzimuth:270,sunElevation:6,turbidity:2.5,exposure:2.7},sunset:{name:`Sunset`,sunAzimuth:270,sunElevation:1,turbidity:3,exposure:4.2},blueHour:{name:`Blue Hour`,sunAzimuth:270,sunElevation:-4,turbidity:2,exposure:7},mountain:{name:`Mountain Air`,sunAzimuth:135,sunElevation:40,turbidity:1.3,altitude:3e3,exposure:0}},at={portrait:{name:`Portrait`,description:`Shallow depth of field, background blur`,dofBlur:.1,aperture:1.4,focalLength:135,apertureScale:1},landscape:{name:`Landscape`,description:`Maximum depth of field, everything in focus`,dofBlur:.001,aperture:16,focalLength:24,apertureScale:.5},macro:{name:`Macro`,description:`Very thin focus plane for close-ups`,dofBlur:.14,aperture:1.4,focalLength:100,apertureScale:2},product:{name:`Product`,description:`Sharp detail with subtle background separation`,dofBlur:.013,aperture:2.8,focalLength:85,apertureScale:.4},architectural:{name:`Architectural`,description:`Deep focus for rooms and buildings`,dofBlur:.001,aperture:11,focalLength:16,apertureScale:.5},cinematic:{name:`Cinematic`,description:`Dramatic depth separation with anamorphic bokeh`,dofBlur:.13,aperture:1.4,focalLength:200,apertureScale:1,anamorphicRatio:1.5}},G={MANUAL:`manual`,AUTO:`auto`},ot={SMOOTHING_FACTOR:.15,RESET_THRESHOLD:.05,FALLBACK_DISTANCE:10,SNAP_THRESHOLD:.5},st={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11,UV_AB_OFFSET:12,UV_C_OFFSET:16,MATERIAL_FLAGS_OFFSET:18,MESH_INDEX_OFFSET:19},ct=16777215;function lt(e){return!e||!((e.transmission||0)===0&&(!(e.transparent|0)||(e.opacity??1)>=1))?0:e.alphaMode|0?2:1}function ut(e,t){return(e&ct|(t?.side??0)<<24|lt(t)<<26)>>>0}function dt(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}var K={SLOTS_PER_MATERIAL:33,FLOATS_PER_MATERIAL:132,IOR:0,TRANSMISSION:1,THICKNESS:2,EMISSIVE_INTENSITY:3,ATTENUATION_COLOR:4,ATTENUATION_DISTANCE:7,OPACITY:8,SIDE:9,TRANSPARENT:10,ALPHA_TEST:11,ALPHA_MODE:12,DEPTH_WRITE:13,NORMAL_SCALE:14,COLOR:16,METALNESS:19,EMISSIVE:20,ROUGHNESS:23,ALBEDO_MAP_INDEX:24,NORMAL_MAP_INDEX:25,ROUGHNESS_MAP_INDEX:26,METALNESS_MAP_INDEX:27,EMISSIVE_MAP_INDEX:28,BUMP_MAP_INDEX:29,CLEARCOAT:30,CLEARCOAT_ROUGHNESS:31,DISPERSION:32,VISIBLE:33,SHEEN:34,SHEEN_ROUGHNESS:35,SHEEN_COLOR:36,SPECULAR_INTENSITY:40,SPECULAR_COLOR:41,IRIDESCENCE:44,IRIDESCENCE_IOR:45,IRIDESCENCE_THICKNESS_RANGE:46,BUMP_SCALE:48,DISPLACEMENT_SCALE:49,DISPLACEMENT_MAP_INDEX:50,ALBEDO_TRANSFORM:52,NORMAL_TRANSFORM:60,ROUGHNESS_TRANSFORM:68,METALNESS_TRANSFORM:76,EMISSIVE_TRANSFORM:84,BUMP_TRANSFORM:92,DISPLACEMENT_TRANSFORM:100,SUBSURFACE_COLOR:108,SUBSURFACE:111,SUBSURFACE_RADIUS:112,SUBSURFACE_RADIUS_SCALE:115,SUBSURFACE_ANISOTROPY:116,ANISOTROPY:117,ANISOTROPY_ROTATION:118,ANISOTROPY_MAP_INDEX:119,TRANSMISSION_MAP_INDEX:120,CLEARCOAT_MAP_INDEX:121,CLEARCOAT_ROUGHNESS_MAP_INDEX:122,SHEEN_COLOR_MAP_INDEX:123,SHEEN_ROUGHNESS_MAP_INDEX:124,IRIDESCENCE_MAP_INDEX:125,IRIDESCENCE_THICKNESS_MAP_INDEX:126,SPECULAR_INTENSITY_MAP_INDEX:127,SPECULAR_COLOR_MAP_INDEX:128,SLOT:{IOR_TRANSMISSION:0,ATTENUATION:1,OPACITY_ALPHA:2,ALPHA_MODE:3,COLOR_METALNESS:4,EMISSIVE_ROUGHNESS:5,MAP_INDICES_A:6,MAP_INDICES_B:7,DISPERSION_SHEEN:8,SHEEN_COLOR:9,SPECULAR:10,IRIDESCENCE:11,BUMP_DISPLACEMENT:12,ALBEDO_TRANSFORM_A:13,ALBEDO_TRANSFORM_B:14,NORMAL_TRANSFORM_A:15,NORMAL_TRANSFORM_B:16,ROUGHNESS_TRANSFORM_A:17,ROUGHNESS_TRANSFORM_B:18,METALNESS_TRANSFORM_A:19,METALNESS_TRANSFORM_B:20,EMISSIVE_TRANSFORM_A:21,EMISSIVE_TRANSFORM_B:22,BUMP_TRANSFORM_A:23,BUMP_TRANSFORM_B:24,DISPLACEMENT_TRANSFORM_A:25,DISPLACEMENT_TRANSFORM_B:26,SUBSURFACE_A:27,SUBSURFACE_B:28,SUBSURFACE_C:29,EXT_MAP_INDICES_A:30,EXT_MAP_INDICES_B:31,EXT_MAP_INDICES_C:32}},ft=e=>Number.isFinite(e)&&e>0?e:0,q=pt({color:[1,1,1],emissive:[0,0,0],emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:0,attenuationColor:[1,1,1],attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:[0,0,0],specularIntensity:1,specularColor:[1,1,1],clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:[1,1],bumpScale:1,displacementScale:1,transparent:0,alphaTest:0,alphaMode:0,side:0,depthWrite:1,subsurface:0,subsurfaceColor:[1,1,1],subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0});function pt(e){for(let t of Object.values(e))typeof t==`object`&&Object.freeze(t);return Object.freeze(e)}var mt=1073741824,ht=1073741824,gt=1073741823,_t={TRIANGLE_LEAF:1073741824,BLAS_POINTER_LEAF:1073741825,FRONTIER:1073741826},vt=1<<27;function yt(e){return new Uint32Array(e.buffer,e.byteOffset,e.length)}function bt(e,t){if(e>=1073741824)throw RangeError(`${t} is ${e.toLocaleString()}, at or past the BVH index limit of ${mt.toLocaleString()}. Node indices are stored as u32 bit patterns and the leaf tags occupy everything above that.`);return e}var xt={PIXELS_PER_MATERIAL:30,RGBA_COMPONENTS:4,VEC4_PER_TRIANGLE:8,VEC4_PER_BVH_NODE:4,FLOATS_PER_VEC4:4,MIN_TEXTURE_WIDTH:4,MAX_CONCURRENT_WORKERS:Math.min(typeof navigator<`u`&&navigator.hardwareConcurrency||4,6),BUFFER_POOL_SIZE:20,CANVAS_POOL_SIZE:12,CACHE_SIZE_LIMIT:50,MAX_TEXTURE_SIZE:8192,DEFAULT_MAX_TEXTURE_SIZE:4096,MAX_TEXTURES_LIMIT:4*256,MATERIAL_BUCKET_COUNT:4,BUCKET_LAYER_STRIDE:256},St=64;function Ct(e,t){let n=Math.ceil(Math.max(1,e)/St)*St;return Math.min(t,Math.max(xt.MIN_TEXTURE_WIDTH,n))}function wt(e){let t=0,n=0,r=0;for(let i of e)t=Math.max(t,i.width),n=Math.max(n,i.height),r+=i.count;return{units:e,width:t,height:n,count:r}}function Tt(e,t){return Ct(e.width,t)*e.height*e.count*4}function Et(e,t){return e.reduce((e,n)=>e+Tt(n,t),0)}function Dt(e,t,n){let r=e.slice();for(;r.length>t;){let e=null;for(let t=0;t<r.length;t++)for(let i=t+1;i<r.length;i++){let a=wt(r[t].units.concat(r[i].units)),o=Tt(a,n)-Tt(r[t],n)-Tt(r[i],n);(!e||o<e.delta)&&(e={i:t,j:i,delta:o,fused:a})}r=r.filter((t,n)=>n!==e.i&&n!==e.j).concat([e.fused])}return r}function Ot(e,t,n){let r=[];for(let e=t-1;e>=0;e--)r.push(Math.max(xt.MIN_TEXTURE_WIDTH,Math.round(n/2**e)));let i=r.map(()=>[]);for(let t of e){let e=2**Math.ceil(Math.log2(Math.max(t.width,t.height))),n=r.findIndex(t=>e<=t);n<0&&(n=r.length-1),i[n].push(t)}return i.filter(e=>e.length).map(wt)}function kt(e,t){let n=e;for(let e=0;e<8;e++){let e=!1;for(let r of n.flatMap(e=>e.units)){let i=n.findIndex(e=>e.units.includes(r));if(!(i<0))for(let a=0;a<n.length;a++){if(a===i)continue;let o=[];for(let e=0;e<n.length;e++)if(e===i){let t=n[e].units.filter(e=>e!==r);t.length&&o.push(wt(t))}else e===a?o.push(wt(n[e].units.concat([r]))):o.push(n[e]);if(Et(o,t)<Et(n,t)){n=o,e=!0;break}}}if(!e)break}return n}function At(e,t,n=xt.MATERIAL_BUCKET_COUNT){let r=new Map;for(let{width:n,height:i}of e){let e=Math.min(t,Math.max(1,n||1)),a=Math.min(t,Math.max(1,i||1)),o=`${e}x${a}`,s=r.get(o);s?s.count++:r.set(o,{width:e,height:a,count:1})}let i=[...r.values()],a=i.map(e=>wt([e]));if(a.length>n){let e=Ot(i,n,t),r=Dt(a,n,t);a=Et(e,t)<Et(r,t)?e:r,a=kt(a,t)}return a.map(e=>({width:Ct(e.width,t),height:e.height})).sort((e,t)=>e.width*e.height-t.width*t.height)}function jt(e,t,n){let r=Math.max(1,e||1),i=Math.max(1,t||1);for(let e=0;e<n.length;e++)if(n[e].width>=r&&n[e].height>=i)return e;return Math.max(0,n.length-1)}function Mt(e,t){return e*xt.BUCKET_LAYER_STRIDE+t}var Nt=[0,0,1,1,0,0,0,1],Pt={maxSamples:30,bounces:20,transmissiveBounces:24,maxSubsurfaceSteps:64,renderMode:1,enableAlphaShadows:!0,enableOIDN:!0,oidnQuality:`high`,interactionModeEnabled:!1,useAdaptiveSampling:!0,noiseThreshold:.02,adaptiveStopFraction:.94,usePixelFreeze:!0},Ft={maxSamples:U.maxSamples,bounces:U.bounces,renderMode:U.renderMode,enableAlphaShadows:U.enableAlphaShadows,transmissiveBounces:12,maxSubsurfaceSteps:U.maxSubsurfaceSteps,enableOIDN:!0,oidnQuality:`fast`,interactionModeEnabled:!0,useAdaptiveSampling:!0,noiseThreshold:.1,usePixelFreeze:!0};function It(e){return{maxSamples:e.maxSamples,maxBounces:e.bounces,transmissiveBounces:e.transmissiveBounces,maxSubsurfaceSteps:e.maxSubsurfaceSteps,enableAlphaShadows:e.enableAlphaShadows??!1,useAdaptiveSampling:e.useAdaptiveSampling??!1,noiseThreshold:e.noiseThreshold??U.noiseThreshold,adaptiveStopFraction:e.adaptiveStopFraction??U.adaptiveStopFraction,adaptiveMinSamples:e.adaptiveMinSamples??U.adaptiveMinSamples,usePixelFreeze:e.usePixelFreeze??!1,pixelFreezeThreshold:e.pixelFreezeThreshold??U.pixelFreezeThreshold,pixelFreezeStability:e.pixelFreezeStability??U.pixelFreezeStability,interactionModeEnabled:e.interactionModeEnabled??U.interactionModeEnabled}}var Lt={MAX_BUFFER_MEMORY:1024*1024*1024,MAX_TEXTURE_MEMORY:2048*1024*1024,CLEANUP_THRESHOLD:.8,CHUNK_SIZE_THRESHOLD:64*1024*1024,STREAM_BATCH_SIZE:4};function Rt(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function zt(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function Bt(){if($t!==null)return $t;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in qt?($t=qt[e],$t):($t=qt[Rt(Yt)]??qt[Jt],$t)}function Vt(){if(en!==null)return en;let e=globalThis.__RAYZEE_LOG_NS__??Rt(Xt);return en=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],en}function Ht(e,t){if(t<qt.debug)return!0;let n=Vt();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function Ut(e,t,n){if(e>Bt()||!Ht(t,e))return;let r=e===qt.error?console.error:e===qt.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,Zt,Qt,...n.slice(1)):r(`%c${i}`,Zt,...n)}function Wt(e){return{namespace:e,error:(...t)=>Ut(qt.error,e,t),warn:(...t)=>Ut(qt.warn,e,t),info:(...t)=>Ut(qt.info,e,t),debug:(...t)=>Ut(qt.debug,e,t),isEnabled:e=>tn.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){Ut(qt.info,e,[t]),r.forEach(t=>Ut(qt.debug,e,[t]));return}qt.info>Bt()||((Bt()>=qt.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,Zt,Qt),r.forEach(e=>console.log(e)),console.groupEnd())}}}function Gt(e,t,...n){nn.has(t)||(nn.add(t),e.warn(...n))}function Kt(){return tn.getLevel()}var qt,Jt,Yt,Xt,Zt,Qt,$t,en,J,tn,nn,rn=y((()=>{qt={silent:0,error:1,warn:2,info:3,debug:4},Jt=`info`,Yt=`rayzeeLogLevel`,Xt=`rayzeeLogNamespaces`,Zt=`color:#7c8494`,Qt=`color:inherit`,$t=null,en=null,J={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${J.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},tn={levels:qt,setLevel(e){return e in qt?(globalThis.__RAYZEE_LOG_LEVEL__=e,$t=qt[e],zt(Yt,e===Jt?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(qt).join(`, `)}`),this.getLevel())},getLevel(){let e=Bt();return Object.keys(qt).find(t=>qt[t]===e)},isEnabled(e){return(qt[e]??qt.debug)<=Bt()},only(...e){let t=e.flat().filter(Boolean);return en=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),zt(Xt,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return $t=null,en=null,this.getLevel()}},nn=new Set}));rn();var an=Wt(`gpu`);function on(e=r.FloatType,n=r.LinearFilter){let i=new t.StorageTexture(W,W);return i.type=e,i.format=r.RGBAFormat,i.minFilter=n,i.magFilter=n,i}var sn=()=>on(),cn=class{constructor(e,t){this.writeColor=null,this.writeNormalDepth=null,this.writeAlbedo=null,this.readTarget=null,this.currentTarget=0,this.renderWidth=0,this.renderHeight=0,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),e>0&&t>0&&this.create(e,t)}create(e,n){this.dispose(),this.renderWidth=e,this.renderHeight=n,this.writeColor=sn(),this.writeNormalDepth=sn(),this.writeAlbedo=sn(),this.readTarget=new t.RenderTarget(e,n,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1,count:3}),this.readTarget.textures[0].name=`gColor`,this.readTarget.textures[1].name=`gNormalDepth`,this.readTarget.textures[2].name=`gAlbedo`,an.debug(`storage texture pool ${J.px(e,n)} — 3 write StorageTextures + 1 MRT RenderTarget`)}ensureSize(e,t){return this.writeColor?this.renderWidth!==e||this.renderHeight!==t?(this.setSize(e,t),!0):!1:(this.create(e,t),!0)}getReadTextures(){return{color:this.readTarget.textures[0],normalDepth:this.readTarget.textures[1],albedo:this.readTarget.textures[2]}}getWriteTextures(){return{color:this.writeColor,normalDepth:this.writeNormalDepth,albedo:this.writeAlbedo}}copyToReadTargets(e,t=!0){this._srcRegion.max.set(this.renderWidth,this.renderHeight),e.copyTextureToTexture(this.writeColor,this.readTarget.textures[0],this._srcRegion),t&&(e.copyTextureToTexture(this.writeNormalDepth,this.readTarget.textures[1],this._srcRegion),e.copyTextureToTexture(this.writeAlbedo,this.readTarget.textures[2],this._srcRegion))}clear(e){if(!this.readTarget||!e)return;let t=e.getRenderTarget();e.setRenderTarget(this.readTarget),e.clear(!0,!1,!1),e.setRenderTarget(t)}swap(){this.currentTarget=1-this.currentTarget}setSize(e,t){if(this.renderWidth=e,this.renderHeight=t,this.readTarget){this.readTarget.setSize(e,t);for(let e of this.readTarget.textures)e.needsUpdate=!0}}dispose(){this.writeColor?.dispose(),this.writeNormalDepth?.dispose(),this.writeAlbedo?.dispose(),this.readTarget?.dispose(),this.writeColor=null,this.writeNormalDepth=null,this.writeAlbedo=null,this.readTarget=null}},ln={cameraViewMatrix:`ptCameraViewMatrix`,cameraProjectionMatrix:`ptCameraProjectionMatrix`},un=class{constructor(e=1920,t=1080){this._uniforms=new Map,this._booleans=new Set,this._arrayWarned=new Set,this._lightBuffers={},this._initUniforms(e,t),this._nameAll()}get(e){return this._uniforms.get(e)}set(e,t){let n=this._uniforms.get(e);if(!n){console.warn(`UniformManager: Unknown uniform "${e}"`);return}Array.isArray(t)&&t.length===1&&(this._booleans.has(e)||typeof n.value==`number`)&&(this._arrayWarned.has(e)||(this._arrayWarned.add(e),console.warn(`UniformManager: "${e}" was set to [${t[0]}] but expects a scalar — unwrapping. Fix the caller; a slider handler is probably forwarding its array value unchanged.`)),t=t[0]),this._booleans.has(e)?n.value=+!!t:typeof t==`object`&&t&&typeof n.value?.copy==`function`?n.value.copy(t):n.value=t}has(e){return this._uniforms.has(e)}keys(){return this._uniforms.keys()}getLightBufferNodes(){return this._lightBuffers}updateMany(e){let t=!1;for(let[n,r]of Object.entries(e)){let e=this._uniforms.get(n);e&&e.value!==r&&(e.value=r,t=!0)}return t}_initUniforms(e,t){let i=(e,t,r)=>{let i=(0,n.uniform)(t,r);return this._uniforms.set(e,i),i},a=(e,t)=>(this._booleans.add(e),i(e,+!!t,`int`));i(`frame`,0,`uint`),i(`seedFrame`,0,`uint`),i(`maxBounces`,U.bounces,`int`),i(`maxSamples`,U.maxSamples,`int`),i(`transmissiveBounces`,U.transmissiveBounces,`int`),i(`maxSubsurfaceSteps`,U.maxSubsurfaceSteps,`int`),i(`maxTransparentBounces`,U.maxTransparentBounces,`int`),i(`visMode`,U.debugMode,`int`),i(`debugVisScale`,U.debugVisScale,`float`),a(`useAdaptiveSampling`,U.useAdaptiveSampling),i(`noiseThreshold`,U.noiseThreshold,`float`),i(`adaptiveMinSamples`,U.adaptiveMinSamples,`int`),i(`adaptiveStopFraction`,U.adaptiveStopFraction,`float`),a(`usePixelFreeze`,U.usePixelFreeze),i(`pixelFreezeThreshold`,U.pixelFreezeThreshold,`float`),i(`pixelFreezeStability`,U.pixelFreezeStability,`int`),a(`convergenceOverlay`,U.convergenceOverlay),a(`enableAccumulation`,!0),i(`accumulationAlpha`,0,`float`),a(`cameraIsMoving`,!1),a(`hasPreviousAccumulated`,!1),i(`auxAccumulationAlpha`,1,`float`),a(`hasPreviousAux`,!1),i(`environmentIntensity`,U.environmentIntensity,`float`),i(`backgroundIntensity`,U.backgroundIntensity,`float`),i(`backgroundColor`,new r.Color(0,0,0),`color`),i(`backgroundBlurriness`,U.backgroundBlurriness,`float`),i(`backgroundBlurSamples`,U.backgroundBlurSamples,`int`),a(`showBackground`,U.showBackground),a(`transparentBackground`,U.transparentBackground),a(`enableEnvironment`,U.enableEnvironment),i(`environmentMatrix`,new r.Matrix4,`mat4`),i(`envTotalSum`,0,`float`),i(`envCompensationDelta`,0,`float`),i(`envResolution`,new r.Vector2(1,1),`vec2`),a(`groundProjectionEnabled`,U.groundProjectionEnabled),i(`groundProjectionRadius`,U.groundProjectionRadius,`float`),i(`groundProjectionHeight`,U.groundProjectionHeight,`float`),i(`groundProjectionLevel`,U.groundProjectionLevel,`float`),a(`enableGroundCatcher`,U.enableGroundCatcher),i(`groundCatcherHeight`,U.groundCatcherHeight,`float`),i(`sunDirection`,new r.Vector3(0,1,0),`vec3`),i(`sunRadiance`,new r.Vector3,`vec3`),i(`sunParams`,new r.Vector4(1,0,0,0),`vec4`),a(`hasSun`,!1),i(`globalIlluminationIntensity`,U.globalIlluminationIntensity,`float`),i(`exposure`,U.exposure,`float`),i(`numDirectionalLights`,0,`int`),i(`numAreaLights`,0,`int`),i(`numPointLights`,0,`int`),i(`numSpotLights`,0,`int`),this._lightBuffers={directional:(0,n.uniformArray)(new Float32Array(192),`float`),area:(0,n.uniformArray)(new Float32Array(256),`float`),point:(0,n.uniformArray)(new Float32Array(144),`float`),spot:(0,n.uniformArray)(new Float32Array(320),`float`)},i(`cameraWorldMatrix`,new r.Matrix4,`mat4`),i(`cameraProjectionMatrixInverse`,new r.Matrix4,`mat4`),i(`cameraViewMatrix`,new r.Matrix4,`mat4`),i(`cameraProjectionMatrix`,new r.Matrix4,`mat4`);let o=([e,t])=>new r.Vector2(e,t).multiplyScalar(r.MathUtils.DEG2RAD);i(`cameraProjection`,Ke[U.cameraProjection],`int`),i(`panoLonRange`,o(U.panoramaLonRange),`vec2`),i(`panoLatRange`,o(U.panoramaLatRange),`vec2`),a(`panoLevelHorizon`,U.panoramaLevelHorizon),a(`enableDOF`,U.enableDOF),i(`focusDistance`,U.focusDistance,`float`),i(`focalLength`,U.focalLength,`float`),i(`aperture`,U.aperture,`float`),i(`apertureScale`,1,`float`),i(`anamorphicRatio`,U.anamorphicRatio??1,`float`),i(`unitsPerMetre`,U.unitsPerMetre,`float`),i(`dofMode`,+(U.dofMode===`look`),`int`),i(`dofBlur`,U.dofBlur,`float`),this._uniforms.set(`samplingTechnique`,N),N.value=U.samplingTechnique,i(`fireflyThreshold`,U.fireflyThreshold,`float`),i(`shadowTerminatorOffset`,U.shadowTerminatorOffset,`float`),a(`enableEmissiveTriangleSampling`,U.enableEmissiveTriangleSampling),i(`emissiveBoost`,U.emissiveBoost,`float`),i(`emissiveTriangleCount`,0,`int`),i(`emissiveTotalPower`,0,`float`),i(`lightBVHNodeCount`,0,`int`),i(`emissiveVec4Offset`,0,`int`),i(`reverseMapVec4Offset`,0,`int`),i(`renderMode`,U.renderMode,`int`),a(`enableAlphaShadows`,U.enableAlphaShadows),i(`resolution`,new r.Vector2(e,t),`vec2`)}_nameAll(){for(let[e,t]of this._uniforms)t.name=ln[e]||e}dispose(){this._disposed||(this._disposed=!0,this._uniforms.clear(),this._booleans.clear(),this._arrayWarned.clear(),this._lightBuffers={})}},dn=[1,0,0,0,1,0,0,0],fn=[[`mapMatrix`,K.ALBEDO_TRANSFORM],[`normalMapMatrices`,K.NORMAL_TRANSFORM],[`roughnessMapMatrices`,K.ROUGHNESS_TRANSFORM],[`metalnessMapMatrices`,K.METALNESS_TRANSFORM],[`emissiveMapMatrices`,K.EMISSIVE_TRANSFORM],[`bumpMapMatrices`,K.BUMP_TRANSFORM],[`displacementMapMatrices`,K.DISPLACEMENT_TRANSFORM]];Object.freeze([K.VISIBLE,K.SHEEN_COLOR+3,K.DISPLACEMENT_MAP_INDEX+1,K.SPECULAR_COLOR_MAP_INDEX+1,K.SPECULAR_COLOR_MAP_INDEX+2,K.SPECULAR_COLOR_MAP_INDEX+3]);var pn=Object.freeze(new Set([`metalness`,`roughness`,`transmission`,`opacity`,`clearcoat`,`clearcoatRoughness`,`sheen`,`sheenRoughness`,`specularIntensity`,`iridescence`,`subsurface`,`anisotropy`])),mn=e=>Math.min(Math.max(e,0),1);function hn(e,t){let n=typeof e==`boolean`?+e:e;return Number.isFinite(n)?n:t}function gn(e){return Number.isInteger(e)?e:-1}function _n(e,t,n,r){let i=n?.r??n?.[0]??n?.x,a=n?.g??n?.[1]??n?.y,o=n?.b??n?.[2]??n?.z;e[t]=hn(i,r[0]),e[t+1]=hn(a,r[1]),e[t+2]=hn(o,r[2])}function vn(e,t,n){let r=(n,r,i)=>{e[t+n]=hn(r,i)},i=(n,r,i)=>{e[t+n]=mn(hn(r,i))};r(K.IOR,n.ior,q.ior),i(K.TRANSMISSION,n.transmission,q.transmission),r(K.THICKNESS,n.thickness,q.thickness),r(K.EMISSIVE_INTENSITY,n.emissiveIntensity,q.emissiveIntensity),_n(e,t+K.ATTENUATION_COLOR,n.attenuationColor,q.attenuationColor),e[t+K.ATTENUATION_DISTANCE]=ft(n.attenuationDistance??q.attenuationDistance),i(K.OPACITY,n.opacity,q.opacity),r(K.SIDE,n.side,q.side),r(K.TRANSPARENT,n.transparent,q.transparent),r(K.ALPHA_TEST,n.alphaTest,q.alphaTest),r(K.ALPHA_MODE,n.alphaMode,q.alphaMode),r(K.DEPTH_WRITE,n.depthWrite,q.depthWrite);let a=n.normalScale,o=typeof a==`number`?a:void 0;r(K.NORMAL_SCALE,o??a?.x??a?.[0],q.normalScale[0]),r(K.NORMAL_SCALE+1,o??a?.y??a?.[1],q.normalScale[1]),_n(e,t+K.COLOR,n.color,q.color),i(K.METALNESS,n.metalness,q.metalness),_n(e,t+K.EMISSIVE,n.emissive,q.emissive),i(K.ROUGHNESS,n.roughness,q.roughness),e[t+K.ALBEDO_MAP_INDEX]=gn(n.map),e[t+K.NORMAL_MAP_INDEX]=gn(n.normalMap),e[t+K.ROUGHNESS_MAP_INDEX]=gn(n.roughnessMap),e[t+K.METALNESS_MAP_INDEX]=gn(n.metalnessMap),e[t+K.EMISSIVE_MAP_INDEX]=gn(n.emissiveMap),e[t+K.BUMP_MAP_INDEX]=gn(n.bumpMap),i(K.CLEARCOAT,n.clearcoat,q.clearcoat),i(K.CLEARCOAT_ROUGHNESS,n.clearcoatRoughness,q.clearcoatRoughness),r(K.DISPERSION,n.dispersion,q.dispersion),i(K.SHEEN,n.sheen,q.sheen),i(K.SHEEN_ROUGHNESS,n.sheenRoughness,q.sheenRoughness),_n(e,t+K.SHEEN_COLOR,n.sheenColor,q.sheenColor),i(K.SPECULAR_INTENSITY,n.specularIntensity,q.specularIntensity),_n(e,t+K.SPECULAR_COLOR,n.specularColor,q.specularColor),i(K.IRIDESCENCE,n.iridescence,q.iridescence),r(K.IRIDESCENCE_IOR,n.iridescenceIOR,q.iridescenceIOR),r(K.IRIDESCENCE_THICKNESS_RANGE,n.iridescenceThicknessRange?.[0],q.iridescenceThicknessRange[0]),r(K.IRIDESCENCE_THICKNESS_RANGE+1,n.iridescenceThicknessRange?.[1],q.iridescenceThicknessRange[1]),r(K.BUMP_SCALE,n.bumpScale,q.bumpScale),r(K.DISPLACEMENT_SCALE,n.displacementScale,q.displacementScale),e[t+K.DISPLACEMENT_MAP_INDEX]=gn(n.displacementMap);for(let[r,i]of fn){let a=n[r];for(let n=0;n<8;n++)e[t+i+n]=hn(a?.[n],dn[n])}_n(e,t+K.SUBSURFACE_COLOR,n.subsurfaceColor,q.subsurfaceColor),i(K.SUBSURFACE,n.subsurface,q.subsurface),_n(e,t+K.SUBSURFACE_RADIUS,n.subsurfaceRadius,q.subsurfaceRadius),r(K.SUBSURFACE_RADIUS_SCALE,n.subsurfaceRadiusScale,q.subsurfaceRadiusScale),r(K.SUBSURFACE_ANISOTROPY,n.subsurfaceAnisotropy,q.subsurfaceAnisotropy),i(K.ANISOTROPY,n.anisotropy,q.anisotropy),r(K.ANISOTROPY_ROTATION,n.anisotropyRotation,q.anisotropyRotation),e[t+K.ANISOTROPY_MAP_INDEX]=gn(n.anisotropyMap),e[t+K.TRANSMISSION_MAP_INDEX]=gn(n.transmissionMap),e[t+K.CLEARCOAT_MAP_INDEX]=gn(n.clearcoatMap),e[t+K.CLEARCOAT_ROUGHNESS_MAP_INDEX]=gn(n.clearcoatRoughnessMap),e[t+K.SHEEN_COLOR_MAP_INDEX]=gn(n.sheenColorMap),e[t+K.SHEEN_ROUGHNESS_MAP_INDEX]=gn(n.sheenRoughnessMap),e[t+K.IRIDESCENCE_MAP_INDEX]=gn(n.iridescenceMap),e[t+K.IRIDESCENCE_THICKNESS_MAP_INDEX]=gn(n.iridescenceThicknessMap),e[t+K.SPECULAR_INTENSITY_MAP_INDEX]=gn(n.specularIntensityMap),e[t+K.SPECULAR_COLOR_MAP_INDEX]=gn(n.specularColorMap),e[t+K.VISIBLE]=1,e[t+K.SHEEN_COLOR+3]=1,e[t+K.DISPLACEMENT_MAP_INDEX+1]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+1]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+2]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+3]=0}var Y=Object.freeze({ADAPTER_SOFTWARE:`adapter.software`,ASSET_UNREACHABLE:`asset.unreachable`,ASSET_AMBIGUOUS_ENTRY:`asset.ambiguous_entry`,ASSET_ARCHIVE_TOO_LARGE:`asset.archive_too_large`,ASSET_ENTRY_TOO_LARGE:`asset.entry_too_large`,TEXTURE_BUILD_FAILED:`texture.build_failed`,TEXTURE_PROCESSING_FALLBACK:`texture.processing_fallback`,TEXTURE_LIMIT_EXCEEDED:`texture.limit_exceeded`,ENVIRONMENT_LOAD_FAILED:`environment.load_failed`,SETTING_UNKNOWN_KEY:`setting.unknown_key`,RENDER_SIZE_DECLINED:`render.size_declined`,STAGE_RENDER_FAILED:`stage.render_failed`,RENDER_RESERVE_CAPPED:`render.reserve_capped`,SCENE_MEMORY_BUDGET:`scene.memory_budget`,EMISSIVE_INSTANCES_COLLAPSED:`emissive.instances_collapsed`,REFIT_SHARED_GEOMETRY:`refit.shared_geometry`,VIEW_TRANSFORM_DISPLAY_MISMATCH:`viewTransform.display_mismatch`,VIEW_TRANSFORM_BAKE_FAILED:`viewTransform.bake_failed`,COLOR_CONFIG_LOAD_FAILED:`color.config_load_failed`,STORAGE_UNAVAILABLE:`storage.unavailable`,STORAGE_QUOTA_EXCEEDED:`storage.quota_exceeded`,STORAGE_WRITE_FAILED:`storage.write_failed`,STORAGE_READ_FAILED:`storage.read_failed`,STORAGE_ENTRY_CORRUPT:`storage.entry_corrupt`,STORAGE_CACHE_MISMATCH:`storage.cache_mismatch`}),yn=Object.freeze({ERROR:`error`,WARNING:`warning`}),bn=class extends Error{constructor(e){super(`[${e.code}] ${e.message}`),this.name=`EngineIssueError`,this.code=e.code,this.detail=e.detail}},xn=class{constructor({strict:e=!1,onIssue:t=null}={}){this.strict=e===!0,this._onIssue=t,this._entries=[]}record(e,t,n={},r=yn.ERROR){let i=Object.freeze({code:e,message:t,detail:n,severity:r,at:Date.now()});if(this._entries.push(i),this._onIssue?.(i),this.strict&&r===yn.ERROR)throw new bn(i);return i}warn(e,t,n){return this.record(e,t,n,yn.WARNING)}get list(){return this._entries.slice()}get errors(){return this._entries.filter(e=>e.severity===yn.ERROR)}clear(){this._entries.length=0}detach(){this._onIssue=null,this.strict=!1}},Sn=64*1024*1024,Cn=typeof SharedArrayBuffer<`u`,wn=null;function Tn(e){wn=e}function En(e,t,n){let r=n?new e(new SharedArrayBuffer(t*e.BYTES_PER_ELEMENT)):new e(t);return wn&&r.byteLength>0&&wn(r.byteLength,n),r}var Dn=class e{constructor(e,t,n,r=Sn,i=!1){let a=t*n.BYTES_PER_ELEMENT,o=Math.max(1,Math.floor(r/a));this.recordCount=e,this.lanesPerRecord=t,this.LaneType=n,this.recordsPerChunk=e<=o?Math.max(e,1):o,this.shared=i,this.chunks=[];let s=e;for(;s>0;){let e=Math.min(s,this.recordsPerChunk);this.chunks.push(En(n,e*t,i)),s-=e}this.chunks.length===0&&this.chunks.push(En(n,0,i))}static adopt(t,n,r,i){let a=Object.create(e.prototype);return a.recordCount=n,a.lanesPerRecord=r,a.LaneType=t[0]?.constructor??null,a.recordsPerChunk=i,a.chunks=t,a.shared=typeof SharedArrayBuffer<`u`&&t[0]?.buffer instanceof SharedArrayBuffer,a}static lazy(t,n,r,i=Sn,a=!1){let o=Math.max(1,Math.floor(i/(n*r.BYTES_PER_ELEMENT))),s=Object.create(e.prototype);return s.recordCount=t,s.lanesPerRecord=n,s.LaneType=r,s.recordsPerChunk=t<=o?Math.max(t,1):o,s.shared=a,s.chunks=Array(Math.max(1,Math.ceil(t/s.recordsPerChunk))),s._views=[],s}_materialize(e){if(this._owner)return this._owner._materialize(e),this.chunks[e];let t=e*this.recordsPerChunk,n=Math.min(this.recordsPerChunk,this.recordCount-t)*this.lanesPerRecord,r=this.chunks[e]=En(this.LaneType,n,this.shared);for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);return r}materializeAll(){for(let e=0;e<this.chunks.length;e++)!this.chunks[e]&&!this._spilled?.has(e)&&this._materialize(e);return this}get chunkCount(){return this.chunks.length}get single(){return this.chunks.length===1?this.chunks[0]:null}get byteLength(){let e=0;for(let t of this.chunks)t&&(e+=t.byteLength);return e}chunkFor(e){let t=e/this.recordsPerChunk|0,n=this.chunks[t];if(n)return n;if(this._spilled?.has(t))throw Error(`ChunkedRecords: chunk ${t} is on disk — await ensureResident() before touching record ${e}`);return this._materialize(t)}async spill(e,{keep:t=()=>!1}={}){if(this._owner)throw Error(`ChunkedRecords: spill the storage, not a view of it`);this._store=e,this._spilled??=new Set;let n=0;for(let r=0;r<this.chunks.length;r++){let i=this.chunks[r];if(!(!i||t(r))){await e.write(r,i),this.chunks[r]=null;for(let e of this._liveViews())e.chunks[r]=null;this._spilled.add(r),n+=i.byteLength}}return n}async spillChunk(e,t){let n=this.chunks[e];if(!n)return 0;this._store=t,this._spilled??=new Set,await t.write(e,n),this.chunks[e]=null;for(let t of this._liveViews())t.chunks[e]=null;return this._spilled.add(e),n.byteLength}async ensureResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++){if(!this._spilled.has(e))continue;let t=Math.min(this.recordsPerChunk,this.recordCount-e*this.recordsPerChunk)*this.lanesPerRecord,n=await this._store.read(e,t*this.LaneType.BYTES_PER_ELEMENT),r=En(this.LaneType,t,this.shared);new Uint8Array(r.buffer,r.byteOffset,r.byteLength).set(new Uint8Array(n)),this.chunks[e]=r;for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);this._spilled.delete(e)}}_liveViews(){return this._weakViews&&=this._weakViews.filter(e=>e.deref()),[...this._views??[],...(this._weakViews??[]).map(e=>e.deref())]}isResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return!0;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++)if(this._spilled.has(e))return!1;return!0}get spilledChunks(){return this._spilled?.size??0}baseOf(e){return e%this.recordsPerChunk*this.lanesPerRecord}isContiguous(e,t){return t<=0?!0:(e/this.recordsPerChunk|0)==((e+t-1)/this.recordsPerChunk|0)}slice(e,t){let n=this.baseOf(e),r=t*this.lanesPerRecord;if(this.isContiguous(e,t))return this.chunkFor(e).subarray(n,n+r);let i=new this.LaneType(r);return this.readRecords(e,t,i),i}readRecords(e,t,n){let r=0;for(;r<t;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,t-r);n.set(a.subarray(o,o+c*this.lanesPerRecord),r*this.lanesPerRecord),r+=c}return n}setRecords(e,t){let n=t.length/this.lanesPerRecord,r=0;for(;r<n;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,n-r);a.set(t.subarray(r*this.lanesPerRecord,(r+c)*this.lanesPerRecord),o),r+=c}}copyOf(e,t){return this.readRecords(e,t,new this.LaneType(t*this.lanesPerRecord))}trimTo(t){let n=Math.max(1,Math.ceil(t/this.recordsPerChunk)),r=this.chunks.slice(0,n),i=(t-(n-1)*this.recordsPerChunk)*this.lanesPerRecord,a=r[n-1];return a.length>i&&(r[n-1]=a.subarray(0,Math.max(0,i))),e.adopt(r,t,this.lanesPerRecord,this.recordsPerChunk)}grow(e){if(e<=this.recordCount)return;let t=this.chunks.length-1,n=(e,t)=>Math.min(this.recordsPerChunk,t-e*this.recordsPerChunk)*this.lanesPerRecord,r=this.chunks[t];this.recordCount=e;for(let t of this._liveViews())t.recordCount=e;if(this.chunks.length*this.recordsPerChunk<e){this.chunks.length=Math.ceil(e/this.recordsPerChunk);for(let e of this._liveViews())e.chunks.length=this.chunks.length}if(r&&r.length<n(t,e)){let i=En(this.LaneType,n(t,e),this.shared);i.set(r),this.chunks[t]=i;for(let e of this._liveViews())e.chunks[t]=new e.LaneType(i.buffer,i.byteOffset,i.byteLength/e.LaneType.BYTES_PER_ELEMENT)}else if(!r&&this._spilled?.has(t))throw Error(`ChunkedRecords: cannot grow past chunk ${t}, which is on disk`)}release(e,t){let n=this.recordsPerChunk,r=Math.ceil(e/n),i=Math.floor((e+t)/n),a=0;for(let e=r;e<i;e++){let t=this.chunks[e];if(t){a+=t.byteLength,this.chunks[e]=void 0;for(let t of this._liveViews())t.chunks[e]=void 0}}return a}trimInPlace(e){let t=Math.max(1,Math.ceil(e/this.recordsPerChunk)),n=Math.max(0,(e-(t-1)*this.recordsPerChunk)*this.lanesPerRecord),r=[this,...this._liveViews()];for(let i of r){i.chunks.length=t;let r=i.chunks[t-1];r&&r.length>n&&(i.chunks[t-1]=r.subarray(0,n)),i.recordCount=e}if(this._spilled)for(let e of this._spilled)e>=t&&this._spilled.delete(e);return this}viewAs(t){let n=e=>new t(e.buffer,e.byteOffset,e.byteLength/t.BYTES_PER_ELEMENT),r=e.adopt(this.chunks.map(e=>e?n(e):void 0),this.recordCount,this.lanesPerRecord,this.recordsPerChunk);return r.LaneType=t,r._owner=this,this._views?this._views.push(r):(this._weakViews??=[]).push(new WeakRef(r)),r._spilled=this._spilled??=new Set,r}},On=new Map;function kn(e,t){return e.exclusive||t===`exclusive`&&e.shared>0?!1:(t===`exclusive`?e.exclusive=!0:e.shared++,!0)}function An(e,t,n){let r=On.get(e);r||(r={shared:0,exclusive:!1,queue:[]},On.set(e,r));let i=jn(()=>{for(t===`exclusive`?r.exclusive=!1:r.shared--;r.queue.length&&kn(r,r.queue[0].mode);)r.queue.shift().grant();!r.exclusive&&r.shared===0&&r.queue.length===0&&On.delete(e)});return r.queue.length===0&&kn(r,t)?Promise.resolve(i):n?(!r.exclusive&&r.shared===0&&r.queue.length===0&&On.delete(e),Promise.resolve(null)):new Promise(e=>r.queue.push({mode:t,grant:()=>e(i)}))}function jn(e){let t=!1;return()=>{t||(t=!0,e())}}var Mn=()=>typeof navigator<`u`&&navigator.locks?.request?navigator.locks:null;function Nn(e,{mode:t=`exclusive`,ifAvailable:n=!1}={}){let r=Mn();return r?new Promise((i,a)=>{r.request(e,{mode:t,ifAvailable:n},e=>{if(!e){i(null);return}return new Promise(e=>i(jn(e)))}).catch(a)}):An(e,t,n)}async function Pn(){let e=Mn();if(!e)return new Set(On.keys());let{held:t=[]}=await e.query();return new Set(t.map(e=>e.name))}var Fn=new TextEncoder,In=1<<20,Ln=1<<20,Rn=65536,zn=14;function Bn(e){let t=``;for(let n of e)t+=n.toString(16).padStart(2,`0`);return t}async function Vn(e){let t=typeof e==`string`?Fn.encode(e):e;return Bn(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}async function Hn(e){return(await Vn(e)).slice(0,32)}async function Un(e){if(e.size<=In+Ln+zn*Rn)return Vn(new Uint8Array(await e.arrayBuffer()));let t=[e.slice(0,In)],n=e.size-In-Ln-Rn;for(let r=0;r<zn;r++){let i=In+Math.floor(n*(r+.5)/zn);t.push(e.slice(i,i+Rn))}return t.push(e.slice(e.size-Ln)),Vn(new Uint8Array(await new Blob(t).arrayBuffer()))}async function Wn(e){return{name:e.name??``,size:e.size,lastModified:e.lastModified??0,sample:await Un(e)}}function Gn(e){return`file:${e.name}|${e.size}|${e.lastModified}|${e.sample}`}function Kn(e,t){return!!e&&!!t&&e.size===t.size&&e.sample===t.sample&&e.name===t.name}var qn=class{constructor(){this._handlers=new Map}addEventListener(e,t){this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t)}removeEventListener(e,t){this._handlers.get(e)?.delete(t)}dispatchEvent(e){for(let t of[...this._handlers.get(e.type)??[]])t.call(this,e)}},Jn=class{constructor(e){this._root=e,this._writers=new Map,this._nextId=1}async _dir(e,t){let n=await this._root;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n}async openWriter({path:e,name:t,truncate:n=!0,length:r}){let i=await(await(await this._dir(e,!0)).getFileHandle(t,{create:!0})).createSyncAccessHandle();n?i.truncate(0):r!==void 0&&i.getSize()>r&&i.truncate(r);let a=this._nextId++;return this._writers.set(a,{handle:i,end:i.getSize()}),{id:a}}write({id:e,buffer:t,byteOffset:n=0,byteLength:r,at:i}){let a=this._writers.get(e);if(!a)throw Error(`storage: writer ${e} is not open`);let o=new Uint8Array(t,n,r??t.byteLength-n),s=i??a.end,c=0;for(;c<o.length;){let e=a.handle.write(o.subarray(c),{at:s+c});if(e<=0)throw Error(`storage: write made no progress`);c+=e}return a.end=Math.max(a.end,s+o.length),{bytes:o.length}}closeWriter({id:e,abort:t=!1}){let n=this._writers.get(e);if(!n)return{size:0};this._writers.delete(e);try{return t||n.handle.flush(),{size:n.handle.getSize()}}finally{n.handle.close()}}async writeFile({path:e,name:t,buffer:n,byteOffset:r=0,byteLength:i}){let{id:a}=await this.openWriter({path:e,name:t});try{return this.write({id:a,buffer:n,byteOffset:r,byteLength:i}),this.closeWriter({id:a})}catch(e){throw this.closeWriter({id:a,abort:!0}),e}}async readRange({path:e,name:t,offset:n=0,length:r}){let i=await(await this._dir(e,!1)).getFileHandle(t),a=null;try{a=await i.createSyncAccessHandle()}catch(e){if(e.name!==`NoModificationAllowedError`)throw e}if(!a){let e=await i.getFile(),t=r===void 0?e.size:n+r;return{buffer:await e.slice(n,t).arrayBuffer()}}try{let e=a.getSize(),t=Math.max(0,Math.min(r??e-n,e-n)),i=new ArrayBuffer(t);return a.read(i,{at:n}),{buffer:i}}finally{a.close()}}dispose(){for(let e of[...this._writers.keys()])this.closeWriter({id:e,abort:!0})}},Yn=class{constructor(e){this._ops=new Jn(e)}async call(e,t){return this._ops[e](t)}dispose(){this._ops.dispose()}},Xn=Object.freeze({CACHE:`cache`,USER:`user`,SCRATCH:`scratch`}),Zn=Object.freeze({DOWNLOADS:`downloads`,ARCHIVES:`archives`,SCENES:`scenes`,CDF:`cdf`,SPILL:`spill`}),Qn=`meta.json`,$n=1,er=36e5,tr=.3,nr=100*1024**3,rr=64*1024**2,ir=8*1024**2,ar=4,or=new TextEncoder;function sr(e,{copy:t,transfer:n}){if(typeof e==`string`&&(e=or.encode(e)),e instanceof ArrayBuffer){if(!t||n)return{args:{buffer:e},list:[e]};let r=e.slice(0);return{args:{buffer:r},list:[r]}}if(!ArrayBuffer.isView(e))throw TypeError(`storage: write expects an ArrayBuffer, a typed array, a Blob or a string`);let{buffer:r,byteOffset:i,byteLength:a}=e,o=typeof SharedArrayBuffer<`u`&&r instanceof SharedArrayBuffer;if(!t)return{args:{buffer:r,byteOffset:i,byteLength:a},list:[]};if(o){let e=new Uint8Array(a);return e.set(new Uint8Array(r,i,a)),{args:{buffer:e.buffer},list:[e.buffer]}}if(n&&i===0&&a===r.byteLength)return{args:{buffer:r},list:[r]};let s=r.slice(i,i+a);return{args:{buffer:s},list:[s]}}async function cr(e,t){try{let n=await(await e.getFileHandle(t)).getFile();return JSON.parse(await n.text())}catch{return null}}async function*lr(e){for await(let[t,n]of e.entries())n.kind===`directory`&&(yield[t,n])}var ur=class{constructor(e,t,n,r,i){this.area=e,this.id=t,this.key=n.key,this.meta=n,this._dir=r,this._release=i}get bytes(){return this.meta.bytes}get extra(){return this.meta.extra??{}}async file(e){try{return await(await this._dir.getFileHandle(e)).getFile()}catch(t){return this.area.manager._issue(Y.STORAGE_READ_FAILED,`could not read ${this.area.name}/${this.id}/${e}`,{error:t.message}),null}}async json(e){let t=await this.file(e);return t?JSON.parse(await t.text()):null}release(){this._release?.(),this._release=null}},dr=class{constructor(e,t,n,r,i,{sizes:a={},append:o=!1}={}){this.area=e,this.id=t,this.key=n,this._info=r,this._release=i,this._writers=new Map,this._sizes={...a},this._append=o,this._done=!1}get _transport(){return this.area.manager._transport}get _path(){return[this.area.name,this.id]}async _writer(e){let t=this._writers.get(e);if(!t){let n=this._append&&e in this._sizes,r=n&&(this._info.growable??[]).includes(e)?this._sizes[e]:void 0;t=this._transport.call(`openWriter`,{path:this._path,name:e,truncate:!n,length:r}),this._writers.set(e,t)}return(await t).id}async write(e,t,{at:n,transfer:r=!1}={}){this._assertOpen();let{args:i,list:a}=(typeof Blob<`u`&&t instanceof Blob?null:sr(t,{copy:!0,transfer:r}))??sr(await t.arrayBuffer(),{copy:!0,transfer:!0}),o=await this._writer(e);return this._transport.call(`write`,{id:o,at:n,...i},a)}async writeFile(e,t){this._assertOpen(),typeof Blob<`u`&&t instanceof Blob&&(t=await t.arrayBuffer());let{args:n,list:r}=sr(t,{copy:!0,transfer:!0}),{size:i}=await this._transport.call(`writeFile`,{path:this._path,name:e,...n},r);return this._sizes[e]=i,i}writeJSON(e,t){return this.writeFile(e,JSON.stringify(t))}async writeStream(e,t,{onProgress:n=null,signal:r=null,batchBytes:i=ir}={}){let a=t.getReader(),o=[],s=new Uint8Array(i),c=0,l=0,u=async()=>{if(c===0)return;let t=c===i?s:s.slice(0,c);s=new Uint8Array(i),c=0,o.push(this.write(e,t,{transfer:!0})),o.length>=ar&&await o.shift()};try{for(;;){if(r?.aborted)throw r.reason??new DOMException(`aborted`,`AbortError`);let{done:e,value:t}=await a.read();if(e)break;let o=0;for(;o<t.length;){let e=Math.min(t.length-o,i-c);s.set(t.subarray(o,o+e),c),c+=e,o+=e,l+=e,c===i&&await u()}n?.(l)}return await u(),await Promise.all(o),l}catch(e){throw a.cancel().catch(()=>{}),await Promise.allSettled(o),e}}async commit(e={}){this._assertOpen(),this._done=!0;try{for(let[e,t]of this._writers){let{size:n}=await this._transport.call(`closeWriter`,{id:(await t).id});this._sizes[e]=n}this._writers.clear();let t=Date.now(),n={v:$n,key:this.key,label:this._info.label??``,kind:this.area.kind,files:{...this._sizes},bytes:Object.values(this._sizes).reduce((e,t)=>e+t,0),createdAt:this._info.createdAt??t,lastUsed:t,pinned:this._info.pinned===!0,extra:{...this._info.extra,...e}},r=this._info.growable??[];r.length&&(n.growable=r);let{args:i,list:a}=sr(JSON.stringify(n),{copy:!1});return await this._transport.call(`writeFile`,{path:this._path,name:Qn,...i},a),this.area.manager._changed(this.area.name),n}catch(e){throw await this._discard(),this.area.manager._writeFailed(this.area.name,e),e}finally{this._release?.(),this._release=null}}async abort(){if(!this._done){this._done=!0;try{this._append?await this._closeAll(!0):await this._discard()}finally{this._release?.(),this._release=null}}}async _closeAll(e){for(let t of this._writers.values())try{await this._transport.call(`closeWriter`,{id:(await t).id,abort:e})}catch{}this._writers.clear()}async _discard(){await this._closeAll(!0),await this.area._removeDir(this.id)}_assertOpen(){if(this._done)throw Error(`storage: entry ${this.area.name}/${this.id} is already committed or aborted`)}},fr=class{constructor(e,t,n){this.manager=e,this.name=t,this.kind=n}_lockName(e){return`${this.manager.namespace}:store:${this.name}:${e}`}async _dir(e=!1){try{return await this.manager._root.getDirectoryHandle(this.name,{create:e})}catch(e){if(e.name===`NotFoundError`)return null;throw e}}async _entryDir(e,t=!1){let n=await this._dir(t);if(!n)return null;try{return await n.getDirectoryHandle(e,{create:t})}catch(e){if(e.name===`NotFoundError`)return null;throw e}}async _removeDir(e){let t=await this._dir(!1);if(t)try{await t.removeEntry(e,{recursive:!0})}catch(e){if(e.name!==`NotFoundError`)throw e}}async _validMeta(e,t=null){let n=await cr(e,Qn);if(!n||n.v!==$n||typeof n.key!=`string`||t!==null&&n.key!==t)return null;let r=n.growable??[];for(let[t,i]of Object.entries(n.files??{}))try{let n=await(await e.getFileHandle(t)).getFile();if(n.size!==i&&!(r.includes(t)&&n.size>i))return null}catch{return null}return n}async open(e,{wait:t=!1}={}){let n=await Hn(e),r=await Nn(this._lockName(n),{mode:`shared`,ifAvailable:!t});if(!r)return null;try{let t=await this._entryDir(n),i=t?await this._validMeta(t,e):null;return i?(Date.now()-i.lastUsed>er&&this._touch(n,i),new ur(this,n,i,t,r)):(r(),null)}catch(e){return r(),this.manager._issue(Y.STORAGE_READ_FAILED,`could not open ${this.name} entry`,{error:e.message}),null}}async has(e){let t=await this.open(e);return t?.release(),!!t}_touch(e,t){let n={...t,lastUsed:Date.now()},{args:r,list:i}=sr(JSON.stringify(n),{copy:!1});this.manager._transport.call(`writeFile`,{path:[this.name,e],name:Qn,...r},i).catch(()=>{}),t.lastUsed=n.lastUsed}async create(e,{label:t=``,pinned:n=!1,expectedBytes:r=0,extra:i={},growable:a=[]}={}){let o=await Hn(e),s=await Nn(this._lockName(o),{mode:`exclusive`});try{return r>0&&!await this.manager.ensureSpace(r,this.kind)?(s(),this.manager._issue(Y.STORAGE_QUOTA_EXCEEDED,`no room for ${(r/1048576).toFixed(0)} MB in ${this.name}`,{area:this.name,expectedBytes:r}),null):(await this._removeDir(o),await this._entryDir(o,!0),new dr(this,o,e,{label:t,pinned:n,extra:i,growable:a},s))}catch(e){return s(),this.manager._writeFailed(this.name,e),null}}async patchMeta(e,t){let n=await Hn(e),r=await Nn(this._lockName(n),{mode:`shared`,ifAvailable:!0});if(!r)return!1;try{let r=await this._entryDir(n),i=r?await this._validMeta(r,e):null;if(!i)return!1;let{args:a,list:o}=sr(JSON.stringify({...i,...t,v:$n,key:e}),{copy:!1});return await this.manager._transport.call(`writeFile`,{path:[this.name,n],name:Qn,...a},o),!0}finally{r()}}async edit(e){let t=await Hn(e),n=await Nn(this._lockName(t),{mode:`exclusive`});try{let r=await this._entryDir(t),i=r?await this._validMeta(r,e):null;if(!i)return n(),null;let a={label:i.label,pinned:i.pinned,extra:i.extra,createdAt:i.createdAt,growable:i.growable};return new dr(this,t,e,a,n,{sizes:i.files,append:!0})}catch(e){return n(),this.manager._writeFailed(this.name,e),null}}async remove(e){return this.removeById(await Hn(e))}async removeById(e){let t=await Nn(this._lockName(e),{mode:`exclusive`,ifAvailable:!0});if(!t)return!1;try{return await this._removeDir(e),this.manager._changed(this.name),!0}finally{t()}}async list(){let e=await this._dir(!1);if(!e)return[];let t=[];for await(let[n,r]of lr(e)){let e=await cr(r,Qn);e?.v===$n&&t.push({...e,id:n})}return t}async clear(){let e=0;for(let{id:t}of await this.list())await this.removeById(t)&&e++;return e}async sweep(){let e=await this._dir(!1);if(!e)return 0;let t=await Pn(),n=0;for await(let[r,i]of lr(e))t.has(this._lockName(r))||await this._validMeta(i)||await this.removeById(r)&&n++;return n}},pr=class extends qn{constructor({root:e,transport:t,namespace:n}){super(),this.namespace=n,this._root=e,this._transport=t,this._areas=new Map,this._budget=null;for(let e of Object.values(Zn))this.defineArea(e,{kind:e===Zn.SPILL?Xn.SCRATCH:Xn.CACHE})}defineArea(e,{kind:t=Xn.CACHE}={}){let n=this._areas.get(e);if(n){if(n.kind!==t)throw Error(`storage: area "${e}" is already defined as ${n.kind}`);return n}let r=new fr(this,e,t);return this._areas.set(e,r),r}area(e){let t=this._areas.get(e);if(!t)throw Error(`storage: unknown area "${e}"`);return t}get areaNames(){return[...this._areas.keys()]}async estimate(){let e=typeof navigator<`u`?navigator.storage:null;if(!e?.estimate)return{quota:1/0,usage:0};let{quota:t=1/0,usage:n=0}=await e.estimate();return{quota:t,usage:n}}async persisted(){return await globalThis.navigator?.storage?.persisted?.()===!0}async persist(){let e=await globalThis.navigator?.storage?.persist?.()===!0;return this._changed(null),e}async budget(){if(this._budget!==null)return this._budget;let{quota:e}=await this.estimate();return Math.min(e*tr,nr)}setBudget(e){this._budget=e===null?null:Math.max(0,e),this._changed(null)}async _cacheEntries(){let e=[];for(let t of this._areas.values())if(t.kind===Xn.CACHE)for(let n of await t.list())e.push({area:t,meta:n});return e}async usage(){let{quota:e,usage:t}=await this.estimate(),n={},r=0;for(let e of this._areas.values()){let t=await e.list(),i=t.reduce((e,t)=>e+(t.bytes??0),0);n[e.name]={kind:e.kind,bytes:i,entries:t.length},e.kind===Xn.CACHE&&(r+=i)}return{quota:e,usage:t,persisted:await this.persisted(),budget:await this.budget(),cacheBytes:r,areas:n}}async collect({freeBytes:e=null}={}){let t=await this._cacheEntries(),n=await this.budget(),r=t.reduce((e,t)=>e+(t.meta.bytes??0),0),i=e??Math.max(0,r-n);if(i<=0)return 0;let a=await Pn(),o=t.filter(({area:e,meta:t})=>!t.pinned&&!a.has(e._lockName(t.id))).sort((e,t)=>e.meta.lastUsed-t.meta.lastUsed),s=0;for(let{area:e,meta:t}of o){if(s>=i)break;await e.removeById(t.id)&&(s+=t.bytes??0,r-=t.bytes??0)}return s}async ensureSpace(e,t=Xn.CACHE){let n=async()=>{let{quota:n,usage:r}=await this.estimate(),i=e+rr-(n-r);return t===Xn.CACHE?{free:i,budget:(await this._cacheEntries()).reduce((e,t)=>e+(t.meta.bytes??0),0)+e-await this.budget()}:{free:i,budget:0}},r=await n();return r.free<=0&&r.budget<=0?!0:(await this.collect({freeBytes:Math.max(r.free,r.budget)}),(await n()).free<=0)}async sweep(){let e=0;for(let t of this._areas.values())e+=await t.sweep(),t.kind===Xn.SCRATCH&&(e+=await t.clear());return e}_changed(e){this.dispatchEvent({type:`change`,area:e})}_issue(e,t,n={}){this.dispatchEvent({type:`issue`,code:e,message:t,detail:n})}_writeFailed(e,t){let n=t?.name===`QuotaExceededError`;this._issue(n?Y.STORAGE_QUOTA_EXCEEDED:Y.STORAGE_WRITE_FAILED,`${e}: ${t?.message??t}`,{area:e,error:t?.name})}dispose(){this._transport?.dispose(),this._transport=null,this._areas.clear()}};function mr({namespace:e,root:t}){let n=new Yn(t);n.inline=!0;let r=new pr({root:t,transport:n,namespace:e});return r.sweep().catch(()=>{}),r}var hr=32*1024*1024,gr=`chunks.bin`,_r=class e{static async create(t,n,r,{label:i=``,expectedBytes:a=0}={}){let o=t?.area(Zn.SPILL),s=await o?.create(n,{label:i,expectedBytes:a,growable:[gr]});return s?new e(o,n,r,s):null}constructor(e,t,n,r){this._area=e,this._key=t,this._chunkBytes=n,this._writer=r,this._entry=null,this._file=null}write(e,t){return this.writeAt(e*this._chunkBytes,t)}async writeAt(e,t){if(!this._writer&&(this._entry?.release(),this._entry=this._file=null,this._writer=await this._area.edit(this._key),!this._writer))throw Error(`spill: its storage entry is gone`);let n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),r=0;do await this._writer.write(gr,n.subarray(r,Math.min(n.length,r+hr)),{at:e+r}),r+=hr;while(r<n.length)}async flush(){if(this._writer&&=(await this._writer.commit(),null),!this._entry&&(this._entry=await this._area.open(this._key,{wait:!0}),this._file=await this._entry?.file(gr),!this._file))throw Error(`spill: its storage entry is gone`)}read(e,t){return this.readAt(e*this._chunkBytes,t)}async readAt(e,t){return await this.flush(),await this._file.slice(e,e+t).arrayBuffer()}async dispose(){this._writer&&await this._writer.abort(),this._writer=null,this._entry?.release(),this._entry=this._file=null,await this._area.remove(this._key)}},vr=32*1024*1024,yr=vr/4,br=64*1024*1024,xr=new Map;function Sr(e){let t=xr.get(e);return t||xr.set(e,t=new e(0)),t}var Cr=class e{static async create(t,n,r=0){let i=await _r.create(t,n,0,{label:`Scene geometry (while building)`,expectedBytes:r});return i?new e(i):null}static canTake(e){if(Object.keys(e.morphAttributes??{}).length)return!1;for(let t in e.attributes)if(!e.attributes[t].isBufferAttribute)return!1;return!e.index||e.index.isBufferAttribute===!0}constructor(e){this._store=e,this._records=[],this._geometries=[],this._end=0,this._pack=null,this._packAt=0,this._packUsed=0,this._packRecords=[],this._chain=Promise.resolve(),this._queued=0,this.bytes=0,this.error=null}get queuedBytes(){return this._queued}add(e){let t=new Map,n=Object.values(e.attributes);e.index&&n.push(e.index);for(let e of n){let n=e.array;if(!n?.byteLength)continue;let r=t.get(n);r||t.set(n,r=this._write(n)),r.attributes.push(e),e.array=Sr(n.constructor)}this._geometries.push({geometry:e,box:e.boundingBox!==null,sphere:e.boundingSphere!==null})}_write(e){let t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n={at:0,byteLength:t.byteLength,Type:e.constructor,attributes:[],array:null,pack:null,offset:0};return this._records.push(n),this.bytes+=t.byteLength,t.byteLength>=yr?(n.at=this._end,n.array=e,this._end+=t.byteLength,this._queue(n.at,t,[n]),n):(this._pack&&this._packUsed+t.byteLength>vr&&this._flushPack(),this._pack||(this._pack=new Uint8Array(vr),this._packAt=this._end,this._packUsed=0,this._end+=vr),this._pack.set(t,this._packUsed),n.at=this._packAt+this._packUsed,n.pack=this._pack,n.offset=this._packUsed,this._packUsed+=t.byteLength,this._packRecords.push(n),n)}_flushPack(){this._pack&&(this._queue(this._packAt,this._pack.subarray(0,this._packUsed),this._packRecords),this._pack=null,this._packRecords=[])}_queue(e,t,n){this._queued+=t.byteLength,this._chain=this._chain.then(async()=>{if(!this.error){await this._store.writeAt(e,t);for(let e of n)e.array=e.pack=null}}).catch(e=>void(this.error??=e)).finally(()=>void(this._queued-=t.byteLength))}written(){return this._flushPack(),this._chain}async restore(){await this.written();let e=this._records.sort((e,t)=>e.at-t.at);e.some(e=>!e.array&&!e.pack)&&await this._store.flush();let t=null,n=0;for(let r of e){let e;if(r.array?e=r.array:r.pack?e=new r.Type(r.pack.slice(r.offset,r.offset+r.byteLength).buffer):r.byteLength>br?e=new r.Type(await this._store.readAt(r.at,r.byteLength)):((!t||r.at+r.byteLength>n+t.byteLength)&&(n=r.at,t=await this._store.readAt(r.at,br)),e=new r.Type(t.slice(r.at-n,r.at-n+r.byteLength))),e.byteLength!==r.byteLength)throw Error(`geometry spill: an array came back short`);for(let t of r.attributes)t.array=e}for(let{geometry:e,box:t,sphere:n}of this._geometries)t||(e.boundingBox=null),n||(e.boundingSphere=null);this._records=[],this._geometries=[],this.bytes=0}async dispose(){await this._chain,this._records=[],this._geometries=[],this._pack=null,this._packRecords=[],await this._store.dispose()}};rn();var wr=Wt(`geometry`),Tr=xt.MAX_TEXTURES_LIMIT,Er=new Set([`color`,`emissive`,`attenuationColor`,`sheenColor`,`specularColor`,`subsurfaceColor`]),Dr=Object.freeze({MATERIAL:`material`,MAPPED:`mapped`,DEFAULT:`default`,HOST:`host`}),Or=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function kr(e){for(let t=0;t<16;t++)if(e[t]!==Or[t])return!1;return!0}function Ar(e){return{map:e.map,normalMap:e.normalMap,bumpMap:e.bumpMap,roughnessMap:e.roughnessMap,metalnessMap:e.metalnessMap,emissiveMap:e.emissiveMap??(e.isMeshBasicMaterial?e.map:void 0),displacementMap:e.displacementMap,anisotropyMap:e.anisotropyMap,clearcoatMap:e.clearcoatMap,clearcoatRoughnessMap:e.clearcoatRoughnessMap,transmissionMap:e.transmissionMap,sheenColorMap:e.sheenColorMap,sheenRoughnessMap:e.sheenRoughnessMap,specularIntensityMap:e.specularIntensityMap,specularColorMap:e.specularColorMap,iridescenceMap:e.iridescenceMap,iridescenceThicknessMap:e.iridescenceThicknessMap}}function jr(e){if(e.userData?.gltfExtensions?.KHR_materials_unlit?.alphaMode){let t=e.userData.gltfExtensions.KHR_materials_unlit.alphaMode;return t===`BLEND`?2:+(t===`MASK`)}return e.alphaTest>0?1:e.transparent&&e.opacity<1||e.map&&e.map.format===r.RGBAFormat&&e.transparent?2:0}function Mr(e){let t=0,n=new Set,r=e=>{let i=e.isMesh&&e.material?e.geometry:null;if(i&&!n.has(i.uuid)){n.add(i.uuid);for(let e in i.attributes)t+=i.attributes[e].array?.byteLength??0;t+=i.index?.array?.byteLength??0}if(e.children)for(let t of e.children)r(t)};return r(e),t}function Nr(e,t){let n=e.x,r=e.y,i=e.z;e.x=t[0]*n+t[4]*r+t[8]*i+t[12],e.y=t[1]*n+t[5]*r+t[9]*i+t[13],e.z=t[2]*n+t[6]*r+t[10]*i+t[14]}function Pr(e,t){let n=e.x,r=e.y,i=e.z;e.x=t[0]*n+t[3]*r+t[6]*i,e.y=t[1]*n+t[4]*r+t[7]*i,e.z=t[2]*n+t[5]*r+t[8]*i}var Fr=1<<21;function Ir(e){return!!(e.isSkinnedMesh||Object.keys(e.geometry?.morphAttributes??{}).length)}function Lr(e){return e[0]*(e[5]*e[10]-e[9]*e[6])-e[4]*(e[1]*e[10]-e[9]*e[2])+e[8]*(e[1]*e[6]-e[5]*e[2])}var Rr=class{constructor({issues:e=null}={}){this._issues=e,this._droppedTextures=0,this._vectorPool={vec3:Array(9).fill().map(()=>new r.Vector3),vec2:[,,,,,,].fill().map(()=>new r.Vector2)},this._geometryRanges=new Map,this.expandedTriangleCount=0,this._allocatePlacements(0),this._matrixPool={mat3:new r.Matrix3,mat4:new r.Matrix4},this.resetArrays(),this.triangleCount=0,this.currentTriangleIndex=0}_getVec3(e=0){return this._vectorPool.vec3[e%this._vectorPool.vec3.length]}_getVec2(e=0){return this._vectorPool.vec2[e%this._vectorPool.vec2.length]}extract(e){this.resetArrays();let t=this._countTriangles(e);return this._triangleCapacity=Math.max(1024,t),this._allocateTriangles(this._triangleCapacity),this.currentTriangleIndex=0,this._allocatePlacements(this._countPlacements(e)),this._geometryUses=this._countGeometryUses(e),this.bakeInverse=new Map,this.traverseObject(e),this._shareInstanceMatrices(),this._compressAttributes(e),this.logStats(),this.getExtractedData()}async extractStreaming(e,{onStore:t,onRange:n,pause:r,yieldEvery:i=1<<20,releaseGeometry:a=null}){this.resetArrays(),this._triangleCapacity=Math.max(1,this._countStoredTriangles(e)),this._allocateTriangles(this._triangleCapacity,!0),t?.(this.triangles),this.currentTriangleIndex=0,this._allocatePlacements(this._countPlacements(e)),this._geometryUses=this._countGeometryUses(e),this.bakeInverse=new Map,this._onRange=n,this._releaseAfterRead=a?this._geometryReleaser(e,a):null;try{let t=[e],n=0;for(;t.length;){let e=t.pop();if(this._visit(e),e.children)for(let n=e.children.length-1;n>=0;n--)t.push(e.children[n]);this.currentTriangleIndex-n>=i&&(n=this.currentTriangleIndex,await r(this.currentTriangleIndex))}}finally{this._onRange=null,this._releaseAfterRead=null}return this._shareInstanceMatrices(),this._compressAttributes(e),this.triangles.trimInPlace(this.currentTriangleIndex),this._streamedStore=!0,this.logStats(),this.getExtractedData()}_countStoredTriangles(e){let t=new Set,n=0,r=e=>{if(e.isMesh&&e.geometry&&e.material){let r=e.geometry,i=Math.ceil((r.index?r.index.count:r.attributes.position?.count??0)/3),a=Array.isArray(e.material)?e.material[0]:e.material,o=a?.emissive,s=a?.emissiveIntensity>0&&!!o&&(o.r>0||o.g>0||o.b>0),c=e.isInstancedMesh?e.count??0:1;if(s&&e.isInstancedMesh&&!Ir(e)&&i*c<=Fr)n+=i*c;else if(s||Ir(e))n+=i;else{let e=`${r.uuid}|${a?.uuid}`;t.has(e)||(t.add(e),n+=i)}}if(e.children)for(let t of e.children)r(t)};return r(e),n}_geometryReleaser(e,t){let n=new Map,r=new Map,i=new Set,a=(e,t)=>{t||=!!e.userData?.__rayzeeExternal;let o=e.isMesh&&e.material?e.geometry:null;if(o){if(!n.has(o)){Cr.canTake(o)||i.add(o);for(let e of[...Object.values(o.attributes),o.index]){let t=e?.array;if(!t)continue;let n=r.get(t);n&&n!==o?i.add(o).add(n):r.set(t,o)}}n.set(o,(n.get(o)??0)+1),(t||Ir(e))&&i.add(o)}if(e.children)for(let n of e.children)a(n,t)};return a(e,!1),e=>{let r=e.material?e.geometry:null;if(!r||!n.has(r))return;let a=n.get(r)-1;if(a>0)return void n.set(r,a);n.delete(r),!i.has(r)&&(this._compressGeometry(r),t(r))}}surveyScene(e){let t=0,n=e=>{if(e.isMesh&&e.geometry&&e.material&&t++,e.children)for(let t of e.children)n(t)};return n(e),{triangles:this._countTriangles(e),placements:this._countPlacements(e),meshes:t,geometryBytes:Mr(e)}}_countGeometryUses(e){let t=new Map;return e.traverse(e=>{if(!e.isMesh||!e.geometry||!e.material)return;let n=`${e.geometry.uuid}|${e.material.uuid}`;t.set(n,(t.get(n)??0)+1)}),t}_countPlacements(e){let t=0;if(e.isMesh&&e.geometry&&e.material&&(t+=e.isInstancedMesh&&e.instanceMatrix?e.count??e.instanceMatrix.array.length/16:1),e.children)for(let n of e.children)t+=this._countPlacements(n);return t}_allocatePlacements(e){this.instanceCount=0,this.instanceCapacity=e,this.instanceSource=new Int32Array(e),this.instanceMatrices=new Float32Array(e*16),this._shareable=[],this._compressed=new Set}_compressAttributes(e){let t=(e,n)=>{if(!e.userData?.__rayzeeExternal){n(e);for(let r of e.children)t(r,n)}};t(e,e=>{e.isMesh&&e.geometry&&this._compressGeometry(e.geometry)})}_compressGeometry(e){if(!this._compressed.has(e.uuid)){this._compressed.add(e.uuid);for(let t of[`normal`,`tangent`,`color`]){let n=e.getAttribute(t);if(!n||n.normalized||!(n.array instanceof Float32Array)||e.morphAttributes?.[t]?.length)continue;let i=n.array,a=!0;for(let e=0;e<i.length;e++){let t=i[e];if(!(t>=-1.0001&&t<=1.0001)){a=!1;break}}if(!a)continue;let o=new Int16Array(i.length);for(let e=0;e<i.length;e++)o[e]=Math.round(Math.max(-1,Math.min(1,i[e]))*32767);e.setAttribute(t,new r.BufferAttribute(o,n.itemSize,!0))}}}_shareInstanceMatrices(){for(let{mesh:e,start:t,count:n}of this._shareable){let r=e.instanceMatrix;!r||r.array.length!==n*16||(r.array=this.instanceMatrices.subarray(t*16,(t+n)*16))}this._shareable=[]}_countTriangles(e){let t=0;if(e.isMesh&&e.geometry&&e.material){let n=e.geometry.index,r=e.geometry.attributes.position;n?t+=Math.ceil(n.count/3):r&&(t+=Math.ceil(r.count/3))}if(e.children)for(let n of e.children)t+=this._countTriangles(n);return t}_ensureCapacity(e){if(e<=this._triangleCapacity)return;if(this._onRange){this.triangles.grow(e),this._triangleCapacity=e;return}let t=this.triangles,n=this.currentTriangleIndex;this._allocateTriangles(e);for(let e=0;e<n;e++)this.triangles.chunkFor(e).set(t.chunkFor(e).subarray(t.baseOf(e),t.baseOf(e)+t.lanesPerRecord),this.triangles.baseOf(e));this._triangleCapacity=e}_allocateTriangles(e,t=!1){this.triangles=(t?Dn.lazy:(...e)=>new Dn(...e))(e,st.FLOATS_PER_TRIANGLE,Uint32Array,void 0,Cn),this.triangleFloatChunks=this.triangles.viewAs(Float32Array),this.triangleData=this.triangles.single,this.triangleFloats=this.triangleFloatChunks.single}traverseObject(e){if(this._visit(e),e.children)for(let t of e.children)this.traverseObject(t)}_visit(e){e.isMesh?(this.processMesh(e),this._releaseAfterRead?.(e)):e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e)}processMesh(e){if(!e.geometry||!e.material){console.warn(`Skipping mesh with missing geometry or material:`,e);return}let t=this.processMaterial(e.material);e.userData.materialIndex=t;let n=this.meshes.length;this.meshes.push(e),e.userData.meshIndex=n;let r=`${e.geometry.uuid}|${t}`,i=Ir(e),a=!this._emissiveMaterial(t)&&!i,o=a?this._geometryRanges.get(r):null;if(o){let t={start:o.start,count:o.count,expandedStart:this.expandedTriangleCount,sharedFrom:o.meshIndex};this.expandedTriangleCount+=o.count,this.meshTriangleRanges.push(t),this._recordPlacements(e,n);return}let s=this.currentTriangleIndex,c=e.isInstancedMesh&&!i&&this._emissiveMaterial(t)&&this._canExpand(e),l=c||!e.isInstancedMesh&&!i&&(this._geometryUses.get(`${e.geometry.uuid}|${e.material?.uuid}`)===1||this._emissiveMaterial(t));this.extractGeometry(e,t,n,l,c);let u={start:s,count:this.currentTriangleIndex-s,expandedStart:this.expandedTriangleCount};this.expandedTriangleCount+=u.count,this.meshTriangleRanges.push(u),u.count>0&&!l&&a&&this._geometryRanges.set(r,{...u,meshIndex:n}),this._recordPlacements(e,n,l,c),u.count>0&&this._onRange?.(n,u)}_recordPlacements(e,t,n=!1,r=!1){let i=e.matrixWorld.elements,a=this.instanceMatrices,o=this.instanceSource;if(!e.isInstancedMesh||!e.instanceMatrix||r){let r=this._nextPlacement();if(o[r]=t,n){for(let e=0;e<16;e++)a[r*16+e]=+(e%5==0);this.bakeInverse.set(t,Float32Array.from(this._matrixPool.mat4.copy(e.matrixWorld).invert().elements))}else for(let e=0;e<16;e++)a[r*16+e]=i[e];return}let s=e.instanceMatrix.array,c=e.count??s.length/16,l=kr(i);l&&s.length===c*16&&this._shareable.push({mesh:e,start:this.instanceCount,count:c});for(let e=0;e<c;e++){let n=e*16,r=this._nextPlacement(),c=r*16;if(o[r]=t,l){for(let e=0;e<16;e++)a[c+e]=s[n+e];continue}for(let e=0;e<4;e++)for(let t=0;t<4;t++)a[c+e*4+t]=i[t]*s[n+e*4]+i[4+t]*s[n+e*4+1]+i[8+t]*s[n+e*4+2]+i[12+t]*s[n+e*4+3]}}_nextPlacement(){if(this.instanceCount>=this.instanceCapacity){let e=Math.max(16,this.instanceCapacity*2),t=new Int32Array(e),n=new Float32Array(e*16);t.set(this.instanceSource),n.set(this.instanceMatrices),this.instanceSource=t,this.instanceMatrices=n,this.instanceCapacity=e}return this.instanceCount++}_canExpand(e){let t=e.geometry,n=(t.index?t.index.count:t.attributes.position.count)/3,r=e.count??(e.instanceMatrix?.array.length??0)/16;return n*r<=Fr?!0:(this._issues?.record(Y.EMISSIVE_INSTANCES_COLLAPSED,`"${e.name||`instanced mesh`}" would need ${Math.round(n*r).toLocaleString()} triangles to light every instance; lighting the first one only`,{instances:r,trianglesPerInstance:n,limit:Fr}),!1)}_emissiveMaterial(e){let t=this.materials[e];if(!t||!(t.emissiveIntensity>0))return!1;let n=t.emissive;return!!n&&(n.r>0||n.g>0||n.b>0)}processMaterial(e){let t=this._materialUuidMap.get(e.uuid)??-1;if(t===-1){e.depthWrite===!1&&(e.depthWrite=!0,Gt(wr,`depthWrite`,`material had depthWrite disabled — enabled for rastered rendering`));let n=this.createMaterialObject(e);this.materials.push(n),t=this.materials.length-1,this._materialUuidMap.set(e.uuid,t)}return t}getMaterialType(e){return e.isMeshPhysicalMaterial?`physical`:e.isMeshStandardMaterial?`standard`:e.isMeshPhongMaterial?`phong`:e.isMeshLambertMaterial?`lambert`:e.isMeshBasicMaterial?`basic`:e.isMeshToonMaterial?`toon`:`unknown`}getPhysicalDefaults(){let e={};for(let[t,n]of Object.entries(q))e[t]=Er.has(t)?new r.Color().fromArray(n):Array.isArray(n)?[...n]:n;return e.normalScale={x:q.normalScale[0],y:q.normalScale[1]},e}mapLegacyMaterialToPhysical(e,t){let n={};switch(t){case`basic`:n.emissive=e.color.clone(),n.emissiveIntensity=1,n.color=new r.Color(0),n.roughness=1,n.metalness=0,n.specularIntensity=0;break;case`lambert`:n.roughness=1,n.metalness=0,n.specularIntensity=0;break;case`phong`:{let t=e.shininess||30;n.roughness=Math.sqrt(2/(t+2)),n.metalness=0}if(e.specular){let t=e.specular,i=t.r*.299+t.g*.587+t.b*.114,a=Math.max(t.r,t.g,t.b);n.specularIntensity=Math.min(i*2,1),n.specularColor=a>0?t.clone().multiplyScalar(1/a):new r.Color(1,1,1)}break;case`toon`:n.roughness=.9,n.metalness=0;break;case`standard`:case`physical`:break}return n}createMaterialObject(e){let t=this.getPhysicalDefaults(),n=this.getMaterialType(e),r=this.mapLegacyMaterialToPhysical(e,n),i=Ar(e),a={},o=n=>r[n]===void 0?e[n]!==void 0&&e[n]!==null?(a[n]=Dr.MATERIAL,e[n]):(a[n]=Dr.DEFAULT,t[n]):(a[n]=Dr.MAPPED,r[n]);for(let e of[`transparent`,`alphaMode`,`side`,`depthWrite`])a[e]=Dr.MATERIAL;return{uuid:e.uuid,color:o(`color`),emissive:o(`emissive`),emissiveIntensity:o(`emissiveIntensity`),roughness:Math.max(.02,o(`roughness`)),metalness:o(`metalness`),ior:o(`ior`),opacity:o(`opacity`),transmission:o(`transmission`),thickness:o(`thickness`),attenuationColor:o(`attenuationColor`),attenuationDistance:o(`attenuationDistance`),dispersion:o(`dispersion`),sheen:o(`sheen`),sheenRoughness:o(`sheenRoughness`),sheenColor:o(`sheenColor`),clearcoat:o(`clearcoat`),clearcoatRoughness:o(`clearcoatRoughness`),iridescence:o(`iridescence`),iridescenceIOR:o(`iridescenceIOR`),iridescenceThicknessRange:o(`iridescenceThicknessRange`),subsurface:o(`subsurface`),subsurfaceColor:o(`subsurfaceColor`),subsurfaceRadius:o(`subsurfaceRadius`),subsurfaceRadiusScale:o(`subsurfaceRadiusScale`),subsurfaceAnisotropy:o(`subsurfaceAnisotropy`),anisotropy:o(`anisotropy`),anisotropyRotation:o(`anisotropyRotation`),specularIntensity:o(`specularIntensity`),specularColor:o(`specularColor`),normalScale:o(`normalScale`),bumpScale:o(`bumpScale`),displacementScale:o(`displacementScale`),transparent:+!!e.transparent,alphaTest:o(`alphaTest`),alphaMode:jr(e),side:this.getMaterialSide(e),depthWrite:e.depthWrite??!0?1:0,map:this.processTexture(i.map,this.maps),normalMap:this.processTexture(i.normalMap,this.normalMaps),bumpMap:this.processTexture(i.bumpMap,this.bumpMaps),roughnessMap:this.processTexture(i.roughnessMap,this.roughnessMaps),metalnessMap:this.processTexture(i.metalnessMap,this.metalnessMaps),emissiveMap:this.processTexture(i.emissiveMap,this.emissiveMaps),displacementMap:this.processTexture(i.displacementMap,this.displacementMaps),anisotropyMap:this.processTexture(i.anisotropyMap,this.anisotropyMaps),clearcoatMap:this.processTexture(i.clearcoatMap,this.clearcoatMaps),clearcoatRoughnessMap:this.processTexture(i.clearcoatRoughnessMap,this.clearcoatRoughnessMaps),transmissionMap:this.processTexture(i.transmissionMap,this.transmissionMaps),thicknessMap:this.processTexture(e.thicknessMap,[]),sheenColorMap:this.processTexture(i.sheenColorMap,this.sheenColorMaps),sheenRoughnessMap:this.processTexture(i.sheenRoughnessMap,this.sheenRoughnessMaps),specularIntensityMap:this.processTexture(i.specularIntensityMap,this.specularIntensityMaps),specularColorMap:this.processTexture(i.specularColorMap,this.specularColorMaps),iridescenceMap:this.processTexture(i.iridescenceMap,this.iridescenceMaps),iridescenceThicknessMap:this.processTexture(i.iridescenceThicknessMap,this.iridescenceThicknessMaps),mapMatrix:this.getTextureMatrix(i.map),normalMapMatrices:this.getTextureMatrix(i.normalMap),bumpMapMatrices:this.getTextureMatrix(i.bumpMap),roughnessMapMatrices:this.getTextureMatrix(i.roughnessMap),metalnessMapMatrices:this.getTextureMatrix(i.metalnessMap),emissiveMapMatrices:this.getTextureMatrix(i.emissiveMap),displacementMapMatrices:this.getTextureMatrix(i.displacementMap),sources:a,originalType:n}}getTextureMatrix(e){return e?(e.matrixAutoUpdate&&e.updateMatrix(),e.matrix.elements):new r.Matrix3().elements}getMaterialSide(e){if(e.transmission>0)return 2;switch(e.side){case r.FrontSide:return 0;case r.BackSide:return 1;case r.DoubleSide:return 2;default:return 0}}processTexture(e,t){if(!e)return-1;let n=this._textureIndexCache.get(t);n||(n=new Map,this._textureIndexCache.set(t,n));let r=e.source.uuid,i=n.get(r);if(i!==void 0)return i;if(t.length<Tr){t.push(e);let i=t.length-1;return n.set(r,i),i}return this._droppedTextures++,this._droppedTextures===1&&this._issues?.record(Y.TEXTURE_LIMIT_EXCEEDED,`scene needs more than ${Tr} distinct textures for one map type; the rest render untextured`,{limit:Tr,firstDropped:e.name||e.source?.uuid}),-1}extractGeometry(e,t,n,i=!1,a=!1){e.updateMatrix(),e.updateMatrixWorld();let o=e.geometry;o.attributes.normal||o.computeVertexNormals();let s=o.attributes.position,c=o.attributes.normal,l=o.attributes.uv,u=o.index?o.index.array:null,d=u?u.length/3:s.count/3;if(a){let i=e.count??e.instanceMatrix.array.length/16,a=this._matrixPool.mat4,o=new r.Matrix4;for(let f=0;f<i;f++){a.fromArray(e.instanceMatrix.array,f*16),o.multiplyMatrices(e.matrixWorld,a);let i=new r.Matrix3().getNormalMatrix(o);this.extractTrianglesInBatch(s,c,l,u,d,t,n,o,i,Lr(o.elements)<0)}return}let f=i?this._matrixPool.mat4.copy(e.matrixWorld):null,p=i?this._matrixPool.mat3.getNormalMatrix(e.matrixWorld):null,m=i&&Lr(f.elements)<0;this.extractTrianglesInBatch(s,c,l,u,d,t,n,f,p,m)}extractTrianglesInBatch(e,t,n,r,i,a,o,s=null,c=null,l=!1){for(;this.materialTriangleCounts.length<=a;)this.materialTriangleCounts.push(0);this.materialTriangleCounts[a]+=i;let u=this._getVec3(0),d=this._getVec3(1),f=this._getVec3(2),p=this._getVec3(3),m=this._getVec3(4),h=this._getVec3(5),g=this._getVec2(0),_=this._getVec2(1),v=this._getVec2(2);this._ensureCapacity(this.currentTriangleIndex+i);let y=s?.elements,b=c?.elements;for(let c=0;c<i;c++){let i=c*3,x=r?r[i+0]:i+0,S=l?2:1,C=l?1:2,w=r?r[i+S]:i+S,T=r?r[i+C]:i+C;this.getVertex(e,x,u),this.getVertex(e,w,d),this.getVertex(e,T,f),this.getVertex(t,x,p),this.getVertex(t,w,m),this.getVertex(t,T,h),n?(this.getVertex(n,x,g),this.getVertex(n,w,_),this.getVertex(n,T,v)):(g.set(0,0),_.set(0,0),v.set(0,0)),s&&(Nr(u,y),Nr(d,y),Nr(f,y),Pr(p,b),Pr(m,b),Pr(h,b)),p.normalize(),m.normalize(),h.normalize(),this.packTriangleDataTextureFormat(this.currentTriangleIndex,u,d,f,p,m,h,g,_,v,a,o),this.currentTriangleIndex++}}packTriangleDataTextureFormat(e,t,n,r,i,a,o,s,c,l,u,d){let f=st,p=this.triangles.baseOf(e),m=this.triangleFloatChunks.chunkFor(e),h=this.triangles.chunkFor(e);m[p+f.POSITION_A_OFFSET+0]=t.x,m[p+f.POSITION_A_OFFSET+1]=t.y,m[p+f.POSITION_A_OFFSET+2]=t.z,h[p+f.NORMAL_A_PACKED_OFFSET]=dt(i.x,i.y,i.z),m[p+f.POSITION_B_OFFSET+0]=n.x,m[p+f.POSITION_B_OFFSET+1]=n.y,m[p+f.POSITION_B_OFFSET+2]=n.z,h[p+f.NORMAL_B_PACKED_OFFSET]=dt(a.x,a.y,a.z),m[p+f.POSITION_C_OFFSET+0]=r.x,m[p+f.POSITION_C_OFFSET+1]=r.y,m[p+f.POSITION_C_OFFSET+2]=r.z,h[p+f.NORMAL_C_PACKED_OFFSET]=dt(o.x,o.y,o.z),m[p+f.UV_AB_OFFSET+0]=s.x,m[p+f.UV_AB_OFFSET+1]=s.y,m[p+f.UV_AB_OFFSET+2]=c.x,m[p+f.UV_AB_OFFSET+3]=c.y,m[p+f.UV_C_OFFSET+0]=l.x,m[p+f.UV_C_OFFSET+1]=l.y,h[p+f.MATERIAL_FLAGS_OFFSET]=ut(u,this.materials[u]),h[p+f.MESH_INDEX_OFFSET]=d}releaseTriangles(){this.triangles=null,this.triangleData=null,this.triangleFloatChunks=null,this.triangleFloats=null}getTriangleData(){return this.triangles?this._streamedStore?this.triangles:this.triangles.trimTo(this.currentTriangleIndex):null}getTriangleCount(){return this.currentTriangleIndex}getVertex(e,t,n){return e.itemSize===2?(n.x=e.getX(t),n.y=e.getY(t)):e.itemSize>=3&&(n.x=e.getX(t),n.y=e.getY(t),n.z=e.getZ(t)),n}logStats(){let e=this.currentTriangleIndex*st.FLOATS_PER_TRIANGLE*4;wr.debug(J.list([`${J.count(this.currentTriangleIndex,`tri`)} (${J.mb(e)})`,J.count(this.materials.length,`material`),J.count(this.maps.length,`map`)]))}extractMaterialsOnly(e){return this.resetArrays(),this._traverseMaterialsOnly(e),this.getExtractedData()}_traverseMaterialsOnly(e){if(e.isMesh&&e.geometry&&e.material){let t=this.processMaterial(e.material);e.userData.materialIndex=t;let n=this.meshes.length;this.meshes.push(e),e.userData.meshIndex=n}else e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e);if(e.children)for(let t of e.children)this._traverseMaterialsOnly(t)}resetArrays(){this._droppedTextures=0,this.triangles=null,this._streamedStore=!1,this.triangleData=null,this.triangleFloatChunks=null,this.triangleFloats=null,this.triangleCount=0,this.currentTriangleIndex=0,this.materials=[],this.materialTriangleCounts=[],this.meshes=[],this.meshTriangleRanges=[],this._geometryRanges=new Map,this.expandedTriangleCount=0,this._allocatePlacements(0),this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.roughnessMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this._materialUuidMap=new Map,this._textureIndexCache=new WeakMap}getExtractedData(){return{triangleData:this.getTriangleData(),triangleCount:this.getTriangleCount(),materials:this.materials,materialTriangleCounts:this.materialTriangleCounts,meshes:this.meshes,meshTriangleRanges:this.meshTriangleRanges,expandedTriangleCount:this.expandedTriangleCount,instanceSource:this.instanceSource.subarray(0,this.instanceCount),instanceMatrices:this.instanceMatrices.subarray(0,this.instanceCount*16),instanceCount:this.instanceCount,bakeInverse:this.bakeInverse,maps:this.maps,normalMaps:this.normalMaps,bumpMaps:this.bumpMaps,metalnessMaps:this.metalnessMaps,emissiveMaps:this.emissiveMaps,roughnessMaps:this.roughnessMaps,displacementMaps:this.displacementMaps,anisotropyMaps:this.anisotropyMaps,transmissionMaps:this.transmissionMaps,clearcoatMaps:this.clearcoatMaps,clearcoatRoughnessMaps:this.clearcoatRoughnessMaps,sheenColorMaps:this.sheenColorMaps,sheenRoughnessMaps:this.sheenRoughnessMaps,iridescenceMaps:this.iridescenceMaps,iridescenceThicknessMaps:this.iridescenceThicknessMaps,specularIntensityMaps:this.specularIntensityMaps,specularColorMaps:this.specularColorMaps,directionalLights:this.directionalLights,cameras:this.cameras}}},zr=null,Br=null;function Vr(e,t=null){zr=e,Br=e?t:null}function Hr(){return zr}function Ur(){return Br}function Wr(e){if(!zr)return!1;let t=e[0],n=e[1],r=e[2];return e[0]=zr[0]*t+zr[1]*n+zr[2]*r,e[1]=zr[3]*t+zr[4]*n+zr[5]*r,e[2]=zr[6]*t+zr[7]*n+zr[8]*r,!0}function Gr(e,t,n){if(!zr||n.length===0)return 0;let r=0;for(let i=0;i+t<=e.length;i+=t)for(let t of n){let n=i+t,a=e[n],o=e[n+1],s=e[n+2];e[n]=zr[0]*a+zr[1]*o+zr[2]*s,e[n+1]=zr[3]*a+zr[4]*o+zr[5]*s,e[n+2]=zr[6]*a+zr[7]*o+zr[8]*s,r++}return r}function Kr(e){if(e===null||typeof e==`boolean`||typeof e==`string`)return e;if(typeof e==`number`)return Number.isFinite(e)?e:{$num:String(e)};if(typeof e!=`object`)return;if(e.isColor)return{$color:[e.r,e.g,e.b]};if(e.isQuaternion)return{$quat:[e.x,e.y,e.z,e.w]};if(e.isVector2||e.isVector3||e.isVector4)return{$vec:e.toArray()};if(ArrayBuffer.isView(e))return Array.from(e);if(Array.isArray(e))return e.map(e=>Kr(e)??null);let t=Object.getPrototypeOf(e);if(t!==Object.prototype&&t!==null)return;let n={};for(let[t,r]of Object.entries(e)){let e=Kr(r);e!==void 0&&(n[t]=e)}return n}function qr(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(qr);if(`$num`in e)return Number(e.$num);if(e.$color)return new r.Color(...e.$color);if(e.$quat)return new r.Quaternion(...e.$quat);if(e.$vec){let t=[null,null,r.Vector2,r.Vector3,r.Vector4][e.$vec.length];return new t(...e.$vec)}let t={};for(let[n,r]of Object.entries(e))t[n]=qr(r);return t}rn();var Jr=new WeakSet,Yr=Wt(`material`),Xr=K.SLOTS_PER_MATERIAL,Zr=st.MATERIAL_FLAGS_OFFSET,Qr=new Set([`transmission`,`transparent`,`opacity`,`alphaMode`]),$r=new Set([`side`,...Qr,`emissive`,`emissiveIntensity`]),ei=[[`map`,!0],[`emissiveMap`,!0],[`sheenColorMap`,!0],[`specularColorMap`,!0],[`normalMap`,!1],[`bumpMap`,!1],[`roughnessMap`,!1],[`metalnessMap`,!1],[`displacementMap`,!1],[`anisotropyMap`,!1],[`transmissionMap`,!1],[`clearcoatMap`,!1],[`clearcoatRoughnessMap`,!1],[`sheenRoughnessMap`,!1],[`iridescenceMap`,!1],[`iridescenceThicknessMap`,!1],[`specularIntensityMap`,!1]],ti={ior:K.IOR,transmission:K.TRANSMISSION,thickness:K.THICKNESS,emissiveIntensity:K.EMISSIVE_INTENSITY,attenuationDistance:K.ATTENUATION_DISTANCE,opacity:K.OPACITY,alphaTest:K.ALPHA_TEST,metalness:K.METALNESS,roughness:K.ROUGHNESS,clearcoat:K.CLEARCOAT,clearcoatRoughness:K.CLEARCOAT_ROUGHNESS,dispersion:K.DISPERSION,sheen:K.SHEEN,sheenRoughness:K.SHEEN_ROUGHNESS,specularIntensity:K.SPECULAR_INTENSITY,iridescence:K.IRIDESCENCE,iridescenceIOR:K.IRIDESCENCE_IOR,subsurface:K.SUBSURFACE,subsurfaceRadiusScale:K.SUBSURFACE_RADIUS_SCALE,subsurfaceAnisotropy:K.SUBSURFACE_ANISOTROPY,anisotropy:K.ANISOTROPY,anisotropyRotation:K.ANISOTROPY_ROTATION},ni=class e{constructor(e){this.sdfs=e,this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null,this.callbacks={},this._sources=[],this._hostSet=[]}static COLOR_OFFSETS=[K.COLOR,K.EMISSIVE,K.ATTENUATION_COLOR,K.SHEEN_COLOR,K.SPECULAR_COLOR,K.SUBSURFACE_COLOR].filter(e=>Number.isInteger(e));_convertColorsToWorkingSpace(t){if(Jr.has(t))return;Jr.add(t);let n=Gr(t,K.FLOATS_PER_MATERIAL,e.COLOR_OFFSETS);n&&Yr.debug(`converted ${n} material colour(s) into ${Ur()}`)}_writeColor(e,t,n,r,i){let a=[n,r,i];Wr(a)&&([n,r,i]=a),e[t]=n,e[t+1]=r,e[t+2]=i}setMaterialData(e,r=[]){if(!e)return;this._convertColorsToWorkingSpace(e);let i=e.length/4;this.materialStorageNode?(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode.value=this.materialStorageAttr,this.materialStorageNode.bufferCount=i):(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode=(0,n.storage)(this.materialStorageAttr,`vec4`,i).toReadOnly()),this.materialCount=Math.floor(i/Xr),this._sources=[...r],this._hostSet=[],Yr.debug(`${J.n(this.materialCount)} materials (storage buffer)`)}getStorageAttr(){return this.materialStorageAttr}getStorageNode(){return this.materialStorageNode}setMaterialTextures(e){e.srgbBuckets&&(this.srgbBuckets=e.srgbBuckets),e.linearBuckets&&(this.linearBuckets=e.linearBuckets)}setTexturePackMaps(e,t){this._srgbTexPacked=e||null,this._linearTexPacked=t||null}getPackedTextureIndex(e,t){if(!e)return-1;let n=e.source?.uuid??e.uuid,r=(t?this._srgbTexPacked:this._linearTexPacked)?.get(n);return r===void 0?-1:r}loadTexturesFromSdfs(){this.srgbBuckets=this.sdfs.srgbBucketTextures,this.linearBuckets=this.sdfs.linearBucketTextures,this.setTexturePackMaps(this.sdfs._srgbTexPacked,this.sdfs._linearTexPacked)}getTextureArrays(){return{srgbBuckets:this.srgbBuckets,linearBuckets:this.linearBuckets}}getMaterialProperty(e,t){let n=this.materialStorageAttr?.array;if(!n)return;let r=ti[t];if(r===void 0)return;let i=e*K.FLOATS_PER_MATERIAL+r;return i<n.length?n[i]:void 0}getMaterialPropertySource(e,t){return this._hostSet[e]?.has(t)?Dr.HOST:this._sources[e]?.[t]}serializeHostEdits(){let e=[];return this._hostSet.forEach((t,n)=>{t?.size&&e.push({index:n,props:Object.fromEntries(t)})}),e}updateMaterialProperty(e,t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*K.FLOATS_PER_MATERIAL;switch(pn.has(t)&&typeof n==`number`&&(n=mn(n)),t){case`color`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.COLOR,n.r,n.g,n.b);break;case`metalness`:r[i+K.METALNESS]=n;break;case`emissive`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.EMISSIVE,n[0],n[1],n[2]):this._writeColor(r,i+K.EMISSIVE,n.r,n.g,n.b);break;case`roughness`:r[i+K.ROUGHNESS]=n;break;case`ior`:r[i+K.IOR]=n;break;case`transmission`:r[i+K.TRANSMISSION]=n;break;case`thickness`:r[i+K.THICKNESS]=n;break;case`emissiveIntensity`:r[i+K.EMISSIVE_INTENSITY]=n;break;case`attenuationColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.ATTENUATION_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.ATTENUATION_COLOR,n.r,n.g,n.b);break;case`attenuationDistance`:r[i+K.ATTENUATION_DISTANCE]=ft(n);break;case`dispersion`:r[i+K.DISPERSION]=n;break;case`sheen`:r[i+K.SHEEN]=n;break;case`sheenRoughness`:r[i+K.SHEEN_ROUGHNESS]=n;break;case`sheenColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SHEEN_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SHEEN_COLOR,n.r,n.g,n.b);break;case`specularIntensity`:r[i+K.SPECULAR_INTENSITY]=n;break;case`specularColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SPECULAR_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SPECULAR_COLOR,n.r,n.g,n.b);break;case`iridescence`:r[i+K.IRIDESCENCE]=n;break;case`iridescenceIOR`:r[i+K.IRIDESCENCE_IOR]=n;break;case`iridescenceThicknessRange`:Array.isArray(n)&&(r[i+K.IRIDESCENCE_THICKNESS_RANGE]=n[0],r[i+K.IRIDESCENCE_THICKNESS_RANGE+1]=n[1]);break;case`clearcoat`:r[i+K.CLEARCOAT]=n;break;case`clearcoatRoughness`:r[i+K.CLEARCOAT_ROUGHNESS]=n;break;case`opacity`:r[i+K.OPACITY]=n;break;case`side`:r[i+K.SIDE]=n,this._patchTriangleSideForMaterial(e,n);break;case`transparent`:r[i+K.TRANSPARENT]=n;break;case`alphaTest`:r[i+K.ALPHA_TEST]=n;break;case`alphaMode`:r[i+K.ALPHA_MODE]=n;break;case`depthWrite`:r[i+K.DEPTH_WRITE]=n;break;case`normalScale`:n.x===void 0?typeof n==`number`&&(r[i+K.NORMAL_SCALE]=n,r[i+K.NORMAL_SCALE+1]=n):(r[i+K.NORMAL_SCALE]=n.x,r[i+K.NORMAL_SCALE+1]=n.y);break;case`bumpScale`:r[i+K.BUMP_SCALE]=n;break;case`displacementScale`:r[i+K.DISPLACEMENT_SCALE]=n;break;case`subsurface`:r[i+K.SUBSURFACE]=n;break;case`subsurfaceRadiusScale`:r[i+K.SUBSURFACE_RADIUS_SCALE]=n;break;case`subsurfaceAnisotropy`:r[i+K.SUBSURFACE_ANISOTROPY]=n;break;case`anisotropy`:r[i+K.ANISOTROPY]=n;break;case`anisotropyRotation`:r[i+K.ANISOTROPY_ROTATION]=n;break;case`subsurfaceColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SUBSURFACE_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SUBSURFACE_COLOR,n.r,n.g,n.b);break;case`subsurfaceRadius`:Array.isArray(n)?(r[i+K.SUBSURFACE_RADIUS]=n[0],r[i+K.SUBSURFACE_RADIUS+1]=n[1],r[i+K.SUBSURFACE_RADIUS+2]=n[2]):n.x!==void 0&&(r[i+K.SUBSURFACE_RADIUS]=n.x,r[i+K.SUBSURFACE_RADIUS+1]=n.y,r[i+K.SUBSURFACE_RADIUS+2]=n.z);break;default:Yr.warn(`unknown material property: ${t}`);return}this.materialStorageAttr.needsUpdate=!0,(this._hostSet[e]??=new Map).set(t,Kr(n)),Qr.has(t)&&this._recomputeOpaqueBlockerForMaterial(e),this._notifyReset()}updateMaterialDataFromObject(t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=t*K.FLOATS_PER_MATERIAL;vn(r,i,n);for(let t of e.COLOR_OFFSETS)this._writeColor(r,i+t,r[i+t],r[i+t+1],r[i+t+2]);this._sources[t]=n.sources,this._hostSet[t]=void 0,this._patchTriangleSideForMaterial(t,r[i+K.SIDE]),this._recomputeOpaqueBlockerForMaterial(t),this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}updateMaterial(e,t){let n=this.sdfs.geometryExtractor.createMaterialObject(t);if(this._srgbTexPacked||this._linearTexPacked){let e=Ar(t);for(let[t,r]of ei)n[t]=this.getPackedTextureIndex(e[t],r)}this.updateMaterialDataFromObject(e,n)}updateTextureTransform(e,t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*K.FLOATS_PER_MATERIAL,a={map:K.ALBEDO_TRANSFORM,normalMap:K.NORMAL_TRANSFORM,roughnessMap:K.ROUGHNESS_TRANSFORM,metalnessMap:K.METALNESS_TRANSFORM,emissiveMap:K.EMISSIVE_TRANSFORM,bumpMap:K.BUMP_TRANSFORM,displacementMap:K.DISPLACEMENT_TRANSFORM}[t];if(a===void 0){Yr.warn(`unknown texture name for transform update: ${t}`);return}for(let e=0;e<8;e++)i+a+e<r.length&&(r[i+a+e]=n[e]);this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}_notifyReset(){this.callbacks.onReset&&this.callbacks.onReset()}_recomputeOpaqueBlockerForMaterial(e){let t=this.materialStorageAttr?.array;if(!t)return;let n=e*K.FLOATS_PER_MATERIAL,r=lt({alphaMode:t[n+K.ALPHA_MODE],transparent:t[n+K.TRANSPARENT],transmission:t[n+K.TRANSMISSION],opacity:t[n+K.OPACITY]});this._patchTriangleFlagForMaterial(e,26,2,r)}_patchTriangleFlagForMaterial(e,t,n,r){let i=this.callbacks.getTriangleData?.(),a=i?.records,o=a?null:i?.array,s=i?.count|0;if(!o&&!a||s===0)return;let c=st.FLOATS_PER_TRIANGLE,l=(1<<n)-1<<t>>>0,u=(r<<t&l)>>>0,d=0;for(let t=0;t<s;t++){let n=a?a.chunkFor(t):o,r=a?a.baseOf(t):t*c;(n[r+Zr]&16777215)===e&&(n[r+Zr]=(n[r+Zr]&~l|u)>>>0,d++)}d>0&&this.callbacks.onTriangleDataChanged&&this.callbacks.onTriangleDataChanged()}_patchTriangleSideForMaterial(e,t){this._patchTriangleFlagForMaterial(e,24,2,t)}dispose(){this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null,this._sources=[],this._hostSet=[]}},ri=`function e(e,t,n,r){let i=n,a=n+r-1;for(;i<a;){let n=i+a>>1;e[n]<t?i=n+1:a=n}return i-n}function t(t,n,r){let i=n*r,a=new Float32Array(i),o=0;for(let e=0;e<r;e++){let i=Math.sin(Math.PI*(e+.5)/r);for(let r=0;r<n;r++){let s=e*n+r,c=t[4*s],l=t[4*s+1],u=t[4*s+2],d=(.2126*c+.7152*l+.0722*u)*i;a[s]=d,o+=d}}let s=o/i,c=0;for(let e=0;e<i;e++)a[e]=Math.max(0,a[e]-s),c+=a[e];let l=c>0,u=l?c:o,d=l?s:0;if(!l)for(let e=0;e<r;e++){let i=Math.sin(Math.PI*(e+.5)/r);for(let r=0;r<n;r++){let o=e*n+r,s=t[4*o],c=t[4*o+1],l=t[4*o+2];a[o]=(.2126*s+.7152*c+.0722*l)*i}}let f=new Float32Array(i),p=new Float32Array(r),m=0;for(let e=0;e<r;e++){let t=0;for(let r=0;r<n;r++){let i=e*n+r;t+=a[i],f[i]=t}if(t!==0)for(let r=e*n,i=e*n+n;r<i;r++)f[r]/=t;m+=t,p[e]=m}if(m!==0)for(let e=0,t=p.length;e<t;e++)p[e]/=m;let h=new Float32Array(r);for(let t=0;t<r;t++)h[t]=(e(p,(t+1)/r,0,r)+.5)/r;let g=new Float32Array(n*r);for(let t=0;t<r;t++)for(let r=0;r<n;r++){let i=t*n+r;g[i]=(e(f,(r+1)/n,t*n,n)+.5)/n}return{marginalData:h,conditionalData:g,totalSum:u,compensationDelta:d}}self.onmessage=function(e){let{floatData:n,width:r,height:i}=e.data;try{let e=t(n,r,i);self.postMessage({marginalData:e.marginalData,conditionalData:e.conditionalData,totalSum:e.totalSum,compensationDelta:e.compensationDelta,width:r,height:i},[e.marginalData.buffer,e.conditionalData.buffer])}catch(e){self.postMessage({error:e.message})}};`,ii=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,ri],{type:`text/javascript;charset=utf-8`});function ai(e){let t;try{if(t=ii&&(self.URL||self.webkitURL).createObjectURL(ii),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(ri),{type:`module`,name:e?.name})}}function oi(e,t,n=0,r=e.length){let i=n,a=n+r-1;for(;i<a;){let n=i+a>>1;e[n]<t?i=n+1:a=n}return i-n}function si(e,t,n){return .2126*e+.7152*t+.0722*n}function ci(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function li(e){let{width:t,height:n}=e.image,i=e.image.data,a=!1;if(!i){let r=new OffscreenCanvas(t,n).getContext(`2d`);r.drawImage(e.image,0,0,t,n),i=r.getImageData(0,0,t,n).data,a=!0}let o;if(e.type===r.FloatType&&i instanceof Float32Array)o=new Float32Array(i);else if(e.type===r.HalfFloatType){o=new Float32Array(i.length);for(let e=0,t=i.length;e<t;e++)o[e]=r.DataUtils.fromHalfFloat(i[e])}else{let e;e=i instanceof Int8Array||i instanceof Int16Array||i instanceof Int32Array?2**(8*i.BYTES_PER_ELEMENT-1)-1:2**(8*i.BYTES_PER_ELEMENT)-1,o=new Float32Array(i.length);for(let t=0,n=i.length;t<n;t++)o[t]=i[t]/e}if(!a&&e.colorSpace===r.SRGBColorSpace&&(a=!0),a)for(let e=0,t=o.length;e<t;e+=4)o[e]=ci(o[e]),o[e+1]=ci(o[e+1]),o[e+2]=ci(o[e+2]);if(e.flipY){let e=new Float32Array(o.length);for(let r=0;r<n;r++){let i=n-r-1,a=r*t*4,s=i*t*4;e.set(o.subarray(a,a+t*4),s)}o=e}return{floatData:o,width:t,height:n}}var ui=class e{constructor(){this.marginalData=new Float32Array([0,1]),this.conditionalData=new Float32Array([0,0,1,1]),this.totalSum=0,this.compensationDelta=0,this.width=0,this.height=0,this._worker=null}dispose(){this.marginalData=null,this.conditionalData=null,this._worker&&=(this._worker.terminate(),null)}updateFrom(t){let{floatData:n,width:r,height:i}=li(t),a=e.computeCDF(n,r,i);this.marginalData=a.marginalData,this.conditionalData=a.conditionalData,this.totalSum=a.totalSum,this.compensationDelta=a.compensationDelta,this.width=r,this.height=i}async updateFromAsync(e){let{floatData:t,width:n,height:r}=li(e);this._worker=new ai;try{let e=await new Promise((e,i)=>{this._worker.onmessage=t=>{t.data.error?i(Error(t.data.error)):e(t.data)},this._worker.onerror=i,this._worker.postMessage({floatData:t,width:n,height:r},[t.buffer])});this.marginalData=e.marginalData,this.conditionalData=e.conditionalData,this.totalSum=e.totalSum,this.compensationDelta=e.compensationDelta,this.width=e.width,this.height=e.height}finally{this._worker&&=(this._worker.terminate(),null)}}static computeCDF(e,t,n){let r=t*n,i=new Float32Array(r),a=0;for(let r=0;r<n;r++){let o=Math.sin(Math.PI*(r+.5)/n);for(let n=0;n<t;n++){let s=r*t+n,c=si(e[4*s],e[4*s+1],e[4*s+2])*o;i[s]=c,a+=c}}let o=a/r,s=0;for(let e=0;e<r;e++)i[e]=Math.max(0,i[e]-o),s+=i[e];let c=s>0,l=c?s:a,u=c?o:0;if(!c)for(let r=0;r<n;r++){let a=Math.sin(Math.PI*(r+.5)/n);for(let n=0;n<t;n++){let o=r*t+n;i[o]=si(e[4*o],e[4*o+1],e[4*o+2])*a}}let d=new Float32Array(r),f=new Float32Array(n),p=0;for(let e=0;e<n;e++){let n=0;for(let r=0;r<t;r++){let a=e*t+r;n+=i[a],d[a]=n}if(n!==0)for(let r=e*t,i=e*t+t;r<i;r++)d[r]/=n;p+=n,f[e]=p}if(p!==0)for(let e=0,t=f.length;e<t;e++)f[e]/=p;let m=new Float32Array(n),h=new Float32Array(r);for(let e=0;e<n;e++)m[e]=(oi(f,(e+1)/n)+.5)/n;for(let e=0;e<n;e++)for(let n=0;n<t;n++){let r=e*t+n;h[r]=(oi(d,(n+1)/t,e*t,t)+.5)/t}return{marginalData:m,conditionalData:h,totalSum:l,compensationDelta:u}}},di=j({origin:`vec3`,direction:`vec3`}),fi=j({color:`vec4`,emissive:`vec3`,emissiveIntensity:`float`,roughness:`float`,metalness:`float`,ior:`float`,transmission:`float`,thickness:`float`,clearcoat:`float`,clearcoatRoughness:`float`,opacity:`float`,transparent:`bool`,attenuationColor:`vec3`,attenuationDistance:`float`,dispersion:`float`,sheen:`float`,sheenRoughness:`float`,sheenColor:`vec3`,specularIntensity:`float`,specularColor:`vec3`,alphaTest:`float`,alphaMode:`int`,side:`int`,depthWrite:`int`,albedoMapIndex:`int`,emissiveMapIndex:`int`,normalMapIndex:`int`,bumpMapIndex:`int`,bumpScale:`float`,displacementScale:`float`,metalnessMapIndex:`int`,roughnessMapIndex:`int`,displacementMapIndex:`int`,normalScale:`vec2`,albedoTransform:`mat3`,emissiveTransform:`mat3`,normalTransform:`mat3`,bumpTransform:`mat3`,metalnessTransform:`mat3`,roughnessTransform:`mat3`,displacementTransform:`mat3`,iridescence:`float`,iridescenceIOR:`float`,iridescenceThicknessRange:`vec2`,subsurface:`float`,subsurfaceColor:`vec3`,subsurfaceRadius:`vec3`,subsurfaceRadiusScale:`float`,subsurfaceAnisotropy:`float`,anisotropy:`float`,anisotropyRotation:`float`,anisotropyMapIndex:`int`,transmissionMapIndex:`int`,clearcoatMapIndex:`int`,clearcoatRoughnessMapIndex:`int`,sheenColorMapIndex:`int`,sheenRoughnessMapIndex:`int`,iridescenceMapIndex:`int`,iridescenceThicknessMapIndex:`int`,specularIntensityMapIndex:`int`,specularColorMapIndex:`int`}),pi=j({transmission:`float`,clearcoat:`float`,clearcoatRoughness:`float`,sheenColor:`vec3`,sheenRoughness:`float`,iridescence:`float`,iridescenceThickness:`float`,specularIntensity:`float`,specularColor:`vec3`}),mi=j({color:`vec4`,ior:`float`,transmission:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,albedoMapIndex:`int`,opacity:`float`,transparent:`bool`,alphaTest:`float`,alphaMode:`int`,albedoTransform:`mat3`}),hi=j({shadowed:`vec3`,unoccluded:`vec3`});j({position:`vec3`,radius:`float`,material:fi});var gi=j({didHit:`bool`,dst:`float`,hitPoint:`vec3`,normal:`vec3`,uv:`vec2`,materialIndex:`int`,meshIndex:`int`,instanceLeaf:`int`,triangleIndex:`int`,boxTests:`int`,triTests:`int`});j({posA:`vec3`,posB:`vec3`,posC:`vec3`,uvA:`vec2`,uvB:`vec2`,uvC:`vec2`,normalA:`vec3`,normalB:`vec3`,normalC:`vec3`,material:fi,materialIndex:`int`,meshIndex:`int`}),j({color:`vec4`,samples:`int`});var _i=j({direction:`vec3`,value:`vec3`,pdf:`float`,isTransmission:`bool`,colorWeight:`vec3`}),vi=j({specular:`float`,diffuse:`float`,sheen:`float`,clearcoat:`float`,transmission:`float`,iridescence:`float`}),yi=j({Ta:`vec3`,Ba:`vec3`}),bi=j({NoL:`float`,NoV:`float`,NoH:`float`,VoH:`float`,LoH:`float`,ToH:`float`,BoH:`float`,ToV:`float`,BoV:`float`,ToL:`float`,BoL:`float`}),xi=j({compensation:`vec3`,E_total:`vec3`}),Si=j({f0:`vec3`,f90:`float`,eta:`float`,F0m:`vec3`,F0:`vec3`}),Ci=j({albedo:`vec4`,emissive:`vec3`,metalness:`float`,roughness:`float`,normal:`vec3`,hasTextures:`bool`}),wi=j({isMetallic:`bool`,isRough:`bool`,isSmooth:`bool`,isTransmissive:`bool`,hasClearcoat:`bool`,isEmissive:`bool`,complexityScore:`float`}),Ti=j({albedoUV:`vec2`,normalUV:`vec2`,metalnessUV:`vec2`,emissiveUV:`vec2`,bumpUV:`vec2`,roughnessUV:`vec2`,normalBumpSameUV:`bool`,metalRoughSameUV:`bool`,albedoEmissiveSameUV:`bool`,allSameUV:`bool`}),Ei=j({invRoughness:`float`,metalFactor:`float`,iorFactor:`float`,maxSheenColor:`float`});j({traversals:`int`,transmissiveTraversals:`int`,rayType:`int`,isPrimaryRay:`bool`,actualBounceDepth:`int`});var Di=(0,n.wgslFn)(`
|
|
115
|
+
`,[re,ne]),be={ALWAYS:`always`,PER_CYCLE:`per_cycle`,PER_TILE:`per_tile`,CONDITIONAL:`conditional`},xe=class{constructor(e,t={}){this.name=e,this.enabled=t.enabled!==!1,this.executionMode=t.executionMode||be.ALWAYS,this.context=null,this.eventBus=null}initialize(e,t){this.context=e,this.eventBus=t,this.setupEventListeners()}setupEventListeners(){}shouldExecuteThisFrame(e){if(!this.enabled)return!1;let t=e.getState(`renderMode`)||0,n=e.getState(`tileRenderingComplete`);switch(this.executionMode){case be.ALWAYS:return!0;case be.PER_CYCLE:return t===0?!0:n===!0;case be.PER_TILE:return!0;case be.CONDITIONAL:return this.shouldExecute(e);default:return this.warn(`Unknown execution mode: ${this.executionMode}`),!0}}shouldExecute(e){return!0}render(e,t){throw Error(`render() must be implemented in ${this.name}`)}reset(){}setSize(e,t){}dispose(){}emit(e,t){this.eventBus&&this.eventBus.emit(e,t)}on(e,t){this.eventBus&&this.eventBus.on(e,t)}once(e,t){this.eventBus&&this.eventBus.once(e,t)}off(e,t){this.eventBus&&this.eventBus.off(e,t)}enable(){this.enabled||(this.enabled=!0,this.emit(`stage:enabled`,{stage:this.name}))}disable(){this.enabled&&(this.enabled=!1,this.emit(`stage:disabled`,{stage:this.name}))}toggle(){this.enabled?this.disable():this.enable()}isEnabled(){return this.enabled}log(...e){console.log(`[${this.name}]`,...e)}warn(...e){console.warn(`[${this.name}]`,...e)}error(...e){console.error(`[${this.name}]`,...e)}},Se=class{constructor(e,t,n={}){this.renderer=e,this.material=t,this.interactionModeEnabled=n.enabled===void 0?!0:n.enabled,this.interactionDelay=n.delay||100,this.interactionMode=!1,this.interactionTimeout=null,this.originalValues={},this.appliedValues={},this.wasAccumulationEnabled=!0,this.interactionQualitySettings={enableAccumulation:!1,...n.qualitySettings},this.onEnterCallback=n.onEnter||null,this.onExitCallback=n.onExit||null,this.onResetCallback=n.onReset||null}enterInteractionMode(){this.interactionModeEnabled&&(this.interactionMode?clearTimeout(this.interactionTimeout):(this.interactionMode=!0,this.originalValues={},this.appliedValues={},this.material.uniforms.enableAccumulation&&(this.wasAccumulationEnabled=this.material.uniforms.enableAccumulation.value),Object.keys(this.interactionQualitySettings).forEach(e=>{e===`pixelRatio`?(this.originalValues.dpr=this.renderer.getPixelRatio(),this.renderer.setPixelRatio(this.interactionQualitySettings.pixelRatio)):e===`enableAccumulation`||this.material.uniforms[e]&&(this.originalValues[e]=this.material.uniforms[e].value,this.material.uniforms[e].value=this._resolveQualityValue(e,this.interactionQualitySettings[e]),this.appliedValues[e]=this.material.uniforms[e].value)}),this.material.uniforms.enableAccumulation&&(this.originalValues.enableAccumulation=this.material.uniforms.enableAccumulation.value,this.material.uniforms.enableAccumulation.value=!1),this.material.uniforms.cameraIsMoving&&(this.originalValues.cameraIsMoving=this.material.uniforms.cameraIsMoving.value,this.material.uniforms.cameraIsMoving.value=!0),this.onEnterCallback&&this.onEnterCallback()),this.interactionTimeout=setTimeout(()=>{this.exitInteractionMode()},this.interactionDelay))}exitInteractionMode(){this.interactionMode&&(Object.keys(this.originalValues).forEach(e=>{if(e===`dpr`)this.renderer.setPixelRatio(this.originalValues.dpr);else if(this.material.uniforms[e]){let t=this.appliedValues[e];(t===void 0||this.material.uniforms[e].value===t)&&(this.material.uniforms[e].value=this.originalValues[e])}}),this.interactionMode=!1,this.originalValues={},this.appliedValues={},this.onExitCallback&&this.onExitCallback(),this.onResetCallback&&this.onResetCallback())}updateInteractionMode(e){e&&this.enterInteractionMode()}setInteractionModeEnabled(e){this.interactionModeEnabled=e,!e&&this.interactionMode&&(clearTimeout(this.interactionTimeout),this.exitInteractionMode())}updateQualitySettings(e){Object.assign(this.interactionQualitySettings,e),this.interactionMode&&Object.keys(e).forEach(t=>{t===`pixelRatio`?this.renderer.setPixelRatio(e.pixelRatio):this.material.uniforms[t]&&(this.material.uniforms[t].value=this._resolveQualityValue(t,e[t]),this.appliedValues[t]=this.material.uniforms[t].value)})}_resolveQualityValue(e,t){return typeof t==`function`?t(this.originalValues[e]??this.material.uniforms[e].value):t}setInteractionDelay(e){this.interactionDelay=e}getState(){return{interactionMode:this.interactionMode,interactionModeEnabled:this.interactionModeEnabled,interactionDelay:this.interactionDelay,hasTimeout:this.interactionTimeout!==null,qualitySettings:{...this.interactionQualitySettings},originalValues:{...this.originalValues},wasAccumulationEnabled:this.wasAccumulationEnabled}}forceExitInteractionMode(){this.interactionTimeout&&=(clearTimeout(this.interactionTimeout),null),this.exitInteractionMode()}isInInteractionMode(){return this.interactionMode}setCallbacks(e){e.onEnter&&(this.onEnterCallback=e.onEnter),e.onExit&&(this.onExitCallback=e.onExit),e.onReset&&(this.onResetCallback=e.onReset)}static createQualityPreset(e){let t={"ultra-low":{maxBounceCount:1,pixelRatio:.125,enableAccumulation:!1},low:{maxBounceCount:1,pixelRatio:.25,enableAccumulation:!1},medium:{maxBounceCount:2,pixelRatio:.5,enableAccumulation:!1},high:{maxBounceCount:3,pixelRatio:.75,enableAccumulation:!0}};return t[e]||t.low}dispose(){this.interactionTimeout&&=(clearTimeout(this.interactionTimeout),null),this.interactionMode&&this.forceExitInteractionMode(),this.onEnterCallback=null,this.onExitCallback=null,this.onResetCallback=null}},B,V=y((()=>{B={RENDER_COMPLETE:`engine:renderComplete`,RENDER_RESET:`engine:renderReset`,FRAME:`engine:frame`,DENOISING_START:`engine:denoisingStart`,DENOISING_END:`engine:denoisingEnd`,UPSCALING_START:`engine:upscalingStart`,UPSCALING_PROGRESS:`engine:upscalingProgress`,UPSCALING_END:`engine:upscalingEnd`,LOADING_UPDATE:`engine:loadingUpdate`,LOADING_RESET:`engine:loadingReset`,STATS_UPDATE:`engine:statsUpdate`,OBJECT_SELECTED:`engine:objectSelected`,OBJECT_DESELECTED:`engine:objectDeselected`,OBJECT_DOUBLE_CLICKED:`engine:objectDoubleClicked`,SELECT_MODE_CHANGED:`engine:selectModeChanged`,OBJECT_TRANSFORM_START:`engine:objectTransformStart`,OBJECT_TRANSFORM_END:`engine:objectTransformEnd`,TRANSFORM_MODE_CHANGED:`engine:transformModeChanged`,AUTO_FOCUS_UPDATED:`engine:autoFocusUpdated`,ORTHO_HEIGHT_UPDATED:`engine:orthoHeightUpdated`,AUTO_EXPOSURE_UPDATED:`engine:autoExposureUpdated`,AF_POINT_PLACED:`engine:afPointPlaced`,SETTING_CHANGED:`engine:settingChanged`,ANIMATION_STARTED:`engine:animationStarted`,ANIMATION_PAUSED:`engine:animationPaused`,ANIMATION_STOPPED:`engine:animationStopped`,ANIMATION_FINISHED:`engine:animationFinished`,TIMELINE_CHANGED:`engine:timelineChanged`,VIDEO_RENDER_PROGRESS:`engine:videoRenderProgress`,VIDEO_RENDER_COMPLETE:`engine:videoRenderComplete`,DISPOSE:`engine:dispose`,DEVICE_LOST:`engine:deviceLost`,ISSUE:`engine:issue`,SCENE_METADATA_APPLIED:`engine:sceneMetadataApplied`,STORAGE_CHANGED:`engine:storageChanged`}}));V();var Ce=null;function we(e){Ce=e}var Te=()=>Ce?.({type:B.LOADING_RESET}),H=e=>{Ce?.({type:B.LOADING_UPDATE,...e})},Ee=e=>{Ce?.({type:B.STATS_UPDATE,...e})};function De(e){return e.frameCount||0}function Oe(e){if(Array.isArray(e))e.forEach(e=>{e.userData&&e.userData.isFallback||(ke(e),e.dispose())});else{if(e.userData&&e.userData.isFallback)return;ke(e),e.dispose()}}function ke(e){e&&[`alphaMap`,`aoMap`,`bumpMap`,`clearcoatMap`,`clearcoatNormalMap`,`clearcoatRoughnessMap`,`displacementMap`,`emissiveMap`,`envMap`,`gradientMap`,`lightMap`,`map`,`metalnessMap`,`normalMap`,`roughnessMap`,`specularMap`,`sheenColorMap`,`sheenRoughnessMap`,`specularIntensityMap`,`specularColorMap`,`thicknessMap`,`transmissionMap`].forEach(t=>{e[t]&&(e[t].dispose(),e[t]=null)})}function Ae({material:e,geometry:t,children:n}){if(e&&Oe(e),t&&t.dispose(),n.length>0)for(let e of n)Ae(e)}function je(e){if(!e)return;e._canvasTarget&&e._onCanvasTargetResize&&e._canvasTarget.removeEventListener(`resize`,e._onCanvasTargetResize);let t=e.dispose();return e._canvasTarget=null,t}function Me(e,t=[]){if(e&&!(t.includes(e.name)||e.isScene)){if(e.isMaterial){Oe(e);return}for(;e.children.length>0;)for(let t of e.children)Me(t);Ae(e),e.removeFromParent(),e.clear()}}function Ne(e){e?.traverse(e=>{e.geometry?.userData?.__rayzeeOwned&&e.geometry.dispose()})}function Pe(e,t){return t}function Fe(e,t=!1){return t?1:1/(e+1)}function Ie(){let e=0,t=0,n=0,r=0;return{start(){e=performance.now()},end(){t=performance.now();let i=t-e;return r+=i,n++,i},getAverageFrameTime(){return n>0?r/n:0},getFPS(){let e=this.getAverageFrameTime();return e>0?1e3/e:0},reset(){n=0,r=0}}}var Le=Math.PI/180;function Re(e){let t=2*Math.PI*(e-1)/365;return .006918-.399912*Math.cos(t)+.070257*Math.sin(t)-.006758*Math.cos(2*t)+907e-6*Math.sin(2*t)-.002697*Math.cos(3*t)+.00148*Math.sin(3*t)}function ze({hours:e,dayOfYear:t,latitude:n}){let r=Re(t),i=(e-12)*15*Le,a=n*Le,o=Math.sin(a)*Math.sin(r)+Math.cos(a)*Math.cos(r)*Math.cos(i),s=Math.asin(Math.min(1,Math.max(-1,o)))/Le;return{azimuth:(Math.atan2(Math.sin(i),Math.cos(i)*Math.sin(a)-Math.tan(r)*Math.cos(a))/Le+540)%360,elevation:s}}function Be({elevation:e,dayOfYear:t,latitude:n,afternoon:r=!1}){let i=Re(t),a=n*Le,o=(Math.sin(e*Le)-Math.sin(a)*Math.sin(i))/(Math.cos(a)*Math.cos(i)),s=Math.acos(Math.min(1,Math.max(-1,o)))/Le/15;return r?12+s:12-s}var Ve=e=>[0,31,59,90,120,151,181,212,243,273,304,334][e-1]+21,He=Object.freeze({time:10,month:3,latitude:40}),Ue=ze({hours:He.time,dayOfYear:Ve(He.month),latitude:He.latitude}),We=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`look`}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`physical`})});function Ge(e=`viewer`){let t=We[e];if(!t)throw Error(`unknown render profile "${e}" — expected one of ${Object.keys(We).join(`, `)}`);return t}var U={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:We.viewer.toneMapping,exposure:1,saturation:We.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:We.viewer.environmentRotation,groundProjectionEnabled:!1,groundProjectionRadius:100,groundProjectionHeight:15,groundProjectionLevel:0,enableGroundCatcher:!1,groundCatcherHeight:0,globalIlluminationIntensity:1,environmentMode:`hdri`,gradientZenithColor:`#0077BE`,gradientHorizonColor:`#87CEEB`,gradientGroundColor:`#654321`,solidSkyColor:`#87CEEB`,skySunAzimuth:180-Ue.azimuth,skySunElevation:Ue.elevation,skySunStrength:1,skySunSize:.53,skyTurbidity:2,skyOzone:300,skyAirDensity:1,skyGroundAlbedo:`#959595`,skyAltitude:50,skyPreset:`clearDay`,cameraProjection:`perspective`,panoramaLonRange:[-180,180],panoramaLatRange:[-90,90],panoramaLevelHorizon:!0,enableDOF:!1,fov:55,focusDistance:.8,aperture:5.6,focalLength:50,apertureScale:1,anamorphicRatio:1,unitsPerMetre:1,dofMode:We.viewer.dofMode,dofBlur:.05,autoFocusMode:`auto`,afScreenPoint:{x:.5,y:.5},afSmoothingFactor:.15,enablePathTracer:!0,enableAccumulation:!0,pauseRendering:!1,maxSamples:60,bounces:3,transmissiveBounces:5,maxSubsurfaceSteps:8,maxTransparentBounces:32,useAdaptiveSampling:!0,noiseThreshold:.1,adaptiveMinSamples:8,adaptiveStopFraction:.9,usePixelFreeze:!0,pixelFreezeThreshold:.02,pixelFreezeStability:8,convergenceOverlay:!1,samplingTechnique:2,enableEmissiveTriangleSampling:!1,emissiveBoost:1,fireflyThreshold:3,shadowTerminatorOffset:.1,wavefrontSortMaterials:!0,renderLimitMode:`frames`,renderTimeLimit:30,renderMode:0,enableAlphaShadows:!1,tilesHelper:!0,showLightHelper:!1,directionalLightIntensity:0,directionalLightColor:`#ffffff`,directionalLightPosition:[1,1,1],directionalLightAngle:0,filterStrength:1,edgeAtrousIterations:5,edgePhiLuminance:4,edgePhiNormal:64,edgePhiDepth:.1,enableOIDN:!1,oidnQuality:`fast`,continuousDenoise:!1,continuousDenoiseInterval:8,oidnTemporalHistory:!0,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,interactionRenderScale:.5,debugVisScale:100,denoiserStrategy:`none`,enableASVGF:!1,asvgfTemporalAlpha:.1,asvgfAtrousIterations:8,asvgfPhiColor:10,asvgfPhiNormal:128,asvgfPhiDepth:1,asvgfVarianceBoost:1,asvgfMaxAccumFrames:32,asvgfGradientStrength:1,asvgfGradientSigmaScale:2,asvgfGradientNoiseFloor:0,asvgfDebugMode:0,asvgfQualityPreset:`medium`,showAsvgfHeatmap:!1,nrdQualityPreset:`medium`,nrdDebugMode:0,autoExposure:!1,autoExposureKeyValue:.18,autoExposureMinExposure:.1,autoExposureMaxExposure:20,autoExposureAdaptSpeedBright:3,autoExposureAdaptSpeedDark:.5},Ke=Object.freeze({perspective:0,equirectangular:1,orthographic:2}),qe=6e4,Je=3,Ye=.1,Xe=.01,Ze=4096,W=2048;function Qe(e){return W=Math.max(256,Math.min(Ze,Math.floor(e)||256)),W}var $e={low:{temporalAlpha:.1,gradientStrength:.8,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:3,phiColor:1,phiNormal:64,phiDepth:.1,phiLuminance:6,maxAccumFrames:16,varianceBoost:.5},medium:{temporalAlpha:.03,gradientStrength:1,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:4,phiColor:.5,phiNormal:128,phiDepth:.05,phiLuminance:4,maxAccumFrames:64,varianceBoost:1},high:{temporalAlpha:0,gradientStrength:1,gradientSigmaScale:2.5,gradientNoiseFloor:.05,atrousIterations:6,phiColor:.3,phiNormal:256,phiDepth:.02,phiLuminance:2,maxAccumFrames:128,varianceBoost:1.5}},et={maxAccumulatedFrameNum:30,maxFastAccumulatedFrameNum:6,maxStabilizedFrameNum:63,historyFixFrameNum:3,historyFixBasePixelStride:14,prepassBlurRadius:30,minBlurRadius:1,maxBlurRadius:30,lobeAngleFraction:.15,roughnessFraction:.15,planeDistanceSensitivity:.02,minHitDistanceWeight:.1,fastHistoryClampingSigmaScale:2,fireflySuppressorMinRelativeScale:2,enableAntiFirefly:!0,antilagLuminanceSigmaScale:2,antilagLuminanceSensitivity:3,disocclusionThreshold:.01,convergenceS:1,convergenceB:.2,convergenceP:.8,lobeVolumePercent:.1,handoverFrames:0},tt=[`maxAccumulatedFrameNum`,`maxFastAccumulatedFrameNum`,`maxStabilizedFrameNum`,`historyFixFrameNum`,`prepassBlurRadius`,`maxBlurRadius`,`enableAntiFirefly`],nt={low:{maxAccumulatedFrameNum:16,maxFastAccumulatedFrameNum:4,maxStabilizedFrameNum:16,historyFixFrameNum:2,prepassBlurRadius:0,maxBlurRadius:20,enableAntiFirefly:!1},medium:{},high:{maxAccumulatedFrameNum:45,maxFastAccumulatedFrameNum:8,historyFixFrameNum:4,prepassBlurRadius:40,maxBlurRadius:40}},rt={fov:{min:10,max:90,default:U.fov},focusDistance:{min:.3,max:100,default:U.focusDistance},aperture:{options:[1.4,2,2.8,4,5.6,8,11,16],default:U.aperture},focalLength:{min:0,max:200,default:U.focalLength}},it={clearDay:{name:`Clear Day`,sunAzimuth:180-Ue.azimuth,sunElevation:Ue.elevation,turbidity:2,exposure:0},clearMorning:{name:`Clear Morning`,sunAzimuth:90,sunElevation:15,turbidity:2,exposure:1.4},clearNoon:{name:`Clear Noon`,sunAzimuth:180,sunElevation:70,turbidity:2,exposure:0},hazyAfternoon:{name:`Hazy Afternoon`,sunAzimuth:225,sunElevation:35,turbidity:4.5,exposure:.4},goldenHour:{name:`Golden Hour`,sunAzimuth:270,sunElevation:6,turbidity:2.5,exposure:2.7},sunset:{name:`Sunset`,sunAzimuth:270,sunElevation:1,turbidity:3,exposure:4.2},blueHour:{name:`Blue Hour`,sunAzimuth:270,sunElevation:-4,turbidity:2,exposure:7},mountain:{name:`Mountain Air`,sunAzimuth:135,sunElevation:40,turbidity:1.3,altitude:3e3,exposure:0}},at={portrait:{name:`Portrait`,description:`Shallow depth of field, background blur`,dofBlur:.1,aperture:1.4,focalLength:135,apertureScale:1},landscape:{name:`Landscape`,description:`Maximum depth of field, everything in focus`,dofBlur:.001,aperture:16,focalLength:24,apertureScale:.5},macro:{name:`Macro`,description:`Very thin focus plane for close-ups`,dofBlur:.14,aperture:1.4,focalLength:100,apertureScale:2},product:{name:`Product`,description:`Sharp detail with subtle background separation`,dofBlur:.013,aperture:2.8,focalLength:85,apertureScale:.4},architectural:{name:`Architectural`,description:`Deep focus for rooms and buildings`,dofBlur:.001,aperture:11,focalLength:16,apertureScale:.5},cinematic:{name:`Cinematic`,description:`Dramatic depth separation with anamorphic bokeh`,dofBlur:.13,aperture:1.4,focalLength:200,apertureScale:1,anamorphicRatio:1.5}},G={MANUAL:`manual`,AUTO:`auto`},ot={SMOOTHING_FACTOR:.15,RESET_THRESHOLD:.05,FALLBACK_DISTANCE:10,SNAP_THRESHOLD:.5},st={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11,UV_AB_OFFSET:12,UV_C_OFFSET:16,MATERIAL_FLAGS_OFFSET:18,MESH_INDEX_OFFSET:19},ct=16777215;function lt(e){return!e||!((e.transmission||0)===0&&(!(e.transparent|0)||(e.opacity??1)>=1))?0:e.alphaMode|0?2:1}function ut(e,t){return(e&ct|(t?.side??0)<<24|lt(t)<<26)>>>0}function dt(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}var K={SLOTS_PER_MATERIAL:33,FLOATS_PER_MATERIAL:132,IOR:0,TRANSMISSION:1,THICKNESS:2,EMISSIVE_INTENSITY:3,ATTENUATION_COLOR:4,ATTENUATION_DISTANCE:7,OPACITY:8,SIDE:9,TRANSPARENT:10,ALPHA_TEST:11,ALPHA_MODE:12,DEPTH_WRITE:13,NORMAL_SCALE:14,COLOR:16,METALNESS:19,EMISSIVE:20,ROUGHNESS:23,ALBEDO_MAP_INDEX:24,NORMAL_MAP_INDEX:25,ROUGHNESS_MAP_INDEX:26,METALNESS_MAP_INDEX:27,EMISSIVE_MAP_INDEX:28,BUMP_MAP_INDEX:29,CLEARCOAT:30,CLEARCOAT_ROUGHNESS:31,DISPERSION:32,VISIBLE:33,SHEEN:34,SHEEN_ROUGHNESS:35,SHEEN_COLOR:36,SPECULAR_INTENSITY:40,SPECULAR_COLOR:41,IRIDESCENCE:44,IRIDESCENCE_IOR:45,IRIDESCENCE_THICKNESS_RANGE:46,BUMP_SCALE:48,DISPLACEMENT_SCALE:49,DISPLACEMENT_MAP_INDEX:50,ALBEDO_TRANSFORM:52,NORMAL_TRANSFORM:60,ROUGHNESS_TRANSFORM:68,METALNESS_TRANSFORM:76,EMISSIVE_TRANSFORM:84,BUMP_TRANSFORM:92,DISPLACEMENT_TRANSFORM:100,SUBSURFACE_COLOR:108,SUBSURFACE:111,SUBSURFACE_RADIUS:112,SUBSURFACE_RADIUS_SCALE:115,SUBSURFACE_ANISOTROPY:116,ANISOTROPY:117,ANISOTROPY_ROTATION:118,ANISOTROPY_MAP_INDEX:119,TRANSMISSION_MAP_INDEX:120,CLEARCOAT_MAP_INDEX:121,CLEARCOAT_ROUGHNESS_MAP_INDEX:122,SHEEN_COLOR_MAP_INDEX:123,SHEEN_ROUGHNESS_MAP_INDEX:124,IRIDESCENCE_MAP_INDEX:125,IRIDESCENCE_THICKNESS_MAP_INDEX:126,SPECULAR_INTENSITY_MAP_INDEX:127,SPECULAR_COLOR_MAP_INDEX:128,SLOT:{IOR_TRANSMISSION:0,ATTENUATION:1,OPACITY_ALPHA:2,ALPHA_MODE:3,COLOR_METALNESS:4,EMISSIVE_ROUGHNESS:5,MAP_INDICES_A:6,MAP_INDICES_B:7,DISPERSION_SHEEN:8,SHEEN_COLOR:9,SPECULAR:10,IRIDESCENCE:11,BUMP_DISPLACEMENT:12,ALBEDO_TRANSFORM_A:13,ALBEDO_TRANSFORM_B:14,NORMAL_TRANSFORM_A:15,NORMAL_TRANSFORM_B:16,ROUGHNESS_TRANSFORM_A:17,ROUGHNESS_TRANSFORM_B:18,METALNESS_TRANSFORM_A:19,METALNESS_TRANSFORM_B:20,EMISSIVE_TRANSFORM_A:21,EMISSIVE_TRANSFORM_B:22,BUMP_TRANSFORM_A:23,BUMP_TRANSFORM_B:24,DISPLACEMENT_TRANSFORM_A:25,DISPLACEMENT_TRANSFORM_B:26,SUBSURFACE_A:27,SUBSURFACE_B:28,SUBSURFACE_C:29,EXT_MAP_INDICES_A:30,EXT_MAP_INDICES_B:31,EXT_MAP_INDICES_C:32}},ft=e=>Number.isFinite(e)&&e>0?e:0,q=pt({color:[1,1,1],emissive:[0,0,0],emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:0,attenuationColor:[1,1,1],attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:[0,0,0],specularIntensity:1,specularColor:[1,1,1],clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:[1,1],bumpScale:1,displacementScale:1,transparent:0,alphaTest:0,alphaMode:0,side:0,depthWrite:1,subsurface:0,subsurfaceColor:[1,1,1],subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0});function pt(e){for(let t of Object.values(e))typeof t==`object`&&Object.freeze(t);return Object.freeze(e)}var mt=1073741824,ht=1073741824,gt=1073741823,_t={TRIANGLE_LEAF:1073741824,BLAS_POINTER_LEAF:1073741825,FRONTIER:1073741826},vt=1<<27;function yt(e){return new Uint32Array(e.buffer,e.byteOffset,e.length)}function bt(e,t){if(e>=1073741824)throw RangeError(`${t} is ${e.toLocaleString()}, at or past the BVH index limit of ${mt.toLocaleString()}. Node indices are stored as u32 bit patterns and the leaf tags occupy everything above that.`);return e}var xt={PIXELS_PER_MATERIAL:30,RGBA_COMPONENTS:4,VEC4_PER_TRIANGLE:8,VEC4_PER_BVH_NODE:4,FLOATS_PER_VEC4:4,MIN_TEXTURE_WIDTH:4,MAX_CONCURRENT_WORKERS:Math.min(typeof navigator<`u`&&navigator.hardwareConcurrency||4,6),BUFFER_POOL_SIZE:20,CANVAS_POOL_SIZE:12,CACHE_SIZE_LIMIT:50,MAX_TEXTURE_SIZE:8192,DEFAULT_MAX_TEXTURE_SIZE:4096,MAX_TEXTURES_LIMIT:4*256,MATERIAL_BUCKET_COUNT:4,BUCKET_LAYER_STRIDE:256},St=64;function Ct(e,t){let n=Math.ceil(Math.max(1,e)/St)*St;return Math.min(t,Math.max(xt.MIN_TEXTURE_WIDTH,n))}function wt(e){let t=0,n=0,r=0;for(let i of e)t=Math.max(t,i.width),n=Math.max(n,i.height),r+=i.count;return{units:e,width:t,height:n,count:r}}function Tt(e,t){return Ct(e.width,t)*e.height*e.count*4}function Et(e,t){return e.reduce((e,n)=>e+Tt(n,t),0)}function Dt(e,t,n){let r=e.slice();for(;r.length>t;){let e=null;for(let t=0;t<r.length;t++)for(let i=t+1;i<r.length;i++){let a=wt(r[t].units.concat(r[i].units)),o=Tt(a,n)-Tt(r[t],n)-Tt(r[i],n);(!e||o<e.delta)&&(e={i:t,j:i,delta:o,fused:a})}r=r.filter((t,n)=>n!==e.i&&n!==e.j).concat([e.fused])}return r}function Ot(e,t,n){let r=[];for(let e=t-1;e>=0;e--)r.push(Math.max(xt.MIN_TEXTURE_WIDTH,Math.round(n/2**e)));let i=r.map(()=>[]);for(let t of e){let e=2**Math.ceil(Math.log2(Math.max(t.width,t.height))),n=r.findIndex(t=>e<=t);n<0&&(n=r.length-1),i[n].push(t)}return i.filter(e=>e.length).map(wt)}function kt(e,t){let n=e;for(let e=0;e<8;e++){let e=!1;for(let r of n.flatMap(e=>e.units)){let i=n.findIndex(e=>e.units.includes(r));if(!(i<0))for(let a=0;a<n.length;a++){if(a===i)continue;let o=[];for(let e=0;e<n.length;e++)if(e===i){let t=n[e].units.filter(e=>e!==r);t.length&&o.push(wt(t))}else e===a?o.push(wt(n[e].units.concat([r]))):o.push(n[e]);if(Et(o,t)<Et(n,t)){n=o,e=!0;break}}}if(!e)break}return n}function At(e,t,n=xt.MATERIAL_BUCKET_COUNT){let r=new Map;for(let{width:n,height:i}of e){let e=Math.min(t,Math.max(1,n||1)),a=Math.min(t,Math.max(1,i||1)),o=`${e}x${a}`,s=r.get(o);s?s.count++:r.set(o,{width:e,height:a,count:1})}let i=[...r.values()],a=i.map(e=>wt([e]));if(a.length>n){let e=Ot(i,n,t),r=Dt(a,n,t);a=Et(e,t)<Et(r,t)?e:r,a=kt(a,t)}return a.map(e=>({width:Ct(e.width,t),height:e.height})).sort((e,t)=>e.width*e.height-t.width*t.height)}function jt(e,t,n){let r=Math.max(1,e||1),i=Math.max(1,t||1);for(let e=0;e<n.length;e++)if(n[e].width>=r&&n[e].height>=i)return e;return Math.max(0,n.length-1)}function Mt(e,t){return e*xt.BUCKET_LAYER_STRIDE+t}var Nt=[0,0,1,1,0,0,0,1],Pt={maxSamples:30,bounces:20,transmissiveBounces:24,maxSubsurfaceSteps:64,renderMode:1,enableAlphaShadows:!0,enableOIDN:!0,oidnQuality:`high`,interactionModeEnabled:!1,useAdaptiveSampling:!0,noiseThreshold:.02,adaptiveStopFraction:.94,usePixelFreeze:!0},Ft={maxSamples:U.maxSamples,bounces:U.bounces,renderMode:U.renderMode,enableAlphaShadows:U.enableAlphaShadows,transmissiveBounces:12,maxSubsurfaceSteps:U.maxSubsurfaceSteps,enableOIDN:!0,oidnQuality:`fast`,interactionModeEnabled:!0,useAdaptiveSampling:!0,noiseThreshold:.1,usePixelFreeze:!0};function It(e){return{maxSamples:e.maxSamples,maxBounces:e.bounces,transmissiveBounces:e.transmissiveBounces,maxSubsurfaceSteps:e.maxSubsurfaceSteps,enableAlphaShadows:e.enableAlphaShadows??!1,useAdaptiveSampling:e.useAdaptiveSampling??!1,noiseThreshold:e.noiseThreshold??U.noiseThreshold,adaptiveStopFraction:e.adaptiveStopFraction??U.adaptiveStopFraction,adaptiveMinSamples:e.adaptiveMinSamples??U.adaptiveMinSamples,usePixelFreeze:e.usePixelFreeze??!1,pixelFreezeThreshold:e.pixelFreezeThreshold??U.pixelFreezeThreshold,pixelFreezeStability:e.pixelFreezeStability??U.pixelFreezeStability,interactionModeEnabled:e.interactionModeEnabled??U.interactionModeEnabled}}var Lt={MAX_BUFFER_MEMORY:1024*1024*1024,MAX_TEXTURE_MEMORY:2048*1024*1024,CLEANUP_THRESHOLD:.8,CHUNK_SIZE_THRESHOLD:64*1024*1024,STREAM_BATCH_SIZE:4};function Rt(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function zt(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function Bt(){if($t!==null)return $t;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in qt?($t=qt[e],$t):($t=qt[Rt(Yt)]??qt[Jt],$t)}function Vt(){if(en!==null)return en;let e=globalThis.__RAYZEE_LOG_NS__??Rt(Xt);return en=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],en}function Ht(e,t){if(t<qt.debug)return!0;let n=Vt();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function Ut(e,t,n){if(e>Bt()||!Ht(t,e))return;let r=e===qt.error?console.error:e===qt.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,Zt,Qt,...n.slice(1)):r(`%c${i}`,Zt,...n)}function Wt(e){return{namespace:e,error:(...t)=>Ut(qt.error,e,t),warn:(...t)=>Ut(qt.warn,e,t),info:(...t)=>Ut(qt.info,e,t),debug:(...t)=>Ut(qt.debug,e,t),isEnabled:e=>tn.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){Ut(qt.info,e,[t]),r.forEach(t=>Ut(qt.debug,e,[t]));return}qt.info>Bt()||((Bt()>=qt.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,Zt,Qt),r.forEach(e=>console.log(e)),console.groupEnd())}}}function Gt(e,t,...n){nn.has(t)||(nn.add(t),e.warn(...n))}function Kt(){return tn.getLevel()}var qt,Jt,Yt,Xt,Zt,Qt,$t,en,J,tn,nn,rn=y((()=>{qt={silent:0,error:1,warn:2,info:3,debug:4},Jt=`info`,Yt=`rayzeeLogLevel`,Xt=`rayzeeLogNamespaces`,Zt=`color:#7c8494`,Qt=`color:inherit`,$t=null,en=null,J={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${J.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},tn={levels:qt,setLevel(e){return e in qt?(globalThis.__RAYZEE_LOG_LEVEL__=e,$t=qt[e],zt(Yt,e===Jt?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(qt).join(`, `)}`),this.getLevel())},getLevel(){let e=Bt();return Object.keys(qt).find(t=>qt[t]===e)},isEnabled(e){return(qt[e]??qt.debug)<=Bt()},only(...e){let t=e.flat().filter(Boolean);return en=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),zt(Xt,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return $t=null,en=null,this.getLevel()}},nn=new Set}));rn();var an=Wt(`gpu`);function on(e=r.FloatType,n=r.LinearFilter){let i=new t.StorageTexture(W,W);return i.type=e,i.format=r.RGBAFormat,i.minFilter=n,i.magFilter=n,i}var sn=()=>on(),cn=class{constructor(e,t){this.writeColor=null,this.writeNormalDepth=null,this.writeAlbedo=null,this.readTarget=null,this.currentTarget=0,this.renderWidth=0,this.renderHeight=0,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),e>0&&t>0&&this.create(e,t)}create(e,n){this.dispose(),this.renderWidth=e,this.renderHeight=n,this.writeColor=sn(),this.writeNormalDepth=sn(),this.writeAlbedo=sn(),this.readTarget=new t.RenderTarget(e,n,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1,count:3}),this.readTarget.textures[0].name=`gColor`,this.readTarget.textures[1].name=`gNormalDepth`,this.readTarget.textures[2].name=`gAlbedo`,an.debug(`storage texture pool ${J.px(e,n)} — 3 write StorageTextures + 1 MRT RenderTarget`)}ensureSize(e,t){return this.writeColor?this.renderWidth!==e||this.renderHeight!==t?(this.setSize(e,t),!0):!1:(this.create(e,t),!0)}getReadTextures(){return{color:this.readTarget.textures[0],normalDepth:this.readTarget.textures[1],albedo:this.readTarget.textures[2]}}getWriteTextures(){return{color:this.writeColor,normalDepth:this.writeNormalDepth,albedo:this.writeAlbedo}}copyToReadTargets(e,t=!0){this._srcRegion.max.set(this.renderWidth,this.renderHeight),e.copyTextureToTexture(this.writeColor,this.readTarget.textures[0],this._srcRegion),t&&(e.copyTextureToTexture(this.writeNormalDepth,this.readTarget.textures[1],this._srcRegion),e.copyTextureToTexture(this.writeAlbedo,this.readTarget.textures[2],this._srcRegion))}clear(e){if(!this.readTarget||!e)return;let t=e.getRenderTarget();e.setRenderTarget(this.readTarget),e.clear(!0,!1,!1),e.setRenderTarget(t)}swap(){this.currentTarget=1-this.currentTarget}setSize(e,t){if(this.renderWidth=e,this.renderHeight=t,this.readTarget){this.readTarget.setSize(e,t);for(let e of this.readTarget.textures)e.needsUpdate=!0}}dispose(){this.writeColor?.dispose(),this.writeNormalDepth?.dispose(),this.writeAlbedo?.dispose(),this.readTarget?.dispose(),this.writeColor=null,this.writeNormalDepth=null,this.writeAlbedo=null,this.readTarget=null}},ln={cameraViewMatrix:`ptCameraViewMatrix`,cameraProjectionMatrix:`ptCameraProjectionMatrix`},un=class{constructor(e=1920,t=1080){this._uniforms=new Map,this._booleans=new Set,this._arrayWarned=new Set,this._lightBuffers={},this._initUniforms(e,t),this._nameAll()}get(e){return this._uniforms.get(e)}set(e,t){let n=this._uniforms.get(e);if(!n){console.warn(`UniformManager: Unknown uniform "${e}"`);return}Array.isArray(t)&&t.length===1&&(this._booleans.has(e)||typeof n.value==`number`)&&(this._arrayWarned.has(e)||(this._arrayWarned.add(e),console.warn(`UniformManager: "${e}" was set to [${t[0]}] but expects a scalar — unwrapping. Fix the caller; a slider handler is probably forwarding its array value unchanged.`)),t=t[0]),this._booleans.has(e)?n.value=+!!t:typeof t==`object`&&t&&typeof n.value?.copy==`function`?n.value.copy(t):n.value=t}has(e){return this._uniforms.has(e)}keys(){return this._uniforms.keys()}getLightBufferNodes(){return this._lightBuffers}updateMany(e){let t=!1;for(let[n,r]of Object.entries(e)){let e=this._uniforms.get(n);e&&e.value!==r&&(e.value=r,t=!0)}return t}_initUniforms(e,t){let i=(e,t,r)=>{let i=(0,n.uniform)(t,r);return this._uniforms.set(e,i),i},a=(e,t)=>(this._booleans.add(e),i(e,+!!t,`int`));i(`frame`,0,`uint`),i(`seedFrame`,0,`uint`),i(`maxBounces`,U.bounces,`int`),i(`maxSamples`,U.maxSamples,`int`),i(`transmissiveBounces`,U.transmissiveBounces,`int`),i(`maxSubsurfaceSteps`,U.maxSubsurfaceSteps,`int`),i(`maxTransparentBounces`,U.maxTransparentBounces,`int`),i(`visMode`,U.debugMode,`int`),i(`debugVisScale`,U.debugVisScale,`float`),a(`useAdaptiveSampling`,U.useAdaptiveSampling),i(`noiseThreshold`,U.noiseThreshold,`float`),i(`adaptiveMinSamples`,U.adaptiveMinSamples,`int`),i(`adaptiveStopFraction`,U.adaptiveStopFraction,`float`),a(`usePixelFreeze`,U.usePixelFreeze),i(`pixelFreezeThreshold`,U.pixelFreezeThreshold,`float`),i(`pixelFreezeStability`,U.pixelFreezeStability,`int`),a(`convergenceOverlay`,U.convergenceOverlay),a(`enableAccumulation`,!0),i(`accumulationAlpha`,0,`float`),a(`cameraIsMoving`,!1),a(`hasPreviousAccumulated`,!1),i(`auxAccumulationAlpha`,1,`float`),a(`hasPreviousAux`,!1),i(`environmentIntensity`,U.environmentIntensity,`float`),i(`backgroundIntensity`,U.backgroundIntensity,`float`),i(`backgroundColor`,new r.Color(0,0,0),`color`),i(`backgroundBlurriness`,U.backgroundBlurriness,`float`),i(`backgroundBlurSamples`,U.backgroundBlurSamples,`int`),a(`showBackground`,U.showBackground),a(`transparentBackground`,U.transparentBackground),a(`enableEnvironment`,U.enableEnvironment),i(`environmentMatrix`,new r.Matrix4,`mat4`),i(`envTotalSum`,0,`float`),i(`envCompensationDelta`,0,`float`),i(`envResolution`,new r.Vector2(1,1),`vec2`),a(`groundProjectionEnabled`,U.groundProjectionEnabled),i(`groundProjectionRadius`,U.groundProjectionRadius,`float`),i(`groundProjectionHeight`,U.groundProjectionHeight,`float`),i(`groundProjectionLevel`,U.groundProjectionLevel,`float`),a(`enableGroundCatcher`,U.enableGroundCatcher),i(`groundCatcherHeight`,U.groundCatcherHeight,`float`),i(`sunDirection`,new r.Vector3(0,1,0),`vec3`),i(`sunRadiance`,new r.Vector3,`vec3`),i(`sunParams`,new r.Vector4(1,0,0,0),`vec4`),a(`hasSun`,!1),i(`globalIlluminationIntensity`,U.globalIlluminationIntensity,`float`),i(`exposure`,U.exposure,`float`),i(`numDirectionalLights`,0,`int`),i(`numAreaLights`,0,`int`),i(`numPointLights`,0,`int`),i(`numSpotLights`,0,`int`),this._lightBuffers={directional:(0,n.uniformArray)(new Float32Array(192),`float`),area:(0,n.uniformArray)(new Float32Array(256),`float`),point:(0,n.uniformArray)(new Float32Array(144),`float`),spot:(0,n.uniformArray)(new Float32Array(320),`float`)},i(`cameraWorldMatrix`,new r.Matrix4,`mat4`),i(`cameraProjectionMatrixInverse`,new r.Matrix4,`mat4`),i(`cameraViewMatrix`,new r.Matrix4,`mat4`),i(`cameraProjectionMatrix`,new r.Matrix4,`mat4`);let o=([e,t])=>new r.Vector2(e,t).multiplyScalar(r.MathUtils.DEG2RAD);i(`cameraProjection`,Ke[U.cameraProjection],`int`),i(`panoLonRange`,o(U.panoramaLonRange),`vec2`),i(`panoLatRange`,o(U.panoramaLatRange),`vec2`),a(`panoLevelHorizon`,U.panoramaLevelHorizon),a(`enableDOF`,U.enableDOF),i(`focusDistance`,U.focusDistance,`float`),i(`focalLength`,U.focalLength,`float`),i(`aperture`,U.aperture,`float`),i(`apertureScale`,1,`float`),i(`anamorphicRatio`,U.anamorphicRatio??1,`float`),i(`unitsPerMetre`,U.unitsPerMetre,`float`),i(`dofMode`,+(U.dofMode===`look`),`int`),i(`dofBlur`,U.dofBlur,`float`),this._uniforms.set(`samplingTechnique`,N),N.value=U.samplingTechnique,i(`fireflyThreshold`,U.fireflyThreshold,`float`),i(`shadowTerminatorOffset`,U.shadowTerminatorOffset,`float`),a(`enableEmissiveTriangleSampling`,U.enableEmissiveTriangleSampling),i(`emissiveBoost`,U.emissiveBoost,`float`),i(`emissiveTriangleCount`,0,`int`),i(`emissiveTotalPower`,0,`float`),i(`lightBVHNodeCount`,0,`int`),i(`emissiveVec4Offset`,0,`int`),i(`reverseMapVec4Offset`,0,`int`),i(`renderMode`,U.renderMode,`int`),a(`enableAlphaShadows`,U.enableAlphaShadows),i(`resolution`,new r.Vector2(e,t),`vec2`)}_nameAll(){for(let[e,t]of this._uniforms)t.name=ln[e]||e}dispose(){this._disposed||(this._disposed=!0,this._uniforms.clear(),this._booleans.clear(),this._arrayWarned.clear(),this._lightBuffers={})}},dn=[1,0,0,0,1,0,0,0],fn=[[`mapMatrix`,K.ALBEDO_TRANSFORM],[`normalMapMatrices`,K.NORMAL_TRANSFORM],[`roughnessMapMatrices`,K.ROUGHNESS_TRANSFORM],[`metalnessMapMatrices`,K.METALNESS_TRANSFORM],[`emissiveMapMatrices`,K.EMISSIVE_TRANSFORM],[`bumpMapMatrices`,K.BUMP_TRANSFORM],[`displacementMapMatrices`,K.DISPLACEMENT_TRANSFORM]];Object.freeze([K.VISIBLE,K.SHEEN_COLOR+3,K.DISPLACEMENT_MAP_INDEX+1,K.SPECULAR_COLOR_MAP_INDEX+1,K.SPECULAR_COLOR_MAP_INDEX+2,K.SPECULAR_COLOR_MAP_INDEX+3]);var pn=Object.freeze(new Set([`metalness`,`roughness`,`transmission`,`opacity`,`clearcoat`,`clearcoatRoughness`,`sheen`,`sheenRoughness`,`specularIntensity`,`iridescence`,`subsurface`,`anisotropy`])),mn=e=>Math.min(Math.max(e,0),1);function hn(e,t){let n=typeof e==`boolean`?+e:e;return Number.isFinite(n)?n:t}function gn(e){return Number.isInteger(e)?e:-1}function _n(e,t,n,r){let i=n?.r??n?.[0]??n?.x,a=n?.g??n?.[1]??n?.y,o=n?.b??n?.[2]??n?.z;e[t]=hn(i,r[0]),e[t+1]=hn(a,r[1]),e[t+2]=hn(o,r[2])}function vn(e,t,n){let r=(n,r,i)=>{e[t+n]=hn(r,i)},i=(n,r,i)=>{e[t+n]=mn(hn(r,i))};r(K.IOR,n.ior,q.ior),i(K.TRANSMISSION,n.transmission,q.transmission),r(K.THICKNESS,n.thickness,q.thickness),r(K.EMISSIVE_INTENSITY,n.emissiveIntensity,q.emissiveIntensity),_n(e,t+K.ATTENUATION_COLOR,n.attenuationColor,q.attenuationColor),e[t+K.ATTENUATION_DISTANCE]=ft(n.attenuationDistance??q.attenuationDistance),i(K.OPACITY,n.opacity,q.opacity),r(K.SIDE,n.side,q.side),r(K.TRANSPARENT,n.transparent,q.transparent),r(K.ALPHA_TEST,n.alphaTest,q.alphaTest),r(K.ALPHA_MODE,n.alphaMode,q.alphaMode),r(K.DEPTH_WRITE,n.depthWrite,q.depthWrite);let a=n.normalScale,o=typeof a==`number`?a:void 0;r(K.NORMAL_SCALE,o??a?.x??a?.[0],q.normalScale[0]),r(K.NORMAL_SCALE+1,o??a?.y??a?.[1],q.normalScale[1]),_n(e,t+K.COLOR,n.color,q.color),i(K.METALNESS,n.metalness,q.metalness),_n(e,t+K.EMISSIVE,n.emissive,q.emissive),i(K.ROUGHNESS,n.roughness,q.roughness),e[t+K.ALBEDO_MAP_INDEX]=gn(n.map),e[t+K.NORMAL_MAP_INDEX]=gn(n.normalMap),e[t+K.ROUGHNESS_MAP_INDEX]=gn(n.roughnessMap),e[t+K.METALNESS_MAP_INDEX]=gn(n.metalnessMap),e[t+K.EMISSIVE_MAP_INDEX]=gn(n.emissiveMap),e[t+K.BUMP_MAP_INDEX]=gn(n.bumpMap),i(K.CLEARCOAT,n.clearcoat,q.clearcoat),i(K.CLEARCOAT_ROUGHNESS,n.clearcoatRoughness,q.clearcoatRoughness),r(K.DISPERSION,n.dispersion,q.dispersion),i(K.SHEEN,n.sheen,q.sheen),i(K.SHEEN_ROUGHNESS,n.sheenRoughness,q.sheenRoughness),_n(e,t+K.SHEEN_COLOR,n.sheenColor,q.sheenColor),i(K.SPECULAR_INTENSITY,n.specularIntensity,q.specularIntensity),_n(e,t+K.SPECULAR_COLOR,n.specularColor,q.specularColor),i(K.IRIDESCENCE,n.iridescence,q.iridescence),r(K.IRIDESCENCE_IOR,n.iridescenceIOR,q.iridescenceIOR),r(K.IRIDESCENCE_THICKNESS_RANGE,n.iridescenceThicknessRange?.[0],q.iridescenceThicknessRange[0]),r(K.IRIDESCENCE_THICKNESS_RANGE+1,n.iridescenceThicknessRange?.[1],q.iridescenceThicknessRange[1]),r(K.BUMP_SCALE,n.bumpScale,q.bumpScale),r(K.DISPLACEMENT_SCALE,n.displacementScale,q.displacementScale),e[t+K.DISPLACEMENT_MAP_INDEX]=gn(n.displacementMap);for(let[r,i]of fn){let a=n[r];for(let n=0;n<8;n++)e[t+i+n]=hn(a?.[n],dn[n])}_n(e,t+K.SUBSURFACE_COLOR,n.subsurfaceColor,q.subsurfaceColor),i(K.SUBSURFACE,n.subsurface,q.subsurface),_n(e,t+K.SUBSURFACE_RADIUS,n.subsurfaceRadius,q.subsurfaceRadius),r(K.SUBSURFACE_RADIUS_SCALE,n.subsurfaceRadiusScale,q.subsurfaceRadiusScale),r(K.SUBSURFACE_ANISOTROPY,n.subsurfaceAnisotropy,q.subsurfaceAnisotropy),i(K.ANISOTROPY,n.anisotropy,q.anisotropy),r(K.ANISOTROPY_ROTATION,n.anisotropyRotation,q.anisotropyRotation),e[t+K.ANISOTROPY_MAP_INDEX]=gn(n.anisotropyMap),e[t+K.TRANSMISSION_MAP_INDEX]=gn(n.transmissionMap),e[t+K.CLEARCOAT_MAP_INDEX]=gn(n.clearcoatMap),e[t+K.CLEARCOAT_ROUGHNESS_MAP_INDEX]=gn(n.clearcoatRoughnessMap),e[t+K.SHEEN_COLOR_MAP_INDEX]=gn(n.sheenColorMap),e[t+K.SHEEN_ROUGHNESS_MAP_INDEX]=gn(n.sheenRoughnessMap),e[t+K.IRIDESCENCE_MAP_INDEX]=gn(n.iridescenceMap),e[t+K.IRIDESCENCE_THICKNESS_MAP_INDEX]=gn(n.iridescenceThicknessMap),e[t+K.SPECULAR_INTENSITY_MAP_INDEX]=gn(n.specularIntensityMap),e[t+K.SPECULAR_COLOR_MAP_INDEX]=gn(n.specularColorMap),e[t+K.VISIBLE]=1,e[t+K.SHEEN_COLOR+3]=1,e[t+K.DISPLACEMENT_MAP_INDEX+1]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+1]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+2]=0,e[t+K.SPECULAR_COLOR_MAP_INDEX+3]=0}var Y=Object.freeze({ADAPTER_SOFTWARE:`adapter.software`,ASSET_UNREACHABLE:`asset.unreachable`,ASSET_AMBIGUOUS_ENTRY:`asset.ambiguous_entry`,ASSET_ARCHIVE_TOO_LARGE:`asset.archive_too_large`,ASSET_ENTRY_TOO_LARGE:`asset.entry_too_large`,TEXTURE_BUILD_FAILED:`texture.build_failed`,TEXTURE_PROCESSING_FALLBACK:`texture.processing_fallback`,TEXTURE_LIMIT_EXCEEDED:`texture.limit_exceeded`,ENVIRONMENT_LOAD_FAILED:`environment.load_failed`,SETTING_UNKNOWN_KEY:`setting.unknown_key`,RENDER_SIZE_DECLINED:`render.size_declined`,STAGE_RENDER_FAILED:`stage.render_failed`,RENDER_RESERVE_CAPPED:`render.reserve_capped`,SCENE_MEMORY_BUDGET:`scene.memory_budget`,EMISSIVE_INSTANCES_COLLAPSED:`emissive.instances_collapsed`,REFIT_SHARED_GEOMETRY:`refit.shared_geometry`,VIEW_TRANSFORM_DISPLAY_MISMATCH:`viewTransform.display_mismatch`,VIEW_TRANSFORM_BAKE_FAILED:`viewTransform.bake_failed`,COLOR_CONFIG_LOAD_FAILED:`color.config_load_failed`,STORAGE_UNAVAILABLE:`storage.unavailable`,STORAGE_QUOTA_EXCEEDED:`storage.quota_exceeded`,STORAGE_WRITE_FAILED:`storage.write_failed`,STORAGE_READ_FAILED:`storage.read_failed`,STORAGE_ENTRY_CORRUPT:`storage.entry_corrupt`,STORAGE_CACHE_MISMATCH:`storage.cache_mismatch`}),yn=Object.freeze({ERROR:`error`,WARNING:`warning`}),bn=class extends Error{constructor(e){super(`[${e.code}] ${e.message}`),this.name=`EngineIssueError`,this.code=e.code,this.detail=e.detail}},xn=class{constructor({strict:e=!1,onIssue:t=null}={}){this.strict=e===!0,this._onIssue=t,this._entries=[]}record(e,t,n={},r=yn.ERROR){let i=Object.freeze({code:e,message:t,detail:n,severity:r,at:Date.now()});if(this._entries.push(i),this._onIssue?.(i),this.strict&&r===yn.ERROR)throw new bn(i);return i}warn(e,t,n){return this.record(e,t,n,yn.WARNING)}get list(){return this._entries.slice()}get errors(){return this._entries.filter(e=>e.severity===yn.ERROR)}clear(){this._entries.length=0}detach(){this._onIssue=null,this.strict=!1}},Sn=64*1024*1024,Cn=typeof SharedArrayBuffer<`u`,wn=null;function Tn(e){wn=e}function En(e,t,n){let r=n?new e(new SharedArrayBuffer(t*e.BYTES_PER_ELEMENT)):new e(t);return wn&&r.byteLength>0&&wn(r.byteLength,n),r}var Dn=class e{constructor(e,t,n,r=Sn,i=!1){let a=t*n.BYTES_PER_ELEMENT,o=Math.max(1,Math.floor(r/a));this.recordCount=e,this.lanesPerRecord=t,this.LaneType=n,this.recordsPerChunk=e<=o?Math.max(e,1):o,this.shared=i,this.chunks=[];let s=e;for(;s>0;){let e=Math.min(s,this.recordsPerChunk);this.chunks.push(En(n,e*t,i)),s-=e}this.chunks.length===0&&this.chunks.push(En(n,0,i))}static adopt(t,n,r,i){let a=Object.create(e.prototype);return a.recordCount=n,a.lanesPerRecord=r,a.LaneType=t[0]?.constructor??null,a.recordsPerChunk=i,a.chunks=t,a.shared=typeof SharedArrayBuffer<`u`&&t[0]?.buffer instanceof SharedArrayBuffer,a}static lazy(t,n,r,i=Sn,a=!1){let o=Math.max(1,Math.floor(i/(n*r.BYTES_PER_ELEMENT))),s=Object.create(e.prototype);return s.recordCount=t,s.lanesPerRecord=n,s.LaneType=r,s.recordsPerChunk=t<=o?Math.max(t,1):o,s.shared=a,s.chunks=Array(Math.max(1,Math.ceil(t/s.recordsPerChunk))),s._views=[],s}_materialize(e){if(this._owner)return this._owner._materialize(e),this.chunks[e];let t=e*this.recordsPerChunk,n=Math.min(this.recordsPerChunk,this.recordCount-t)*this.lanesPerRecord,r=this.chunks[e]=En(this.LaneType,n,this.shared);for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);return r}materializeAll(){for(let e=0;e<this.chunks.length;e++)!this.chunks[e]&&!this._spilled?.has(e)&&this._materialize(e);return this}get chunkCount(){return this.chunks.length}get single(){return this.chunks.length===1?this.chunks[0]:null}get byteLength(){let e=0;for(let t of this.chunks)t&&(e+=t.byteLength);return e}chunkFor(e){let t=e/this.recordsPerChunk|0,n=this.chunks[t];if(n)return n;if(this._spilled?.has(t))throw Error(`ChunkedRecords: chunk ${t} is on disk — await ensureResident() before touching record ${e}`);return this._materialize(t)}async spill(e,{keep:t=()=>!1}={}){if(this._owner)throw Error(`ChunkedRecords: spill the storage, not a view of it`);this._store=e,this._spilled??=new Set;let n=0;for(let r=0;r<this.chunks.length;r++){let i=this.chunks[r];if(!(!i||t(r))){await e.write(r,i),this.chunks[r]=null;for(let e of this._liveViews())e.chunks[r]=null;this._spilled.add(r),n+=i.byteLength}}return n}async spillChunk(e,t){let n=this.chunks[e];if(!n)return 0;this._store=t,this._spilled??=new Set,await t.write(e,n),this.chunks[e]=null;for(let t of this._liveViews())t.chunks[e]=null;return this._spilled.add(e),n.byteLength}async ensureResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++){if(!this._spilled.has(e))continue;let t=Math.min(this.recordsPerChunk,this.recordCount-e*this.recordsPerChunk)*this.lanesPerRecord,n=await this._store.read(e,t*this.LaneType.BYTES_PER_ELEMENT),r=En(this.LaneType,t,this.shared);new Uint8Array(r.buffer,r.byteOffset,r.byteLength).set(new Uint8Array(n)),this.chunks[e]=r;for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);this._spilled.delete(e)}}_liveViews(){return this._weakViews&&=this._weakViews.filter(e=>e.deref()),[...this._views??[],...(this._weakViews??[]).map(e=>e.deref())]}isResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return!0;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++)if(this._spilled.has(e))return!1;return!0}get spilledChunks(){return this._spilled?.size??0}baseOf(e){return e%this.recordsPerChunk*this.lanesPerRecord}isContiguous(e,t){return t<=0?!0:(e/this.recordsPerChunk|0)==((e+t-1)/this.recordsPerChunk|0)}slice(e,t){let n=this.baseOf(e),r=t*this.lanesPerRecord;if(this.isContiguous(e,t))return this.chunkFor(e).subarray(n,n+r);let i=new this.LaneType(r);return this.readRecords(e,t,i),i}readRecords(e,t,n){let r=0;for(;r<t;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,t-r);n.set(a.subarray(o,o+c*this.lanesPerRecord),r*this.lanesPerRecord),r+=c}return n}setRecords(e,t){let n=t.length/this.lanesPerRecord,r=0;for(;r<n;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,n-r);a.set(t.subarray(r*this.lanesPerRecord,(r+c)*this.lanesPerRecord),o),r+=c}}copyOf(e,t){return this.readRecords(e,t,new this.LaneType(t*this.lanesPerRecord))}trimTo(t){let n=Math.max(1,Math.ceil(t/this.recordsPerChunk)),r=this.chunks.slice(0,n),i=(t-(n-1)*this.recordsPerChunk)*this.lanesPerRecord,a=r[n-1];return a.length>i&&(r[n-1]=a.subarray(0,Math.max(0,i))),e.adopt(r,t,this.lanesPerRecord,this.recordsPerChunk)}grow(e){if(e<=this.recordCount)return;let t=this.chunks.length-1,n=(e,t)=>Math.min(this.recordsPerChunk,t-e*this.recordsPerChunk)*this.lanesPerRecord,r=this.chunks[t];this.recordCount=e;for(let t of this._liveViews())t.recordCount=e;if(this.chunks.length*this.recordsPerChunk<e){this.chunks.length=Math.ceil(e/this.recordsPerChunk);for(let e of this._liveViews())e.chunks.length=this.chunks.length}if(r&&r.length<n(t,e)){let i=En(this.LaneType,n(t,e),this.shared);i.set(r),this.chunks[t]=i;for(let e of this._liveViews())e.chunks[t]=new e.LaneType(i.buffer,i.byteOffset,i.byteLength/e.LaneType.BYTES_PER_ELEMENT)}else if(!r&&this._spilled?.has(t))throw Error(`ChunkedRecords: cannot grow past chunk ${t}, which is on disk`)}release(e,t){let n=this.recordsPerChunk,r=Math.ceil(e/n),i=Math.floor((e+t)/n),a=0;for(let e=r;e<i;e++){let t=this.chunks[e];if(t){a+=t.byteLength,this.chunks[e]=void 0;for(let t of this._liveViews())t.chunks[e]=void 0}}return a}trimInPlace(e){let t=Math.max(1,Math.ceil(e/this.recordsPerChunk)),n=Math.max(0,(e-(t-1)*this.recordsPerChunk)*this.lanesPerRecord),r=[this,...this._liveViews()];for(let i of r){i.chunks.length=t;let r=i.chunks[t-1];r&&r.length>n&&(i.chunks[t-1]=r.subarray(0,n)),i.recordCount=e}if(this._spilled)for(let e of this._spilled)e>=t&&this._spilled.delete(e);return this}viewAs(t){let n=e=>new t(e.buffer,e.byteOffset,e.byteLength/t.BYTES_PER_ELEMENT),r=e.adopt(this.chunks.map(e=>e?n(e):void 0),this.recordCount,this.lanesPerRecord,this.recordsPerChunk);return r.LaneType=t,r._owner=this,this._views?this._views.push(r):(this._weakViews??=[]).push(new WeakRef(r)),r._spilled=this._spilled??=new Set,r}},On=new Map;function kn(e,t){return e.exclusive||t===`exclusive`&&e.shared>0?!1:(t===`exclusive`?e.exclusive=!0:e.shared++,!0)}function An(e,t,n){let r=On.get(e);r||(r={shared:0,exclusive:!1,queue:[]},On.set(e,r));let i=jn(()=>{for(t===`exclusive`?r.exclusive=!1:r.shared--;r.queue.length&&kn(r,r.queue[0].mode);)r.queue.shift().grant();!r.exclusive&&r.shared===0&&r.queue.length===0&&On.delete(e)});return r.queue.length===0&&kn(r,t)?Promise.resolve(i):n?(!r.exclusive&&r.shared===0&&r.queue.length===0&&On.delete(e),Promise.resolve(null)):new Promise(e=>r.queue.push({mode:t,grant:()=>e(i)}))}function jn(e){let t=!1;return()=>{t||(t=!0,e())}}var Mn=()=>typeof navigator<`u`&&navigator.locks?.request?navigator.locks:null;function Nn(e,{mode:t=`exclusive`,ifAvailable:n=!1}={}){let r=Mn();return r?new Promise((i,a)=>{r.request(e,{mode:t,ifAvailable:n},e=>{if(!e){i(null);return}return new Promise(e=>i(jn(e)))}).catch(a)}):An(e,t,n)}async function Pn(){let e=Mn();if(!e)return new Set(On.keys());let{held:t=[]}=await e.query();return new Set(t.map(e=>e.name))}var Fn=new TextEncoder,In=1<<20,Ln=1<<20,Rn=65536,zn=14;function Bn(e){let t=``;for(let n of e)t+=n.toString(16).padStart(2,`0`);return t}async function Vn(e){let t=typeof e==`string`?Fn.encode(e):e;return Bn(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}async function Hn(e){return(await Vn(e)).slice(0,32)}async function Un(e){if(e.size<=In+Ln+zn*Rn)return Vn(new Uint8Array(await e.arrayBuffer()));let t=[e.slice(0,In)],n=e.size-In-Ln-Rn;for(let r=0;r<zn;r++){let i=In+Math.floor(n*(r+.5)/zn);t.push(e.slice(i,i+Rn))}return t.push(e.slice(e.size-Ln)),Vn(new Uint8Array(await new Blob(t).arrayBuffer()))}async function Wn(e){return{name:e.name??``,size:e.size,lastModified:e.lastModified??0,sample:await Un(e)}}function Gn(e){return`file:${e.name}|${e.size}|${e.lastModified}|${e.sample}`}function Kn(e,t){return!!e&&!!t&&e.size===t.size&&e.sample===t.sample&&e.name===t.name}var qn=class{constructor(){this._handlers=new Map}addEventListener(e,t){this._handlers.has(e)||this._handlers.set(e,new Set),this._handlers.get(e).add(t)}removeEventListener(e,t){this._handlers.get(e)?.delete(t)}dispatchEvent(e){for(let t of[...this._handlers.get(e.type)??[]])t.call(this,e)}},Jn=class{constructor(e){this._root=e,this._writers=new Map,this._nextId=1}async _dir(e,t){let n=await this._root;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n}async openWriter({path:e,name:t,truncate:n=!0,length:r}){let i=await(await(await this._dir(e,!0)).getFileHandle(t,{create:!0})).createSyncAccessHandle();n?i.truncate(0):r!==void 0&&i.getSize()>r&&i.truncate(r);let a=this._nextId++;return this._writers.set(a,{handle:i,end:i.getSize()}),{id:a}}write({id:e,buffer:t,byteOffset:n=0,byteLength:r,at:i}){let a=this._writers.get(e);if(!a)throw Error(`storage: writer ${e} is not open`);let o=new Uint8Array(t,n,r??t.byteLength-n),s=i??a.end,c=0;for(;c<o.length;){let e=a.handle.write(o.subarray(c),{at:s+c});if(e<=0)throw Error(`storage: write made no progress`);c+=e}return a.end=Math.max(a.end,s+o.length),{bytes:o.length}}closeWriter({id:e,abort:t=!1}){let n=this._writers.get(e);if(!n)return{size:0};this._writers.delete(e);try{return t||n.handle.flush(),{size:n.handle.getSize()}}finally{n.handle.close()}}async writeFile({path:e,name:t,buffer:n,byteOffset:r=0,byteLength:i}){let{id:a}=await this.openWriter({path:e,name:t});try{return this.write({id:a,buffer:n,byteOffset:r,byteLength:i}),this.closeWriter({id:a})}catch(e){throw this.closeWriter({id:a,abort:!0}),e}}async readRange({path:e,name:t,offset:n=0,length:r}){let i=await(await this._dir(e,!1)).getFileHandle(t),a=null;try{a=await i.createSyncAccessHandle()}catch(e){if(e.name!==`NoModificationAllowedError`)throw e}if(!a){let e=await i.getFile(),t=r===void 0?e.size:n+r;return{buffer:await e.slice(n,t).arrayBuffer()}}try{let e=a.getSize(),t=Math.max(0,Math.min(r??e-n,e-n)),i=new ArrayBuffer(t);return a.read(i,{at:n}),{buffer:i}}finally{a.close()}}dispose(){for(let e of[...this._writers.keys()])this.closeWriter({id:e,abort:!0})}},Yn=class{constructor(e){this._ops=new Jn(e)}async call(e,t){return this._ops[e](t)}dispose(){this._ops.dispose()}},Xn=Object.freeze({CACHE:`cache`,USER:`user`,SCRATCH:`scratch`}),Zn=Object.freeze({DOWNLOADS:`downloads`,ARCHIVES:`archives`,SCENES:`scenes`,CDF:`cdf`,SPILL:`spill`}),Qn=`meta.json`,$n=1,er=36e5,tr=.3,nr=100*1024**3,rr=64*1024**2,ir=8*1024**2,ar=4,or=new TextEncoder;function sr(e,{copy:t,transfer:n}){if(typeof e==`string`&&(e=or.encode(e)),e instanceof ArrayBuffer){if(!t||n)return{args:{buffer:e},list:[e]};let r=e.slice(0);return{args:{buffer:r},list:[r]}}if(!ArrayBuffer.isView(e))throw TypeError(`storage: write expects an ArrayBuffer, a typed array, a Blob or a string`);let{buffer:r,byteOffset:i,byteLength:a}=e,o=typeof SharedArrayBuffer<`u`&&r instanceof SharedArrayBuffer;if(!t)return{args:{buffer:r,byteOffset:i,byteLength:a},list:[]};if(o){let e=new Uint8Array(a);return e.set(new Uint8Array(r,i,a)),{args:{buffer:e.buffer},list:[e.buffer]}}if(n&&i===0&&a===r.byteLength)return{args:{buffer:r},list:[r]};let s=r.slice(i,i+a);return{args:{buffer:s},list:[s]}}async function cr(e,t){try{let n=await(await e.getFileHandle(t)).getFile();return JSON.parse(await n.text())}catch{return null}}async function*lr(e){for await(let[t,n]of e.entries())n.kind===`directory`&&(yield[t,n])}var ur=class{constructor(e,t,n,r,i){this.area=e,this.id=t,this.key=n.key,this.meta=n,this._dir=r,this._release=i}get bytes(){return this.meta.bytes}get extra(){return this.meta.extra??{}}async file(e){try{return await(await this._dir.getFileHandle(e)).getFile()}catch(t){return this.area.manager._issue(Y.STORAGE_READ_FAILED,`could not read ${this.area.name}/${this.id}/${e}`,{error:t.message}),null}}async json(e){let t=await this.file(e);return t?JSON.parse(await t.text()):null}release(){this._release?.(),this._release=null}},dr=class{constructor(e,t,n,r,i,{sizes:a={},append:o=!1}={}){this.area=e,this.id=t,this.key=n,this._info=r,this._release=i,this._writers=new Map,this._sizes={...a},this._append=o,this._done=!1}get _transport(){return this.area.manager._transport}get _path(){return[this.area.name,this.id]}async _writer(e){let t=this._writers.get(e);if(!t){let n=this._append&&e in this._sizes,r=n&&(this._info.growable??[]).includes(e)?this._sizes[e]:void 0;t=this._transport.call(`openWriter`,{path:this._path,name:e,truncate:!n,length:r}),this._writers.set(e,t)}return(await t).id}async write(e,t,{at:n,transfer:r=!1}={}){this._assertOpen();let{args:i,list:a}=(typeof Blob<`u`&&t instanceof Blob?null:sr(t,{copy:!0,transfer:r}))??sr(await t.arrayBuffer(),{copy:!0,transfer:!0}),o=await this._writer(e);return this._transport.call(`write`,{id:o,at:n,...i},a)}async writeFile(e,t){this._assertOpen(),typeof Blob<`u`&&t instanceof Blob&&(t=await t.arrayBuffer());let{args:n,list:r}=sr(t,{copy:!0,transfer:!0}),{size:i}=await this._transport.call(`writeFile`,{path:this._path,name:e,...n},r);return this._sizes[e]=i,i}writeJSON(e,t){return this.writeFile(e,JSON.stringify(t))}async writeStream(e,t,{onProgress:n=null,signal:r=null,batchBytes:i=ir}={}){let a=t.getReader(),o=[],s=new Uint8Array(i),c=0,l=0,u=async()=>{if(c===0)return;let t=c===i?s:s.slice(0,c);s=new Uint8Array(i),c=0,o.push(this.write(e,t,{transfer:!0})),o.length>=ar&&await o.shift()};try{for(;;){if(r?.aborted)throw r.reason??new DOMException(`aborted`,`AbortError`);let{done:e,value:t}=await a.read();if(e)break;let o=0;for(;o<t.length;){let e=Math.min(t.length-o,i-c);s.set(t.subarray(o,o+e),c),c+=e,o+=e,l+=e,c===i&&await u()}n?.(l)}return await u(),await Promise.all(o),l}catch(e){throw a.cancel().catch(()=>{}),await Promise.allSettled(o),e}}async commit(e={}){this._assertOpen(),this._done=!0;try{for(let[e,t]of this._writers){let{size:n}=await this._transport.call(`closeWriter`,{id:(await t).id});this._sizes[e]=n}this._writers.clear();let t=Date.now(),n={v:$n,key:this.key,label:this._info.label??``,kind:this.area.kind,files:{...this._sizes},bytes:Object.values(this._sizes).reduce((e,t)=>e+t,0),createdAt:this._info.createdAt??t,lastUsed:t,pinned:this._info.pinned===!0,extra:{...this._info.extra,...e}},r=this._info.growable??[];r.length&&(n.growable=r);let{args:i,list:a}=sr(JSON.stringify(n),{copy:!1});return await this._transport.call(`writeFile`,{path:this._path,name:Qn,...i},a),this.area.manager._changed(this.area.name),n}catch(e){throw await this._discard(),this.area.manager._writeFailed(this.area.name,e),e}finally{this._release?.(),this._release=null}}async abort(){if(!this._done){this._done=!0;try{this._append?await this._closeAll(!0):await this._discard()}finally{this._release?.(),this._release=null}}}async _closeAll(e){for(let t of this._writers.values())try{await this._transport.call(`closeWriter`,{id:(await t).id,abort:e})}catch{}this._writers.clear()}async _discard(){await this._closeAll(!0),await this.area._removeDir(this.id)}_assertOpen(){if(this._done)throw Error(`storage: entry ${this.area.name}/${this.id} is already committed or aborted`)}},fr=class{constructor(e,t,n){this.manager=e,this.name=t,this.kind=n}_lockName(e){return`${this.manager.namespace}:store:${this.name}:${e}`}async _dir(e=!1){try{return await this.manager._root.getDirectoryHandle(this.name,{create:e})}catch(e){if(e.name===`NotFoundError`)return null;throw e}}async _entryDir(e,t=!1){let n=await this._dir(t);if(!n)return null;try{return await n.getDirectoryHandle(e,{create:t})}catch(e){if(e.name===`NotFoundError`)return null;throw e}}async _removeDir(e){let t=await this._dir(!1);if(t)try{await t.removeEntry(e,{recursive:!0})}catch(e){if(e.name!==`NotFoundError`)throw e}}async _validMeta(e,t=null){let n=await cr(e,Qn);if(!n||n.v!==$n||typeof n.key!=`string`||t!==null&&n.key!==t)return null;let r=n.growable??[];for(let[t,i]of Object.entries(n.files??{}))try{let n=await(await e.getFileHandle(t)).getFile();if(n.size!==i&&!(r.includes(t)&&n.size>i))return null}catch{return null}return n}async open(e,{wait:t=!1}={}){let n=await Hn(e),r=await Nn(this._lockName(n),{mode:`shared`,ifAvailable:!t});if(!r)return null;try{let t=await this._entryDir(n),i=t?await this._validMeta(t,e):null;return i?(Date.now()-i.lastUsed>er&&this._touch(n,i),new ur(this,n,i,t,r)):(r(),null)}catch(e){return r(),this.manager._issue(Y.STORAGE_READ_FAILED,`could not open ${this.name} entry`,{error:e.message}),null}}async has(e){let t=await this.open(e);return t?.release(),!!t}_touch(e,t){let n={...t,lastUsed:Date.now()},{args:r,list:i}=sr(JSON.stringify(n),{copy:!1});this.manager._transport.call(`writeFile`,{path:[this.name,e],name:Qn,...r},i).catch(()=>{}),t.lastUsed=n.lastUsed}async create(e,{label:t=``,pinned:n=!1,expectedBytes:r=0,extra:i={},growable:a=[]}={}){let o=await Hn(e),s=await Nn(this._lockName(o),{mode:`exclusive`});try{return r>0&&!await this.manager.ensureSpace(r,this.kind)?(s(),this.manager._issue(Y.STORAGE_QUOTA_EXCEEDED,`no room for ${(r/1048576).toFixed(0)} MB in ${this.name}`,{area:this.name,expectedBytes:r}),null):(await this._removeDir(o),await this._entryDir(o,!0),new dr(this,o,e,{label:t,pinned:n,extra:i,growable:a},s))}catch(e){return s(),this.manager._writeFailed(this.name,e),null}}async patchMeta(e,t){let n=await Hn(e),r=await Nn(this._lockName(n),{mode:`shared`,ifAvailable:!0});if(!r)return!1;try{let r=await this._entryDir(n),i=r?await this._validMeta(r,e):null;if(!i)return!1;let{args:a,list:o}=sr(JSON.stringify({...i,...t,v:$n,key:e}),{copy:!1});return await this.manager._transport.call(`writeFile`,{path:[this.name,n],name:Qn,...a},o),!0}finally{r()}}async edit(e){let t=await Hn(e),n=await Nn(this._lockName(t),{mode:`exclusive`});try{let r=await this._entryDir(t),i=r?await this._validMeta(r,e):null;if(!i)return n(),null;let a={label:i.label,pinned:i.pinned,extra:i.extra,createdAt:i.createdAt,growable:i.growable};return new dr(this,t,e,a,n,{sizes:i.files,append:!0})}catch(e){return n(),this.manager._writeFailed(this.name,e),null}}async remove(e){return this.removeById(await Hn(e))}async removeById(e){let t=await Nn(this._lockName(e),{mode:`exclusive`,ifAvailable:!0});if(!t)return!1;try{return await this._removeDir(e),this.manager._changed(this.name),!0}finally{t()}}async list(){let e=await this._dir(!1);if(!e)return[];let t=[];for await(let[n,r]of lr(e)){let e=await cr(r,Qn);e?.v===$n&&t.push({...e,id:n})}return t}async clear(){let e=0;for(let{id:t}of await this.list())await this.removeById(t)&&e++;return e}async sweep(){let e=await this._dir(!1);if(!e)return 0;let t=await Pn(),n=0;for await(let[r,i]of lr(e))t.has(this._lockName(r))||await this._validMeta(i)||await this.removeById(r)&&n++;return n}},pr=class extends qn{constructor({root:e,transport:t,namespace:n}){super(),this.namespace=n,this._root=e,this._transport=t,this._areas=new Map,this._budget=null;for(let e of Object.values(Zn))this.defineArea(e,{kind:e===Zn.SPILL?Xn.SCRATCH:Xn.CACHE})}defineArea(e,{kind:t=Xn.CACHE}={}){let n=this._areas.get(e);if(n){if(n.kind!==t)throw Error(`storage: area "${e}" is already defined as ${n.kind}`);return n}let r=new fr(this,e,t);return this._areas.set(e,r),r}area(e){let t=this._areas.get(e);if(!t)throw Error(`storage: unknown area "${e}"`);return t}get areaNames(){return[...this._areas.keys()]}async estimate(){let e=typeof navigator<`u`?navigator.storage:null;if(!e?.estimate)return{quota:1/0,usage:0};let{quota:t=1/0,usage:n=0}=await e.estimate();return{quota:t,usage:n}}async persisted(){return await globalThis.navigator?.storage?.persisted?.()===!0}async persist(){let e=await globalThis.navigator?.storage?.persist?.()===!0;return this._changed(null),e}async budget(){if(this._budget!==null)return this._budget;let{quota:e}=await this.estimate();return Math.min(e*tr,nr)}setBudget(e){this._budget=e===null?null:Math.max(0,e),this._changed(null)}async _cacheEntries(){let e=[];for(let t of this._areas.values())if(t.kind===Xn.CACHE)for(let n of await t.list())e.push({area:t,meta:n});return e}async usage(){let{quota:e,usage:t}=await this.estimate(),n={},r=0;for(let e of this._areas.values()){let t=await e.list(),i=t.reduce((e,t)=>e+(t.bytes??0),0);n[e.name]={kind:e.kind,bytes:i,entries:t.length},e.kind===Xn.CACHE&&(r+=i)}return{quota:e,usage:t,persisted:await this.persisted(),budget:await this.budget(),cacheBytes:r,areas:n}}async collect({freeBytes:e=null}={}){let t=await this._cacheEntries(),n=await this.budget(),r=t.reduce((e,t)=>e+(t.meta.bytes??0),0),i=e??Math.max(0,r-n);if(i<=0)return 0;let a=await Pn(),o=t.filter(({area:e,meta:t})=>!t.pinned&&!a.has(e._lockName(t.id))).sort((e,t)=>e.meta.lastUsed-t.meta.lastUsed),s=0;for(let{area:e,meta:t}of o){if(s>=i)break;await e.removeById(t.id)&&(s+=t.bytes??0,r-=t.bytes??0)}return s}async ensureSpace(e,t=Xn.CACHE){let n=async()=>{let{quota:n,usage:r}=await this.estimate(),i=e+rr-(n-r);return t===Xn.CACHE?{free:i,budget:(await this._cacheEntries()).reduce((e,t)=>e+(t.meta.bytes??0),0)+e-await this.budget()}:{free:i,budget:0}},r=await n();return r.free<=0&&r.budget<=0?!0:(await this.collect({freeBytes:Math.max(r.free,r.budget)}),(await n()).free<=0)}async sweep(){let e=0;for(let t of this._areas.values())e+=await t.sweep(),t.kind===Xn.SCRATCH&&(e+=await t.clear());return e}_changed(e){this.dispatchEvent({type:`change`,area:e})}_issue(e,t,n={}){this.dispatchEvent({type:`issue`,code:e,message:t,detail:n})}_writeFailed(e,t){let n=t?.name===`QuotaExceededError`;this._issue(n?Y.STORAGE_QUOTA_EXCEEDED:Y.STORAGE_WRITE_FAILED,`${e}: ${t?.message??t}`,{area:e,error:t?.name})}dispose(){this._transport?.dispose(),this._transport=null,this._areas.clear()}};function mr({namespace:e,root:t}){let n=new Yn(t);n.inline=!0;let r=new pr({root:t,transport:n,namespace:e});return r.sweep().catch(()=>{}),r}var hr=32*1024*1024,gr=`chunks.bin`,_r=class e{static async create(t,n,r,{label:i=``,expectedBytes:a=0}={}){let o=t?.area(Zn.SPILL),s=await o?.create(n,{label:i,expectedBytes:a,growable:[gr]});return s?new e(o,n,r,s):null}constructor(e,t,n,r){this._area=e,this._key=t,this._chunkBytes=n,this._writer=r,this._entry=null,this._file=null}write(e,t){return this.writeAt(e*this._chunkBytes,t)}async writeAt(e,t){if(!this._writer&&(this._entry?.release(),this._entry=this._file=null,this._writer=await this._area.edit(this._key),!this._writer))throw Error(`spill: its storage entry is gone`);let n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),r=0;do await this._writer.write(gr,n.subarray(r,Math.min(n.length,r+hr)),{at:e+r}),r+=hr;while(r<n.length)}async flush(){if(this._writer&&=(await this._writer.commit(),null),!this._entry&&(this._entry=await this._area.open(this._key,{wait:!0}),this._file=await this._entry?.file(gr),!this._file))throw Error(`spill: its storage entry is gone`)}read(e,t){return this.readAt(e*this._chunkBytes,t)}async readAt(e,t){return await this.flush(),await this._file.slice(e,e+t).arrayBuffer()}async dispose(){this._writer&&await this._writer.abort(),this._writer=null,this._entry?.release(),this._entry=this._file=null,await this._area.remove(this._key)}},vr=32*1024*1024,yr=vr/4,br=64*1024*1024,xr=new Map;function Sr(e){let t=xr.get(e);return t||xr.set(e,t=new e(0)),t}var Cr=class e{static async create(t,n,r=0){let i=await _r.create(t,n,0,{label:`Scene geometry (while building)`,expectedBytes:r});return i?new e(i):null}static canTake(e){if(Object.keys(e.morphAttributes??{}).length)return!1;for(let t in e.attributes)if(!e.attributes[t].isBufferAttribute)return!1;return!e.index||e.index.isBufferAttribute===!0}constructor(e){this._store=e,this._records=[],this._geometries=[],this._end=0,this._pack=null,this._packAt=0,this._packUsed=0,this._packRecords=[],this._chain=Promise.resolve(),this._queued=0,this.bytes=0,this.error=null}get queuedBytes(){return this._queued}add(e){let t=new Map,n=Object.values(e.attributes);e.index&&n.push(e.index);for(let e of n){let n=e.array;if(!n?.byteLength)continue;let r=t.get(n);r||t.set(n,r=this._write(n)),r.attributes.push(e),e.array=Sr(n.constructor)}this._geometries.push({geometry:e,box:e.boundingBox!==null,sphere:e.boundingSphere!==null})}_write(e){let t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),n={at:0,byteLength:t.byteLength,Type:e.constructor,attributes:[],array:null,pack:null,offset:0};return this._records.push(n),this.bytes+=t.byteLength,t.byteLength>=yr?(n.at=this._end,n.array=e,this._end+=t.byteLength,this._queue(n.at,t,[n]),n):(this._pack&&this._packUsed+t.byteLength>vr&&this._flushPack(),this._pack||(this._pack=new Uint8Array(vr),this._packAt=this._end,this._packUsed=0,this._end+=vr),this._pack.set(t,this._packUsed),n.at=this._packAt+this._packUsed,n.pack=this._pack,n.offset=this._packUsed,this._packUsed+=t.byteLength,this._packRecords.push(n),n)}_flushPack(){this._pack&&(this._queue(this._packAt,this._pack.subarray(0,this._packUsed),this._packRecords),this._pack=null,this._packRecords=[])}_queue(e,t,n){this._queued+=t.byteLength,this._chain=this._chain.then(async()=>{if(!this.error){await this._store.writeAt(e,t);for(let e of n)e.array=e.pack=null}}).catch(e=>void(this.error??=e)).finally(()=>void(this._queued-=t.byteLength))}written(){return this._flushPack(),this._chain}async restore(){await this.written();let e=this._records.sort((e,t)=>e.at-t.at);e.some(e=>!e.array&&!e.pack)&&await this._store.flush();let t=null,n=0;for(let r of e){let e;if(r.array?e=r.array:r.pack?e=new r.Type(r.pack.slice(r.offset,r.offset+r.byteLength).buffer):r.byteLength>br?e=new r.Type(await this._store.readAt(r.at,r.byteLength)):((!t||r.at+r.byteLength>n+t.byteLength)&&(n=r.at,t=await this._store.readAt(r.at,br)),e=new r.Type(t.slice(r.at-n,r.at-n+r.byteLength))),e.byteLength!==r.byteLength)throw Error(`geometry spill: an array came back short`);for(let t of r.attributes)t.array=e}for(let{geometry:e,box:t,sphere:n}of this._geometries)t||(e.boundingBox=null),n||(e.boundingSphere=null);this._records=[],this._geometries=[],this.bytes=0}async dispose(){await this._chain,this._records=[],this._geometries=[],this._pack=null,this._packRecords=[],await this._store.dispose()}};rn();var wr=Wt(`geometry`),Tr=xt.MAX_TEXTURES_LIMIT,Er=new Set([`color`,`emissive`,`attenuationColor`,`sheenColor`,`specularColor`,`subsurfaceColor`]),Dr=Object.freeze({MATERIAL:`material`,MAPPED:`mapped`,DEFAULT:`default`,HOST:`host`}),Or=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function kr(e){for(let t=0;t<16;t++)if(e[t]!==Or[t])return!1;return!0}function Ar(e){return{map:e.map,normalMap:e.normalMap,bumpMap:e.bumpMap,roughnessMap:e.roughnessMap,metalnessMap:e.metalnessMap,emissiveMap:e.emissiveMap??(e.isMeshBasicMaterial?e.map:void 0),displacementMap:e.displacementMap,anisotropyMap:e.anisotropyMap,clearcoatMap:e.clearcoatMap,clearcoatRoughnessMap:e.clearcoatRoughnessMap,transmissionMap:e.transmissionMap,sheenColorMap:e.sheenColorMap,sheenRoughnessMap:e.sheenRoughnessMap,specularIntensityMap:e.specularIntensityMap,specularColorMap:e.specularColorMap,iridescenceMap:e.iridescenceMap,iridescenceThicknessMap:e.iridescenceThicknessMap}}function jr(e){if(e.userData?.gltfExtensions?.KHR_materials_unlit?.alphaMode){let t=e.userData.gltfExtensions.KHR_materials_unlit.alphaMode;return t===`BLEND`?2:+(t===`MASK`)}return e.alphaTest>0?1:e.transparent&&e.opacity<1||e.map&&e.map.format===r.RGBAFormat&&e.transparent?2:0}function Mr(e){let t=0,n=new Set,r=e=>{let i=e.isMesh&&e.material?e.geometry:null;if(i&&!n.has(i.uuid)){n.add(i.uuid);for(let e in i.attributes)t+=i.attributes[e].array?.byteLength??0;t+=i.index?.array?.byteLength??0}if(e.children)for(let t of e.children)r(t)};return r(e),t}function Nr(e,t){let n=e.x,r=e.y,i=e.z;e.x=t[0]*n+t[4]*r+t[8]*i+t[12],e.y=t[1]*n+t[5]*r+t[9]*i+t[13],e.z=t[2]*n+t[6]*r+t[10]*i+t[14]}function Pr(e,t){let n=e.x,r=e.y,i=e.z;e.x=t[0]*n+t[3]*r+t[6]*i,e.y=t[1]*n+t[4]*r+t[7]*i,e.z=t[2]*n+t[5]*r+t[8]*i}var Fr=1<<21;function Ir(e){return!!(e.isSkinnedMesh||Object.keys(e.geometry?.morphAttributes??{}).length)}function Lr(e){return e[0]*(e[5]*e[10]-e[9]*e[6])-e[4]*(e[1]*e[10]-e[9]*e[2])+e[8]*(e[1]*e[6]-e[5]*e[2])}var Rr=class{constructor({issues:e=null}={}){this._issues=e,this._droppedTextures=0,this._vectorPool={vec3:Array(9).fill().map(()=>new r.Vector3),vec2:[,,,,,,].fill().map(()=>new r.Vector2)},this._geometryRanges=new Map,this.expandedTriangleCount=0,this._allocatePlacements(0),this._matrixPool={mat3:new r.Matrix3,mat4:new r.Matrix4},this.resetArrays(),this.triangleCount=0,this.currentTriangleIndex=0}_getVec3(e=0){return this._vectorPool.vec3[e%this._vectorPool.vec3.length]}_getVec2(e=0){return this._vectorPool.vec2[e%this._vectorPool.vec2.length]}extract(e){this.resetArrays();let t=this._countTriangles(e);return this._triangleCapacity=Math.max(1024,t),this._allocateTriangles(this._triangleCapacity),this.currentTriangleIndex=0,this._allocatePlacements(this._countPlacements(e)),this._geometryUses=this._countGeometryUses(e),this.bakeInverse=new Map,this.traverseObject(e),this._shareInstanceMatrices(),this._compressAttributes(e),this.logStats(),this.getExtractedData()}async extractStreaming(e,{onStore:t,onRange:n,pause:r,yieldEvery:i=1<<20,releaseGeometry:a=null}){this.resetArrays(),this._triangleCapacity=Math.max(1,this._countStoredTriangles(e)),this._allocateTriangles(this._triangleCapacity,!0),t?.(this.triangles),this.currentTriangleIndex=0,this._allocatePlacements(this._countPlacements(e)),this._geometryUses=this._countGeometryUses(e),this.bakeInverse=new Map,this._onRange=n,this._releaseAfterRead=a?this._geometryReleaser(e,a):null;try{let t=[e],n=0;for(;t.length;){let e=t.pop();if(this._visit(e),e.children)for(let n=e.children.length-1;n>=0;n--)t.push(e.children[n]);this.currentTriangleIndex-n>=i&&(n=this.currentTriangleIndex,await r(this.currentTriangleIndex))}}finally{this._onRange=null,this._releaseAfterRead=null}return this._shareInstanceMatrices(),this._compressAttributes(e),this.triangles.trimInPlace(this.currentTriangleIndex),this._streamedStore=!0,this.logStats(),this.getExtractedData()}_countStoredTriangles(e){let t=new Set,n=0,r=e=>{if(e.isMesh&&e.geometry&&e.material){let r=e.geometry,i=Math.ceil((r.index?r.index.count:r.attributes.position?.count??0)/3),a=Array.isArray(e.material)?e.material[0]:e.material,o=a?.emissive,s=a?.emissiveIntensity>0&&!!o&&(o.r>0||o.g>0||o.b>0),c=e.isInstancedMesh?e.count??0:1;if(s&&e.isInstancedMesh&&!Ir(e)&&i*c<=Fr)n+=i*c;else if(s||Ir(e))n+=i;else{let e=`${r.uuid}|${a?.uuid}`;t.has(e)||(t.add(e),n+=i)}}if(e.children)for(let t of e.children)r(t)};return r(e),n}_geometryReleaser(e,t){let n=new Map,r=new Map,i=new Set,a=(e,t)=>{t||=!!e.userData?.__rayzeeExternal;let o=e.isMesh&&e.material?e.geometry:null;if(o){if(!n.has(o)){Cr.canTake(o)||i.add(o);for(let e of[...Object.values(o.attributes),o.index]){let t=e?.array;if(!t)continue;let n=r.get(t);n&&n!==o?i.add(o).add(n):r.set(t,o)}}n.set(o,(n.get(o)??0)+1),(t||Ir(e))&&i.add(o)}if(e.children)for(let n of e.children)a(n,t)};return a(e,!1),e=>{let r=e.material?e.geometry:null;if(!r||!n.has(r))return;let a=n.get(r)-1;if(a>0)return void n.set(r,a);n.delete(r),!i.has(r)&&(this._compressGeometry(r),t(r))}}surveyScene(e){let t=0,n=e=>{if(e.isMesh&&e.geometry&&e.material&&t++,e.children)for(let t of e.children)n(t)};return n(e),{triangles:this._countTriangles(e),placements:this._countPlacements(e),meshes:t,geometryBytes:Mr(e)}}_countGeometryUses(e){let t=new Map;return e.traverse(e=>{if(!e.isMesh||!e.geometry||!e.material)return;let n=`${e.geometry.uuid}|${e.material.uuid}`;t.set(n,(t.get(n)??0)+1)}),t}_countPlacements(e){let t=0;if(e.isMesh&&e.geometry&&e.material&&(t+=e.isInstancedMesh&&e.instanceMatrix?e.count??e.instanceMatrix.array.length/16:1),e.children)for(let n of e.children)t+=this._countPlacements(n);return t}_allocatePlacements(e){this.instanceCount=0,this.instanceCapacity=e,this.instanceSource=new Int32Array(e),this.instanceMatrices=new Float32Array(e*16),this._shareable=[],this._compressed=new Set}_compressAttributes(e){let t=(e,n)=>{if(!e.userData?.__rayzeeExternal){n(e);for(let r of e.children)t(r,n)}};t(e,e=>{e.isMesh&&e.geometry&&this._compressGeometry(e.geometry)})}_compressGeometry(e){if(!this._compressed.has(e.uuid)){this._compressed.add(e.uuid);for(let t of[`normal`,`tangent`,`color`]){let n=e.getAttribute(t);if(!n||n.normalized||!(n.array instanceof Float32Array)||e.morphAttributes?.[t]?.length)continue;let i=n.array,a=!0;for(let e=0;e<i.length;e++){let t=i[e];if(!(t>=-1.0001&&t<=1.0001)){a=!1;break}}if(!a)continue;let o=new Int16Array(i.length);for(let e=0;e<i.length;e++)o[e]=Math.round(Math.max(-1,Math.min(1,i[e]))*32767);e.setAttribute(t,new r.BufferAttribute(o,n.itemSize,!0))}}}_shareInstanceMatrices(){for(let{mesh:e,start:t,count:n}of this._shareable){let r=e.instanceMatrix;!r||r.array.length!==n*16||(r.array=this.instanceMatrices.subarray(t*16,(t+n)*16))}this._shareable=[]}_countTriangles(e){let t=0;if(e.isMesh&&e.geometry&&e.material){let n=e.geometry.index,r=e.geometry.attributes.position;n?t+=Math.ceil(n.count/3):r&&(t+=Math.ceil(r.count/3))}if(e.children)for(let n of e.children)t+=this._countTriangles(n);return t}_ensureCapacity(e){if(e<=this._triangleCapacity)return;if(this._onRange){this.triangles.grow(e),this._triangleCapacity=e;return}let t=this.triangles,n=this.currentTriangleIndex;this._allocateTriangles(e);for(let e=0;e<n;e++)this.triangles.chunkFor(e).set(t.chunkFor(e).subarray(t.baseOf(e),t.baseOf(e)+t.lanesPerRecord),this.triangles.baseOf(e));this._triangleCapacity=e}_allocateTriangles(e,t=!1){this.triangles=(t?Dn.lazy:(...e)=>new Dn(...e))(e,st.FLOATS_PER_TRIANGLE,Uint32Array,void 0,Cn),this.triangleFloatChunks=this.triangles.viewAs(Float32Array),this.triangleData=this.triangles.single,this.triangleFloats=this.triangleFloatChunks.single}traverseObject(e){if(this._visit(e),e.children)for(let t of e.children)this.traverseObject(t)}_visit(e){e.isMesh?(this.processMesh(e),this._releaseAfterRead?.(e)):e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e)}processMesh(e){if(!e.geometry||!e.material){console.warn(`Skipping mesh with missing geometry or material:`,e);return}let t=this.processMaterial(e.material);e.userData.materialIndex=t;let n=this.meshes.length;this.meshes.push(e),e.userData.meshIndex=n;let r=`${e.geometry.uuid}|${t}`,i=Ir(e),a=!this._emissiveMaterial(t)&&!i,o=a?this._geometryRanges.get(r):null;if(o){let t={start:o.start,count:o.count,expandedStart:this.expandedTriangleCount,sharedFrom:o.meshIndex};this.expandedTriangleCount+=o.count,this.meshTriangleRanges.push(t),this._recordPlacements(e,n);return}let s=this.currentTriangleIndex,c=e.isInstancedMesh&&!i&&this._emissiveMaterial(t)&&this._canExpand(e),l=c||!e.isInstancedMesh&&!i&&(this._geometryUses.get(`${e.geometry.uuid}|${e.material?.uuid}`)===1||this._emissiveMaterial(t));this.extractGeometry(e,t,n,l,c);let u={start:s,count:this.currentTriangleIndex-s,expandedStart:this.expandedTriangleCount};this.expandedTriangleCount+=u.count,this.meshTriangleRanges.push(u),u.count>0&&!l&&a&&this._geometryRanges.set(r,{...u,meshIndex:n}),this._recordPlacements(e,n,l,c),u.count>0&&this._onRange?.(n,u)}_recordPlacements(e,t,n=!1,r=!1){let i=e.matrixWorld.elements,a=this.instanceMatrices,o=this.instanceSource;if(!e.isInstancedMesh||!e.instanceMatrix||r){let r=this._nextPlacement();if(o[r]=t,n){for(let e=0;e<16;e++)a[r*16+e]=+(e%5==0);this.bakeInverse.set(t,Float32Array.from(this._matrixPool.mat4.copy(e.matrixWorld).invert().elements))}else for(let e=0;e<16;e++)a[r*16+e]=i[e];return}let s=e.instanceMatrix.array,c=e.count??s.length/16,l=kr(i);l&&s.length===c*16&&this._shareable.push({mesh:e,start:this.instanceCount,count:c});for(let e=0;e<c;e++){let n=e*16,r=this._nextPlacement(),c=r*16;if(o[r]=t,l){for(let e=0;e<16;e++)a[c+e]=s[n+e];continue}for(let e=0;e<4;e++)for(let t=0;t<4;t++)a[c+e*4+t]=i[t]*s[n+e*4]+i[4+t]*s[n+e*4+1]+i[8+t]*s[n+e*4+2]+i[12+t]*s[n+e*4+3]}}_nextPlacement(){if(this.instanceCount>=this.instanceCapacity){let e=Math.max(16,this.instanceCapacity*2),t=new Int32Array(e),n=new Float32Array(e*16);t.set(this.instanceSource),n.set(this.instanceMatrices),this.instanceSource=t,this.instanceMatrices=n,this.instanceCapacity=e}return this.instanceCount++}_canExpand(e){let t=e.geometry,n=(t.index?t.index.count:t.attributes.position.count)/3,r=e.count??(e.instanceMatrix?.array.length??0)/16;return n*r<=Fr?!0:(this._issues?.record(Y.EMISSIVE_INSTANCES_COLLAPSED,`"${e.name||`instanced mesh`}" would need ${Math.round(n*r).toLocaleString()} triangles to light every instance; lighting the first one only`,{instances:r,trianglesPerInstance:n,limit:Fr}),!1)}_emissiveMaterial(e){let t=this.materials[e];if(!t||!(t.emissiveIntensity>0))return!1;let n=t.emissive;return!!n&&(n.r>0||n.g>0||n.b>0)}processMaterial(e){let t=this._materialUuidMap.get(e.uuid)??-1;if(t===-1){e.depthWrite===!1&&(e.depthWrite=!0,Gt(wr,`depthWrite`,`material had depthWrite disabled — enabled for rastered rendering`));let n=this.createMaterialObject(e);this.materials.push(n),t=this.materials.length-1,this._materialUuidMap.set(e.uuid,t)}return t}getMaterialType(e){return e.isMeshPhysicalMaterial?`physical`:e.isMeshStandardMaterial?`standard`:e.isMeshPhongMaterial?`phong`:e.isMeshLambertMaterial?`lambert`:e.isMeshBasicMaterial?`basic`:e.isMeshToonMaterial?`toon`:`unknown`}getPhysicalDefaults(){let e={};for(let[t,n]of Object.entries(q))e[t]=Er.has(t)?new r.Color().fromArray(n):Array.isArray(n)?[...n]:n;return e.normalScale={x:q.normalScale[0],y:q.normalScale[1]},e}mapLegacyMaterialToPhysical(e,t){let n={};switch(t){case`basic`:n.emissive=e.color.clone(),n.emissiveIntensity=1,n.color=new r.Color(0),n.roughness=1,n.metalness=0,n.specularIntensity=0;break;case`lambert`:n.roughness=1,n.metalness=0,n.specularIntensity=0;break;case`phong`:{let t=e.shininess||30;n.roughness=Math.sqrt(2/(t+2)),n.metalness=0}if(e.specular){let t=e.specular,i=t.r*.299+t.g*.587+t.b*.114,a=Math.max(t.r,t.g,t.b);n.specularIntensity=Math.min(i*2,1),n.specularColor=a>0?t.clone().multiplyScalar(1/a):new r.Color(1,1,1)}break;case`toon`:n.roughness=.9,n.metalness=0;break;case`standard`:case`physical`:break}return n}createMaterialObject(e){let t=this.getPhysicalDefaults(),n=this.getMaterialType(e),r=this.mapLegacyMaterialToPhysical(e,n),i=Ar(e),a={},o=n=>r[n]===void 0?e[n]!==void 0&&e[n]!==null?(a[n]=Dr.MATERIAL,e[n]):(a[n]=Dr.DEFAULT,t[n]):(a[n]=Dr.MAPPED,r[n]);for(let e of[`transparent`,`alphaMode`,`side`,`depthWrite`])a[e]=Dr.MATERIAL;return{uuid:e.uuid,color:o(`color`),emissive:o(`emissive`),emissiveIntensity:o(`emissiveIntensity`),roughness:Math.max(.02,o(`roughness`)),metalness:o(`metalness`),ior:o(`ior`),opacity:o(`opacity`),transmission:o(`transmission`),thickness:o(`thickness`),attenuationColor:o(`attenuationColor`),attenuationDistance:o(`attenuationDistance`),dispersion:o(`dispersion`),sheen:o(`sheen`),sheenRoughness:o(`sheenRoughness`),sheenColor:o(`sheenColor`),clearcoat:o(`clearcoat`),clearcoatRoughness:o(`clearcoatRoughness`),iridescence:o(`iridescence`),iridescenceIOR:o(`iridescenceIOR`),iridescenceThicknessRange:o(`iridescenceThicknessRange`),subsurface:o(`subsurface`),subsurfaceColor:o(`subsurfaceColor`),subsurfaceRadius:o(`subsurfaceRadius`),subsurfaceRadiusScale:o(`subsurfaceRadiusScale`),subsurfaceAnisotropy:o(`subsurfaceAnisotropy`),anisotropy:o(`anisotropy`),anisotropyRotation:o(`anisotropyRotation`),specularIntensity:o(`specularIntensity`),specularColor:o(`specularColor`),normalScale:o(`normalScale`),bumpScale:o(`bumpScale`),displacementScale:o(`displacementScale`),transparent:+!!e.transparent,alphaTest:o(`alphaTest`),alphaMode:jr(e),side:this.getMaterialSide(e),depthWrite:e.depthWrite??!0?1:0,map:this.processTexture(i.map,this.maps),normalMap:this.processTexture(i.normalMap,this.normalMaps),bumpMap:this.processTexture(i.bumpMap,this.bumpMaps),roughnessMap:this.processTexture(i.roughnessMap,this.roughnessMaps),metalnessMap:this.processTexture(i.metalnessMap,this.metalnessMaps),emissiveMap:this.processTexture(i.emissiveMap,this.emissiveMaps),displacementMap:this.processTexture(i.displacementMap,this.displacementMaps),anisotropyMap:this.processTexture(i.anisotropyMap,this.anisotropyMaps),clearcoatMap:this.processTexture(i.clearcoatMap,this.clearcoatMaps),clearcoatRoughnessMap:this.processTexture(i.clearcoatRoughnessMap,this.clearcoatRoughnessMaps),transmissionMap:this.processTexture(i.transmissionMap,this.transmissionMaps),thicknessMap:this.processTexture(e.thicknessMap,[]),sheenColorMap:this.processTexture(i.sheenColorMap,this.sheenColorMaps),sheenRoughnessMap:this.processTexture(i.sheenRoughnessMap,this.sheenRoughnessMaps),specularIntensityMap:this.processTexture(i.specularIntensityMap,this.specularIntensityMaps),specularColorMap:this.processTexture(i.specularColorMap,this.specularColorMaps),iridescenceMap:this.processTexture(i.iridescenceMap,this.iridescenceMaps),iridescenceThicknessMap:this.processTexture(i.iridescenceThicknessMap,this.iridescenceThicknessMaps),mapMatrix:this.getTextureMatrix(i.map),normalMapMatrices:this.getTextureMatrix(i.normalMap),bumpMapMatrices:this.getTextureMatrix(i.bumpMap),roughnessMapMatrices:this.getTextureMatrix(i.roughnessMap),metalnessMapMatrices:this.getTextureMatrix(i.metalnessMap),emissiveMapMatrices:this.getTextureMatrix(i.emissiveMap),displacementMapMatrices:this.getTextureMatrix(i.displacementMap),sources:a,originalType:n}}getTextureMatrix(e){return e?(e.matrixAutoUpdate&&e.updateMatrix(),e.matrix.elements):new r.Matrix3().elements}getMaterialSide(e){if(e.transmission>0)return 2;switch(e.side){case r.FrontSide:return 0;case r.BackSide:return 1;case r.DoubleSide:return 2;default:return 0}}processTexture(e,t){if(!e)return-1;let n=this._textureIndexCache.get(t);n||(n=new Map,this._textureIndexCache.set(t,n));let r=e.source.uuid,i=n.get(r);if(i!==void 0)return i;if(t.length<Tr){t.push(e);let i=t.length-1;return n.set(r,i),i}return this._droppedTextures++,this._droppedTextures===1&&this._issues?.record(Y.TEXTURE_LIMIT_EXCEEDED,`scene needs more than ${Tr} distinct textures for one map type; the rest render untextured`,{limit:Tr,firstDropped:e.name||e.source?.uuid}),-1}extractGeometry(e,t,n,i=!1,a=!1){e.updateMatrix(),e.updateMatrixWorld();let o=e.geometry;o.attributes.normal||o.computeVertexNormals();let s=o.attributes.position,c=o.attributes.normal,l=o.attributes.uv,u=o.index?o.index.array:null,d=u?u.length/3:s.count/3;if(a){let i=e.count??e.instanceMatrix.array.length/16,a=this._matrixPool.mat4,o=new r.Matrix4;for(let f=0;f<i;f++){a.fromArray(e.instanceMatrix.array,f*16),o.multiplyMatrices(e.matrixWorld,a);let i=new r.Matrix3().getNormalMatrix(o);this.extractTrianglesInBatch(s,c,l,u,d,t,n,o,i,Lr(o.elements)<0)}return}let f=i?this._matrixPool.mat4.copy(e.matrixWorld):null,p=i?this._matrixPool.mat3.getNormalMatrix(e.matrixWorld):null,m=i&&Lr(f.elements)<0;this.extractTrianglesInBatch(s,c,l,u,d,t,n,f,p,m)}extractTrianglesInBatch(e,t,n,r,i,a,o,s=null,c=null,l=!1){for(;this.materialTriangleCounts.length<=a;)this.materialTriangleCounts.push(0);this.materialTriangleCounts[a]+=i;let u=this._getVec3(0),d=this._getVec3(1),f=this._getVec3(2),p=this._getVec3(3),m=this._getVec3(4),h=this._getVec3(5),g=this._getVec2(0),_=this._getVec2(1),v=this._getVec2(2);this._ensureCapacity(this.currentTriangleIndex+i);let y=s?.elements,b=c?.elements;for(let c=0;c<i;c++){let i=c*3,x=r?r[i+0]:i+0,S=l?2:1,C=l?1:2,w=r?r[i+S]:i+S,T=r?r[i+C]:i+C;this.getVertex(e,x,u),this.getVertex(e,w,d),this.getVertex(e,T,f),this.getVertex(t,x,p),this.getVertex(t,w,m),this.getVertex(t,T,h),n?(this.getVertex(n,x,g),this.getVertex(n,w,_),this.getVertex(n,T,v)):(g.set(0,0),_.set(0,0),v.set(0,0)),s&&(Nr(u,y),Nr(d,y),Nr(f,y),Pr(p,b),Pr(m,b),Pr(h,b)),p.normalize(),m.normalize(),h.normalize(),this.packTriangleDataTextureFormat(this.currentTriangleIndex,u,d,f,p,m,h,g,_,v,a,o),this.currentTriangleIndex++}}packTriangleDataTextureFormat(e,t,n,r,i,a,o,s,c,l,u,d){let f=st,p=this.triangles.baseOf(e),m=this.triangleFloatChunks.chunkFor(e),h=this.triangles.chunkFor(e);m[p+f.POSITION_A_OFFSET+0]=t.x,m[p+f.POSITION_A_OFFSET+1]=t.y,m[p+f.POSITION_A_OFFSET+2]=t.z,h[p+f.NORMAL_A_PACKED_OFFSET]=dt(i.x,i.y,i.z),m[p+f.POSITION_B_OFFSET+0]=n.x,m[p+f.POSITION_B_OFFSET+1]=n.y,m[p+f.POSITION_B_OFFSET+2]=n.z,h[p+f.NORMAL_B_PACKED_OFFSET]=dt(a.x,a.y,a.z),m[p+f.POSITION_C_OFFSET+0]=r.x,m[p+f.POSITION_C_OFFSET+1]=r.y,m[p+f.POSITION_C_OFFSET+2]=r.z,h[p+f.NORMAL_C_PACKED_OFFSET]=dt(o.x,o.y,o.z),m[p+f.UV_AB_OFFSET+0]=s.x,m[p+f.UV_AB_OFFSET+1]=s.y,m[p+f.UV_AB_OFFSET+2]=c.x,m[p+f.UV_AB_OFFSET+3]=c.y,m[p+f.UV_C_OFFSET+0]=l.x,m[p+f.UV_C_OFFSET+1]=l.y,h[p+f.MATERIAL_FLAGS_OFFSET]=ut(u,this.materials[u]),h[p+f.MESH_INDEX_OFFSET]=d}releaseTriangles(){this.triangles=null,this.triangleData=null,this.triangleFloatChunks=null,this.triangleFloats=null}getTriangleData(){return this.triangles?this._streamedStore?this.triangles:this.triangles.trimTo(this.currentTriangleIndex):null}getTriangleCount(){return this.currentTriangleIndex}getVertex(e,t,n){return e.itemSize===2?(n.x=e.getX(t),n.y=e.getY(t)):e.itemSize>=3&&(n.x=e.getX(t),n.y=e.getY(t),n.z=e.getZ(t)),n}logStats(){let e=this.currentTriangleIndex*st.FLOATS_PER_TRIANGLE*4;wr.debug(J.list([`${J.count(this.currentTriangleIndex,`tri`)} (${J.mb(e)})`,J.count(this.materials.length,`material`),J.count(this.maps.length,`map`)]))}extractMaterialsOnly(e){return this.resetArrays(),this._traverseMaterialsOnly(e),this.getExtractedData()}_traverseMaterialsOnly(e){if(e.isMesh&&e.geometry&&e.material){let t=this.processMaterial(e.material);e.userData.materialIndex=t;let n=this.meshes.length;this.meshes.push(e),e.userData.meshIndex=n}else e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e);if(e.children)for(let t of e.children)this._traverseMaterialsOnly(t)}resetArrays(){this._droppedTextures=0,this.triangles=null,this._streamedStore=!1,this.triangleData=null,this.triangleFloatChunks=null,this.triangleFloats=null,this.triangleCount=0,this.currentTriangleIndex=0,this.materials=[],this.materialTriangleCounts=[],this.meshes=[],this.meshTriangleRanges=[],this._geometryRanges=new Map,this.expandedTriangleCount=0,this._allocatePlacements(0),this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.roughnessMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this._materialUuidMap=new Map,this._textureIndexCache=new WeakMap}getExtractedData(){return{triangleData:this.getTriangleData(),triangleCount:this.getTriangleCount(),materials:this.materials,materialTriangleCounts:this.materialTriangleCounts,meshes:this.meshes,meshTriangleRanges:this.meshTriangleRanges,expandedTriangleCount:this.expandedTriangleCount,instanceSource:this.instanceSource.subarray(0,this.instanceCount),instanceMatrices:this.instanceMatrices.subarray(0,this.instanceCount*16),instanceCount:this.instanceCount,bakeInverse:this.bakeInverse,maps:this.maps,normalMaps:this.normalMaps,bumpMaps:this.bumpMaps,metalnessMaps:this.metalnessMaps,emissiveMaps:this.emissiveMaps,roughnessMaps:this.roughnessMaps,displacementMaps:this.displacementMaps,anisotropyMaps:this.anisotropyMaps,transmissionMaps:this.transmissionMaps,clearcoatMaps:this.clearcoatMaps,clearcoatRoughnessMaps:this.clearcoatRoughnessMaps,sheenColorMaps:this.sheenColorMaps,sheenRoughnessMaps:this.sheenRoughnessMaps,iridescenceMaps:this.iridescenceMaps,iridescenceThicknessMaps:this.iridescenceThicknessMaps,specularIntensityMaps:this.specularIntensityMaps,specularColorMaps:this.specularColorMaps,directionalLights:this.directionalLights,cameras:this.cameras}}},zr=null,Br=null;function Vr(e,t=null){zr=e,Br=e?t:null}function Hr(){return zr}function Ur(){return Br}function Wr(e){if(!zr)return!1;let t=e[0],n=e[1],r=e[2];return e[0]=zr[0]*t+zr[1]*n+zr[2]*r,e[1]=zr[3]*t+zr[4]*n+zr[5]*r,e[2]=zr[6]*t+zr[7]*n+zr[8]*r,!0}function Gr(e,t,n){if(!zr||n.length===0)return 0;let r=0;for(let i=0;i+t<=e.length;i+=t)for(let t of n){let n=i+t,a=e[n],o=e[n+1],s=e[n+2];e[n]=zr[0]*a+zr[1]*o+zr[2]*s,e[n+1]=zr[3]*a+zr[4]*o+zr[5]*s,e[n+2]=zr[6]*a+zr[7]*o+zr[8]*s,r++}return r}function Kr(e){if(e===null||typeof e==`boolean`||typeof e==`string`)return e;if(typeof e==`number`)return Number.isFinite(e)?e:{$num:String(e)};if(typeof e!=`object`)return;if(e.isColor)return{$color:[e.r,e.g,e.b]};if(e.isQuaternion)return{$quat:[e.x,e.y,e.z,e.w]};if(e.isVector2||e.isVector3||e.isVector4)return{$vec:e.toArray()};if(ArrayBuffer.isView(e))return Array.from(e);if(Array.isArray(e))return e.map(e=>Kr(e)??null);let t=Object.getPrototypeOf(e);if(t!==Object.prototype&&t!==null)return;let n={};for(let[t,r]of Object.entries(e)){let e=Kr(r);e!==void 0&&(n[t]=e)}return n}function qr(e){if(typeof e!=`object`||!e)return e;if(Array.isArray(e))return e.map(qr);if(`$num`in e)return Number(e.$num);if(e.$color)return new r.Color(...e.$color);if(e.$quat)return new r.Quaternion(...e.$quat);if(e.$vec){let t=[null,null,r.Vector2,r.Vector3,r.Vector4][e.$vec.length];return new t(...e.$vec)}let t={};for(let[n,r]of Object.entries(e))t[n]=qr(r);return t}rn();var Jr=new WeakSet,Yr=Wt(`material`),Xr=K.SLOTS_PER_MATERIAL,Zr=st.MATERIAL_FLAGS_OFFSET,Qr=new Set([`transmission`,`transparent`,`opacity`,`alphaMode`]),$r=new Set([`side`,...Qr,`emissive`,`emissiveIntensity`]),ei=[[`map`,!0],[`emissiveMap`,!0],[`sheenColorMap`,!0],[`specularColorMap`,!0],[`normalMap`,!1],[`bumpMap`,!1],[`roughnessMap`,!1],[`metalnessMap`,!1],[`displacementMap`,!1],[`anisotropyMap`,!1],[`transmissionMap`,!1],[`clearcoatMap`,!1],[`clearcoatRoughnessMap`,!1],[`sheenRoughnessMap`,!1],[`iridescenceMap`,!1],[`iridescenceThicknessMap`,!1],[`specularIntensityMap`,!1]],ti={ior:K.IOR,transmission:K.TRANSMISSION,thickness:K.THICKNESS,emissiveIntensity:K.EMISSIVE_INTENSITY,attenuationDistance:K.ATTENUATION_DISTANCE,opacity:K.OPACITY,alphaTest:K.ALPHA_TEST,metalness:K.METALNESS,roughness:K.ROUGHNESS,clearcoat:K.CLEARCOAT,clearcoatRoughness:K.CLEARCOAT_ROUGHNESS,dispersion:K.DISPERSION,sheen:K.SHEEN,sheenRoughness:K.SHEEN_ROUGHNESS,specularIntensity:K.SPECULAR_INTENSITY,iridescence:K.IRIDESCENCE,iridescenceIOR:K.IRIDESCENCE_IOR,subsurface:K.SUBSURFACE,subsurfaceRadiusScale:K.SUBSURFACE_RADIUS_SCALE,subsurfaceAnisotropy:K.SUBSURFACE_ANISOTROPY,anisotropy:K.ANISOTROPY,anisotropyRotation:K.ANISOTROPY_ROTATION},ni=class e{constructor(e){this.sdfs=e,this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null,this.callbacks={},this._sources=[],this._hostSet=[]}static COLOR_OFFSETS=[K.COLOR,K.EMISSIVE,K.ATTENUATION_COLOR,K.SHEEN_COLOR,K.SPECULAR_COLOR,K.SUBSURFACE_COLOR].filter(e=>Number.isInteger(e));_convertColorsToWorkingSpace(t){if(Jr.has(t))return;Jr.add(t);let n=Gr(t,K.FLOATS_PER_MATERIAL,e.COLOR_OFFSETS);n&&Yr.debug(`converted ${n} material colour(s) into ${Ur()}`)}_writeColor(e,t,n,r,i){let a=[n,r,i];Wr(a)&&([n,r,i]=a),e[t]=n,e[t+1]=r,e[t+2]=i}setMaterialData(e,r=[]){if(!e)return;this._convertColorsToWorkingSpace(e);let i=e.length/4;this.materialStorageNode?(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode.value=this.materialStorageAttr,this.materialStorageNode.bufferCount=i):(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode=(0,n.storage)(this.materialStorageAttr,`vec4`,i).toReadOnly()),this.materialCount=Math.floor(i/Xr),this._sources=[...r],this._hostSet=[],Yr.debug(`${J.n(this.materialCount)} materials (storage buffer)`)}getStorageAttr(){return this.materialStorageAttr}getStorageNode(){return this.materialStorageNode}setMaterialTextures(e){e.srgbBuckets&&(this.srgbBuckets=e.srgbBuckets),e.linearBuckets&&(this.linearBuckets=e.linearBuckets)}setTexturePackMaps(e,t){this._srgbTexPacked=e||null,this._linearTexPacked=t||null}getPackedTextureIndex(e,t){if(!e)return-1;let n=e.source?.uuid??e.uuid,r=(t?this._srgbTexPacked:this._linearTexPacked)?.get(n);return r===void 0?-1:r}loadTexturesFromSdfs(){this.srgbBuckets=this.sdfs.srgbBucketTextures,this.linearBuckets=this.sdfs.linearBucketTextures,this.setTexturePackMaps(this.sdfs._srgbTexPacked,this.sdfs._linearTexPacked)}getTextureArrays(){return{srgbBuckets:this.srgbBuckets,linearBuckets:this.linearBuckets}}getMaterialProperty(e,t){let n=this.materialStorageAttr?.array;if(!n)return;let r=ti[t];if(r===void 0)return;let i=e*K.FLOATS_PER_MATERIAL+r;return i<n.length?n[i]:void 0}getMaterialPropertySource(e,t){return this._hostSet[e]?.has(t)?Dr.HOST:this._sources[e]?.[t]}serializeHostEdits(){let e=[];return this._hostSet.forEach((t,n)=>{t?.size&&e.push({index:n,props:Object.fromEntries(t)})}),e}updateMaterialProperty(e,t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*K.FLOATS_PER_MATERIAL;switch(pn.has(t)&&typeof n==`number`&&(n=mn(n)),t){case`color`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.COLOR,n.r,n.g,n.b);break;case`metalness`:r[i+K.METALNESS]=n;break;case`emissive`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.EMISSIVE,n[0],n[1],n[2]):this._writeColor(r,i+K.EMISSIVE,n.r,n.g,n.b);break;case`roughness`:r[i+K.ROUGHNESS]=n;break;case`ior`:r[i+K.IOR]=n;break;case`transmission`:r[i+K.TRANSMISSION]=n;break;case`thickness`:r[i+K.THICKNESS]=n;break;case`emissiveIntensity`:r[i+K.EMISSIVE_INTENSITY]=n;break;case`attenuationColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.ATTENUATION_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.ATTENUATION_COLOR,n.r,n.g,n.b);break;case`attenuationDistance`:r[i+K.ATTENUATION_DISTANCE]=ft(n);break;case`dispersion`:r[i+K.DISPERSION]=n;break;case`sheen`:r[i+K.SHEEN]=n;break;case`sheenRoughness`:r[i+K.SHEEN_ROUGHNESS]=n;break;case`sheenColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SHEEN_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SHEEN_COLOR,n.r,n.g,n.b);break;case`specularIntensity`:r[i+K.SPECULAR_INTENSITY]=n;break;case`specularColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SPECULAR_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SPECULAR_COLOR,n.r,n.g,n.b);break;case`iridescence`:r[i+K.IRIDESCENCE]=n;break;case`iridescenceIOR`:r[i+K.IRIDESCENCE_IOR]=n;break;case`iridescenceThicknessRange`:Array.isArray(n)&&(r[i+K.IRIDESCENCE_THICKNESS_RANGE]=n[0],r[i+K.IRIDESCENCE_THICKNESS_RANGE+1]=n[1]);break;case`clearcoat`:r[i+K.CLEARCOAT]=n;break;case`clearcoatRoughness`:r[i+K.CLEARCOAT_ROUGHNESS]=n;break;case`opacity`:r[i+K.OPACITY]=n;break;case`side`:r[i+K.SIDE]=n,this._patchTriangleSideForMaterial(e,n);break;case`transparent`:r[i+K.TRANSPARENT]=n;break;case`alphaTest`:r[i+K.ALPHA_TEST]=n;break;case`alphaMode`:r[i+K.ALPHA_MODE]=n;break;case`depthWrite`:r[i+K.DEPTH_WRITE]=n;break;case`normalScale`:n.x===void 0?typeof n==`number`&&(r[i+K.NORMAL_SCALE]=n,r[i+K.NORMAL_SCALE+1]=n):(r[i+K.NORMAL_SCALE]=n.x,r[i+K.NORMAL_SCALE+1]=n.y);break;case`bumpScale`:r[i+K.BUMP_SCALE]=n;break;case`displacementScale`:r[i+K.DISPLACEMENT_SCALE]=n;break;case`subsurface`:r[i+K.SUBSURFACE]=n;break;case`subsurfaceRadiusScale`:r[i+K.SUBSURFACE_RADIUS_SCALE]=n;break;case`subsurfaceAnisotropy`:r[i+K.SUBSURFACE_ANISOTROPY]=n;break;case`anisotropy`:r[i+K.ANISOTROPY]=n;break;case`anisotropyRotation`:r[i+K.ANISOTROPY_ROTATION]=n;break;case`subsurfaceColor`:n.r===void 0?Array.isArray(n)&&this._writeColor(r,i+K.SUBSURFACE_COLOR,n[0],n[1],n[2]):this._writeColor(r,i+K.SUBSURFACE_COLOR,n.r,n.g,n.b);break;case`subsurfaceRadius`:Array.isArray(n)?(r[i+K.SUBSURFACE_RADIUS]=n[0],r[i+K.SUBSURFACE_RADIUS+1]=n[1],r[i+K.SUBSURFACE_RADIUS+2]=n[2]):n.x!==void 0&&(r[i+K.SUBSURFACE_RADIUS]=n.x,r[i+K.SUBSURFACE_RADIUS+1]=n.y,r[i+K.SUBSURFACE_RADIUS+2]=n.z);break;default:Yr.warn(`unknown material property: ${t}`);return}this.materialStorageAttr.needsUpdate=!0,(this._hostSet[e]??=new Map).set(t,Kr(n)),Qr.has(t)&&this._recomputeOpaqueBlockerForMaterial(e),this._notifyReset()}updateMaterialDataFromObject(t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=t*K.FLOATS_PER_MATERIAL;vn(r,i,n);for(let t of e.COLOR_OFFSETS)this._writeColor(r,i+t,r[i+t],r[i+t+1],r[i+t+2]);this._sources[t]=n.sources,this._hostSet[t]=void 0,this._patchTriangleSideForMaterial(t,r[i+K.SIDE]),this._recomputeOpaqueBlockerForMaterial(t),this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}updateMaterial(e,t){let n=this.sdfs.geometryExtractor.createMaterialObject(t);if(this._srgbTexPacked||this._linearTexPacked){let e=Ar(t);for(let[t,r]of ei)n[t]=this.getPackedTextureIndex(e[t],r)}this.updateMaterialDataFromObject(e,n)}updateTextureTransform(e,t,n){if(!this.materialStorageAttr){Yr.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*K.FLOATS_PER_MATERIAL,a={map:K.ALBEDO_TRANSFORM,normalMap:K.NORMAL_TRANSFORM,roughnessMap:K.ROUGHNESS_TRANSFORM,metalnessMap:K.METALNESS_TRANSFORM,emissiveMap:K.EMISSIVE_TRANSFORM,bumpMap:K.BUMP_TRANSFORM,displacementMap:K.DISPLACEMENT_TRANSFORM}[t];if(a===void 0){Yr.warn(`unknown texture name for transform update: ${t}`);return}for(let e=0;e<8;e++)i+a+e<r.length&&(r[i+a+e]=n[e]);this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}_notifyReset(){this.callbacks.onReset&&this.callbacks.onReset()}_recomputeOpaqueBlockerForMaterial(e){let t=this.materialStorageAttr?.array;if(!t)return;let n=e*K.FLOATS_PER_MATERIAL,r=lt({alphaMode:t[n+K.ALPHA_MODE],transparent:t[n+K.TRANSPARENT],transmission:t[n+K.TRANSMISSION],opacity:t[n+K.OPACITY]});this._patchTriangleFlagForMaterial(e,26,2,r)}_patchTriangleFlagForMaterial(e,t,n,r){let i=this.callbacks.getTriangleData?.(),a=i?.records,o=a?null:i?.array,s=i?.count|0;if(!o&&!a||s===0)return;let c=st.FLOATS_PER_TRIANGLE,l=(1<<n)-1<<t>>>0,u=(r<<t&l)>>>0,d=0;for(let t=0;t<s;t++){let n=a?a.chunkFor(t):o,r=a?a.baseOf(t):t*c;(n[r+Zr]&16777215)===e&&(n[r+Zr]=(n[r+Zr]&~l|u)>>>0,d++)}d>0&&this.callbacks.onTriangleDataChanged&&this.callbacks.onTriangleDataChanged()}_patchTriangleSideForMaterial(e,t){this._patchTriangleFlagForMaterial(e,24,2,t)}dispose(){this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null,this._sources=[],this._hostSet=[]}},ri=`function e(e,t,n,r){let i=n,a=n+r-1;for(;i<a;){let n=i+a>>1;e[n]<t?i=n+1:a=n}return i-n}function t(t,n,r){let i=n*r,a=new Float32Array(i),o=0;for(let e=0;e<r;e++){let i=Math.sin(Math.PI*(e+.5)/r);for(let r=0;r<n;r++){let s=e*n+r,c=t[4*s],l=t[4*s+1],u=t[4*s+2],d=(.2126*c+.7152*l+.0722*u)*i;a[s]=d,o+=d}}let s=o/i,c=0;for(let e=0;e<i;e++)a[e]=Math.max(0,a[e]-s),c+=a[e];let l=c>0,u=l?c:o,d=l?s:0;if(!l)for(let e=0;e<r;e++){let i=Math.sin(Math.PI*(e+.5)/r);for(let r=0;r<n;r++){let o=e*n+r,s=t[4*o],c=t[4*o+1],l=t[4*o+2];a[o]=(.2126*s+.7152*c+.0722*l)*i}}let f=new Float32Array(i),p=new Float32Array(r),m=0;for(let e=0;e<r;e++){let t=0;for(let r=0;r<n;r++){let i=e*n+r;t+=a[i],f[i]=t}if(t!==0)for(let r=e*n,i=e*n+n;r<i;r++)f[r]/=t;m+=t,p[e]=m}if(m!==0)for(let e=0,t=p.length;e<t;e++)p[e]/=m;let h=new Float32Array(r);for(let t=0;t<r;t++)h[t]=(e(p,(t+1)/r,0,r)+.5)/r;let g=new Float32Array(n*r);for(let t=0;t<r;t++)for(let r=0;r<n;r++){let i=t*n+r;g[i]=(e(f,(r+1)/n,t*n,n)+.5)/n}return{marginalData:h,conditionalData:g,totalSum:u,compensationDelta:d}}self.onmessage=function(e){let{floatData:n,width:r,height:i}=e.data;try{let e=t(n,r,i);self.postMessage({marginalData:e.marginalData,conditionalData:e.conditionalData,totalSum:e.totalSum,compensationDelta:e.compensationDelta,width:r,height:i},[e.marginalData.buffer,e.conditionalData.buffer])}catch(e){self.postMessage({error:e.message})}};`,ii=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,ri],{type:`text/javascript;charset=utf-8`});function ai(e){let t;try{if(t=ii&&(self.URL||self.webkitURL).createObjectURL(ii),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(ri),{type:`module`,name:e?.name})}}function oi(e,t,n=0,r=e.length){let i=n,a=n+r-1;for(;i<a;){let n=i+a>>1;e[n]<t?i=n+1:a=n}return i-n}function si(e,t,n){return .2126*e+.7152*t+.0722*n}function ci(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function li(e){let{width:t,height:n}=e.image,i=e.image.data,a=!1;if(!i){let r=new OffscreenCanvas(t,n).getContext(`2d`);r.drawImage(e.image,0,0,t,n),i=r.getImageData(0,0,t,n).data,a=!0}let o;if(e.type===r.FloatType&&i instanceof Float32Array)o=new Float32Array(i);else if(e.type===r.HalfFloatType){o=new Float32Array(i.length);for(let e=0,t=i.length;e<t;e++)o[e]=r.DataUtils.fromHalfFloat(i[e])}else{let e;e=i instanceof Int8Array||i instanceof Int16Array||i instanceof Int32Array?2**(8*i.BYTES_PER_ELEMENT-1)-1:2**(8*i.BYTES_PER_ELEMENT)-1,o=new Float32Array(i.length);for(let t=0,n=i.length;t<n;t++)o[t]=i[t]/e}if(!a&&e.colorSpace===r.SRGBColorSpace&&(a=!0),a)for(let e=0,t=o.length;e<t;e+=4)o[e]=ci(o[e]),o[e+1]=ci(o[e+1]),o[e+2]=ci(o[e+2]);if(e.flipY){let e=new Float32Array(o.length);for(let r=0;r<n;r++){let i=n-r-1,a=r*t*4,s=i*t*4;e.set(o.subarray(a,a+t*4),s)}o=e}return{floatData:o,width:t,height:n}}var ui=class e{constructor(){this.marginalData=new Float32Array([0,1]),this.conditionalData=new Float32Array([0,0,1,1]),this.totalSum=0,this.compensationDelta=0,this.width=0,this.height=0,this._worker=null}dispose(){this.marginalData=null,this.conditionalData=null,this._worker&&=(this._worker.terminate(),null)}updateFrom(t){let{floatData:n,width:r,height:i}=li(t),a=e.computeCDF(n,r,i);this.marginalData=a.marginalData,this.conditionalData=a.conditionalData,this.totalSum=a.totalSum,this.compensationDelta=a.compensationDelta,this.width=r,this.height=i}async updateFromAsync(e){let{floatData:t,width:n,height:r}=li(e);this._worker=new ai;try{let e=await new Promise((e,i)=>{this._worker.onmessage=t=>{t.data.error?i(Error(t.data.error)):e(t.data)},this._worker.onerror=i,this._worker.postMessage({floatData:t,width:n,height:r},[t.buffer])});this.marginalData=e.marginalData,this.conditionalData=e.conditionalData,this.totalSum=e.totalSum,this.compensationDelta=e.compensationDelta,this.width=e.width,this.height=e.height}finally{this._worker&&=(this._worker.terminate(),null)}}static computeCDF(e,t,n){let r=t*n,i=new Float32Array(r),a=0;for(let r=0;r<n;r++){let o=Math.sin(Math.PI*(r+.5)/n);for(let n=0;n<t;n++){let s=r*t+n,c=si(e[4*s],e[4*s+1],e[4*s+2])*o;i[s]=c,a+=c}}let o=a/r,s=0;for(let e=0;e<r;e++)i[e]=Math.max(0,i[e]-o),s+=i[e];let c=s>0,l=c?s:a,u=c?o:0;if(!c)for(let r=0;r<n;r++){let a=Math.sin(Math.PI*(r+.5)/n);for(let n=0;n<t;n++){let o=r*t+n;i[o]=si(e[4*o],e[4*o+1],e[4*o+2])*a}}let d=new Float32Array(r),f=new Float32Array(n),p=0;for(let e=0;e<n;e++){let n=0;for(let r=0;r<t;r++){let a=e*t+r;n+=i[a],d[a]=n}if(n!==0)for(let r=e*t,i=e*t+t;r<i;r++)d[r]/=n;p+=n,f[e]=p}if(p!==0)for(let e=0,t=f.length;e<t;e++)f[e]/=p;let m=new Float32Array(n),h=new Float32Array(r);for(let e=0;e<n;e++)m[e]=(oi(f,(e+1)/n)+.5)/n;for(let e=0;e<n;e++)for(let n=0;n<t;n++){let r=e*t+n;h[r]=(oi(d,(n+1)/t,e*t,t)+.5)/t}return{marginalData:m,conditionalData:h,totalSum:l,compensationDelta:u}}},di=j({origin:`vec3`,direction:`vec3`}),fi=j({color:`vec4`,emissive:`vec3`,emissiveIntensity:`float`,roughness:`float`,metalness:`float`,ior:`float`,transmission:`float`,thickness:`float`,clearcoat:`float`,clearcoatRoughness:`float`,opacity:`float`,transparent:`bool`,attenuationColor:`vec3`,attenuationDistance:`float`,dispersion:`float`,sheen:`float`,sheenRoughness:`float`,sheenColor:`vec3`,specularIntensity:`float`,specularColor:`vec3`,alphaTest:`float`,alphaMode:`int`,side:`int`,depthWrite:`int`,albedoMapIndex:`int`,emissiveMapIndex:`int`,normalMapIndex:`int`,bumpMapIndex:`int`,bumpScale:`float`,displacementScale:`float`,metalnessMapIndex:`int`,roughnessMapIndex:`int`,displacementMapIndex:`int`,normalScale:`vec2`,albedoTransform:`mat3`,emissiveTransform:`mat3`,normalTransform:`mat3`,bumpTransform:`mat3`,metalnessTransform:`mat3`,roughnessTransform:`mat3`,displacementTransform:`mat3`,iridescence:`float`,iridescenceIOR:`float`,iridescenceThicknessRange:`vec2`,subsurface:`float`,subsurfaceColor:`vec3`,subsurfaceRadius:`vec3`,subsurfaceRadiusScale:`float`,subsurfaceAnisotropy:`float`,anisotropy:`float`,anisotropyRotation:`float`,anisotropyMapIndex:`int`,transmissionMapIndex:`int`,clearcoatMapIndex:`int`,clearcoatRoughnessMapIndex:`int`,sheenColorMapIndex:`int`,sheenRoughnessMapIndex:`int`,iridescenceMapIndex:`int`,iridescenceThicknessMapIndex:`int`,specularIntensityMapIndex:`int`,specularColorMapIndex:`int`}),pi=j({transmission:`float`,clearcoat:`float`,clearcoatRoughness:`float`,sheenColor:`vec3`,sheenRoughness:`float`,iridescence:`float`,iridescenceThickness:`float`,specularIntensity:`float`,specularColor:`vec3`}),mi=j({color:`vec4`,ior:`float`,transmission:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,albedoMapIndex:`int`,opacity:`float`,transparent:`bool`,alphaTest:`float`,alphaMode:`int`,albedoTransform:`mat3`}),hi=j({shadowed:`vec3`,unoccluded:`vec3`});j({position:`vec3`,radius:`float`,material:fi});var gi=j({didHit:`bool`,dst:`float`,hitPoint:`vec3`,normal:`vec3`,uv:`vec2`,materialIndex:`int`,meshIndex:`int`,instanceLeaf:`int`,triangleIndex:`int`,boxTests:`int`,triTests:`int`});j({posA:`vec3`,posB:`vec3`,posC:`vec3`,uvA:`vec2`,uvB:`vec2`,uvC:`vec2`,normalA:`vec3`,normalB:`vec3`,normalC:`vec3`,material:fi,materialIndex:`int`,meshIndex:`int`}),j({color:`vec4`,samples:`int`});var _i=j({direction:`vec3`,value:`vec3`,pdf:`float`,isTransmission:`bool`,colorWeight:`vec3`}),vi=j({specular:`float`,diffuse:`float`,sheen:`float`,clearcoat:`float`,transmission:`float`,iridescence:`float`}),yi=j({Ta:`vec3`,Ba:`vec3`}),bi=j({NoL:`float`,NoV:`float`,NoH:`float`,VoH:`float`,LoH:`float`,ToH:`float`,BoH:`float`,ToV:`float`,BoV:`float`,ToL:`float`,BoL:`float`}),xi=j({compensation:`vec3`,E_total:`vec3`}),Si=j({f0:`vec3`,f90:`float`,eta:`float`,F0m:`vec3`,F0:`vec3`}),Ci=j({albedo:`vec4`,emissive:`vec3`,metalness:`float`,roughness:`float`,normal:`vec3`,hasTextures:`bool`}),wi=j({isMetallic:`bool`,isRough:`bool`,isSmooth:`bool`,isTransmissive:`bool`,hasClearcoat:`bool`,isEmissive:`bool`,complexityScore:`float`}),Ti=j({albedoUV:`vec2`,normalUV:`vec2`,metalnessUV:`vec2`,emissiveUV:`vec2`,bumpUV:`vec2`,roughnessUV:`vec2`,normalBumpSameUV:`bool`,metalRoughSameUV:`bool`,albedoEmissiveSameUV:`bool`,allSameUV:`bool`}),Ei=j({invRoughness:`float`,metalFactor:`float`,iorFactor:`float`,maxSheenColor:`float`});j({traversals:`int`,transmissiveTraversals:`int`,rayType:`int`,isPrimaryRay:`bool`,actualBounceDepth:`int`});var Di=(0,n.wgslFn)(`
|
|
116
116
|
fn offsetRayOrigin( p: vec3f, n: vec3f ) -> vec3f {
|
|
117
117
|
let step = select( vec3<i32>( 32 ), vec3<i32>( -32 ), ( p < vec3f( 0.0 ) ) != ( n < vec3f( 0.0 ) ) );
|
|
118
118
|
let far = bitcast<vec3f>( bitcast<vec3<i32>>( p ) + step );
|
|
@@ -552,13 +552,13 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
552
552
|
let Nh = T1 * t1 + T2 * t2 + Vh * sqrt( max( 0.0f, 1.0f - t1 * t1 - t2 * t2 ) );
|
|
553
553
|
return normalize( vec3f( alphaX * Nh.x, alphaY * Nh.y, max( 0.0f, Nh.z ) ) );
|
|
554
554
|
}
|
|
555
|
-
`),Rd=j({didScatter:`bool`,t:`float`,weight:`vec3`}),zd=j({sigmaT:`vec3`,sigmaS:`vec3`,sigmaA:`vec3`}),Bd=j({direction:`vec3`,throughput:`vec3`,didReflect:`bool`}),Vd=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();(0,n.If)((0,n.abs)(t).lessThan(.001),()=>{i.assign((0,n.float)(1).sub(r.x.mul(2)))}).Else(()=>{let e=(0,n.max)((0,n.float)(1).sub(t).add(t.mul(2).mul(r.x)),1e-4),a=(0,n.float)(1).sub(t.mul(t)).div(e);i.assign((0,n.float)(1).add(t.mul(t)).sub(a.mul(a)).div(t.mul(2)))}),i.assign((0,n.clamp)(i,-1,1));let a=(0,n.sqrt)((0,n.max)((0,n.float)(0),(0,n.float)(1).sub(i.mul(i)))),o=(0,n.float)(ji).mul(r.y);return Ki({N:e}).mul((0,n.vec3)(a.mul((0,n.cos)(o)),a.mul((0,n.sin)(o)),i))}),Hd=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=(0,n.max)(r,(0,n.vec3)(1e-4)),d=u.div(u.x.add(u.y).add(u.z)).toVar(),f=
|
|
555
|
+
`),Rd=j({didScatter:`bool`,t:`float`,weight:`vec3`}),zd=j({sigmaT:`vec3`,sigmaS:`vec3`,sigmaA:`vec3`}),Bd=j({direction:`vec3`,throughput:`vec3`,didReflect:`bool`}),Vd=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();(0,n.If)((0,n.abs)(t).lessThan(.001),()=>{i.assign((0,n.float)(1).sub(r.x.mul(2)))}).Else(()=>{let e=(0,n.max)((0,n.float)(1).sub(t).add(t.mul(2).mul(r.x)),1e-4),a=(0,n.float)(1).sub(t.mul(t)).div(e);i.assign((0,n.float)(1).add(t.mul(t)).sub(a.mul(a)).div(t.mul(2)))}),i.assign((0,n.clamp)(i,-1,1));let a=(0,n.sqrt)((0,n.max)((0,n.float)(0),(0,n.float)(1).sub(i.mul(i)))),o=(0,n.float)(ji).mul(r.y);return Ki({N:e}).mul((0,n.vec3)(a.mul((0,n.cos)(o)),a.mul((0,n.sin)(o)),i))}),Hd=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=(0,n.max)(r,(0,n.vec3)(1e-4)),d=u.div(u.x.add(u.y).add(u.z)).toVar(),f=_e(o,(0,n.int)(0),l.add((0,n.int)(10)),a,s,c).toVar(),p=(0,n.float)(0).toVar();(0,n.If)(f.lessThan(d.x),()=>{p.assign(e.x)}).ElseIf(f.lessThan(d.x.add(d.y)),()=>{p.assign(e.y)}).Else(()=>{p.assign(e.z)});let m=_e(o,(0,n.int)(0),l.add((0,n.int)(9)),a,s,c).toVar(),h=(0,n.log)((0,n.max)((0,n.float)(1).sub(m),1e-6)).negate().div((0,n.max)(p,1e-6)).toVar(),g=h.lessThan(i).toVar(),_=h.toVar(),v=(0,n.vec3)(0).toVar();return(0,n.If)(g,()=>{let r=(0,n.exp)(e.mul(h).negate()).toVar(),i=(0,n.dot)(d,e.mul(r));v.assign(t.mul(r).div((0,n.max)(i,1e-6)))}).Else(()=>{let t=(0,n.exp)(e.mul(i).negate()).toVar(),r=(0,n.dot)(d,t);v.assign(t.div((0,n.max)(r,1e-6))),_.assign(i)}),Rd({didScatter:g,t:_,weight:v})}),Ud=(0,n.Fn)(([e,t,r])=>{let i=(0,n.max)(t.mul(r),(0,n.vec3)(1e-4)),a=(0,n.vec3)(1).div(i),o=e.mul(a);return zd({sigmaT:a,sigmaS:o,sigmaA:(0,n.max)(a.sub(o),(0,n.vec3)(0))})}),Wd=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d])=>{let f=Bd({direction:(0,n.vec3)(0),throughput:(0,n.vec3)(1),didReflect:!1}).toVar(),p=(0,n.select)(i,t,t.negate()).toVar(),m=(0,n.select)(i,u,r.ior).toVar(),h=(0,n.select)(i,r.ior,d).toVar(),g=(0,n.abs)((0,n.dot)(p,e)),_=m.mul(m).div((0,n.max)(h.mul(h),Mi)).mul((0,n.float)(1).sub(g.mul(g))).greaterThan(1).toVar(),v=nd(g,h.div((0,n.max)(m,Mi))).toVar(),y=(0,n.clamp)(v,.02,.98).toVar(),b=_.or(_e(o,(0,n.int)(0),l.add((0,n.int)(11)),a,s,c).lessThan(y)).toVar();return f.didReflect.assign(b),(0,n.If)(b,()=>{let t=ge(o,(0,n.int)(0),l.add((0,n.int)(5)),a,s,c),i=(0,n.reflect)(e,Nd({N:p,roughness:r.roughness,Xi:t})).toVar();(0,n.If)((0,n.dot)(i,p).lessThanEqual(0),()=>{i.assign((0,n.reflect)(e,p))}),f.direction.assign(i),f.throughput.assign((0,n.vec3)(v.div((0,n.max)(y,.02))))}).Else(()=>{let t=(0,n.refract)(e,p,m.div((0,n.max)(h,Mi))).toVar();(0,n.If)((0,n.dot)(t,t).lessThan(1e-4),()=>{f.direction.assign((0,n.reflect)(e,p)),f.didReflect.assign(!0)}).Else(()=>{f.direction.assign((0,n.normalize)(t));let e=m.mul(m).div((0,n.max)(h.mul(h),Mi));f.throughput.assign((0,n.vec3)((0,n.float)(1).sub(v).div((0,n.max)((0,n.float)(1).sub(y),.02)).mul(e)))})}),f}),Gd=j({direction:`vec3`,throughput:`vec3`,didReflect:`bool`,pathWavelength:`float`}),Kd=j({continueRay:`bool`,isTransmissive:`bool`,isAlphaSkip:`bool`,isSubsurface:`bool`,didReflect:`bool`,entering:`bool`,direction:`vec3`,throughput:`vec3`,alpha:`float`,pathWavelength:`float`});j({ior:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,dispersion:`float`});var qd=j({wavelength:`float`,ior:`float`,colorWeight:`vec3`}),Jd=j({direction:`vec3`,halfVector:`vec3`,didReflect:`bool`,pdf:`float`,colorWeight:`vec3`,pathWavelength:`float`});j({m0_ior:`float`,m0_attenuationColor:`vec3`,m0_attenuationDistance:`float`,m0_dispersion:`float`,m1_ior:`float`,m1_attenuationColor:`vec3`,m1_attenuationDistance:`float`,m1_dispersion:`float`,m2_ior:`float`,m2_attenuationColor:`vec3`,m2_attenuationDistance:`float`,m2_dispersion:`float`,m3_ior:`float`,m3_attenuationColor:`vec3`,m3_attenuationDistance:`float`,m3_dispersion:`float`,depth:`int`});var Yd=(0,n.Fn)(([e,t,n])=>{let r=n.div(1e3);return e.add(t.mul(.03).div(r.mul(r)))}),Xd=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.select)(e.lessThan(t),r,i),o=e.sub(t).mul(a);return(0,n.exp)((0,n.float)(-.5).mul(o).mul(o))}),Zd=(0,n.Fn)(([e])=>(0,n.vec3)(Xd(e,442,.0624,.0374).mul(.362).add(Xd(e,599.8,.0264,.0323).mul(1.056)).sub(Xd(e,501.1,.049,.0382).mul(.065)),Xd(e,568.8,.0213,.0247).mul(.821).add(Xd(e,530.9,.0613,.0322).mul(.286)),Xd(e,437,.0845,.0278).mul(1.217).add(Xd(e,459,.0385,.0725).mul(.681)))),Qd=(0,n.Fn)(([e,t,r])=>{let i=(0,n.mix)((0,n.float)(380),(0,n.float)(700),r).toVar(),a=Yd(e,t,i),o=Zd(i).toVar();return qd({wavelength:i,ior:a,colorWeight:(0,n.max)((0,n.vec3)(o.x.mul(3.2406).sub(o.y.mul(1.5372)).sub(o.z.mul(.4986)),o.x.mul(-.9689).add(o.y.mul(1.8758)).add(o.z.mul(.0415)),o.x.mul(.0557).sub(o.y.mul(.204)).add(o.z.mul(1.057))),(0,n.vec3)(0)).mul((0,n.vec3)(1.819,2.773,2.928))})}),$d=(0,n.wgslFn)(`
|
|
556
556
|
fn calculateBeerLawAbsorption( attenuationColor: vec3f, attenuationDistance: f32, pathLength: f32 ) -> vec3f {
|
|
557
557
|
if ( attenuationDistance <= 0.0f ) { return vec3f( 1.0f ); }
|
|
558
558
|
let absorption = -log( max( attenuationColor, vec3f( 0.001f ) ) ) / attenuationDistance;
|
|
559
559
|
return exp( -absorption * pathLength );
|
|
560
560
|
}
|
|
561
|
-
`),ef=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p])=>{let m=Jd({direction:(0,n.vec3)(0),halfVector:(0,n.vec3)(0),didReflect:!1,pdf:(0,n.float)(0),colorWeight:(0,n.vec3)(1),pathWavelength:l}).toVar();return(0,n.If)(i.lessThanEqual(.05).and(o.greaterThan(0)),()=>{m.halfVector.assign(t),m.didReflect.assign(!1);let i=r,s=(0,n.select)(a,(0,n.float)(1).div(i),i).toVar();(0,n.If)(l.greaterThan(0),()=>{let e=Yd(r,o,l);s.assign((0,n.select)(a,(0,n.float)(1).div(e),e))}).Else(()=>{let e=qd.wrap(Qd(r,o,
|
|
561
|
+
`),ef=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p])=>{let m=Jd({direction:(0,n.vec3)(0),halfVector:(0,n.vec3)(0),didReflect:!1,pdf:(0,n.float)(0),colorWeight:(0,n.vec3)(1),pathWavelength:l}).toVar();return(0,n.If)(i.lessThanEqual(.05).and(o.greaterThan(0)),()=>{m.halfVector.assign(t),m.didReflect.assign(!1);let i=r,s=(0,n.select)(a,(0,n.float)(1).div(i),i).toVar();(0,n.If)(l.greaterThan(0),()=>{let e=Yd(r,o,l);s.assign((0,n.select)(a,(0,n.float)(1).div(e),e))}).Else(()=>{let e=qd.wrap(Qd(r,o,_e(u,(0,n.int)(0),p.add((0,n.int)(5)),c,d,f)));s.assign((0,n.select)(a,(0,n.float)(1).div(e.ior),e.ior)),m.colorWeight.assign(e.colorWeight),m.pathWavelength.assign(e.wavelength)});let h=(0,n.refract)(e.negate(),t,s).toVar();(0,n.If)((0,n.dot)(h,h).lessThan(.001),()=>{m.direction.assign((0,n.reflect)(e.negate(),t)),m.didReflect.assign(!0),m.pdf.assign(1)}).Else(()=>{m.direction.assign(h),m.pdf.assign(1)})}).Else(()=>{let h=(0,n.max)(Ni,i),g=Nd({N:t,roughness:h,Xi:s}).toVar();m.halfVector.assign(g);let _=(0,n.select)(a,(0,n.float)(1).div(r),r).toVar();(0,n.If)(o.greaterThan(0),()=>{(0,n.If)(l.greaterThan(0),()=>{let e=Yd(r,o,l);_.assign((0,n.select)(a,(0,n.float)(1).div(e),e))}).Else(()=>{let e=qd.wrap(Qd(r,o,_e(u,(0,n.int)(0),p.add((0,n.int)(5)),c,d,f)));_.assign((0,n.select)(a,(0,n.float)(1).div(e.ior),e.ior)),m.colorWeight.assign(e.colorWeight),m.pathWavelength.assign(e.wavelength)})});let v=(0,n.clamp)((0,n.dot)(g,e),.001,1).toVar(),y=(0,n.clamp)((0,n.dot)(t,g),.001,1).toVar(),b=ad(y,h).toVar(),x=(0,n.refract)(e.negate(),g,_).toVar();(0,n.If)((0,n.dot)(x,x).lessThan(.001),()=>{m.direction.assign((0,n.reflect)(e.negate(),g)),m.didReflect.assign(!0),m.pdf.assign(b.mul(y).div((0,n.max)((0,n.float)(4).mul(v),Fi)))}).Else(()=>{m.direction.assign(x),m.didReflect.assign(!1);let e=(0,n.clamp)((0,n.dot)(g,x),.001,1),t=v.add(_.mul(e)),r=(0,n.abs)(e).div(t.mul(t));m.pdf.assign(b.mul(y).mul(r))})}),m}),tf=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=Gd({direction:(0,n.vec3)(0),throughput:(0,n.vec3)(1),didReflect:!1,pathWavelength:f}).toVar(),m=(0,n.select)(i,t,t.negate()).toVar(),h=e.negate().toVar(),g=(0,n.select)(i,u,r.ior).toVar(),_=(0,n.select)(i,r.ior,d).toVar(),v=(0,n.abs)((0,n.dot)(m,e)),y=g.mul(g).div(_.mul(_)).mul((0,n.float)(1).sub(v.mul(v))).greaterThan(1).toVar(),b=nd(v,_.div(g)).toVar(),x=(0,n.float)(0).toVar();(0,n.If)(y,()=>{x.assign(1)}).Else(()=>{let e=b,t=(0,n.float)(.95);x.assign((0,n.mix)(e,t,r.metalness))}),x.assign((0,n.clamp)(x,.05,.95));let S=y.or(_e(o,(0,n.int)(0),l.add((0,n.int)(4)),a,s,c).lessThan(x)).toVar();p.didReflect.assign(S);let C=ge(o,(0,n.int)(0),l.add((0,n.int)(4)),a,s,c).toVar();return(0,n.If)(S,()=>{(0,n.If)(r.roughness.greaterThan(.05),()=>{let e=Jd.wrap(ef(h,m,r.ior,r.roughness,i,(0,n.float)(0),C,a,(0,n.float)(0),o,s,c,l));p.direction.assign(e.direction)}).Else(()=>{p.direction.assign((0,n.reflect)(e,m))}),p.throughput.assign(r.color.xyz.mul(b).div((0,n.max)(x,.05)))}).Else(()=>{(0,n.If)(r.roughness.greaterThan(.05).or(r.dispersion.greaterThan(0)),()=>{let e=Jd.wrap(ef(h,m,r.ior,r.roughness,i,r.dispersion,C,a,f,o,s,c,l));p.pathWavelength.assign(e.pathWavelength),(0,n.If)(e.didReflect,()=>{p.direction.assign(e.direction),p.didReflect.assign(!0),p.throughput.assign(r.color.xyz.div((0,n.max)((0,n.float)(1).sub(x),.05)))}).Else(()=>{p.direction.assign(e.direction),p.throughput.assign(e.colorWeight)})}).Else(()=>{p.direction.assign((0,n.refract)(e,m,g.div(_))),p.throughput.assign((0,n.vec3)(1))}),(0,n.If)(p.didReflect.not(),()=>{p.throughput.mulAssign(r.color.xyz),p.throughput.mulAssign(g.mul(g).div((0,n.max)(_.mul(_),Mi))),p.throughput.mulAssign((0,n.float)(1).sub(b).div((0,n.max)((0,n.float)(1).sub(x),.05)))})}),p}),nf=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=Kd({continueRay:!1,isTransmissive:!1,isAlphaSkip:!1,isSubsurface:!1,didReflect:!1,entering:!1,direction:e.direction,throughput:(0,n.vec3)(1),alpha:(0,n.float)(1),pathWavelength:f}).toVar();return(0,n.If)(r.alphaMode.equal((0,n.int)(0)).and(r.transmission.lessThanEqual(0)).and(r.subsurface.lessThanEqual(0)),()=>{}).Else(()=>{let m=_e(a,(0,n.int)(0),c.add((0,n.int)(6)),i,o,s),h=_e(a,(0,n.int)(0),c.add((0,n.int)(7)),i,o,s),g=ne({state:i}),_=(0,n.bool)(!1).toVar();(0,n.If)(r.alphaMode.equal((0,n.int)(2)),()=>{let t=r.color.a.mul(r.opacity);(0,n.If)(m.greaterThan(t),()=>{p.continueRay.assign(!0),p.direction.assign(e.direction),p.throughput.assign((0,n.vec3)(1)),p.alpha.assign(0),p.isAlphaSkip.assign(!0),_.assign(!0)}).Else(()=>{p.alpha.assign(t)})}),(0,n.If)(_.not().and(r.alphaMode.equal((0,n.int)(1))),()=>{let t=(0,n.select)(r.alphaTest.greaterThan(0),r.alphaTest,(0,n.float)(.5));(0,n.If)(r.color.a.mul(r.opacity).lessThan(t),()=>{p.continueRay.assign(!0),p.direction.assign(e.direction),p.throughput.assign((0,n.vec3)(1)),p.alpha.assign(0),p.isAlphaSkip.assign(!0),_.assign(!0)}).Else(()=>{p.alpha.assign(1)})}),(0,n.If)(_.not().and(r.transmission.greaterThan(0)).and(l.greaterThan((0,n.int)(0))),()=>{(0,n.If)(h.lessThan(r.transmission),()=>{let i=(0,n.dot)(e.direction,t).lessThan(0),l=Gd.wrap(tf(e.direction,t,r,i,g,a,o,s,c,u,d,f));p.direction.assign(l.direction),p.throughput.assign(l.throughput),p.continueRay.assign(!0),p.isTransmissive.assign(!0),p.didReflect.assign(l.didReflect),p.entering.assign(i),p.alpha.assign((0,n.float)(1).sub(r.transmission)),p.pathWavelength.assign(l.pathWavelength)})}),(0,n.If)(_.not().and(r.subsurface.greaterThan(0)),()=>{let l=(0,n.dot)(e.direction,t).lessThan(0);(0,n.If)(l.not().or(_e(a,(0,n.int)(0),c.add((0,n.int)(8)),i,o,s).lessThan(r.subsurface)),()=>{let n=Bd.wrap(Wd(e.direction,t,r,l,i,a,o,s,c,u,d)).toVar();p.direction.assign(n.direction),p.throughput.assign(n.throughput),p.continueRay.assign(!0),p.isSubsurface.assign(!0),p.didReflect.assign(n.didReflect),p.entering.assign(l),p.alpha.assign(1)})})}),p}),rf=xt.BUCKET_LAYER_STRIDE,af=null,of=null;function sf(e,t){af=e,of=t}var cf=(e,t,r)=>{let i=t.div((0,n.int)(rf)).toVar(),a=t.sub(i.mul((0,n.int)(rf))).toVar(),o=(0,n.If)(i.equal((0,n.int)(0)),()=>{r(e[0],a)});for(let t=1;t<e.length;t++)o=o.ElseIf(i.equal((0,n.int)(t)),()=>{r(e[t],a)});return o},lf=(e,t,r)=>{let i=(0,n.vec4)(0).toVar();return cf(e,t,(e,t)=>i.assign((0,n.texture)(e,r).depth(t))),i},uf=(e,t)=>{let r=(0,n.vec2)(1).toVar();return cf(e,t,e=>r.assign((0,n.vec2)(1).div((0,n.vec2)((0,n.textureSize)(e))))),r};function df(){return of}function ff(){let e=new r.DataArrayTexture(new Uint8Array([255,255,255,255]),1,1,1);return e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e.generateMipmaps=!1,e.needsUpdate=!0,e}function pf(e){let t=xt.MATERIAL_BUCKET_COUNT,r=[];for(let i=0;i<t;i++){let t=e&&e[i];r.push((0,n.texture)(t||ff()))}return r}function mf(e,t){if(!(!e||!t))for(let n=0;n<e.length;n++)t[n]&&e[n]&&(e[n].value=t[n])}var hf=(0,n.wgslFn)(`
|
|
562
562
|
fn isIdentityTransform( transform: mat3x3f ) -> bool {
|
|
563
563
|
return transform[0][0] == 1.0f
|
|
564
564
|
&& transform[1][1] == 1.0f
|
|
@@ -712,7 +712,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
712
712
|
let p = o + xu * x + yv * y + z0 * z;
|
|
713
713
|
return vec4f( p, 1.0f / S );
|
|
714
714
|
}
|
|
715
|
-
`);rn();var cp=Wt(`shader`),lp=class{constructor(){this.prevColorTexNode=null,this.prevAlbedoTexNode=null,this.prevNormalDepthTexNode=null,this._sceneTextureNodes=null}updateSceneTextures(e){let t=this._sceneTextureNodes,n=e.environment;n.environmentTexture&&t.envTex&&(t.envTex.value=n.environmentTexture),e.goboMaps&&t.goboMapsTex&&(t.goboMapsTex.value=e.goboMaps),e.iesProfiles&&t.iesProfilesTex&&(t.iesProfilesTex.value=e.iesProfiles),cp.debug(`scene textures updated in-place`)}updateGoboMaps(e){let t=this._sceneTextureNodes;!t||!t.goboMapsTex||e&&(t.goboMapsTex.value=e)}updateIESProfiles(e){let t=this._sceneTextureNodes;!t||!t.iesProfilesTex||e&&(t.iesProfilesTex.value=e)}getSceneTextureNodes(){return this._sceneTextureNodes}createSceneTextureNodes(e,t){let i=e.triangleStorageNode,a=e.bvhStorageNode,o=e.materialData.materialStorageNode,s=e.lightStorageNode;sa(e.uniforms.get(`enableAlphaShadows`));let c=(0,n.texture)(e.environment.environmentTexture),l=t.getReadTextures();this.prevColorTexNode=(0,n.texture)(l.color),this.prevAlbedoTexNode=(0,n.texture)(l.albedo),this.prevNormalDepthTexNode=(0,n.texture)(l.normalDepth);let u=()=>{let e=new r.DataArrayTexture(new Uint8Array([255,255,255,255]),1,1,1);return e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e.generateMipmaps=!1,e.needsUpdate=!0,(0,n.texture)(e)},d=e.goboMaps?(0,n.texture)(e.goboMaps):u();Qf(d);let f=e.iesProfiles?(0,n.texture)(e.iesProfiles):u();np(f);let p={triStorage:i,bvhStorage:a,matStorage:o,lightBufferStorage:s,envTex:c,goboMapsTex:d,iesProfilesTex:f};return this._sceneTextureNodes=p,p}dispose(){this.prevColorTexNode=null,this.prevAlbedoTexNode=null,this.prevNormalDepthTexNode=null,this._sceneTextureNodes=null}},up=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,t,n){if(typeof e==`number`){let r=t[n[e]],i=new dp;return i.minX=r.minX,i.minY=r.minY,i.minZ=r.minZ,i.maxX=r.maxX,i.maxY=r.maxY,i.maxZ=r.maxZ,i.triangleOffset=r.triangleOffset,i.triangleCount=r.triangleCount,i}let r=this.buildSubtree(e[0],t,n),i=this.buildSubtree(e[1],t,n),a=new dp;return a.leftChild=r,a.rightChild=i,a.minX=Math.min(r.minX,i.minX),a.minY=Math.min(r.minY,i.minY),a.minZ=Math.min(r.minZ,i.minZ),a.maxX=Math.max(r.maxX,i.maxX),a.maxY=Math.max(r.maxY,i.maxY),a.maxZ=Math.max(r.maxZ,i.maxZ),a}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},dp=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},fp=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}},pp=1073741824,mp=1073741824,hp=15,gp=16,_p=2147483648,vp=(e,t)=>~(e<<4|t)>>>0,yp=e=>e>=_p,bp=e=>~e>>>0>>>4,xp=e=>~e&15;function Sp(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/gp,r=e=>{let n=e*gp;return t[n+3]===pp&&t[n+1]>0&&t[n+1]<=hp},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*gp;t[n+3]>=mp||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*gp),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*gp,s=n*gp;c.set(e.subarray(o,o+gp),s),!(t[o+3]>=mp)&&(l[s+3]=Cp(t,t[o+3],r,i),l[s+7]=Cp(t,t[o+7],r,i))}return c}function Cp(e,t,n,r){let i=t*gp;return n(t)?vp(e[i],e[i+1]):r[t]}var wp=(e,t,n)=>e>=_p?vp(bp(e)+n,xp(e)):e+t;function Tp(e,t,n,r=0,i=e.length){for(let a=r;a<i;a+=gp){if(e[a+3]===pp){e[a]+=n;continue}e[a+3]=wp(e[a+3],t,n),e[a+7]=wp(e[a+7],t,n)}}rn();var Ep=Wt(`bvh`),Dp=1073741824,Op=1073741826,kp=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),Ap=1073741824;function jp(e,t){if(e>=Ap)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${Ap}`);return e}var Mp=null;function Np(e){Mp=e}var Pp={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},Fp=Pp.FLOATS_PER_TRIANGLE,Ip=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),Lp=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},Rp=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=Ip(this.triangles),n=Pp.POSITION_A_OFFSET,r=Pp.POSITION_B_OFFSET,i=Pp.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*Fp,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){return this.totalTriangles=e.byteLength/(Fp*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),this.useWorker&&Mp&&typeof Worker<`u`?new Promise((r,i)=>{let a=a=>{let o=this.totalTriangles,s=typeof SharedArrayBuffer<`u`;Ep.debug(`SharedArrayBuffer ${s?`enabled`:`unavailable (using transfer fallback)`}`);let c=s?new SharedArrayBuffer(o*Fp*4):null;a.onmessage=e=>{let{bvhData:t,triangles:o,originalToBvh:s,error:l,progress:u,treeletStats:d}=e.data;if(l){a.terminate(),i(Error(l));return}if(u!==void 0&&n){n(u);return}d&&(this.splitStats=d),a.terminate(),r({bvhData:t,bvhRoot:!0,reorderedTriangles:c?new Float32Array(c):o,originalToBvh:s||null})},a.onerror=e=>{a.terminate(),i(e)};let l=e.buffer,u={triangleData:l,triangleByteOffset:e.byteOffset,triangleByteLength:e.byteLength,triangleCount:o,depth:t,reportProgress:!!n,sharedReorderBuffer:c,treeletOptimization:{enabled:this.enableTreeletOptimization,size:this.treeletSize,passes:this.treeletOptimizationPasses,minImprovement:this.treeletMinImprovement},reinsertionOptimization:{enabled:this.enableReinsertionOptimization,batchSizeRatio:this.reinsertionBatchSizeRatio,maxIterations:this.reinsertionMaxIterations}};a.postMessage(u,[l])};try{a(Mp())}catch(i){Ep.warn(`worker creation failed, falling back to synchronous build:`,i),r(this._buildSyncAndFlatten(e,t,n))}}):new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?Sp(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(e,t=30,n=null,r=null){let i=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=e,this.totalTriangles=e.byteLength/(Fp*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let a=this.totalTriangles,o=performance.now();this.centroids=new Float32Array(a*3),this.bMin=new Float32Array(a*3),this.bMax=new Float32Array(a*3),this.indices=new Uint32Array(a),this.mortonCodes=new Uint32Array(a),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-o,this.sortTrianglesByMortonCode();let s=performance.now(),c=this.buildNodeRecursive(0,a,t,n);if(this.splitStats.sahBuildTime=performance.now()-s,this.enableTreeletOptimization&&this.totalTriangles>1e3){let e=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,t=new up(this.traversalCost,this.intersectionCost);t.setTreeletSize(e),t.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let i=n?t=>{n(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{t.optimizeBVH(c,i)}catch(t){Ep.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=t.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let i=performance.now()-r;this.splitStats.treeletOptimizationTime=i;let a=t.getStatistics();this.splitStats.treeletsProcessed=a.treeletsProcessed,this.splitStats.treeletsImproved=a.treeletsImproved,this.splitStats.averageSAHImprovement=a.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new fp(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=n?e=>{n(e)}:null;try{e.optimizeBVH(c,t)}catch(e){Ep.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let l=performance.now();this.applySAOrdering(c),this.splitStats.saOrderTime=performance.now()-l;let u=performance.now(),d=this.triangles,f=r||new d.constructor(a*Fp);for(let e=0;e<a;e++){let t=this.indices[e]*Fp,n=e*Fp;f.set(d.subarray(t,t+Fp),n)}this.reorderedTriangleData=f;let p=new Uint32Array(a);for(let e=0;e<a;e++)p[this.indices[e]]=e;this.originalToBvhMap=p,this.splitStats.reorderTime=performance.now()-u,this.splitStats.totalBuildTime=performance.now()-i;let m=this.splitStats.totalBuildTime,h=this.splitStats;return Ep.debug(`${J.n(a)} tris → ${J.n(this.totalNodes)} nodes in ${J.ms(m)} | SAH ${h.sahSplits} objMed ${h.objectMedianSplits} spatMed ${h.spatialMedianSplits} failed ${h.failedSplits}`+(h.treeletsProcessed?` | treelets ${h.treeletsImproved}/${h.treeletsProcessed} improved`:``)+(h.reinsertionsApplied?` | reinsertions ${h.reinsertionsApplied}`:``)),n&&n(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,c}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new Lp;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new Lp;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}jp(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=kp(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=Dp}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}jp(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=kp(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=Op,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=Dp}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;jp(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=kp(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<Dp&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}},zp={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11},Bp=zp.FLOATS_PER_TRIANGLE,Vp=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),Hp=e=>e instanceof Uint32Array?e:new Uint32Array(e.buffer,e.byteOffset,e.length),Up=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:e,idx:t?e.viewAs(Uint32Array):Hp(e)}},Wp=(e,t)=>e.chunked?e.f.chunkFor(t):e.f,Gp=(e,t)=>e.chunked?e.idx.chunkFor(t):e.idx,Kp=(e,t)=>e.chunked?e.chunked.baseOf(t):t*Yp,qp=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:t?t.viewAs(Float32Array):Vp(e),u:t?e:Hp(e)}};function Jp(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}var Yp=16,Xp=1073741824,Zp=1073741825,Qp=1e-12;function $p(e,t,n,r,i,a){let o=e[t+4],s=e[t+5],c=e[t+6],l=e[t+7],u=e[t+8],d=e[t+9],f=e[t+10],p=e[t+11],m=e[t+12],h=e[t+13],g=e[t+14],_=e[t+15],v=d*g-f*h,y=f*m-u*g,b=u*h-d*m,x=o*v+s*y+c*b,S=o===1&&d===1&&g===1&&s===0&&c===0&&u===0&&f===0&&m===0&&h===0&&l===0&&p===0&&_===0,C=(Math.abs(o)+Math.abs(s)+Math.abs(c))*(Math.abs(u)+Math.abs(d)+Math.abs(f))*(Math.abs(m)+Math.abs(h)+Math.abs(g));if(S||!Number.isFinite(x)||Math.abs(x)<=Qp*C){for(let e=0;e<6;e++)i[a+e]=n[r+e];return}let w=1/x,T=v*w,E=y*w,D=b*w,O=(c*h-s*g)*w,k=(o*g-c*m)*w,A=(s*m-o*h)*w,j=(s*f-c*d)*w,M=(c*u-o*f)*w,N=(o*d-s*u)*w,P=1/0,F=1/0,I=1/0,L=-1/0,ee=-1/0,te=-1/0;for(let e=0;e<8;e++){let t=(e&1?n[r+3]:n[r])-l,i=(e&2?n[r+4]:n[r+1])-p,a=(e&4?n[r+5]:n[r+2])-_,o=T*t+O*i+j*a,s=E*t+k*i+M*a,c=D*t+A*i+N*a;o<P&&(P=o),o>L&&(L=o),s<F&&(F=s),s>ee&&(ee=s),c<I&&(I=c),c>te&&(te=c)}i[a]=P,i[a+1]=F,i[a+2]=I,i[a+3]=L,i[a+4]=ee,i[a+5]=te}function em(e,t,n,r,i){let a=zp.POSITION_A_OFFSET,o=zp.POSITION_B_OFFSET,s=zp.POSITION_C_OFFSET,c=1/0,l=1/0,u=1/0,d=-1/0,f=-1/0,p=-1/0;for(let r=0;r<n;r++){let n=t+r,i=e.chunked?e.f.chunkFor(n):e.f,m=e.chunked?e.chunked.baseOf(n):n*Bp;c=Math.min(c,i[m+a],i[m+o],i[m+s]),l=Math.min(l,i[m+a+1],i[m+o+1],i[m+s+1]),u=Math.min(u,i[m+a+2],i[m+o+2],i[m+s+2]),d=Math.max(d,i[m+a],i[m+o],i[m+s]),f=Math.max(f,i[m+a+1],i[m+o+1],i[m+s+1]),p=Math.max(p,i[m+a+2],i[m+o+2],i[m+s+2])}r[i]=c,r[i+1]=l,r[i+2]=u,r[i+3]=d,r[i+4]=f,r[i+5]=p}var tm=new Float32Array(12);function nm(e,t,n,r,i){let a=Wp(e,t),o=Gp(e,t),s=Kp(e,t),c=(t-i)*6,l=o[s+3];if(l===Xp){em(n,o[s],o[s+1],r,c);return}if(l===Zp){$p(a,s,r,(o[s]-i)*6,r,c);return}let u=o[s+7],d=r,f=(l-i)*6;yp(l)&&(em(n,bp(l),xp(l),tm,0),d=tm,f=0);let p=r,m=(u-i)*6;yp(u)&&(em(n,bp(u),xp(u),tm,6),p=tm,m=6),a[s]=d[f],a[s+1]=d[f+1],a[s+2]=d[f+2],a[s+4]=d[f+3],a[s+5]=d[f+4],a[s+6]=d[f+5],a[s+8]=p[m],a[s+9]=p[m+1],a[s+10]=p[m+2],a[s+12]=p[m+3],a[s+13]=p[m+4],a[s+14]=p[m+5];for(let e=0;e<3;e++)r[c+e]=Math.min(d[f+e],p[m+e]),r[c+3+e]=Math.max(d[f+3+e],p[m+3+e])}var rm=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let r=n.length,i=qp(e);for(let e=0;e<r;e++){let r=n[e],a=i.chunked?i.f.chunkFor(e):i.f,o=i.chunked?i.u.chunkFor(e):i.u,s=i.chunked?i.chunked.baseOf(e):e*Bp,c=r*9,l=t[c],u=t[c+1],d=t[c+2],f=t[c+3],p=t[c+4],m=t[c+5],h=t[c+6],g=t[c+7],_=t[c+8];a[s+zp.POSITION_A_OFFSET]=l,a[s+zp.POSITION_A_OFFSET+1]=u,a[s+zp.POSITION_A_OFFSET+2]=d,a[s+zp.POSITION_B_OFFSET]=f,a[s+zp.POSITION_B_OFFSET+1]=p,a[s+zp.POSITION_B_OFFSET+2]=m,a[s+zp.POSITION_C_OFFSET]=h,a[s+zp.POSITION_C_OFFSET+1]=g,a[s+zp.POSITION_C_OFFSET+2]=_;let v=f-l,y=p-u,b=m-d,x=h-l,S=g-u,C=_-d,w=Jp(y*C-b*S,b*x-v*C,v*S-y*x);o[s+zp.NORMAL_A_PACKED_OFFSET]=w,o[s+zp.NORMAL_B_PACKED_OFFSET]=w,o[s+zp.NORMAL_C_PACKED_OFFSET]=w}}refitRange(e,t,n,r){let i=qp(t);r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let a=Up(e);for(let e=n+r-1;e>=n;e--)nm(a,e,i,this._bounds,n)}refit(e,t,n){let r=qp(t);n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let i=Up(e);for(let e=n-1;e>=0;e--)nm(i,e,r,this._bounds,0)}},im="var e=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,n,r){if(typeof e==`number`){let i=n[r[e]],a=new t;return a.minX=i.minX,a.minY=i.minY,a.minZ=i.minZ,a.maxX=i.maxX,a.maxY=i.maxY,a.maxZ=i.maxZ,a.triangleOffset=i.triangleOffset,a.triangleCount=i.triangleCount,a}let i=this.buildSubtree(e[0],n,r),a=this.buildSubtree(e[1],n,r),o=new t;return o.leftChild=i,o.rightChild=a,o.minX=Math.min(i.minX,a.minX),o.minY=Math.min(i.minY,a.minY),o.minZ=Math.min(i.minZ,a.minZ),o.maxX=Math.max(i.maxX,a.maxX),o.maxY=Math.max(i.maxY,a.maxY),o.maxZ=Math.max(i.maxZ,a.maxZ),o}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},t=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},n=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}};const r={silent:0,error:1,warn:2,info:3,debug:4},i=`info`,a=`rayzeeLogLevel`,o=`rayzeeLogNamespaces`,s=`color:#7c8494`,c=`color:inherit`;let l=null,u=null;function d(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function f(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function p(){if(l!==null)return l;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in r?(l=r[e],l):(l=r[d(a)]??r[i],l)}function m(){if(u!==null)return u;let e=globalThis.__RAYZEE_LOG_NS__??d(o);return u=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],u}function h(e,t){if(t<r.debug)return!0;let n=m();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function g(e,t,n){if(e>p()||!h(t,e))return;let i=e===r.error?console.error:e===r.warn?console.warn:console.log,a=`[${t}]`;typeof n[0]==`string`?i(`%c${a}%c ${n[0]}`,s,c,...n.slice(1)):i(`%c${a}`,s,...n)}const _={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${_.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},v={levels:r,setLevel(e){return e in r?(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e],f(a,e===i?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(r).join(`, `)}`),this.getLevel())},getLevel(){let e=p();return Object.keys(r).find(t=>r[t]===e)},isEnabled(e){return(r[e]??r.debug)<=p()},only(...e){let t=e.flat().filter(Boolean);return u=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),f(o,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return l=null,u=null,this.getLevel()}};function y(e){return{namespace:e,error:(...t)=>g(r.error,e,t),warn:(...t)=>g(r.warn,e,t),info:(...t)=>g(r.info,e,t),debug:(...t)=>g(r.debug,e,t),isEnabled:e=>v.isEnabled(e),summary(t,n=[]){let i=n.filter(Boolean);if(i.length===0||!console.groupCollapsed){g(r.info,e,[t]),i.forEach(t=>g(r.debug,e,[t]));return}r.info>p()||((p()>=r.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,s,c),i.forEach(e=>console.log(e)),console.groupEnd())}}}function b(e){e&&e in r&&(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e])}const x=1073741824,S=(e,t)=>~(e<<4|t)>>>0;function C(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/16,r=e=>{let n=e*16;return t[n+3]===1073741824&&t[n+1]>0&&t[n+1]<=15},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*16;t[n+3]>=x||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*16),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*16,s=n*16;c.set(e.subarray(o,o+16),s),!(t[o+3]>=x)&&(l[s+3]=w(t,t[o+3],r,i),l[s+7]=w(t,t[o+7],r,i))}return c}function w(e,t,n,r){let i=t*16;return n(t)?S(e[i],e[i+1]):r[t]}const T=y(`bvh`),E=1073741824,D=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),O=1073741824;function k(e,t){if(e>=O)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${O}`);return e}const A={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},j=A.FLOATS_PER_TRIANGLE,M=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length);var N=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},P=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=M(this.triangles),n=A.POSITION_A_OFFSET,r=A.POSITION_B_OFFSET,i=A.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*j,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){if(this.totalTriangles=e.byteLength/(j*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),!(this.useWorker&&null))return new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?C(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(t,r=30,i=null,a=null){let o=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=t,this.totalTriangles=t.byteLength/(j*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let s=this.totalTriangles,c=performance.now();this.centroids=new Float32Array(s*3),this.bMin=new Float32Array(s*3),this.bMax=new Float32Array(s*3),this.indices=new Uint32Array(s),this.mortonCodes=new Uint32Array(s),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-c,this.sortTrianglesByMortonCode();let l=performance.now(),u=this.buildNodeRecursive(0,s,r,i);if(this.splitStats.sahBuildTime=performance.now()-l,this.enableTreeletOptimization&&this.totalTriangles>1e3){let t=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,n=new e(this.traversalCost,this.intersectionCost);n.setTreeletSize(t),n.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let t=i?t=>{i(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{n.optimizeBVH(u,t)}catch(t){T.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=n.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let a=performance.now()-r;this.splitStats.treeletOptimizationTime=a;let o=n.getStatistics();this.splitStats.treeletsProcessed=o.treeletsProcessed,this.splitStats.treeletsImproved=o.treeletsImproved,this.splitStats.averageSAHImprovement=o.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new n(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=i?e=>{i(e)}:null;try{e.optimizeBVH(u,t)}catch(e){T.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let d=performance.now();this.applySAOrdering(u),this.splitStats.saOrderTime=performance.now()-d;let f=performance.now(),p=this.triangles,m=a||new p.constructor(s*j);for(let e=0;e<s;e++){let t=this.indices[e]*j,n=e*j;m.set(p.subarray(t,t+j),n)}this.reorderedTriangleData=m;let h=new Uint32Array(s);for(let e=0;e<s;e++)h[this.indices[e]]=e;this.originalToBvhMap=h,this.splitStats.reorderTime=performance.now()-f,this.splitStats.totalBuildTime=performance.now()-o;let g=this.splitStats.totalBuildTime,v=this.splitStats;return T.debug(`${_.n(s)} tris → ${_.n(this.totalNodes)} nodes in ${_.ms(g)} | SAH ${v.sahSplits} objMed ${v.objectMedianSplits} spatMed ${v.spatialMedianSplits} failed ${v.failedSplits}`+(v.treeletsProcessed?` | treelets ${v.treeletsImproved}/${v.treeletsProcessed} improved`:``)+(v.reinsertionsApplied?` | reinsertions ${v.reinsertionsApplied}`:``)),i&&i(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,u}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new N;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new N;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}k(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=D(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=E}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}k(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=D(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=1073741826,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=E}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;k(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=D(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<E&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};const F=y(`bvh`);self.onmessage=function(e){let t=e.data,n=t.type;b(t.logLevel),n===`buildPhase1`?I(t):n===`assemble`?L(t):R(t)};function I(e){let{sharedTriangleData:t,sharedCentroids:n,sharedBMin:r,sharedBMax:i,sharedIndices:a,sharedMortonCodes:o,triangleCount:s,depth:c,parallelDepth:l,reportProgress:u,treeletOptimization:d}=e;try{let e=new P;d&&e.setTreeletConfig(d);let f=u?e=>{self.postMessage({type:`progress`,progress:e})}:null;e.triangles=new Uint32Array(t),e.centroids=new Float32Array(n),e.bMin=new Float32Array(r),e.bMax=new Float32Array(i),e.indices=new Uint32Array(a),e.mortonCodes=new Uint32Array(o),e.totalTriangles=s,e.totalNodes=0,e.processedTriangles=0,e.lastProgressUpdate=performance.now(),e.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,initTime:0,sahBuildTime:0,reorderTime:0};let p=performance.now(),m=performance.now();e.initializeTriangleArrays(),e.splitStats.initTime=performance.now()-m,e.sortTrianglesByMortonCode(),e.frontierTasks=[];let h=performance.now(),g=e.buildNodeRecursiveToDepth(0,s,c,l,f);e.splitStats.sahBuildTime=performance.now()-h,e.applySAOrdering(g);let v=performance.now(),{flatData:y,frontierMap:b,nodeCount:x}=e.flattenBVHWithFrontier(g),S=performance.now()-v,C=performance.now()-p;F.debug(`phase 1 ${_.ms(C)} (init ${_.ms(e.splitStats.initTime)} · morton ${_.ms(e.splitStats.mortonSortTime)} · SAH ${_.ms(e.splitStats.sahBuildTime)} · flatten ${_.ms(S)}) · ${e.frontierTasks.length} frontier tasks`),self.postMessage({type:`phase1Result`,topFlatData:y,topNodeCount:x,frontierTasks:e.frontierTasks,frontierMap:b,splitStats:e.splitStats},[y.buffer])}catch(e){F.error(`phase 1 failed:`,e),self.postMessage({type:`error`,error:e.message})}}function L(e){let{topFlatData:t,topNodeCount:n,frontierMap:r,subtreeResults:i,sharedTriangleData:a,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:l}=e;try{let e=performance.now(),u=new P().assembleParallelBVH(t,n,r,i),d=l?C(u):u,f=new Uint32Array(o);if(s){let e=new Uint32Array(a),t=new Uint32Array(s);for(let n=0;n<c;n++){let r=f[n]*20,i=n*20;t.set(e.subarray(r,r+20),i)}}let p=new Uint32Array(c);for(let e=0;e<c;e++)p[f[e]]=e;let m=performance.now()-e;F.debug(`phase 3 assemble + reorder ${_.ms(m)} (${_.mb(d.byteLength)} BVH)`),self.postMessage({type:`assembleResult`,bvhData:d,originalToBvh:p,triangleCount:c},[d.buffer,p.buffer])}catch(e){F.error(`assembly failed:`,e),self.postMessage({type:`error`,error:e.message})}}function R(e){let{triangleData:t,triangleByteOffset:n,triangleByteLength:r,depth:i,reportProgress:a,treeletOptimization:o,reinsertionOptimization:s,sharedReorderBuffer:c,maxLeafSize:l,numBins:u,maxBins:d,minBins:f,foldLeaves:p}=e,m=new P;l!==void 0&&(m.maxLeafSize=l),u!==void 0&&(m.numBins=u),d!==void 0&&(m.maxBins=d),f!==void 0&&(m.minBins=f);try{o&&m.setTreeletConfig(o),s&&m.setReinsertionConfig(s);let e=a?e=>{self.postMessage({progress:e})}:null,l=n===void 0?new Uint32Array(t):new Uint32Array(t,n,r/4),u=c?new Uint32Array(c):null,d=m.buildSync(l,i,e,u),f=performance.now(),h=m.flattenBVH(d),g=p?C(h):h,v=performance.now()-f;F.debug(`flatten ${_.ms(v)} (${_.mb(g.byteLength)})`);let y=m.originalToBvhMap||null;if(c){let e=[g.buffer];y&&e.push(y.buffer),self.postMessage({bvhData:g,originalToBvh:y,triangleCount:l.length/20,treeletStats:m.splitStats},e)}else{let e=m.reorderedTriangleData,t=e.byteLength/80,n=[g.buffer,e.buffer];y&&n.push(y.buffer),self.postMessage({bvhData:g,triangles:e,originalToBvh:y,triangleCount:t,treeletStats:m.splitStats},n)}}catch(e){F.error(`build failed:`,e),self.postMessage({error:e.message})}}",am=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,im],{type:`text/javascript;charset=utf-8`});function om(e){let t;try{if(t=am&&(self.URL||self.webkitURL).createObjectURL(am),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(im),{type:`module`,name:e?.name})}}var sm="var e=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,n,r){if(typeof e==`number`){let i=n[r[e]],a=new t;return a.minX=i.minX,a.minY=i.minY,a.minZ=i.minZ,a.maxX=i.maxX,a.maxY=i.maxY,a.maxZ=i.maxZ,a.triangleOffset=i.triangleOffset,a.triangleCount=i.triangleCount,a}let i=this.buildSubtree(e[0],n,r),a=this.buildSubtree(e[1],n,r),o=new t;return o.leftChild=i,o.rightChild=a,o.minX=Math.min(i.minX,a.minX),o.minY=Math.min(i.minY,a.minY),o.minZ=Math.min(i.minZ,a.minZ),o.maxX=Math.max(i.maxX,a.maxX),o.maxY=Math.max(i.maxY,a.maxY),o.maxZ=Math.max(i.maxZ,a.maxZ),o}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},t=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},n=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}};const r={silent:0,error:1,warn:2,info:3,debug:4},i=`info`,a=`rayzeeLogLevel`,o=`rayzeeLogNamespaces`,s=`color:#7c8494`,c=`color:inherit`;let l=null,u=null;function d(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function f(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function p(){if(l!==null)return l;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in r?(l=r[e],l):(l=r[d(a)]??r[i],l)}function m(){if(u!==null)return u;let e=globalThis.__RAYZEE_LOG_NS__??d(o);return u=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],u}function h(e,t){if(t<r.debug)return!0;let n=m();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function g(e,t,n){if(e>p()||!h(t,e))return;let i=e===r.error?console.error:e===r.warn?console.warn:console.log,a=`[${t}]`;typeof n[0]==`string`?i(`%c${a}%c ${n[0]}`,s,c,...n.slice(1)):i(`%c${a}`,s,...n)}const _={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${_.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},v={levels:r,setLevel(e){return e in r?(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e],f(a,e===i?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(r).join(`, `)}`),this.getLevel())},getLevel(){let e=p();return Object.keys(r).find(t=>r[t]===e)},isEnabled(e){return(r[e]??r.debug)<=p()},only(...e){let t=e.flat().filter(Boolean);return u=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),f(o,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return l=null,u=null,this.getLevel()}};function y(e){return{namespace:e,error:(...t)=>g(r.error,e,t),warn:(...t)=>g(r.warn,e,t),info:(...t)=>g(r.info,e,t),debug:(...t)=>g(r.debug,e,t),isEnabled:e=>v.isEnabled(e),summary(t,n=[]){let i=n.filter(Boolean);if(i.length===0||!console.groupCollapsed){g(r.info,e,[t]),i.forEach(t=>g(r.debug,e,[t]));return}r.info>p()||((p()>=r.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,s,c),i.forEach(e=>console.log(e)),console.groupEnd())}}}const b=1073741824,x=(e,t)=>~(e<<4|t)>>>0;function S(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/16,r=e=>{let n=e*16;return t[n+3]===1073741824&&t[n+1]>0&&t[n+1]<=15},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*16;t[n+3]>=b||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*16),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*16,s=n*16;c.set(e.subarray(o,o+16),s),!(t[o+3]>=b)&&(l[s+3]=C(t,t[o+3],r,i),l[s+7]=C(t,t[o+7],r,i))}return c}function C(e,t,n,r){let i=t*16;return n(t)?x(e[i],e[i+1]):r[t]}const w=y(`bvh`),T=1073741824,E=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),D=1073741824;function O(e,t){if(e>=D)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${D}`);return e}const k={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},A=k.FLOATS_PER_TRIANGLE,j=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length);var M=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},N=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=j(this.triangles),n=k.POSITION_A_OFFSET,r=k.POSITION_B_OFFSET,i=k.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*A,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){if(this.totalTriangles=e.byteLength/(A*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),!(this.useWorker&&null))return new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?S(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(t,r=30,i=null,a=null){let o=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=t,this.totalTriangles=t.byteLength/(A*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let s=this.totalTriangles,c=performance.now();this.centroids=new Float32Array(s*3),this.bMin=new Float32Array(s*3),this.bMax=new Float32Array(s*3),this.indices=new Uint32Array(s),this.mortonCodes=new Uint32Array(s),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-c,this.sortTrianglesByMortonCode();let l=performance.now(),u=this.buildNodeRecursive(0,s,r,i);if(this.splitStats.sahBuildTime=performance.now()-l,this.enableTreeletOptimization&&this.totalTriangles>1e3){let t=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,n=new e(this.traversalCost,this.intersectionCost);n.setTreeletSize(t),n.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let t=i?t=>{i(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{n.optimizeBVH(u,t)}catch(t){w.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=n.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let a=performance.now()-r;this.splitStats.treeletOptimizationTime=a;let o=n.getStatistics();this.splitStats.treeletsProcessed=o.treeletsProcessed,this.splitStats.treeletsImproved=o.treeletsImproved,this.splitStats.averageSAHImprovement=o.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new n(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=i?e=>{i(e)}:null;try{e.optimizeBVH(u,t)}catch(e){w.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let d=performance.now();this.applySAOrdering(u),this.splitStats.saOrderTime=performance.now()-d;let f=performance.now(),p=this.triangles,m=a||new p.constructor(s*A);for(let e=0;e<s;e++){let t=this.indices[e]*A,n=e*A;m.set(p.subarray(t,t+A),n)}this.reorderedTriangleData=m;let h=new Uint32Array(s);for(let e=0;e<s;e++)h[this.indices[e]]=e;this.originalToBvhMap=h,this.splitStats.reorderTime=performance.now()-f,this.splitStats.totalBuildTime=performance.now()-o;let g=this.splitStats.totalBuildTime,v=this.splitStats;return w.debug(`${_.n(s)} tris → ${_.n(this.totalNodes)} nodes in ${_.ms(g)} | SAH ${v.sahSplits} objMed ${v.objectMedianSplits} spatMed ${v.spatialMedianSplits} failed ${v.failedSplits}`+(v.treeletsProcessed?` | treelets ${v.treeletsImproved}/${v.treeletsProcessed} improved`:``)+(v.reinsertionsApplied?` | reinsertions ${v.reinsertionsApplied}`:``)),i&&i(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,u}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new M;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new M;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}O(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=E(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=T}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}O(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=E(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=1073741826,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=T}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;O(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=E(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<T&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};self.onmessage=function(t){let{tasks:r,sharedTriangleData:i,sharedCentroids:a,sharedBMin:o,sharedBMax:s,sharedIndices:c,triangleCount:l,maxLeafSize:u,numBins:d,maxBins:f,minBins:p,treeletConfig:m,reinsertionConfig:h,reportProgress:g}=t.data;for(let t=0;t<r.length;t++){let _=r[t];try{let t=new N;t.maxLeafSize=u,t.numBins=d,t.maxBins=f,t.minBins=p,t.triangles=new Float32Array(i),t.centroids=new Float32Array(a),t.bMin=new Float32Array(o),t.bMax=new Float32Array(s),t.indices=new Uint32Array(c),t.totalTriangles=l,t.totalNodes=0,t.processedTriangles=0,t.lastProgressUpdate=performance.now(),t.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,initTime:0,sahBuildTime:0,reorderTime:0};let r=g?e=>{self.postMessage({type:`progress`,taskId:_.taskId,progress:e})}:null,v=performance.now(),y=t.buildNodeRecursive(_.start,_.end,_.depth,r,_.preMinX,_.preMinY,_.preMinZ,_.preMaxX,_.preMaxY,_.preMaxZ);if(m&&m.enabled&&_.end-_.start>1e3){let n=_.end-_.start>5e4,r=n?3:m.size||5,i=n?10:20,a=new e(t.traversalCost,t.intersectionCost);a.setTreeletSize(r),a.setMinImprovement(m.minImprovement||.02),a.setMaxTreelets(i);let o=m.passes||1;for(let e=0;e<o;e++)try{a.optimizeBVH(y,null)}catch(t){console.error(`[BVHSubtreeWorker] Treelet pass ${e+1} error:`,t);break}}if(h&&h.enabled&&_.end-_.start>1e3){let e=new n(t.traversalCost,t.intersectionCost);h.batchSizeRatio&&e.setBatchSizeRatio(h.batchSizeRatio),h.maxIterations&&e.setMaxIterations(h.maxIterations);try{e.optimizeBVH(y,null)}catch(e){console.error(`[BVHSubtreeWorker] Reinsertion error:`,e)}}t.applySAOrdering(y);let b=t.flattenBVH(y),x=b.length/16,S=performance.now()-v;console.log(`[BVHSubtreeWorker] Task ${_.taskId}: ${(_.end-_.start).toLocaleString()} triangles, ${x} nodes, ${Math.round(S)}ms`),self.postMessage({type:`subtreeResult`,taskId:_.taskId,flatData:b,nodeCount:x},[b.buffer])}catch(e){console.error(`[BVHSubtreeWorker] Task ${_.taskId} error:`,e),self.postMessage({type:`error`,taskId:_.taskId,error:e.message})}}};",cm=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,sm],{type:`text/javascript;charset=utf-8`});function lm(e){let t;try{if(t=cm&&(self.URL||self.webkitURL).createObjectURL(cm),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(sm),{type:`module`,name:e?.name})}}rn(),Np(()=>new om);var um=Wt(`bvh`),dm=20,fm=5e4,pm=8;function mm(e,t,n,r){let i=e.byteLength/(dm*4),a=Math.min(navigator.hardwareConcurrency||4,pm),o=Math.ceil(Math.log2(a*2.5+1));return um.debug(`parallel build ${J.n(i)} triangles · ${a} workers · parallelDepth ${o}`),new Promise((s,c)=>{(async()=>{let l=e.buffer instanceof SharedArrayBuffer&&e.byteOffset===0&&e.byteLength===e.buffer.byteLength,u=l?e.buffer:new SharedArrayBuffer(e.byteLength);l||new Uint32Array(u).set(e),e=null;let d=new SharedArrayBuffer(i*3*4),f=new SharedArrayBuffer(i*3*4),p=new SharedArrayBuffer(i*3*4),m=new SharedArrayBuffer(i*4),h=new SharedArrayBuffer(i*4),g=new om,_=null,v=[g],y={id:null},b=!1,x=()=>{y.id&&=(clearTimeout(y.id),null);for(let e of v)try{e.terminate()}catch{}},S=e=>{if(!b){b=!0,um.warn(`parallel build failed (${e}), falling back to single worker`),x();try{let e=new ArrayBuffer(u.byteLength);new Uint32Array(e).set(new Uint32Array(u)),s(gm(new Uint32Array(e),t,n,r))}catch(e){c(e)}}};g.onerror=e=>{S(`coordinator error: ${e.message}`)},g.onmessage=e=>{let t=e.data;if(t.error||t.type===`error`){S(t.error);return}if(t.type===`progress`&&n){n(Math.floor(t.progress*.3));return}if(t.type===`phase1Result`){_=t.splitStats,hm(t,a,u,d,f,p,m,null,i,n,g,v,x,S,s,y,r).catch(e=>S(e.message));return}if(t.type===`assembleResult`){b=!0,x(),s({bvhData:t.bvhData,bvhRoot:!0,order:new Uint32Array(m),triangles:new Uint32Array(u),originalToBvh:t.originalToBvh||null,splitStats:_||{}});return}},n&&n(0),g.postMessage({type:`buildPhase1`,sharedTriangleData:u,sharedCentroids:d,sharedBMin:f,sharedBMax:p,sharedIndices:m,sharedMortonCodes:h,triangleCount:i,depth:t,parallelDepth:o,reportProgress:!!n,treeletOptimization:r.treeletOptimization})})().catch(e=>{um.warn(`parallel build setup failed:`,e),c(e)})})}async function hm(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g){let{topFlatData:_,topNodeCount:v,frontierTasks:y,frontierMap:b}=e;if(!y||y.length===0){um.debug(`no frontier tasks, assembling with top-level tree only`),u.postMessage({type:`assemble`,topFlatData:_,topNodeCount:v,frontierMap:[],subtreeResults:[],sharedTriangleData:n,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:g.foldLeaves},[_.buffer]);return}um.debug(`phase 2 distributing ${y.length} tasks across ${t} workers`);let x=[...y].sort((e,t)=>t.end-t.start-(e.end-e.start)),S=Array.from({length:Math.min(t,x.length)},()=>[]),C=Array(S.length).fill(0);for(let e of x){let t=0;for(let e=1;e<C.length;e++)C[e]<C[t]&&(t=e);S[t].push(e),C[t]+=e.end-e.start}let w=[],T=0,E=y.length,D=y.reduce((e,t)=>e+(t.end-t.start),0),O=0;h.id=setTimeout(()=>{p(`Phase 2 timeout (30s)`)},3e4);let k=()=>{clearTimeout(h.id),h.id=null,l&&l(85);let t=[];e.topFlatData&&e.topFlatData.buffer&&t.push(e.topFlatData.buffer);for(let e of w)e.flatData&&e.flatData.buffer&&t.push(e.flatData.buffer);u.postMessage({type:`assemble`,topFlatData:e.topFlatData,topNodeCount:v,frontierMap:b,subtreeResults:w,sharedTriangleData:n,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:g.foldLeaves},t)},A=S.length;for(let e=0;e<A;e++){let t=S[e];if(t.length===0)continue;let s=new lm;d.push(s),s.onerror=e=>{p(`subtree worker error: ${e.message}`)},s.onmessage=e=>{let t=e.data;if(t.type===`error`){p(`subtree task ${t.taskId} error: ${t.error}`);return}if(t.type===`progress`&&l){let e=30+Math.floor(O/D*55);l(Math.min(e,85));return}if(t.type===`subtreeResult`){w.push({taskId:t.taskId,flatData:t.flatData,nodeCount:t.nodeCount});let e=y.find(e=>e.taskId===t.taskId);if(e&&(O+=e.end-e.start),T++,l){let e=30+Math.floor(O/D*55);l(Math.min(e,85))}if(T===E){for(let e of d)if(e!==u)try{e.terminate()}catch{}k()}}},s.postMessage({tasks:t,sharedTriangleData:n,sharedCentroids:r,sharedBMin:i,sharedBMax:a,sharedIndices:o,triangleCount:c,maxLeafSize:g.maxLeafSize,numBins:g.numBins,maxBins:g.maxBins,minBins:g.minBins,treeletConfig:g.treeletOptimization,reinsertionConfig:g.reinsertionOptimization,reportProgress:!!l})}}function gm(e,t,n,r){return new Promise((i,a)=>{(async()=>{let o=new om,s=e.byteLength/(dm*4),c=typeof SharedArrayBuffer<`u`?new SharedArrayBuffer(s*dm*4):null;o.onmessage=e=>{let{bvhData:t,triangles:r,originalToBvh:s,error:l,progress:u,treeletStats:d}=e.data;if(l){o.terminate(),a(Error(l));return}if(u!==void 0&&n){n(u);return}o.terminate(),i({bvhData:t,bvhRoot:!0,reorderedTriangles:c?new Uint32Array(c):r,originalToBvh:s||null,splitStats:d||{}})},o.onerror=e=>{o.terminate(),a(e)};let l=e.buffer;o.postMessage({triangleData:l,triangleByteOffset:e.byteOffset,triangleByteLength:e.byteLength,triangleCount:s,depth:t,reportProgress:!!n,sharedReorderBuffer:c,treeletOptimization:r.treeletOptimization,reinsertionOptimization:r.reinsertionOptimization,foldLeaves:r.foldLeaves},[l])})().catch(e=>{um.warn(`single worker fallback failed:`,e),a(e)})})}function _m(e){return typeof Worker<`u`&&typeof SharedArrayBuffer<`u`&&e>=fm}var vm=Float64Array.from([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function ym(e,t){return e[t]*(e[t+5]*e[t+10]-e[t+6]*e[t+9])-e[t+4]*(e[t+1]*e[t+10]-e[t+2]*e[t+9])+e[t+8]*(e[t+1]*e[t+6]-e[t+2]*e[t+5])}function bm(e,t,n){let r=ym(e,t);if(!Number.isFinite(r)||Math.abs(r)<1e-20)return n.set(vm),n;let i=1/r;return n[0]=(e[t+5]*e[t+10]-e[t+6]*e[t+9])*i,n[1]=(e[t+2]*e[t+9]-e[t+1]*e[t+10])*i,n[2]=(e[t+1]*e[t+6]-e[t+2]*e[t+5])*i,n[3]=0,n[4]=(e[t+6]*e[t+8]-e[t+4]*e[t+10])*i,n[5]=(e[t]*e[t+10]-e[t+2]*e[t+8])*i,n[6]=(e[t+2]*e[t+4]-e[t]*e[t+6])*i,n[7]=0,n[8]=(e[t+4]*e[t+9]-e[t+5]*e[t+8])*i,n[9]=(e[t+1]*e[t+8]-e[t]*e[t+9])*i,n[10]=(e[t]*e[t+5]-e[t+1]*e[t+4])*i,n[11]=0,n[12]=-(n[0]*e[t+12]+n[4]*e[t+13]+n[8]*e[t+14]),n[13]=-(n[1]*e[t+12]+n[5]*e[t+13]+n[9]*e[t+14]),n[14]=-(n[2]*e[t+12]+n[6]*e[t+13]+n[10]*e[t+14]),n[15]=1,n}function xm(e,t,n,r){for(let i=0;i<4;i++){let a=n+i*4,o=t[a],s=t[a+1],c=t[a+2],l=t[a+3];for(let t=0;t<4;t++)r[i*4+t]=e[t]*o+e[4+t]*s+e[8+t]*c+e[12+t]*l}return r}function Sm(e){for(let t=0;t<16;t++)if(e[t]!==vm[t])return!1;return!0}function Cm(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=0;i<8;i++){let a=e[t+(i&1?3:0)],f=e[t+(i&2?4:1)],p=e[t+(i&4?5:2)],m=n[r]*a+n[r+4]*f+n[r+8]*p+n[r+12],h=n[r+1]*a+n[r+5]*f+n[r+9]*p+n[r+13],g=n[r+2]*a+n[r+6]*f+n[r+10]*p+n[r+14];m<o&&(o=m),m>l&&(l=m),h<s&&(s=h),h>u&&(u=h),g<c&&(c=g),g>d&&(d=g)}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}function wm(e,t){for(let n=0;n<16;n++)if(e[t+n]!==vm[n])return!1;return!0}var Tm=class e{constructor(){this.count=0,this.templateCount=0,this.totalBLASNodes=0,this.tlasNodeCount=0,this.allocate(0)}allocate(e,t=e,n=null,r=null){this.count=e,this.templateCount=t,this.isSet=new Uint8Array(e),this.sourceMesh=r&&r.length>=e?r:new Int32Array(e),this.tlasLeafIndex=new Int32Array(e).fill(-1),this.visible=new Uint8Array(e).fill(1),this.flipWinding=new Uint8Array(e),this.tplBakeInverse=null,n&&n.length>=e*16?(this.world=n,this.worldPooled=!0):(this.world=new Float32Array(e*16),this.worldPooled=!1),this.tplTriOffset=new Int32Array(t),this.tplTriCount=new Int32Array(t),this.tplExpandedStart=new Int32Array(t),this.tplNodeCount=new Int32Array(t),this.tplBlasOffset=new Int32Array(t),this.tplOwner=new Int32Array(t).fill(-1),this.tplObjectAABB=new Float32Array(t*6),this._placementRuns=null,this.originalToBvhMap=new Map,this.bvhToOriginal=new Map,this.blasData=new Map}_place(e,t,n,r){this.isSet[e]=1,this.sourceMesh[e]=t;let i=e*16;if(!n){this.world.set(vm,i),this.flipWinding[e]=0;return}if(n!==this.world)for(let e=0;e<16;e++)this.world[i+e]=n[r+e];this.flipWinding[e]=+(ym(this.world,i)<0)}setEntry({meshIndex:e,blasNodeCount:t,triOffset:n,triCount:r,originalToBvhMap:i,bvhData:a,matrixWorld:o=null,matrixOffset:s=0,expandedStart:c=null,sourceMesh:l=null}){let u=l??e;this._place(e,u,o,s),this.tplTriOffset[u]=n,this.tplTriCount[u]=r,this.tplExpandedStart[u]=c??n,this.tplNodeCount[u]=t,this.tplOwner[u]=e,i&&this.originalToBvhMap.set(u,i),a&&this.blasData.set(u,a)}setAlias(e,t,n=null,r=null,i=null,a=0){if(!this.isSet[t])throw Error(`InstanceTable.setAlias: owner ${t} not built`);let o=i??e,s=this.sourceMesh[t];this._place(e,o,n,a),o!==s&&(this.tplTriOffset[o]=this.tplTriOffset[s],this.tplTriCount[o]=this.tplTriCount[s],this.tplNodeCount[o]=this.tplNodeCount[s],this.tplExpandedStart[o]=r??this.tplExpandedStart[s],this.tplOwner[o]=this.tplOwner[s])}get setCount(){let e=0;for(let t=0;t<this.count;t++)e+=this.isSet[t];return e}setPlacementMatrix(e,t,n=0){this._place(e,this.sourceMesh[e],t,n)}placementRunOf(e){if(!this._placementRuns){let e=this._placementRuns=new Map;for(let t=0;t<this.count;t++){let n=this.sourceMesh[t],r=e.get(n);r?r.count++:e.set(n,{start:t,count:1})}}return this._placementRuns.get(e)??null}isOwner(e){return this.tplOwner[this.sourceMesh[e]]===e}triOffsetOf(e){return this.tplTriOffset[this.sourceMesh[e]]}triCountOf(e){return this.tplTriCount[this.sourceMesh[e]]}expandedStartOf(e){return this.tplExpandedStart[this.sourceMesh[e]]}blasOffsetOf(e){return this.tplBlasOffset[this.sourceMesh[e]]}blasNodeCountOf(e){return this.tplNodeCount[this.sourceMesh[e]]}setBlasNodeCount(e,t){this.tplNodeCount[this.sourceMesh[e]]=t}setBvhToOriginal(e,t){this.bvhToOriginal.set(this.sourceMesh[e],t)}bvhToOriginalOf(e){let t=this.sourceMesh[e],n=this.bvhToOriginal.get(t);if(n)return n;let r=this.tplOwner[t];return(r>=0?this.bvhToOriginal.get(this.sourceMesh[r]):null)||null}matrixWorldOf(e){return this.world.subarray(e*16,e*16+16)}matrixInverseOf(e){return bm(this.world,e*16,new Float64Array(16))}writeWorldAABB(e,t,n){if(!this.isSet[e]){for(let e=0;e<6;e++)t[n+e]=0;return}Cm(this.tplObjectAABB,this.sourceMesh[e]*6,this.world,e*16,t,n)}writeWorldAABBs(e){let t=this.tplObjectAABB,n=this.world,r=this.sourceMesh,i=this.isSet;for(let a=0;a<this.count;a++){let o=a*6;if(!i[a]){e[o]=0,e[o+1]=0,e[o+2]=0,e[o+3]=0,e[o+4]=0,e[o+5]=0;continue}Cm(t,r[a]*6,n,a*16,e,o)}}entryAt(e){if(!this.isSet[e])return null;let t=this.sourceMesh[e],n=this.tplOwner[t];return{meshIndex:e,blasOffset:this.tplBlasOffset[t],blasNodeCount:this.tplNodeCount[t],triOffset:this.tplTriOffset[t],triCount:this.tplTriCount[t],expandedStart:this.tplExpandedStart[t],sourceMesh:t,sharedFrom:n===e?null:n,matrixWorld:this.matrixWorldOf(e),matrixInverse:this.matrixInverseOf(e),flipWinding:!!this.flipWinding[e],bvhToOriginal:this.bvhToOriginal.get(t)||null,visible:!!this.visible[e],tlasLeafIndex:this.tlasLeafIndex[e]}}setVisibility(e,t){this.isSet[e]&&(this.visible[e]=+!!t)}computeAABBs(e,{owners:t=!0}={}){for(let n=0;t&&n<this.templateCount;n++){if(this.tplOwner[n]<0)continue;let t=this.blasData.get(n);t&&this._readRootAABB(Array.isArray(t)?t[0]:t,n,e,this.tplObjectAABB,n*6)}for(let e=0;e<this.templateCount;e++){let t=this.tplOwner[e];if(t<0||this.blasData.has(e))continue;let n=this.sourceMesh[t];n!==e&&this.tplObjectAABB.copyWithin(e*6,n*6,n*6+6)}}recomputeAABB(e,t,n){let r=this.sourceMesh[e],i=this.tplBlasOffset[r],a=t.chunks?t.chunkFor(i).subarray(t.baseOf(i),t.baseOf(i)+16):t.subarray(i*16,i*16+16);this._readRootAABB(a,r,n,this.tplObjectAABB,r*6)}_readRootAABB(t,n,r,i,a){e.rootAABB(t,r,this.tplTriOffset[n],this.tplTriCount[n],i,a)}static rootAABB(e,t,n,r,i,a){if(!e||yt(e)[3]===_t.TRIANGLE_LEAF){Em(t,n,r,i,a);return}i[a]=Math.min(e[0],e[8]),i[a+1]=Math.min(e[1],e[9]),i[a+2]=Math.min(e[2],e[10]),i[a+3]=Math.max(e[4],e[12]),i[a+4]=Math.max(e[5],e[13]),i[a+5]=Math.max(e[6],e[14])}_computeAABBFromTriangles(e,t,n,r){Em(t,this.tplTriOffset[e],this.tplTriCount[e],n,r)}assignOffsets(e){this.tlasNodeCount=e;let t=e;for(let e=0;e<this.templateCount;e++){let n=this.tplOwner[e];n<0||this.sourceMesh[n]!==e||(this.tplBlasOffset[e]=t,t+=this.tplNodeCount[e])}for(let e=0;e<this.templateCount;e++){let t=this.tplOwner[e];if(t<0)continue;let n=this.sourceMesh[t];n!==e&&(this.tplBlasOffset[e]=this.tplBlasOffset[n])}this.totalBLASNodes=t-e,bt(t,`combined TLAS + BLAS node count`)}get totalNodeCount(){return this.tlasNodeCount+this.totalBLASNodes}clear(){this.allocate(0),this.totalBLASNodes=0,this.tlasNodeCount=0}};function Em(e,t,n,r,i){let a=st.FLOATS_PER_TRIANGLE,o=e&&e.chunks?e.viewAs(Float32Array):null,s=o?null:e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),c=1/0,l=1/0,u=1/0,d=-1/0,f=-1/0,p=-1/0;for(let e=0;e<n;e++){let n=t+e,r=o?o.chunkFor(n):s,i=o?o.baseOf(n):n*a;for(let e=0;e<=8;e+=4){let t=r[i+e],n=r[i+e+1],a=r[i+e+2];t<c&&(c=t),n<l&&(l=n),a<u&&(u=a),t>d&&(d=t),n>f&&(f=n),a>p&&(p=a)}}r[i]=c,r[i+1]=l,r[i+2]=u,r[i+3]=d,r[i+4]=f,r[i+5]=p}var Dm=16,Om=32,km=e=>e<Om?e:Om,Am=8,jm=64,Mm=new Float64Array(16),Nm=class e{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0,this._binCounts=new Int32Array(Om*3),this._binBounds=new Float64Array(Om*6*3),this._binSuffix=new Float64Array(Om),this._binSuffixCount=new Int32Array(Om),this._order=null,this._stackI=null,this._stackB=null,this._stackFrames=0,this._sortScratch=[],this._suffix=null,this._bounds=new Float64Array(12),this._extent=new Float64Array(3),this._cMin=new Float64Array(3)}static nodeCountFor(e){return e>0?e*2-1:0}releaseFlattenBuffer(){this._flatBuffer=null,this._flatBufferCapacity=0}build(t){let n=new Float64Array(t.count*6);t.writeWorldAABBs(n);let r=this.buildStructure(n,t.count);return e.fillLeaves(r.data,r.nodeCount,t),r}buildStructure(t,n){let r=e.nodeCountFor(n);if(n===0)return{data:new Float32Array,nodeCount:0};bt(r,`TLAS node count`);let i=r*Dm;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer,o=yt(a);(!this._order||this._order.length<n)&&(this._order=new Int32Array(n));let s=this._order;for(let e=0;e<n;e++)s[e]=e;this._ensureStack(jm);let c=0,l=0,u=0,d=n,f=this._bounds;this._rangeBounds(t,s,u,d,f,0);let p=f[0],m=f[1],h=f[2],g=f[3],_=f[4],v=f[5];for(;;){if(d-u===1){let e=l*Dm;o[e]=0,o[e+1]=s[u],a[e+2]=0,o[e+3]=_t.BLAS_POINTER_LEAF}else{let e=this._partition(t,s,u,d,p,m,h,g,_,v),n=e-u,r=l+1,i=r+(n*2-1),y=l*Dm;a[y]=f[0],a[y+1]=f[1],a[y+2]=f[2],o[y+3]=r,a[y+4]=f[3],a[y+5]=f[4],a[y+6]=f[5],o[y+7]=i,a[y+8]=f[6],a[y+9]=f[7],a[y+10]=f[8],a[y+11]=0,a[y+12]=f[9],a[y+13]=f[10],a[y+14]=f[11],a[y+15]=0;let b=n<=d-e,x=b?0:6,S=b?6:0;c=this._push(c,b?i:r,b?e:u,b?d:e,f,S),l=b?r:i,b?d=e:u=e,p=f[x],m=f[x+1],h=f[x+2],g=f[x+3],_=f[x+4],v=f[x+5];continue}if(c===0)break;c--;let e=c*3,n=c*6;l=this._stackI[e],u=this._stackI[e+1],d=this._stackI[e+2],p=this._stackB[n],m=this._stackB[n+1],h=this._stackB[n+2],g=this._stackB[n+3],_=this._stackB[n+4],v=this._stackB[n+5]}return{data:a.subarray(0,i),nodeCount:r}}_push(e,t,n,r,i,a){e>=this._stackFrames&&this._ensureStack(this._stackFrames*2);let o=e*3,s=e*6;this._stackI[o]=t,this._stackI[o+1]=n,this._stackI[o+2]=r;for(let e=0;e<6;e++)this._stackB[s+e]=i[a+e];return e+1}_ensureStack(e){if(this._stackFrames>=e)return;let t=new Int32Array(e*3),n=new Float64Array(e*6);this._stackI&&(t.set(this._stackI),n.set(this._stackB)),this._stackI=t,this._stackB=n,this._stackFrames=e}static fillLeaves(t,n,r){let i=r.world,a=r.sourceMesh,o=r.tplBlasOffset,s=r.visible,c=r.tlasLeafIndex,l=yt(t);for(let r=0;r<n;r++){let n=r*Dm;if(l[n+3]!==_t.BLAS_POINTER_LEAF)continue;let u=l[n+1]>l[n]=o[a[u]],t[n+2]=+!!s[u],e.writeLeafMatrix(t,l,n,i,u),c[u]=r}}static writeLeafMatrix(e,t,n,r,i){let a=Mm;bm(r,i*16,a),e[n+4]=a[0],e[n+5]=a[4],e[n+6]=a[8],e[n+7]=a[12],e[n+8]=a[1],e[n+9]=a[5],e[n+10]=a[9],e[n+11]=a[13],e[n+12]=a[2],e[n+13]=a[6],e[n+14]=a[10],e[n+15]=a[14],t[n+1]=(i|(wm(r,i*16)?ht:0))>>>0}_partition(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=0;if(u===2)d=n+1;else if(u<=Am)d=n+(u>>1),this._insertionSortRange(e,t,n,r,this._widestCentroidAxis(e,t,n,r));else{if(d=this._binnedSplit(e,t,n,r,i,a,o,s,c,l),d>n&&d<r)return d;if(d=this._sweepSplit(e,t,n,r,i,a,o,s,c,l),!(d>n&&d<r)){let f=s-i,p=c-a,m=l-o,h=p>f&&p>m?1:m>f?2:0;this._sortRange(e,t,n,r,h),d=n+(u>>1)}}let f=this._bounds;return this._rangeBounds(e,t,n,d,f,0),this._rangeBounds(e,t,d,r,f,6),d}_binnedSplit(e,t,n,r,i,a,o,s,c,l){let u=this._surfaceArea(i,a,o,s,c,l);if(!(u>0)||!isFinite(u))return n;let d=1/0,f=1/0,p=1/0,m=-1/0,h=-1/0,g=-1/0;for(let i=n;i<r;i++){let n=t[i]*6,r=(e[n]+e[n+3])*.5,a=(e[n+1]+e[n+4])*.5,o=(e[n+2]+e[n+5])*.5;r<d&&(d=r),r>m&&(m=r),a<f&&(f=a),a>h&&(h=a),o<p&&(p=o),o>g&&(g=o)}let _=this._extent,v=this._cMin;_[0]=m-d,_[1]=h-f,_[2]=g-p,v[0]=d,v[1]=f,v[2]=p;let y=1/0,b=-1,x=-1,S=this._binCounts,C=this._binBounds,w=_[0]>1e-12,T=_[1]>1e-12,E=_[2]>1e-12;if(!w&&!T&&!E)return n;let D=km(r-n),O=w?D/_[0]:0,k=T?D/_[1]:0,A=E?D/_[2]:0;S.fill(0,0,D*3);for(let e=0;e<D*3;e++){let t=e*6;C[t]=C[t+1]=C[t+2]=1/0,C[t+3]=C[t+4]=C[t+5]=-1/0}for(let i=n;i<r;i++){let n=t[i]*6,r=e[n],a=e[n+1],o=e[n+2],s=e[n+3],c=e[n+4],l=e[n+5];for(let e=0;e<3;e++){let t=e===0?O:e===1?k:A;if(t===0)continue;let n=((e===0?(r+s)*.5:e===1?(a+c)*.5:(o+l)*.5)-v[e])*t|0;n<0?n=0:n>=D&&(n=D-1),n+=e*D,S[n]++;let i=n*6;r<C[i]&&(C[i]=r),a<C[i+1]&&(C[i+1]=a),o<C[i+2]&&(C[i+2]=o),s>C[i+3]&&(C[i+3]=s),c>C[i+4]&&(C[i+4]=c),l>C[i+5]&&(C[i+5]=l)}}for(let e=0;e<3;e++){if(!(_[e]>1e-12))continue;let t=e*D,n=this._binSuffix,r=this._binSuffixCount,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0,d=0;for(let e=D-1;e>=1;e--){let u=(t+e)*6;C[u]<i&&(i=C[u]),C[u+1]<a&&(a=C[u+1]),C[u+2]<o&&(o=C[u+2]),C[u+3]>s&&(s=C[u+3]),C[u+4]>c&&(c=C[u+4]),C[u+5]>l&&(l=C[u+5]),d+=S[t+e],n[e]=d?this._surfaceArea(i,a,o,s,c,l):0,r[e]=d}let f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,v=-1/0,w=0;for(let i=1;i<D;i++){let a=(t+i-1)*6;if(C[a]<f&&(f=C[a]),C[a+1]<p&&(p=C[a+1]),C[a+2]<m&&(m=C[a+2]),C[a+3]>h&&(h=C[a+3]),C[a+4]>g&&(g=C[a+4]),C[a+5]>v&&(v=C[a+5]),w+=S[t+i-1],w===0||r[i]===0)continue;let o=1+(this._surfaceArea(f,p,m,h,g,v)*w+n[i]*r[i])/u;o<y&&(y=o,b=e,x=i)}}if(b<0)return n;let j=D/_[b],M=v[b],N=this._bounds;N[0]=N[1]=N[2]=N[6]=N[7]=N[8]=1/0,N[3]=N[4]=N[5]=N[9]=N[10]=N[11]=-1/0;let P=n,F=r-1;for(;P<=F;){let n=t[P]*6,r=((e[n+b]+e[n+3+b])*.5-M)*j|0;r<0?r=0:r>=D&&(r=D-1);let i=r<x?0:6;if(e[n]<N[i]&&(N[i]=e[n]),e[n+1]<N[i+1]&&(N[i+1]=e[n+1]),e[n+2]<N[i+2]&&(N[i+2]=e[n+2]),e[n+3]>N[i+3]&&(N[i+3]=e[n+3]),e[n+4]>N[i+4]&&(N[i+4]=e[n+4]),e[n+5]>N[i+5]&&(N[i+5]=e[n+5]),i===0)P++;else{let e=t[P];t[P]=t[F],t[F]=e,F--}}return P}_sweepSplit(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=this._surfaceArea(i,a,o,s,c,l);if(!(d>0)||!isFinite(d))return n;let f=this._suffixBuffer(u),p=1/0,m=-1,h=-1;for(let i=0;i<3;i++){this._sortRange(e,t,n,r,i);let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,g=-1/0;for(let r=u-1;r>=1;r--){let i=t[n+r]*6;e[i]<a&&(a=e[i]),e[i+1]<o&&(o=e[i+1]),e[i+2]<s&&(s=e[i+2]),e[i+3]>c&&(c=e[i+3]),e[i+4]>l&&(l=e[i+4]),e[i+5]>g&&(g=e[i+5]);let u=r*6;f[u]=a,f[u+1]=o,f[u+2]=s,f[u+3]=c,f[u+4]=l,f[u+5]=g}let _=1/0,v=1/0,y=1/0,b=-1/0,x=-1/0,S=-1/0;for(let r=1;r<u;r++){let a=t[n+r-1]*6;e[a]<_&&(_=e[a]),e[a+1]<v&&(v=e[a+1]),e[a+2]<y&&(y=e[a+2]),e[a+3]>b&&(b=e[a+3]),e[a+4]>x&&(x=e[a+4]),e[a+5]>S&&(S=e[a+5]);let o=r*6,s=this._surfaceArea(_,v,y,b,x,S),c=this._surfaceArea(f[o],f[o+1],f[o+2],f[o+3],f[o+4],f[o+5]),l=1+(s*r+c*(u-r))/d;l<p&&(p=l,m=i,h=r)}}return m<0||h<=0?n:(m!==2&&this._sortRange(e,t,n,r,m),n+h)}_widestCentroidAxis(e,t,n,r){let i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let u=n;u<r;u++){let n=t[u]*6,r=(e[n]+e[n+3])*.5,d=(e[n+1]+e[n+4])*.5,f=(e[n+2]+e[n+5])*.5;r<i&&(i=r),r>s&&(s=r),d<a&&(a=d),d>c&&(c=d),f<o&&(o=f),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o;return d>u&&d>f?1:f>u?2:0}_insertionSortRange(e,t,n,r,i){let a=i,o=3+i;for(let i=n+1;i<r;i++){let r=t[i],s=e[r*6+a]+e[r*6+o],c=i-1;for(;c>=n&&e[t[c]*6+a]+e[t[c]*6+o]>s;)t[c+1]=t[c],c--;t[c+1]=r}}_sortRange(e,t,n,r,i){let a=r-n,o=this._sortScratch;o.length=a;for(let e=0;e<a;e++)o[e]=t[n+e];let s=i,c=3+i;o.sort((t,n)=>e[t*6+s]+e[t*6+c]-(e[n*6+s]+e[n*6+c]));for(let e=0;e<a;e++)t[n+e]=o[e]}_suffixBuffer(e){let t=e*6;return(!this._suffix||this._suffix.length<t)&&(this._suffix=new Float64Array(t)),this._suffix}_rangeBounds(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=n;i<r;i++){let n=t[i]*6;e[n]<o&&(o=e[n]),e[n+1]<s&&(s=e[n+1]),e[n+2]<c&&(c=e[n+2]),e[n+3]>l&&(l=e[n+3]),e[n+4]>u&&(u=e[n+4]),e[n+5]>d&&(d=e[n+5])}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}_surfaceArea(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}},Pm=st.FLOATS_PER_TRIANGLE*4,Fm=64,Im=.9,Lm=64,Rm=4,zm=7040*1024*1024,Bm=9216*1024*1024,Vm=1.15,Hm=12*1024*1024*1024;function Um({triangles:e,placements:t,geometryBytes:n=0}){let r={triangles:e*Pm,bvh:Math.ceil(e*Im)*Fm,geometry:n,placements:t*Lm,orderMaps:e*Rm};return r.total=r.triangles+r.bvh+r.geometry+r.placements+r.orderMaps,r}function Wm(e,{chunkBytes:t=Sn,shared:n=!1,allocate:r=null}={}){let i=Math.min(e,Hm),a=r??(n?e=>new SharedArrayBuffer(e):e=>new ArrayBuffer(e)),o=[],s=0;try{for(;s<i;){let e=Math.min(t,i-s);o.push(a(e)),s+=e}}catch{}for(let e=o.length-1;e>=0;e--)o[e]=null;return o.length=0,{placed:s,want:i,exhausted:s<i,capped:e>i}}var Gm=class{constructor(){this.reset()}reset(){this.phase=`idle`,this.events=[],this.samples=[],this.allocatedBytes=0,this.peakLiveBytes=0,this.byPhase=Object.create(null)}mark(e){return this.phase=e,this.byPhase[e]??={allocated:0,chunks:0},this}alloc(e,t=`chunk`){if(!(e>0))return;let n=this.byPhase[this.phase]??={allocated:0,chunks:0};n.allocated+=e,n.chunks++,this.allocatedBytes+=e,this.events.push({phase:this.phase,bytes:e,what:t,at:performance.now()})}sample(e,t){let n=0;for(let e in t)n+=t[e]||0;return n>this.peakLiveBytes&&(this.peakLiveBytes=n),this.samples.push({label:e,phase:this.phase,total:n,parts:t,at:performance.now()}),n}get report(){return{allocatedBytes:this.allocatedBytes,peakLiveBytes:this.peakLiveBytes,byPhase:{...this.byPhase},samples:this.samples.slice()}}},Km="let e,t;const n={MAX_BYTES_PER_TEXTURE:256*1024*1024,MAX_TEXTURE_DIMENSION:8192,CHUNK_SIZE:8,ADAPTIVE_CHUNK_SIZE:!0,MEMORY_SAFETY_FACTOR:.8};self.onmessage=async function(t){let{textures:n,maxTextureSize:a,method:o=`direct-transfer`}=t.data;try{e||r(a);let t=await i(n,a,o);self.postMessage(t,[t.data])}catch(e){console.error(`Worker processing failed:`,e),self.postMessage({error:e.message})}};function r(r){let i=Math.min(r,n.MAX_TEXTURE_DIMENSION);e=new OffscreenCanvas(i,i),t=e.getContext(`2d`,{willReadFrequently:!0,alpha:!0,desynchronized:!0})}async function i(e,t,r){let i=h(e,t),o=i.maxWidth*i.maxHeight*e.length*4;if(o>n.MAX_BYTES_PER_TEXTURE)return console.log(`Large texture array detected (${(o/1024/1024).toFixed(2)}MB), using chunked processing`),await a(e,t,r);switch(r){case`direct-transfer`:return await d(e,t);case`offscreen-optimized`:return await p(e,t);case`imageBitmap-batch`:return await m(e,t);default:return await d(e,t)}}async function a(e,t,n){let{maxWidth:r,maxHeight:i}=h(e,t),a=e.length,c=o(r,i,a),l=Math.ceil(a/c);console.log(`Processing ${a} textures in ${l} chunks of up to ${c} textures each`),console.log(`Texture dimensions: ${r}x${i}, Est. memory per chunk: ${(r*i*c*4/1024/1024).toFixed(2)}MB`);let u;try{u=new Uint8Array(r*i*a*4)}catch{return console.warn(`Failed to allocate full texture array, reducing dimensions`),await f(e,g(e,t),n)}let d=r*i*c*4,p;try{p=new Uint8Array(d)}catch{return console.warn(`Failed to allocate chunk buffer, reducing dimensions`),await f(e,g(e,t),n)}for(let t=0;t<l;t++){let n=t*c,o=Math.min(n+c,a),l=o-n,d=await s(e.slice(n,o),r,i,p.subarray(0,r*i*l*4)),f=n*r*i*4,m=l*r*i*4;u.set(new Uint8Array(d.data.slice(0,m)),f),t%2==1&&await new Promise(e=>setTimeout(e,0))}return{data:u.buffer,width:r,height:i,depth:a}}function o(e,t,r){if(!n.ADAPTIVE_CHUNK_SIZE)return Math.min(n.CHUNK_SIZE,r);let i=e*t*4/(1024*1024),a;return a=i<=1?16:i<=4?8:i<=16?4:2,Math.min(a,r,n.CHUNK_SIZE*2)}async function s(n,r,i,a){(e.width!==r||e.height!==i)&&(e.width=r,e.height=i);let o=r*i*4;t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let t=n[e];try{await c(t,a,e*o,r,i)}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=e*o;a.fill(0,n,n+o)}}return{data:a.buffer,width:r,height:i,depth:n.length}}async function c(e,n,r,i,a){let o;if(e.isDirect&&e.bitmap)o=e.bitmap;else if(e.isImageData&&e.data){let t=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height);o=await createImageBitmap(t,{resizeWidth:i,resizeHeight:a,resizeQuality:`high`})}else if(e.isBlob){let t=new Blob([e.data]);o=await createImageBitmap(t,{resizeWidth:i,resizeHeight:a,resizeQuality:`high`})}else throw Error(`Unknown texture data format`);t.clearRect(0,0,i,a),t.drawImage(o,0,0,i,a);let s=t.getImageData(0,0,i,a);n.set(s.data,r),(e.isImageData||e.isBlob)&&o.close()}async function l(e,t,n){let r;try{r=new Uint8Array(t*n*e.length*4)}catch(r){console.warn(`Failed to allocate texture array in processTextureChunk, reducing dimensions`);let i=Math.max(1,Math.floor(t/2)),a=Math.max(1,Math.floor(n/2));if(i===t&&a===n)throw r;return await l(e,i,a)}return await s(e,t,n,r)}async function u(e,t,n,r,i){await c(e,n,r*i*4*t,r,i)}async function d(n,r){let{maxWidth:i,maxHeight:o}=h(n,r);(e.width!==i||e.height!==o)&&(e.width=i,e.height=o);let s=n.length,c;try{c=new Uint8Array(i*o*s*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`direct-transfer`)}t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let t=n[e];try{await u(t,e,c,i,o)}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=i*o*4*e;c.fill(0,n,n+i*o*4)}}return{data:c.buffer,width:i,height:o,depth:s}}async function f(e,t,n){let{maxWidth:r,maxHeight:i}=t;return console.log(`Using reduced dimensions: ${r}x${i}`),await l(e,r,i,n)}async function p(n,r){let{maxWidth:i,maxHeight:o}=h(n,r);(e.width!==i||e.height!==o)&&(e.width=i,e.height=o);let s=n.length,c;try{c=new Uint8Array(i*o*s*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`offscreen-optimized`)}t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let r=n[e];try{let n;if(r.isBlob){let e=new Blob([r.data]);n=await createImageBitmap(e,{resizeWidth:i,resizeHeight:o,resizeQuality:`high`})}else{let e=new ImageData(new Uint8ClampedArray(r.data),r.width,r.height);n=await createImageBitmap(e,{resizeWidth:i,resizeHeight:o,resizeQuality:`high`})}t.clearRect(0,0,i,o),t.drawImage(n,0,0);let a=t.getImageData(0,0,i,o),s=i*o*4*e;c.set(a.data,s),n.close()}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=i*o*4*e;c.fill(0,n,n+i*o*4)}}return{data:c.buffer,width:i,height:o,depth:s}}async function m(n,r){let{maxWidth:i,maxHeight:s}=h(n,r),c=n.length,l;try{l=new Uint8Array(i*s*c*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`imageBitmap-batch`)}let u=Math.min(o(i,s,n.length),n.length);for(let r=0;r<n.length;r+=u){let a=Math.min(r+u,n.length),o=[];for(let e=r;e<a;e++){let t=n[e],r;if(t.isBlob){let e=new Blob([t.data]);r=createImageBitmap(e,{resizeWidth:i,resizeHeight:s,resizeQuality:`high`})}else{let e=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);r=createImageBitmap(e,{resizeWidth:i,resizeHeight:s,resizeQuality:`high`})}o.push(r.then(t=>({bitmap:t,index:e})))}let c=await Promise.all(o);e.width=i,e.height=s,t.imageSmoothingEnabled=!1;for(let{bitmap:e,index:n}of c){t.clearRect(0,0,i,s),t.drawImage(e,0,0);let r=t.getImageData(0,0,i,s),a=i*s*4*n;l.set(r.data,a),e.close()}}return{data:l.buffer,width:i,height:s,depth:c}}function h(e,t){let r=0,i=0;for(let t of e)r=Math.max(r,t.width||0),i=Math.max(i,t.height||0);let a=Math.min(t,n.MAX_TEXTURE_DIMENSION),o=Math.max(r,i);if(o>a){let e=a/o;r=Math.round(r*e),i=Math.round(i*e)}return r=Math.min(a,Math.max(4,Math.ceil(Math.max(1,r)/64)*64)),{maxWidth:r,maxHeight:Math.max(1,i)}}function g(e,t){let n=h(e,t);return{maxWidth:Math.max(64,Math.ceil(n.maxWidth/128)*64),maxHeight:Math.max(1,Math.floor(n.maxHeight/2))}}",qm=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Km],{type:`text/javascript;charset=utf-8`});function Jm(e){let t;try{if(t=qm&&(self.URL||self.webkitURL).createObjectURL(qm),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Km),{type:`module`,name:e?.name})}}El();var Ym=e=>(t,n,r,i,a)=>e(t>0?t:0,n>0?n:0,r>0?r:0,i,a),Xm=new Map;function Zm(){Xm.clear();for(let e of wl.values())Xm.set(e.id,Ym(e.cpu))}Zm(),sl(Zm);function Qm(e){return cl(e)?.outputEncoded===!0}var $m=1/2.2;function eh(e){return e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function th(e,t){let n=cl(t);return n?n.appliesExposure?e:1:t===r.NoToneMapping?1:e}var nh=.2126,rh=.7152,ih=.0722;function ah(e,t){if(t===1)return;let n=e[0]*nh+e[1]*rh+e[2]*ih;e[0]=n+(e[0]-n)*t,e[1]=n+(e[1]-n)*t,e[2]=n+(e[2]-n)*t}function oh(e,{exposure:t,toneMapping:n,saturation:i=1,preserveAlpha:a=!1}){let o=Xm.get(n)??Xm.get(r.NoToneMapping),s=th(t,n),c=Qm(n),l=new Uint8ClampedArray(e.length),u=[0,0,0];for(let t=0;t<e.length;t+=4)u[0]=e[t]*s,u[1]=e[t+1]*s,u[2]=e[t+2]*s,ah(u,i),o(u[0],u[1],u[2],1,u),c?(l[t]=u[0]*255+.5,l[t+1]=u[1]*255+.5,l[t+2]=u[2]*255+.5):(l[t]=eh(u[0])*255+.5,l[t+1]=eh(u[1])*255+.5,l[t+2]=eh(u[2])*255+.5),l[t+3]=a?e[t+3]*255+.5:255;return l}rn();var sh=Wt(`textures`),ch={toSRGB:null,toLinear:null};function lh(e){if(!ch[e]){let t=new Uint8Array(256);for(let n=0;n<256;n++){let r=n/255,i=e===`toSRGB`?eh(r):r<=.04045?r/12.92:((r+.055)/1.055)**2.4;t[n]=Math.max(0,Math.min(255,Math.round(i*255)))}ch[e]=t}return ch[e]}var uh=class{constructor(){this.canvasContextPairs=[],this.maxPoolSize=xt.CANVAS_POOL_SIZE}getCanvasWithContext(e,t,n=!1,r={}){let i={willReadFrequently:!0,alpha:!0,desynchronized:!0,...r},a=this.canvasContextPairs.pop();if(!a){let r;r=n&&typeof OffscreenCanvas<`u`?new OffscreenCanvas(e,t):document.createElement(`canvas`);let o=r.getContext(`2d`,i);a={canvas:r,context:o}}return a.canvas.width=e,a.canvas.height=t,a}releaseCanvasWithContext(e){this.canvasContextPairs.length<this.maxPoolSize&&(e.context.globalAlpha=1,e.context.globalCompositeOperation=`source-over`,e.context.imageSmoothingEnabled=!0,e.context.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=1,e.canvas.height=1,this.canvasContextPairs.push(e))}getCanvas(e,t,n=!1){return this.getCanvasWithContext(e,t,n).canvas}getContext(e,t={}){let n=this.canvasContextPairs.find(t=>t.canvas===e);return n?n.context:e.getContext(`2d`,{willReadFrequently:!0,alpha:!0,desynchronized:!0,...t})}dispose(){this.canvasContextPairs=[]}},dh=class{constructor(e={}){this.pools=new Map,this.memoryUsage=0,this.maxMemoryUsage=e.maxMemory||Lt.MAX_BUFFER_MEMORY,this.allocatedBuffers=new WeakMap,this.sizeStrategy=e.sizeStrategy||`adaptive`}getOptimalSize(e){switch(this.sizeStrategy){case`exact`:return e;case`power2`:return 2**Math.ceil(Math.log2(e));default:return e<1024?e:e<1024*1024?Math.ceil(e/1024)*1024:2**Math.ceil(Math.log2(e))}}getBuffer(e,t=Float32Array){let n=this.getOptimalSize(e),r=`${t.name}-${n}`,i=(this.pools.get(r)||[]).pop();if(!i)try{i=new t(n),this.memoryUsage+=i.byteLength,this.allocatedBuffers.set(i,!0)}catch{this.cleanup();try{i=new t(n),this.memoryUsage+=i.byteLength,this.allocatedBuffers.set(i,!0)}catch(e){let r=n*t.BYTES_PER_ELEMENT/(1024*1024),i=this.memoryUsage/(1024*1024);throw Error(`Buffer allocation failed: requested ${r.toFixed(1)}MB, current usage: ${i.toFixed(1)}MB, max: ${(this.maxMemoryUsage/(1024*1024)).toFixed(1)}MB. Original error: ${e.message}`)}}return this.memoryUsage>this.maxMemoryUsage*Lt.CLEANUP_THRESHOLD&&this.cleanup(),this.checkMemoryHealth(),i.byteOffset+e*t.BYTES_PER_ELEMENT>i.buffer.byteLength&&(i=new t(e),this.memoryUsage+=i.byteLength),new t(i.buffer,i.byteOffset,e)}forget(e){this.memoryUsage=Math.max(0,this.memoryUsage-e.buffer.byteLength)}releaseBuffer(e,t=Float32Array){let n=(e.buffer.byteLength-e.byteOffset)/t.BYTES_PER_ELEMENT,r=this.getOptimalSize(n),i=`${t.name}-${r}`,a=this.pools.get(i)||[];a.length<xt.BUFFER_POOL_SIZE?(a.push(new t(e.buffer,e.byteOffset,n)),this.pools.set(i,a)):this.allocatedBuffers.has(e)&&(this.memoryUsage-=e.byteLength,this.allocatedBuffers.delete(e))}cleanup(){let e=Array.from(this.pools.entries());e.slice(0,Math.floor(e.length/2)).forEach(([e,t])=>{t.forEach(e=>{this.allocatedBuffers.has(e)&&(this.memoryUsage-=e.byteLength,this.allocatedBuffers.delete(e))}),this.pools.delete(e)})}dispose(){this.pools.forEach(e=>{e.forEach(e=>{this.allocatedBuffers.has(e)&&this.allocatedBuffers.delete(e)})}),this.pools.clear(),this.memoryUsage=0}getMemoryStats(){return{currentUsage:this.memoryUsage,maxUsage:this.maxMemoryUsage,utilizationPercentage:this.memoryUsage/this.maxMemoryUsage*100,poolCount:this.pools.size,allocatedBufferCount:this.allocatedBuffers&&this.allocatedBuffers.size||0}}checkMemoryHealth(){let e=this.getMemoryStats();return e.utilizationPercentage>90?(console.warn(`Memory pool critical: ${e.utilizationPercentage.toFixed(1)}% used (${(e.currentUsage/(1024*1024)).toFixed(1)}MB / ${(e.maxUsage/(1024*1024)).toFixed(1)}MB)`),`critical`):e.utilizationPercentage>70?(console.warn(`Memory pool high: ${e.utilizationPercentage.toFixed(1)}% used (${(e.currentUsage/(1024*1024)).toFixed(1)}MB / ${(e.maxUsage/(1024*1024)).toFixed(1)}MB)`),`high`):`normal`}},fh=class{constructor(e=xt.CACHE_SIZE_LIMIT){this.cache=new Map,this.accessOrder=[],this.maxSize=e}generateHash(e){let t=``;for(let n of e)if(n?.image){let e=n.image.width||0,r=n.image.height||0,i=n.image.src||n.uuid||``,a=n.flipY===!1?`n`:`f`,o=`${n.colorSpace??``}|${n.userData?.ocioColorSpace??``}`;t+=`${e}x${r}_${i.slice(-8)}_${a}_${o}_`}return t+e.length}get(e){if(this.cache.has(e)){let t=this.cache.get(e);if(t?.userData&&t.userData.buffer===null){this.cache.delete(e);let t=this.accessOrder.indexOf(e);return t>-1&&this.accessOrder.splice(t,1),null}let n=this.accessOrder.indexOf(e);return n>-1&&this.accessOrder.splice(n,1),this.accessOrder.push(e),t}return null}set(e,t){if(this.cache.has(e)){let t=this.accessOrder.indexOf(e);t>-1&&this.accessOrder.splice(t,1)}else this.cache.size>=this.maxSize&&this.evictLRU();this.cache.set(e,t),this.accessOrder.push(e)}evictLRU(){if(this.accessOrder.length>0){let e=this.accessOrder.shift(),t=this.cache.get(e);t&&t.dispose&&t.dispose(),this.cache.delete(e)}}dispose(){this.cache.forEach(e=>{e&&e.dispose&&e.dispose()}),this.cache.clear(),this.accessOrder=[]}},ph=class{constructor(e={}){this.useWorkers=typeof Worker<`u`,this.maxConcurrentWorkers=xt.MAX_CONCURRENT_WORKERS,this.activeWorkers=0,this._issues=e.issues??null,this.maxTextureSize=this._clampTextureSize(e.maxTextureSize??xt.DEFAULT_MAX_TEXTURE_SIZE),this.canvasPool=new uh,this.bufferPool=new dh({maxMemory:e.maxBufferMemory||Lt.MAX_BUFFER_MEMORY,sizeStrategy:e.bufferSizeStrategy||`adaptive`}),this.textureCache=new fh,this.capabilities=this.detectCapabilities(),this.optimalMethod=this.selectOptimalMethod()}_reportTextureFailure(e,t){this._issues?.record(Y.TEXTURE_BUILD_FAILED,`${e} texture array failed to build — those surfaces render untextured`,{map:e,cause:String(t?.message??t)})}_clampTextureSize(e){let t=Math.floor(Number(e)||xt.DEFAULT_MAX_TEXTURE_SIZE);return Math.max(xt.MIN_TEXTURE_WIDTH,Math.min(t,xt.MAX_TEXTURE_SIZE))}setMaxTextureSize(e){let t=this._clampTextureSize(e);return t===this.maxTextureSize?t:(this.maxTextureSize=t,this.textureCache?.dispose(),this.textureCache=new fh,this.maxTextureSize)}detectCapabilities(){return{offscreenCanvas:typeof OffscreenCanvas<`u`,imageBitmap:typeof createImageBitmap<`u`,workers:typeof Worker<`u`,hardwareConcurrency:navigator.hardwareConcurrency||4}}selectOptimalMethod(){return this.capabilities.workers&&this.capabilities.offscreenCanvas?`worker-offscreen`:this.capabilities.imageBitmap?`imageBitmap`:`canvas`}_applyColorManagement(e,t,n,i=new Set){let a=Tu();if(!a?.hasConfig)return;let o=e?.image?.data;if(!o||!n)return;let s=t.filter(e=>e?.image),c=e.image.width*e.image.height*4,l=0,u=0,d=[];for(let e=0;e<s.length;e++){let t=e*c,n=Math.min(t+c,o.length);if(t>=o.length)break;let f=s[e],p=o.subarray(t,n),m=null;try{m=a.resolveTexture(f)}catch(t){sh.warn(`could not resolve the colour space of layer ${e}: ${t.message}`)}let h=m&&m.via!==`three`?m.colorSpace:null,g=f.type===r.FloatType||f.type===r.HalfFloatType;h&&(i.has(e)||g)&&(d.push(`${f.name||`layer ${e}`} (${h})`),h=null);try{a.convertTextureBytes(p,{space:h,encoding:`srgb`})&&(h?l++:u++)}catch(t){this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`colour conversion failed for layer ${e} — left in its original space`,{cause:String(t?.message??t),space:h})}}d.length&&this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`${d.length} colour map(s) name a colour space their stored bytes are no longer in (re-encoded or quantized on the way in); converted by primaries only`,{textures:d.slice(0,8)}),l+u!==0&&(e.needsUpdate=!0,sh.info(`colour maps into ${a.workingSpace}: ${l} by named space, ${u} by primaries, of ${s.length}`))}_harmonizeTransfer(e,t,n){let i=new Set,a=e?.image?.data;if(!a)return i;let o=t.filter(e=>e?.image),s=n?r.SRGBColorSpace:r.LinearSRGBColorSpace,c=e.image.width*e.image.height*4,l=[];for(let e=0;e<o.length;e++){let t=o[e].colorSpace;if(t!==r.SRGBColorSpace&&t!==r.LinearSRGBColorSpace||t===s)continue;let u=lh(n?`toSRGB`:`toLinear`),d=e*c,f=Math.min(d+c,a.length);for(let e=d;e<f;e+=4)a[e]=u[a[e]],a[e+1]=u[a[e+1]],a[e+2]=u[a[e+2]];l.push(o[e].name||o[e].source?.uuid?.slice(0,8)||`layer ${e}`),i.add(e)}if(l.length===0)return i;e.needsUpdate=!0;let u=l.slice(0,4).join(`, `)+(l.length>4?`, +${l.length-4} more`:``);return n?sh.info(`re-encoded ${l.length}/${o.length} linear-declared colour map(s) to sRGB so the GPU decode round-trips: ${u}`):sh.warn(`decoded ${l.length}/${o.length} sRGB-declared data map(s) to linear — precision is lost in the darks, check the asset: ${u}`),i}async createTexturesToDataTexture(e,{srgbPool:t=!1}={}){if(!e||e.length===0)return null;let n=Tu()?.inputKey??`-`,r=`${t?`s`:`l`}:${n}:${this.textureCache.generateHash(e)}`,i=this.textureCache.get(r);if(i)return i;let{normalized:a,bitmapsToClose:o}=await this._normalizeTexturesForProcessing(e),s=this.selectProcessingStrategy(a),c;try{switch(s.method){case`worker-direct`:c=await this.processWithWorkerDirect(a);break;case`main-batch`:c=await this.processOnMainThreadBatch(a,s.batchSize);break;case`main-streaming`:c=await this.processOnMainThreadStreaming(a);break;default:c=await this.processOnMainThreadSync(a)}if(c){let n=this._harmonizeTransfer(c,e,t);this._applyColorManagement(c,e,t,n),this.textureCache.set(r,c)}return c}catch(n){this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`worker texture processing failed — retrying on the main thread`,{cause:String(n?.message??n)});let r=await this.processOnMainThreadSync(a),i=this._harmonizeTransfer(r,e,t);return this._applyColorManagement(r,e,t,i),r}finally{for(let e of o)e.close()}}selectProcessingStrategy(e){let t=e.reduce((e,t)=>e+(t.image?.width||0)*(t.image?.height||0),0),n=t*4;return this.capabilities.workers&&n>Lt.MAX_TEXTURE_MEMORY?{method:`main-streaming`}:this.capabilities.workers&&t>2097152?{method:`worker-direct`}:t>524288?{method:`main-batch`,batchSize:Math.min(4,e.length)}:e.length>8?{method:`main-streaming`}:{method:`main-sync`}}async processWithWorkerDirect(e){for(;this.activeWorkers>=this.maxConcurrentWorkers;)await new Promise(e=>setTimeout(e,10));this.activeWorkers++;try{let t=new Jm,n=await this.prepareTexturesForWorkerDirect(e),r=await new Promise((e,r)=>{t.onmessage=t=>{t.data.error?r(Error(t.data.error)):e(t.data)},t.onerror=r;let i=[];n.forEach(e=>{e.data instanceof ArrayBuffer?i.push(e.data):e.bitmap&&i.push(e.bitmap)}),t.postMessage({textures:n,maxTextureSize:this.maxTextureSize,method:`direct-transfer`},i)});return t.terminate(),this.createDataArrayTextureFromResult(r)}finally{this.activeWorkers--}}async prepareTexturesForWorkerDirect(e){let t=[];for(let n of e){if(!n?.image)continue;let e=n.flipY!==!1;try{let r=n.image;if(typeof createImageBitmap<`u`&&(r instanceof HTMLImageElement||typeof ImageBitmap<`u`&&r instanceof ImageBitmap||typeof HTMLCanvasElement<`u`&&r instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&r instanceof OffscreenCanvas)){let r=await createImageBitmap(n.image,{imageOrientation:e?`flipY`:`none`});t.push({bitmap:r,width:n.image.width,height:n.image.height,isDirect:!0})}else{let r=n.image.width,i=n.image.height,a=await createImageBitmap(n.image,{imageOrientation:e?`flipY`:`none`}),o=this.canvasPool.getCanvasWithContext(r,i);o.context.drawImage(a,0,0),a.close();let s=o.context.getImageData(0,0,r,i);t.push({data:s.data.buffer,width:r,height:i,isImageData:!0}),this.canvasPool.releaseCanvasWithContext(o)}}catch(e){console.warn(`Failed to prepare texture for worker:`,e)}}return t}async processOnMainThreadBatch(e,t){let n=e.filter(e=>e?.image);if(n.length===0)return this.createFallbackTexture();let{maxWidth:r,maxHeight:i}=this.calculateOptimalDimensions(n),a=n.length,o=this.bufferPool.getBuffer(r*i*a*4,Uint8Array);for(let e=0;e<n.length;e+=t){let a=Math.min(e+t,n.length),s=[];for(let t=e;t<a;t++){let e=n[t],a=e.flipY!==!1,o=createImageBitmap(e.image,{resizeWidth:r,resizeHeight:i,resizeQuality:`high`,imageOrientation:a?`flipY`:`none`});s.push(o.then(e=>({bitmap:e,index:t})))}let c=await Promise.all(s),l=this.canvasPool.getCanvasWithContext(r,i);l.context.imageSmoothingEnabled=!1;for(let{bitmap:e,index:t}of c){l.context.clearRect(0,0,r,i),l.context.drawImage(e,0,0);let n=l.context.getImageData(0,0,r,i),a=r*i*4*t;o.set(n.data,a),e.close()}this.canvasPool.releaseCanvasWithContext(l)}return this.createDataArrayTextureFromBuffer(o,r,i,a)}async processOnMainThreadStreaming(e){let t=e.filter(e=>e?.image);if(t.length===0)return this.createFallbackTexture();let{maxWidth:n,maxHeight:r}=this.calculateOptimalDimensions(t),i=t.length,a=this.bufferPool.getBuffer(n*r*i*4,Uint8Array),o=this.canvasPool.getCanvasWithContext(n,r);o.context.imageSmoothingEnabled=!0,o.context.imageSmoothingQuality=`high`;for(let e=0;e<t.length;e++){let i=t[e],s=await createImageBitmap(i.image,{resizeWidth:n,resizeHeight:r,resizeQuality:`high`,imageOrientation:i.flipY===!1?`none`:`flipY`});o.context.clearRect(0,0,n,r),o.context.drawImage(s,0,0),s.close();let c=o.context.getImageData(0,0,n,r),l=n*r*4*e;a.set(c.data,l),e%Lt.STREAM_BATCH_SIZE===0&&await new Promise(e=>setTimeout(e,0))}return this.canvasPool.releaseCanvasWithContext(o),this.createDataArrayTextureFromBuffer(a,n,r,i)}async processOnMainThreadSync(e){let t=e.filter(e=>e?.image);if(t.length===0)return this.createFallbackTexture();let{maxWidth:n,maxHeight:r}=this.calculateOptimalDimensions(t),i=t.length,a=this.bufferPool.getBuffer(n*r*i*4,Uint8Array),o=this.canvasPool.getCanvasWithContext(n,r);o.context.imageSmoothingEnabled=!0,o.context.imageSmoothingQuality=`high`;for(let e=0;e<t.length;e++){let i=t[e],s=await createImageBitmap(i.image,{resizeWidth:n,resizeHeight:r,resizeQuality:`high`,imageOrientation:i.flipY===!1?`none`:`flipY`});o.context.clearRect(0,0,n,r),o.context.drawImage(s,0,0),s.close();let c=o.context.getImageData(0,0,n,r),l=n*r*4*e;a.set(c.data,l)}return this.canvasPool.releaseCanvasWithContext(o),this.createDataArrayTextureFromBuffer(a,n,r,i)}createMaterialRawData(e){let t=K.FLOATS_PER_MATERIAL,n=new Float32Array(e.length*t);for(let r=0;r<e.length;r++)vn(n,r*t,e[r]);return n}createBVHRawData(e){let t=[],n=e=>{let r=t.length;if(t.push(e),e.leftChild){let t=n(e.leftChild),r=n(e.rightChild);e.leftChild=t,e.rightChild=r}return r};n(e);let r=xt.VEC4_PER_BVH_NODE*xt.FLOATS_PER_VEC4;bt(t.length,`BVH node count`);let i=t.length*r,a=new Float32Array(i),o=yt(a);for(let e=0;e<t.length;e++){let n=e*r,i=t[e];if(i.leftChild!==null){let e=i.leftChild,r=i.rightChild,s=t[e],c=t[r];a[n]=s.boundsMin.x,a[n+1]=s.boundsMin.y,a[n+2]=s.boundsMin.z,o[n+3]=e,a[n+4]=s.boundsMax.x,a[n+5]=s.boundsMax.y,a[n+6]=s.boundsMax.z,o[n+7]=r,a[n+8]=c.boundsMin.x,a[n+9]=c.boundsMin.y,a[n+10]=c.boundsMin.z,a[n+12]=c.boundsMax.x,a[n+13]=c.boundsMax.y,a[n+14]=c.boundsMax.z}else o[n]=i.triangleOffset,o[n+1]=i.triangleCount,o[n+3]=_t.TRIANGLE_LEAF}return a}async createMaterialTextures(e){let{materials:t,maps:n,normalMaps:i,bumpMaps:a,roughnessMaps:o,metalnessMaps:s,emissiveMaps:c,displacementMaps:l}=e;console.log(`[TextureCreator] Creating material textures only`);let u=performance.now();try{if(!t||t.length===0)throw Error(`No materials provided for texture creation`);this.textureCache.dispose(),this.textureCache=new fh;let e=[];for(let[t,r]of[[`albedo`,n],[`normal`,i],[`bump`,a],[`roughness`,o],[`metalness`,s],[`emissive`,c],[`displacement`,l]])!r||r.length===0||e.push(this.createTexturesToDataTexture(r).then(e=>({type:t,texture:e})).catch(e=>(this._reportTextureFailure(t,e),{type:t,texture:null})));let d=await Promise.allSettled(e),f=d.find(e=>e.status===`rejected`);if(f)throw f.reason;let p={};d.forEach(e=>{if(e.status===`fulfilled`&&e.value){let{type:t,texture:n}=e.value;if(n)switch(t){case`albedo`:n.colorSpace=r.SRGBColorSpace,p.albedoTexture=n;break;case`normal`:p.normalTexture=n;break;case`bump`:p.bumpTexture=n;break;case`roughness`:p.roughnessTexture=n;break;case`metalness`:p.metalnessTexture=n;break;case`emissive`:n.colorSpace=r.SRGBColorSpace,p.emissiveTexture=n;break;case`displacement`:p.displacementTexture=n;break}}});let m=performance.now()-u;return console.log(`[TextureCreator] Material texture creation complete (${m.toFixed(2)}ms)`),p}catch(e){throw console.error(`[TextureCreator] Material texture creation error:`,e),Error(`Material texture creation failed: ${e.message}`)}}calculateOptimalDimensions(e){let t=0,n=0;for(let r of e)t=Math.max(t,r.image.width),n=Math.max(n,r.image.height);let r=Math.max(t,n);if(r>this.maxTextureSize){let e=this.maxTextureSize/r;t=Math.round(t*e),n=Math.round(n*e)}return{maxWidth:Ct(t,this.maxTextureSize),maxHeight:Math.max(1,n)}}createDataArrayTextureFromResult(e){let t=(e.data instanceof ArrayBuffer,new Uint8Array(e.data));return this.createDataArrayTextureFromBuffer(t,e.width,e.height,e.depth)}createDataArrayTextureFromBuffer(e,t,n,i){let a=new r.DataArrayTexture(e,t,n,i);a.minFilter=r.LinearFilter,a.magFilter=r.LinearFilter,a.wrapS=r.RepeatWrapping,a.wrapT=r.RepeatWrapping,a.format=r.RGBAFormat,a.type=r.UnsignedByteType,a.needsUpdate=!0,a.generateMipmaps=!1,a.userData={buffer:e,bufferType:Uint8Array},a.onUpdate=()=>{let e=a.userData.buffer;e&&(this.bufferPool.forget(e),a.userData.buffer=null,a.image.data=null)};let o=a.dispose.bind(a);return a.dispose=()=>{a.userData.buffer&&(this.bufferPool.releaseBuffer(a.userData.buffer,a.userData.bufferType),a.userData.buffer=null),o()},a}async _normalizeTexturesForProcessing(e){let t=[],n=[],i=[];for(let n of e)if(n?.image){if(n.isCompressedTexture&&n.format===r.RGBAFormat&&n.mipmaps?.[0]?.data){let e=n.mipmaps[0],r=t.length;t.push(null),i.push({index:r,flipY:n.flipY,promise:mh(e.data,e.width,e.height)});continue}if(n.isCompressedTexture){console.warn(`[TextureCreator] GPU-compressed texture in mixed group — using placeholder`),t.push(null);continue}if(n.image.data&&!(n.image instanceof HTMLImageElement)&&!(n.image instanceof HTMLCanvasElement)&&!(typeof ImageBitmap<`u`&&n.image instanceof ImageBitmap)){let e=t.length;t.push(null),i.push({index:e,flipY:n.flipY,promise:mh(n.image.data,n.image.width,n.image.height)});continue}t.push(n)}if(i.length>0){let e=await Promise.allSettled(i.map(e=>e.promise));for(let r=0;r<i.length;r++){let{index:a,flipY:o}=i[r],s=e[r];if(s.status===`fulfilled`){let e=s.value;n.push(e),t[a]={image:e,flipY:o}}else console.warn(`[TextureCreator] Failed to create ImageBitmap:`,s.reason)}}for(let e=0;e<t.length;e++)if(t[e]===null){let r=new Uint8ClampedArray([255,255,255,255]),i=await createImageBitmap(new ImageData(r,1,1));n.push(i),t[e]={image:i,flipY:!1}}return{normalized:t,bitmapsToClose:n}}createFallbackTexture(){let e=new r.DataArrayTexture(new Uint8Array([255,255,255,255]),1,1,1);return e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e.format=r.RGBAFormat,e.type=r.UnsignedByteType,e.needsUpdate=!0,e.generateMipmaps=!1,e}dispose(){this.canvasPool.dispose(),this.bufferPool.dispose(),this.textureCache.dispose()}};function mh(e,t,n){let r=new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength);return createImageBitmap(new ImageData(r,t,n))}var hh=class{constructor(){this.maxLeafSize=8}build(e){let t=e.length;if(t===0){let e=new Float32Array(16);return e[7]=1,e[14]=1,e[15]=-1,{nodeData:e,nodeCount:1,sortedPerm:new Int32Array,bitTrails:new Float32Array}}let n=new Int32Array(t);for(let e=0;e<t;e++)n[e]=e;let r=2*t+4,i=new Float32Array(r*16),a=0,o=new Float32Array(t),s=(t,r,c,l)=>{let u=a++,d=u*16,f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,_=-1/0,v=0,y=1/0,b=1/0,x=1/0,S=-1/0,C=-1/0,w=-1/0;for(let i=t;i<r;i++){let t=e[n[i]];f=Math.min(f,t.bMinX),p=Math.min(p,t.bMinY),m=Math.min(m,t.bMinZ),h=Math.max(h,t.bMaxX),g=Math.max(g,t.bMaxY),_=Math.max(_,t.bMaxZ),v+=t.power,y=Math.min(y,t.cx),b=Math.min(b,t.cy),x=Math.min(x,t.cz),S=Math.max(S,t.cx),C=Math.max(C,t.cy),w=Math.max(w,t.cz)}i[d+0]=f,i[d+1]=p,i[d+2]=m,i[d+3]=v,i[d+4]=h,i[d+5]=g,i[d+6]=_;let T=r-t,E;if(T<=this.maxLeafSize){i[d+7]=1,i[d+8]=t,i[d+9]=T,i[d+10]=0,i[d+11]=0,E=null;for(let i=t;i<r;i++){let t=e[n[i]];E=_h(E,gh(t)),o[i]=c}E||={ax:0,ay:0,az:1,cosO:-1}}else{let a=S-y,o=C-b,u=w-x,f;f=a>=o&&a>=u?0:o>=u?1:2;let p=[`cx`,`cy`,`cz`][f],m=t+r>>1;this._nthElement(n,e,t,r,m,p),i[d+7]=0;let h=s(t,m,c,l+1),g=s(m,r,c+2**l,l+1);i[d+8]=h.nodeIndex,i[d+9]=g.nodeIndex,i[d+10]=0,i[d+11]=0,E=_h(h.cone,g.cone)}return i[d+12]=E.ax,i[d+13]=E.ay,i[d+14]=E.az,i[d+15]=E.cosO,{nodeIndex:u,cone:E}};s(0,t,0,0);let c=new Int32Array(t);for(let e=0;e<t;e++)c[e]=n[e];let l=new Float32Array(a*16);return l.set(i.subarray(0,a*16)),console.log(`[LightBVHBuilder] Built BVH: ${a} nodes for ${t} emissive triangles`),{nodeData:l,nodeCount:a,sortedPerm:c,bitTrails:o}}_nthElement(e,t,n,r,i,a){for(;n<r-1;){let o=n+r>>1,s=t[e[o]][a],c=e[o];e[o]=e[r-1],e[r-1]=c;let l=n;for(let i=n;i<r-1;i++)t[e[i]][a]<s&&(c=e[i],e[i]=e[l],e[l]=c,l++);if(c=e[l],e[l]=e[r-1],e[r-1]=c,l===i)return;l<i?n=l+1:r=l}}};function gh(e){return e.twoSided?{ax:e.nx,ay:e.ny,az:e.nz,cosO:-1}:{ax:e.nx,ay:e.ny,az:e.nz,cosO:1}}function _h(e,t){if(!e)return t;if(!t||e.cosO<=-1)return e;if(t.cosO<=-1)return t;let n=Math.min(Math.max(e.cosO,-1),1),r=Math.min(Math.max(t.cosO,-1),1),i=Math.acos(n),a=Math.acos(r),o=Math.min(Math.max(e.ax*t.ax+e.ay*t.ay+e.az*t.az,-1),1),s=Math.acos(o);if(Math.min(s+a,Math.PI)<=i)return e;if(Math.min(s+i,Math.PI)<=a)return t;let c=(i+a+s)*.5;if(c>=Math.PI)return{ax:e.ax,ay:e.ay,az:e.az,cosO:-1};let l=c-i,u=e.ay*t.az-e.az*t.ay,d=e.az*t.ax-e.ax*t.az,f=e.ax*t.ay-e.ay*t.ax,p=Math.sqrt(u*u+d*d+f*f);if(p<1e-8)return{ax:e.ax,ay:e.ay,az:e.az,cosO:-1};u/=p,d/=p,f/=p;let m=Math.cos(l),h=Math.sin(l),g=u*e.ax+d*e.ay+f*e.az,_=d*e.az-f*e.ay,v=f*e.ax-u*e.az,y=u*e.ay-d*e.ax,b=e.ax*m+_*h+u*g*(1-m),x=e.ay*m+v*h+d*g*(1-m),S=e.az*m+y*h+f*g*(1-m),C=Math.sqrt(b*b+x*x+S*S)||1;return{ax:b/C,ay:x/C,az:S/C,cosO:Math.cos(c)}}rn();var vh=Object.freeze({r:0,g:0,b:0});function yh(e){if(!e)return vh;if(!Hr())return e;let t=[e.r,e.g,e.b];return Wr(t),{r:t[0],g:t[1],b:t[2]}}var bh=Wt(`emissive`),xh=class{constructor(){this.emissiveTriangles=[],this.emissiveCount=0,this.totalEmissivePower=0,this.emissiveIndicesArray=null,this.emissivePowerArray=null,this.cdfArray=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._totalTriangleCount=0,this._hiddenMeshes=new Set}extractEmissiveTriangles(e,t,n,r=null){this.emissiveTriangles=[],this._emissiveMeshes=null,this.totalEmissivePower=0,this._totalTriangleCount=n;let i=st.FLOATS_PER_TRIANGLE,a=st.MATERIAL_FLAGS_OFFSET,o=st.MESH_INDEX_OFFSET,s=e&&e.chunks?e:null,c=s?s.viewAs(Float32Array):null,l=s?null:e,u=s?null:new Float32Array(e.buffer,e.byteOffset,e.length),d=new Map;for(let e=0;e<n;e++){if(s?.spilledChunks&&!s.isResident(e,1)){e=((e/s.recordsPerChunk|0)+1)*s.recordsPerChunk-1;continue}let n=s?s.chunkFor(e):l,f=s?c.chunkFor(e):u,p=s?s.baseOf(e):e*i,m=n[p+a]&ct,h=n[p+o],g=t[m];if(!g)continue;let _=d.get(g);_===void 0&&(_=yh(g.emissive),d.set(g,_));let v=g.emissiveIntensity||0;if(v>0&&(_.r>0||_.g>0||_.b>0)){let t=r?.placementRunOf?.(h)?.start??-1,n=t>=0&&r.isSet[t],i=n?r.world:null,a=n?t*16:0,o=(e,t,n)=>i?i[a]*e+i[a+4]*t+i[a+8]*n+i[a+12]:e,s=(e,t,n)=>i?i[a+1]*e+i[a+5]*t+i[a+9]*n+i[a+13]:t,c=(e,t,n)=>i?i[a+2]*e+i[a+6]*t+i[a+10]*n+i[a+14]:n,l=f[p+0],u=f[p+1],d=f[p+2],y=f[p+4],b=f[p+5],x=f[p+6],S=f[p+8],C=f[p+9],w=f[p+10],T=o(l,u,d),E=s(l,u,d),D=c(l,u,d),O=o(y,b,x),k=s(y,b,x),A=c(y,b,x),j=o(S,C,w),M=s(S,C,w),N=c(S,C,w),P=this._calculateTriangleArea(T,E,D,O,k,A,j,M,N),F=(.2126*_.r+.7152*_.g+.0722*_.b)*v*P,I=(k-E)*(N-D)-(A-D)*(M-E),L=(A-D)*(j-T)-(O-T)*(N-D),ee=(O-T)*(M-E)-(k-E)*(j-T),te=Math.sqrt(I*I+L*L+ee*ee)||1,ne=g.side===1?-1:1;I=I/te*ne,L=L/te*ne,ee=ee/te*ne;let re=g.side===2,ie=(T+O+j)/3,R=(E+k+M)/3,ae=(D+A+N)/3,oe=Math.min(T,O,j),se=Math.min(E,k,M),ce=Math.min(D,A,N),le=Math.max(T,O,j),ue=Math.max(E,k,M),de=Math.max(D,A,N);this.emissiveTriangles.push({triangleIndex:e,materialIndex:m,meshIndex:h,sideSign:ne,instanceLeaf:n?r.tlasLeafIndex[t]:-1,power:F,area:P,emissive:{r:_.r,g:_.g,b:_.b},emissiveIntensity:v,cx:ie,cy:R,cz:ae,bMinX:oe,bMinY:se,bMinZ:ce,bMaxX:le,bMaxY:ue,bMaxZ:de,nx:I,ny:L,nz:ee,twoSided:re}),this.totalEmissivePower+=F}}return this.emissiveCount=this.emissiveTriangles.length,this.emissiveCount>0&&bh.debug(`${J.n(this.emissiveCount)} emissive tris (${(this.emissiveCount/n*100).toFixed(2)}%) · total power ${this.totalEmissivePower.toFixed(2)}`),this._buildDataArrays(),this.emissiveCount}get emissiveMeshes(){return this._emissiveMeshes??=new Set(this.emissiveTriangles.map(e=>e.meshIndex))}refreshTransforms(e,t){let n=e&&e.chunks?e:null,r=n?n.viewAs(Float32Array):null,i=n?null:new Float32Array(e.buffer,e.byteOffset,e.length),a=st.FLOATS_PER_TRIANGLE,o=t.world;this.totalEmissivePower=0;for(let e of this.emissiveTriangles){let s=n?r.chunkFor(e.triangleIndex):i,c=n?n.baseOf(e.triangleIndex):e.triangleIndex*a,l=[s[c],s[c+1],s[c+2],s[c+4],s[c+5],s[c+6],s[c+8],s[c+9],s[c+10]],u=t.placementRunOf?.(e.meshIndex)?.start??-1;if(u>=0&&t.isSet[u]){let e=u*16;for(let t=0;t<9;t+=3){let n=l[t],r=l[t+1],i=l[t+2];l[t]=o[e]*n+o[e+4]*r+o[e+8]*i+o[e+12],l[t+1]=o[e+1]*n+o[e+5]*r+o[e+9]*i+o[e+13],l[t+2]=o[e+2]*n+o[e+6]*r+o[e+10]*i+o[e+14]}}let[d,f,p,m,h,g,_,v,y]=l,b=this._calculateTriangleArea(d,f,p,m,h,g,_,v,y),x=e.emissive;e.power=(.2126*x.r+.7152*x.g+.0722*x.b)*e.emissiveIntensity*b,e.area=b;let S=(h-f)*(y-p)-(g-p)*(v-f),C=(g-p)*(_-d)-(m-d)*(y-p),w=(m-d)*(v-f)-(h-f)*(_-d),T=(Math.sqrt(S*S+C*C+w*w)||1)/e.sideSign;e.nx=S/T,e.ny=C/T,e.nz=w/T,e.cx=(d+m+_)/3,e.cy=(f+h+v)/3,e.cz=(p+g+y)/3,e.bMinX=Math.min(d,m,_),e.bMinY=Math.min(f,h,v),e.bMinZ=Math.min(p,g,y),e.bMaxX=Math.max(d,m,_),e.bMaxY=Math.max(f,h,v),e.bMaxZ=Math.max(p,g,y),this.totalEmissivePower+=e.power}this._buildDataArrays()}_calculateTriangleArea(e,t,n,r,i,a,o,s,c){let l=r-e,u=i-t,d=a-n,f=o-e,p=s-t,m=c-n,h=u*m-d*p,g=d*f-l*m,_=l*p-u*f;return Math.sqrt(h*h+g*g+_*_)*.5}_buildDataArrays(){this.emissiveIndicesArray=new Int32Array(this.emissiveCount),this.emissivePowerArray=new Float32Array(this.emissiveCount);for(let e=0;e<this.emissiveCount;e++)this.emissiveIndicesArray[e]=this.emissiveTriangles[e].triangleIndex,this.emissivePowerArray[e]=this.emissiveTriangles[e].power;this._buildCDF()}_buildCDF(){if(this.emissiveCount===0){this.cdfArray=new Float32Array(1),this.cdfArray[0]=0;return}this.cdfArray=new Float32Array(this.emissiveCount);let e=0;for(let t=0;t<this.emissiveCount;t++)e+=this.emissivePowerArray[t],this.cdfArray[t]=e;if(e>0)for(let t=0;t<this.emissiveCount;t++)this.cdfArray[t]/=e}sampleCDF(e){if(this.emissiveCount===0)return-1;if(this.emissiveCount===1)return 0;let t=0,n=this.emissiveCount-1;for(;t<n;){let r=Math.floor((t+n)/2);this.cdfArray[r]<e?t=r+1:n=r}return t}getGPUData(){return{emissiveIndices:this.emissiveIndicesArray,emissivePower:this.emissivePowerArray,emissiveCDF:this.cdfArray,emissiveCount:this.emissiveCount,totalPower:this.totalEmissivePower}}createEmissiveTexture(){if(this.emissiveCount===0)return new r.DataTexture(new Float32Array(4),1,1,r.RGBAFormat,r.FloatType);let e=new Float32Array(this.emissiveCount*4);for(let t=0;t<this.emissiveCount;t++){let n=t*4;e[n+0]=this.emissiveIndicesArray[t],e[n+1]=this.emissivePowerArray[t],e[n+2]=this.cdfArray[t],e[n+3]=0}let t=Math.ceil(Math.sqrt(this.emissiveCount)),n=Math.ceil(this.emissiveCount/t),i=t*n*4,a=new Float32Array(i);a.set(e);let o=new r.DataTexture(a,t,n,r.RGBAFormat,r.FloatType);return o.needsUpdate=!0,o.generateMipmaps=!1,o.minFilter=r.NearestFilter,o.magFilter=r.NearestFilter,bh.debug(`emissive texture ${J.px(t,n)} · ${J.n(this.emissiveCount)} entries`),o}createEmissiveRawData(){if(this.emissiveCount===0)return new Float32Array(8);let e=new Float32Array(this.emissiveCount*8);for(let t=0;t<this.emissiveCount;t++){let n=this.emissiveTriangles[t],r=t*8;e[r+0]=n.triangleIndex,e[r+1]=n.power,e[r+2]=this.cdfArray[t],e[r+3]=n.instanceLeaf,e[r+4]=n.emissive.r*n.emissiveIntensity,e[r+5]=n.emissive.g*n.emissiveIntensity,e[r+6]=n.emissive.b*n.emissiveIntensity,e[r+7]=n.area}return bh.debug(`emissive raw data ${J.n(this.emissiveCount)} entries (${J.mb(e.byteLength)})`),e}getStats(){if(this.emissiveCount===0)return{count:0,totalPower:0,averagePower:0,minPower:0,maxPower:0};let e=1/0,t=-1/0;for(let n=0;n<this.emissiveCount;n++){let r=this.emissivePowerArray[n];e=Math.min(e,r),t=Math.max(t,r)}return{count:this.emissiveCount,totalPower:this.totalEmissivePower,averagePower:this.totalEmissivePower/this.emissiveCount,minPower:e,maxPower:t}}updateMaterialEmissive(e,t,n,r,i){let a=yh(t.emissive),o=t.emissiveIntensity||0,s=o>0&&(a.r>0||a.g>0||a.b>0);if(s!==this.emissiveTriangles.some(t=>t.materialIndex===e))return this.extractEmissiveTriangles(n,r,i),!0;if(!s)return!1;let c=.2126*a.r+.7152*a.g+.0722*a.b;for(let t of this.emissiveTriangles)t.materialIndex===e&&(t.power=c*o*t.area,t.emissive={r:a.r,g:a.g,b:a.b},t.emissiveIntensity=o);return!0}setHiddenMeshes(e){let t=new Set;for(let e of this.emissiveTriangles)t.add(e.meshIndex);let n=new Set;for(let r of e)t.has(r)&&n.add(r);let r=this._hiddenMeshes,i=n.size!==r.size;if(!i){for(let e of n)if(!r.has(e)){i=!0;break}}return this._hiddenMeshes=n,i}buildLightBVH(){let e=this._hiddenMeshes.size===0?this.emissiveTriangles:this.emissiveTriangles.filter(e=>!this._hiddenMeshes.has(e.meshIndex));this.emissiveCount=e.length,this.totalEmissivePower=0;for(let t of e)this.totalEmissivePower+=t.power;if(e.length===0)return this.lightBVHNodeData=new Float32Array(16),this.lightBVHNodeData[7]=1,this.lightBVHNodeData[14]=1,this.lightBVHNodeData[15]=-1,this.lightBVHNodeCount=1,this.emissiveBitTrailMap=new Float32Array(Math.max(this._totalTriangleCount,1)).fill(-1),this.emissiveIndicesArray=new Int32Array,this.emissivePowerArray=new Float32Array,this._buildCDF(),this.emissiveTriangleData=new Float32Array(8),1;let{nodeData:t,nodeCount:n,sortedPerm:r,bitTrails:i}=new hh().build(e);this.lightBVHNodeData=t,this.lightBVHNodeCount=n,this._rebuildSortedEmissiveData(r,e),this.emissiveBitTrailMap=new Float32Array(Math.max(this._totalTriangleCount,1)).fill(-1);for(let t=0;t<r.length;t++){let n=e[r[t]].triangleIndex;this.emissiveBitTrailMap[n]=i[t]}return n}_rebuildSortedEmissiveData(e,t){let n=e.length;this.emissiveIndicesArray=new Int32Array(n),this.emissivePowerArray=new Float32Array(n);for(let r=0;r<n;r++){let n=e[r];this.emissiveIndicesArray[r]=t[n].triangleIndex,this.emissivePowerArray[r]=t[n].power}this._buildCDF();let r=new Float32Array(n*8);for(let i=0;i<n;i++){let n=t[e[i]],a=i*8;r[a+0]=n.triangleIndex,r[a+1]=n.power,r[a+2]=this.cdfArray[i],r[a+3]=n.instanceLeaf,r[a+4]=n.emissive.r*n.emissiveIntensity,r[a+5]=n.emissive.g*n.emissiveIntensity,r[a+6]=n.emissive.b*n.emissiveIntensity,r[a+7]=n.area}this.emissiveTriangleData=r,bh.debug(`rebuilt sorted emissive data · ${J.n(n)} entries`)}clear(){this.emissiveTriangles=[],this.emissiveCount=0,this.totalEmissivePower=0,this.emissiveIndicesArray=null,this.emissivePowerArray=null,this.cdfArray=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._totalTriangleCount=0,this._hiddenMeshes=new Set}};rn();var Sh=class{constructor(e=`Build`,{namespace:t=`build`,level:n=`debug`}={}){this.label=e,this.level=n,this.logger=Wt(t),this.entries=new Map,this.order=[],this.totalStart=performance.now()}start(e){return this.entries.set(e,{start:performance.now(),end:null}),this.order.includes(e)||this.order.push(e),this}end(e){let t=this.entries.get(e);return t&&(t.end=performance.now(),t.duration=t.end-t.start),this}getDuration(e){return this.entries.get(e)?.duration??0}print(e=[]){let t=performance.now()-this.totalStart,n=this.order.map(e=>{let t=this.entries.get(e)?.duration??0;return t>=1?`${e} ${Math.round(t)}ms`:null}).filter(Boolean),r=J.list([this.label,...e,J.ms(t)]);return this.level===`info`?this.logger.summary(r,n):this.logger.debug(J.list([r,n.join(` · `)])),{steps:Object.fromEntries(this.order.map(e=>[e,Math.round(this.entries.get(e)?.duration??0)])),total:Math.round(t)}}},Ch=1<<20,wh=1<<21,Th=()=>new Promise(e=>setTimeout(e,0)),Eh=[0,1,2,4,5,6,8,9,10];function Dh(e,t,n,r=Eh){let i=e.lanesPerRecord,a=r.length,o=0,s=0,c=0;for(;c<n;){let l=t+c,u=e.chunkFor(l),d=Math.min(e.recordsPerChunk-l%e.recordsPerChunk,n-c),f=e.baseOf(l);for(let e=0;e<d;e++,f+=i){let e=2166136261,t=2654435769;for(let n=0;n<a;n++){let i=u[f+r[n]];e=Math.imul(e^i,16777619),t=Math.imul(t+i|0,2246822507)^t>>>13}o=o+e>>>0,s=s+t>>>0}c+=d}return`${o.toString(16)}.${s.toString(16)}`}async function Oh(e,t){let n=[],r=0;for(let{triOffset:i,triCount:a}of t)n.push(Dh(e,i,a)),r+=a,r>=wh&&(r=0,await Th());return n}async function kh(e,t){let n=await e?.area(Zn.SCENES).open(t);if(!n)return null;try{let e=await n.json(`index.json`),t=await n.file(`nodes.f32`),r=await n.file(`order.u32`);return e?.v!==2||!t||!r?(n.release(),null):{index:e,nodes:t,order:r,release:()=>n.release()}}catch{return n.release(),null}}async function Ah(e,t,{index:n,bvh:r,orders:i,isStale:a,label:o=``}){let s=e?.area(Zn.SCENES);if(!s)return!1;let c=n.totalNodes-n.tlasNodeCount,l=i.reduce((e,t)=>e+(t?.byteLength??0),0),u=await s.create(t,{label:`${o} (BVH)`,expectedBytes:c*64+l});if(!u)return!1;try{for(let e=n.tlasNodeCount;e<n.totalNodes;){if(a())throw Error(`scene changed while it was being stored`);let t=r.chunkFor(e),i=r.recordsPerChunk-e%r.recordsPerChunk,o=Math.min(i,n.totalNodes-e,Ch),s=r.baseOf(e);await u.write(`nodes.f32`,t.subarray(s,s+o*16)),e+=o}for(let e of i)if(e)for(let t=0;t<e.length;t+=Ch*4)await u.write(`order.u32`,e.subarray(t,Math.min(e.length,t+Ch*4)));if(l===0&&await u.write(`order.u32`,new Uint8Array),a())throw Error(`scene changed while it was being stored`);return await u.writeJSON(`index.json`,n),await u.commit(),!0}catch{return await u.abort(),!1}}async function jh(e,t,n,r){for(let i=0;i<r;i+=Ch){let a=Math.min(Ch,r-i),o=await e.slice(i*64,(i+a)*64).arrayBuffer();t.setRecords(n+i,new Float32Array(o))}}async function Mh(e,t,n){return new Uint32Array(await e.slice(t*4,(t+n)*4).arrayBuffer())}var Nh=16,Ph=st.POSITION_A_OFFSET,Fh=st.POSITION_B_OFFSET,Ih=st.POSITION_C_OFFSET;async function Lh(e,t,n,r,{pause:i=null}={}){let a=e.lanesPerRecord,o=[new Float32Array(n),new Float32Array(n),new Float32Array(n)],[s,c,l]=o;for(let r=0;r<n;){let i=e.chunkFor(t+r),o=new Float32Array(i.buffer,i.byteOffset,i.length),u=Math.min(n,(((t+r)/e.recordsPerChunk|0)+1)*e.recordsPerChunk-t);for(let n=e.baseOf(t+r);r<u;r++,n+=a)s[r]=o[n+Ph]+o[n+Fh]+o[n+Ih],c[r]=o[n+Ph+1]+o[n+Fh+1]+o[n+Ih+1],l[r]=o[n+Ph+2]+o[n+Fh+2]+o[n+Ih+2]}let u=new Uint32Array(n);for(let e=0;e<n;e++)u[e]=e;let d=[],f=(e,t)=>{if(t-e<=r)return d.push({start:e,count:t-e}),{piece:d.length-1};let n=e+(t-e>>1);return zh(u,o,Rh(o,e,t),e,t,n),{left:f(e,n),right:f(n,t)}},p=f(0,n);return await i?.(),await Bh(e,t,n,u,i),{order:u,pieces:d,tree:p}}function Rh(e,t,n){let r=0,i=-1;for(let a=0;a<3;a++){let o=e[a],s=1/0,c=-1/0;for(let e=t;e<n;e++){let t=o[e];t<s&&(s=t),t>c&&(c=t)}c-s>i&&(i=c-s,r=a)}return r}function zh(e,t,n,r,i,a){let o=t[n],[s,c,l]=t,u=(t,n)=>{let r=e[t];e[t]=e[n],e[n]=r,r=s[t],s[t]=s[n],s[n]=r,r=c[t],c[t]=c[n],c[n]=r,r=l[t],l[t]=l[n],l[n]=r},d=2654435769,f=()=>(d^=d<<13,d^=d>>>17,d^=d<<5,o[r+(d>>>0)%(i-r)]);for(;i-r>1;){let e=f(),t=f(),n=f(),s=e<t?t<n?t:e<n?n:e:e<n?e:t<n?n:t,c=r,l=r,d=i;for(;l<d;){let e=o[l];e<s?u(c++,l++):e>s?u(l,--d):l++}if(a<c)i=c;else if(a>=d)r=d;else return}}async function Bh(e,t,n,r,i){let a=e.lanesPerRecord,o=new Uint32Array(a),s=new Uint8Array(n),c=0;for(let l=0;l<n;l++){if(s[l]||(s[l]=1,r[l]===l))continue;let n=e.chunkFor(t+l),u=e.baseOf(t+l);for(let e=0;e<a;e++)o[e]=n[u+e];for(let d=l;;){let f=r[d],p=n,m=u;if(f===l){for(let e=0;e<a;e++)p[m+e]=o[e];break}n=e.chunkFor(t+f),u=e.baseOf(t+f);for(let e=0;e<a;e++)p[m+e]=n[u+e];s[f]=1,d=f,i&&!(++c&1048575)&&await i()}}}function Vh(e,t,n,r){let i=t.length-1,a=[],o=i;for(let{bvhData:e}of n)a.push(o),o+=e.length/Nh;let s=new Float32Array(i*Nh),c=new Uint32Array(s.buffer),l=[s],u=new Uint32Array(r.length);for(let e=0;e<t.length;e++){let{bvhData:i,originalToBvh:o}=n[e];n[e].bvhData=n[e].originalToBvh=null;let s=a[e],{start:c,count:d}=t[e];Tp(new Uint32Array(i.buffer,i.byteOffset,i.length),s,c),l.push(i);for(let e=0;e<d;e++)u[r[c+e]]=c+(o?o[e]:e)}let d=0,f=e=>{if(e.piece!==void 0)return{index:a[e.piece],box:n[e.piece].aabb};let t=d++,r=f(e.left),i=f(e.right),o=t*Nh;return s[o]=r.box[0],s[o+1]=r.box[1],s[o+2]=r.box[2],c[o+3]=r.index,s[o+4]=r.box[3],s[o+5]=r.box[4],s[o+6]=r.box[5],c[o+7]=i.index,s[o+8]=i.box[0],s[o+9]=i.box[1],s[o+10]=i.box[2],s[o+12]=i.box[3],s[o+13]=i.box[4],s[o+14]=i.box[5],{index:t,box:[0,1,2].map(e=>Math.min(r.box[e],i.box[e])).concat([3,4,5].map(e=>Math.max(r.box[e],i.box[e])))}};return f(e),{bvhData:l,nodeCount:o,originalToBvh:u}}var Hh=`9.1.0`,Uh=1e4,Wh=15e5;function Gh(e,t,n=Uh){return e>=n&&t/Wh<e/3}var Kh="const e=e=>e>=2147483648,t=e=>~e>>>0>>>4,n=e=>~e&15,r={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11},i=r.FLOATS_PER_TRIANGLE,a=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),o=e=>e instanceof Uint32Array?e:new Uint32Array(e.buffer,e.byteOffset,e.length),s=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:e,idx:t?e.viewAs(Uint32Array):o(e)}},c=(e,t)=>e.chunked?e.f.chunkFor(t):e.f,l=(e,t)=>e.chunked?e.idx.chunkFor(t):e.idx,u=(e,t)=>e.chunked?e.chunked.baseOf(t):t*p,d=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:t?t.viewAs(Float32Array):a(e),u:t?e:o(e)}};function f(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}const p=16;function m(e,t,n,r,i,a){let o=e[t+4],s=e[t+5],c=e[t+6],l=e[t+7],u=e[t+8],d=e[t+9],f=e[t+10],p=e[t+11],m=e[t+12],h=e[t+13],g=e[t+14],_=e[t+15],v=d*g-f*h,y=f*m-u*g,b=u*h-d*m,x=o*v+s*y+c*b,S=o===1&&d===1&&g===1&&s===0&&c===0&&u===0&&f===0&&m===0&&h===0&&l===0&&p===0&&_===0,C=(Math.abs(o)+Math.abs(s)+Math.abs(c))*(Math.abs(u)+Math.abs(d)+Math.abs(f))*(Math.abs(m)+Math.abs(h)+Math.abs(g));if(S||!Number.isFinite(x)||Math.abs(x)<=1e-12*C){for(let e=0;e<6;e++)i[a+e]=n[r+e];return}let w=1/x,T=v*w,E=y*w,D=b*w,O=(c*h-s*g)*w,k=(o*g-c*m)*w,A=(s*m-o*h)*w,j=(s*f-c*d)*w,M=(c*u-o*f)*w,N=(o*d-s*u)*w,P=1/0,F=1/0,I=1/0,L=-1/0,R=-1/0,z=-1/0;for(let e=0;e<8;e++){let t=(e&1?n[r+3]:n[r])-l,i=(e&2?n[r+4]:n[r+1])-p,a=(e&4?n[r+5]:n[r+2])-_,o=T*t+O*i+j*a,s=E*t+k*i+M*a,c=D*t+A*i+N*a;o<P&&(P=o),o>L&&(L=o),s<F&&(F=s),s>R&&(R=s),c<I&&(I=c),c>z&&(z=c)}i[a]=P,i[a+1]=F,i[a+2]=I,i[a+3]=L,i[a+4]=R,i[a+5]=z}function h(e,t,n,a,o){let s=r.POSITION_A_OFFSET,c=r.POSITION_B_OFFSET,l=r.POSITION_C_OFFSET,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0;for(let r=0;r<n;r++){let n=t+r,a=e.chunked?e.f.chunkFor(n):e.f,o=e.chunked?e.chunked.baseOf(n):n*i;u=Math.min(u,a[o+s],a[o+c],a[o+l]),d=Math.min(d,a[o+s+1],a[o+c+1],a[o+l+1]),f=Math.min(f,a[o+s+2],a[o+c+2],a[o+l+2]),p=Math.max(p,a[o+s],a[o+c],a[o+l]),m=Math.max(m,a[o+s+1],a[o+c+1],a[o+l+1]),h=Math.max(h,a[o+s+2],a[o+c+2],a[o+l+2])}a[o]=u,a[o+1]=d,a[o+2]=f,a[o+3]=p,a[o+4]=m,a[o+5]=h}const g=new Float32Array(12);function _(r,i,a,o,s){let d=c(r,i),f=l(r,i),p=u(r,i),_=(i-s)*6,v=f[p+3];if(v===1073741824){h(a,f[p],f[p+1],o,_);return}if(v===1073741825){m(d,p,o,(f[p]-s)*6,o,_);return}let y=f[p+7],b=o,x=(v-s)*6;e(v)&&(h(a,t(v),n(v),g,0),b=g,x=0);let S=o,C=(y-s)*6;e(y)&&(h(a,t(y),n(y),g,6),S=g,C=6),d[p]=b[x],d[p+1]=b[x+1],d[p+2]=b[x+2],d[p+4]=b[x+3],d[p+5]=b[x+4],d[p+6]=b[x+5],d[p+8]=S[C],d[p+9]=S[C+1],d[p+10]=S[C+2],d[p+12]=S[C+3],d[p+13]=S[C+4],d[p+14]=S[C+5];for(let e=0;e<3;e++)o[_+e]=Math.min(b[x+e],S[C+e]),o[_+3+e]=Math.max(b[x+3+e],S[C+3+e])}var v=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let a=n.length,o=d(e);for(let e=0;e<a;e++){let a=n[e],s=o.chunked?o.f.chunkFor(e):o.f,c=o.chunked?o.u.chunkFor(e):o.u,l=o.chunked?o.chunked.baseOf(e):e*i,u=a*9,d=t[u],p=t[u+1],m=t[u+2],h=t[u+3],g=t[u+4],_=t[u+5],v=t[u+6],y=t[u+7],b=t[u+8];s[l+r.POSITION_A_OFFSET]=d,s[l+r.POSITION_A_OFFSET+1]=p,s[l+r.POSITION_A_OFFSET+2]=m,s[l+r.POSITION_B_OFFSET]=h,s[l+r.POSITION_B_OFFSET+1]=g,s[l+r.POSITION_B_OFFSET+2]=_,s[l+r.POSITION_C_OFFSET]=v,s[l+r.POSITION_C_OFFSET+1]=y,s[l+r.POSITION_C_OFFSET+2]=b;let x=h-d,S=g-p,C=_-m,w=v-d,T=y-p,E=b-m,D=f(S*E-C*T,C*w-x*E,x*T-S*w);c[l+r.NORMAL_A_PACKED_OFFSET]=D,c[l+r.NORMAL_B_PACKED_OFFSET]=D,c[l+r.NORMAL_C_PACKED_OFFSET]=D}}refitRange(e,t,n,r){let i=d(t);r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let a=s(e);for(let e=n+r-1;e>=n;e--)_(a,e,i,this._bounds,n)}refit(e,t,n){let r=d(t);n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let i=s(e);for(let e=n-1;e>=0;e--)_(i,e,r,this._bounds,0)}};const y=64*1024*1024;function b(e,t,n){return n?new e(new SharedArrayBuffer(t*e.BYTES_PER_ELEMENT)):new e(t)}var x=class e{constructor(e,t,n,r=y,i=!1){let a=t*n.BYTES_PER_ELEMENT,o=Math.max(1,Math.floor(r/a));this.recordCount=e,this.lanesPerRecord=t,this.LaneType=n,this.recordsPerChunk=e<=o?Math.max(e,1):o,this.shared=i,this.chunks=[];let s=e;for(;s>0;){let e=Math.min(s,this.recordsPerChunk);this.chunks.push(b(n,e*t,i)),s-=e}this.chunks.length===0&&this.chunks.push(b(n,0,i))}static adopt(t,n,r,i){let a=Object.create(e.prototype);return a.recordCount=n,a.lanesPerRecord=r,a.LaneType=t[0]?.constructor??null,a.recordsPerChunk=i,a.chunks=t,a.shared=typeof SharedArrayBuffer<`u`&&t[0]?.buffer instanceof SharedArrayBuffer,a}static lazy(t,n,r,i=y,a=!1){let o=Math.max(1,Math.floor(i/(n*r.BYTES_PER_ELEMENT))),s=Object.create(e.prototype);return s.recordCount=t,s.lanesPerRecord=n,s.LaneType=r,s.recordsPerChunk=t<=o?Math.max(t,1):o,s.shared=a,s.chunks=Array(Math.max(1,Math.ceil(t/s.recordsPerChunk))),s._views=[],s}_materialize(e){if(this._owner)return this._owner._materialize(e),this.chunks[e];let t=e*this.recordsPerChunk,n=Math.min(this.recordsPerChunk,this.recordCount-t)*this.lanesPerRecord,r=this.chunks[e]=b(this.LaneType,n,this.shared);for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);return r}materializeAll(){for(let e=0;e<this.chunks.length;e++)!this.chunks[e]&&!this._spilled?.has(e)&&this._materialize(e);return this}get chunkCount(){return this.chunks.length}get single(){return this.chunks.length===1?this.chunks[0]:null}get byteLength(){let e=0;for(let t of this.chunks)t&&(e+=t.byteLength);return e}chunkFor(e){let t=e/this.recordsPerChunk|0,n=this.chunks[t];if(n)return n;if(this._spilled?.has(t))throw Error(`ChunkedRecords: chunk ${t} is on disk — await ensureResident() before touching record ${e}`);return this._materialize(t)}async spill(e,{keep:t=()=>!1}={}){if(this._owner)throw Error(`ChunkedRecords: spill the storage, not a view of it`);this._store=e,this._spilled??=new Set;let n=0;for(let r=0;r<this.chunks.length;r++){let i=this.chunks[r];if(!(!i||t(r))){await e.write(r,i),this.chunks[r]=null;for(let e of this._liveViews())e.chunks[r]=null;this._spilled.add(r),n+=i.byteLength}}return n}async spillChunk(e,t){let n=this.chunks[e];if(!n)return 0;this._store=t,this._spilled??=new Set,await t.write(e,n),this.chunks[e]=null;for(let t of this._liveViews())t.chunks[e]=null;return this._spilled.add(e),n.byteLength}async ensureResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++){if(!this._spilled.has(e))continue;let t=Math.min(this.recordsPerChunk,this.recordCount-e*this.recordsPerChunk)*this.lanesPerRecord,n=await this._store.read(e,t*this.LaneType.BYTES_PER_ELEMENT),r=b(this.LaneType,t,this.shared);new Uint8Array(r.buffer,r.byteOffset,r.byteLength).set(new Uint8Array(n)),this.chunks[e]=r;for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);this._spilled.delete(e)}}_liveViews(){return this._weakViews&&=this._weakViews.filter(e=>e.deref()),[...this._views??[],...(this._weakViews??[]).map(e=>e.deref())]}isResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return!0;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++)if(this._spilled.has(e))return!1;return!0}get spilledChunks(){return this._spilled?.size??0}baseOf(e){return e%this.recordsPerChunk*this.lanesPerRecord}isContiguous(e,t){return t<=0?!0:(e/this.recordsPerChunk|0)==((e+t-1)/this.recordsPerChunk|0)}slice(e,t){let n=this.baseOf(e),r=t*this.lanesPerRecord;if(this.isContiguous(e,t))return this.chunkFor(e).subarray(n,n+r);let i=new this.LaneType(r);return this.readRecords(e,t,i),i}readRecords(e,t,n){let r=0;for(;r<t;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,t-r);n.set(a.subarray(o,o+c*this.lanesPerRecord),r*this.lanesPerRecord),r+=c}return n}setRecords(e,t){let n=t.length/this.lanesPerRecord,r=0;for(;r<n;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,n-r);a.set(t.subarray(r*this.lanesPerRecord,(r+c)*this.lanesPerRecord),o),r+=c}}copyOf(e,t){return this.readRecords(e,t,new this.LaneType(t*this.lanesPerRecord))}trimTo(t){let n=Math.max(1,Math.ceil(t/this.recordsPerChunk)),r=this.chunks.slice(0,n),i=(t-(n-1)*this.recordsPerChunk)*this.lanesPerRecord,a=r[n-1];return a.length>i&&(r[n-1]=a.subarray(0,Math.max(0,i))),e.adopt(r,t,this.lanesPerRecord,this.recordsPerChunk)}grow(e){if(e<=this.recordCount)return;let t=this.chunks.length-1,n=(e,t)=>Math.min(this.recordsPerChunk,t-e*this.recordsPerChunk)*this.lanesPerRecord,r=this.chunks[t];this.recordCount=e;for(let t of this._liveViews())t.recordCount=e;if(this.chunks.length*this.recordsPerChunk<e){this.chunks.length=Math.ceil(e/this.recordsPerChunk);for(let e of this._liveViews())e.chunks.length=this.chunks.length}if(r&&r.length<n(t,e)){let i=b(this.LaneType,n(t,e),this.shared);i.set(r),this.chunks[t]=i;for(let e of this._liveViews())e.chunks[t]=new e.LaneType(i.buffer,i.byteOffset,i.byteLength/e.LaneType.BYTES_PER_ELEMENT)}else if(!r&&this._spilled?.has(t))throw Error(`ChunkedRecords: cannot grow past chunk ${t}, which is on disk`)}release(e,t){let n=this.recordsPerChunk,r=Math.ceil(e/n),i=Math.floor((e+t)/n),a=0;for(let e=r;e<i;e++){let t=this.chunks[e];if(t){a+=t.byteLength,this.chunks[e]=void 0;for(let t of this._liveViews())t.chunks[e]=void 0}}return a}trimInPlace(e){let t=Math.max(1,Math.ceil(e/this.recordsPerChunk)),n=Math.max(0,(e-(t-1)*this.recordsPerChunk)*this.lanesPerRecord),r=[this,...this._liveViews()];for(let i of r){i.chunks.length=t;let r=i.chunks[t-1];r&&r.length>n&&(i.chunks[t-1]=r.subarray(0,n)),i.recordCount=e}if(this._spilled)for(let e of this._spilled)e>=t&&this._spilled.delete(e);return this}viewAs(t){let n=e=>new t(e.buffer,e.byteOffset,e.byteLength/t.BYTES_PER_ELEMENT),r=e.adopt(this.chunks.map(e=>e?n(e):void 0),this.recordCount,this.lanesPerRecord,this.recordsPerChunk);return r.LaneType=t,r._owner=this,this._views?this._views.push(r):(this._weakViews??=[]).push(new WeakRef(r)),r._spilled=this._spilled??=new Set,r}};const S=new v;let C=null,w=null,T=0;self.onmessage=function(e){let{type:t}=e.data;if(t===`init`){C=x.adopt(e.data.sharedBvhBufs.map(e=>new Float32Array(e)),e.data.bvhRecordCount,16,e.data.bvhRecordsPerChunk),w=x.adopt(e.data.sharedTriBufs.map(e=>new Uint32Array(e)),e.data.triRecordCount,e.data.triLanesPerRecord,e.data.triRecordsPerChunk),T=C.recordCount;return}if(t===`refit`)try{let e=performance.now();S.refit(C,w,T),self.postMessage({type:`refitComplete`,refitTimeMs:performance.now()-e})}catch(e){console.error(`[BVHRefitWorker] Refit error:`,e),self.postMessage({type:`error`,error:e.message})}};",qh=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Kh],{type:`text/javascript;charset=utf-8`});function Jh(e){let t;try{if(t=qh&&(self.URL||self.webkitURL).createObjectURL(qh),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Kh),{type:`module`,name:e?.name})}}var Yh="const e=Math.PI/180;function t(e){let t=2*Math.PI*(e-1)/365;return .006918-.399912*Math.cos(t)+.070257*Math.sin(t)-.006758*Math.cos(2*t)+907e-6*Math.sin(2*t)-.002697*Math.cos(3*t)+.00148*Math.sin(3*t)}function n({hours:n,dayOfYear:r,latitude:i}){let a=t(r),o=(n-12)*15*e,s=i*e,c=Math.sin(s)*Math.sin(a)+Math.cos(s)*Math.cos(a)*Math.cos(o),l=Math.asin(Math.min(1,Math.max(-1,c)))/e;return{azimuth:(Math.atan2(Math.sin(o),Math.cos(o)*Math.sin(s)-Math.tan(a)*Math.cos(s))/e+540)%360,elevation:l}}const r=e=>[0,31,59,90,120,151,181,212,243,273,304,334][e-1]+21,i=Object.freeze({time:10,month:3,latitude:40}),a=n({hours:i.time,dayOfYear:r(i.month),latitude:i.latitude}),o=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`look`}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`physical`})}),s={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:o.viewer.toneMapping,exposure:1,saturation:o.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:o.viewer.environmentRotation,groundProjectionEnabled:!1,groundProjectionRadius:100,groundProjectionHeight:15,groundProjectionLevel:0,enableGroundCatcher:!1,groundCatcherHeight:0,globalIlluminationIntensity:1,environmentMode:`hdri`,gradientZenithColor:`#0077BE`,gradientHorizonColor:`#87CEEB`,gradientGroundColor:`#654321`,solidSkyColor:`#87CEEB`,skySunAzimuth:180-a.azimuth,skySunElevation:a.elevation,skySunStrength:1,skySunSize:.53,skyTurbidity:2,skyOzone:300,skyAirDensity:1,skyGroundAlbedo:`#959595`,skyAltitude:50,skyPreset:`clearDay`,cameraProjection:`perspective`,panoramaLonRange:[-180,180],panoramaLatRange:[-90,90],panoramaLevelHorizon:!0,enableDOF:!1,fov:55,focusDistance:.8,aperture:5.6,focalLength:50,apertureScale:1,anamorphicRatio:1,unitsPerMetre:1,dofMode:o.viewer.dofMode,dofBlur:.05,autoFocusMode:`auto`,afScreenPoint:{x:.5,y:.5},afSmoothingFactor:.15,enablePathTracer:!0,enableAccumulation:!0,pauseRendering:!1,maxSamples:60,bounces:3,transmissiveBounces:5,maxSubsurfaceSteps:8,maxTransparentBounces:32,useAdaptiveSampling:!0,noiseThreshold:.1,adaptiveMinSamples:8,adaptiveStopFraction:.9,usePixelFreeze:!0,pixelFreezeThreshold:.02,pixelFreezeStability:8,convergenceOverlay:!1,samplingTechnique:2,enableEmissiveTriangleSampling:!1,emissiveBoost:1,fireflyThreshold:3,shadowTerminatorOffset:.1,wavefrontSortMaterials:!0,renderLimitMode:`frames`,renderTimeLimit:30,renderMode:0,enableAlphaShadows:!1,tilesHelper:!0,showLightHelper:!1,directionalLightIntensity:0,directionalLightColor:`#ffffff`,directionalLightPosition:[1,1,1],directionalLightAngle:0,filterStrength:1,edgeAtrousIterations:5,edgePhiLuminance:4,edgePhiNormal:64,edgePhiDepth:.1,enableOIDN:!1,oidnQuality:`fast`,continuousDenoise:!1,continuousDenoiseInterval:8,oidnTemporalHistory:!0,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,interactionRenderScale:.5,debugVisScale:100,denoiserStrategy:`none`,enableASVGF:!1,asvgfTemporalAlpha:.1,asvgfAtrousIterations:8,asvgfPhiColor:10,asvgfPhiNormal:128,asvgfPhiDepth:1,asvgfVarianceBoost:1,asvgfMaxAccumFrames:32,asvgfGradientStrength:1,asvgfGradientSigmaScale:2,asvgfGradientNoiseFloor:0,asvgfDebugMode:0,asvgfQualityPreset:`medium`,showAsvgfHeatmap:!1,nrdQualityPreset:`medium`,nrdDebugMode:0,autoExposure:!1,autoExposureKeyValue:.18,autoExposureMinExposure:.1,autoExposureMaxExposure:20,autoExposureAdaptSpeedBright:3,autoExposureAdaptSpeedDark:.5};Object.freeze({perspective:0,equirectangular:1,orthographic:2}),s.fov,s.focusDistance,s.aperture,s.focalLength,180-a.azimuth,a.elevation,c({color:[1,1,1],emissive:[0,0,0],emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:0,attenuationColor:[1,1,1],attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:[0,0,0],specularIntensity:1,specularColor:[1,1,1],clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:[1,1],bumpScale:1,displacementScale:1,transparent:0,alphaTest:0,alphaMode:0,side:0,depthWrite:1,subsurface:0,subsurfaceColor:[1,1,1],subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0});function c(e){for(let t of Object.values(e))typeof t==`object`&&Object.freeze(t);return Object.freeze(e)}const l={TRIANGLE_LEAF:1073741824,BLAS_POINTER_LEAF:1073741825,FRONTIER:1073741826};function u(e){return new Uint32Array(e.buffer,e.byteOffset,e.length)}function d(e,t){if(e>=1073741824)throw RangeError(`${t} is ${e.toLocaleString()}, at or past the BVH index limit of ${1073741824 .toLocaleString()}. Node indices are stored as u32 bit patterns and the leaf tags occupy everything above that.`);return e}Math.min(typeof navigator<`u`&&navigator.hardwareConcurrency||4,6),s.maxSamples,s.bounces,s.renderMode,s.enableAlphaShadows,s.maxSubsurfaceSteps;const f=Float64Array.from([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function p(e,t){return e[t]*(e[t+5]*e[t+10]-e[t+6]*e[t+9])-e[t+4]*(e[t+1]*e[t+10]-e[t+2]*e[t+9])+e[t+8]*(e[t+1]*e[t+6]-e[t+2]*e[t+5])}function m(e,t,n){let r=p(e,t);if(!Number.isFinite(r)||Math.abs(r)<1e-20)return n.set(f),n;let i=1/r;return n[0]=(e[t+5]*e[t+10]-e[t+6]*e[t+9])*i,n[1]=(e[t+2]*e[t+9]-e[t+1]*e[t+10])*i,n[2]=(e[t+1]*e[t+6]-e[t+2]*e[t+5])*i,n[3]=0,n[4]=(e[t+6]*e[t+8]-e[t+4]*e[t+10])*i,n[5]=(e[t]*e[t+10]-e[t+2]*e[t+8])*i,n[6]=(e[t+2]*e[t+4]-e[t]*e[t+6])*i,n[7]=0,n[8]=(e[t+4]*e[t+9]-e[t+5]*e[t+8])*i,n[9]=(e[t+1]*e[t+8]-e[t]*e[t+9])*i,n[10]=(e[t]*e[t+5]-e[t+1]*e[t+4])*i,n[11]=0,n[12]=-(n[0]*e[t+12]+n[4]*e[t+13]+n[8]*e[t+14]),n[13]=-(n[1]*e[t+12]+n[5]*e[t+13]+n[9]*e[t+14]),n[14]=-(n[2]*e[t+12]+n[6]*e[t+13]+n[10]*e[t+14]),n[15]=1,n}function h(e,t){for(let n=0;n<16;n++)if(e[t+n]!==f[n])return!1;return!0}const g=e=>e<32?e:32,_=new Float64Array(16);var v=class e{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0,this._binCounts=new Int32Array(96),this._binBounds=new Float64Array(576),this._binSuffix=new Float64Array(32),this._binSuffixCount=new Int32Array(32),this._order=null,this._stackI=null,this._stackB=null,this._stackFrames=0,this._sortScratch=[],this._suffix=null,this._bounds=new Float64Array(12),this._extent=new Float64Array(3),this._cMin=new Float64Array(3)}static nodeCountFor(e){return e>0?e*2-1:0}releaseFlattenBuffer(){this._flatBuffer=null,this._flatBufferCapacity=0}build(t){let n=new Float64Array(t.count*6);t.writeWorldAABBs(n);let r=this.buildStructure(n,t.count);return e.fillLeaves(r.data,r.nodeCount,t),r}buildStructure(t,n){let r=e.nodeCountFor(n);if(n===0)return{data:new Float32Array,nodeCount:0};d(r,`TLAS node count`);let i=r*16;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer,o=u(a);(!this._order||this._order.length<n)&&(this._order=new Int32Array(n));let s=this._order;for(let e=0;e<n;e++)s[e]=e;this._ensureStack(64);let c=0,f=0,p=0,m=n,h=this._bounds;this._rangeBounds(t,s,p,m,h,0);let g=h[0],_=h[1],v=h[2],y=h[3],b=h[4],x=h[5];for(;;){if(m-p===1){let e=f*16;o[e]=0,o[e+1]=s[p],a[e+2]=0,o[e+3]=l.BLAS_POINTER_LEAF}else{let e=this._partition(t,s,p,m,g,_,v,y,b,x),n=e-p,r=f+1,i=r+(n*2-1),l=f*16;a[l]=h[0],a[l+1]=h[1],a[l+2]=h[2],o[l+3]=r,a[l+4]=h[3],a[l+5]=h[4],a[l+6]=h[5],o[l+7]=i,a[l+8]=h[6],a[l+9]=h[7],a[l+10]=h[8],a[l+11]=0,a[l+12]=h[9],a[l+13]=h[10],a[l+14]=h[11],a[l+15]=0;let u=n<=m-e,d=u?0:6,S=u?6:0;c=this._push(c,u?i:r,u?e:p,u?m:e,h,S),f=u?r:i,u?m=e:p=e,g=h[d],_=h[d+1],v=h[d+2],y=h[d+3],b=h[d+4],x=h[d+5];continue}if(c===0)break;c--;let e=c*3,n=c*6;f=this._stackI[e],p=this._stackI[e+1],m=this._stackI[e+2],g=this._stackB[n],_=this._stackB[n+1],v=this._stackB[n+2],y=this._stackB[n+3],b=this._stackB[n+4],x=this._stackB[n+5]}return{data:a.subarray(0,i),nodeCount:r}}_push(e,t,n,r,i,a){e>=this._stackFrames&&this._ensureStack(this._stackFrames*2);let o=e*3,s=e*6;this._stackI[o]=t,this._stackI[o+1]=n,this._stackI[o+2]=r;for(let e=0;e<6;e++)this._stackB[s+e]=i[a+e];return e+1}_ensureStack(e){if(this._stackFrames>=e)return;let t=new Int32Array(e*3),n=new Float64Array(e*6);this._stackI&&(t.set(this._stackI),n.set(this._stackB)),this._stackI=t,this._stackB=n,this._stackFrames=e}static fillLeaves(t,n,r){let i=r.world,a=r.sourceMesh,o=r.tplBlasOffset,s=r.visible,c=r.tlasLeafIndex,d=u(t);for(let r=0;r<n;r++){let n=r*16;if(d[n+3]!==l.BLAS_POINTER_LEAF)continue;let u=d[n+1]&1073741823;d[n]=o[a[u]],t[n+2]=+!!s[u],e.writeLeafMatrix(t,d,n,i,u),c[u]=r}}static writeLeafMatrix(e,t,n,r,i){let a=_;m(r,i*16,a),e[n+4]=a[0],e[n+5]=a[4],e[n+6]=a[8],e[n+7]=a[12],e[n+8]=a[1],e[n+9]=a[5],e[n+10]=a[9],e[n+11]=a[13],e[n+12]=a[2],e[n+13]=a[6],e[n+14]=a[10],e[n+15]=a[14],t[n+1]=(i|(h(r,i*16)?1073741824:0))>>>0}_partition(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=0;if(u===2)d=n+1;else if(u<=8)d=n+(u>>1),this._insertionSortRange(e,t,n,r,this._widestCentroidAxis(e,t,n,r));else{if(d=this._binnedSplit(e,t,n,r,i,a,o,s,c,l),d>n&&d<r)return d;if(d=this._sweepSplit(e,t,n,r,i,a,o,s,c,l),!(d>n&&d<r)){let f=s-i,p=c-a,m=l-o,h=p>f&&p>m?1:m>f?2:0;this._sortRange(e,t,n,r,h),d=n+(u>>1)}}let f=this._bounds;return this._rangeBounds(e,t,n,d,f,0),this._rangeBounds(e,t,d,r,f,6),d}_binnedSplit(e,t,n,r,i,a,o,s,c,l){let u=this._surfaceArea(i,a,o,s,c,l);if(!(u>0)||!isFinite(u))return n;let d=1/0,f=1/0,p=1/0,m=-1/0,h=-1/0,_=-1/0;for(let i=n;i<r;i++){let n=t[i]*6,r=(e[n]+e[n+3])*.5,a=(e[n+1]+e[n+4])*.5,o=(e[n+2]+e[n+5])*.5;r<d&&(d=r),r>m&&(m=r),a<f&&(f=a),a>h&&(h=a),o<p&&(p=o),o>_&&(_=o)}let v=this._extent,y=this._cMin;v[0]=m-d,v[1]=h-f,v[2]=_-p,y[0]=d,y[1]=f,y[2]=p;let b=1/0,x=-1,S=-1,C=this._binCounts,w=this._binBounds,T=v[0]>1e-12,E=v[1]>1e-12,D=v[2]>1e-12;if(!T&&!E&&!D)return n;let O=g(r-n),k=T?O/v[0]:0,A=E?O/v[1]:0,j=D?O/v[2]:0;C.fill(0,0,O*3);for(let e=0;e<O*3;e++){let t=e*6;w[t]=w[t+1]=w[t+2]=1/0,w[t+3]=w[t+4]=w[t+5]=-1/0}for(let i=n;i<r;i++){let n=t[i]*6,r=e[n],a=e[n+1],o=e[n+2],s=e[n+3],c=e[n+4],l=e[n+5];for(let e=0;e<3;e++){let t=e===0?k:e===1?A:j;if(t===0)continue;let n=((e===0?(r+s)*.5:e===1?(a+c)*.5:(o+l)*.5)-y[e])*t|0;n<0?n=0:n>=O&&(n=O-1),n+=e*O,C[n]++;let i=n*6;r<w[i]&&(w[i]=r),a<w[i+1]&&(w[i+1]=a),o<w[i+2]&&(w[i+2]=o),s>w[i+3]&&(w[i+3]=s),c>w[i+4]&&(w[i+4]=c),l>w[i+5]&&(w[i+5]=l)}}for(let e=0;e<3;e++){if(!(v[e]>1e-12))continue;let t=e*O,n=this._binSuffix,r=this._binSuffixCount,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0,d=0;for(let e=O-1;e>=1;e--){let u=(t+e)*6;w[u]<i&&(i=w[u]),w[u+1]<a&&(a=w[u+1]),w[u+2]<o&&(o=w[u+2]),w[u+3]>s&&(s=w[u+3]),w[u+4]>c&&(c=w[u+4]),w[u+5]>l&&(l=w[u+5]),d+=C[t+e],n[e]=d?this._surfaceArea(i,a,o,s,c,l):0,r[e]=d}let f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,_=-1/0,y=0;for(let i=1;i<O;i++){let a=(t+i-1)*6;if(w[a]<f&&(f=w[a]),w[a+1]<p&&(p=w[a+1]),w[a+2]<m&&(m=w[a+2]),w[a+3]>h&&(h=w[a+3]),w[a+4]>g&&(g=w[a+4]),w[a+5]>_&&(_=w[a+5]),y+=C[t+i-1],y===0||r[i]===0)continue;let o=1+(this._surfaceArea(f,p,m,h,g,_)*y+n[i]*r[i])/u;o<b&&(b=o,x=e,S=i)}}if(x<0)return n;let M=O/v[x],N=y[x],P=this._bounds;P[0]=P[1]=P[2]=P[6]=P[7]=P[8]=1/0,P[3]=P[4]=P[5]=P[9]=P[10]=P[11]=-1/0;let F=n,I=r-1;for(;F<=I;){let n=t[F]*6,r=((e[n+x]+e[n+3+x])*.5-N)*M|0;r<0?r=0:r>=O&&(r=O-1);let i=r<S?0:6;if(e[n]<P[i]&&(P[i]=e[n]),e[n+1]<P[i+1]&&(P[i+1]=e[n+1]),e[n+2]<P[i+2]&&(P[i+2]=e[n+2]),e[n+3]>P[i+3]&&(P[i+3]=e[n+3]),e[n+4]>P[i+4]&&(P[i+4]=e[n+4]),e[n+5]>P[i+5]&&(P[i+5]=e[n+5]),i===0)F++;else{let e=t[F];t[F]=t[I],t[I]=e,I--}}return F}_sweepSplit(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=this._surfaceArea(i,a,o,s,c,l);if(!(d>0)||!isFinite(d))return n;let f=this._suffixBuffer(u),p=1/0,m=-1,h=-1;for(let i=0;i<3;i++){this._sortRange(e,t,n,r,i);let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,g=-1/0;for(let r=u-1;r>=1;r--){let i=t[n+r]*6;e[i]<a&&(a=e[i]),e[i+1]<o&&(o=e[i+1]),e[i+2]<s&&(s=e[i+2]),e[i+3]>c&&(c=e[i+3]),e[i+4]>l&&(l=e[i+4]),e[i+5]>g&&(g=e[i+5]);let u=r*6;f[u]=a,f[u+1]=o,f[u+2]=s,f[u+3]=c,f[u+4]=l,f[u+5]=g}let _=1/0,v=1/0,y=1/0,b=-1/0,x=-1/0,S=-1/0;for(let r=1;r<u;r++){let a=t[n+r-1]*6;e[a]<_&&(_=e[a]),e[a+1]<v&&(v=e[a+1]),e[a+2]<y&&(y=e[a+2]),e[a+3]>b&&(b=e[a+3]),e[a+4]>x&&(x=e[a+4]),e[a+5]>S&&(S=e[a+5]);let o=r*6,s=this._surfaceArea(_,v,y,b,x,S),c=this._surfaceArea(f[o],f[o+1],f[o+2],f[o+3],f[o+4],f[o+5]),l=1+(s*r+c*(u-r))/d;l<p&&(p=l,m=i,h=r)}}return m<0||h<=0?n:(m!==2&&this._sortRange(e,t,n,r,m),n+h)}_widestCentroidAxis(e,t,n,r){let i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let u=n;u<r;u++){let n=t[u]*6,r=(e[n]+e[n+3])*.5,d=(e[n+1]+e[n+4])*.5,f=(e[n+2]+e[n+5])*.5;r<i&&(i=r),r>s&&(s=r),d<a&&(a=d),d>c&&(c=d),f<o&&(o=f),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o;return d>u&&d>f?1:f>u?2:0}_insertionSortRange(e,t,n,r,i){let a=i,o=3+i;for(let i=n+1;i<r;i++){let r=t[i],s=e[r*6+a]+e[r*6+o],c=i-1;for(;c>=n&&e[t[c]*6+a]+e[t[c]*6+o]>s;)t[c+1]=t[c],c--;t[c+1]=r}}_sortRange(e,t,n,r,i){let a=r-n,o=this._sortScratch;o.length=a;for(let e=0;e<a;e++)o[e]=t[n+e];let s=i,c=3+i;o.sort((t,n)=>e[t*6+s]+e[t*6+c]-(e[n*6+s]+e[n*6+c]));for(let e=0;e<a;e++)t[n+e]=o[e]}_suffixBuffer(e){let t=e*6;return(!this._suffix||this._suffix.length<t)&&(this._suffix=new Float64Array(t)),this._suffix}_rangeBounds(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=n;i<r;i++){let n=t[i]*6;e[n]<o&&(o=e[n]),e[n+1]<s&&(s=e[n+1]),e[n+2]<c&&(c=e[n+2]),e[n+3]>l&&(l=e[n+3]),e[n+4]>u&&(u=e[n+4]),e[n+5]>d&&(d=e[n+5])}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}_surfaceArea(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};const y={silent:0,error:1,warn:2,info:3,debug:4},b=`info`,x=`rayzeeLogLevel`,S=`rayzeeLogNamespaces`,C=`color:#7c8494`,w=`color:inherit`;let T=null,E=null;function D(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function O(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function k(){if(T!==null)return T;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in y?(T=y[e],T):(T=y[D(x)]??y[b],T)}function A(){if(E!==null)return E;let e=globalThis.__RAYZEE_LOG_NS__??D(S);return E=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],E}function j(e,t){if(t<y.debug)return!0;let n=A();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function M(e,t,n){if(e>k()||!j(t,e))return;let r=e===y.error?console.error:e===y.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,C,w,...n.slice(1)):r(`%c${i}`,C,...n)}const N={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${N.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},P={levels:y,setLevel(e){return e in y?(globalThis.__RAYZEE_LOG_LEVEL__=e,T=y[e],O(x,e===b?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(y).join(`, `)}`),this.getLevel())},getLevel(){let e=k();return Object.keys(y).find(t=>y[t]===e)},isEnabled(e){return(y[e]??y.debug)<=k()},only(...e){let t=e.flat().filter(Boolean);return E=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),O(S,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return T=null,E=null,this.getLevel()}};function F(e){return{namespace:e,error:(...t)=>M(y.error,e,t),warn:(...t)=>M(y.warn,e,t),info:(...t)=>M(y.info,e,t),debug:(...t)=>M(y.debug,e,t),isEnabled:e=>P.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){M(y.info,e,[t]),r.forEach(t=>M(y.debug,e,[t]));return}y.info>k()||((k()>=y.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,C,w),r.forEach(e=>console.log(e)),console.groupEnd())}}}function I(e){e&&e in y&&(globalThis.__RAYZEE_LOG_LEVEL__=e,T=y[e])}const L=F(`bvh`);self.onmessage=function(e){let{aabbs:t,count:n,logLevel:r}=e.data;I(r);try{let e=performance.now(),{data:r,nodeCount:i}=new v().buildStructure(new Float64Array(t),n);L.debug(`TLAS ${N.n(i)} nodes in ${N.ms(performance.now()-e)}`),self.postMessage({tlasData:r,nodeCount:i},[r.buffer])}catch(e){L.error(`TLAS build failed:`,e),self.postMessage({error:e.message})}};",Xh=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Yh],{type:`text/javascript;charset=utf-8`});function Zh(e){let t;try{if(t=Xh&&(self.URL||self.webkitURL).createObjectURL(Xh),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Yh),{type:`module`,name:e?.name})}}rn(),Js();var Qh=5e4,$h=2e5,eg=2e6,tg=1<<19,ng=4e7,rg=1.5*1024**3,ig=256*1024*1024,ag=Wt(`scene`),og=e=>Array.isArray(e)?e:[e],sg=e=>og(e).reduce((e,t)=>e+t.byteLength,0),cg=64*1024*1024;async function lg(e,t,n){for(let r of og(n))await e.writeAt(t,r),t+=r.byteLength}function ug(e){let t=0;return e.traverse(e=>{let n=e.isMesh?e.geometry:null;n&&(t=Math.max(t,Math.ceil((n.index?n.index.count:n.attributes.position?.count??0)/3)))}),t}var dg=class{constructor(e={}){this.config={useWorkers:!0,bvhDepth:30,maxLeafSize:4,verbose:!1,useFloat32Array:!0,textureQuality:`adaptive`,maxTextureSize:xt.DEFAULT_MAX_TEXTURE_SIZE,enableTextureCache:!0,maxConcurrentTextureTasks:Math.min(navigator.hardwareConcurrency||4,6),maxSceneBytes:Bm,enableTreeletOptimization:!1,treeletSize:7,treeletOptimizationPasses:1,treeletMinImprovement:.01,treeletComplexityThreshold:5e4,sceneCache:!0,sceneCacheMinBuildMs:Uh,...e},this.triangleData=null,this.triangleFloats=null,this.triangleCount=0,this.materials=[],this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.roughnessMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this.spheres=[],this.bvhRoot=null,this.bvh=null,this.bvhData=null,this.bvhIndexChunks=null,this.bvhIndex=null,this.materialData=null,this.instanceTable=null,this._refitWorker=null,this._refitSharedBuffers=null,this._rebuildGeneration=0,this._pendingRebuilds=new Map,this.srgbBucketTextures=null,this.linearBucketTextures=null,this.emissiveTriangleData=null,this.emissiveTriangleCount=0,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._initProcessors(),this.isProcessing=!1,this.processingStage=null,this.memory=new Gm,this.memoryPreflight=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,blasBuildTime:0,blasWorkerTime:0,tlasBuildTime:0,bvhAssembleTime:0,totalProcessingTime:0}}setMaxTextureSize(e){return this.config.maxTextureSize=e,this.textureCreator?.setMaxTextureSize(e)}_initProcessors(){this.geometryExtractor=new Rr({issues:this.config.issues}),this.bvhBuilder=new Rp,this.bvhBuilder.maxLeafSize=this.config.maxLeafSize,this.bvhBuilder.setTreeletConfig({enabled:this.config.enableTreeletOptimization,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold}),this.textureCreator=new ph({maxTextureSize:this.config.maxTextureSize,issues:this.config.issues}),this.emissiveTriangleBuilder=new xh,this.tlasBuilder=new Nm,this._tlasWorker=null,this._tlasWorkerFailed=!1}_log(e,t){t===void 0?ag.debug(e):ag.debug(e,t)}_preflightMemory(e){let t=this.config.maxSceneBytes??9663676416,n=this.geometryExtractor.surveyScene(e),r=Um(n);if(this._progressive&&(r.total-=r.bvh),this._streaming){let t=rg+ug(e)*(st.FLOATS_PER_TRIANGLE*4+44);r.total-=Math.max(0,r.triangles-t)}let i={...n,estimate:r,safeBytes:zm,maxBytes:t,fits:r.total<=zm};if(this.memoryPreflight=i,r.total<1610612736)return i;if(ag.debug(J.list([`memory preflight: ${J.mb(r.total)} estimated`,`triangles ${J.mb(r.triangles)} · bvh ${J.mb(r.bvh)} · geometry ${J.mb(r.geometry)}`,`${J.n(n.triangles)} tris · ${J.n(n.placements)} placements`])),r.total>t){let e=`Scene needs about ${J.mb(r.total)} of CPU memory, past the ${J.mb(t)} a browser tab can hold — loading it would crash the tab rather than fail. Reduce the scene (it has ${J.n(n.triangles)} triangles), or raise maxSceneBytes to try anyway.`;throw this.config.issues?.record(Y.SCENE_MEMORY_BUDGET,e,{...n,estimate:r,maxBytes:t}),Error(e)}return i.fits||this.config.issues?.warn(Y.SCENE_MEMORY_BUDGET,`Scene needs about ${J.mb(r.total)} of CPU memory, above the ${J.mb(zm)} a fresh browser session can usually place. It may still load, but a long-running session will probably fail during BVH assembly; restarting the browser recovers the address space.`,{...n,estimate:r,safeBytes:zm}),i}_checkAssemblyHeadroom(e){let t=e*64;if(t<1610612736)return!0;let n=Wm(Math.ceil(t*Vm),{shared:Cn});return this.memoryPreflight&&(this.memoryPreflight.assemblyProbed=n.placed),n.exhausted&&this.config.issues?.warn(Y.SCENE_MEMORY_BUDGET,`BVH assembly needs ${J.mb(t)} but only ${J.mb(n.placed)} could be allocated. Restarting the browser usually recovers the address space.`,{totalNodes:e,need:t,placeable:n.placed}),!n.exhausted}_liveMemoryParts(){let e=this.instanceTable,t={triangles:this.triangles?.byteLength??0,bvh:this.bvh?.byteLength??0,geometry:this._geometryBytes??this.memoryPreflight?.geometryBytes??0,placements:e?.world?.byteLength??0,blasScratch:0,orderMaps:0};if(e){for(let n of e.blasData.values())t.blasScratch+=n?sg(n):0;for(let n of e.bvhToOriginal.values())t.orderMaps+=n?.byteLength??0;for(let n of e.originalToBvhMap.values())t.orderMaps+=n?.byteLength??0}return t}sceneBounds(){if(!this.bvh||this.bvh.recordCount===0)return null;let e=this.bvh.chunkFor(0),t=this.bvh.baseOf(0),n=[],r=[];for(let i=0;i<3;i++)n.push(Math.min(e[t+i],e[t+8+i])),r.push(Math.max(e[t+4+i],e[t+12+i]));return{min:n,max:r}}_sampleMemory(e){this.memory.sample(e,this._liveMemoryParts())}_logMemoryReport(){let{allocatedBytes:e,peakLiveBytes:t,byPhase:n}=this.memory;if(e===0)return;let r=Object.keys(n).filter(e=>n[e].allocated>0).map(e=>`${e} ${J.mb(n[e].allocated)}`),i=this.memoryPreflight?.estimate?.total;ag.debug(J.list([`memory: peak live ${J.mb(t)}`,`allocated ${J.mb(e)}`,i?`predicted ${J.mb(i)}`:null,r.join(` · `)]))}async buildBVH(e,{sceneKey:t=null,progressive:n=null}={}){if(this.isProcessing)throw Error(`Already processing a scene. Call dispose() first.`);this.isProcessing=!0,this.processingStage=`init`,this.memory.reset(),this._geometryBytes=0,Tn(e=>this.memory.alloc(e));let r=new Sh(e.name??``,{namespace:`scene`});try{this._reset(),this._sceneKey=t,this._blasKey=null,this._blasRestored=!1,this._progressive=n?.storage&&n.uploader?n:null;let i=this.geometryExtractor._countStoredTriangles(e);this._streaming=!!this._progressive&&i>Math.floor(67108864/(st.FLOATS_PER_TRIANGLE*4)),this._foldLeaves=i>ng,this.bvhBuilder.foldLeaves=this._foldLeaves,this._log(`Starting scene processing`),this.memory.mark(`preflight`),this._preflightMemory(e),this.processingStage=`extraction`,this.memory.mark(`extraction`),r.start(`Geometry extraction`),this._streaming?await this._extractStreaming(e):await this._extractGeometry(e),r.end(`Geometry extraction`),this.performanceMetrics.geometryExtractionTime=r.getDuration(`Geometry extraction`),this._geometryBytes=Mr(e),this._sampleMemory(`after extraction`),this.processingStage=`bvh`,r.start(`BVH construction (worker)`),r.start(`Material textures (parallel)`);let a=!1,o=this._buildBVH().then(()=>r.end(`BVH construction (worker)`)),s=this._createMaterialTextures().then(()=>{r.end(`Material textures (parallel)`),a=!0});return await o,H({status:`Building light data...`,progress:77}),r.start(`Emissive extraction + Light BVH`),this._buildEmissiveData(),r.end(`Emissive extraction + Light BVH`),a||H({status:`Processing material textures...`,progress:80}),await s,this.performanceMetrics.bvhBuildTime=r.getDuration(`BVH construction (worker)`),this.performanceMetrics.textureCreationTime=r.getDuration(`Material textures (parallel)`),this.processingStage=`finalize`,r.start(`BVH data packing`),this.bvhRoot&&!this.bvh&&this._setBVHData(this.textureCreator.createBVHRawData(this.bvhRoot)),r.end(`BVH data packing`),this.spheres=this._createSpheres(),this.performanceMetrics.totalProcessingTime=performance.now()-r.totalStart,r.print(),this.processingStage=`complete`,await this._restoreGeometry(e),H({status:`Scene data ready`,progress:85}),this._blasKey&&!this._blasRestored&&this.performanceMetrics.totalProcessingTime>=this.config.sceneCacheMinBuildMs&&(this._blasStoring=this._storeBLASes(e.name??``).catch(e=>ag.debug(`storing BLASes failed:`,e))),this}catch(e){throw this.processingStage=`error`,ag.error(`processing failed:`,e),H({status:`Error: ${e.message}`,failed:!0,progress:100}),e}finally{this._disposeGeometrySpill(),Tn(null),this._sampleMemory(`at ${this.processingStage}`),this._logMemoryReport(),this.isProcessing=!1}}async _extractGeometry(e){H({isLoading:!0,title:`Processing`,status:`Extracting geometry...`,progress:15}),await new Promise(e=>setTimeout(e,0)),this._log(`Extracting geometry`);let t=performance.now();try{this._adoptExtraction(this.geometryExtractor.extract(e));let n=performance.now()-t;this._log(`Geometry extraction complete (${n.toFixed(2)}ms)`,{triangleCount:this.triangleCount,materials:this.materials.length}),H({status:`Extracted ${this.triangleCount.toLocaleString()} triangles`,progress:25})}catch(e){throw ag.error(`geometry extraction failed:`,e),H({status:`Extraction error: ${e.message}`,failed:!0,progress:25}),e}}async _extractStreaming(e){H({isLoading:!0,title:`Processing`,status:`Extracting geometry and building BVHs...`,progress:15}),await new Promise(e=>setTimeout(e,0));let t=performance.now(),n=this.geometryExtractor,{storage:r,uploader:i}=this._progressive,a=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,o=n._countStoredTriangles(e),s=Dn.lazy(o,st.FLOATS_PER_TRIANGLE,Uint32Array),c=s.recordsPerChunk*s.lanesPerRecord*4,l=await _r.create(r,`${a}:tri`,c,{label:`Triangle records`,expectedBytes:o*c/s.recordsPerChunk}),u=l&&await _r.create(r,`${a}:blas`,0,{label:`BLAS nodes (while building)`});if(!u)return await l?.dispose(),this._streaming=!1,this._extractGeometry(e);let d=await Cr.create(r,`${a}:geo`,this.memoryPreflight?.geometryBytes??0);this._geometrySpill=d;let f={key:a,triStore:l,blasStore:u,bvhStore:null,blasBytes:0,blasAt:new Map,pending:[],extractedChunks:0,emitterChunks:new Set,isEmitter:e=>n._emissiveMaterial(e),uploadTriangles:null,chain:Promise.resolve(),error:null};this._spillStores=[l],this._blasKey=null;let p=new Map,m=this._blasWorkerOpts(),h=[],g=()=>new Promise(e=>h.push(e)),_=()=>{let e=h;h=[];for(let t of e)t()},v=null,y=(e,t,n)=>{let r=n.bvhData,i=new Float32Array(6);Tm.rootAABB(og(r)[0],v,t.start,t.count,i,0),p.set(e,{result:n,aabb:i});let a=f.blasBytes;f.blasBytes+=sg(r),f.blasAt.set(e,a),n.nodeCount=sg(r)/64,n.bvhData=null,this._queueSpill(f,()=>lg(u,a,r)),this._forEachChunk(v,t.start,t.count,e=>{--f.pending[e]===0&&e<f.extractedChunks&&this._finishTriangleChunk(f,e)}),_()},b=0,x=this._blasPool(m,()=>b++,(e,t,n)=>y(e,t,n)),S=Promise.resolve(),C=0,w=e=>{let t=e>=v.recordCount?v.chunks.length:Math.floor(e/v.recordsPerChunk);for(let e=f.extractedChunks;e<t;e++)f.pending[e]||this._finishTriangleChunk(f,e);f.extractedChunks=Math.max(f.extractedChunks,t)},T;try{if(T=await n.extractStreaming(e,{onStore:e=>{v=e,this._setTriangleData(e),f.uploadTriangles=i(e,`triangles`)},onRange:(e,t)=>{this._forEachChunk(v,t.start,t.count,e=>f.pending[e]=(f.pending[e]??0)+1),this._isLargeMesh(t)?(C++,S=S.then(async()=>{y(e,t,await this._buildLargeBLAS(t,m)),C--}),S.catch(e=>{f.error??=e,_()})):x.submit({m:e,range:t})},releaseGeometry:d?e=>d.add(e):null,pause:async e=>{for(w(e),d?.queuedBytes>ig&&await d.written(),H({status:`Extracted ${e.toLocaleString()} triangles, ${b.toLocaleString()} BVHs built...`,progress:15+Math.floor(20*e/Math.max(1,o))}),await new Promise(e=>setTimeout(e,0));v.byteLength>rg&&(x.pending>0||C>0)&&!f.error&&!x.error;)await Promise.race([g(),new Promise(e=>setTimeout(e,50))]);if(f.error||x.error)throw f.error??x.error}}),w(1/0),await Promise.all([x.close(),S]),await f.chain,f.error)throw f.error}catch(e){throw x.abort(e),ag.error(`streamed extraction failed:`,e),H({status:`Extraction error: ${e.message}`,failed:!0,progress:25}),e}this._adoptExtraction(T),this._streamed={state:f,templates:p},this._log(`Geometry extracted and ${p.size} BLASes built together (${(performance.now()-t).toFixed(0)}ms)`)}_adoptExtraction(e){if(this._setTriangleData(e.triangleData),this.geometryExtractor.releaseTriangles(),this.triangleCount=bt(e.triangleCount,`triangle count`),this._foldLeaves&&this.triangleCount>134217728)throw RangeError(`${this.triangleCount.toLocaleString()} triangles is past the ${vt.toLocaleString()} a folded BVH leaf can address`);this.expandedTriangleCount=e.expandedTriangleCount??e.triangleCount,this.instanceSource=e.instanceSource||null,this.instanceMatrices=e.instanceMatrices||null,this.instanceCount=e.instanceCount||0,this.bakeInverse=e.bakeInverse||null,this._log(`Using Float32Array format: ${this.triangleCount} triangles, ${(this.triangles.byteLength/(1024*1024)).toFixed(2)}MB`),this.materials=e.materials,this.materialTriangleCounts=e.materialTriangleCounts,this.meshes=e.meshes,this.meshTriangleRanges=e.meshTriangleRanges,this.maps=e.maps,this.normalMaps=e.normalMaps,this.bumpMaps=e.bumpMaps,this.roughnessMaps=e.roughnessMaps,this.metalnessMaps=e.metalnessMaps,this.emissiveMaps=e.emissiveMaps,this.displacementMaps=e.displacementMaps,this.anisotropyMaps=e.anisotropyMaps,this.transmissionMaps=e.transmissionMaps,this.clearcoatMaps=e.clearcoatMaps,this.clearcoatRoughnessMaps=e.clearcoatRoughnessMaps,this.sheenColorMaps=e.sheenColorMaps,this.sheenRoughnessMaps=e.sheenRoughnessMaps,this.iridescenceMaps=e.iridescenceMaps,this.iridescenceThicknessMaps=e.iridescenceThicknessMaps,this.specularIntensityMaps=e.specularIntensityMaps,this.specularColorMaps=e.specularColorMaps,this.directionalLights=e.directionalLights,this.cameras=e.cameras}async _buildBVH(){if(H({status:`Building BVH...`,progress:25}),this.triangleCount===0)throw Error(`No triangles to build BVH from`);this._log(`Building two-level BVH (TLAS/BLAS)`),this.memory.mark(`blas`);let e=performance.now();try{let t=this.meshTriangleRanges;if(!t||t.length===0)throw Error(`No mesh triangle ranges available for TLAS/BLAS build`);let n=this.instanceCount>0,r=n?this.instanceCount:t.length,i=this.instanceSource,a=n?this.instanceMatrices:null,o=e=>n?i[e]:e;this.instanceTable=new Tm,this.instanceTable.allocate(r,t.length,a,n?i:null),this.instanceTable.tplBakeInverse=this.bakeInverse;let s=this._streamed;this._streamed=null;let c=[],l=[],u=[],d=new Map,f=new Map;for(let e=0;e<r;e++){let n=t[o(e)];if(!n||n.count===0)continue;let r=f.get(n.start);if(r!==void 0){d.set(e,r);continue}f.set(n.start,e),s?u.push({m:e,range:n}):this._isLargeMesh(n)?l.push({m:e,range:n}):c.push({m:e,range:n})}let p=this._blasWorkerOpts(),m=c.length+l.length,h=0,g=()=>{h++,H({status:`Building BLAS ${h}/${m}...`,progress:25+Math.floor(h/m*45)})},_=[...c,...l].map(({m:e,range:t})=>({m:e,range:t,t:o(e),triOffset:t.start,triCount:t.count})).sort((e,t)=>e.t-t.t),v=s?null:await this._restoreBLASes(_,Nm.nodeCountFor(r),p),y=s?s.state:!v&&this._progressive&&this.triangles.chunks.length>1?await this._beginProgressiveSpill(_):null,b=y&&!s?(e,t,n)=>this._onBLASBuilt(y,o(e),t,n):null;if(s)for(let[e,t]of s.templates)this.instanceTable.tplObjectAABB.set(t.aabb,e*6);v&&(c.length=0,l.length=0,H({status:`Restored stored BVHs`,progress:68}));let x=v?Promise.resolve(v.results):s?Promise.resolve(u.map(({m:e,range:t})=>({m:e,range:t,result:s.templates.get(o(e)).result}))):this._buildBLASesWithPool(c,p,g,b),S=[],C=(async()=>{for(let{m:e,range:t}of l){let n=await this._buildLargeBLAS(t,p);b?.(e,t,n),S.push({m:e,range:t,result:n}),g()}})(),[w]=await Promise.all([x,C]);if(y&&(await y.chain,y.error))throw y.error;let T={sah:0,objMed:0,spatMed:0,failed:0,treeletsImproved:0,treeletsProcessed:0};for(let{m:e,range:t,result:r}of[...w,...S]){let i=r.splitStats;i&&(T.sah+=i.sahSplits??0,T.objMed+=i.objectMedianSplits??0,T.spatMed+=i.spatialMedianSplits??0,T.failed+=i.failedSplits??0,T.treeletsImproved+=i.treeletsImproved??0,T.treeletsProcessed+=i.treeletsProcessed??0,this.performanceMetrics.blasWorkerTime+=i.totalBuildTime??0),this.instanceTable.setEntry({meshIndex:e,blasNodeCount:r.nodeCount??sg(r.bvhData)/64,triOffset:t.start,triCount:t.count,originalToBvhMap:r.originalToBvh||null,bvhData:r.bvhData,matrixWorld:n?a:this.meshes?.[e]?.matrixWorld?.elements??null,matrixOffset:n?e*16:0,expandedStart:t.expandedStart,sourceMesh:o(e)})}for(let[e,r]of d)this.instanceTable.setAlias(e,r,n?a:this.meshes?.[e]?.matrixWorld?.elements??null,t[o(e)].expandedStart,o(e),n?e*16:0);H({status:`Built all BLASes`,progress:70}),this.performanceMetrics.blasBuildTime=performance.now()-e,H({status:`Building TLAS...`,progress:72}),this._sampleMemory(`BLASes built`),this.memory.mark(`tlas`);let E=performance.now(),D=this.instanceTable;this.instanceTable.computeAABBs(this.triangles,{owners:!y}),this.instanceTable.assignOffsets(Nm.nodeCountFor(D.count));let O=this.instanceTable.totalNodeCount,k=await this._buildTLAS(D);this.performanceMetrics.tlasBuildTime=performance.now()-E,this.memory.mark(`assemble`);let A=performance.now();y||this._checkAssemblyHeadroom(O),this._setBVHData(Dn.lazy(O,16,Float32Array,void 0,Cn));let j=y?await this._beginBVHSpill(y,D.tlasNodeCount):null;this.bvh.setRecords(0,k),k=null,this.tlasBuilder.releaseFlattenBuffer();let M=Math.max(1,Math.ceil(D.templateCount/32));if(v){try{let e=performance.now();await jh(v.nodes,this.bvh,D.tlasNodeCount,O-D.tlasNodeCount),this.performanceMetrics.blasRestore.readMs=performance.now()-e}finally{v.release()}D.blasData.clear()}else{for(let e=0;e<D.templateCount;e++){let t=y?await this._readSpilledBLAS(y,e):D.blasData.get(e);if(!t)continue;let n=D.tplBlasOffset[e],r=n;for(let e of og(t))this.bvh.setRecords(r,e),r+=e.length/16;this._offsetBLASInPlace(n,r-n,n,D.tplTriOffset[e]),D.blasData.delete(e),await j?.(r),e%M===0&&this._sampleMemory(`assembling ${e}/${D.templateCount}`)}await j?.(O,!0),y&&await y.blasStore.dispose()}if(this._setBVHData(this.bvh.materializeAll()),v)for(let[e,t]of v.orders)D.bvhToOriginal.set(e,t);else this._buildBvhToOriginalMaps();this.performanceMetrics.bvhAssembleTime=performance.now()-A,D.originalToBvhMap.clear(),D.blasData.clear(),this.bvhRoot=!0,this._disposeRefitWorker();let N=performance.now()-e;ag.debug(J.list([`${J.n(D.setCount)} BLASes + TLAS`,`${J.n(this.bvh.recordCount)} nodes`,`SAH ${J.n(T.sah)} · objMed ${T.objMed} · spatMed ${T.spatMed} · failed ${T.failed}`,T.treeletsProcessed?`treelets ${T.treeletsImproved}/${T.treeletsProcessed} improved`:null,J.ms(N)])),H({status:`BVH construction complete`,progress:75})}catch(e){throw ag.error(`BVH build failed:`,e),H({status:`BVH error: ${e.message}`,failed:!0,progress:75}),e}}_blasWorkerOpts(){return{depth:this.config.bvhDepth,treeletOptimization:{enabled:this.config.enableTreeletOptimization!==!1,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold},reinsertionOptimization:{enabled:this.bvhBuilder.enableReinsertionOptimization,batchSizeRatio:this.bvhBuilder.reinsertionBatchSizeRatio,maxIterations:this.bvhBuilder.reinsertionMaxIterations},maxLeafSize:this.bvhBuilder.maxLeafSize,foldLeaves:this._foldLeaves===!0,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,logLevel:Kt()}}_isLargeMesh(e){return e.count>=$h&&_m(e.count)}async _buildLargeBLAS(e,t){if(e.count>eg)return this._buildSplitBLAS(e,t);let n=new Uint32Array(new SharedArrayBuffer(e.count*this.triangles.lanesPerRecord*4));this.triangles.readRecords(e.start,e.count,n),this.triangles.release(e.start,e.count);let r=await mm(n,this.config.bvhDepth,null,t);return r.reorderedTriangles?(this.triangles.setRecords(e.start,r.reorderedTriangles),delete r.reorderedTriangles):r.order&&(this._writeInOrder(e.start,r.triangles,r.order),delete r.order,delete r.triangles),r}async _buildSplitBLAS(e,t){let n=this.triangles,{order:r,pieces:i,tree:a}=await Lh(n,e.start,e.count,tg,{pause:()=>new Promise(e=>setTimeout(e,0))}),o=this._blasPool(t,null,null,Math.min(navigator.hardwareConcurrency||4,8));i.forEach((t,n)=>o.submit({m:n,range:{start:e.start+t.start,count:t.count}}));let s=[],c={};for(let{m:e,range:t,result:r}of await o.close()){r.aabb=new Float32Array(6),Tm.rootAABB(r.bvhData,n,t.start,t.count,r.aabb,0),s[e]=r;for(let[e,t]of Object.entries(r.splitStats??{}))typeof t==`number`&&(c[e]=(c[e]??0)+t)}return{...Vh(a,i,s,r),splitStats:c}}_blasCacheKey(e){let t={...e};delete t.logLevel;let n=typeof navigator<`u`?navigator.hardwareConcurrency:0;return`blas:2:${Hh}:${JSON.stringify(t)}:${n}:${this._sceneKey}`}async _restoreBLASes(e,t,n){if(!this._sceneKey||this.config.sceneCache===!1)return null;let r=Pu(Ks().cacheNamespace);if(!r)return null;this._blasKey=this._blasCacheKey(n);let i=await kh(r,this._blasKey);if(!i)return null;let a=e=>(ag.debug(`stored BLASes not used: ${e}`),i.release(),null),{index:o}=i;if(o.tlasNodeCount!==t||o.templates.length!==e.length)return a(`layout changed`);let s=t;for(let t=0;t<e.length;t++){let[n,r,i,c,l]=o.templates[t],u=e[t];if(u.t!==n||u.triOffset!==r||u.triCount!==i||l!==s)return a(`layout changed`);s+=c}if(s!==o.totalNodes)return a(`layout changed`);let c=performance.now(),l=await Oh(this.triangles,e);for(let t=0;t<e.length;t++)if(l[t]!==o.templates[t][6])return a(`triangles changed`);let u=performance.now();try{let t=new Map,n=[];for(let r=0;r<e.length;r++){let[a,s,c,l,,u,,d]=o.templates[r],f=await Mh(i.order,u,c);this._permuteRange(s,c,f),t.set(a,f),n.push({m:e[r].m,range:e[r].range,result:{bvhData:new Float32Array(Uint32Array.from(d).buffer),originalToBvh:null,nodeCount:l}})}return this._blasRestored=!0,this.performanceMetrics.blasRestore={checksumMs:u-c,permuteMs:performance.now()-u},ag.debug(`restored ${J.n(e.length)} stored BLASes`),{results:n,orders:t,nodes:i.nodes,release:i.release}}catch(e){throw i.release(),e}}_writeInOrder(e,t,n){let r=this.triangles,i=r.lanesPerRecord;for(let a=0,o=n.length;a<o;){let s=r.chunkFor(e+a),c=Math.min(o,(((e+a)/r.recordsPerChunk|0)+1)*r.recordsPerChunk-e);for(let o=r.baseOf(e+a);a<c;a++,o+=i){let e=n[a]*i;for(let n=0;n<i;n++)s[o+n]=t[e+n]}}}_permuteRange(e,t,n){let r=!0;for(let e=0;e<t&&r;e++)r=n[e]===e;if(r)return;let i=this.triangles.lanesPerRecord,a=this.triangles.slice(e,t),o=new a.constructor(a.length);if(i===20)for(let e=0,r=0;e<t;e++,r+=20){let t=n[e]*20;o[r]=a[t],o[r+1]=a[t+1],o[r+2]=a[t+2],o[r+3]=a[t+3],o[r+4]=a[t+4],o[r+5]=a[t+5],o[r+6]=a[t+6],o[r+7]=a[t+7],o[r+8]=a[t+8],o[r+9]=a[t+9],o[r+10]=a[t+10],o[r+11]=a[t+11],o[r+12]=a[t+12],o[r+13]=a[t+13],o[r+14]=a[t+14],o[r+15]=a[t+15],o[r+16]=a[t+16],o[r+17]=a[t+17],o[r+18]=a[t+18],o[r+19]=a[t+19]}else for(let e=0;e<t;e++){let t=n[e]*i,r=e*i;for(let e=0;e<i;e++)o[r+e]=a[t+e]}this.triangles.setRecords(e,o)}async _storeBLASes(e){let t=Pu(Ks().cacheNamespace),n=this.instanceTable;if(!t||!n||!this.bvh)return!1;let r=this._blasKey,i=this._geometryVersion,a=()=>this._geometryVersion!==i||this._blasKey!==r,o=[];for(let e=0;e<n.templateCount;e++){let t=n.tplOwner[e];t<0||n.sourceMesh[t]!==e||o.push({t:e,triOffset:n.tplTriOffset[e],triCount:n.tplTriCount[e],nodeCount:n.tplNodeCount[e],blasOffset:n.tplBlasOffset[e]})}let s=await Oh(this.triangles,o);if(a())return!1;let c=e=>{let t=this.bvhIndexChunks.chunkFor(e),n=this.bvhIndexChunks.baseOf(e);return Array.from(t.subarray(n,n+16))},l=0,u=[],d=o.map((e,t)=>{u.push(n.bvhToOriginal.get(e.t)??Uint32Array.from({length:e.triCount},(e,t)=>t));let r=[e.t,e.triOffset,e.triCount,e.nodeCount,e.blasOffset,l,s[t],c(e.blasOffset)];return l+=e.triCount,r}),f=await Ah(t,r,{index:{v:2,tlasNodeCount:n.tlasNodeCount,totalNodes:n.totalNodeCount,templates:d},bvh:this.bvh,orders:u,isStale:a,label:e});return f&&ag.debug(`stored ${J.n(o.length)} BLASes for the next load`),f}async _beginProgressiveSpill(e){let{storage:t,uploader:n}=this._progressive,r=this.triangles,i=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,a=r.recordsPerChunk*r.lanesPerRecord*r.LaneType.BYTES_PER_ELEMENT,o=await _r.create(t,`${i}:tri`,a,{label:`Triangle records`,expectedBytes:r.byteLength}),s=o&&await _r.create(t,`${i}:blas`,0,{label:`BLAS nodes (while building)`});if(!s)return await o?.dispose(),null;let c={key:i,triStore:o,blasStore:s,bvhStore:null,blasBytes:0,blasAt:new Map,pending:new Int32Array(r.chunks.length),emitterChunks:new Set,isEmitter:e=>{let t=this.materials[e];return(t?.emissiveIntensity??0)>0&&!!t.emissive&&(t.emissive.r>0||t.emissive.g>0||t.emissive.b>0)},uploadTriangles:n(r,`triangles`),chain:Promise.resolve(),error:null};this._spillStores=[o],this._blasKey=null;for(let{triOffset:t,triCount:n}of e)this._forEachChunk(r,t,n,e=>c.pending[e]++);for(let e=0;e<r.chunks.length;e++)c.pending[e]===0&&this._finishTriangleChunk(c,e);return c}_forEachChunk(e,t,n,r){if(n<=0)return;let i=(t+n-1)/e.recordsPerChunk|0;for(let n=t/e.recordsPerChunk|0;n<=i;n++)r(n)}_onBLASBuilt(e,t,n,r){let i=this.instanceTable,a=r.bvhData;i.tplTriOffset[t]=n.start,i.tplTriCount[t]=n.count,i._readRootAABB(og(a)[0],t,this.triangles,i.tplObjectAABB,t*6);let o=e.blasBytes;e.blasBytes+=sg(a),e.blasAt.set(t,o),r.nodeCount=sg(a)/64,r.bvhData=null,this._queueSpill(e,()=>lg(e.blasStore,o,a)),this._forEachChunk(this.triangles,n.start,n.count,t=>{--e.pending[t]===0&&this._finishTriangleChunk(e,t)})}_queueSpill(e,t){e.chain=e.chain.then(t).catch(t=>{e.error??=t})}_finishTriangleChunk(e,t){this._queueSpill(e,async()=>{let n=this.triangles,r=n.chunks[t];if(!r)return;e.uploadTriangles(t);let i=n.lanesPerRecord;for(let n=st.MATERIAL_FLAGS_OFFSET;n<r.length;n+=i)if(e.isEmitter(r[n]&16777215)){e.emitterChunks.add(t);return}await n.spillChunk(t,e.triStore)})}async _readSpilledBLAS(e,t){let n=e.blasAt.get(t);if(n===void 0)return null;let r=this.instanceTable.tplNodeCount[t]*64,i=[];for(let t=0;t<r;t+=cg)i.push(new Float32Array(await e.blasStore.readAt(n+t,Math.min(cg,r-t))));return i}async _beginBVHSpill(e,t){let{storage:n,uploader:r}=this._progressive,i=this.bvh,a=i.recordsPerChunk*i.lanesPerRecord*i.LaneType.BYTES_PER_ELEMENT,o=await _r.create(n,`${e.key}:bvh`,a,{label:`BLAS nodes`,expectedBytes:i.recordCount*64}),s=r(i),c=Math.ceil(t/i.recordsPerChunk);o&&this._spillStores.push(o);let l=c;return async(e,t=!1)=>{for(;l<i.chunks.length&&(t||(l+1)*i.recordsPerChunk<=e);)i.chunks[l]||i._materialize(l),s(l),o&&await i.spillChunk(l,o),l++;if(t)for(let e=0;e<Math.min(c,i.chunks.length);e++)i.chunks[e]||i._materialize(e),s(e)}}_offsetBLASInPlace(e,t,n,r){let i=this.bvhIndexChunks;for(let a=e,o=e+t;a<o;){let e=i.chunkFor(a),t=Math.min(o,((a/i.recordsPerChunk|0)+1)*i.recordsPerChunk),s=i.baseOf(a);Tp(e,n,r,s,s+(t-a)*16),a=t}}_buildBLASesWithPool(e,t,n,r=null){let i=this._blasPool(t,n,r);for(let t of e)i.submit(t);return i.close()}_blasPool(e,t,n=null,r=this.config.maxConcurrentTextureTasks||4){let i=[],a=[],o=[],s=[],c=!1,l=0,u=0,d=null,f,p=new Promise((e,t)=>f={resolve:e,reject:t});p.catch(()=>{});let m=e=>{d||(d=e,o.forEach(e=>e.terminate()),f.reject(e))},h=()=>{d||!c||i.length>0||l>0||(o.forEach(e=>e.terminate()),f.resolve(a))},g=t=>{let n=i.shift();if(!n){s.push(t),h();return}let{m:r,range:a}=n;l++;try{let n=this.triangles.copyOf(a.start,a.count),i=a.count,o=i<=500?{...e.treeletOptimization,enabled:!1}:e.treeletOptimization;t._currentTask={m:r,range:a},t.postMessage({triangleData:n.buffer,triangleByteOffset:n.byteOffset,triangleByteLength:n.byteLength,triangleCount:i,depth:e.depth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:o,reinsertionOptimization:e.reinsertionOptimization,maxLeafSize:e.maxLeafSize,foldLeaves:e.foldLeaves,numBins:e.numBins,maxBins:e.maxBins,minBins:e.minBins,logLevel:e.logLevel},[n.buffer])}catch(e){m(e)}},_=(e,r)=>{let i=r.data;if(i.error){m(Error(i.error));return}if(i.progress!==void 0)return;let{m:o,range:s}=e._currentTask;l--;try{i.triangles&&this.triangles.setRecords(s.start,i.triangles);let e={bvhData:i.bvhData,originalToBvh:i.originalToBvh||null,splitStats:i.treeletStats||null};n?.(o,s,e),a.push({m:o,range:s,result:e})}catch(e){m(e);return}u++,t?.(u),g(e)},v=()=>{let e=new om;return e.onmessage=t=>_(e,t),e.onerror=e=>m(e),o.push(e),e};return{submit(e){if(!d){i.push(e);try{let e=s.pop()??(o.length<r?v():null);e&&g(e)}catch(e){m(e)}}},close(){return c=!0,h(),p},abort(e){m(e??Error(`BLAS pool aborted`))},get pending(){return i.length+l},get error(){return d}}}_buildBvhToOriginalMaps(){let e=this.instanceTable;for(let t=0;t<e.count;t++){if(!e.isSet[t]||!e.isOwner(t))continue;let n=e.sourceMesh[t],r=e.tplTriCount[n],i=e.originalToBvhMap.get(n),a=new Uint32Array(r);if(i)for(let e=0;e<r;e++)a[i[e]]=e;else for(let e=0;e<r;e++)a[e]=e;e.bvhToOriginal.set(n,a),e.originalToBvhMap.delete(n)}}async _createMaterialTextures(){this._log(`Creating material textures (parallel with BVH)`);try{let{srgbLists:e,linearLists:t,remap:n}=this._bucketTextures();this._remapMaterialTextureIndices(n),this.materials?.length&&(this.materialData=this.textureCreator.createMaterialRawData(this.materials));let i=(e,t)=>e.length===0?Promise.resolve(null):this.textureCreator.createTexturesToDataTexture(e,{srgbPool:t}).then(e=>(e&&t&&(e.colorSpace=r.SRGBColorSpace),e)),[a,o]=await Promise.all([Promise.all(e.map(e=>i(e,!0))),Promise.all(t.map(e=>i(e,!1)))]);this.srgbBucketTextures=a,this.linearBucketTextures=o,this._log(`Material textures complete`,{materialData:!!this.materialData,srgbBuckets:a.map(e=>e?`${e.image.width}x${e.image.height}x${e.image.depth}`:`-`).join(`,`),linearBuckets:o.map(e=>e?`${e.image.width}x${e.image.height}x${e.image.depth}`:`-`).join(`,`)})}catch(e){throw ag.error(`texture creation failed:`,e),e}}_bucketTextures(){let e=this.config.maxTextureSize,t=xt.MATERIAL_BUCKET_COUNT,n=xt.BUCKET_LAYER_STRIDE,r=e=>{let t=new Set,n=[];for(let r of e)for(let e of r||[]){if(!e?.image)continue;let r=e.source?.uuid??e.uuid;t.has(r)||(t.add(r),n.push({width:e.image.width,height:e.image.height}))}return n},i=[this.maps,this.emissiveMaps,this.sheenColorMaps,this.specularColorMaps],a=[this.normalMaps,this.bumpMaps,this.roughnessMaps,this.metalnessMaps,this.displacementMaps,this.anisotropyMaps,this.transmissionMaps,this.clearcoatMaps,this.clearcoatRoughnessMaps,this.sheenRoughnessMaps,this.iridescenceMaps,this.iridescenceThicknessMaps,this.specularIntensityMaps],o=At(r(i),e,t),s=At(r(a),e,t);this._srgbBucketShapes=o,this._linearBucketShapes=s;let c=Array.from({length:t},()=>[]),l=Array.from({length:t},()=>[]),u=Array.from({length:t},()=>new Map),d=Array.from({length:t},()=>new Map);this._srgbTexPacked=new Map,this._linearTexPacked=new Map;let f=!1,p=!1,m=(e,t,r,i,a)=>{if(!e)return-1;if(!e.image)return p||this.config.issues?.record(Y.TEXTURE_BUILD_FAILED,`a material map had not finished decoding when the scene was packed; it renders untextured`,{texture:e.name||e.source?.uuid||e.uuid}),p=!0,-1;let o=jt(e.image.width,e.image.height,a),s=e.source?.uuid??e.uuid,c=r[o].get(s);if(c!==void 0)return Mt(o,c);if(t[o].length>=n)return ag.warn(`texture bucket ${o} full (${n}); dropping a map`),f||this.config.issues?.record(Y.TEXTURE_LIMIT_EXCEEDED,`texture bucket ${o} full (${n} layers); the rest render untextured`,{bucket:o,limit:n}),f=!0,-1;t[o].push(e);let l=t[o].length-1;r[o].set(s,l);let u=Mt(o,l);return i.set(s,u),u},h=(e,t,n,r,i)=>(e||[]).map(e=>m(e,t,n,r,i));return{srgbLists:c,linearLists:l,remap:{albedo:h(this.maps,c,u,this._srgbTexPacked,o),emissive:h(this.emissiveMaps,c,u,this._srgbTexPacked,o),normal:h(this.normalMaps,l,d,this._linearTexPacked,s),bump:h(this.bumpMaps,l,d,this._linearTexPacked,s),roughness:h(this.roughnessMaps,l,d,this._linearTexPacked,s),metalness:h(this.metalnessMaps,l,d,this._linearTexPacked,s),displacement:h(this.displacementMaps,l,d,this._linearTexPacked,s),anisotropy:h(this.anisotropyMaps,l,d,this._linearTexPacked,s),transmission:h(this.transmissionMaps,l,d,this._linearTexPacked,s),clearcoat:h(this.clearcoatMaps,l,d,this._linearTexPacked,s),clearcoatRoughness:h(this.clearcoatRoughnessMaps,l,d,this._linearTexPacked,s),sheenColor:h(this.sheenColorMaps,c,u,this._srgbTexPacked,o),sheenRoughness:h(this.sheenRoughnessMaps,l,d,this._linearTexPacked,s),iridescence:h(this.iridescenceMaps,l,d,this._linearTexPacked,s),iridescenceThickness:h(this.iridescenceThicknessMaps,l,d,this._linearTexPacked,s),specularIntensity:h(this.specularIntensityMaps,l,d,this._linearTexPacked,s),specularColor:h(this.specularColorMaps,c,u,this._srgbTexPacked,o)}}}_remapMaterialTextureIndices(e){let t=(e,t)=>e>=0&&e<t.length?t[e]:-1;for(let n of this.materials)n.map=t(n.map,e.albedo),n.emissiveMap=t(n.emissiveMap,e.emissive),n.normalMap=t(n.normalMap,e.normal),n.bumpMap=t(n.bumpMap,e.bump),n.roughnessMap=t(n.roughnessMap,e.roughness),n.metalnessMap=t(n.metalnessMap,e.metalness),n.displacementMap=t(n.displacementMap,e.displacement),n.anisotropyMap=t(n.anisotropyMap,e.anisotropy),n.transmissionMap=t(n.transmissionMap,e.transmission),n.clearcoatMap=t(n.clearcoatMap,e.clearcoat),n.clearcoatRoughnessMap=t(n.clearcoatRoughnessMap,e.clearcoatRoughness),n.sheenColorMap=t(n.sheenColorMap,e.sheenColor),n.sheenRoughnessMap=t(n.sheenRoughnessMap,e.sheenRoughness),n.iridescenceMap=t(n.iridescenceMap,e.iridescence),n.iridescenceThicknessMap=t(n.iridescenceThicknessMap,e.iridescenceThickness),n.specularIntensityMap=t(n.specularIntensityMap,e.specularIntensity),n.specularColorMap=t(n.specularColorMap,e.specularColor)}_buildEmissiveData(){this.emissiveTriangleCount=this.emissiveTriangleBuilder.extractEmissiveTriangles(this.triangles,this.materials,this.triangleCount,this.instanceTable??null),this.emissiveTriangleData=this.emissiveTriangleBuilder.createEmissiveRawData(),this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower,this._log(`Emissive triangle extraction complete`,this.emissiveTriangleBuilder.getStats()),this.emissiveTriangleBuilder.buildLightBVH(),this.lightBVHNodeData=this.emissiveTriangleBuilder.lightBVHNodeData,this.lightBVHNodeCount=this.emissiveTriangleBuilder.lightBVHNodeCount,this.emissiveTriangleData=this.emissiveTriangleBuilder.emissiveTriangleData||this.emissiveTriangleData,this.emissiveBitTrailMap=this.emissiveTriangleBuilder.emissiveBitTrailMap,this.emissiveTriangleCount=this.emissiveTriangleBuilder.emissiveCount,this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower}_createSpheres(){return[]}_reset(){this._geometryVersion=(this._geometryVersion??0)+1,this._disposeSpill(),this._disposeGeometrySpill(),this._disposeTextures(),this.triangles=[],this._setTriangleData(null),this.triangleCount=0,this.materials=[],this.meshTriangleRanges=null,this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.roughnessMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this.spheres=[],this.bvhRoot=null,this.bvh=null,this.bvhData=null,this.bvhIndexChunks=null,this.bvhIndex=null,this.instanceTable=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,blasBuildTime:0,blasWorkerTime:0,tlasBuildTime:0,bvhAssembleTime:0,totalProcessingTime:0}}_disposeTextures(){this._disposeBucketTextures()}_disposeBucketTextures(){for(let e of[`srgbBucketTextures`,`linearBucketTextures`]){let t=this[e];if(t){for(let n of t)if(n&&typeof n.dispose==`function`)try{n.dispose()}catch(t){ag.warn(`error disposing ${e}:`,t)}this[e]=null}}}async rebuildMaterials(e){if(this.isProcessing)throw Error(`Already processing. Cannot rebuild materials during processing.`);this._log(`Rebuilding materials and textures`);let t=performance.now();try{this.isProcessing=!0;let n=this.geometryExtractor.extractMaterialsOnly(e);this._disposeMaterialTextures(),this.materials=n.materials,this.meshes=n.meshes,this.maps=n.maps,this.normalMaps=n.normalMaps,this.bumpMaps=n.bumpMaps,this.roughnessMaps=n.roughnessMaps,this.metalnessMaps=n.metalnessMaps,this.emissiveMaps=n.emissiveMaps,this.displacementMaps=n.displacementMaps,await this._createMaterialTextures();let r=performance.now()-t;return this._log(`Material rebuild complete (${r.toFixed(2)}ms)`,{materials:this.materials.length,textures:this.maps.length}),this}catch(e){throw ag.error(`material rebuild failed:`,e),e}finally{this.isProcessing=!1}}_disposeMaterialTextures(){this._disposeBucketTextures(),this.textureCreator&&this.textureCreator.textureCache&&(this.textureCreator.textureCache.dispose(),this.textureCreator.textureCache=new this.textureCreator.textureCache.constructor)}getStatistics(){let e={triangleCount:this.triangleCount,materialCount:this.materials.length,textureCount:this.maps.length,lightCount:this.directionalLights.length,cameraCount:this.cameras.length,processingComplete:this.processingStage===`complete`,hasBVH:!!this.bvhRoot,hasTextures:!!this.materialData&&!!this.bvh,useFloat32Array:this.config.useFloat32Array,triangleDataSize:this.triangles?(this.triangles.byteLength/(1024*1024)).toFixed(2)+`MB`:`0MB`};return this.performanceMetrics.totalProcessingTime>0&&(e.performance={totalTime:this.performanceMetrics.totalProcessingTime,textureTime:this.performanceMetrics.textureCreationTime,bvhTime:this.performanceMetrics.bvhBuildTime,extractionTime:this.performanceMetrics.geometryExtractionTime,texturePercentage:(this.performanceMetrics.textureCreationTime/this.performanceMetrics.totalProcessingTime*100).toFixed(1)+`%`}),this.textureCreator&&this.textureCreator.capabilities&&(e.textureCapabilities=this.textureCreator.capabilities),e}updateConfig(e){Object.assign(this.config,e),this.bvhBuilder&&(this.bvhBuilder.maxLeafSize=this.config.maxLeafSize,this.bvhBuilder.setTreeletConfig({enabled:this.config.enableTreeletOptimization,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold})),this._log(`Configuration updated`,this.config)}_adoptSharedChunks(e,t){let n=this[e];if(n.shared)return;let r=n.chunks.map(e=>{let n=new t(new SharedArrayBuffer(e.byteLength));return n.set(e),n}),i=Dn.adopt(r,n.recordCount,n.lanesPerRecord,n.recordsPerChunk);e===`bvh`?this._setBVHData(i):this._setTriangleData(i)}_meshSource(e,t){if(e==null)return null;let n=this.instanceTable;if(typeof e==`function`)return r=>{let i=n.sourceMesh[r],a=e(i,n.triCountOf(r)),o=n.triCountOf(r)*9;if(a&&a.length!==o)throw Error(`SceneProcessor: ${t}s for mesh ${i} must be ${o} floats (${n.triCountOf(r)} triangles × 9), got ${a.length}.`);return a??null};let r=(this.expandedTriangleCount??this.triangleCount)*9;if(e.length!==r)throw Error(`SceneProcessor: expected ${r} ${t} floats (${r/9} triangles × 9, full scene), got ${e.length}. Pass a per-mesh callback instead to avoid building one array for the whole scene.`);return t=>{let r=n.expandedStartOf(t)*9;return e.subarray(r,r+n.triCountOf(t)*9)}}async refitBVH(e,t){if(this._geometryVersion=(this._geometryVersion??0)+1,!this.bvh||!this.triangles||!this.instanceTable)throw Error(`No BVH data available for refit. Run buildBVH() first.`);let n=this._meshSource(e,`position`),r=this._meshSource(t,`normal`);if(!n)throw Error(`SceneProcessor.refitBVH: positions are required.`);if(this._refitWorker||=new Jh,!this._refitSharedBuffers){this._adoptSharedChunks(`bvh`,Float32Array),this._adoptSharedChunks(`triangles`,Uint32Array);let e=this.bvh.chunks.map(e=>e.buffer),t=this.triangles.chunks.map(e=>e.buffer);this._refitSharedBuffers={bvhBufs:e,triBufs:t},this._refitWorker.postMessage({type:`init`,sharedBvhBufs:e,bvhRecordCount:this.bvh.recordCount,bvhRecordsPerChunk:this.bvh.recordsPerChunk,sharedTriBufs:t,triRecordCount:this.triangles.recordCount,triLanesPerRecord:this.triangles.lanesPerRecord,triRecordsPerChunk:this.triangles.recordsPerChunk})}let i=this.instanceTable;for(let e=0;e<i.count;e++){if(!i.isSet[e]||!i.isOwner(e))continue;let t=n(e);if(t&&(this._updateMeshTrianglePositions(e,t),r)){let t=r(e);t&&this._patchMeshSmoothNormals(e,t)}}return new Promise((e,t)=>{this._refitWorker.onmessage=n=>{let r=n.data;r.type===`refitComplete`?e({refitTimeMs:r.refitTimeMs}):r.type===`error`&&t(Error(r.error))},this._refitWorker.postMessage({type:`refit`})})}_patchSmoothNormals(e){let t=this.instanceTable;if(t)for(let n=0;n<t.count;n++){if(!t.isSet[n]||!t.isOwner(n))continue;let r=e(n);r&&this._patchMeshSmoothNormals(n,r)}}_placementOf(e){return this.instanceTable?.placementRunOf(e)?.start??-1}refitBLASes(e,t,n){if(this._geometryVersion=(this._geometryVersion??0)+1,!this.instanceTable||!this.bvh||!this.triangles)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let r=this._meshSource(t,`position`),i=this._meshSource(n,`normal`);if(!r)throw Error(`SceneProcessor.refitBLASes: positions are required.`);let a=performance.now();this._blasRefitter||=new rm;let o=this.instanceTable;for(let t of e){let e=this._placementOf(t);if(e<0||!o.isSet[e])continue;if(!o.isOwner(e)){let n=o.tplOwner[o.sourceMesh[e]];this.config.issues?.record(Y.REFIT_SHARED_GEOMETRY,`mesh ${t} shares its triangles with another placement; deforming it would move every copy, so it was skipped`,{meshIndex:t,owner:o.sourceMesh[n]??n});continue}let n=r(e);if(n){if(this._updateMeshTrianglePositions(e,n),i){let t=i(e);t&&this._patchMeshSmoothNormals(e,t)}this._blasRefitter.refitRange(this.bvh,this.triangles,o.blasOffsetOf(e),o.blasNodeCountOf(e)),this.instanceTable.recomputeAABB(e,this.bvh,this.triangles)}}return this._refitTLAS(),{refitTimeMs:performance.now()-a}}updateMeshTransforms(e){if(!this.instanceTable||!this.bvh)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let t=performance.now(),n=this.instanceTable,r=this._transformScratch??=new Float32Array(16),i=0;for(let t of e){let e=this.meshes?.[t],a=n.placementRunOf(t);if(!e||!a)continue;e.updateMatrixWorld(!0);let o=e.matrixWorld.elements,s=e.isInstancedMesh?this._ownInstanceMatrices(e):null,c=n.tplBakeInverse?.get(n.sourceMesh[a.start])??null;for(let e=0;e<a.count;e++){let t=a.start+e;n.isSet[t]&&(s?(xm(o,s,e*16,r),n.setPlacementMatrix(t,r)):c?(xm(o,c,0,r),n.setPlacementMatrix(t,r)):n.setPlacementMatrix(t,o),this._writeLeafMatrix(t),i++)}}return this._refitTLAS(),{refitTimeMs:performance.now()-t,placements:i}}_ownInstanceMatrices(e){let t=e.instanceMatrix;return t?.array?(t.array.buffer===this.instanceTable.world.buffer&&(t.array=t.array.slice(),t.needsUpdate=!0),t.array):null}_writeLeafMatrix(e){let t=this.instanceTable.tlasLeafIndex[e];t<0||Nm.writeLeafMatrix(this.bvh.chunkFor(t),this.bvhIndexChunks.chunkFor(t),this.bvh.baseOf(t),this.instanceTable.world,e)}computeTLASDirtyRange(){return{offset:0,count:this.instanceTable.tlasNodeCount*16}}computeBLASDirtyRanges(e){let t=st.FLOATS_PER_TRIANGLE,n=[],r=[];for(let i of e){let e=this.instanceTable,a=this._placementOf(i);a<0||!e.isSet[a]||(n.push({offset:e.triOffsetOf(a)*t,count:e.triCountOf(a)*t}),r.push({offset:e.blasOffsetOf(a)*16,count:e.blasNodeCountOf(a)*16}))}return r.push({offset:0,count:this.instanceTable.tlasNodeCount*16}),{triRanges:n,bvhRanges:r}}uploadToPathTracer(e,t,n,r,{keepUserLights:i=!1}={}){return this.triangles?(e.setTriangleData(this.triangles,this.triangleCount),this.bvh?(e.setBVHData(this.bvh),e.setInstanceTable(this.instanceTable),this.materialData?e.materialData.setMaterialData(this.materialData,this.materials.map(e=>e.sources)):ag.warn(`no material data, using defaults`),r&&e.environment.setEnvironmentTexture(r),e.materialData.setMaterialTextures({srgbBuckets:this.srgbBucketTextures,linearBuckets:this.linearBucketTextures}),e.materialData.setTexturePackMaps?.(this._srgbTexPacked,this._linearTexPacked),this.emissiveTriangleData&&(e.setEmissiveTriangleData(this.emissiveTriangleData,this.emissiveTriangleCount,this.emissiveTotalPower,this.emissiveBitTrailMap),this._releaseBitTrailMap()),this.lightBVHNodeData&&e.setLightBVHData(this.lightBVHNodeData,this.lightBVHNodeCount),t.transferSceneLights(n,{keepUserLights:i}),!0):(ag.error(`failed to get BVH data`),!1)):(ag.error(`failed to get triangle data`),!1)}updateMaterialEmissive(e,t,n){if(!this.emissiveTriangleBuilder)return null;let r=this.materials[e];return!r||(t===`emissive`?r.emissive=n:t===`emissiveIntensity`&&(r.emissiveIntensity=n),!this.emissiveTriangleBuilder.updateMaterialEmissive(e,r,this.triangles,this.materials,this.triangleCount))?null:this._collectEmissivePayload()}rebuildEmissiveColors(){return!this.emissiveTriangleBuilder||!this.triangleCount?null:(this.emissiveTriangleBuilder.extractEmissiveTriangles(this.triangles,this.materials,this.triangleCount,this.instanceTable??null),this.emissiveTriangleBuilder.createEmissiveRawData(),this._collectEmissivePayload())}rebuildEmissiveForVisibility(e,t=!1){return!this.emissiveTriangleBuilder||!this.emissiveTriangleBuilder.setHiddenMeshes(e)&&!t?null:this._collectEmissivePayload()}movesEmitters(e){let t=this.emissiveTriangleBuilder?.emissiveMeshes;return!!t?.size&&e.some(e=>t.has(e))}refreshEmissiveTransforms(){let e=this.emissiveTriangleBuilder;return!e?.emissiveTriangles.length||!this.instanceTable||!this.triangles?null:(e.refreshTransforms(this.triangles,this.instanceTable),this._collectEmissivePayload())}_collectEmissivePayload(){this.emissiveTriangleBuilder.buildLightBVH(),this.lightBVHNodeData=this.emissiveTriangleBuilder.lightBVHNodeData,this.lightBVHNodeCount=this.emissiveTriangleBuilder.lightBVHNodeCount,this.emissiveTriangleData=this.emissiveTriangleBuilder.emissiveTriangleData,this.emissiveBitTrailMap=this.emissiveTriangleBuilder.emissiveBitTrailMap,this.emissiveTriangleCount=this.emissiveTriangleBuilder.emissiveCount,this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower;let e=this.emissiveBitTrailMap;return this._releaseBitTrailMap(),{rawData:this.emissiveTriangleData,emissiveCount:this.emissiveTriangleCount,totalPower:this.emissiveTotalPower,bitTrailMap:e,lightBVHNodeData:this.lightBVHNodeData,lightBVHNodeCount:this.lightBVHNodeCount}}get spilled(){return!!(this.triangles?.spilledChunks||this.bvh?.spilledChunks)}async spillToDisk(e){let t=this.triangles,n=this.bvh;if(!e||this.spilled||this._spillStores||!t?.chunks||t.chunks.length<2||!n?.chunks)return null;await this._blasStoring;let r=this._geometryVersion,i=performance.now(),a=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,o=e=>e.recordsPerChunk*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT,s=await _r.create(e,`${a}:tri`,o(t),{label:`Triangle records`,expectedBytes:t.byteLength}),c=s&&await _r.create(e,`${a}:bvh`,o(n),{label:`BLAS nodes`,expectedBytes:n.byteLength});if(!s||!c)return await s?.dispose(),null;this._spillStores=[s,c];let l=Math.ceil((this.instanceTable?.tlasNodeCount??1)/n.recordsPerChunk),u=await t.spill(s);if(u+=await n.spill(c,{keep:e=>e<l}),await s.flush(),await c.flush(),r!==this._geometryVersion)return null;let d=performance.now()-i;return ag.info(`spilled ${(u/1048576).toFixed(0)} MB of triangles and BLAS nodes to disk in ${d.toFixed(0)} ms`),{bytes:u,ms:d}}ensureResident(){return this._paging??=(async()=>{await this.triangles?.ensureResident?.(),await this.bvh?.ensureResident?.(),this.spilled||this._disposeSpill()})().finally(()=>{this._paging=null}),this._paging}async _restoreGeometry(e){let t=this._geometrySpill;if(!t?.bytes)return;H({status:`Reading scene geometry back...`,progress:84});let n=performance.now(),r=t.bytes;await t.restore(),this._disposeGeometrySpill(),this._geometryBytes=Mr(e),ag.info(`read ${J.mb(r)} of scene geometry back from disk in ${J.ms(performance.now()-n)}`),t.error&&ag.warn(`some scene geometry stayed in memory, its spill write failed:`,t.error)}_disposeGeometrySpill(){let e=this._geometrySpill;this._geometrySpill=null,e?.dispose().catch(()=>{})}_disposeSpill(){let e=this._spillStores;this._spillStores=null;for(let t of e??[])t.dispose().catch(()=>{})}_releaseBitTrailMap(){this.emissiveBitTrailMap=null,this.emissiveTriangleBuilder&&(this.emissiveTriangleBuilder.emissiveBitTrailMap=null)}async _buildTLAS(e){let t=e.count;if(t>=Qh&&!this._tlasWorkerFailed)try{let n=new Float64Array(t*6);e.writeWorldAABBs(n);let{tlasData:r,nodeCount:i}=await this._runTLASWorker(n,t);return Nm.fillLeaves(r,i,e),r}catch(e){this._tlasWorkerFailed=!0,ag.warn(`TLAS worker unavailable (${e.message}); building on the main thread`)}return this.tlasBuilder.build(e).data}_runTLASWorker(e,t){this._tlasWorker||=new Zh;let n=this._tlasWorker;return new Promise((r,i)=>{let a=e=>{n.removeEventListener(`message`,a),n.removeEventListener(`error`,o),e.data?.error?i(Error(e.data.error)):r(e.data)},o=e=>{n.removeEventListener(`message`,a),n.removeEventListener(`error`,o),i(Error(e.message||`worker error`))};n.addEventListener(`message`,a),n.addEventListener(`error`,o),n.postMessage({aabbs:e.buffer,count:t,logLevel:Kt()},[e.buffer])})}_setBVHData(e){let t=e?e instanceof Dn?e:Dn.adopt([e],e.length/16,16,e.length/16):null;this.bvh=t,t&&this._foldLeaves&&(t.foldedLeaves=!0),this.bvhIndexChunks=t?t.viewAs(Uint32Array):null,this.bvhData=t?t.single:null,this.bvhIndex=this.bvhIndexChunks?this.bvhIndexChunks.single:null}_setTriangleData(e){let t=st.FLOATS_PER_TRIANGLE,n=e?e instanceof Dn?e:Dn.adopt([e],e.length/t,t,e.length/t):null;this.triangles=n,this.triangleFloatChunks=n?n.viewAs(Float32Array):null,this.triangleData=n?n.single:null,this.triangleFloats=this.triangleFloatChunks?this.triangleFloatChunks.single:null}_updateMeshTrianglePositions(e,t){let n=st.POSITION_A_OFFSET,r=st.POSITION_B_OFFSET,i=st.POSITION_C_OFFSET,a=st.NORMAL_A_PACKED_OFFSET,o=st.NORMAL_B_PACKED_OFFSET,s=st.NORMAL_C_PACKED_OFFSET,c=this.triangles,l=this.triangleFloatChunks,u=this.instanceTable,d=u.bvhToOriginalOf(e),f=u.triOffsetOf(e),p=u.triCountOf(e),m=u.matrixInverseOf(e),h=Sm(m);for(let e=0;e<p;e++){let u=d?d[e]:e,p=f+e,g=l.chunkFor(p),_=c.chunkFor(p),v=c.baseOf(p),y=u*9,b=t[y],x=t[y+1],S=t[y+2],C=t[y+3],w=t[y+4],T=t[y+5],E=t[y+6],D=t[y+7],O=t[y+8];if(!h){let e=(e,t,n)=>m[0]*e+m[4]*t+m[8]*n+m[12],t=(e,t,n)=>m[1]*e+m[5]*t+m[9]*n+m[13],n=(e,t,n)=>m[2]*e+m[6]*t+m[10]*n+m[14],r=[e(b,x,S),t(b,x,S),n(b,x,S)],i=[e(C,w,T),t(C,w,T),n(C,w,T)],a=[e(E,D,O),t(E,D,O),n(E,D,O)];b=r[0],x=r[1],S=r[2],C=i[0],w=i[1],T=i[2],E=a[0],D=a[1],O=a[2]}g[v+n]=b,g[v+n+1]=x,g[v+n+2]=S,g[v+r]=C,g[v+r+1]=w,g[v+r+2]=T,g[v+i]=E,g[v+i+1]=D,g[v+i+2]=O;let k=C-b,A=w-x,j=T-S,M=E-b,N=D-x,P=O-S,F=dt(A*P-j*N,j*M-k*P,k*N-A*M);_[v+a]=F,_[v+o]=F,_[v+s]=F}}_patchMeshSmoothNormals(e,t){let n=this.instanceTable;this._patchNormalsRange(t,n.triOffsetOf(e),n.triCountOf(e),n.matrixWorldOf(e),n.bvhToOriginalOf(e))}_patchNormalsRange(e,t,n,r,i){let a=st.NORMAL_A_PACKED_OFFSET,o=st.NORMAL_B_PACKED_OFFSET,s=st.NORMAL_C_PACKED_OFFSET,c=r,l=!c||Sm(c),u=[a,o,s];for(let r=0;r<n;r++){let n=t+r,a=this.triangles.chunkFor(n),o=this.triangles.baseOf(n),s=(i?i[r]:r)*9;for(let t=0;t<3;t++){let n=s+t*3,r=e[n],i=e[n+1],d=e[n+2],f=r,p=i,m=d;if(!l){f=c[0]*r+c[1]*i+c[2]*d,p=c[4]*r+c[5]*i+c[6]*d,m=c[8]*r+c[9]*i+c[10]*d;let e=Math.hypot(f,p,m)||1;f/=e,p/=e,m/=e}a[o+u[t]]=dt(f,p,m)}}}_refitTLAS(){let e=this.instanceTable.tlasNodeCount;(!this._tlasBounds||this._tlasBounds.length<e*6)&&(this._tlasBounds=new Float32Array(e*6));let t=this.instanceTable;for(let n=e-1;n>=0;n--){let e=this.bvhIndexChunks.chunkFor(n),r=this.bvh.chunkFor(n),i=this.bvh.baseOf(n),a=e[i+3];if(a===_t.BLAS_POINTER_LEAF){let r=e[i+1]>r<t.count&&t.writeWorldAABB(r,this._tlasBounds,n*6)}else if(a<_t.TRIANGLE_LEAF){let t=a,o=e[i+7],s=t*6,c=o*6,l=this._tlasBounds;r[i]=l[s],r[i+1]=l[s+1],r[i+2]=l[s+2],r[i+4]=l[s+3],r[i+5]=l[s+4],r[i+6]=l[s+5],r[i+8]=l[c],r[i+9]=l[c+1],r[i+10]=l[c+2],r[i+12]=l[c+3],r[i+13]=l[c+4],r[i+14]=l[c+5];let u=n*6;l[u]=Math.min(l[s],l[c]),l[u+1]=Math.min(l[s+1],l[c+1]),l[u+2]=Math.min(l[s+2],l[c+2]),l[u+3]=Math.max(l[s+3],l[c+3]),l[u+4]=Math.max(l[s+4],l[c+4]),l[u+5]=Math.max(l[s+5],l[c+5])}}}scheduleBackgroundRebuild(e,t){if(!this.instanceTable||!this.triangles)return;this._rebuildGeneration++;let n=this._rebuildGeneration,r=(e,r,i)=>{let a=this.triangles.copyOf(r.triOffset,r.triCount);this._pendingRebuilds.set(e,i),i.onmessage=a=>{let o=a.data;if(i.terminate(),this._pendingRebuilds.delete(e),o.error){ag.error(`background BLAS rebuild failed (mesh ${e}):`,o.error);return}n===this._rebuildGeneration&&this._swapBLAS(e,r,o,t)},i.onerror=t=>{ag.error(`background BLAS rebuild worker failed (mesh ${e}):`,t),i.terminate(),this._pendingRebuilds.delete(e)};let o=r.triCount>500;i.postMessage({triangleData:a.buffer,triangleByteOffset:a.byteOffset,triangleByteLength:a.byteLength,triangleCount:r.triCount,depth:this.config.bvhDepth,maxLeafSize:this.bvhBuilder.maxLeafSize,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:{enabled:o,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold},reinsertionOptimization:{enabled:this.bvhBuilder.enableReinsertionOptimization,batchSizeRatio:this.bvhBuilder.reinsertionBatchSizeRatio,maxIterations:this.bvhBuilder.reinsertionMaxIterations}},[a.buffer])};for(let t of e){let e=this._placementOf(t);if(e<0)continue;let n=this.instanceTable.entryAt(e);if(!n||!this.instanceTable.isOwner(e))continue;let i=this._pendingRebuilds.get(e);i&&i.terminate(),r(e,n,new om)}}_swapBLAS(e,t,n,r){this._geometryVersion=(this._geometryVersion??0)+1;let i=n.bvhData,a=i.length/16;if(a>t.blasNodeCount){ag.warn(`background rebuild does not fit for mesh ${e} (${a} nodes vs ${t.blasNodeCount} reserved), skipping swap`);return}this.bvh.setRecords(t.blasOffset,i),this._offsetBLASInPlace(t.blasOffset,a,t.blasOffset,t.triOffset);let o=n.triangles;o&&this.triangles.setRecords(t.triOffset,o),this.instanceTable.setBlasNodeCount(e,a);let s=n.originalToBvh;if(s){let n=this.instanceTable.bvhToOriginalOf(e),r=new Uint32Array(t.triCount);for(let e=0;e<t.triCount;e++)r[s[e]]=n?n[e]:e;this.instanceTable.setBvhToOriginal(e,r)}this.instanceTable.recomputeAABB(e,this.bvh,this.triangles),this._refitTLAS(),this._log(`Background BLAS rebuild complete for mesh ${e}`),r?.(this.instanceTable.sourceMesh[e]??e)}cancelBackgroundRebuilds(){for(let e of this._pendingRebuilds.values())e.terminate();this._pendingRebuilds.clear()}_disposeRefitWorker(){this._refitWorker&&=(this._refitWorker.terminate(),null),this._refitSharedBuffers=null,this.cancelBackgroundRebuilds()}_disposeTLASWorker(){this._tlasWorker&&=(this._tlasWorker.terminate(),null)}dispose(){this._geometryVersion=(this._geometryVersion??0)+1,this._log(`Disposing resources`),this._disposeRefitWorker(),this._disposeTLASWorker(),this._disposeTextures(),this._reset(),this.textureCreator&&=(this.textureCreator.dispose(),null),this.geometryExtractor=null,this.bvhBuilder=null,this.tlasBuilder=null,this._blasRefitter=null}},fg=[[1619.19106,-.00205010916,5.02995757],[2488.45471,-.00111330907,3.22621544],[3341.43193,-.000486551192,1.76486769],[4094.61742,-.000127446582,.725731635],[4670.28036,291258199e-13,.126703442],[4595.09185,287495649e-13,.15034502],[3787.1745,935907826e-14,.399075871]],pg=[[-488.999748,.000604330754,-.0755807526],[-755.994277,.000316730098,.478306139],[-1023.63977,.00012022347,.936662319],[-1265.71316,487340896e-14,1.27054498],[-1425.29332,-401150431e-13,1.43972784],[-1175.54822,-216378048e-13,1.30408023],[-500.799571,-459832026e-14,1.09098763]],mg=[[596945309e-19,-4.85742887e-8,-970622247e-13,-.00407936148],[240430366e-19,5.55021075e-8,-.000198503712,.0289312858],[-140949732e-19,1.89878968e-7,-.000356632824,.0910767778],[-361460868e-19,2.84822009e-7,-.000493211319,.15672344],[-197075738e-19,1.75359352e-7,-.000250542825,-.0222783266],[-161997957e-21,-1.64216008e-8,.000386216271,-.738077418],[672650283e-21,-2.73078809e-8,.000424098264,-.752335691]];function hg(e){let t,n,r;if(e>=12e3)t=.8262954810464208,n=.9945080501520986,r=1.566307710274283;else if(e<800)t=5.413294490189271,n=-.20319390035873933,r=-.0822535242887164;else{let i=e>=6365?6:e>=3315?5:e>=1902?4:e>=1449?3:e>=1167?2:+(e>=965),a=fg[i],o=pg[i],s=mg[i],c=1/e;t=a[0]*c+a[1]*e+a[2],n=o[0]*c+o[1]*e+o[2],r=((s[0]*e+s[1])*e+s[2])*e+s[3]}return[Math.max(0,t),Math.max(0,n),Math.max(0,r)]}var gg=1/(4*Math.PI);function _g(e){let t=e.userData||{},n=Number.isFinite(t.exposure)?t.exposure:0,r=e.intensity*2**n,i=[e.color.r,e.color.g,e.color.b];if(t.useTemperature){let[e,n,r]=hg(t.temperature??6500);i[0]*=e,i[1]*=n,i[2]*=r}return Wr(i),{r:i[0],g:i[1],b:i[2],intensity:r}}var vg=class{constructor(){this.lightData={directional:[],rectArea:[],point:[],spot:[]},this.directionalLightCache=[],this.areaLightCache=[],this.pointLightCache=[],this.spotLightCache=[]}clear(){this.lightData.directional=[],this.lightData.rectArea=[],this.lightData.point=[],this.lightData.spot=[],this.directionalLightCache=[],this.areaLightCache=[],this.pointLightCache=[],this.spotLightCache=[]}calculateLightImportance(e,t=`directional`){let n=.2126*e.color.r+.7152*e.color.g+.0722*e.color.b,r=e.intensity*n;if(t===`area`){let t=e.width*e.height;r*=Math.sqrt(t)}else if(t===`point`)r*=Math.sqrt(e.distance||100);else if(t===`spot`){let t=Math.sin(e.angle||Math.PI/4);r*=Math.sqrt(e.distance||100)*t}return r}addDirectionalLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n;if(e.target){e.target.updateMatrixWorld();let i=e.target.getWorldPosition(new r.Vector3);n=t.sub(i).normalize()}else n=t.normalize();let i=this.calculateLightImportance(e,`directional`),a=e.userData.angle||e.angle||0,o=_g(e),s=e.userData?.gobo,c=s&&Number.isInteger(s.index)?s.index:-1,l=s&&typeof s.intensity==`number`?s.intensity:1,u=s&&s.inverted?-Math.abs(l):Math.abs(l),d=s&&typeof s.scale==`number`?s.scale:5;this.directionalLightCache.push({data:[n.x,n.y,n.z,o.r,o.g,o.b,o.intensity,a,c,u,d,0],importance:i,light:e})}addRectAreaLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=e.getWorldQuaternion(new r.Quaternion),i=e.getWorldScale(new r.Vector3),a=e.width*i.x*.5,o=e.height*i.y*.5,s=new r.Vector3(a,0,0).applyQuaternion(n),c=new r.Vector3(0,-o,0).applyQuaternion(n),l=this.calculateLightImportance(e,`area`),u=e.userData?.normalize??!0?1:0,d=Number.isFinite(e.userData?.spread)?e.userData.spread:Math.PI,f=+(e.userData?.shape===`ellipse`||e.userData?.shape===`disk`||e.userData?.shape===1),p=_g(e);this.areaLightCache.push({data:[t.x,t.y,t.z,s.x,s.y,s.z,c.x,c.y,c.z,p.r,p.g,p.b,p.intensity,u,d,f],importance:l,light:e})}addPointLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=this.calculateLightImportance(e,`point`),i=_g(e);this.pointLightCache.push({data:[t.x,t.y,t.z,i.r,i.g,i.b,i.intensity*gg,e.distance||0,e.decay===void 0?2:e.decay],importance:n,light:e})}addSpotLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=(e.target?e.target.getWorldPosition(new r.Vector3):new r.Vector3(0,0,-1)).sub(t).normalize(),i=this.calculateLightImportance(e,`spot`),a=e.userData?.gobo,o=a&&Number.isInteger(a.index)?a.index:-1,s=a&&typeof a.intensity==`number`?a.intensity:1,c=a&&a.inverted?-Math.abs(s):Math.abs(s),l=e.userData?.ies,u=l&&Number.isInteger(l.index)?l.index:-1,d=l&&typeof l.intensity==`number`?l.intensity:1,f=_g(e);this.spotLightCache.push({data:[t.x,t.y,t.z,n.x,n.y,n.z,f.r,f.g,f.b,f.intensity*gg,e.angle||Math.PI/4,e.penumbra||0,e.distance||0,e.decay===void 0?2:e.decay,o,c,u,d,0,0],importance:i,light:e})}preprocessLights(){this.directionalLightCache.sort((e,t)=>t.importance-e.importance),this.areaLightCache.sort((e,t)=>t.importance-e.importance),this.pointLightCache.sort((e,t)=>t.importance-e.importance),this.spotLightCache.sort((e,t)=>t.importance-e.importance),this.lightData.directional=[],this.lightData.rectArea=[],this.lightData.point=[],this.lightData.spot=[],this.directionalLightCache.forEach(e=>{this.lightData.directional.push(...e.data)}),this.areaLightCache.forEach(e=>{this.lightData.rectArea.push(...e.data)}),this.pointLightCache.forEach(e=>{this.lightData.point.push(...e.data)}),this.spotLightCache.forEach(e=>{this.lightData.spot.push(...e.data)}),this.areaLightCache.length>0&&console.log(`Preprocessed ${this.areaLightCache.length} area lights by importance`),this.pointLightCache.length>0&&console.log(`Preprocessed ${this.pointLightCache.length} point lights by importance`),this.spotLightCache.length>0&&console.log(`Preprocessed ${this.spotLightCache.length} spot lights by importance`)}updateShaderUniforms(e){let t=Math.floor(this.lightData.directional.length/12),n=Math.floor(this.lightData.rectArea.length/16),r=Math.floor(this.lightData.point.length/9),i=Math.floor(this.lightData.spot.length/20);e.defines.MAX_DIRECTIONAL_LIGHTS=t,e.defines.MAX_AREA_LIGHTS=n,e.defines.MAX_POINT_LIGHTS=r,e.defines.MAX_SPOT_LIGHTS=i,e.uniforms.directionalLights.value=new Float32Array(this.lightData.directional),e.uniforms.areaLights.value=new Float32Array(this.lightData.rectArea),e.uniforms.pointLights.value=new Float32Array(this.lightData.point),e.uniforms.spotLights.value=new Float32Array(this.lightData.spot),e.needsUpdate=!0}processSceneLights(e,t){this.clear(),e.traverse(e=>{e.isDirectionalLight?this.addDirectionalLight(e):e.isRectAreaLight?this.addRectAreaLight(e):e.isPointLight?this.addPointLight(e):e.isSpotLight&&this.addSpotLight(e)}),this.preprocessLights(),this.updateShaderUniforms(t)}getLightStatistics(){return{directionalLights:this.directionalLightCache.map(e=>({intensity:e.light.intensity,importance:e.importance,color:e.light.color})),areaLights:this.areaLightCache.map(e=>({intensity:e.light.intensity,importance:e.importance,color:e.light.color,size:e.light.width*e.light.height}))}}};Js();var yg=864e5,bg=Object.freeze({IMMUTABLE:`immutable`,REVALIDATE:`revalidate`,NETWORK:`network`}),xg=(e,t)=>({loaded:e,total:t,lengthComputable:t>0&&e<=t}),Sg=(e,t)=>e.headers?.get?.(t)??null,Cg=e=>e.reason??new DOMException(`aborted`,`AbortError`);function wg(e){try{let t=new URL(e,globalThis.location?.href??`http://localhost/`).pathname;return decodeURIComponent(t.split(`/`).pop())||`download`}catch{return`download`}}async function Tg(e,{onProgress:t,signal:n}){let r=Number(Sg(e,`content-length`))||0,i=Sg(e,`content-type`)??``;if(!e.body)return new Blob([await e.arrayBuffer()],{type:i});let a=e.body.getReader(),o=[],s=0;for(;;){if(n?.aborted)throw a.cancel().catch(()=>{}),Cg(n);let{done:e,value:i}=await a.read();if(e)break;o.push(i),s+=i.length,t?.(xg(s,r))}return new Blob(o,{type:i})}var Eg=(e,t,n)=>new File([e],t,{type:n||e.type,lastModified:e.lastModified??Date.now()}),Dg=()=>{},Og=class{constructor(e){this._storage=e,this._revalidating=new Set}get _area(){return this._storage?.area(Zn.DOWNLOADS)??null}async fetch(e,{key:t=e,name:n=wg(e),policy:r=bg.REVALIDATE,maxAgeMs:i=yg,onProgress:a=null,signal:o=null,fetchOptions:s={}}={}){let c=this._area;if(c&&r!==bg.NETWORK){let o=await c.open(t);if(o){let c=await o.file(`data`);if(c)return r===bg.REVALIDATE&&Date.now()-(o.extra.checkedAt??0)>=i&&this._revalidate(e,t,n,o.extra,s),a?.(xg(c.size,c.size)),{file:Eg(c,n,o.extra.contentType),release:()=>o.release(),fromCache:!0};o.release()}}return this._download(e,t,n,{onProgress:a,signal:o,fetchOptions:s,cache:!!c})}async has(e){return await this._area?.has(e)===!0}async _download(e,t,n,{onProgress:r,signal:i,fetchOptions:a,cache:o}){if(i?.aborted)throw Cg(i);let s=await fetch(e,{...a,signal:i});if(!s.ok)throw Error(`HTTP ${s.status} fetching ${e}`);let c=Number(Sg(s,`content-length`))||0,l={url:e,contentType:Sg(s,`content-type`)??``,lastModified:Sg(s,`last-modified`),contentLength:c||null,checkedAt:Date.now()},u=o&&s.body?await this._area.create(t,{label:n,expectedBytes:c}):null;if(!u)return{file:Eg(await Tg(s,{onProgress:r,signal:i}),n,l.contentType),release:Dg,fromCache:!1};try{await u.writeStream(`data`,s.body,{signal:i,onProgress:e=>r?.(xg(e,c))}),await u.commit(l)}catch(o){if(await u.abort(),o?.name!==`QuotaExceededError`)throw o;return this._download(e,t,n,{onProgress:r,signal:i,fetchOptions:a,cache:!1})}let d=await this._area.open(t,{wait:!0}),f=d&&await d.file(`data`);if(!f)throw d?.release(),Error(`storage: ${n} vanished right after it was saved`);return{file:Eg(f,n,l.contentType),release:()=>d.release(),fromCache:!1}}async _revalidate(e,t,n,r,i){if(!this._revalidating.has(t)){this._revalidating.add(t);try{let a=await fetch(e,{...i,method:`HEAD`});if(!a.ok)return;let o=Sg(a,`last-modified`),s=Number(Sg(a,`content-length`))||null;if(o&&r.lastModified&&o!==r.lastModified||s&&r.contentLength&&s!==r.contentLength){let{release:r}=await this._download(e,t,n,{fetchOptions:i,cache:!0});r()}else await this._area.patchMeta(t,{extra:{...r,checkedAt:Date.now()}})}catch{}finally{this._revalidating.delete(t)}}}};function kg(e,t,n){return new Og(t).fetch(e,n)}function Ag(){return new Og(Pu(Ks().cacheNamespace))}async function jg(e,{downloads:t=Ag(),...n}={}){if(!t._storage||!/^https?:/i.test(e))return{url:e,release:Dg,cached:!1};let{file:r,release:i}=await t.fetch(e,n),a=URL.createObjectURL(r);return{url:a,cached:!0,release:()=>{URL.revokeObjectURL(a),i()}}}Js(),rn();var Mg=1<<18,Ng=Wt(`pathtracer`),Pg=100,Fg=4,Ig=class extends xe{constructor(e,t,n,i={}){super(`PathTracer`,{...i,executionMode:z.ALWAYS});let a=i.width||1920,o=i.height||1080;this.camera=n,this.width=a,this.height=o,this.renderer=e,this.scene=t,this.sdfs=new dg,this.lightSerializer=new vg,this.accumulationEnabled=!0,this.isComplete=!1,this.cameras=[],this.performanceMonitor=Ie(),this.completionThreshold=0,this.renderLimitMode=`frames`,this._initDataTextures(),this.storageTextures=new cn(0,0),this.uniforms=new un(a,o),this._defineUniformGetters(),this.materialData=new ni(this.sdfs),this.materialData.callbacks.onReset=()=>this.reset(),this.materialData.callbacks.getTriangleData=()=>({array:this._triangleFlat,records:this._triangleRecords,count:this.triangleCount}),this.materialData.callbacks.onTriangleDataChanged=()=>{this.triangleShadeAttr&&this._uploadTriangles(0,this._triangleRecordCount,{geo:!1})},this.environment=new qu(this.scene,this.uniforms,this.renderer),this.environment.callbacks.onReset=()=>this.reset(),this.environment.callbacks.getSceneTextureNodes=()=>this.shaderBuilder.getSceneTextureNodes(),this.shaderBuilder=new lp,this._initRenderingState(),this.setupBlueNoise(),this.tempVector2=new r.Vector2,this.lastCameraMatrix=new r.Matrix4,this.lastProjectionMatrix=new r.Matrix4,this._seedTick=0,this._pinSeedToFrame=!1,this.tracedFrames=0,this.resetCount=0,this.lastRenderMode=-1,this.renderModeChangeTimeout=null,this.renderModeChangeDelay=50,this.pendingRenderMode=null,this.lastInteractionModeState=!1,this.cameraChanged=!1,this._lastViewChangeAt=-1/0,this.updateCompletionThreshold()}_initDataTextures(){this.triangleGeoAttr=null,this.triangleShadeAttr=null,this._triangleRecords=null,this._triangleFlat=null,this._triangleRecordCount=0,this.triangleStorageNode=null,this.triangleCount=0,this.bvhStorageAttr=null,this._bvhRecords=null,this.bvhStorageNode=null,this.bvhNodeCount=0,this.directionalLightsData=null,this.pointLightsData=null,this.spotLightsData=null,this.areaLightsData=null,this.goboMaps=null,this.iesProfiles=null,this.stbnScalarTexture=null,this.stbnVec2Texture=null,this.blueNoiseReady=Promise.resolve(),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(new Float32Array(16),4),this.lightStorageNode=(0,n.storage)(this.lightStorageAttr,`vec4`,1).toReadOnly(),this._lightBufferRealloc=!1,this._lbvhDataCache=null,this._emissiveDataCache=null,this._bitTrailMapCache=null,this._bitTrailOffset=0,this._bitTrailLength=0,this._instanceTable=null,this.spheres=[]}_defineUniformGetters(){let e=this.uniforms;for(let t of e.keys())Object.defineProperty(this,t,{get:()=>e.get(t),configurable:!0});let t=e.getLightBufferNodes();for(let[e,n]of Object.entries(t))Object.defineProperty(this,`${e}LightsBufferNode`,{get:()=>n,configurable:!0})}_initRenderingState(){this.isReady=!1,this.frameCount=0}_initCameraOptimizer(){let e=this;this.cameraOptimizer=new Se(this.renderer,{uniforms:{enableAccumulation:{get value(){return e.enableAccumulation.value},set value(t){e.enableAccumulation.value=t}},fireflyThreshold:{get value(){return e.fireflyThreshold.value},set value(t){e.fireflyThreshold.value=t}},cameraIsMoving:{get value(){return e.cameraIsMoving.value},set value(t){e.cameraIsMoving.value=t}}}},{enabled:U.interactionModeEnabled,qualitySettings:{enableAccumulation:!1,fireflyThreshold:e=>e*8},onEnter:()=>this.emit(`pathtracer:interactionStart`),onExit:()=>this.emit(`pathtracer:interactionEnd`),onReset:()=>{this.reset(),this.emit(`pathtracer:viewpointChanged`)}})}setupBlueNoise(){let e=new r.TextureLoader;e.setCrossOrigin(`anonymous`);let t=e=>(e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e.wrapS=r.RepeatWrapping,e.wrapT=r.RepeatWrapping,e.generateMipmaps=!1,e),{stbnScalarAtlas:n,stbnVec2Atlas:i}=Ks(),a=async t=>{let n=await jg(t,{policy:bg.REVALIDATE});try{return await e.loadAsync(n.url)}finally{n.release()}},o=a(n).then(e=>{this.stbnScalarTexture=t(e),L.value=e,Ng.debug(`STBN scalar atlas ${J.px(e.image.width,e.image.height)}`)}),s=a(i).then(e=>{this.stbnVec2Texture=t(e),ee.value=e,Ng.debug(`STBN vec2 atlas ${J.px(e.image.width,e.image.height)}`)});this.blueNoiseReady=Promise.allSettled([o,s]).then(e=>{for(let t of e)t.status===`rejected`&&Ng.warn(`STBN atlas failed to load`,t.reason)})}setupEventListeners(){this.on(`pipeline:reset`,()=>{this.reset()}),this.on(`pipeline:resize`,e=>{e&&e.width&&e.height&&this.setSize(e.width,e.height)}),this.on(`pathtracer:setCompletionThreshold`,e=>{e&&e.threshold!==void 0&&(this.completionThreshold=e.threshold)})}async build(e){this.dispose(),this.scene=e,await this.sdfs.buildBVH(e),this.cameras=this.sdfs.cameras,this.updateSceneUniforms(),this.updateLights(),this._initCameraOptimizer(),this.setupMaterial()}updateSceneUniforms(){this.setTriangleData(this.sdfs.triangleData,this.sdfs.triangleCount),this.setBVHData(this.sdfs.bvhData),this.setInstanceTable(this.sdfs.instanceTable),this.materialData.setMaterialData(this.sdfs.materialData,this.sdfs.materials?.map(e=>e.sources)),this.materialData.loadTexturesFromSdfs(),this.sdfs.emissiveTriangleData?this.setEmissiveTriangleData(this.sdfs.emissiveTriangleData,this.sdfs.emissiveTriangleCount||0):this.emissiveTriangleCount.value=0,this.sdfs.lightBVHNodeData?this.setLightBVHData(this.sdfs.lightBVHNodeData,this.sdfs.lightBVHNodeCount||0):this.lightBVHNodeCount.value=0,this._meshRefs=this._collectMeshRefs(this.scene),this.setMeshVisibilityData(this._meshRefs),this.spheres=this.sdfs.spheres||[]}updateLights(){let e={uniforms:{directionalLights:{value:null},pointLights:{value:null},spotLights:{value:null},areaLights:{value:null}},defines:{}};this.lightSerializer.processSceneLights(this.scene,e),this.directionalLightsData=e.uniforms.directionalLights.value,this.pointLightsData=e.uniforms.pointLights.value,this.spotLightsData=e.uniforms.spotLights.value,this.areaLightsData=e.uniforms.areaLights.value,this._updateLightBufferNodes()}_updateLightBufferNodes(){this.directionalLightsData&&this.directionalLightsData.length>0?(this.directionalLightsBufferNode.array=Array.from(this.directionalLightsData),this.numDirectionalLights.value=Math.floor(this.directionalLightsData.length/12)):this.numDirectionalLights.value=0,this.areaLightsData&&this.areaLightsData.length>0?(this.areaLightsBufferNode.array=Array.from(this.areaLightsData),this.numAreaLights.value=Math.floor(this.areaLightsData.length/16)):this.numAreaLights.value=0,this.pointLightsData&&this.pointLightsData.length>0?(this.pointLightsBufferNode.array=Array.from(this.pointLightsData),this.numPointLights.value=Math.floor(this.pointLightsData.length/9)):this.numPointLights.value=0,this.spotLightsData&&this.spotLightsData.length>0?(this.spotLightsBufferNode.array=Array.from(this.spotLightsData),this.numSpotLights.value=Math.floor(this.spotLightsData.length/20)):this.numSpotLights.value=0}reset(){this.resetCount++,this.frameCount=0,this.frame.value=0,this.hasPreviousAccumulated.value=0,this.storageTextures.currentTarget=0,this.updateCompletionThreshold(),this.isComplete=!1,this.performanceMonitor?.reset(),this.lastInteractionModeState=!1,this._pinSeedToFrame&&(this._seedTick=0)}setSize(e,t){this.width=e,this.height=t,this.resolution.value.set(e,t),this.createStorageTextures(e,t)}setAccumulationEnabled(e){this.accumulationEnabled=e,this.enableAccumulation.value=+!!e}enterInteractionMode(){this.cameraOptimizer?.enterInteractionMode()}setInteractionModeEnabled(e){this.cameraOptimizer?.setInteractionModeEnabled(e)}get interactionMode(){return this.cameraOptimizer?.isInInteractionMode()??!1}get viewIsChanging(){return this.interactionMode||performance.now()-this._lastViewChangeAt<Pg}noteViewChanged(){this._lastViewChangeAt=performance.now()}setTriangleData(e,t){if(!e)return;let r=e.chunks&&e.chunks.length>1?e:null,i=r?null:e.chunks?e.chunks[0]:e,a=r?r.recordCount:Math.ceil(i.length/st.FLOATS_PER_TRIANGLE),o=r?._gpuUpload?.triangles?r._gpuUpload:null,{geo:s,shade:c}=o??this._allocateTriangleBuffers(a);this.triangleStorageNode?(this.triangleStorageNode.geo.value=s,this.triangleStorageNode.geo.bufferCount=s.count,this.triangleStorageNode.shade.value=c,this.triangleStorageNode.shade.bufferCount=c.count):this.triangleStorageNode={geo:(0,n.storage)(s,`uvec4`,s.count).toReadOnly(),shade:(0,n.storage)(c,`uvec4`,c.count).toReadOnly()},this.triangleGeoAttr=s,this.triangleShadeAttr=c,this._triangleRecords=r,this._triangleFlat=i,this._triangleRecordCount=a,this.triangleCount=t,this._uploadTriangles(0,a,{skipChunks:o?.uploaded}),Ng.debug(`${J.n(this.triangleCount)} triangles (storage buffer)`)}_allocateTriangleBuffers(e){let t=Math.max(1,e);this._assertFitsGPU(t*3*16);let n=S(t*3,4,Uint32Array),r=S(t*2,4,Uint32Array);return this.renderer.backend.createStorageAttribute(n),this.renderer.backend.createStorageAttribute(r),{geo:n,shade:r}}_uploadTriangles(e,t,{geo:n=!0,shade:r=!0,skipChunks:i=null,source:a=null,sourceStart:o=0,geoAttr:s=this.triangleGeoAttr,shadeAttr:c=this.triangleShadeAttr}={}){if(t<=0||!s)return;let l=this.renderer.backend,u=l.get(s).buffer,d=l.get(c).buffer,f=st.FLOATS_PER_TRIANGLE,p=this._triangleRecords,m=a?t:p?p.recordsPerChunk:this._triangleRecordCount,h=Mg;this._triangleStaging??={geo:new Uint32Array(h*12),shade:new Uint32Array(h*8)};let g=this._triangleStaging.geo,_=this._triangleStaging.shade;for(let s=e,c=e+t;s<c;){let t=a?0:Math.floor(s/m),v=a?e:t*m,y=Math.min(c,v+m);if(i?.has(t)){s=y;continue}let b=a??(p?p.chunks[t]:this._triangleFlat);if(!b)throw Error(`triangle chunk ${t} is on disk and was never uploaded`);let x=Math.min(h,y-s),S=(a?s-e+o:s-v)*f;for(let e=0,t=0,i=0;e<x;e++,S+=f){if(n)for(let e=0;e<12;e++)g[t++]=b[S+e];if(r)for(let e=12;e<f;e++)_[i++]=b[S+e]}n&&l.device.queue.writeBuffer(u,s*12*4,g,0,x*12),r&&l.device.queue.writeBuffer(d,s*8*4,_,0,x*8),s+=x}}createChunkUploader(e){this._assertFitsGPU(e.recordCount*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT);let t=S(e.recordCount*e.lanesPerRecord/4,4,e.LaneType),n=this.renderer.backend;n.createStorageAttribute(t);let r=n.get(t).buffer,i=e.recordsPerChunk*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT,a=new Set;return e._gpuUpload={attr:t,uploaded:a},t=>{let o=e.chunks[t];n.device.queue.writeBuffer(r,t*i,o,0,o.length),a.add(t)}}createTriangleChunkUploader(e){let{geo:t,shade:n}=this._allocateTriangleBuffers(e.recordCount),r=new Set;e._gpuUpload={triangles:!0,geo:t,shade:n,uploaded:r};let i=e.recordsPerChunk;return a=>{let o=a*i,s=Math.min(i,e.recordCount-o);this._uploadTriangles(o,s,{source:e.chunks[a],geoAttr:t,shadeAttr:n}),r.add(a)}}_assertFitsGPU(e){let t=this.renderer?.backend?.device?.limits,n=Math.min(t?.maxBufferSize??1/0,t?.maxStorageBufferBindingSize??1/0);if(e>n)throw Error(`the scene needs a ${J.mb(e)} GPU buffer, past the ${J.mb(n)} this GPU allows for one — load fewer triangles`)}_uploadChunked(e,t){let n=t._gpuUpload;if(!n||n.attr!==e){w(this.renderer,e,t.chunks);return}let r=this.renderer.backend.get(e).buffer,i=t.recordsPerChunk*t.lanesPerRecord*t.LaneType.BYTES_PER_ELEMENT;for(let e=0;e<t.chunks.length;e++){if(n.uploaded.has(e))continue;let a=t.chunks[e];if(!a)throw Error(`chunk ${e} is on disk and was never uploaded`);this.renderer.backend.device.queue.writeBuffer(r,e*i,a,0,a.length),n.uploaded.add(e)}}setBVHData(e){if(!e)return;let r=e.chunks&&e.chunks.length>1?e:null,i=r?null:e.chunks?e.chunks[0]:e,a=r?r.recordCount*r.lanesPerRecord:i.length,o=a/4;this._assertFitsGPU(a*4);let s=()=>r?r._gpuUpload?.attr??S(o,4,Float32Array):new t.StorageInstancedBufferAttribute(i,4);this.bvhStorageNode?(this.bvhStorageAttr=s(),this.bvhStorageNode.value=this.bvhStorageAttr,this.bvhStorageNode.bufferCount=o):(this.bvhStorageAttr=s(),this.bvhStorageNode=(0,n.storage)(this.bvhStorageAttr,`vec4`,o).toReadOnly()),this.bvhStorageAttr.foldedLeaves=e.foldedLeaves===!0,this._bvhRecords=r,r&&this._uploadChunked(this.bvhStorageAttr,r),this.bvhNodeCount=Math.floor(o/Fg),Ng.debug(`${J.n(this.bvhNodeCount)} BVH nodes (storage buffer)`)}setInstanceTable(e){this._instanceTable=e}setMeshVisibilityData(e){!e||e.length===0||!this._instanceTable||(this._patchVisibilityFromMeshes(e),this._flushBVHEdits())}_patchVisibilityFromMeshes(e){let t=this._instanceTable,n=new Map;for(let r=0;r<t.count;r++){if(!t.isSet[r])continue;let i=t.sourceMesh[r],a=n.get(i);a===void 0&&n.set(i,a=this._isWorldVisible(e[i])),this._patchTLASLeafVisibility(r,a)}}updateMeshVisibility(e,t){this._patchTLASLeafVisibility(e,t)&&this._flushBVHEdits()}updateAllMeshVisibility(){!this._meshRefs||!this._instanceTable||(this._patchVisibilityFromMeshes(this._meshRefs),this._flushBVHEdits())}_patchTLASLeafVisibility(e,t){let n=this._instanceTable;if(!n||!n.isSet?.[e]||!this.bvhStorageAttr)return!1;let r=n.tlasLeafIndex[e];return r<0?!1:(n.visible[e]=+!!t,this._bvhRecords?this._bvhRecords.chunkFor(r)[this._bvhRecords.baseOf(r)+2]=+!!t:this.bvhStorageAttr.array[r*16+2]=+!!t,this._dirtyBVHLeaves??=new Set,this._dirtyBVHLeaves.add(r),!0)}_flushBVHEdits(){if(this.bvhStorageAttr){if(!this._bvhRecords){let e=1/0,t=-1;for(let n of this._dirtyBVHLeaves??[])n<e&&(e=n),n>t&&(t=n);t>=0&&(this.bvhStorageAttr.addUpdateRange(e*16,(t-e+1)*16),this.bvhStorageAttr.version++),this._dirtyBVHLeaves?.clear();return}for(let e of this._dirtyBVHLeaves??[])T(this.renderer,this.bvhStorageAttr,this._bvhRecords,e*16,16);this._dirtyBVHLeaves?.clear()}}_collectMeshRefs(e){if(!e)return[];let t=[];return e.traverse(e=>{e.isMesh&&e.userData.meshIndex!==void 0&&(t[e.userData.meshIndex]=e)}),t}_isWorldVisible(e){for(;e;){if(!e.visible)return!1;e=e.parent}return!0}_updateStorageBuffer(e,t){e&&(e.array.set(t),e.clearUpdateRanges(),e.needsUpdate=!0)}updateTriangleData(e){e?.chunks?.length>1?this._triangleRecords=e:e&&(this._triangleFlat=e.chunks?e.chunks[0]:e),this._uploadTriangles(0,this._triangleRecordCount)}updateBVHData(e){if(this._bvhRecords){w(this.renderer,this.bvhStorageAttr,this._bvhRecords.chunks);return}this._updateStorageBuffer(this.bvhStorageAttr,e?.chunks?e.chunks[0]:e)}updateBufferRanges(e,t){if(this.triangleGeoAttr&&e.length>0){let t=st.FLOATS_PER_TRIANGLE;for(let n of e){let e=Math.floor(n.offset/t);this._uploadTriangles(e,Math.ceil((n.offset+n.count)/t)-e)}}if(this.bvhStorageAttr&&t.length>0)if(this._bvhRecords)for(let e of t)T(this.renderer,this.bvhStorageAttr,this._bvhRecords,e.offset,e.count);else{this.bvhStorageAttr.clearUpdateRanges();for(let e of t)this.bvhStorageAttr.addUpdateRange(e.offset,e.count);this.bvhStorageAttr.version++}}createStorageTextures(e,t){this.storageTextures.writeColor?this.storageTextures.setSize(e,t):this.storageTextures.create(e,t),this.resolution.value.set(e,t)}setupMaterial(){if(this.cameraOptimizer||this._initCameraOptimizer(),!this.triangleStorageNode){Ng.error(`triangle data required`);return}if(!this.bvhStorageNode){Ng.error(`BVH data required`);return}if(this.isReady&&this.shaderBuilder.getSceneTextureNodes()){this.shaderBuilder.updateSceneTextures(this);return}this._ensureStorageTextures(),this.shaderBuilder.createSceneTextureNodes(this,this.storageTextures),this.isReady=!0}_ensureStorageTextures(){let e=this.renderer.domElement,t=Math.max(1,e.width||this.width),n=Math.max(1,e.height||this.height);this.storageTextures.ensureSize(t,n)&&this.resolution.value.set(t,n)}_handleResize(){let{width:e,height:t}=this.renderer.domElement;(e!==this.storageTextures.renderWidth||t!==this.storageTextures.renderHeight)&&(this.createStorageTextures(e,t),this.frameCount=0),this.resolution.value.set(e,t)}_matricesApproxEqual(e,t,n=1e-10){let r=e.elements,i=t.elements;for(let e=0;e<16;e++)if(Math.abs(r[e]-i[e])>n)return!1;return!0}_updateCameraUniforms(){return!this._matricesApproxEqual(this.lastCameraMatrix,this.camera.matrixWorld)||!this._matricesApproxEqual(this.lastProjectionMatrix,this.camera.projectionMatrixInverse)?(this.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this.cameraViewMatrix.value.copy(this.camera.matrixWorldInverse),this.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.lastCameraMatrix.copy(this.camera.matrixWorld),this.lastProjectionMatrix.copy(this.camera.projectionMatrixInverse),!0):!1}_updateAccumulationUniforms(e,t){let n=this.cameraOptimizer?.isInInteractionMode()??!1;this.lastInteractionModeState=n,this.accumulationEnabled?n?(this.accumulationAlpha.value=1,this.hasPreviousAccumulated.value=0):(this.accumulationAlpha.value=Fe(e),this.hasPreviousAccumulated.value=+(e>0)):(this.accumulationAlpha.value=1,this.hasPreviousAccumulated.value=0)}_publishTexturesToContext(e,t){e.setTexture(`pathtracer:color`,t.color),e.setTexture(`pathtracer:normalDepth`,t.normalDepth),e.setTexture(`pathtracer:albedo`,t.albedo),e.setState(`pathtracer:samples`,this.frameCount),e.setState(`interactionMode`,this.cameraOptimizer?.isInInteractionMode()??!1),e.setState(`renderMode`,this.renderMode.value)}_emitStateEvents(){this.emit(`pathtracer:frameComplete`,{frame:this.frameCount,isComplete:this.isComplete}),this.cameraChanged&&=(this.emit(`camera:moved`),!1)}updateCompletionThreshold(){this.completionThreshold=Pe(this.renderMode.value,this.maxSamples.value)}setRenderLimitMode(e){this.renderLimitMode=e,this.updateCompletionThreshold()}manageASVGFForRenderMode(e){e!==this.lastRenderMode&&(this.renderModeChangeTimeout&&clearTimeout(this.renderModeChangeTimeout),this.pendingRenderMode=e,this.renderModeChangeTimeout=setTimeout(()=>{this.pendingRenderMode!==null&&this.pendingRenderMode!==this.lastRenderMode&&(this.lastRenderMode=this.pendingRenderMode,this.emit(`asvgf:reset`),this.emit(`denoiser:reset`)),this.renderModeChangeTimeout=null,this.pendingRenderMode=null},this.renderModeChangeDelay))}setUniform(e,t){this.uniforms.set(e,t)}setBlueNoiseTexture(e){this.stbnScalarTexture=e,e&&(L.value=e)}_rebuildLightBuffer(){let e=this._lbvhDataCache,n=this._emissiveDataCache,r=this.lightStorageAttr?.array,i=this._bitTrailMapCache??(r&&this._bitTrailLength?r.slice(this._bitTrailOffset,this._bitTrailOffset+this._bitTrailLength):null);this._bitTrailMapCache=null;let a=e?e.length:0,o=n?n.length:0,s=i?Math.ceil(i.length/4)*4:0,c=Math.max(a+o+s,4);if(this.lightStorageAttr&&c<=this.lightStorageAttr.array.length){let t=this.lightStorageAttr.array;e&&t.set(e,0),n&&t.set(n,a),i&&t.set(i,a+o),this.lightStorageAttr.needsUpdate=!0}else{let r=new Float32Array(c);e&&r.set(e,0),n&&r.set(n,a),i&&r.set(i,a+o),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(r,4),this.lightStorageNode.value=this.lightStorageAttr,this.lightStorageNode.bufferCount=r.length/4,this._lightBufferRealloc=!0}this.emissiveVec4Offset.value=(this.lightBVHNodeCount.value||0)*4,this.reverseMapVec4Offset.value=(a+o)/4,this._bitTrailOffset=a+o,this._bitTrailLength=i?i.length:0}setEmissiveTriangleData(e,t,n=0,r=null){e&&(this._emissiveDataCache=e,r&&(this._bitTrailMapCache=r),this.emissiveTriangleCount.value=t,this.emissiveTotalPower.value=n,this._rebuildLightBuffer(),Ng.debug(`${J.n(t)} emissive triangles · totalPower ${n.toFixed(4)} (storage buffer)`))}setLightBVHData(e,t){e&&(this._lbvhDataCache=e,this.lightBVHNodeCount.value=t,this._rebuildLightBuffer(),Ng.debug(`light BVH ${J.n(t)} nodes`))}updateUniforms(e){let t=!1;for(let[n,r]of Object.entries(e))this[n]&&this[n].value!==void 0&&this[n].value!==r&&(this[n].value=r,t=!0);t&&this.reset()}async rebuildMaterials(e){if(!this.sdfs)throw Error(`Scene not built yet. Call build() first.`);try{Ng.debug(`material rebuild started`),await this.sdfs.rebuildMaterials(e),this.materialData.setMaterialData(this.sdfs.materialData,this.sdfs.materials?.map(e=>e.sources)),this.materialData.loadTexturesFromSdfs(),this.shaderBuilder.updateSceneTextures(this),this.updateLights(),this.reset(),Ng.debug(`material rebuild complete`)}catch(e){Ng.error(`material rebuild failed:`,e);try{Ng.warn(`attempting recovery by resetting the path tracer`),this.reset()}catch(e){Ng.error(`recovery failed:`,e)}throw e}}dispose(){this.renderModeChangeTimeout&&=(clearTimeout(this.renderModeChangeTimeout),null),this.cameraOptimizer?.dispose(),this.materialData?.dispose(),this.environment?.dispose(),this.shaderBuilder?.dispose(),this.uniforms?.dispose(),this.storageTextures?.dispose(),this.stbnScalarTexture?.dispose(),this.stbnVec2Texture?.dispose(),this.placeholderTexture?.dispose(),this.triangleGeoAttr=null,this.triangleShadeAttr=null,this._triangleStaging=null,this._triangleRecords=null,this._triangleFlat=null,this._triangleRecordCount=0,this.triangleStorageNode=null,this.bvhStorageAttr=null,this._bvhRecords=null,this.bvhStorageNode=null,this.placeholderTexture=null,this.isReady=!1}};rn();var Lg=Wt(`gpu`),$={ACTIVE_RAY_COUNT:0,ENTERING_COUNT:1,CONVERGED_COUNT:2,RESERVED_3:3,ACTIVE_PIXEL_COUNT:4,GEOMETRY_COUNT:5,CONVERGED_GEOMETRY_COUNT:6,ACTIVE_ENERGY:7,COUNT:8},Rg=65535,zg={BOUNCE_MASK:255,ACTIVE:256,SPECULAR:512,INSIDE_MEDIUM:1024,RAY_TYPE_SHIFT:11,RAY_TYPE_MASK:63488,HAS_HIT_OPAQUE:65536,AUX_LOCKED:1<<17,REDIRECTED:1<<18,SUN_NEE:1<<19},Bg=class{constructor(e=0,t=null){this._renderer=t,this.capacity=0,this.counters=null,this.activeIndices=null,this.activeIndicesRO=null,this.sortedIndices=null,this.sortedIndicesRO=null,this.sortGlobalHistogram=null,this.pingPong=0,e>0&&this.allocate(e)}allocate(e){this.dispose(),this.capacity=e,this._countersAttr=new t.StorageInstancedBufferAttribute(new Uint32Array($.COUNT),1),this.counters=(0,n.storage)(this._countersAttr,`uint`).toAtomic(),this.MAX_BOUNCE_SNAPSHOTS=32,this._bounceCountsAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(2*this.MAX_BOUNCE_SNAPSHOTS),1),this.bounceCounts=(0,n.storage)(this._bounceCountsAttr,`uint`);let r=S(e,1,Uint32Array),i=S(e,1,Uint32Array);this._attrA=r,this._attrB=i,this.activeIndices={a:(0,n.storage)(r,`uint`),b:(0,n.storage)(i,`uint`)},this.activeIndicesRO={a:(0,n.storage)(r,`uint`).toReadOnly(),b:(0,n.storage)(i,`uint`).toReadOnly()};let a=S(e,1,Uint32Array);this._sortAttr=a,this.sortedIndices=(0,n.storage)(a,`uint`),this.sortedIndicesRO=(0,n.storage)(a,`uint`).toReadOnly(),this._sortGlobalHistAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(256),1),this.sortGlobalHistogram=(0,n.storage)(this._sortGlobalHistAttr,`uint`).toAtomic(),this.pingPong=0,this.totalBytes=$.COUNT*4+e*4*3,Lg.debug(`queues capacity ${J.n(e)} · ${J.mb(this.totalBytes)}`)}resize(e){return e<=this.capacity&&this.capacity>0?!1:(this.allocate(e),!0)}getCounters(){return this.counters}getActiveReadRO(){return this.pingPong===0?this.activeIndicesRO.a:this.activeIndicesRO.b}getActiveRead(){return this.pingPong===0?this.activeIndices.a:this.activeIndices.b}getActiveWrite(){return this.pingPong===0?this.activeIndices.b:this.activeIndices.a}getSortedRW(){return this.sortedIndices}getSortedRO(){return this.sortedIndicesRO}getSortGlobalHistogram(){return this.sortGlobalHistogram}getCountersAttribute(){return this._countersAttr}getBounceCounts(){return this.bounceCounts}getBounceCountsAttribute(){return this._bounceCountsAttr}swap(){this.pingPong=1-this.pingPong}resetPingPong(){this.pingPong=0}dispose(){ba(this._renderer,this._countersAttr),ba(this._renderer,this._bounceCountsAttr),ba(this._renderer,this._attrA),ba(this._renderer,this._attrB),ba(this._renderer,this._sortAttr),ba(this._renderer,this._sortGlobalHistAttr),this._countersAttr=this._bounceCountsAttr=null,this._attrA=this._attrB=this._sortAttr=this._sortGlobalHistAttr=null,this.counters=null,this.activeIndices=null,this.activeIndicesRO=null,this.sortedIndices=null,this.sortedIndicesRO=null,this.sortGlobalHistogram=null,this.capacity=0}},Vg={[r.RGBAFormat]:4,[r.RGBFormat]:3,[r.RGFormat]:2,[r.RedFormat]:1},Hg={[r.FloatType]:4,[r.HalfFloatType]:2,[r.UnsignedByteType]:1,[r.ByteType]:1,[r.UnsignedShortType]:2,[r.ShortType]:2,[r.UnsignedIntType]:4,[r.IntType]:4};function Ug(e){return(Vg[e.format]??4)*(Hg[e.type]??4)}function Wg(e){return e?.gpuByteLength??e?.array?.byteLength??0}function Gg(e){if(!e)return 0;if(e.isRenderTarget){let t=e.textures?.length?e.textures:[e.texture],n=e.width||0,r=e.height||0,i=e.depth||1,a=0;for(let e of t)e&&(a+=n*r*i*Ug(e));return a}let t=e.image||{},n=t.width??e.width??0,r=t.height??e.height??0,i=t.depth??1;return n*r*i*Ug(e)}var Kg=class{constructor(e=null){this._providers=[],this._renderer=e,this.current=0,this.peak=0,this.byCategory={}}setRenderer(e){this._renderer=e}register(e,t){this._providers.push({category:e,fn:t})}measure(){let e=new WeakSet,t={},n=0;for(let{category:r,fn:i}of this._providers){let a;try{a=i()}catch{a=null}if(!a)continue;let o=0;for(let t of Array.isArray(a)?a:[a])o+=this._resourceBytes(t,e);t[r]=(t[r]||0)+o,n+=o}return this.byCategory=t,this.current=n,n>this.peak&&(this.peak=n),{current:n,peak:this.peak,byCategory:t}}_resourceBytes(e,t){return e?typeof e.bytes==`number`&&!e.isTexture&&!e.isRenderTarget?e.bytes:e.gpuByteLength==null?e.array&&e.array.byteLength!=null?t.has(e.array)?0:(t.add(e.array),e.array.byteLength):e.isRenderTarget||e.isTexture?t.has(e)?0:(t.add(e),this._residentTextureBytes(e)):0:t.has(e)?0:(t.add(e),e.gpuByteLength):0}_isResident(e){let t=this._renderer?.backend;if(!t||typeof t.get!=`function`)return!0;if(typeof t.has==`function`&&!t.has(e))return!1;let n=t.get(e);return!!(n&&(n.texture||n.gpuTexture))}_residentTextureBytes(e){if(e.isRenderTarget){let t=e.textures?.length?e.textures:[e.texture],n=e.width||0,r=e.height||0,i=e.depth||1,a=0;for(let e of t)e&&this._isResident(e)&&(a+=n*r*i*Ug(e));return a}return this._isResident(e)?Gg(e):0}resetPeak(){this.peak=this.current}getReport(){let e=e=>(e/1048576).toFixed(1),t=Object.entries(this.byCategory).map(([t,n])=>`${t}=${e(n)}`);return`VRAM current=${e(this.current)}MB peak=${e(this.peak)}MB [${t.join(` `)}]`}};rn();var qg=Wt(`wavefront`),Jg=class{constructor(e){this.renderer=e,this.kernels=new Map,this.timing=new Map,this.profiling=!1,this.profile=new Map,this._firstDispatches=[],this._firstDispatchFlush=null}_recordFirstDispatch(e,t){this._firstDispatches.push({name:e,ms:t}),clearTimeout(this._firstDispatchFlush),this._firstDispatchFlush=setTimeout(()=>this._flushFirstDispatches(),0)}_flushFirstDispatches(){let e=this._firstDispatches;if(this._firstDispatches=[],this._firstDispatchFlush=null,e.length===0)return;let t=e.reduce((e,t)=>e+t.ms,0),n=[...e].sort((e,t)=>t.ms-e.ms);qg.info(J.list([`${e.length} kernel${e.length===1?``:`s`} compiled in ${J.ms(t)}`,`slowest ${n.slice(0,2).map(e=>`${e.name} ${J.ms(e.ms)}`).join(`, `)}`])),e.forEach(e=>qg.debug(`kernel '${e.name}' first dispatch (incl. compilation) ${J.ms(e.ms)}`))}register(e,t){this.kernels.set(e,t),this.timing.set(e,{compiledOnce:!1,lastDispatchMs:0})}dispatch(e){let t=this.kernels.get(e);if(!t)throw Error(`KernelManager: Unknown kernel '${e}'`);let n=this.timing.get(e);if(n&&!n.compiledOnce){let r=performance.now();this.renderer.compute(t);let i=performance.now();n.compiledOnce=!0,n.lastDispatchMs=i-r,this._recordFirstDispatch(e,i-r)}else if(this.profiling){let n=performance.now();this.renderer.compute(t);let r=performance.now(),i=this.profile.get(e);i||(i={calls:0,totalMs:0},this.profile.set(e,i)),i.calls++,i.totalMs+=r-n}else this.renderer.compute(t)}setDispatchForCount(e,t){let n=this.kernels.get(e);n&&(n.dispatchSize=[Math.ceil(t/n.workgroupSize[0]),1,1])}setDispatchForGrid(e,t,n){let r=this.kernels.get(e);if(!r)return;let i=r.workgroupSize;r.dispatchSize=[Math.ceil(t/i[0]),Math.ceil(n/i[1]),1]}has(e){return this.kernels.has(e)}get(e){return this.kernels.get(e)}getTimingReport(){let e={};for(let[t,n]of this.timing)e[t]={...n};return e}enableProfiling(e){this.profiling=e,e&&this.profile.clear()}getProfileReport(){let e=[],t=0;for(let[n,{calls:r,totalMs:i}]of this.profile)t+=i,e.push({name:n,calls:r,totalMs:+i.toFixed(2),avgMs:+(i/r).toFixed(3)});return e.sort((e,t)=>t.totalMs-e.totalMs),e.push({name:`TOTAL`,calls:e.reduce((e,t)=>e+t.calls,0),totalMs:+t.toFixed(2),avgMs:null}),e}dispose(){clearTimeout(this._firstDispatchFlush),this._firstDispatchFlush=null,this._firstDispatches=[],this.kernels.clear(),this.timing.clear(),this.profile.clear()}},Yg=(0,n.int)(Ke.equirectangular),Xg=(0,n.int)(Ke.orthographic),Zg=e=>e.equal(Xg);function Qg(){let e={cameraProjection:(0,n.uniform)(0,`int`),panoLonRange:(0,n.uniform)(new r.Vector2,`vec2`),panoLatRange:(0,n.uniform)(new r.Vector2,`vec2`),panoLevelHorizon:(0,n.uniform)(1,`int`),sync(t){e.cameraProjection.value=t.get(`cameraProjection`).value,e.panoLonRange.value.copy(t.get(`panoLonRange`).value),e.panoLatRange.value.copy(t.get(`panoLatRange`).value),e.panoLevelHorizon.value=t.get(`panoLevelHorizon`).value}};return e}var $g=(e,t,n,r)=>({origin:t_(e,t,n,r.cameraProjection),direction:n_(e,t,n,r.cameraProjection,r.panoLonRange,r.panoLatRange,r.panoLevelHorizon)}),e_=(e,t,n,r,i)=>{let{origin:a,direction:o}=$g(e,n,r,i);return a.add(o.mul(t))},t_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec3)(t[3]).toVar();return(0,n.If)(Zg(i),()=>{let i=r.mul((0,n.vec4)(e.x.mul(2).sub(1),(0,n.float)(1).sub(e.y.mul(2)),0,1));a.assign(t.mul((0,n.vec4)(i.xy,0,1)).xyz)}),a}),n_=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.vec3)(0).toVar();return(0,n.If)(i.equal(Yg),()=>{let r=(0,n.mix)(a.x,a.y,e.x).toVar(),i=(0,n.mix)(o.y,o.x,e.y).toVar(),l=(0,n.cos)(i).toVar(),u=(0,n.vec3)(0).toVar(),d=(0,n.vec3)(0).toVar(),f=(0,n.vec3)(0).toVar();(0,n.If)(s.equal((0,n.int)(1)),()=>{let e=(0,n.vec3)(t[2].x,0,t[2].z).toVar();(0,n.If)((0,n.dot)(e,e).lessThan((0,n.float)(1e-8)),()=>{e.assign((0,n.vec3)(t[1].x,0,t[1].z))}),f.assign((0,n.normalize)(e)),d.assign((0,n.vec3)(0,1,0)),u.assign((0,n.cross)(d,f))}).Else(()=>{u.assign((0,n.normalize)((0,n.vec3)(t[0]))),d.assign((0,n.normalize)((0,n.vec3)(t[1]))),f.assign((0,n.normalize)((0,n.vec3)(t[2])))}),c.assign((0,n.normalize)(u.mul((0,n.sin)(r).mul(l)).add(d.mul((0,n.sin)(i))).sub(f.mul((0,n.cos)(r).mul(l)))))}).ElseIf(Zg(i),()=>{c.assign((0,n.normalize)((0,n.vec3)(t[2])).negate())}).Else(()=>{let i=(0,n.vec3)(e.x.mul(2).sub(1),(0,n.float)(1).sub(e.y.mul(2)),1),a=r.mul((0,n.vec4)(i,1));c.assign((0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(a.xyz.div(a.w))))}),c}),r_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_])=>{let v=t_(e,r,i,a).toVar(),y=n_(e,r,i,a,o,s,c).toVar(),b=v.toVar(),x=y.toVar(),S=g.equal((0,n.int)(1)),C=S.and(_.greaterThan(0)).or(S.not().and(u.greaterThan(0)).and(d.lessThan(64)));return(0,n.If)(l.and(C).and(f.greaterThan(.001)),()=>{let e=(0,n.select)(a.equal(Yg),s.y.sub(s.x).mul(.5),(0,n.select)(Zg(a),(0,n.float)(1),i[1].y)),o=(0,n.select)(S,_.mul(f).mul(e),u.div(d.mul(2)).mul(.001).mul(p).mul(m)),c=oe(t),l=c.x.mul(h.max(.01)),g=c.y,C=(0,n.vec3)(0).toVar(),w=f.toVar();(0,n.If)(a.equal(Yg),()=>{C.assign(Ki({N:y}).mul((0,n.vec3)(l,g,0)))}).Else(()=>{let e=(0,n.normalize)((0,n.vec3)(r[0])),t=(0,n.normalize)((0,n.vec3)(r[1]));C.assign(e.mul(l).add(t.mul(g))),w.assign(f.div((0,n.dot)(y,(0,n.normalize)((0,n.vec3)(r[2]))).negate()))}),b.assign(v.add(C.mul(o))),x.assign((0,n.normalize)(v.add(y.mul(w)).sub(b)))}),di({origin:b,direction:x})});function i_(e){let{rayBufferRW:t,hitBufferRW:r,gBufferRW:i,resolution:a,frame:o,cameraWorldMatrix:s,cameraProjectionMatrixInverse:c,cameraProjection:l,panoLonRange:u,panoLatRange:d,panoLevelHorizon:f,enableDOF:p,focalLength:m,aperture:h,focusDistance:g,unitsPerMetre:_,apertureScale:v,anamorphicRatio:y,dofMode:b,dofBlur:x,renderWidth:S,chunkRowBase:C,chunkRows:w,transmissiveBounces:T,transparentBackground:E,auxGBufferEnabled:D,listDriven:O=!1,activeIndicesRO:k=null,counters:A=null}=e,j=D.greaterThan((0,n.uint)(0)),M=(e,S,C)=>{let w=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(S).add(.5)),E=re({state:be({pixelCoord:w,rayIndex:(0,n.int)(0),frame:o}).toVar()}).toVar(),D=ye(w,(0,n.int)(1),(0,n.int)(1),E,a,o).toVar().sub(.5),O=(0,n.vec2)(w.x.add(D.x),w.y.sub(D.y)).div(a),k=di.wrap(r_(O,E,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x));La(t,C,k.origin,(0,n.int)(0),(0,n.int)(0)),Ra(t,C,k.direction,(0,n.uint)(zg.ACTIVE)),za(t,C,(0,n.vec4)(1,1,1,0).xyz,(0,n.float)(0)),Ba(t,C,(0,n.vec4)((0,n.vec3)(0),(0,n.float)(1))),(0,n.If)(j,()=>{ka(i,C,(0,n.vec3)(0,0,1),(0,n.float)(1),(0,n.vec3)(0),(0,n.float)(0)),io(t,C,(0,n.vec3)(1))}),Qa(t,C,(0,n.uint)(0),(0,n.uint)(T),(0,n.float)(1),(0,n.float)(1),(0,n.float)(1)),Ya(r,C,E)};return(0,n.Fn)(()=>{if(O){let e=n.instanceIndex;(0,n.If)(e.lessThan((0,n.atomicLoad)(A.element((0,n.uint)($.ENTERING_COUNT)))),()=>{let t=(0,n.int)(k.element(e)),r=t.add(C.mul(S));M(r.mod(S),r.div(S),(0,n.uint)(t))})}else{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),t=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(S).and(t.lessThan(w)),()=>{M(e,t.add(C),(0,n.uint)(t.mul(S).add(e)))})}})}var a_=32,o_=4096,s_=4,c_=1e8,l_=()=>(0,n.array)(`int`,a_).toVar(),u_=e=>(0,n.int)((0,n.uint)(e.bitNot()).shiftRight((0,n.uint)(4))),d_=e=>(0,n.int)((0,n.uint)(e.bitNot()).bitAnd((0,n.uint)(15))),f_=e=>e?e=>e.shiftRight((0,n.uint)(30)).equal((0,n.uint)(1)):e=>e.greaterThanEqual((0,n.uint)(mt)),p_=e=>{let t=(0,n.mix)((0,n.vec3)(1),(0,n.sign)(e),(0,n.notEqual)(e,(0,n.vec3)(0)));return(0,n.mix)((0,n.vec3)(1).div(e),(0,n.vec3)(c_).mul(t),(0,n.lessThan)((0,n.abs)(e),(0,n.vec3)(1e-8)))},m_=(e,t)=>(0,n.vec3)(e[0].xyz.dot(t).add(e[0].w),e[1].xyz.dot(t).add(e[1].w),e[2].xyz.dot(t).add(e[2].w)),h_=(e,t)=>(0,n.vec3)(e[0].xyz.dot(t),e[1].xyz.dot(t),e[2].xyz.dot(t)),g_=(0,n.wgslFn)(`
|
|
715
|
+
`);rn();var cp=Wt(`shader`),lp=class{constructor(){this.prevColorTexNode=null,this.prevAlbedoTexNode=null,this.prevNormalDepthTexNode=null,this._sceneTextureNodes=null}updateSceneTextures(e){let t=this._sceneTextureNodes,n=e.environment;n.environmentTexture&&t.envTex&&(t.envTex.value=n.environmentTexture),e.goboMaps&&t.goboMapsTex&&(t.goboMapsTex.value=e.goboMaps),e.iesProfiles&&t.iesProfilesTex&&(t.iesProfilesTex.value=e.iesProfiles),cp.debug(`scene textures updated in-place`)}updateGoboMaps(e){let t=this._sceneTextureNodes;!t||!t.goboMapsTex||e&&(t.goboMapsTex.value=e)}updateIESProfiles(e){let t=this._sceneTextureNodes;!t||!t.iesProfilesTex||e&&(t.iesProfilesTex.value=e)}getSceneTextureNodes(){return this._sceneTextureNodes}createSceneTextureNodes(e,t){let i=e.triangleStorageNode,a=e.bvhStorageNode,o=e.materialData.materialStorageNode,s=e.lightStorageNode;sa(e.uniforms.get(`enableAlphaShadows`));let c=(0,n.texture)(e.environment.environmentTexture),l=t.getReadTextures();this.prevColorTexNode=(0,n.texture)(l.color),this.prevAlbedoTexNode=(0,n.texture)(l.albedo),this.prevNormalDepthTexNode=(0,n.texture)(l.normalDepth);let u=()=>{let e=new r.DataArrayTexture(new Uint8Array([255,255,255,255]),1,1,1);return e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e.generateMipmaps=!1,e.needsUpdate=!0,(0,n.texture)(e)},d=e.goboMaps?(0,n.texture)(e.goboMaps):u();Qf(d);let f=e.iesProfiles?(0,n.texture)(e.iesProfiles):u();np(f);let p={triStorage:i,bvhStorage:a,matStorage:o,lightBufferStorage:s,envTex:c,goboMapsTex:d,iesProfilesTex:f};return this._sceneTextureNodes=p,p}dispose(){this.prevColorTexNode=null,this.prevAlbedoTexNode=null,this.prevNormalDepthTexNode=null,this._sceneTextureNodes=null}},up=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,t,n){if(typeof e==`number`){let r=t[n[e]],i=new dp;return i.minX=r.minX,i.minY=r.minY,i.minZ=r.minZ,i.maxX=r.maxX,i.maxY=r.maxY,i.maxZ=r.maxZ,i.triangleOffset=r.triangleOffset,i.triangleCount=r.triangleCount,i}let r=this.buildSubtree(e[0],t,n),i=this.buildSubtree(e[1],t,n),a=new dp;return a.leftChild=r,a.rightChild=i,a.minX=Math.min(r.minX,i.minX),a.minY=Math.min(r.minY,i.minY),a.minZ=Math.min(r.minZ,i.minZ),a.maxX=Math.max(r.maxX,i.maxX),a.maxY=Math.max(r.maxY,i.maxY),a.maxZ=Math.max(r.maxZ,i.maxZ),a}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},dp=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},fp=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}},pp=1073741824,mp=1073741824,hp=15,gp=16,_p=2147483648,vp=(e,t)=>~(e<<4|t)>>>0,yp=e=>e>=_p,bp=e=>~e>>>0>>>4,xp=e=>~e&15;function Sp(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/gp,r=e=>{let n=e*gp;return t[n+3]===pp&&t[n+1]>0&&t[n+1]<=hp},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*gp;t[n+3]>=mp||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*gp),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*gp,s=n*gp;c.set(e.subarray(o,o+gp),s),!(t[o+3]>=mp)&&(l[s+3]=Cp(t,t[o+3],r,i),l[s+7]=Cp(t,t[o+7],r,i))}return c}function Cp(e,t,n,r){let i=t*gp;return n(t)?vp(e[i],e[i+1]):r[t]}var wp=(e,t,n)=>e>=_p?vp(bp(e)+n,xp(e)):e+t;function Tp(e,t,n,r=0,i=e.length){for(let a=r;a<i;a+=gp){if(e[a+3]===pp){e[a]+=n;continue}e[a+3]=wp(e[a+3],t,n),e[a+7]=wp(e[a+7],t,n)}}rn();var Ep=Wt(`bvh`),Dp=1073741824,Op=1073741826,kp=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),Ap=1073741824;function jp(e,t){if(e>=Ap)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${Ap}`);return e}var Mp=null;function Np(e){Mp=e}var Pp={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},Fp=Pp.FLOATS_PER_TRIANGLE,Ip=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),Lp=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},Rp=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=Ip(this.triangles),n=Pp.POSITION_A_OFFSET,r=Pp.POSITION_B_OFFSET,i=Pp.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*Fp,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){return this.totalTriangles=e.byteLength/(Fp*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),this.useWorker&&Mp&&typeof Worker<`u`?new Promise((r,i)=>{let a=a=>{let o=this.totalTriangles,s=typeof SharedArrayBuffer<`u`;Ep.debug(`SharedArrayBuffer ${s?`enabled`:`unavailable (using transfer fallback)`}`);let c=s?new SharedArrayBuffer(o*Fp*4):null;a.onmessage=e=>{let{bvhData:t,triangles:o,originalToBvh:s,error:l,progress:u,treeletStats:d}=e.data;if(l){a.terminate(),i(Error(l));return}if(u!==void 0&&n){n(u);return}d&&(this.splitStats=d),a.terminate(),r({bvhData:t,bvhRoot:!0,reorderedTriangles:c?new Float32Array(c):o,originalToBvh:s||null})},a.onerror=e=>{a.terminate(),i(e)};let l=e.buffer,u={triangleData:l,triangleByteOffset:e.byteOffset,triangleByteLength:e.byteLength,triangleCount:o,depth:t,reportProgress:!!n,sharedReorderBuffer:c,treeletOptimization:{enabled:this.enableTreeletOptimization,size:this.treeletSize,passes:this.treeletOptimizationPasses,minImprovement:this.treeletMinImprovement},reinsertionOptimization:{enabled:this.enableReinsertionOptimization,batchSizeRatio:this.reinsertionBatchSizeRatio,maxIterations:this.reinsertionMaxIterations}};a.postMessage(u,[l])};try{a(Mp())}catch(i){Ep.warn(`worker creation failed, falling back to synchronous build:`,i),r(this._buildSyncAndFlatten(e,t,n))}}):new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?Sp(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(e,t=30,n=null,r=null){let i=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=e,this.totalTriangles=e.byteLength/(Fp*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let a=this.totalTriangles,o=performance.now();this.centroids=new Float32Array(a*3),this.bMin=new Float32Array(a*3),this.bMax=new Float32Array(a*3),this.indices=new Uint32Array(a),this.mortonCodes=new Uint32Array(a),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-o,this.sortTrianglesByMortonCode();let s=performance.now(),c=this.buildNodeRecursive(0,a,t,n);if(this.splitStats.sahBuildTime=performance.now()-s,this.enableTreeletOptimization&&this.totalTriangles>1e3){let e=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,t=new up(this.traversalCost,this.intersectionCost);t.setTreeletSize(e),t.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let i=n?t=>{n(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{t.optimizeBVH(c,i)}catch(t){Ep.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=t.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let i=performance.now()-r;this.splitStats.treeletOptimizationTime=i;let a=t.getStatistics();this.splitStats.treeletsProcessed=a.treeletsProcessed,this.splitStats.treeletsImproved=a.treeletsImproved,this.splitStats.averageSAHImprovement=a.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new fp(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=n?e=>{n(e)}:null;try{e.optimizeBVH(c,t)}catch(e){Ep.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let l=performance.now();this.applySAOrdering(c),this.splitStats.saOrderTime=performance.now()-l;let u=performance.now(),d=this.triangles,f=r||new d.constructor(a*Fp);for(let e=0;e<a;e++){let t=this.indices[e]*Fp,n=e*Fp;f.set(d.subarray(t,t+Fp),n)}this.reorderedTriangleData=f;let p=new Uint32Array(a);for(let e=0;e<a;e++)p[this.indices[e]]=e;this.originalToBvhMap=p,this.splitStats.reorderTime=performance.now()-u,this.splitStats.totalBuildTime=performance.now()-i;let m=this.splitStats.totalBuildTime,h=this.splitStats;return Ep.debug(`${J.n(a)} tris → ${J.n(this.totalNodes)} nodes in ${J.ms(m)} | SAH ${h.sahSplits} objMed ${h.objectMedianSplits} spatMed ${h.spatialMedianSplits} failed ${h.failedSplits}`+(h.treeletsProcessed?` | treelets ${h.treeletsImproved}/${h.treeletsProcessed} improved`:``)+(h.reinsertionsApplied?` | reinsertions ${h.reinsertionsApplied}`:``)),n&&n(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,c}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new Lp;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new Lp;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}jp(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=kp(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=Dp}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}jp(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=kp(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=Op,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=Dp}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;jp(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=kp(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<Dp&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}},zp={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11},Bp=zp.FLOATS_PER_TRIANGLE,Vp=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),Hp=e=>e instanceof Uint32Array?e:new Uint32Array(e.buffer,e.byteOffset,e.length),Up=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:e,idx:t?e.viewAs(Uint32Array):Hp(e)}},Wp=(e,t)=>e.chunked?e.f.chunkFor(t):e.f,Gp=(e,t)=>e.chunked?e.idx.chunkFor(t):e.idx,Kp=(e,t)=>e.chunked?e.chunked.baseOf(t):t*Yp,qp=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:t?t.viewAs(Float32Array):Vp(e),u:t?e:Hp(e)}};function Jp(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}var Yp=16,Xp=1073741824,Zp=1073741825,Qp=1e-12;function $p(e,t,n,r,i,a){let o=e[t+4],s=e[t+5],c=e[t+6],l=e[t+7],u=e[t+8],d=e[t+9],f=e[t+10],p=e[t+11],m=e[t+12],h=e[t+13],g=e[t+14],_=e[t+15],v=d*g-f*h,y=f*m-u*g,b=u*h-d*m,x=o*v+s*y+c*b,S=o===1&&d===1&&g===1&&s===0&&c===0&&u===0&&f===0&&m===0&&h===0&&l===0&&p===0&&_===0,C=(Math.abs(o)+Math.abs(s)+Math.abs(c))*(Math.abs(u)+Math.abs(d)+Math.abs(f))*(Math.abs(m)+Math.abs(h)+Math.abs(g));if(S||!Number.isFinite(x)||Math.abs(x)<=Qp*C){for(let e=0;e<6;e++)i[a+e]=n[r+e];return}let w=1/x,T=v*w,E=y*w,D=b*w,O=(c*h-s*g)*w,k=(o*g-c*m)*w,A=(s*m-o*h)*w,j=(s*f-c*d)*w,M=(c*u-o*f)*w,N=(o*d-s*u)*w,P=1/0,F=1/0,I=1/0,L=-1/0,R=-1/0,ee=-1/0;for(let e=0;e<8;e++){let t=(e&1?n[r+3]:n[r])-l,i=(e&2?n[r+4]:n[r+1])-p,a=(e&4?n[r+5]:n[r+2])-_,o=T*t+O*i+j*a,s=E*t+k*i+M*a,c=D*t+A*i+N*a;o<P&&(P=o),o>L&&(L=o),s<F&&(F=s),s>R&&(R=s),c<I&&(I=c),c>ee&&(ee=c)}i[a]=P,i[a+1]=F,i[a+2]=I,i[a+3]=L,i[a+4]=R,i[a+5]=ee}function em(e,t,n,r,i){let a=zp.POSITION_A_OFFSET,o=zp.POSITION_B_OFFSET,s=zp.POSITION_C_OFFSET,c=1/0,l=1/0,u=1/0,d=-1/0,f=-1/0,p=-1/0;for(let r=0;r<n;r++){let n=t+r,i=e.chunked?e.f.chunkFor(n):e.f,m=e.chunked?e.chunked.baseOf(n):n*Bp;c=Math.min(c,i[m+a],i[m+o],i[m+s]),l=Math.min(l,i[m+a+1],i[m+o+1],i[m+s+1]),u=Math.min(u,i[m+a+2],i[m+o+2],i[m+s+2]),d=Math.max(d,i[m+a],i[m+o],i[m+s]),f=Math.max(f,i[m+a+1],i[m+o+1],i[m+s+1]),p=Math.max(p,i[m+a+2],i[m+o+2],i[m+s+2])}r[i]=c,r[i+1]=l,r[i+2]=u,r[i+3]=d,r[i+4]=f,r[i+5]=p}var tm=new Float32Array(12);function nm(e,t,n,r,i){let a=Wp(e,t),o=Gp(e,t),s=Kp(e,t),c=(t-i)*6,l=o[s+3];if(l===Xp){em(n,o[s],o[s+1],r,c);return}if(l===Zp){$p(a,s,r,(o[s]-i)*6,r,c);return}let u=o[s+7],d=r,f=(l-i)*6;yp(l)&&(em(n,bp(l),xp(l),tm,0),d=tm,f=0);let p=r,m=(u-i)*6;yp(u)&&(em(n,bp(u),xp(u),tm,6),p=tm,m=6),a[s]=d[f],a[s+1]=d[f+1],a[s+2]=d[f+2],a[s+4]=d[f+3],a[s+5]=d[f+4],a[s+6]=d[f+5],a[s+8]=p[m],a[s+9]=p[m+1],a[s+10]=p[m+2],a[s+12]=p[m+3],a[s+13]=p[m+4],a[s+14]=p[m+5];for(let e=0;e<3;e++)r[c+e]=Math.min(d[f+e],p[m+e]),r[c+3+e]=Math.max(d[f+3+e],p[m+3+e])}var rm=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let r=n.length,i=qp(e);for(let e=0;e<r;e++){let r=n[e],a=i.chunked?i.f.chunkFor(e):i.f,o=i.chunked?i.u.chunkFor(e):i.u,s=i.chunked?i.chunked.baseOf(e):e*Bp,c=r*9,l=t[c],u=t[c+1],d=t[c+2],f=t[c+3],p=t[c+4],m=t[c+5],h=t[c+6],g=t[c+7],_=t[c+8];a[s+zp.POSITION_A_OFFSET]=l,a[s+zp.POSITION_A_OFFSET+1]=u,a[s+zp.POSITION_A_OFFSET+2]=d,a[s+zp.POSITION_B_OFFSET]=f,a[s+zp.POSITION_B_OFFSET+1]=p,a[s+zp.POSITION_B_OFFSET+2]=m,a[s+zp.POSITION_C_OFFSET]=h,a[s+zp.POSITION_C_OFFSET+1]=g,a[s+zp.POSITION_C_OFFSET+2]=_;let v=f-l,y=p-u,b=m-d,x=h-l,S=g-u,C=_-d,w=Jp(y*C-b*S,b*x-v*C,v*S-y*x);o[s+zp.NORMAL_A_PACKED_OFFSET]=w,o[s+zp.NORMAL_B_PACKED_OFFSET]=w,o[s+zp.NORMAL_C_PACKED_OFFSET]=w}}refitRange(e,t,n,r){let i=qp(t);r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let a=Up(e);for(let e=n+r-1;e>=n;e--)nm(a,e,i,this._bounds,n)}refit(e,t,n){let r=qp(t);n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let i=Up(e);for(let e=n-1;e>=0;e--)nm(i,e,r,this._bounds,0)}},im="var e=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,n,r){if(typeof e==`number`){let i=n[r[e]],a=new t;return a.minX=i.minX,a.minY=i.minY,a.minZ=i.minZ,a.maxX=i.maxX,a.maxY=i.maxY,a.maxZ=i.maxZ,a.triangleOffset=i.triangleOffset,a.triangleCount=i.triangleCount,a}let i=this.buildSubtree(e[0],n,r),a=this.buildSubtree(e[1],n,r),o=new t;return o.leftChild=i,o.rightChild=a,o.minX=Math.min(i.minX,a.minX),o.minY=Math.min(i.minY,a.minY),o.minZ=Math.min(i.minZ,a.minZ),o.maxX=Math.max(i.maxX,a.maxX),o.maxY=Math.max(i.maxY,a.maxY),o.maxZ=Math.max(i.maxZ,a.maxZ),o}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},t=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},n=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}};const r={silent:0,error:1,warn:2,info:3,debug:4},i=`info`,a=`rayzeeLogLevel`,o=`rayzeeLogNamespaces`,s=`color:#7c8494`,c=`color:inherit`;let l=null,u=null;function d(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function f(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function p(){if(l!==null)return l;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in r?(l=r[e],l):(l=r[d(a)]??r[i],l)}function m(){if(u!==null)return u;let e=globalThis.__RAYZEE_LOG_NS__??d(o);return u=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],u}function h(e,t){if(t<r.debug)return!0;let n=m();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function g(e,t,n){if(e>p()||!h(t,e))return;let i=e===r.error?console.error:e===r.warn?console.warn:console.log,a=`[${t}]`;typeof n[0]==`string`?i(`%c${a}%c ${n[0]}`,s,c,...n.slice(1)):i(`%c${a}`,s,...n)}const _={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${_.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},v={levels:r,setLevel(e){return e in r?(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e],f(a,e===i?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(r).join(`, `)}`),this.getLevel())},getLevel(){let e=p();return Object.keys(r).find(t=>r[t]===e)},isEnabled(e){return(r[e]??r.debug)<=p()},only(...e){let t=e.flat().filter(Boolean);return u=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),f(o,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return l=null,u=null,this.getLevel()}};function y(e){return{namespace:e,error:(...t)=>g(r.error,e,t),warn:(...t)=>g(r.warn,e,t),info:(...t)=>g(r.info,e,t),debug:(...t)=>g(r.debug,e,t),isEnabled:e=>v.isEnabled(e),summary(t,n=[]){let i=n.filter(Boolean);if(i.length===0||!console.groupCollapsed){g(r.info,e,[t]),i.forEach(t=>g(r.debug,e,[t]));return}r.info>p()||((p()>=r.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,s,c),i.forEach(e=>console.log(e)),console.groupEnd())}}}function b(e){e&&e in r&&(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e])}const x=1073741824,S=(e,t)=>~(e<<4|t)>>>0;function C(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/16,r=e=>{let n=e*16;return t[n+3]===1073741824&&t[n+1]>0&&t[n+1]<=15},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*16;t[n+3]>=x||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*16),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*16,s=n*16;c.set(e.subarray(o,o+16),s),!(t[o+3]>=x)&&(l[s+3]=w(t,t[o+3],r,i),l[s+7]=w(t,t[o+7],r,i))}return c}function w(e,t,n,r){let i=t*16;return n(t)?S(e[i],e[i+1]):r[t]}const T=y(`bvh`),E=1073741824,D=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),O=1073741824;function k(e,t){if(e>=O)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${O}`);return e}const A={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},j=A.FLOATS_PER_TRIANGLE,M=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length);var N=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},P=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=M(this.triangles),n=A.POSITION_A_OFFSET,r=A.POSITION_B_OFFSET,i=A.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*j,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){if(this.totalTriangles=e.byteLength/(j*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),!(this.useWorker&&null))return new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?C(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(t,r=30,i=null,a=null){let o=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=t,this.totalTriangles=t.byteLength/(j*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let s=this.totalTriangles,c=performance.now();this.centroids=new Float32Array(s*3),this.bMin=new Float32Array(s*3),this.bMax=new Float32Array(s*3),this.indices=new Uint32Array(s),this.mortonCodes=new Uint32Array(s),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-c,this.sortTrianglesByMortonCode();let l=performance.now(),u=this.buildNodeRecursive(0,s,r,i);if(this.splitStats.sahBuildTime=performance.now()-l,this.enableTreeletOptimization&&this.totalTriangles>1e3){let t=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,n=new e(this.traversalCost,this.intersectionCost);n.setTreeletSize(t),n.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let t=i?t=>{i(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{n.optimizeBVH(u,t)}catch(t){T.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=n.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let a=performance.now()-r;this.splitStats.treeletOptimizationTime=a;let o=n.getStatistics();this.splitStats.treeletsProcessed=o.treeletsProcessed,this.splitStats.treeletsImproved=o.treeletsImproved,this.splitStats.averageSAHImprovement=o.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new n(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=i?e=>{i(e)}:null;try{e.optimizeBVH(u,t)}catch(e){T.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let d=performance.now();this.applySAOrdering(u),this.splitStats.saOrderTime=performance.now()-d;let f=performance.now(),p=this.triangles,m=a||new p.constructor(s*j);for(let e=0;e<s;e++){let t=this.indices[e]*j,n=e*j;m.set(p.subarray(t,t+j),n)}this.reorderedTriangleData=m;let h=new Uint32Array(s);for(let e=0;e<s;e++)h[this.indices[e]]=e;this.originalToBvhMap=h,this.splitStats.reorderTime=performance.now()-f,this.splitStats.totalBuildTime=performance.now()-o;let g=this.splitStats.totalBuildTime,v=this.splitStats;return T.debug(`${_.n(s)} tris → ${_.n(this.totalNodes)} nodes in ${_.ms(g)} | SAH ${v.sahSplits} objMed ${v.objectMedianSplits} spatMed ${v.spatialMedianSplits} failed ${v.failedSplits}`+(v.treeletsProcessed?` | treelets ${v.treeletsImproved}/${v.treeletsProcessed} improved`:``)+(v.reinsertionsApplied?` | reinsertions ${v.reinsertionsApplied}`:``)),i&&i(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,u}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new N;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new N;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}k(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=D(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=E}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}k(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=D(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=1073741826,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=E}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;k(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=D(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<E&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};const F=y(`bvh`);self.onmessage=function(e){let t=e.data,n=t.type;b(t.logLevel),n===`buildPhase1`?I(t):n===`assemble`?L(t):R(t)};function I(e){let{sharedTriangleData:t,sharedCentroids:n,sharedBMin:r,sharedBMax:i,sharedIndices:a,sharedMortonCodes:o,triangleCount:s,depth:c,parallelDepth:l,reportProgress:u,treeletOptimization:d}=e;try{let e=new P;d&&e.setTreeletConfig(d);let f=u?e=>{self.postMessage({type:`progress`,progress:e})}:null;e.triangles=new Uint32Array(t),e.centroids=new Float32Array(n),e.bMin=new Float32Array(r),e.bMax=new Float32Array(i),e.indices=new Uint32Array(a),e.mortonCodes=new Uint32Array(o),e.totalTriangles=s,e.totalNodes=0,e.processedTriangles=0,e.lastProgressUpdate=performance.now(),e.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,initTime:0,sahBuildTime:0,reorderTime:0};let p=performance.now(),m=performance.now();e.initializeTriangleArrays(),e.splitStats.initTime=performance.now()-m,e.sortTrianglesByMortonCode(),e.frontierTasks=[];let h=performance.now(),g=e.buildNodeRecursiveToDepth(0,s,c,l,f);e.splitStats.sahBuildTime=performance.now()-h,e.applySAOrdering(g);let v=performance.now(),{flatData:y,frontierMap:b,nodeCount:x}=e.flattenBVHWithFrontier(g),S=performance.now()-v,C=performance.now()-p;F.debug(`phase 1 ${_.ms(C)} (init ${_.ms(e.splitStats.initTime)} · morton ${_.ms(e.splitStats.mortonSortTime)} · SAH ${_.ms(e.splitStats.sahBuildTime)} · flatten ${_.ms(S)}) · ${e.frontierTasks.length} frontier tasks`),self.postMessage({type:`phase1Result`,topFlatData:y,topNodeCount:x,frontierTasks:e.frontierTasks,frontierMap:b,splitStats:e.splitStats},[y.buffer])}catch(e){F.error(`phase 1 failed:`,e),self.postMessage({type:`error`,error:e.message})}}function L(e){let{topFlatData:t,topNodeCount:n,frontierMap:r,subtreeResults:i,sharedTriangleData:a,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:l}=e;try{let e=performance.now(),u=new P().assembleParallelBVH(t,n,r,i),d=l?C(u):u,f=new Uint32Array(o);if(s){let e=new Uint32Array(a),t=new Uint32Array(s);for(let n=0;n<c;n++){let r=f[n]*20,i=n*20;t.set(e.subarray(r,r+20),i)}}let p=new Uint32Array(c);for(let e=0;e<c;e++)p[f[e]]=e;let m=performance.now()-e;F.debug(`phase 3 assemble + reorder ${_.ms(m)} (${_.mb(d.byteLength)} BVH)`),self.postMessage({type:`assembleResult`,bvhData:d,originalToBvh:p,triangleCount:c},[d.buffer,p.buffer])}catch(e){F.error(`assembly failed:`,e),self.postMessage({type:`error`,error:e.message})}}function R(e){let{triangleData:t,triangleByteOffset:n,triangleByteLength:r,depth:i,reportProgress:a,treeletOptimization:o,reinsertionOptimization:s,sharedReorderBuffer:c,maxLeafSize:l,numBins:u,maxBins:d,minBins:f,foldLeaves:p}=e,m=new P;l!==void 0&&(m.maxLeafSize=l),u!==void 0&&(m.numBins=u),d!==void 0&&(m.maxBins=d),f!==void 0&&(m.minBins=f);try{o&&m.setTreeletConfig(o),s&&m.setReinsertionConfig(s);let e=a?e=>{self.postMessage({progress:e})}:null,l=n===void 0?new Uint32Array(t):new Uint32Array(t,n,r/4),u=c?new Uint32Array(c):null,d=m.buildSync(l,i,e,u),f=performance.now(),h=m.flattenBVH(d),g=p?C(h):h,v=performance.now()-f;F.debug(`flatten ${_.ms(v)} (${_.mb(g.byteLength)})`);let y=m.originalToBvhMap||null;if(c){let e=[g.buffer];y&&e.push(y.buffer),self.postMessage({bvhData:g,originalToBvh:y,triangleCount:l.length/20,treeletStats:m.splitStats},e)}else{let e=m.reorderedTriangleData,t=e.byteLength/80,n=[g.buffer,e.buffer];y&&n.push(y.buffer),self.postMessage({bvhData:g,triangles:e,originalToBvh:y,triangleCount:t,treeletStats:m.splitStats},n)}}catch(e){F.error(`build failed:`,e),self.postMessage({error:e.message})}}",am=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,im],{type:`text/javascript;charset=utf-8`});function om(e){let t;try{if(t=am&&(self.URL||self.webkitURL).createObjectURL(am),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(im),{type:`module`,name:e?.name})}}var sm="var e=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.maxTreeletLeaves=7,this.minImprovement=.02,this.topologyCache=new Map;for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.set(e,this.generateTopologies(e));this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0}}generateTopologies(e){if(e===1)return[0];if(e===2)return[[0,1]];let t=[];for(let n=1;n<e;n++){let r=this.generateTopologies(n),i=this.generateTopologies(e-n);for(let e of r)for(let r of i)t.push([e,this.offsetTopology(r,n)])}return t}offsetTopology(e,t){return typeof e==`number`?e+t:[this.offsetTopology(e[0],t),this.offsetTopology(e[1],t)]}optimizeBVH(e){let t=performance.now();this.stats={treeletsProcessed:0,treeletsImproved:0,totalSAHImprovement:0,averageSAHImprovement:0,optimizationTime:0};let n=this.identifyTreeletRoots(e);for(let e=0;e<n.length;e++){if(performance.now()-t>3e4){console.warn(`TreeletOptimizer: timeout after ${e}/${n.length} treelets`);break}this.optimizeTreelet(n[e])}return this.stats.optimizationTime=performance.now()-t,this.stats.averageSAHImprovement=this.stats.treeletsProcessed>0?this.stats.totalSAHImprovement/this.stats.treeletsProcessed:0,e}identifyTreeletRoots(e){let t=[],n=new Set,r=[{node:e,visited:!1}];for(;r.length>0;){let e=r[r.length-1];if(e.visited){r.pop();let i=e.node;if(i.triangleCount>0||n.has(i))continue;let a=this.countLeaves(i);a>=3&&a<=this.maxTreeletLeaves&&(t.push(i),this.markSubtree(i,n))}else{e.visited=!0;let t=e.node;if(t.triangleCount>0)continue;t.rightChild&&r.push({node:t.rightChild,visited:!1}),t.leftChild&&r.push({node:t.leftChild,visited:!1})}}return t}countLeaves(e){return e?e.triangleCount>0?1:this.countLeaves(e.leftChild)+this.countLeaves(e.rightChild):0}markSubtree(e,t){e&&(t.add(e),!(e.triangleCount>0)&&(this.markSubtree(e.leftChild,t),this.markSubtree(e.rightChild,t)))}optimizeTreelet(e){let t=[];this.extractLeaves(e,t);let n=t.length;if(n<3||n>this.maxTreeletLeaves)return;this.stats.treeletsProcessed++;let r=this.evaluateSubtreeSAH(e),i=this.topologyCache.get(n);if(!i||i.length===0)return;let a=r,o=null,s=null;if(n<=5){let e=this.generatePermutations(n);for(let n of i)for(let r of e){let e=this.evaluateTopology(n,t,r);e<a&&(a=e,o=n,s=r)}}else{let e=Array.from({length:n},(e,t)=>t);for(let n of i){let r=this.evaluateTopology(n,t,e);r<a&&(a=r,o=n,s=e);let i=this.greedySwapOptimize(n,t,e,r);i.cost<a&&(a=i.cost,o=n,s=i.perm)}}let c=(r-a)/r;o&&c>this.minImprovement&&(this.reconstructTreelet(e,o,t,s),this.stats.treeletsImproved++,this.stats.totalSAHImprovement+=c)}extractLeaves(e,t){if(e){if(e.triangleCount>0){t.push({minX:e.minX,minY:e.minY,minZ:e.minZ,maxX:e.maxX,maxY:e.maxY,maxZ:e.maxZ,triangleOffset:e.triangleOffset,triangleCount:e.triangleCount});return}this.extractLeaves(e.leftChild,t),this.extractLeaves(e.rightChild,t)}}evaluateSubtreeSAH(e){if(!e)return 0;if(e.triangleCount>0)return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*e.triangleCount*this.intersectionCost;let t=this.evaluateSubtreeSAH(e.leftChild),n=this.evaluateSubtreeSAH(e.rightChild);return this.surfaceAreaFlat(e.minX,e.minY,e.minZ,e.maxX,e.maxY,e.maxZ)*this.traversalCost+t+n}evaluateTopology(e,t,n){return this.evalTopoRecursive(e,t,n).cost}evalTopoRecursive(e,t,n){if(typeof e==`number`){let r=t[n[e]];return{cost:this.surfaceAreaFlat(r.minX,r.minY,r.minZ,r.maxX,r.maxY,r.maxZ)*r.triangleCount*this.intersectionCost,minX:r.minX,minY:r.minY,minZ:r.minZ,maxX:r.maxX,maxY:r.maxY,maxZ:r.maxZ}}let r=this.evalTopoRecursive(e[0],t,n),i=this.evalTopoRecursive(e[1],t,n),a=Math.min(r.minX,i.minX),o=Math.min(r.minY,i.minY),s=Math.min(r.minZ,i.minZ),c=Math.max(r.maxX,i.maxX),l=Math.max(r.maxY,i.maxY),u=Math.max(r.maxZ,i.maxZ);return{cost:this.surfaceAreaFlat(a,o,s,c,l,u)*this.traversalCost+r.cost+i.cost,minX:a,minY:o,minZ:s,maxX:c,maxY:l,maxZ:u}}surfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}generatePermutations(e){let t=[],n=Array.from({length:e},(e,t)=>t),r=i=>{if(i===e){t.push([...n]);return}for(let t=i;t<e;t++)[n[i],n[t]]=[n[t],n[i]],r(i+1),[n[i],n[t]]=[n[t],n[i]]};return r(0),t}greedySwapOptimize(e,t,n,r){let i=[...n],a=r,o=!0;for(;o;){o=!1;for(let n=0;n<i.length-1;n++)for(let r=n+1;r<i.length;r++){[i[n],i[r]]=[i[r],i[n]];let s=this.evaluateTopology(e,t,i);s<a?(a=s,o=!0):[i[n],i[r]]=[i[r],i[n]]}}return{perm:i,cost:a}}reconstructTreelet(e,t,n,r){let i=this.buildSubtree(t,n,r);e.minX=i.minX,e.minY=i.minY,e.minZ=i.minZ,e.maxX=i.maxX,e.maxY=i.maxY,e.maxZ=i.maxZ,e.leftChild=i.leftChild,e.rightChild=i.rightChild,e.triangleOffset=i.triangleOffset,e.triangleCount=i.triangleCount}buildSubtree(e,n,r){if(typeof e==`number`){let i=n[r[e]],a=new t;return a.minX=i.minX,a.minY=i.minY,a.minZ=i.minZ,a.maxX=i.maxX,a.maxY=i.maxY,a.maxZ=i.maxZ,a.triangleOffset=i.triangleOffset,a.triangleCount=i.triangleCount,a}let i=this.buildSubtree(e[0],n,r),a=this.buildSubtree(e[1],n,r),o=new t;return o.leftChild=i,o.rightChild=a,o.minX=Math.min(i.minX,a.minX),o.minY=Math.min(i.minY,a.minY),o.minZ=Math.min(i.minZ,a.minZ),o.maxX=Math.max(i.maxX,a.maxX),o.maxY=Math.max(i.maxY,a.maxY),o.maxZ=Math.max(i.maxZ,a.maxZ),o}setTreeletSize(e){this.maxTreeletLeaves=Math.max(3,Math.min(7,e));for(let e=3;e<=this.maxTreeletLeaves;e++)this.topologyCache.has(e)||this.topologyCache.set(e,this.generateTopologies(e))}setMinImprovement(e){this.minImprovement=Math.max(.001,e)}getStatistics(){return{...this.stats}}},t=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},n=class{constructor(e,t){this.traversalCost=e,this.intersectionCost=t,this.batchSizeRatio=.02,this.maxIterations=2,this.timeBudgetMs=15e3,this.stats={reinsertionsApplied:0,iterations:0,timeMs:0}}setBatchSizeRatio(e){this.batchSizeRatio=Math.max(.005,Math.min(.1,e))}setMaxIterations(e){this.maxIterations=Math.max(1,Math.min(5,e))}getStatistics(){return{...this.stats}}surfaceArea(e){let t=e.maxX-e.minX,n=e.maxY-e.minY,r=e.maxZ-e.minZ;return t*n+n*r+r*t}buildParentMap(e){let t=new Map;t.set(e,{parent:null,isLeft:!1});let n=[e];for(;n.length>0;){let e=n.pop();e.triangleCount>0||(e.leftChild&&(t.set(e.leftChild,{parent:e,isLeft:!0}),n.push(e.leftChild)),e.rightChild&&(t.set(e.rightChild,{parent:e,isLeft:!1}),n.push(e.rightChild)))}return t}findCandidates(e,t,n){let r=[],i=[e];for(;i.length>0;){let a=i.pop();if(a!==e&&n.get(a).parent!==e){let e=this.surfaceArea(a);r.length<t?(r.push({node:a,cost:e}),r.length===t&&this._heapify(r)):e>r[0].cost&&(r[0]={node:a,cost:e},this._siftDown(r,0))}a.triangleCount===0&&(a.leftChild&&i.push(a.leftChild),a.rightChild&&i.push(a.rightChild))}return r}_heapify(e){for(let t=(e.length>>1)-1;t>=0;t--)this._siftDown(e,t)}_siftDown(e,t){let n=e.length;for(;;){let r=t,i=2*t+1,a=2*t+2;if(i<n&&e[i].cost<e[r].cost&&(r=i),a<n&&e[a].cost<e[r].cost&&(r=a),r===t)break;let o=e[t];e[t]=e[r],e[r]=o,t=r}}findReinsertion(e,t,n){let r=n.get(e),i=r.parent;if(!i)return null;let a=r.isLeft?i.rightChild:i.leftChild,o=this.surfaceArea(e),s=this.surfaceArea(i),c=null,l=0,u=s,d=a.minX,f=a.minY,p=a.minZ,m=a.maxX,h=a.maxY,g=a.maxZ,_=a,v=i,y=[];do{for(y.length=0,y.push(u,_);y.length>0;){let t=y.pop(),n=y.pop();if(n-o<=l)continue;let r=Math.min(t.minX,e.minX),i=Math.min(t.minY,e.minY),a=Math.min(t.minZ,e.minZ),s=Math.max(t.maxX,e.maxX),u=Math.max(t.maxY,e.maxY),d=Math.max(t.maxZ,e.maxZ),f=s-r,p=u-i,m=d-a,h=n-(f*p+p*m+m*f);if(h>l&&(c=t,l=h),t.triangleCount===0&&t.leftChild&&t.rightChild){let e=h+this.surfaceArea(t);y.push(e,t.leftChild),y.push(e,t.rightChild)}}let t=n.get(v);if(!t||t.parent===null)break;if(v!==i){d=Math.min(d,_.minX),f=Math.min(f,_.minY),p=Math.min(p,_.minZ),m=Math.max(m,_.maxX),h=Math.max(h,_.maxY),g=Math.max(g,_.maxZ);let e=m-d,t=h-f,n=g-p,r=e*t+t*n+n*e;u+=this.surfaceArea(v)-r}let r=t.parent;_=t.isLeft?r.rightChild:r.leftChild,v=r}while(n.get(v).parent!==null);return c===a||c===i?null:c?{from:e,to:c,areaDiff:l}:null}getConflicts(e,t,n){let r=n.get(e);return[t,e,r.isLeft?r.parent.rightChild:r.parent.leftChild,n.get(t).parent,r.parent]}reinsertNode(e,t,n){let r=n.get(e),i=r.parent,a=r.isLeft?i.rightChild:i.leftChild,o=n.get(i),s=o.parent,c=n.get(t),l=c.parent;o.isLeft?s.leftChild=a:s.rightChild=a,i.leftChild=e,i.rightChild=t,i.triangleOffset=0,i.triangleCount=0,i.minX=Math.min(e.minX,t.minX),i.minY=Math.min(e.minY,t.minY),i.minZ=Math.min(e.minZ,t.minZ),i.maxX=Math.max(e.maxX,t.maxX),i.maxY=Math.max(e.maxY,t.maxY),i.maxZ=Math.max(e.maxZ,t.maxZ),c.isLeft?l.leftChild=i:l.rightChild=i,n.set(a,{parent:s,isLeft:o.isLeft}),n.set(i,{parent:l,isLeft:c.isLeft}),n.set(e,{parent:i,isLeft:!0}),n.set(t,{parent:i,isLeft:!1}),this.refitFrom(s,n),this.refitFrom(l,n)}refitFrom(e,t){let n=e;for(;n;){if(n.triangleCount===0&&n.leftChild&&n.rightChild){let e=n.leftChild,t=n.rightChild;n.minX=Math.min(e.minX,t.minX),n.minY=Math.min(e.minY,t.minY),n.minZ=Math.min(e.minZ,t.minZ),n.maxX=Math.max(e.maxX,t.maxX),n.maxY=Math.max(e.maxY,t.maxY),n.maxZ=Math.max(e.maxZ,t.maxZ)}let e=t.get(n);n=e?e.parent:null}}optimizeBVH(e,t){let n=performance.now();this.stats={reinsertionsApplied:0,iterations:0,timeMs:0};for(let r=0;r<this.maxIterations&&!(performance.now()-n>this.timeBudgetMs);r++){let i=this.buildParentMap(e),a=i.size,o=Math.max(1,Math.floor(a*this.batchSizeRatio));t&&t(`Reinsertion iter ${r+1}/${this.maxIterations}: selecting ${o} candidates`);let s=this.findCandidates(e,o,i),c=[];for(let t=0;t<s.length&&!(performance.now()-n>this.timeBudgetMs);t++){let n=this.findReinsertion(s[t].node,e,i);n&&n.areaDiff>0&&c.push(n)}c.sort((e,t)=>t.areaDiff-e.areaDiff);let l=new Set,u=0;for(let e of c){let t=this.getConflicts(e.from,e.to,i);if(!t.some(e=>l.has(e))){for(let e of t)l.add(e);this.reinsertNode(e.from,e.to,i),u++}}if(this.stats.reinsertionsApplied+=u,this.stats.iterations=r+1,t&&t(`Reinsertion iter ${r+1}: applied ${u} reinsertions`),u===0)break}return this.stats.timeMs=performance.now()-n,this.stats}};const r={silent:0,error:1,warn:2,info:3,debug:4},i=`info`,a=`rayzeeLogLevel`,o=`rayzeeLogNamespaces`,s=`color:#7c8494`,c=`color:inherit`;let l=null,u=null;function d(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function f(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function p(){if(l!==null)return l;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in r?(l=r[e],l):(l=r[d(a)]??r[i],l)}function m(){if(u!==null)return u;let e=globalThis.__RAYZEE_LOG_NS__??d(o);return u=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],u}function h(e,t){if(t<r.debug)return!0;let n=m();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function g(e,t,n){if(e>p()||!h(t,e))return;let i=e===r.error?console.error:e===r.warn?console.warn:console.log,a=`[${t}]`;typeof n[0]==`string`?i(`%c${a}%c ${n[0]}`,s,c,...n.slice(1)):i(`%c${a}`,s,...n)}const _={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${_.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},v={levels:r,setLevel(e){return e in r?(globalThis.__RAYZEE_LOG_LEVEL__=e,l=r[e],f(a,e===i?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(r).join(`, `)}`),this.getLevel())},getLevel(){let e=p();return Object.keys(r).find(t=>r[t]===e)},isEnabled(e){return(r[e]??r.debug)<=p()},only(...e){let t=e.flat().filter(Boolean);return u=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),f(o,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return l=null,u=null,this.getLevel()}};function y(e){return{namespace:e,error:(...t)=>g(r.error,e,t),warn:(...t)=>g(r.warn,e,t),info:(...t)=>g(r.info,e,t),debug:(...t)=>g(r.debug,e,t),isEnabled:e=>v.isEnabled(e),summary(t,n=[]){let i=n.filter(Boolean);if(i.length===0||!console.groupCollapsed){g(r.info,e,[t]),i.forEach(t=>g(r.debug,e,[t]));return}r.info>p()||((p()>=r.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,s,c),i.forEach(e=>console.log(e)),console.groupEnd())}}}const b=1073741824,x=(e,t)=>~(e<<4|t)>>>0;function S(e){let t=new Uint32Array(e.buffer,e.byteOffset,e.length),n=e.length/16,r=e=>{let n=e*16;return t[n+3]===1073741824&&t[n+1]>0&&t[n+1]<=15},i=new Uint32Array(n),a=new Uint32Array(n),o=0,s=[0];for(;s.length;){let e=s.pop();i[e]=o,a[o++]=e;let n=e*16;t[n+3]>=b||(r(t[n+7])||s.push(t[n+7]),r(t[n+3])||s.push(t[n+3]))}let c=new Float32Array(o*16),l=new Uint32Array(c.buffer);for(let n=0;n<o;n++){let o=a[n]*16,s=n*16;c.set(e.subarray(o,o+16),s),!(t[o+3]>=b)&&(l[s+3]=C(t,t[o+3],r,i),l[s+7]=C(t,t[o+7],r,i))}return c}function C(e,t,n,r){let i=t*16;return n(t)?x(e[i],e[i+1]):r[t]}const w=y(`bvh`),T=1073741824,E=e=>new Uint32Array(e.buffer,e.byteOffset,e.length),D=1073741824;function O(e,t){if(e>=D)throw RangeError(`${t} is ${e}, at or past the BVH index limit of ${D}`);return e}const k={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8},A=k.FLOATS_PER_TRIANGLE,j=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length);var M=class{constructor(){this.minX=0,this.minY=0,this.minZ=0,this.maxX=0,this.maxY=0,this.maxZ=0,this.leftChild=null,this.rightChild=null,this.triangleOffset=0,this.triangleCount=0}},N=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,this.foldLeaves=!1,this.numBins=32,this.minBins=8,this.maxBins=64,this.totalNodes=0,this.processedTriangles=0,this.totalTriangles=0,this.lastProgressUpdate=0,this.progressUpdateInterval=100,this.traversalCost=1,this.intersectionCost=2.5,this.useMortonCodes=!0,this.mortonBits=10,this.mortonClusterThreshold=128,this.enableObjectMedianFallback=!0,this.enableSpatialMedianFallback=!0,this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0},this.enableTreeletOptimization=!1,this.treeletSize=5,this.treeletOptimizationPasses=1,this.treeletMinImprovement=.02,this.treeletComplexityThreshold=5e4,this.enableReinsertionOptimization=!0,this.reinsertionBatchSizeRatio=.02,this.reinsertionMaxIterations=2,this.initializeBinArrays(),this._partResult={mid:0,lMinX:0,lMinY:0,lMinZ:0,lMaxX:0,lMaxY:0,lMaxZ:0,rMinX:0,rMinY:0,rMinZ:0,rMaxX:0,rMaxY:0,rMaxZ:0},this.centroids=null,this.bMin=null,this.bMax=null,this.indices=null,this.mortonCodes=null,this.triangles=null,this.reorderedTriangleData=null}initializeBinArrays(){let e=this.maxBins;this.binBoundsMin=new Float32Array(e*3),this.binBoundsMax=new Float32Array(e*3),this.binCounts=new Uint32Array(e),this.leftPrefixMin=new Float32Array(e*3),this.leftPrefixMax=new Float32Array(e*3),this.leftPrefixCount=new Uint32Array(e),this.rightPrefixMin=new Float32Array(e*3),this.rightPrefixMax=new Float32Array(e*3),this.rightPrefixCount=new Uint32Array(e)}getOptimalBinCount(e){return e<=16?this.minBins:e<=64?16:e<=256?32:e<=1024?48:this.maxBins}setAdaptiveBinConfig(e){e.minBins!==void 0&&(this.minBins=Math.max(4,e.minBins)),e.maxBins!==void 0&&(this.maxBins=Math.min(128,e.maxBins)),e.baseBins!==void 0&&(this.numBins=e.baseBins),e.maxBins!==void 0&&this.initializeBinArrays()}setMortonConfig(e){e.enabled!==void 0&&(this.useMortonCodes=e.enabled),e.bits!==void 0&&(this.mortonBits=Math.max(6,Math.min(10,e.bits))),e.threshold!==void 0&&(this.mortonClusterThreshold=Math.max(16,e.threshold))}setFallbackConfig(e){e.objectMedian!==void 0&&(this.enableObjectMedianFallback=e.objectMedian),e.spatialMedian!==void 0&&(this.enableSpatialMedianFallback=e.spatialMedian)}setTreeletConfig(e){e.enabled!==void 0&&(this.enableTreeletOptimization=e.enabled),e.size!==void 0&&(this.treeletSize=Math.max(3,Math.min(12,e.size))),e.passes!==void 0&&(this.treeletOptimizationPasses=Math.max(1,Math.min(3,e.passes))),e.minImprovement!==void 0&&(this.treeletMinImprovement=Math.max(.001,e.minImprovement)),e.complexityThreshold!==void 0&&(this.treeletComplexityThreshold=e.complexityThreshold)}disableTreeletOptimization(){this.enableTreeletOptimization=!1}setReinsertionConfig(e){e.enabled!==void 0&&(this.enableReinsertionOptimization=e.enabled),e.batchSizeRatio!==void 0&&(this.reinsertionBatchSizeRatio=Math.max(.005,Math.min(.1,e.batchSizeRatio))),e.maxIterations!==void 0&&(this.reinsertionMaxIterations=Math.max(1,Math.min(5,e.maxIterations)))}initializeTriangleArrays(){let e=this.totalTriangles,t=j(this.triangles),n=k.POSITION_A_OFFSET,r=k.POSITION_B_OFFSET,i=k.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*A,o=t[e+n],s=t[e+n+1],c=t[e+n+2],l=t[e+r],u=t[e+r+1],d=t[e+r+2],f=t[e+i],p=t[e+i+1],m=t[e+i+2],h=a*3;this.centroids[h]=(o+l+f)/3,this.centroids[h+1]=(s+u+p)/3,this.centroids[h+2]=(c+d+m)/3,this.bMin[h]=o<l?o<f?o:f:l<f?l:f,this.bMin[h+1]=s<u?s<p?s:p:u<p?u:p,this.bMin[h+2]=c<d?c<m?c:m:d<m?d:m,this.bMax[h]=o>l?o>f?o:f:l>f?l:f,this.bMax[h+1]=s>u?s>p?s:p:u>p?u:p,this.bMax[h+2]=c>d?c>m?c:m:d>m?d:m,this.indices[a]=a}}expandBits(e){return e=e*65537&4278190335,e=e*257&251719695,e=e*17&3272356035,e=e*5&1227133513,e}morton3D(e,t,n){return(this.expandBits(n)<<2)+(this.expandBits(t)<<1)+this.expandBits(e)}computeMortonCodeForIndex(e,t,n,r,i,a,o){let s=this.centroids,c=e*3,l=(1<<this.mortonBits)-1,u=i>0?(s[c]-t)/i:0,d=a>0?(s[c+1]-n)/a:0,f=o>0?(s[c+2]-r)/o:0,p=Math.max(0,Math.min(l,Math.floor(u*l))),m=Math.max(0,Math.min(l,Math.floor(d*l))),h=Math.max(0,Math.min(l,Math.floor(f*l)));return this.morton3D(p,m,h)}sortTrianglesByMortonCode(){let e=this.totalTriangles;if(!this.useMortonCodes||e<this.mortonClusterThreshold)return;let t=performance.now(),n=this.centroids,r=this.indices,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let t=0;t<e;t++){let e=r[t]*3,u=n[e],d=n[e+1],f=n[e+2];u<i&&(i=u),d<a&&(a=d),f<o&&(o=f),u>s&&(s=u),d>c&&(c=d),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o,p=this.mortonCodes,m=(1<<this.mortonBits)-1,h=u>0?m/u:0,g=d>0?m/d:0,_=f>0?m/f:0;for(let t=0;t<e;t++){let e=r[t],s=e*3,c=(n[s]-i)*h,l=(n[s+1]-a)*g,u=(n[s+2]-o)*_;c=c<0?0:(c>m?m:c)|0,l=l<0?0:(l>m?m:l)|0,u=u<0?0:(u>m?m:u)|0,c=c*65537&4278190335,c=c*257&251719695,c=c*17&3272356035,c=c*5&1227133513,l=l*65537&4278190335,l=l*257&251719695,l=l*17&3272356035,l=l*5&1227133513,u=u*65537&4278190335,u=u*257&251719695,u=u*17&3272356035,u=u*5&1227133513,p[e]=(u<<2)+(l<<1)+c}let v=new Uint32Array(e),y=new Uint32Array(256);for(let t=0;t<32;t+=8){y.fill(0);for(let n=0;n<e;n++)y[p[r[n]]>>>t&255]++;let n=0;for(let e=0;e<256;e++){let t=y[e];y[e]=n,n+=t}for(let n=0;n<e;n++){let e=p[r[n]]>>>t&255;v[y[e]++]=r[n]}r.set(v)}this.splitStats.mortonSortTime+=performance.now()-t}build(e,t=30,n=null){if(this.totalTriangles=e.byteLength/(A*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),!(this.useWorker&&null))return new Promise(r=>{r(this._buildSyncAndFlatten(e,t,n))})}_buildSyncAndFlatten(e,t,n){let r=this.buildSync(e,t,n),i=this.flattenBVH(r);return{bvhData:this.foldLeaves?S(i):i,bvhRoot:!0,reorderedTriangles:this.reorderedTriangleData||null,originalToBvh:this.originalToBvhMap||null}}buildSync(t,r=30,i=null,a=null){let o=performance.now();this.totalNodes=0,this.processedTriangles=0,this.triangles=t,this.totalTriangles=t.byteLength/(A*4),this.lastProgressUpdate=performance.now(),this.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,reinsertionOptimizationTime:0,reinsertionsApplied:0,reinsertionIterations:0,saOrderTime:0,initTime:0,sahBuildTime:0,reorderTime:0};let s=this.totalTriangles,c=performance.now();this.centroids=new Float32Array(s*3),this.bMin=new Float32Array(s*3),this.bMax=new Float32Array(s*3),this.indices=new Uint32Array(s),this.mortonCodes=new Uint32Array(s),this.initializeTriangleArrays(),this.splitStats.initTime=performance.now()-c,this.sortTrianglesByMortonCode();let l=performance.now(),u=this.buildNodeRecursive(0,s,r,i);if(this.splitStats.sahBuildTime=performance.now()-l,this.enableTreeletOptimization&&this.totalTriangles>1e3){let t=this.totalTriangles>this.treeletComplexityThreshold?3:this.treeletSize,n=new e(this.traversalCost,this.intersectionCost);n.setTreeletSize(t),n.setMinImprovement(this.treeletMinImprovement);let r=performance.now();for(let e=0;e<this.treeletOptimizationPasses;e++){let t=i?t=>{i(`Treelet optimization pass ${e+1}/${this.treeletOptimizationPasses}: ${t}`)}:null;try{n.optimizeBVH(u,t)}catch(t){w.error(`treelet optimizer failed in pass ${e+1}:`,t);break}let a=n.getStatistics(),o=performance.now()-r;if(a.treeletsImproved===0&&e>0||o>15e3)break}let a=performance.now()-r;this.splitStats.treeletOptimizationTime=a;let o=n.getStatistics();this.splitStats.treeletsProcessed=o.treeletsProcessed,this.splitStats.treeletsImproved=o.treeletsImproved,this.splitStats.averageSAHImprovement=o.averageSAHImprovement}if(this.enableReinsertionOptimization&&this.totalTriangles>1e3){let e=new n(this.traversalCost,this.intersectionCost);e.setBatchSizeRatio(this.reinsertionBatchSizeRatio),e.setMaxIterations(this.reinsertionMaxIterations);let t=i?e=>{i(e)}:null;try{e.optimizeBVH(u,t)}catch(e){w.error(`reinsertion optimizer failed:`,e)}let r=e.getStatistics();this.splitStats.reinsertionOptimizationTime=r.timeMs,this.splitStats.reinsertionsApplied=r.reinsertionsApplied,this.splitStats.reinsertionIterations=r.iterations}let d=performance.now();this.applySAOrdering(u),this.splitStats.saOrderTime=performance.now()-d;let f=performance.now(),p=this.triangles,m=a||new p.constructor(s*A);for(let e=0;e<s;e++){let t=this.indices[e]*A,n=e*A;m.set(p.subarray(t,t+A),n)}this.reorderedTriangleData=m;let h=new Uint32Array(s);for(let e=0;e<s;e++)h[this.indices[e]]=e;this.originalToBvhMap=h,this.splitStats.reorderTime=performance.now()-f,this.splitStats.totalBuildTime=performance.now()-o;let g=this.splitStats.totalBuildTime,v=this.splitStats;return w.debug(`${_.n(s)} tris → ${_.n(this.totalNodes)} nodes in ${_.ms(g)} | SAH ${v.sahSplits} objMed ${v.objectMedianSplits} spatMed ${v.spatialMedianSplits} failed ${v.failedSplits}`+(v.treeletsProcessed?` | treelets ${v.treeletsImproved}/${v.treeletsProcessed} improved`:``)+(v.reinsertionsApplied?` | reinsertions ${v.reinsertionsApplied}`:``)),i&&i(100),this.centroids=null,this.bMin=null,this.bMax=null,this.mortonCodes=null,u}updateProgress(e,t){if(!t)return;this.processedTriangles+=e;let n=performance.now();n-this.lastProgressUpdate<this.progressUpdateInterval||(this.lastProgressUpdate=n,t(Math.min(Math.floor(this.processedTriangles/this.totalTriangles*100),99)))}buildNodeRecursiveToDepth(e,t,n,r,i,a,o,s,c,l,u){let d=new M;this.totalNodes++;let f=t-e;if(a===void 0?this.updateNodeBounds(d,e,t):(d.minX=a,d.minY=o,d.minZ=s,d.maxX=c,d.maxY=l,d.maxZ=u),f<=this.maxLeafSize||n<=0)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;if(r<=0&&f>this.maxLeafSize*16){let r=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=r,this.frontierTasks.push({taskId:r,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}let p=this.findBestSplitPositionSAH(e,t,d);if(!p.success){if(this.splitStats.failedSplits++,r>0||f<=this.maxLeafSize*16)return d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d;let a=this.frontierTasks.length;return d.triangleOffset=e,d.triangleCount=f,d.isFrontier=!0,d.frontierTaskId=a,this.frontierTasks.push({taskId:a,start:e,end:t,depth:n,preMinX:d.minX,preMinY:d.minY,preMinZ:d.minZ,preMaxX:d.maxX,preMaxY:d.maxY,preMaxZ:d.maxZ}),d}p.method===`SAH`?this.splitStats.sahSplits++:p.method===`object_median`?this.splitStats.objectMedianSplits++:p.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,p.axis,p.pos);let m=this._partResult,h=m.mid,g=m.lMinX,_=m.lMinY,v=m.lMinZ,y=m.lMaxX,b=m.lMaxY,x=m.lMaxZ,S=m.rMinX,C=m.rMinY,w=m.rMinZ,T=m.rMaxX,E=m.rMaxY,D=m.rMaxZ;return h===e||h===t?(d.triangleOffset=e,d.triangleCount=f,this.updateProgress(f,i),d):(d.leftChild=this.buildNodeRecursiveToDepth(e,h,n-1,r-1,i,g,_,v,y,b,x),d.rightChild=this.buildNodeRecursiveToDepth(h,t,n-1,r-1,i,S,C,w,T,E,D),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new M;this.totalNodes++;let d=t-e;if(i===void 0?this.updateNodeBounds(u,e,t):(u.minX=i,u.minY=a,u.minZ=o,u.maxX=s,u.maxY=c,u.maxZ=l),d<=this.maxLeafSize||n<=0)return u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;let f=this.findBestSplitPositionSAH(e,t,u);if(!f.success)return this.splitStats.failedSplits++,u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u;f.method===`SAH`?this.splitStats.sahSplits++:f.method===`object_median`?this.splitStats.objectMedianSplits++:f.method===`spatial_median`&&this.splitStats.spatialMedianSplits++,this.partitionWithBounds(e,t,f.axis,f.pos);let p=this._partResult,m=p.mid,h=p.lMinX,g=p.lMinY,_=p.lMinZ,v=p.lMaxX,y=p.lMaxY,b=p.lMaxZ,x=p.rMinX,S=p.rMinY,C=p.rMinZ,w=p.rMaxX,T=p.rMaxY,E=p.rMaxZ;return m===e||m===t?(u.triangleOffset=e,u.triangleCount=d,this.updateProgress(d,r),u):(u.leftChild=this.buildNodeRecursive(e,m,n-1,r,h,g,_,v,y,b),u.rightChild=this.buildNodeRecursive(m,t,n-1,r,x,S,C,w,T,E),u)}partitionWithBounds(e,t,n,r){let i=this.indices,a=this.centroids,o=this.bMin,s=this.bMax,c=e,l=t-1,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0,g=1/0,_=1/0,v=1/0,y=-1/0,b=-1/0,x=-1/0;for(;c<=l;){let e=i[c],t=e*3;a[t+n]<=r?(o[t]<u&&(u=o[t]),o[t+1]<d&&(d=o[t+1]),o[t+2]<f&&(f=o[t+2]),s[t]>p&&(p=s[t]),s[t+1]>m&&(m=s[t+1]),s[t+2]>h&&(h=s[t+2]),c++):(o[t]<g&&(g=o[t]),o[t+1]<_&&(_=o[t+1]),o[t+2]<v&&(v=o[t+2]),s[t]>y&&(y=s[t]),s[t+1]>b&&(b=s[t+1]),s[t+2]>x&&(x=s[t+2]),i[c]=i[l],i[l]=e,l--)}let S=this._partResult;return S.mid=c,S.lMinX=u,S.lMinY=d,S.lMinZ=f,S.lMaxX=p,S.lMaxY=m,S.lMaxZ=h,S.rMinX=g,S.rMinY=_,S.rMinZ=v,S.rMaxX=y,S.rMaxY=b,S.rMaxZ=x,S}updateNodeBounds(e,t,n){let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0,l=this.indices,u=this.bMin,d=this.bMax;for(let e=t;e<n;e++){let t=l[e]*3;u[t]<r&&(r=u[t]),u[t+1]<i&&(i=u[t+1]),u[t+2]<a&&(a=u[t+2]),d[t]>o&&(o=d[t]),d[t+1]>s&&(s=d[t+1]),d[t+2]>c&&(c=d[t+2])}e.minX=r,e.minY=i,e.minZ=a,e.maxX=o,e.maxY=s,e.maxZ=c}findBestSplitPositionSAH(e,t,n){let r=1/0,i=-1,a=0,o=this.computeSurfaceAreaFlat(n.minX,n.minY,n.minZ,n.maxX,n.maxY,n.maxZ),s=t-e,c=this.intersectionCost*s,l=this.getOptimalBinCount(s);this.splitStats.totalSplitAttempts++,this.splitStats.avgBinsUsed=(this.splitStats.avgBinsUsed*(this.splitStats.totalSplitAttempts-1)+l)/this.splitStats.totalSplitAttempts;let u=this.indices,d=this.centroids,f=this.bMin,p=this.bMax,m=this.binBoundsMin,h=this.binBoundsMax,g=this.binCounts,_=this.leftPrefixMin,v=this.leftPrefixMax,y=this.leftPrefixCount,b=this.rightPrefixMin,x=this.rightPrefixMax,S=this.rightPrefixCount,C=1/0,w=-1/0,T=1/0,E=-1/0,D=1/0,O=-1/0;for(let n=e;n<t;n++){let e=u[n]*3,t=d[e],r=d[e+1],i=d[e+2];t<C&&(C=t),t>w&&(w=t),r<T&&(T=r),r>E&&(E=r),i<D&&(D=i),i>O&&(O=i)}let k=[C,T,D],A=[w,E,O];for(let n=0;n<3;n++){let s=k[n],C=A[n];if(C-s<1e-6)continue;for(let e=0;e<l;e++){g[e]=0;let t=e*3;m[t]=1/0,m[t+1]=1/0,m[t+2]=1/0,h[t]=-1/0,h[t+1]=-1/0,h[t+2]=-1/0}let w=l/(C-s);for(let r=e;r<t;r++){let e=u[r],t=d[e*3+n],i=Math.floor((t-s)*w);i>=l&&(i=l-1),g[i]++;let a=i*3,o=e*3;f[o]<m[a]&&(m[a]=f[o]),f[o+1]<m[a+1]&&(m[a+1]=f[o+1]),f[o+2]<m[a+2]&&(m[a+2]=f[o+2]),p[o]>h[a]&&(h[a]=p[o]),p[o+1]>h[a+1]&&(h[a+1]=p[o+1]),p[o+2]>h[a+2]&&(h[a+2]=p[o+2])}y[0]=g[0],_[0]=m[0],_[1]=m[1],_[2]=m[2],v[0]=h[0],v[1]=h[1],v[2]=h[2];for(let e=1;e<l;e++){let t=e*3,n=(e-1)*3;y[e]=y[e-1]+g[e];let r=_[n],i=m[t],a=_[n+1],o=m[t+1],s=_[n+2],c=m[t+2];_[t]=r<i?r:i,_[t+1]=a<o?a:o,_[t+2]=s<c?s:c;let l=v[n],u=h[t],d=v[n+1],f=h[t+1],p=v[n+2],b=h[t+2];v[t]=l>u?l:u,v[t+1]=d>f?d:f,v[t+2]=p>b?p:b}let T=l-1,E=T*3;S[T]=g[T],b[E]=m[E],b[E+1]=m[E+1],b[E+2]=m[E+2],x[E]=h[E],x[E+1]=h[E+1],x[E+2]=h[E+2];for(let e=T-1;e>=0;e--){let t=e*3,n=(e+1)*3;S[e]=S[e+1]+g[e];let r=b[n],i=m[t],a=b[n+1],o=m[t+1],s=b[n+2],c=m[t+2];b[t]=r<i?r:i,b[t+1]=a<o?a:o,b[t+2]=s<c?s:c;let l=x[n],u=h[t],d=x[n+1],f=h[t+1],p=x[n+2],_=h[t+2];x[t]=l>u?l:u,x[t+1]=d>f?d:f,x[t+2]=p>_?p:_}for(let e=1;e<l;e++){let t=(e-1)*3,u=e*3,d=y[e-1],f=S[e];if(d===0||f===0)continue;let p=v[t]-_[t],m=v[t+1]-_[t+1],h=v[t+2]-_[t+2],g=2*(p*m+m*h+h*p),w=x[u]-b[u],T=x[u+1]-b[u+1],E=x[u+2]-b[u+2],D=2*(w*T+T*E+E*w),O=this.traversalCost+g/o*d*this.intersectionCost+D/o*f*this.intersectionCost;O<r&&O<c&&(r=O,i=n,a=s+(C-s)*e/l)}}return i===-1?this.enableObjectMedianFallback?this.findObjectMedianSplit(e,t):this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`fallbacks_disabled`}:{success:!0,axis:i,pos:a,method:`SAH`,binsUsed:l}}findObjectMedianSplit(e,t){let n=this.indices,r=this.centroids,i=-1,a=-1;for(let o=0;o<3;o++){let s=1/0,c=-1/0;for(let i=e;i<t;i++){let e=r[n[i]*3+o];e<s&&(s=e),e>c&&(c=e)}let l=c-s;l>a&&(a=l,i=o)}if(i===-1||a<1e-10)return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_failed`};let o=t-e,s=e+Math.floor(o/2);this.quickselect(e,t,s,i);let c=r[n[s]*3+i],l=!0;for(let e=s+1;e<t;e++)if(r[n[e]*3+i]>c){l=!1;break}if(l){let a=-1/0;for(let t=e;t<s;t++){let e=r[n[t]*3+i];e>a&&(a=e)}if(a<c)c=(a+c)*.5;else return this.enableSpatialMedianFallback?this.findSpatialMedianSplit(e,t):{success:!1,method:`object_median_degenerate`}}return{success:!0,axis:i,pos:c,method:`object_median`}}findSpatialMedianSplit(e,t){let n=this.indices,r=this.centroids,i=this.bMin,a=this.bMax,o=-1,s=-1,c=0,l=0;for(let r=0;r<3;r++){let u=1/0,d=-1/0;for(let o=e;o<t;o++){let e=n[o]*3+r;i[e]<u&&(u=i[e]),a[e]>d&&(d=a[e])}let f=d-u;f>s&&(s=f,o=r,c=u,l=d)}if(o===-1||s<1e-12)return{success:!1,method:`spatial_median_failed`};let u=(c+l)*.5,d=t-e,f=0;for(let i=e;i<t;i++)r[n[i]*3+o]<=u&&f++;if(f===0||f===d){let i=e+Math.floor(d/2);this.quickselect(e,t,i,o);let a=r[n[i]*3+o],s=!0;for(let i=e;i<t;i++)if(r[n[i]*3+o]!==a){s=!1;break}if(s)return{success:!1,method:`spatial_median_degenerate`};let c=-1/0;for(let t=e;t<i;t++){let e=r[n[t]*3+o];e>c&&(c=e)}if(c<a)u=(c+a)*.5;else{let e=1/0;for(let a=i+1;a<t;a++){let t=r[n[a]*3+o];t<e&&(e=t)}u=(a+e)*.5}}return{success:!0,axis:o,pos:u,method:`spatial_median`}}quickselect(e,t,n,r){let i=this.indices,a=this.centroids,o=e,s=t-1;for(;o<s;){let e=o+s>>>1,t=a[i[o]*3+r],c=a[i[e]*3+r],l=a[i[s]*3+r];if(t>c){let t=i[o];i[o]=i[e],i[e]=t}if(t>l){let e=i[o];i[o]=i[s],i[s]=e}if(c>l){let t=i[e];i[e]=i[s],i[s]=t}let u=a[i[e]*3+r],d=o,f=s;for(;d<=f;){for(;a[i[d]*3+r]<u;)d++;for(;a[i[f]*3+r]>u;)f--;if(d<=f){let e=i[d];i[d]=i[f],i[f]=e,d++,f--}}f<n&&(o=d),d>n&&(s=f)}}applySAOrdering(e){if(!e||!e.leftChild)return;let t=[e],n=[];for(;t.length>0;){let e=t.pop();!e.leftChild||!e.rightChild||(n.push(e),t.push(e.leftChild),t.push(e.rightChild))}for(let e=n.length-1;e>=0;e--){let t=n[e],r=t.leftChild,i=t.rightChild,a=r.maxX-r.minX,o=r.maxY-r.minY,s=r.maxZ-r.minZ,c=i.maxX-i.minX,l=i.maxY-i.minY,u=i.maxZ-i.minZ;c*l+l*u+u*c>a*o+o*s+s*a&&(t.leftChild=i,t.rightChild=r)}}flattenBVH(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}O(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=E(r);for(let e=0;e<t.length;e++){let n=t[e],a=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[a]=e.minX,r[a+1]=e.minY,r[a+2]=e.minZ,i[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,i[a+7]=t._flatIndex,r[a+8]=t.minX,r[a+9]=t.minY,r[a+10]=t.minZ,r[a+12]=t.maxX,r[a+13]=t.maxY,r[a+14]=t.maxZ}else i[a]=n.triangleOffset,i[a+1]=n.triangleCount,i[a+3]=T}return r}flattenBVHWithFrontier(e){let t=[],n=[e];for(;n.length>0;){let e=n.pop();e._flatIndex=t.length,t.push(e),e.rightChild&&n.push(e.rightChild),e.leftChild&&n.push(e.leftChild)}O(t.length,`BLAS node count`);let r=new Float32Array(t.length*16),i=[],a=E(r);for(let e=0;e<t.length;e++){let n=t[e],o=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[o]=e.minX,r[o+1]=e.minY,r[o+2]=e.minZ,a[o+3]=e._flatIndex,r[o+4]=e.maxX,r[o+5]=e.maxY,r[o+6]=e.maxZ,a[o+7]=t._flatIndex,r[o+8]=t.minX,r[o+9]=t.minY,r[o+10]=t.minZ,r[o+12]=t.maxX,r[o+13]=t.maxY,r[o+14]=t.maxZ}else if(n.isFrontier){let t=n.frontierTaskId;a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+2]=t,a[o+3]=1073741826,i.push({taskId:t,flatIndex:e})}else a[o]=n.triangleOffset,a[o+1]=n.triangleCount,a[o+3]=T}return{flatData:r,frontierMap:i,nodeCount:t.length}}assembleParallelBVH(e,t,n,r){let i=[...r].sort((e,t)=>e.taskId-t.taskId),a=t;for(let e=0;e<i.length;e++)a+=i[e].nodeCount;O(a,`assembled BLAS node count`);let o=new Float32Array(a*16),s=E(o);o.set(e);let c=new Map;for(let e of n)c.set(e.taskId,e.flatIndex);let l=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=l*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;s[t+3]<T&&(s[t+3]+=l,s[t+7]+=l)}let u=c.get(t.taskId);if(u!==void 0){let e=u*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}l+=r}return o}computeSurfaceAreaFlat(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};self.onmessage=function(t){let{tasks:r,sharedTriangleData:i,sharedCentroids:a,sharedBMin:o,sharedBMax:s,sharedIndices:c,triangleCount:l,maxLeafSize:u,numBins:d,maxBins:f,minBins:p,treeletConfig:m,reinsertionConfig:h,reportProgress:g}=t.data;for(let t=0;t<r.length;t++){let _=r[t];try{let t=new N;t.maxLeafSize=u,t.numBins=d,t.maxBins=f,t.minBins=p,t.triangles=new Float32Array(i),t.centroids=new Float32Array(a),t.bMin=new Float32Array(o),t.bMax=new Float32Array(s),t.indices=new Uint32Array(c),t.totalTriangles=l,t.totalNodes=0,t.processedTriangles=0,t.lastProgressUpdate=performance.now(),t.splitStats={sahSplits:0,objectMedianSplits:0,spatialMedianSplits:0,failedSplits:0,avgBinsUsed:0,totalSplitAttempts:0,mortonSortTime:0,totalBuildTime:0,treeletOptimizationTime:0,treeletsProcessed:0,treeletsImproved:0,averageSAHImprovement:0,initTime:0,sahBuildTime:0,reorderTime:0};let r=g?e=>{self.postMessage({type:`progress`,taskId:_.taskId,progress:e})}:null,v=performance.now(),y=t.buildNodeRecursive(_.start,_.end,_.depth,r,_.preMinX,_.preMinY,_.preMinZ,_.preMaxX,_.preMaxY,_.preMaxZ);if(m&&m.enabled&&_.end-_.start>1e3){let n=_.end-_.start>5e4,r=n?3:m.size||5,i=n?10:20,a=new e(t.traversalCost,t.intersectionCost);a.setTreeletSize(r),a.setMinImprovement(m.minImprovement||.02),a.setMaxTreelets(i);let o=m.passes||1;for(let e=0;e<o;e++)try{a.optimizeBVH(y,null)}catch(t){console.error(`[BVHSubtreeWorker] Treelet pass ${e+1} error:`,t);break}}if(h&&h.enabled&&_.end-_.start>1e3){let e=new n(t.traversalCost,t.intersectionCost);h.batchSizeRatio&&e.setBatchSizeRatio(h.batchSizeRatio),h.maxIterations&&e.setMaxIterations(h.maxIterations);try{e.optimizeBVH(y,null)}catch(e){console.error(`[BVHSubtreeWorker] Reinsertion error:`,e)}}t.applySAOrdering(y);let b=t.flattenBVH(y),x=b.length/16,S=performance.now()-v;console.log(`[BVHSubtreeWorker] Task ${_.taskId}: ${(_.end-_.start).toLocaleString()} triangles, ${x} nodes, ${Math.round(S)}ms`),self.postMessage({type:`subtreeResult`,taskId:_.taskId,flatData:b,nodeCount:x},[b.buffer])}catch(e){console.error(`[BVHSubtreeWorker] Task ${_.taskId} error:`,e),self.postMessage({type:`error`,taskId:_.taskId,error:e.message})}}};",cm=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,sm],{type:`text/javascript;charset=utf-8`});function lm(e){let t;try{if(t=cm&&(self.URL||self.webkitURL).createObjectURL(cm),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(sm),{type:`module`,name:e?.name})}}rn(),Np(()=>new om);var um=Wt(`bvh`),dm=20,fm=5e4,pm=8;function mm(e,t,n,r){let i=e.byteLength/(dm*4),a=Math.min(navigator.hardwareConcurrency||4,pm),o=Math.ceil(Math.log2(a*2.5+1));return um.debug(`parallel build ${J.n(i)} triangles · ${a} workers · parallelDepth ${o}`),new Promise((s,c)=>{(async()=>{let l=e.buffer instanceof SharedArrayBuffer&&e.byteOffset===0&&e.byteLength===e.buffer.byteLength,u=l?e.buffer:new SharedArrayBuffer(e.byteLength);l||new Uint32Array(u).set(e),e=null;let d=new SharedArrayBuffer(i*3*4),f=new SharedArrayBuffer(i*3*4),p=new SharedArrayBuffer(i*3*4),m=new SharedArrayBuffer(i*4),h=new SharedArrayBuffer(i*4),g=new om,_=null,v=[g],y={id:null},b=!1,x=()=>{y.id&&=(clearTimeout(y.id),null);for(let e of v)try{e.terminate()}catch{}},S=e=>{if(!b){b=!0,um.warn(`parallel build failed (${e}), falling back to single worker`),x();try{let e=new ArrayBuffer(u.byteLength);new Uint32Array(e).set(new Uint32Array(u)),s(gm(new Uint32Array(e),t,n,r))}catch(e){c(e)}}};g.onerror=e=>{S(`coordinator error: ${e.message}`)},g.onmessage=e=>{let t=e.data;if(t.error||t.type===`error`){S(t.error);return}if(t.type===`progress`&&n){n(Math.floor(t.progress*.3));return}if(t.type===`phase1Result`){_=t.splitStats,hm(t,a,u,d,f,p,m,null,i,n,g,v,x,S,s,y,r).catch(e=>S(e.message));return}if(t.type===`assembleResult`){b=!0,x(),s({bvhData:t.bvhData,bvhRoot:!0,order:new Uint32Array(m),triangles:new Uint32Array(u),originalToBvh:t.originalToBvh||null,splitStats:_||{}});return}},n&&n(0),g.postMessage({type:`buildPhase1`,sharedTriangleData:u,sharedCentroids:d,sharedBMin:f,sharedBMax:p,sharedIndices:m,sharedMortonCodes:h,triangleCount:i,depth:t,parallelDepth:o,reportProgress:!!n,treeletOptimization:r.treeletOptimization})})().catch(e=>{um.warn(`parallel build setup failed:`,e),c(e)})})}async function hm(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g){let{topFlatData:_,topNodeCount:v,frontierTasks:y,frontierMap:b}=e;if(!y||y.length===0){um.debug(`no frontier tasks, assembling with top-level tree only`),u.postMessage({type:`assemble`,topFlatData:_,topNodeCount:v,frontierMap:[],subtreeResults:[],sharedTriangleData:n,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:g.foldLeaves},[_.buffer]);return}um.debug(`phase 2 distributing ${y.length} tasks across ${t} workers`);let x=[...y].sort((e,t)=>t.end-t.start-(e.end-e.start)),S=Array.from({length:Math.min(t,x.length)},()=>[]),C=Array(S.length).fill(0);for(let e of x){let t=0;for(let e=1;e<C.length;e++)C[e]<C[t]&&(t=e);S[t].push(e),C[t]+=e.end-e.start}let w=[],T=0,E=y.length,D=y.reduce((e,t)=>e+(t.end-t.start),0),O=0;h.id=setTimeout(()=>{p(`Phase 2 timeout (30s)`)},3e4);let k=()=>{clearTimeout(h.id),h.id=null,l&&l(85);let t=[];e.topFlatData&&e.topFlatData.buffer&&t.push(e.topFlatData.buffer);for(let e of w)e.flatData&&e.flatData.buffer&&t.push(e.flatData.buffer);u.postMessage({type:`assemble`,topFlatData:e.topFlatData,topNodeCount:v,frontierMap:b,subtreeResults:w,sharedTriangleData:n,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c,foldLeaves:g.foldLeaves},t)},A=S.length;for(let e=0;e<A;e++){let t=S[e];if(t.length===0)continue;let s=new lm;d.push(s),s.onerror=e=>{p(`subtree worker error: ${e.message}`)},s.onmessage=e=>{let t=e.data;if(t.type===`error`){p(`subtree task ${t.taskId} error: ${t.error}`);return}if(t.type===`progress`&&l){let e=30+Math.floor(O/D*55);l(Math.min(e,85));return}if(t.type===`subtreeResult`){w.push({taskId:t.taskId,flatData:t.flatData,nodeCount:t.nodeCount});let e=y.find(e=>e.taskId===t.taskId);if(e&&(O+=e.end-e.start),T++,l){let e=30+Math.floor(O/D*55);l(Math.min(e,85))}if(T===E){for(let e of d)if(e!==u)try{e.terminate()}catch{}k()}}},s.postMessage({tasks:t,sharedTriangleData:n,sharedCentroids:r,sharedBMin:i,sharedBMax:a,sharedIndices:o,triangleCount:c,maxLeafSize:g.maxLeafSize,numBins:g.numBins,maxBins:g.maxBins,minBins:g.minBins,treeletConfig:g.treeletOptimization,reinsertionConfig:g.reinsertionOptimization,reportProgress:!!l})}}function gm(e,t,n,r){return new Promise((i,a)=>{(async()=>{let o=new om,s=e.byteLength/(dm*4),c=typeof SharedArrayBuffer<`u`?new SharedArrayBuffer(s*dm*4):null;o.onmessage=e=>{let{bvhData:t,triangles:r,originalToBvh:s,error:l,progress:u,treeletStats:d}=e.data;if(l){o.terminate(),a(Error(l));return}if(u!==void 0&&n){n(u);return}o.terminate(),i({bvhData:t,bvhRoot:!0,reorderedTriangles:c?new Uint32Array(c):r,originalToBvh:s||null,splitStats:d||{}})},o.onerror=e=>{o.terminate(),a(e)};let l=e.buffer;o.postMessage({triangleData:l,triangleByteOffset:e.byteOffset,triangleByteLength:e.byteLength,triangleCount:s,depth:t,reportProgress:!!n,sharedReorderBuffer:c,treeletOptimization:r.treeletOptimization,reinsertionOptimization:r.reinsertionOptimization,foldLeaves:r.foldLeaves},[l])})().catch(e=>{um.warn(`single worker fallback failed:`,e),a(e)})})}function _m(e){return typeof Worker<`u`&&typeof SharedArrayBuffer<`u`&&e>=fm}var vm=Float64Array.from([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function ym(e,t){return e[t]*(e[t+5]*e[t+10]-e[t+6]*e[t+9])-e[t+4]*(e[t+1]*e[t+10]-e[t+2]*e[t+9])+e[t+8]*(e[t+1]*e[t+6]-e[t+2]*e[t+5])}function bm(e,t,n){let r=ym(e,t);if(!Number.isFinite(r)||Math.abs(r)<1e-20)return n.set(vm),n;let i=1/r;return n[0]=(e[t+5]*e[t+10]-e[t+6]*e[t+9])*i,n[1]=(e[t+2]*e[t+9]-e[t+1]*e[t+10])*i,n[2]=(e[t+1]*e[t+6]-e[t+2]*e[t+5])*i,n[3]=0,n[4]=(e[t+6]*e[t+8]-e[t+4]*e[t+10])*i,n[5]=(e[t]*e[t+10]-e[t+2]*e[t+8])*i,n[6]=(e[t+2]*e[t+4]-e[t]*e[t+6])*i,n[7]=0,n[8]=(e[t+4]*e[t+9]-e[t+5]*e[t+8])*i,n[9]=(e[t+1]*e[t+8]-e[t]*e[t+9])*i,n[10]=(e[t]*e[t+5]-e[t+1]*e[t+4])*i,n[11]=0,n[12]=-(n[0]*e[t+12]+n[4]*e[t+13]+n[8]*e[t+14]),n[13]=-(n[1]*e[t+12]+n[5]*e[t+13]+n[9]*e[t+14]),n[14]=-(n[2]*e[t+12]+n[6]*e[t+13]+n[10]*e[t+14]),n[15]=1,n}function xm(e,t,n,r){for(let i=0;i<4;i++){let a=n+i*4,o=t[a],s=t[a+1],c=t[a+2],l=t[a+3];for(let t=0;t<4;t++)r[i*4+t]=e[t]*o+e[4+t]*s+e[8+t]*c+e[12+t]*l}return r}function Sm(e){for(let t=0;t<16;t++)if(e[t]!==vm[t])return!1;return!0}function Cm(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=0;i<8;i++){let a=e[t+(i&1?3:0)],f=e[t+(i&2?4:1)],p=e[t+(i&4?5:2)],m=n[r]*a+n[r+4]*f+n[r+8]*p+n[r+12],h=n[r+1]*a+n[r+5]*f+n[r+9]*p+n[r+13],g=n[r+2]*a+n[r+6]*f+n[r+10]*p+n[r+14];m<o&&(o=m),m>l&&(l=m),h<s&&(s=h),h>u&&(u=h),g<c&&(c=g),g>d&&(d=g)}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}function wm(e,t){for(let n=0;n<16;n++)if(e[t+n]!==vm[n])return!1;return!0}var Tm=class e{constructor(){this.count=0,this.templateCount=0,this.totalBLASNodes=0,this.tlasNodeCount=0,this.allocate(0)}allocate(e,t=e,n=null,r=null){this.count=e,this.templateCount=t,this.isSet=new Uint8Array(e),this.sourceMesh=r&&r.length>=e?r:new Int32Array(e),this.tlasLeafIndex=new Int32Array(e).fill(-1),this.visible=new Uint8Array(e).fill(1),this.flipWinding=new Uint8Array(e),this.tplBakeInverse=null,n&&n.length>=e*16?(this.world=n,this.worldPooled=!0):(this.world=new Float32Array(e*16),this.worldPooled=!1),this.tplTriOffset=new Int32Array(t),this.tplTriCount=new Int32Array(t),this.tplExpandedStart=new Int32Array(t),this.tplNodeCount=new Int32Array(t),this.tplBlasOffset=new Int32Array(t),this.tplOwner=new Int32Array(t).fill(-1),this.tplObjectAABB=new Float32Array(t*6),this._placementRuns=null,this.originalToBvhMap=new Map,this.bvhToOriginal=new Map,this.blasData=new Map}_place(e,t,n,r){this.isSet[e]=1,this.sourceMesh[e]=t;let i=e*16;if(!n){this.world.set(vm,i),this.flipWinding[e]=0;return}if(n!==this.world)for(let e=0;e<16;e++)this.world[i+e]=n[r+e];this.flipWinding[e]=+(ym(this.world,i)<0)}setEntry({meshIndex:e,blasNodeCount:t,triOffset:n,triCount:r,originalToBvhMap:i,bvhData:a,matrixWorld:o=null,matrixOffset:s=0,expandedStart:c=null,sourceMesh:l=null}){let u=l??e;this._place(e,u,o,s),this.tplTriOffset[u]=n,this.tplTriCount[u]=r,this.tplExpandedStart[u]=c??n,this.tplNodeCount[u]=t,this.tplOwner[u]=e,i&&this.originalToBvhMap.set(u,i),a&&this.blasData.set(u,a)}setAlias(e,t,n=null,r=null,i=null,a=0){if(!this.isSet[t])throw Error(`InstanceTable.setAlias: owner ${t} not built`);let o=i??e,s=this.sourceMesh[t];this._place(e,o,n,a),o!==s&&(this.tplTriOffset[o]=this.tplTriOffset[s],this.tplTriCount[o]=this.tplTriCount[s],this.tplNodeCount[o]=this.tplNodeCount[s],this.tplExpandedStart[o]=r??this.tplExpandedStart[s],this.tplOwner[o]=this.tplOwner[s])}get setCount(){let e=0;for(let t=0;t<this.count;t++)e+=this.isSet[t];return e}setPlacementMatrix(e,t,n=0){this._place(e,this.sourceMesh[e],t,n)}placementRunOf(e){if(!this._placementRuns){let e=this._placementRuns=new Map;for(let t=0;t<this.count;t++){let n=this.sourceMesh[t],r=e.get(n);r?r.count++:e.set(n,{start:t,count:1})}}return this._placementRuns.get(e)??null}isOwner(e){return this.tplOwner[this.sourceMesh[e]]===e}triOffsetOf(e){return this.tplTriOffset[this.sourceMesh[e]]}triCountOf(e){return this.tplTriCount[this.sourceMesh[e]]}expandedStartOf(e){return this.tplExpandedStart[this.sourceMesh[e]]}blasOffsetOf(e){return this.tplBlasOffset[this.sourceMesh[e]]}blasNodeCountOf(e){return this.tplNodeCount[this.sourceMesh[e]]}setBlasNodeCount(e,t){this.tplNodeCount[this.sourceMesh[e]]=t}setBvhToOriginal(e,t){this.bvhToOriginal.set(this.sourceMesh[e],t)}bvhToOriginalOf(e){let t=this.sourceMesh[e],n=this.bvhToOriginal.get(t);if(n)return n;let r=this.tplOwner[t];return(r>=0?this.bvhToOriginal.get(this.sourceMesh[r]):null)||null}matrixWorldOf(e){return this.world.subarray(e*16,e*16+16)}matrixInverseOf(e){return bm(this.world,e*16,new Float64Array(16))}writeWorldAABB(e,t,n){if(!this.isSet[e]){for(let e=0;e<6;e++)t[n+e]=0;return}Cm(this.tplObjectAABB,this.sourceMesh[e]*6,this.world,e*16,t,n)}writeWorldAABBs(e){let t=this.tplObjectAABB,n=this.world,r=this.sourceMesh,i=this.isSet;for(let a=0;a<this.count;a++){let o=a*6;if(!i[a]){e[o]=0,e[o+1]=0,e[o+2]=0,e[o+3]=0,e[o+4]=0,e[o+5]=0;continue}Cm(t,r[a]*6,n,a*16,e,o)}}entryAt(e){if(!this.isSet[e])return null;let t=this.sourceMesh[e],n=this.tplOwner[t];return{meshIndex:e,blasOffset:this.tplBlasOffset[t],blasNodeCount:this.tplNodeCount[t],triOffset:this.tplTriOffset[t],triCount:this.tplTriCount[t],expandedStart:this.tplExpandedStart[t],sourceMesh:t,sharedFrom:n===e?null:n,matrixWorld:this.matrixWorldOf(e),matrixInverse:this.matrixInverseOf(e),flipWinding:!!this.flipWinding[e],bvhToOriginal:this.bvhToOriginal.get(t)||null,visible:!!this.visible[e],tlasLeafIndex:this.tlasLeafIndex[e]}}setVisibility(e,t){this.isSet[e]&&(this.visible[e]=+!!t)}computeAABBs(e,{owners:t=!0}={}){for(let n=0;t&&n<this.templateCount;n++){if(this.tplOwner[n]<0)continue;let t=this.blasData.get(n);t&&this._readRootAABB(Array.isArray(t)?t[0]:t,n,e,this.tplObjectAABB,n*6)}for(let e=0;e<this.templateCount;e++){let t=this.tplOwner[e];if(t<0||this.blasData.has(e))continue;let n=this.sourceMesh[t];n!==e&&this.tplObjectAABB.copyWithin(e*6,n*6,n*6+6)}}recomputeAABB(e,t,n){let r=this.sourceMesh[e],i=this.tplBlasOffset[r],a=t.chunks?t.chunkFor(i).subarray(t.baseOf(i),t.baseOf(i)+16):t.subarray(i*16,i*16+16);this._readRootAABB(a,r,n,this.tplObjectAABB,r*6)}_readRootAABB(t,n,r,i,a){e.rootAABB(t,r,this.tplTriOffset[n],this.tplTriCount[n],i,a)}static rootAABB(e,t,n,r,i,a){if(!e||yt(e)[3]===_t.TRIANGLE_LEAF){Em(t,n,r,i,a);return}i[a]=Math.min(e[0],e[8]),i[a+1]=Math.min(e[1],e[9]),i[a+2]=Math.min(e[2],e[10]),i[a+3]=Math.max(e[4],e[12]),i[a+4]=Math.max(e[5],e[13]),i[a+5]=Math.max(e[6],e[14])}_computeAABBFromTriangles(e,t,n,r){Em(t,this.tplTriOffset[e],this.tplTriCount[e],n,r)}assignOffsets(e){this.tlasNodeCount=e;let t=e;for(let e=0;e<this.templateCount;e++){let n=this.tplOwner[e];n<0||this.sourceMesh[n]!==e||(this.tplBlasOffset[e]=t,t+=this.tplNodeCount[e])}for(let e=0;e<this.templateCount;e++){let t=this.tplOwner[e];if(t<0)continue;let n=this.sourceMesh[t];n!==e&&(this.tplBlasOffset[e]=this.tplBlasOffset[n])}this.totalBLASNodes=t-e,bt(t,`combined TLAS + BLAS node count`)}get totalNodeCount(){return this.tlasNodeCount+this.totalBLASNodes}clear(){this.allocate(0),this.totalBLASNodes=0,this.tlasNodeCount=0}};function Em(e,t,n,r,i){let a=st.FLOATS_PER_TRIANGLE,o=e&&e.chunks?e.viewAs(Float32Array):null,s=o?null:e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),c=1/0,l=1/0,u=1/0,d=-1/0,f=-1/0,p=-1/0;for(let e=0;e<n;e++){let n=t+e,r=o?o.chunkFor(n):s,i=o?o.baseOf(n):n*a;for(let e=0;e<=8;e+=4){let t=r[i+e],n=r[i+e+1],a=r[i+e+2];t<c&&(c=t),n<l&&(l=n),a<u&&(u=a),t>d&&(d=t),n>f&&(f=n),a>p&&(p=a)}}r[i]=c,r[i+1]=l,r[i+2]=u,r[i+3]=d,r[i+4]=f,r[i+5]=p}var Dm=16,Om=32,km=e=>e<Om?e:Om,Am=8,jm=64,Mm=new Float64Array(16),Nm=class e{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0,this._binCounts=new Int32Array(Om*3),this._binBounds=new Float64Array(Om*6*3),this._binSuffix=new Float64Array(Om),this._binSuffixCount=new Int32Array(Om),this._order=null,this._stackI=null,this._stackB=null,this._stackFrames=0,this._sortScratch=[],this._suffix=null,this._bounds=new Float64Array(12),this._extent=new Float64Array(3),this._cMin=new Float64Array(3)}static nodeCountFor(e){return e>0?e*2-1:0}releaseFlattenBuffer(){this._flatBuffer=null,this._flatBufferCapacity=0}build(t){let n=new Float64Array(t.count*6);t.writeWorldAABBs(n);let r=this.buildStructure(n,t.count);return e.fillLeaves(r.data,r.nodeCount,t),r}buildStructure(t,n){let r=e.nodeCountFor(n);if(n===0)return{data:new Float32Array,nodeCount:0};bt(r,`TLAS node count`);let i=r*Dm;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer,o=yt(a);(!this._order||this._order.length<n)&&(this._order=new Int32Array(n));let s=this._order;for(let e=0;e<n;e++)s[e]=e;this._ensureStack(jm);let c=0,l=0,u=0,d=n,f=this._bounds;this._rangeBounds(t,s,u,d,f,0);let p=f[0],m=f[1],h=f[2],g=f[3],_=f[4],v=f[5];for(;;){if(d-u===1){let e=l*Dm;o[e]=0,o[e+1]=s[u],a[e+2]=0,o[e+3]=_t.BLAS_POINTER_LEAF}else{let e=this._partition(t,s,u,d,p,m,h,g,_,v),n=e-u,r=l+1,i=r+(n*2-1),y=l*Dm;a[y]=f[0],a[y+1]=f[1],a[y+2]=f[2],o[y+3]=r,a[y+4]=f[3],a[y+5]=f[4],a[y+6]=f[5],o[y+7]=i,a[y+8]=f[6],a[y+9]=f[7],a[y+10]=f[8],a[y+11]=0,a[y+12]=f[9],a[y+13]=f[10],a[y+14]=f[11],a[y+15]=0;let b=n<=d-e,x=b?0:6,S=b?6:0;c=this._push(c,b?i:r,b?e:u,b?d:e,f,S),l=b?r:i,b?d=e:u=e,p=f[x],m=f[x+1],h=f[x+2],g=f[x+3],_=f[x+4],v=f[x+5];continue}if(c===0)break;c--;let e=c*3,n=c*6;l=this._stackI[e],u=this._stackI[e+1],d=this._stackI[e+2],p=this._stackB[n],m=this._stackB[n+1],h=this._stackB[n+2],g=this._stackB[n+3],_=this._stackB[n+4],v=this._stackB[n+5]}return{data:a.subarray(0,i),nodeCount:r}}_push(e,t,n,r,i,a){e>=this._stackFrames&&this._ensureStack(this._stackFrames*2);let o=e*3,s=e*6;this._stackI[o]=t,this._stackI[o+1]=n,this._stackI[o+2]=r;for(let e=0;e<6;e++)this._stackB[s+e]=i[a+e];return e+1}_ensureStack(e){if(this._stackFrames>=e)return;let t=new Int32Array(e*3),n=new Float64Array(e*6);this._stackI&&(t.set(this._stackI),n.set(this._stackB)),this._stackI=t,this._stackB=n,this._stackFrames=e}static fillLeaves(t,n,r){let i=r.world,a=r.sourceMesh,o=r.tplBlasOffset,s=r.visible,c=r.tlasLeafIndex,l=yt(t);for(let r=0;r<n;r++){let n=r*Dm;if(l[n+3]!==_t.BLAS_POINTER_LEAF)continue;let u=l[n+1]>l[n]=o[a[u]],t[n+2]=+!!s[u],e.writeLeafMatrix(t,l,n,i,u),c[u]=r}}static writeLeafMatrix(e,t,n,r,i){let a=Mm;bm(r,i*16,a),e[n+4]=a[0],e[n+5]=a[4],e[n+6]=a[8],e[n+7]=a[12],e[n+8]=a[1],e[n+9]=a[5],e[n+10]=a[9],e[n+11]=a[13],e[n+12]=a[2],e[n+13]=a[6],e[n+14]=a[10],e[n+15]=a[14],t[n+1]=(i|(wm(r,i*16)?ht:0))>>>0}_partition(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=0;if(u===2)d=n+1;else if(u<=Am)d=n+(u>>1),this._insertionSortRange(e,t,n,r,this._widestCentroidAxis(e,t,n,r));else{if(d=this._binnedSplit(e,t,n,r,i,a,o,s,c,l),d>n&&d<r)return d;if(d=this._sweepSplit(e,t,n,r,i,a,o,s,c,l),!(d>n&&d<r)){let f=s-i,p=c-a,m=l-o,h=p>f&&p>m?1:m>f?2:0;this._sortRange(e,t,n,r,h),d=n+(u>>1)}}let f=this._bounds;return this._rangeBounds(e,t,n,d,f,0),this._rangeBounds(e,t,d,r,f,6),d}_binnedSplit(e,t,n,r,i,a,o,s,c,l){let u=this._surfaceArea(i,a,o,s,c,l);if(!(u>0)||!isFinite(u))return n;let d=1/0,f=1/0,p=1/0,m=-1/0,h=-1/0,g=-1/0;for(let i=n;i<r;i++){let n=t[i]*6,r=(e[n]+e[n+3])*.5,a=(e[n+1]+e[n+4])*.5,o=(e[n+2]+e[n+5])*.5;r<d&&(d=r),r>m&&(m=r),a<f&&(f=a),a>h&&(h=a),o<p&&(p=o),o>g&&(g=o)}let _=this._extent,v=this._cMin;_[0]=m-d,_[1]=h-f,_[2]=g-p,v[0]=d,v[1]=f,v[2]=p;let y=1/0,b=-1,x=-1,S=this._binCounts,C=this._binBounds,w=_[0]>1e-12,T=_[1]>1e-12,E=_[2]>1e-12;if(!w&&!T&&!E)return n;let D=km(r-n),O=w?D/_[0]:0,k=T?D/_[1]:0,A=E?D/_[2]:0;S.fill(0,0,D*3);for(let e=0;e<D*3;e++){let t=e*6;C[t]=C[t+1]=C[t+2]=1/0,C[t+3]=C[t+4]=C[t+5]=-1/0}for(let i=n;i<r;i++){let n=t[i]*6,r=e[n],a=e[n+1],o=e[n+2],s=e[n+3],c=e[n+4],l=e[n+5];for(let e=0;e<3;e++){let t=e===0?O:e===1?k:A;if(t===0)continue;let n=((e===0?(r+s)*.5:e===1?(a+c)*.5:(o+l)*.5)-v[e])*t|0;n<0?n=0:n>=D&&(n=D-1),n+=e*D,S[n]++;let i=n*6;r<C[i]&&(C[i]=r),a<C[i+1]&&(C[i+1]=a),o<C[i+2]&&(C[i+2]=o),s>C[i+3]&&(C[i+3]=s),c>C[i+4]&&(C[i+4]=c),l>C[i+5]&&(C[i+5]=l)}}for(let e=0;e<3;e++){if(!(_[e]>1e-12))continue;let t=e*D,n=this._binSuffix,r=this._binSuffixCount,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0,d=0;for(let e=D-1;e>=1;e--){let u=(t+e)*6;C[u]<i&&(i=C[u]),C[u+1]<a&&(a=C[u+1]),C[u+2]<o&&(o=C[u+2]),C[u+3]>s&&(s=C[u+3]),C[u+4]>c&&(c=C[u+4]),C[u+5]>l&&(l=C[u+5]),d+=S[t+e],n[e]=d?this._surfaceArea(i,a,o,s,c,l):0,r[e]=d}let f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,v=-1/0,w=0;for(let i=1;i<D;i++){let a=(t+i-1)*6;if(C[a]<f&&(f=C[a]),C[a+1]<p&&(p=C[a+1]),C[a+2]<m&&(m=C[a+2]),C[a+3]>h&&(h=C[a+3]),C[a+4]>g&&(g=C[a+4]),C[a+5]>v&&(v=C[a+5]),w+=S[t+i-1],w===0||r[i]===0)continue;let o=1+(this._surfaceArea(f,p,m,h,g,v)*w+n[i]*r[i])/u;o<y&&(y=o,b=e,x=i)}}if(b<0)return n;let j=D/_[b],M=v[b],N=this._bounds;N[0]=N[1]=N[2]=N[6]=N[7]=N[8]=1/0,N[3]=N[4]=N[5]=N[9]=N[10]=N[11]=-1/0;let P=n,F=r-1;for(;P<=F;){let n=t[P]*6,r=((e[n+b]+e[n+3+b])*.5-M)*j|0;r<0?r=0:r>=D&&(r=D-1);let i=r<x?0:6;if(e[n]<N[i]&&(N[i]=e[n]),e[n+1]<N[i+1]&&(N[i+1]=e[n+1]),e[n+2]<N[i+2]&&(N[i+2]=e[n+2]),e[n+3]>N[i+3]&&(N[i+3]=e[n+3]),e[n+4]>N[i+4]&&(N[i+4]=e[n+4]),e[n+5]>N[i+5]&&(N[i+5]=e[n+5]),i===0)P++;else{let e=t[P];t[P]=t[F],t[F]=e,F--}}return P}_sweepSplit(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=this._surfaceArea(i,a,o,s,c,l);if(!(d>0)||!isFinite(d))return n;let f=this._suffixBuffer(u),p=1/0,m=-1,h=-1;for(let i=0;i<3;i++){this._sortRange(e,t,n,r,i);let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,g=-1/0;for(let r=u-1;r>=1;r--){let i=t[n+r]*6;e[i]<a&&(a=e[i]),e[i+1]<o&&(o=e[i+1]),e[i+2]<s&&(s=e[i+2]),e[i+3]>c&&(c=e[i+3]),e[i+4]>l&&(l=e[i+4]),e[i+5]>g&&(g=e[i+5]);let u=r*6;f[u]=a,f[u+1]=o,f[u+2]=s,f[u+3]=c,f[u+4]=l,f[u+5]=g}let _=1/0,v=1/0,y=1/0,b=-1/0,x=-1/0,S=-1/0;for(let r=1;r<u;r++){let a=t[n+r-1]*6;e[a]<_&&(_=e[a]),e[a+1]<v&&(v=e[a+1]),e[a+2]<y&&(y=e[a+2]),e[a+3]>b&&(b=e[a+3]),e[a+4]>x&&(x=e[a+4]),e[a+5]>S&&(S=e[a+5]);let o=r*6,s=this._surfaceArea(_,v,y,b,x,S),c=this._surfaceArea(f[o],f[o+1],f[o+2],f[o+3],f[o+4],f[o+5]),l=1+(s*r+c*(u-r))/d;l<p&&(p=l,m=i,h=r)}}return m<0||h<=0?n:(m!==2&&this._sortRange(e,t,n,r,m),n+h)}_widestCentroidAxis(e,t,n,r){let i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let u=n;u<r;u++){let n=t[u]*6,r=(e[n]+e[n+3])*.5,d=(e[n+1]+e[n+4])*.5,f=(e[n+2]+e[n+5])*.5;r<i&&(i=r),r>s&&(s=r),d<a&&(a=d),d>c&&(c=d),f<o&&(o=f),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o;return d>u&&d>f?1:f>u?2:0}_insertionSortRange(e,t,n,r,i){let a=i,o=3+i;for(let i=n+1;i<r;i++){let r=t[i],s=e[r*6+a]+e[r*6+o],c=i-1;for(;c>=n&&e[t[c]*6+a]+e[t[c]*6+o]>s;)t[c+1]=t[c],c--;t[c+1]=r}}_sortRange(e,t,n,r,i){let a=r-n,o=this._sortScratch;o.length=a;for(let e=0;e<a;e++)o[e]=t[n+e];let s=i,c=3+i;o.sort((t,n)=>e[t*6+s]+e[t*6+c]-(e[n*6+s]+e[n*6+c]));for(let e=0;e<a;e++)t[n+e]=o[e]}_suffixBuffer(e){let t=e*6;return(!this._suffix||this._suffix.length<t)&&(this._suffix=new Float64Array(t)),this._suffix}_rangeBounds(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=n;i<r;i++){let n=t[i]*6;e[n]<o&&(o=e[n]),e[n+1]<s&&(s=e[n+1]),e[n+2]<c&&(c=e[n+2]),e[n+3]>l&&(l=e[n+3]),e[n+4]>u&&(u=e[n+4]),e[n+5]>d&&(d=e[n+5])}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}_surfaceArea(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}},Pm=st.FLOATS_PER_TRIANGLE*4,Fm=64,Im=.9,Lm=64,Rm=4,zm=7040*1024*1024,Bm=9216*1024*1024,Vm=1.15,Hm=12*1024*1024*1024;function Um({triangles:e,placements:t,geometryBytes:n=0}){let r={triangles:e*Pm,bvh:Math.ceil(e*Im)*Fm,geometry:n,placements:t*Lm,orderMaps:e*Rm};return r.total=r.triangles+r.bvh+r.geometry+r.placements+r.orderMaps,r}function Wm(e,{chunkBytes:t=Sn,shared:n=!1,allocate:r=null}={}){let i=Math.min(e,Hm),a=r??(n?e=>new SharedArrayBuffer(e):e=>new ArrayBuffer(e)),o=[],s=0;try{for(;s<i;){let e=Math.min(t,i-s);o.push(a(e)),s+=e}}catch{}for(let e=o.length-1;e>=0;e--)o[e]=null;return o.length=0,{placed:s,want:i,exhausted:s<i,capped:e>i}}var Gm=class{constructor(){this.reset()}reset(){this.phase=`idle`,this.events=[],this.samples=[],this.allocatedBytes=0,this.peakLiveBytes=0,this.byPhase=Object.create(null)}mark(e){return this.phase=e,this.byPhase[e]??={allocated:0,chunks:0},this}alloc(e,t=`chunk`){if(!(e>0))return;let n=this.byPhase[this.phase]??={allocated:0,chunks:0};n.allocated+=e,n.chunks++,this.allocatedBytes+=e,this.events.push({phase:this.phase,bytes:e,what:t,at:performance.now()})}sample(e,t){let n=0;for(let e in t)n+=t[e]||0;return n>this.peakLiveBytes&&(this.peakLiveBytes=n),this.samples.push({label:e,phase:this.phase,total:n,parts:t,at:performance.now()}),n}get report(){return{allocatedBytes:this.allocatedBytes,peakLiveBytes:this.peakLiveBytes,byPhase:{...this.byPhase},samples:this.samples.slice()}}},Km="let e,t;const n={MAX_BYTES_PER_TEXTURE:256*1024*1024,MAX_TEXTURE_DIMENSION:8192,CHUNK_SIZE:8,ADAPTIVE_CHUNK_SIZE:!0,MEMORY_SAFETY_FACTOR:.8};self.onmessage=async function(t){let{textures:n,maxTextureSize:a,method:o=`direct-transfer`}=t.data;try{e||r(a);let t=await i(n,a,o);self.postMessage(t,[t.data])}catch(e){console.error(`Worker processing failed:`,e),self.postMessage({error:e.message})}};function r(r){let i=Math.min(r,n.MAX_TEXTURE_DIMENSION);e=new OffscreenCanvas(i,i),t=e.getContext(`2d`,{willReadFrequently:!0,alpha:!0,desynchronized:!0})}async function i(e,t,r){let i=h(e,t),o=i.maxWidth*i.maxHeight*e.length*4;if(o>n.MAX_BYTES_PER_TEXTURE)return console.log(`Large texture array detected (${(o/1024/1024).toFixed(2)}MB), using chunked processing`),await a(e,t,r);switch(r){case`direct-transfer`:return await d(e,t);case`offscreen-optimized`:return await p(e,t);case`imageBitmap-batch`:return await m(e,t);default:return await d(e,t)}}async function a(e,t,n){let{maxWidth:r,maxHeight:i}=h(e,t),a=e.length,c=o(r,i,a),l=Math.ceil(a/c);console.log(`Processing ${a} textures in ${l} chunks of up to ${c} textures each`),console.log(`Texture dimensions: ${r}x${i}, Est. memory per chunk: ${(r*i*c*4/1024/1024).toFixed(2)}MB`);let u;try{u=new Uint8Array(r*i*a*4)}catch{return console.warn(`Failed to allocate full texture array, reducing dimensions`),await f(e,g(e,t),n)}let d=r*i*c*4,p;try{p=new Uint8Array(d)}catch{return console.warn(`Failed to allocate chunk buffer, reducing dimensions`),await f(e,g(e,t),n)}for(let t=0;t<l;t++){let n=t*c,o=Math.min(n+c,a),l=o-n,d=await s(e.slice(n,o),r,i,p.subarray(0,r*i*l*4)),f=n*r*i*4,m=l*r*i*4;u.set(new Uint8Array(d.data.slice(0,m)),f),t%2==1&&await new Promise(e=>setTimeout(e,0))}return{data:u.buffer,width:r,height:i,depth:a}}function o(e,t,r){if(!n.ADAPTIVE_CHUNK_SIZE)return Math.min(n.CHUNK_SIZE,r);let i=e*t*4/(1024*1024),a;return a=i<=1?16:i<=4?8:i<=16?4:2,Math.min(a,r,n.CHUNK_SIZE*2)}async function s(n,r,i,a){(e.width!==r||e.height!==i)&&(e.width=r,e.height=i);let o=r*i*4;t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let t=n[e];try{await c(t,a,e*o,r,i)}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=e*o;a.fill(0,n,n+o)}}return{data:a.buffer,width:r,height:i,depth:n.length}}async function c(e,n,r,i,a){let o;if(e.isDirect&&e.bitmap)o=e.bitmap;else if(e.isImageData&&e.data){let t=new ImageData(new Uint8ClampedArray(e.data),e.width,e.height);o=await createImageBitmap(t,{resizeWidth:i,resizeHeight:a,resizeQuality:`high`})}else if(e.isBlob){let t=new Blob([e.data]);o=await createImageBitmap(t,{resizeWidth:i,resizeHeight:a,resizeQuality:`high`})}else throw Error(`Unknown texture data format`);t.clearRect(0,0,i,a),t.drawImage(o,0,0,i,a);let s=t.getImageData(0,0,i,a);n.set(s.data,r),(e.isImageData||e.isBlob)&&o.close()}async function l(e,t,n){let r;try{r=new Uint8Array(t*n*e.length*4)}catch(r){console.warn(`Failed to allocate texture array in processTextureChunk, reducing dimensions`);let i=Math.max(1,Math.floor(t/2)),a=Math.max(1,Math.floor(n/2));if(i===t&&a===n)throw r;return await l(e,i,a)}return await s(e,t,n,r)}async function u(e,t,n,r,i){await c(e,n,r*i*4*t,r,i)}async function d(n,r){let{maxWidth:i,maxHeight:o}=h(n,r);(e.width!==i||e.height!==o)&&(e.width=i,e.height=o);let s=n.length,c;try{c=new Uint8Array(i*o*s*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`direct-transfer`)}t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let t=n[e];try{await u(t,e,c,i,o)}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=i*o*4*e;c.fill(0,n,n+i*o*4)}}return{data:c.buffer,width:i,height:o,depth:s}}async function f(e,t,n){let{maxWidth:r,maxHeight:i}=t;return console.log(`Using reduced dimensions: ${r}x${i}`),await l(e,r,i,n)}async function p(n,r){let{maxWidth:i,maxHeight:o}=h(n,r);(e.width!==i||e.height!==o)&&(e.width=i,e.height=o);let s=n.length,c;try{c=new Uint8Array(i*o*s*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`offscreen-optimized`)}t.imageSmoothingEnabled=!0,t.imageSmoothingQuality=`high`;for(let e=0;e<n.length;e++){let r=n[e];try{let n;if(r.isBlob){let e=new Blob([r.data]);n=await createImageBitmap(e,{resizeWidth:i,resizeHeight:o,resizeQuality:`high`})}else{let e=new ImageData(new Uint8ClampedArray(r.data),r.width,r.height);n=await createImageBitmap(e,{resizeWidth:i,resizeHeight:o,resizeQuality:`high`})}t.clearRect(0,0,i,o),t.drawImage(n,0,0);let a=t.getImageData(0,0,i,o),s=i*o*4*e;c.set(a.data,s),n.close()}catch(t){console.warn(`Failed to process texture ${e}:`,t);let n=i*o*4*e;c.fill(0,n,n+i*o*4)}}return{data:c.buffer,width:i,height:o,depth:s}}async function m(n,r){let{maxWidth:i,maxHeight:s}=h(n,r),c=n.length,l;try{l=new Uint8Array(i*s*c*4)}catch(e){return console.error(`Failed to allocate texture array:`,e),await a(n,r,`imageBitmap-batch`)}let u=Math.min(o(i,s,n.length),n.length);for(let r=0;r<n.length;r+=u){let a=Math.min(r+u,n.length),o=[];for(let e=r;e<a;e++){let t=n[e],r;if(t.isBlob){let e=new Blob([t.data]);r=createImageBitmap(e,{resizeWidth:i,resizeHeight:s,resizeQuality:`high`})}else{let e=new ImageData(new Uint8ClampedArray(t.data),t.width,t.height);r=createImageBitmap(e,{resizeWidth:i,resizeHeight:s,resizeQuality:`high`})}o.push(r.then(t=>({bitmap:t,index:e})))}let c=await Promise.all(o);e.width=i,e.height=s,t.imageSmoothingEnabled=!1;for(let{bitmap:e,index:n}of c){t.clearRect(0,0,i,s),t.drawImage(e,0,0);let r=t.getImageData(0,0,i,s),a=i*s*4*n;l.set(r.data,a),e.close()}}return{data:l.buffer,width:i,height:s,depth:c}}function h(e,t){let r=0,i=0;for(let t of e)r=Math.max(r,t.width||0),i=Math.max(i,t.height||0);let a=Math.min(t,n.MAX_TEXTURE_DIMENSION),o=Math.max(r,i);if(o>a){let e=a/o;r=Math.round(r*e),i=Math.round(i*e)}return r=Math.min(a,Math.max(4,Math.ceil(Math.max(1,r)/64)*64)),{maxWidth:r,maxHeight:Math.max(1,i)}}function g(e,t){let n=h(e,t);return{maxWidth:Math.max(64,Math.ceil(n.maxWidth/128)*64),maxHeight:Math.max(1,Math.floor(n.maxHeight/2))}}",qm=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Km],{type:`text/javascript;charset=utf-8`});function Jm(e){let t;try{if(t=qm&&(self.URL||self.webkitURL).createObjectURL(qm),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Km),{type:`module`,name:e?.name})}}El();var Ym=e=>(t,n,r,i,a)=>e(t>0?t:0,n>0?n:0,r>0?r:0,i,a),Xm=new Map;function Zm(){Xm.clear();for(let e of wl.values())Xm.set(e.id,Ym(e.cpu))}Zm(),sl(Zm);function Qm(e){return cl(e)?.outputEncoded===!0}var $m=1/2.2;function eh(e){return e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function th(e,t){let n=cl(t);return n?n.appliesExposure?e:1:t===r.NoToneMapping?1:e}var nh=.2126,rh=.7152,ih=.0722;function ah(e,t){if(t===1)return;let n=e[0]*nh+e[1]*rh+e[2]*ih;e[0]=n+(e[0]-n)*t,e[1]=n+(e[1]-n)*t,e[2]=n+(e[2]-n)*t}function oh(e,{exposure:t,toneMapping:n,saturation:i=1,preserveAlpha:a=!1}){let o=Xm.get(n)??Xm.get(r.NoToneMapping),s=th(t,n),c=Qm(n),l=new Uint8ClampedArray(e.length),u=[0,0,0];for(let t=0;t<e.length;t+=4)u[0]=e[t]*s,u[1]=e[t+1]*s,u[2]=e[t+2]*s,ah(u,i),o(u[0],u[1],u[2],1,u),c?(l[t]=u[0]*255+.5,l[t+1]=u[1]*255+.5,l[t+2]=u[2]*255+.5):(l[t]=eh(u[0])*255+.5,l[t+1]=eh(u[1])*255+.5,l[t+2]=eh(u[2])*255+.5),l[t+3]=a?e[t+3]*255+.5:255;return l}rn();var sh=Wt(`textures`),ch={toSRGB:null,toLinear:null};function lh(e){if(!ch[e]){let t=new Uint8Array(256);for(let n=0;n<256;n++){let r=n/255,i=e===`toSRGB`?eh(r):r<=.04045?r/12.92:((r+.055)/1.055)**2.4;t[n]=Math.max(0,Math.min(255,Math.round(i*255)))}ch[e]=t}return ch[e]}var uh=class{constructor(){this.canvasContextPairs=[],this.maxPoolSize=xt.CANVAS_POOL_SIZE}getCanvasWithContext(e,t,n=!1,r={}){let i={willReadFrequently:!0,alpha:!0,desynchronized:!0,...r},a=this.canvasContextPairs.pop();if(!a){let r;r=n&&typeof OffscreenCanvas<`u`?new OffscreenCanvas(e,t):document.createElement(`canvas`);let o=r.getContext(`2d`,i);a={canvas:r,context:o}}return a.canvas.width=e,a.canvas.height=t,a}releaseCanvasWithContext(e){this.canvasContextPairs.length<this.maxPoolSize&&(e.context.globalAlpha=1,e.context.globalCompositeOperation=`source-over`,e.context.imageSmoothingEnabled=!0,e.context.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=1,e.canvas.height=1,this.canvasContextPairs.push(e))}getCanvas(e,t,n=!1){return this.getCanvasWithContext(e,t,n).canvas}getContext(e,t={}){let n=this.canvasContextPairs.find(t=>t.canvas===e);return n?n.context:e.getContext(`2d`,{willReadFrequently:!0,alpha:!0,desynchronized:!0,...t})}dispose(){this.canvasContextPairs=[]}},dh=class{constructor(e={}){this.pools=new Map,this.memoryUsage=0,this.maxMemoryUsage=e.maxMemory||Lt.MAX_BUFFER_MEMORY,this.allocatedBuffers=new WeakMap,this.sizeStrategy=e.sizeStrategy||`adaptive`}getOptimalSize(e){switch(this.sizeStrategy){case`exact`:return e;case`power2`:return 2**Math.ceil(Math.log2(e));default:return e<1024?e:e<1024*1024?Math.ceil(e/1024)*1024:2**Math.ceil(Math.log2(e))}}getBuffer(e,t=Float32Array){let n=this.getOptimalSize(e),r=`${t.name}-${n}`,i=(this.pools.get(r)||[]).pop();if(!i)try{i=new t(n),this.memoryUsage+=i.byteLength,this.allocatedBuffers.set(i,!0)}catch{this.cleanup();try{i=new t(n),this.memoryUsage+=i.byteLength,this.allocatedBuffers.set(i,!0)}catch(e){let r=n*t.BYTES_PER_ELEMENT/(1024*1024),i=this.memoryUsage/(1024*1024);throw Error(`Buffer allocation failed: requested ${r.toFixed(1)}MB, current usage: ${i.toFixed(1)}MB, max: ${(this.maxMemoryUsage/(1024*1024)).toFixed(1)}MB. Original error: ${e.message}`)}}return this.memoryUsage>this.maxMemoryUsage*Lt.CLEANUP_THRESHOLD&&this.cleanup(),this.checkMemoryHealth(),i.byteOffset+e*t.BYTES_PER_ELEMENT>i.buffer.byteLength&&(i=new t(e),this.memoryUsage+=i.byteLength),new t(i.buffer,i.byteOffset,e)}forget(e){this.memoryUsage=Math.max(0,this.memoryUsage-e.buffer.byteLength)}releaseBuffer(e,t=Float32Array){let n=(e.buffer.byteLength-e.byteOffset)/t.BYTES_PER_ELEMENT,r=this.getOptimalSize(n),i=`${t.name}-${r}`,a=this.pools.get(i)||[];a.length<xt.BUFFER_POOL_SIZE?(a.push(new t(e.buffer,e.byteOffset,n)),this.pools.set(i,a)):this.allocatedBuffers.has(e)&&(this.memoryUsage-=e.byteLength,this.allocatedBuffers.delete(e))}cleanup(){let e=Array.from(this.pools.entries());e.slice(0,Math.floor(e.length/2)).forEach(([e,t])=>{t.forEach(e=>{this.allocatedBuffers.has(e)&&(this.memoryUsage-=e.byteLength,this.allocatedBuffers.delete(e))}),this.pools.delete(e)})}dispose(){this.pools.forEach(e=>{e.forEach(e=>{this.allocatedBuffers.has(e)&&this.allocatedBuffers.delete(e)})}),this.pools.clear(),this.memoryUsage=0}getMemoryStats(){return{currentUsage:this.memoryUsage,maxUsage:this.maxMemoryUsage,utilizationPercentage:this.memoryUsage/this.maxMemoryUsage*100,poolCount:this.pools.size,allocatedBufferCount:this.allocatedBuffers&&this.allocatedBuffers.size||0}}checkMemoryHealth(){let e=this.getMemoryStats();return e.utilizationPercentage>90?(console.warn(`Memory pool critical: ${e.utilizationPercentage.toFixed(1)}% used (${(e.currentUsage/(1024*1024)).toFixed(1)}MB / ${(e.maxUsage/(1024*1024)).toFixed(1)}MB)`),`critical`):e.utilizationPercentage>70?(console.warn(`Memory pool high: ${e.utilizationPercentage.toFixed(1)}% used (${(e.currentUsage/(1024*1024)).toFixed(1)}MB / ${(e.maxUsage/(1024*1024)).toFixed(1)}MB)`),`high`):`normal`}},fh=class{constructor(e=xt.CACHE_SIZE_LIMIT){this.cache=new Map,this.accessOrder=[],this.maxSize=e}generateHash(e){let t=``;for(let n of e)if(n?.image){let e=n.image.width||0,r=n.image.height||0,i=n.image.src||n.uuid||``,a=n.flipY===!1?`n`:`f`,o=`${n.colorSpace??``}|${n.userData?.ocioColorSpace??``}`;t+=`${e}x${r}_${i.slice(-8)}_${a}_${o}_`}return t+e.length}get(e){if(this.cache.has(e)){let t=this.cache.get(e);if(t?.userData&&t.userData.buffer===null){this.cache.delete(e);let t=this.accessOrder.indexOf(e);return t>-1&&this.accessOrder.splice(t,1),null}let n=this.accessOrder.indexOf(e);return n>-1&&this.accessOrder.splice(n,1),this.accessOrder.push(e),t}return null}set(e,t){if(this.cache.has(e)){let t=this.accessOrder.indexOf(e);t>-1&&this.accessOrder.splice(t,1)}else this.cache.size>=this.maxSize&&this.evictLRU();this.cache.set(e,t),this.accessOrder.push(e)}evictLRU(){if(this.accessOrder.length>0){let e=this.accessOrder.shift(),t=this.cache.get(e);t&&t.dispose&&t.dispose(),this.cache.delete(e)}}dispose(){this.cache.forEach(e=>{e&&e.dispose&&e.dispose()}),this.cache.clear(),this.accessOrder=[]}},ph=class{constructor(e={}){this.useWorkers=typeof Worker<`u`,this.maxConcurrentWorkers=xt.MAX_CONCURRENT_WORKERS,this.activeWorkers=0,this._issues=e.issues??null,this.maxTextureSize=this._clampTextureSize(e.maxTextureSize??xt.DEFAULT_MAX_TEXTURE_SIZE),this.canvasPool=new uh,this.bufferPool=new dh({maxMemory:e.maxBufferMemory||Lt.MAX_BUFFER_MEMORY,sizeStrategy:e.bufferSizeStrategy||`adaptive`}),this.textureCache=new fh,this.capabilities=this.detectCapabilities(),this.optimalMethod=this.selectOptimalMethod()}_reportTextureFailure(e,t){this._issues?.record(Y.TEXTURE_BUILD_FAILED,`${e} texture array failed to build — those surfaces render untextured`,{map:e,cause:String(t?.message??t)})}_clampTextureSize(e){let t=Math.floor(Number(e)||xt.DEFAULT_MAX_TEXTURE_SIZE);return Math.max(xt.MIN_TEXTURE_WIDTH,Math.min(t,xt.MAX_TEXTURE_SIZE))}setMaxTextureSize(e){let t=this._clampTextureSize(e);return t===this.maxTextureSize?t:(this.maxTextureSize=t,this.textureCache?.dispose(),this.textureCache=new fh,this.maxTextureSize)}detectCapabilities(){return{offscreenCanvas:typeof OffscreenCanvas<`u`,imageBitmap:typeof createImageBitmap<`u`,workers:typeof Worker<`u`,hardwareConcurrency:navigator.hardwareConcurrency||4}}selectOptimalMethod(){return this.capabilities.workers&&this.capabilities.offscreenCanvas?`worker-offscreen`:this.capabilities.imageBitmap?`imageBitmap`:`canvas`}_applyColorManagement(e,t,n,i=new Set){let a=Tu();if(!a?.hasConfig)return;let o=e?.image?.data;if(!o||!n)return;let s=t.filter(e=>e?.image),c=e.image.width*e.image.height*4,l=0,u=0,d=[];for(let e=0;e<s.length;e++){let t=e*c,n=Math.min(t+c,o.length);if(t>=o.length)break;let f=s[e],p=o.subarray(t,n),m=null;try{m=a.resolveTexture(f)}catch(t){sh.warn(`could not resolve the colour space of layer ${e}: ${t.message}`)}let h=m&&m.via!==`three`?m.colorSpace:null,g=f.type===r.FloatType||f.type===r.HalfFloatType;h&&(i.has(e)||g)&&(d.push(`${f.name||`layer ${e}`} (${h})`),h=null);try{a.convertTextureBytes(p,{space:h,encoding:`srgb`})&&(h?l++:u++)}catch(t){this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`colour conversion failed for layer ${e} — left in its original space`,{cause:String(t?.message??t),space:h})}}d.length&&this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`${d.length} colour map(s) name a colour space their stored bytes are no longer in (re-encoded or quantized on the way in); converted by primaries only`,{textures:d.slice(0,8)}),l+u!==0&&(e.needsUpdate=!0,sh.info(`colour maps into ${a.workingSpace}: ${l} by named space, ${u} by primaries, of ${s.length}`))}_harmonizeTransfer(e,t,n){let i=new Set,a=e?.image?.data;if(!a)return i;let o=t.filter(e=>e?.image),s=n?r.SRGBColorSpace:r.LinearSRGBColorSpace,c=e.image.width*e.image.height*4,l=[];for(let e=0;e<o.length;e++){let t=o[e].colorSpace;if(t!==r.SRGBColorSpace&&t!==r.LinearSRGBColorSpace||t===s)continue;let u=lh(n?`toSRGB`:`toLinear`),d=e*c,f=Math.min(d+c,a.length);for(let e=d;e<f;e+=4)a[e]=u[a[e]],a[e+1]=u[a[e+1]],a[e+2]=u[a[e+2]];l.push(o[e].name||o[e].source?.uuid?.slice(0,8)||`layer ${e}`),i.add(e)}if(l.length===0)return i;e.needsUpdate=!0;let u=l.slice(0,4).join(`, `)+(l.length>4?`, +${l.length-4} more`:``);return n?sh.info(`re-encoded ${l.length}/${o.length} linear-declared colour map(s) to sRGB so the GPU decode round-trips: ${u}`):sh.warn(`decoded ${l.length}/${o.length} sRGB-declared data map(s) to linear — precision is lost in the darks, check the asset: ${u}`),i}async createTexturesToDataTexture(e,{srgbPool:t=!1}={}){if(!e||e.length===0)return null;let n=Tu()?.inputKey??`-`,r=`${t?`s`:`l`}:${n}:${this.textureCache.generateHash(e)}`,i=this.textureCache.get(r);if(i)return i;let{normalized:a,bitmapsToClose:o}=await this._normalizeTexturesForProcessing(e),s=this.selectProcessingStrategy(a),c;try{switch(s.method){case`worker-direct`:c=await this.processWithWorkerDirect(a);break;case`main-batch`:c=await this.processOnMainThreadBatch(a,s.batchSize);break;case`main-streaming`:c=await this.processOnMainThreadStreaming(a);break;default:c=await this.processOnMainThreadSync(a)}if(c){let n=this._harmonizeTransfer(c,e,t);this._applyColorManagement(c,e,t,n),this.textureCache.set(r,c)}return c}catch(n){this._issues?.warn(Y.TEXTURE_PROCESSING_FALLBACK,`worker texture processing failed — retrying on the main thread`,{cause:String(n?.message??n)});let r=await this.processOnMainThreadSync(a),i=this._harmonizeTransfer(r,e,t);return this._applyColorManagement(r,e,t,i),r}finally{for(let e of o)e.close()}}selectProcessingStrategy(e){let t=e.reduce((e,t)=>e+(t.image?.width||0)*(t.image?.height||0),0),n=t*4;return this.capabilities.workers&&n>Lt.MAX_TEXTURE_MEMORY?{method:`main-streaming`}:this.capabilities.workers&&t>2097152?{method:`worker-direct`}:t>524288?{method:`main-batch`,batchSize:Math.min(4,e.length)}:e.length>8?{method:`main-streaming`}:{method:`main-sync`}}async processWithWorkerDirect(e){for(;this.activeWorkers>=this.maxConcurrentWorkers;)await new Promise(e=>setTimeout(e,10));this.activeWorkers++;try{let t=new Jm,n=await this.prepareTexturesForWorkerDirect(e),r=await new Promise((e,r)=>{t.onmessage=t=>{t.data.error?r(Error(t.data.error)):e(t.data)},t.onerror=r;let i=[];n.forEach(e=>{e.data instanceof ArrayBuffer?i.push(e.data):e.bitmap&&i.push(e.bitmap)}),t.postMessage({textures:n,maxTextureSize:this.maxTextureSize,method:`direct-transfer`},i)});return t.terminate(),this.createDataArrayTextureFromResult(r)}finally{this.activeWorkers--}}async prepareTexturesForWorkerDirect(e){let t=[];for(let n of e){if(!n?.image)continue;let e=n.flipY!==!1;try{let r=n.image;if(typeof createImageBitmap<`u`&&(r instanceof HTMLImageElement||typeof ImageBitmap<`u`&&r instanceof ImageBitmap||typeof HTMLCanvasElement<`u`&&r instanceof HTMLCanvasElement||typeof OffscreenCanvas<`u`&&r instanceof OffscreenCanvas)){let r=await createImageBitmap(n.image,{imageOrientation:e?`flipY`:`none`});t.push({bitmap:r,width:n.image.width,height:n.image.height,isDirect:!0})}else{let r=n.image.width,i=n.image.height,a=await createImageBitmap(n.image,{imageOrientation:e?`flipY`:`none`}),o=this.canvasPool.getCanvasWithContext(r,i);o.context.drawImage(a,0,0),a.close();let s=o.context.getImageData(0,0,r,i);t.push({data:s.data.buffer,width:r,height:i,isImageData:!0}),this.canvasPool.releaseCanvasWithContext(o)}}catch(e){console.warn(`Failed to prepare texture for worker:`,e)}}return t}async processOnMainThreadBatch(e,t){let n=e.filter(e=>e?.image);if(n.length===0)return this.createFallbackTexture();let{maxWidth:r,maxHeight:i}=this.calculateOptimalDimensions(n),a=n.length,o=this.bufferPool.getBuffer(r*i*a*4,Uint8Array);for(let e=0;e<n.length;e+=t){let a=Math.min(e+t,n.length),s=[];for(let t=e;t<a;t++){let e=n[t],a=e.flipY!==!1,o=createImageBitmap(e.image,{resizeWidth:r,resizeHeight:i,resizeQuality:`high`,imageOrientation:a?`flipY`:`none`});s.push(o.then(e=>({bitmap:e,index:t})))}let c=await Promise.all(s),l=this.canvasPool.getCanvasWithContext(r,i);l.context.imageSmoothingEnabled=!1;for(let{bitmap:e,index:t}of c){l.context.clearRect(0,0,r,i),l.context.drawImage(e,0,0);let n=l.context.getImageData(0,0,r,i),a=r*i*4*t;o.set(n.data,a),e.close()}this.canvasPool.releaseCanvasWithContext(l)}return this.createDataArrayTextureFromBuffer(o,r,i,a)}async processOnMainThreadStreaming(e){let t=e.filter(e=>e?.image);if(t.length===0)return this.createFallbackTexture();let{maxWidth:n,maxHeight:r}=this.calculateOptimalDimensions(t),i=t.length,a=this.bufferPool.getBuffer(n*r*i*4,Uint8Array),o=this.canvasPool.getCanvasWithContext(n,r);o.context.imageSmoothingEnabled=!0,o.context.imageSmoothingQuality=`high`;for(let e=0;e<t.length;e++){let i=t[e],s=await createImageBitmap(i.image,{resizeWidth:n,resizeHeight:r,resizeQuality:`high`,imageOrientation:i.flipY===!1?`none`:`flipY`});o.context.clearRect(0,0,n,r),o.context.drawImage(s,0,0),s.close();let c=o.context.getImageData(0,0,n,r),l=n*r*4*e;a.set(c.data,l),e%Lt.STREAM_BATCH_SIZE===0&&await new Promise(e=>setTimeout(e,0))}return this.canvasPool.releaseCanvasWithContext(o),this.createDataArrayTextureFromBuffer(a,n,r,i)}async processOnMainThreadSync(e){let t=e.filter(e=>e?.image);if(t.length===0)return this.createFallbackTexture();let{maxWidth:n,maxHeight:r}=this.calculateOptimalDimensions(t),i=t.length,a=this.bufferPool.getBuffer(n*r*i*4,Uint8Array),o=this.canvasPool.getCanvasWithContext(n,r);o.context.imageSmoothingEnabled=!0,o.context.imageSmoothingQuality=`high`;for(let e=0;e<t.length;e++){let i=t[e],s=await createImageBitmap(i.image,{resizeWidth:n,resizeHeight:r,resizeQuality:`high`,imageOrientation:i.flipY===!1?`none`:`flipY`});o.context.clearRect(0,0,n,r),o.context.drawImage(s,0,0),s.close();let c=o.context.getImageData(0,0,n,r),l=n*r*4*e;a.set(c.data,l)}return this.canvasPool.releaseCanvasWithContext(o),this.createDataArrayTextureFromBuffer(a,n,r,i)}createMaterialRawData(e){let t=K.FLOATS_PER_MATERIAL,n=new Float32Array(e.length*t);for(let r=0;r<e.length;r++)vn(n,r*t,e[r]);return n}createBVHRawData(e){let t=[],n=e=>{let r=t.length;if(t.push(e),e.leftChild){let t=n(e.leftChild),r=n(e.rightChild);e.leftChild=t,e.rightChild=r}return r};n(e);let r=xt.VEC4_PER_BVH_NODE*xt.FLOATS_PER_VEC4;bt(t.length,`BVH node count`);let i=t.length*r,a=new Float32Array(i),o=yt(a);for(let e=0;e<t.length;e++){let n=e*r,i=t[e];if(i.leftChild!==null){let e=i.leftChild,r=i.rightChild,s=t[e],c=t[r];a[n]=s.boundsMin.x,a[n+1]=s.boundsMin.y,a[n+2]=s.boundsMin.z,o[n+3]=e,a[n+4]=s.boundsMax.x,a[n+5]=s.boundsMax.y,a[n+6]=s.boundsMax.z,o[n+7]=r,a[n+8]=c.boundsMin.x,a[n+9]=c.boundsMin.y,a[n+10]=c.boundsMin.z,a[n+12]=c.boundsMax.x,a[n+13]=c.boundsMax.y,a[n+14]=c.boundsMax.z}else o[n]=i.triangleOffset,o[n+1]=i.triangleCount,o[n+3]=_t.TRIANGLE_LEAF}return a}async createMaterialTextures(e){let{materials:t,maps:n,normalMaps:i,bumpMaps:a,roughnessMaps:o,metalnessMaps:s,emissiveMaps:c,displacementMaps:l}=e;console.log(`[TextureCreator] Creating material textures only`);let u=performance.now();try{if(!t||t.length===0)throw Error(`No materials provided for texture creation`);this.textureCache.dispose(),this.textureCache=new fh;let e=[];for(let[t,r]of[[`albedo`,n],[`normal`,i],[`bump`,a],[`roughness`,o],[`metalness`,s],[`emissive`,c],[`displacement`,l]])!r||r.length===0||e.push(this.createTexturesToDataTexture(r).then(e=>({type:t,texture:e})).catch(e=>(this._reportTextureFailure(t,e),{type:t,texture:null})));let d=await Promise.allSettled(e),f=d.find(e=>e.status===`rejected`);if(f)throw f.reason;let p={};d.forEach(e=>{if(e.status===`fulfilled`&&e.value){let{type:t,texture:n}=e.value;if(n)switch(t){case`albedo`:n.colorSpace=r.SRGBColorSpace,p.albedoTexture=n;break;case`normal`:p.normalTexture=n;break;case`bump`:p.bumpTexture=n;break;case`roughness`:p.roughnessTexture=n;break;case`metalness`:p.metalnessTexture=n;break;case`emissive`:n.colorSpace=r.SRGBColorSpace,p.emissiveTexture=n;break;case`displacement`:p.displacementTexture=n;break}}});let m=performance.now()-u;return console.log(`[TextureCreator] Material texture creation complete (${m.toFixed(2)}ms)`),p}catch(e){throw console.error(`[TextureCreator] Material texture creation error:`,e),Error(`Material texture creation failed: ${e.message}`)}}calculateOptimalDimensions(e){let t=0,n=0;for(let r of e)t=Math.max(t,r.image.width),n=Math.max(n,r.image.height);let r=Math.max(t,n);if(r>this.maxTextureSize){let e=this.maxTextureSize/r;t=Math.round(t*e),n=Math.round(n*e)}return{maxWidth:Ct(t,this.maxTextureSize),maxHeight:Math.max(1,n)}}createDataArrayTextureFromResult(e){let t=(e.data instanceof ArrayBuffer,new Uint8Array(e.data));return this.createDataArrayTextureFromBuffer(t,e.width,e.height,e.depth)}createDataArrayTextureFromBuffer(e,t,n,i){let a=new r.DataArrayTexture(e,t,n,i);a.minFilter=r.LinearFilter,a.magFilter=r.LinearFilter,a.wrapS=r.RepeatWrapping,a.wrapT=r.RepeatWrapping,a.format=r.RGBAFormat,a.type=r.UnsignedByteType,a.needsUpdate=!0,a.generateMipmaps=!1,a.userData={buffer:e,bufferType:Uint8Array},a.onUpdate=()=>{let e=a.userData.buffer;e&&(this.bufferPool.forget(e),a.userData.buffer=null,a.image.data=null)};let o=a.dispose.bind(a);return a.dispose=()=>{a.userData.buffer&&(this.bufferPool.releaseBuffer(a.userData.buffer,a.userData.bufferType),a.userData.buffer=null),o()},a}async _normalizeTexturesForProcessing(e){let t=[],n=[],i=[];for(let n of e)if(n?.image){if(n.isCompressedTexture&&n.format===r.RGBAFormat&&n.mipmaps?.[0]?.data){let e=n.mipmaps[0],r=t.length;t.push(null),i.push({index:r,flipY:n.flipY,promise:mh(e.data,e.width,e.height)});continue}if(n.isCompressedTexture){console.warn(`[TextureCreator] GPU-compressed texture in mixed group — using placeholder`),t.push(null);continue}if(n.image.data&&!(n.image instanceof HTMLImageElement)&&!(n.image instanceof HTMLCanvasElement)&&!(typeof ImageBitmap<`u`&&n.image instanceof ImageBitmap)){let e=t.length;t.push(null),i.push({index:e,flipY:n.flipY,promise:mh(n.image.data,n.image.width,n.image.height)});continue}t.push(n)}if(i.length>0){let e=await Promise.allSettled(i.map(e=>e.promise));for(let r=0;r<i.length;r++){let{index:a,flipY:o}=i[r],s=e[r];if(s.status===`fulfilled`){let e=s.value;n.push(e),t[a]={image:e,flipY:o}}else console.warn(`[TextureCreator] Failed to create ImageBitmap:`,s.reason)}}for(let e=0;e<t.length;e++)if(t[e]===null){let r=new Uint8ClampedArray([255,255,255,255]),i=await createImageBitmap(new ImageData(r,1,1));n.push(i),t[e]={image:i,flipY:!1}}return{normalized:t,bitmapsToClose:n}}createFallbackTexture(){let e=new r.DataArrayTexture(new Uint8Array([255,255,255,255]),1,1,1);return e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e.format=r.RGBAFormat,e.type=r.UnsignedByteType,e.needsUpdate=!0,e.generateMipmaps=!1,e}dispose(){this.canvasPool.dispose(),this.bufferPool.dispose(),this.textureCache.dispose()}};function mh(e,t,n){let r=new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength);return createImageBitmap(new ImageData(r,t,n))}var hh=class{constructor(){this.maxLeafSize=8}build(e){let t=e.length;if(t===0){let e=new Float32Array(16);return e[7]=1,e[14]=1,e[15]=-1,{nodeData:e,nodeCount:1,sortedPerm:new Int32Array,bitTrails:new Float32Array}}let n=new Int32Array(t);for(let e=0;e<t;e++)n[e]=e;let r=2*t+4,i=new Float32Array(r*16),a=0,o=new Float32Array(t),s=(t,r,c,l)=>{let u=a++,d=u*16,f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,_=-1/0,v=0,y=1/0,b=1/0,x=1/0,S=-1/0,C=-1/0,w=-1/0;for(let i=t;i<r;i++){let t=e[n[i]];f=Math.min(f,t.bMinX),p=Math.min(p,t.bMinY),m=Math.min(m,t.bMinZ),h=Math.max(h,t.bMaxX),g=Math.max(g,t.bMaxY),_=Math.max(_,t.bMaxZ),v+=t.power,y=Math.min(y,t.cx),b=Math.min(b,t.cy),x=Math.min(x,t.cz),S=Math.max(S,t.cx),C=Math.max(C,t.cy),w=Math.max(w,t.cz)}i[d+0]=f,i[d+1]=p,i[d+2]=m,i[d+3]=v,i[d+4]=h,i[d+5]=g,i[d+6]=_;let T=r-t,E;if(T<=this.maxLeafSize){i[d+7]=1,i[d+8]=t,i[d+9]=T,i[d+10]=0,i[d+11]=0,E=null;for(let i=t;i<r;i++){let t=e[n[i]];E=_h(E,gh(t)),o[i]=c}E||={ax:0,ay:0,az:1,cosO:-1}}else{let a=S-y,o=C-b,u=w-x,f;f=a>=o&&a>=u?0:o>=u?1:2;let p=[`cx`,`cy`,`cz`][f],m=t+r>>1;this._nthElement(n,e,t,r,m,p),i[d+7]=0;let h=s(t,m,c,l+1),g=s(m,r,c+2**l,l+1);i[d+8]=h.nodeIndex,i[d+9]=g.nodeIndex,i[d+10]=0,i[d+11]=0,E=_h(h.cone,g.cone)}return i[d+12]=E.ax,i[d+13]=E.ay,i[d+14]=E.az,i[d+15]=E.cosO,{nodeIndex:u,cone:E}};s(0,t,0,0);let c=new Int32Array(t);for(let e=0;e<t;e++)c[e]=n[e];let l=new Float32Array(a*16);return l.set(i.subarray(0,a*16)),console.log(`[LightBVHBuilder] Built BVH: ${a} nodes for ${t} emissive triangles`),{nodeData:l,nodeCount:a,sortedPerm:c,bitTrails:o}}_nthElement(e,t,n,r,i,a){for(;n<r-1;){let o=n+r>>1,s=t[e[o]][a],c=e[o];e[o]=e[r-1],e[r-1]=c;let l=n;for(let i=n;i<r-1;i++)t[e[i]][a]<s&&(c=e[i],e[i]=e[l],e[l]=c,l++);if(c=e[l],e[l]=e[r-1],e[r-1]=c,l===i)return;l<i?n=l+1:r=l}}};function gh(e){return e.twoSided?{ax:e.nx,ay:e.ny,az:e.nz,cosO:-1}:{ax:e.nx,ay:e.ny,az:e.nz,cosO:1}}function _h(e,t){if(!e)return t;if(!t||e.cosO<=-1)return e;if(t.cosO<=-1)return t;let n=Math.min(Math.max(e.cosO,-1),1),r=Math.min(Math.max(t.cosO,-1),1),i=Math.acos(n),a=Math.acos(r),o=Math.min(Math.max(e.ax*t.ax+e.ay*t.ay+e.az*t.az,-1),1),s=Math.acos(o);if(Math.min(s+a,Math.PI)<=i)return e;if(Math.min(s+i,Math.PI)<=a)return t;let c=(i+a+s)*.5;if(c>=Math.PI)return{ax:e.ax,ay:e.ay,az:e.az,cosO:-1};let l=c-i,u=e.ay*t.az-e.az*t.ay,d=e.az*t.ax-e.ax*t.az,f=e.ax*t.ay-e.ay*t.ax,p=Math.sqrt(u*u+d*d+f*f);if(p<1e-8)return{ax:e.ax,ay:e.ay,az:e.az,cosO:-1};u/=p,d/=p,f/=p;let m=Math.cos(l),h=Math.sin(l),g=u*e.ax+d*e.ay+f*e.az,_=d*e.az-f*e.ay,v=f*e.ax-u*e.az,y=u*e.ay-d*e.ax,b=e.ax*m+_*h+u*g*(1-m),x=e.ay*m+v*h+d*g*(1-m),S=e.az*m+y*h+f*g*(1-m),C=Math.sqrt(b*b+x*x+S*S)||1;return{ax:b/C,ay:x/C,az:S/C,cosO:Math.cos(c)}}rn();var vh=Object.freeze({r:0,g:0,b:0});function yh(e){if(!e)return vh;if(!Hr())return e;let t=[e.r,e.g,e.b];return Wr(t),{r:t[0],g:t[1],b:t[2]}}var bh=Wt(`emissive`),xh=class{constructor(){this.emissiveTriangles=[],this.emissiveCount=0,this.totalEmissivePower=0,this.emissiveIndicesArray=null,this.emissivePowerArray=null,this.cdfArray=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._totalTriangleCount=0,this._hiddenMeshes=new Set}extractEmissiveTriangles(e,t,n,r=null){this.emissiveTriangles=[],this._emissiveMeshes=null,this.totalEmissivePower=0,this._totalTriangleCount=n;let i=st.FLOATS_PER_TRIANGLE,a=st.MATERIAL_FLAGS_OFFSET,o=st.MESH_INDEX_OFFSET,s=e&&e.chunks?e:null,c=s?s.viewAs(Float32Array):null,l=s?null:e,u=s?null:new Float32Array(e.buffer,e.byteOffset,e.length),d=new Map;for(let e=0;e<n;e++){if(s?.spilledChunks&&!s.isResident(e,1)){e=((e/s.recordsPerChunk|0)+1)*s.recordsPerChunk-1;continue}let n=s?s.chunkFor(e):l,f=s?c.chunkFor(e):u,p=s?s.baseOf(e):e*i,m=n[p+a]&ct,h=n[p+o],g=t[m];if(!g)continue;let _=d.get(g);_===void 0&&(_=yh(g.emissive),d.set(g,_));let v=g.emissiveIntensity||0;if(v>0&&(_.r>0||_.g>0||_.b>0)){let t=r?.placementRunOf?.(h)?.start??-1,n=t>=0&&r.isSet[t],i=n?r.world:null,a=n?t*16:0,o=(e,t,n)=>i?i[a]*e+i[a+4]*t+i[a+8]*n+i[a+12]:e,s=(e,t,n)=>i?i[a+1]*e+i[a+5]*t+i[a+9]*n+i[a+13]:t,c=(e,t,n)=>i?i[a+2]*e+i[a+6]*t+i[a+10]*n+i[a+14]:n,l=f[p+0],u=f[p+1],d=f[p+2],y=f[p+4],b=f[p+5],x=f[p+6],S=f[p+8],C=f[p+9],w=f[p+10],T=o(l,u,d),E=s(l,u,d),D=c(l,u,d),O=o(y,b,x),k=s(y,b,x),A=c(y,b,x),j=o(S,C,w),M=s(S,C,w),N=c(S,C,w),P=this._calculateTriangleArea(T,E,D,O,k,A,j,M,N),F=(.2126*_.r+.7152*_.g+.0722*_.b)*v*P,I=(k-E)*(N-D)-(A-D)*(M-E),L=(A-D)*(j-T)-(O-T)*(N-D),R=(O-T)*(M-E)-(k-E)*(j-T),ee=Math.sqrt(I*I+L*L+R*R)||1,te=g.side===1?-1:1;I=I/ee*te,L=L/ee*te,R=R/ee*te;let ne=g.side===2,re=(T+O+j)/3,z=(E+k+M)/3,ie=(D+A+N)/3,ae=Math.min(T,O,j),oe=Math.min(E,k,M),se=Math.min(D,A,N),ce=Math.max(T,O,j),le=Math.max(E,k,M),ue=Math.max(D,A,N);this.emissiveTriangles.push({triangleIndex:e,materialIndex:m,meshIndex:h,sideSign:te,instanceLeaf:n?r.tlasLeafIndex[t]:-1,power:F,area:P,emissive:{r:_.r,g:_.g,b:_.b},emissiveIntensity:v,cx:re,cy:z,cz:ie,bMinX:ae,bMinY:oe,bMinZ:se,bMaxX:ce,bMaxY:le,bMaxZ:ue,nx:I,ny:L,nz:R,twoSided:ne}),this.totalEmissivePower+=F}}return this.emissiveCount=this.emissiveTriangles.length,this.emissiveCount>0&&bh.debug(`${J.n(this.emissiveCount)} emissive tris (${(this.emissiveCount/n*100).toFixed(2)}%) · total power ${this.totalEmissivePower.toFixed(2)}`),this._buildDataArrays(),this.emissiveCount}get emissiveMeshes(){return this._emissiveMeshes??=new Set(this.emissiveTriangles.map(e=>e.meshIndex))}refreshTransforms(e,t){let n=e&&e.chunks?e:null,r=n?n.viewAs(Float32Array):null,i=n?null:new Float32Array(e.buffer,e.byteOffset,e.length),a=st.FLOATS_PER_TRIANGLE,o=t.world;this.totalEmissivePower=0;for(let e of this.emissiveTriangles){let s=n?r.chunkFor(e.triangleIndex):i,c=n?n.baseOf(e.triangleIndex):e.triangleIndex*a,l=[s[c],s[c+1],s[c+2],s[c+4],s[c+5],s[c+6],s[c+8],s[c+9],s[c+10]],u=t.placementRunOf?.(e.meshIndex)?.start??-1;if(u>=0&&t.isSet[u]){let e=u*16;for(let t=0;t<9;t+=3){let n=l[t],r=l[t+1],i=l[t+2];l[t]=o[e]*n+o[e+4]*r+o[e+8]*i+o[e+12],l[t+1]=o[e+1]*n+o[e+5]*r+o[e+9]*i+o[e+13],l[t+2]=o[e+2]*n+o[e+6]*r+o[e+10]*i+o[e+14]}}let[d,f,p,m,h,g,_,v,y]=l,b=this._calculateTriangleArea(d,f,p,m,h,g,_,v,y),x=e.emissive;e.power=(.2126*x.r+.7152*x.g+.0722*x.b)*e.emissiveIntensity*b,e.area=b;let S=(h-f)*(y-p)-(g-p)*(v-f),C=(g-p)*(_-d)-(m-d)*(y-p),w=(m-d)*(v-f)-(h-f)*(_-d),T=(Math.sqrt(S*S+C*C+w*w)||1)/e.sideSign;e.nx=S/T,e.ny=C/T,e.nz=w/T,e.cx=(d+m+_)/3,e.cy=(f+h+v)/3,e.cz=(p+g+y)/3,e.bMinX=Math.min(d,m,_),e.bMinY=Math.min(f,h,v),e.bMinZ=Math.min(p,g,y),e.bMaxX=Math.max(d,m,_),e.bMaxY=Math.max(f,h,v),e.bMaxZ=Math.max(p,g,y),this.totalEmissivePower+=e.power}this._buildDataArrays()}_calculateTriangleArea(e,t,n,r,i,a,o,s,c){let l=r-e,u=i-t,d=a-n,f=o-e,p=s-t,m=c-n,h=u*m-d*p,g=d*f-l*m,_=l*p-u*f;return Math.sqrt(h*h+g*g+_*_)*.5}_buildDataArrays(){this.emissiveIndicesArray=new Int32Array(this.emissiveCount),this.emissivePowerArray=new Float32Array(this.emissiveCount);for(let e=0;e<this.emissiveCount;e++)this.emissiveIndicesArray[e]=this.emissiveTriangles[e].triangleIndex,this.emissivePowerArray[e]=this.emissiveTriangles[e].power;this._buildCDF()}_buildCDF(){if(this.emissiveCount===0){this.cdfArray=new Float32Array(1),this.cdfArray[0]=0;return}this.cdfArray=new Float32Array(this.emissiveCount);let e=0;for(let t=0;t<this.emissiveCount;t++)e+=this.emissivePowerArray[t],this.cdfArray[t]=e;if(e>0)for(let t=0;t<this.emissiveCount;t++)this.cdfArray[t]/=e}sampleCDF(e){if(this.emissiveCount===0)return-1;if(this.emissiveCount===1)return 0;let t=0,n=this.emissiveCount-1;for(;t<n;){let r=Math.floor((t+n)/2);this.cdfArray[r]<e?t=r+1:n=r}return t}getGPUData(){return{emissiveIndices:this.emissiveIndicesArray,emissivePower:this.emissivePowerArray,emissiveCDF:this.cdfArray,emissiveCount:this.emissiveCount,totalPower:this.totalEmissivePower}}createEmissiveTexture(){if(this.emissiveCount===0)return new r.DataTexture(new Float32Array(4),1,1,r.RGBAFormat,r.FloatType);let e=new Float32Array(this.emissiveCount*4);for(let t=0;t<this.emissiveCount;t++){let n=t*4;e[n+0]=this.emissiveIndicesArray[t],e[n+1]=this.emissivePowerArray[t],e[n+2]=this.cdfArray[t],e[n+3]=0}let t=Math.ceil(Math.sqrt(this.emissiveCount)),n=Math.ceil(this.emissiveCount/t),i=t*n*4,a=new Float32Array(i);a.set(e);let o=new r.DataTexture(a,t,n,r.RGBAFormat,r.FloatType);return o.needsUpdate=!0,o.generateMipmaps=!1,o.minFilter=r.NearestFilter,o.magFilter=r.NearestFilter,bh.debug(`emissive texture ${J.px(t,n)} · ${J.n(this.emissiveCount)} entries`),o}createEmissiveRawData(){if(this.emissiveCount===0)return new Float32Array(8);let e=new Float32Array(this.emissiveCount*8);for(let t=0;t<this.emissiveCount;t++){let n=this.emissiveTriangles[t],r=t*8;e[r+0]=n.triangleIndex,e[r+1]=n.power,e[r+2]=this.cdfArray[t],e[r+3]=n.instanceLeaf,e[r+4]=n.emissive.r*n.emissiveIntensity,e[r+5]=n.emissive.g*n.emissiveIntensity,e[r+6]=n.emissive.b*n.emissiveIntensity,e[r+7]=n.area}return bh.debug(`emissive raw data ${J.n(this.emissiveCount)} entries (${J.mb(e.byteLength)})`),e}getStats(){if(this.emissiveCount===0)return{count:0,totalPower:0,averagePower:0,minPower:0,maxPower:0};let e=1/0,t=-1/0;for(let n=0;n<this.emissiveCount;n++){let r=this.emissivePowerArray[n];e=Math.min(e,r),t=Math.max(t,r)}return{count:this.emissiveCount,totalPower:this.totalEmissivePower,averagePower:this.totalEmissivePower/this.emissiveCount,minPower:e,maxPower:t}}updateMaterialEmissive(e,t,n,r,i){let a=yh(t.emissive),o=t.emissiveIntensity||0,s=o>0&&(a.r>0||a.g>0||a.b>0);if(s!==this.emissiveTriangles.some(t=>t.materialIndex===e))return this.extractEmissiveTriangles(n,r,i),!0;if(!s)return!1;let c=.2126*a.r+.7152*a.g+.0722*a.b;for(let t of this.emissiveTriangles)t.materialIndex===e&&(t.power=c*o*t.area,t.emissive={r:a.r,g:a.g,b:a.b},t.emissiveIntensity=o);return!0}setHiddenMeshes(e){let t=new Set;for(let e of this.emissiveTriangles)t.add(e.meshIndex);let n=new Set;for(let r of e)t.has(r)&&n.add(r);let r=this._hiddenMeshes,i=n.size!==r.size;if(!i){for(let e of n)if(!r.has(e)){i=!0;break}}return this._hiddenMeshes=n,i}buildLightBVH(){let e=this._hiddenMeshes.size===0?this.emissiveTriangles:this.emissiveTriangles.filter(e=>!this._hiddenMeshes.has(e.meshIndex));this.emissiveCount=e.length,this.totalEmissivePower=0;for(let t of e)this.totalEmissivePower+=t.power;if(e.length===0)return this.lightBVHNodeData=new Float32Array(16),this.lightBVHNodeData[7]=1,this.lightBVHNodeData[14]=1,this.lightBVHNodeData[15]=-1,this.lightBVHNodeCount=1,this.emissiveBitTrailMap=new Float32Array(Math.max(this._totalTriangleCount,1)).fill(-1),this.emissiveIndicesArray=new Int32Array,this.emissivePowerArray=new Float32Array,this._buildCDF(),this.emissiveTriangleData=new Float32Array(8),1;let{nodeData:t,nodeCount:n,sortedPerm:r,bitTrails:i}=new hh().build(e);this.lightBVHNodeData=t,this.lightBVHNodeCount=n,this._rebuildSortedEmissiveData(r,e),this.emissiveBitTrailMap=new Float32Array(Math.max(this._totalTriangleCount,1)).fill(-1);for(let t=0;t<r.length;t++){let n=e[r[t]].triangleIndex;this.emissiveBitTrailMap[n]=i[t]}return n}_rebuildSortedEmissiveData(e,t){let n=e.length;this.emissiveIndicesArray=new Int32Array(n),this.emissivePowerArray=new Float32Array(n);for(let r=0;r<n;r++){let n=e[r];this.emissiveIndicesArray[r]=t[n].triangleIndex,this.emissivePowerArray[r]=t[n].power}this._buildCDF();let r=new Float32Array(n*8);for(let i=0;i<n;i++){let n=t[e[i]],a=i*8;r[a+0]=n.triangleIndex,r[a+1]=n.power,r[a+2]=this.cdfArray[i],r[a+3]=n.instanceLeaf,r[a+4]=n.emissive.r*n.emissiveIntensity,r[a+5]=n.emissive.g*n.emissiveIntensity,r[a+6]=n.emissive.b*n.emissiveIntensity,r[a+7]=n.area}this.emissiveTriangleData=r,bh.debug(`rebuilt sorted emissive data · ${J.n(n)} entries`)}clear(){this.emissiveTriangles=[],this.emissiveCount=0,this.totalEmissivePower=0,this.emissiveIndicesArray=null,this.emissivePowerArray=null,this.cdfArray=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._totalTriangleCount=0,this._hiddenMeshes=new Set}};rn();var Sh=class{constructor(e=`Build`,{namespace:t=`build`,level:n=`debug`}={}){this.label=e,this.level=n,this.logger=Wt(t),this.entries=new Map,this.order=[],this.totalStart=performance.now()}start(e){return this.entries.set(e,{start:performance.now(),end:null}),this.order.includes(e)||this.order.push(e),this}end(e){let t=this.entries.get(e);return t&&(t.end=performance.now(),t.duration=t.end-t.start),this}getDuration(e){return this.entries.get(e)?.duration??0}print(e=[]){let t=performance.now()-this.totalStart,n=this.order.map(e=>{let t=this.entries.get(e)?.duration??0;return t>=1?`${e} ${Math.round(t)}ms`:null}).filter(Boolean),r=J.list([this.label,...e,J.ms(t)]);return this.level===`info`?this.logger.summary(r,n):this.logger.debug(J.list([r,n.join(` · `)])),{steps:Object.fromEntries(this.order.map(e=>[e,Math.round(this.entries.get(e)?.duration??0)])),total:Math.round(t)}}},Ch=1<<20,wh=1<<21,Th=()=>new Promise(e=>setTimeout(e,0)),Eh=[0,1,2,4,5,6,8,9,10];function Dh(e,t,n,r=Eh){let i=e.lanesPerRecord,a=r.length,o=0,s=0,c=0;for(;c<n;){let l=t+c,u=e.chunkFor(l),d=Math.min(e.recordsPerChunk-l%e.recordsPerChunk,n-c),f=e.baseOf(l);for(let e=0;e<d;e++,f+=i){let e=2166136261,t=2654435769;for(let n=0;n<a;n++){let i=u[f+r[n]];e=Math.imul(e^i,16777619),t=Math.imul(t+i|0,2246822507)^t>>>13}o=o+e>>>0,s=s+t>>>0}c+=d}return`${o.toString(16)}.${s.toString(16)}`}async function Oh(e,t){let n=[],r=0;for(let{triOffset:i,triCount:a}of t)n.push(Dh(e,i,a)),r+=a,r>=wh&&(r=0,await Th());return n}async function kh(e,t){let n=await e?.area(Zn.SCENES).open(t);if(!n)return null;try{let e=await n.json(`index.json`),t=await n.file(`nodes.f32`),r=await n.file(`order.u32`);return e?.v!==2||!t||!r?(n.release(),null):{index:e,nodes:t,order:r,release:()=>n.release()}}catch{return n.release(),null}}async function Ah(e,t,{index:n,bvh:r,orders:i,isStale:a,label:o=``}){let s=e?.area(Zn.SCENES);if(!s)return!1;let c=n.totalNodes-n.tlasNodeCount,l=i.reduce((e,t)=>e+(t?.byteLength??0),0),u=await s.create(t,{label:`${o} (BVH)`,expectedBytes:c*64+l});if(!u)return!1;try{for(let e=n.tlasNodeCount;e<n.totalNodes;){if(a())throw Error(`scene changed while it was being stored`);let t=r.chunkFor(e),i=r.recordsPerChunk-e%r.recordsPerChunk,o=Math.min(i,n.totalNodes-e,Ch),s=r.baseOf(e);await u.write(`nodes.f32`,t.subarray(s,s+o*16)),e+=o}for(let e of i)if(e)for(let t=0;t<e.length;t+=Ch*4)await u.write(`order.u32`,e.subarray(t,Math.min(e.length,t+Ch*4)));if(l===0&&await u.write(`order.u32`,new Uint8Array),a())throw Error(`scene changed while it was being stored`);return await u.writeJSON(`index.json`,n),await u.commit(),!0}catch{return await u.abort(),!1}}async function jh(e,t,n,r){for(let i=0;i<r;i+=Ch){let a=Math.min(Ch,r-i),o=await e.slice(i*64,(i+a)*64).arrayBuffer();t.setRecords(n+i,new Float32Array(o))}}async function Mh(e,t,n){return new Uint32Array(await e.slice(t*4,(t+n)*4).arrayBuffer())}var Nh=16,Ph=st.POSITION_A_OFFSET,Fh=st.POSITION_B_OFFSET,Ih=st.POSITION_C_OFFSET;async function Lh(e,t,n,r,{pause:i=null}={}){let a=e.lanesPerRecord,o=[new Float32Array(n),new Float32Array(n),new Float32Array(n)],[s,c,l]=o;for(let r=0;r<n;){let i=e.chunkFor(t+r),o=new Float32Array(i.buffer,i.byteOffset,i.length),u=Math.min(n,(((t+r)/e.recordsPerChunk|0)+1)*e.recordsPerChunk-t);for(let n=e.baseOf(t+r);r<u;r++,n+=a)s[r]=o[n+Ph]+o[n+Fh]+o[n+Ih],c[r]=o[n+Ph+1]+o[n+Fh+1]+o[n+Ih+1],l[r]=o[n+Ph+2]+o[n+Fh+2]+o[n+Ih+2]}let u=new Uint32Array(n);for(let e=0;e<n;e++)u[e]=e;let d=[],f=(e,t)=>{if(t-e<=r)return d.push({start:e,count:t-e}),{piece:d.length-1};let n=e+(t-e>>1);return zh(u,o,Rh(o,e,t),e,t,n),{left:f(e,n),right:f(n,t)}},p=f(0,n);return await i?.(),await Bh(e,t,n,u,i),{order:u,pieces:d,tree:p}}function Rh(e,t,n){let r=0,i=-1;for(let a=0;a<3;a++){let o=e[a],s=1/0,c=-1/0;for(let e=t;e<n;e++){let t=o[e];t<s&&(s=t),t>c&&(c=t)}c-s>i&&(i=c-s,r=a)}return r}function zh(e,t,n,r,i,a){let o=t[n],[s,c,l]=t,u=(t,n)=>{let r=e[t];e[t]=e[n],e[n]=r,r=s[t],s[t]=s[n],s[n]=r,r=c[t],c[t]=c[n],c[n]=r,r=l[t],l[t]=l[n],l[n]=r},d=2654435769,f=()=>(d^=d<<13,d^=d>>>17,d^=d<<5,o[r+(d>>>0)%(i-r)]);for(;i-r>1;){let e=f(),t=f(),n=f(),s=e<t?t<n?t:e<n?n:e:e<n?e:t<n?n:t,c=r,l=r,d=i;for(;l<d;){let e=o[l];e<s?u(c++,l++):e>s?u(l,--d):l++}if(a<c)i=c;else if(a>=d)r=d;else return}}async function Bh(e,t,n,r,i){let a=e.lanesPerRecord,o=new Uint32Array(a),s=new Uint8Array(n),c=0;for(let l=0;l<n;l++){if(s[l]||(s[l]=1,r[l]===l))continue;let n=e.chunkFor(t+l),u=e.baseOf(t+l);for(let e=0;e<a;e++)o[e]=n[u+e];for(let d=l;;){let f=r[d],p=n,m=u;if(f===l){for(let e=0;e<a;e++)p[m+e]=o[e];break}n=e.chunkFor(t+f),u=e.baseOf(t+f);for(let e=0;e<a;e++)p[m+e]=n[u+e];s[f]=1,d=f,i&&!(++c&1048575)&&await i()}}}function Vh(e,t,n,r){let i=t.length-1,a=[],o=i;for(let{bvhData:e}of n)a.push(o),o+=e.length/Nh;let s=new Float32Array(i*Nh),c=new Uint32Array(s.buffer),l=[s],u=new Uint32Array(r.length);for(let e=0;e<t.length;e++){let{bvhData:i,originalToBvh:o}=n[e];n[e].bvhData=n[e].originalToBvh=null;let s=a[e],{start:c,count:d}=t[e];Tp(new Uint32Array(i.buffer,i.byteOffset,i.length),s,c),l.push(i);for(let e=0;e<d;e++)u[r[c+e]]=c+(o?o[e]:e)}let d=0,f=e=>{if(e.piece!==void 0)return{index:a[e.piece],box:n[e.piece].aabb};let t=d++,r=f(e.left),i=f(e.right),o=t*Nh;return s[o]=r.box[0],s[o+1]=r.box[1],s[o+2]=r.box[2],c[o+3]=r.index,s[o+4]=r.box[3],s[o+5]=r.box[4],s[o+6]=r.box[5],c[o+7]=i.index,s[o+8]=i.box[0],s[o+9]=i.box[1],s[o+10]=i.box[2],s[o+12]=i.box[3],s[o+13]=i.box[4],s[o+14]=i.box[5],{index:t,box:[0,1,2].map(e=>Math.min(r.box[e],i.box[e])).concat([3,4,5].map(e=>Math.max(r.box[e],i.box[e])))}};return f(e),{bvhData:l,nodeCount:o,originalToBvh:u}}var Hh=`9.1.2`,Uh=1e4,Wh=15e5;function Gh(e,t,n=Uh){return e>=n&&t/Wh<e/3}var Kh="const e=e=>e>=2147483648,t=e=>~e>>>0>>>4,n=e=>~e&15,r={FLOATS_PER_TRIANGLE:20,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_PACKED_OFFSET:3,NORMAL_B_PACKED_OFFSET:7,NORMAL_C_PACKED_OFFSET:11},i=r.FLOATS_PER_TRIANGLE,a=e=>e instanceof Float32Array?e:new Float32Array(e.buffer,e.byteOffset,e.length),o=e=>e instanceof Uint32Array?e:new Uint32Array(e.buffer,e.byteOffset,e.length),s=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:e,idx:t?e.viewAs(Uint32Array):o(e)}},c=(e,t)=>e.chunked?e.f.chunkFor(t):e.f,l=(e,t)=>e.chunked?e.idx.chunkFor(t):e.idx,u=(e,t)=>e.chunked?e.chunked.baseOf(t):t*p,d=e=>{let t=e&&e.chunks?e:null;return{chunked:t,f:t?t.viewAs(Float32Array):a(e),u:t?e:o(e)}};function f(e,t,n){let r=Math.sqrt(e*e+t*t+n*n);r>0?(e/=r,t/=r,n/=r):(e=0,t=0,n=1);let i=Math.abs(e)+Math.abs(t)+Math.abs(n),a=e/i,o=t/i;if(n<0){let e=a,t=o;a=(1-Math.abs(t))*(e>=0?1:-1),o=(1-Math.abs(e))*(t>=0?1:-1)}let s=Math.round(Math.min(1,Math.max(-1,a))*32767)&65535;return((Math.round(Math.min(1,Math.max(-1,o))*32767)&65535)<<16|s)>>>0}const p=16;function m(e,t,n,r,i,a){let o=e[t+4],s=e[t+5],c=e[t+6],l=e[t+7],u=e[t+8],d=e[t+9],f=e[t+10],p=e[t+11],m=e[t+12],h=e[t+13],g=e[t+14],_=e[t+15],v=d*g-f*h,y=f*m-u*g,b=u*h-d*m,x=o*v+s*y+c*b,S=o===1&&d===1&&g===1&&s===0&&c===0&&u===0&&f===0&&m===0&&h===0&&l===0&&p===0&&_===0,C=(Math.abs(o)+Math.abs(s)+Math.abs(c))*(Math.abs(u)+Math.abs(d)+Math.abs(f))*(Math.abs(m)+Math.abs(h)+Math.abs(g));if(S||!Number.isFinite(x)||Math.abs(x)<=1e-12*C){for(let e=0;e<6;e++)i[a+e]=n[r+e];return}let w=1/x,T=v*w,E=y*w,D=b*w,O=(c*h-s*g)*w,k=(o*g-c*m)*w,A=(s*m-o*h)*w,j=(s*f-c*d)*w,M=(c*u-o*f)*w,N=(o*d-s*u)*w,P=1/0,F=1/0,I=1/0,L=-1/0,R=-1/0,z=-1/0;for(let e=0;e<8;e++){let t=(e&1?n[r+3]:n[r])-l,i=(e&2?n[r+4]:n[r+1])-p,a=(e&4?n[r+5]:n[r+2])-_,o=T*t+O*i+j*a,s=E*t+k*i+M*a,c=D*t+A*i+N*a;o<P&&(P=o),o>L&&(L=o),s<F&&(F=s),s>R&&(R=s),c<I&&(I=c),c>z&&(z=c)}i[a]=P,i[a+1]=F,i[a+2]=I,i[a+3]=L,i[a+4]=R,i[a+5]=z}function h(e,t,n,a,o){let s=r.POSITION_A_OFFSET,c=r.POSITION_B_OFFSET,l=r.POSITION_C_OFFSET,u=1/0,d=1/0,f=1/0,p=-1/0,m=-1/0,h=-1/0;for(let r=0;r<n;r++){let n=t+r,a=e.chunked?e.f.chunkFor(n):e.f,o=e.chunked?e.chunked.baseOf(n):n*i;u=Math.min(u,a[o+s],a[o+c],a[o+l]),d=Math.min(d,a[o+s+1],a[o+c+1],a[o+l+1]),f=Math.min(f,a[o+s+2],a[o+c+2],a[o+l+2]),p=Math.max(p,a[o+s],a[o+c],a[o+l]),m=Math.max(m,a[o+s+1],a[o+c+1],a[o+l+1]),h=Math.max(h,a[o+s+2],a[o+c+2],a[o+l+2])}a[o]=u,a[o+1]=d,a[o+2]=f,a[o+3]=p,a[o+4]=m,a[o+5]=h}const g=new Float32Array(12);function _(r,i,a,o,s){let d=c(r,i),f=l(r,i),p=u(r,i),_=(i-s)*6,v=f[p+3];if(v===1073741824){h(a,f[p],f[p+1],o,_);return}if(v===1073741825){m(d,p,o,(f[p]-s)*6,o,_);return}let y=f[p+7],b=o,x=(v-s)*6;e(v)&&(h(a,t(v),n(v),g,0),b=g,x=0);let S=o,C=(y-s)*6;e(y)&&(h(a,t(y),n(y),g,6),S=g,C=6),d[p]=b[x],d[p+1]=b[x+1],d[p+2]=b[x+2],d[p+4]=b[x+3],d[p+5]=b[x+4],d[p+6]=b[x+5],d[p+8]=S[C],d[p+9]=S[C+1],d[p+10]=S[C+2],d[p+12]=S[C+3],d[p+13]=S[C+4],d[p+14]=S[C+5];for(let e=0;e<3;e++)o[_+e]=Math.min(b[x+e],S[C+e]),o[_+3+e]=Math.max(b[x+3+e],S[C+3+e])}var v=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let a=n.length,o=d(e);for(let e=0;e<a;e++){let a=n[e],s=o.chunked?o.f.chunkFor(e):o.f,c=o.chunked?o.u.chunkFor(e):o.u,l=o.chunked?o.chunked.baseOf(e):e*i,u=a*9,d=t[u],p=t[u+1],m=t[u+2],h=t[u+3],g=t[u+4],_=t[u+5],v=t[u+6],y=t[u+7],b=t[u+8];s[l+r.POSITION_A_OFFSET]=d,s[l+r.POSITION_A_OFFSET+1]=p,s[l+r.POSITION_A_OFFSET+2]=m,s[l+r.POSITION_B_OFFSET]=h,s[l+r.POSITION_B_OFFSET+1]=g,s[l+r.POSITION_B_OFFSET+2]=_,s[l+r.POSITION_C_OFFSET]=v,s[l+r.POSITION_C_OFFSET+1]=y,s[l+r.POSITION_C_OFFSET+2]=b;let x=h-d,S=g-p,C=_-m,w=v-d,T=y-p,E=b-m,D=f(S*E-C*T,C*w-x*E,x*T-S*w);c[l+r.NORMAL_A_PACKED_OFFSET]=D,c[l+r.NORMAL_B_PACKED_OFFSET]=D,c[l+r.NORMAL_C_PACKED_OFFSET]=D}}refitRange(e,t,n,r){let i=d(t);r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let a=s(e);for(let e=n+r-1;e>=n;e--)_(a,e,i,this._bounds,n)}refit(e,t,n){let r=d(t);n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let i=s(e);for(let e=n-1;e>=0;e--)_(i,e,r,this._bounds,0)}};const y=64*1024*1024;function b(e,t,n){return n?new e(new SharedArrayBuffer(t*e.BYTES_PER_ELEMENT)):new e(t)}var x=class e{constructor(e,t,n,r=y,i=!1){let a=t*n.BYTES_PER_ELEMENT,o=Math.max(1,Math.floor(r/a));this.recordCount=e,this.lanesPerRecord=t,this.LaneType=n,this.recordsPerChunk=e<=o?Math.max(e,1):o,this.shared=i,this.chunks=[];let s=e;for(;s>0;){let e=Math.min(s,this.recordsPerChunk);this.chunks.push(b(n,e*t,i)),s-=e}this.chunks.length===0&&this.chunks.push(b(n,0,i))}static adopt(t,n,r,i){let a=Object.create(e.prototype);return a.recordCount=n,a.lanesPerRecord=r,a.LaneType=t[0]?.constructor??null,a.recordsPerChunk=i,a.chunks=t,a.shared=typeof SharedArrayBuffer<`u`&&t[0]?.buffer instanceof SharedArrayBuffer,a}static lazy(t,n,r,i=y,a=!1){let o=Math.max(1,Math.floor(i/(n*r.BYTES_PER_ELEMENT))),s=Object.create(e.prototype);return s.recordCount=t,s.lanesPerRecord=n,s.LaneType=r,s.recordsPerChunk=t<=o?Math.max(t,1):o,s.shared=a,s.chunks=Array(Math.max(1,Math.ceil(t/s.recordsPerChunk))),s._views=[],s}_materialize(e){if(this._owner)return this._owner._materialize(e),this.chunks[e];let t=e*this.recordsPerChunk,n=Math.min(this.recordsPerChunk,this.recordCount-t)*this.lanesPerRecord,r=this.chunks[e]=b(this.LaneType,n,this.shared);for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);return r}materializeAll(){for(let e=0;e<this.chunks.length;e++)!this.chunks[e]&&!this._spilled?.has(e)&&this._materialize(e);return this}get chunkCount(){return this.chunks.length}get single(){return this.chunks.length===1?this.chunks[0]:null}get byteLength(){let e=0;for(let t of this.chunks)t&&(e+=t.byteLength);return e}chunkFor(e){let t=e/this.recordsPerChunk|0,n=this.chunks[t];if(n)return n;if(this._spilled?.has(t))throw Error(`ChunkedRecords: chunk ${t} is on disk — await ensureResident() before touching record ${e}`);return this._materialize(t)}async spill(e,{keep:t=()=>!1}={}){if(this._owner)throw Error(`ChunkedRecords: spill the storage, not a view of it`);this._store=e,this._spilled??=new Set;let n=0;for(let r=0;r<this.chunks.length;r++){let i=this.chunks[r];if(!(!i||t(r))){await e.write(r,i),this.chunks[r]=null;for(let e of this._liveViews())e.chunks[r]=null;this._spilled.add(r),n+=i.byteLength}}return n}async spillChunk(e,t){let n=this.chunks[e];if(!n)return 0;this._store=t,this._spilled??=new Set,await t.write(e,n),this.chunks[e]=null;for(let t of this._liveViews())t.chunks[e]=null;return this._spilled.add(e),n.byteLength}async ensureResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++){if(!this._spilled.has(e))continue;let t=Math.min(this.recordsPerChunk,this.recordCount-e*this.recordsPerChunk)*this.lanesPerRecord,n=await this._store.read(e,t*this.LaneType.BYTES_PER_ELEMENT),r=b(this.LaneType,t,this.shared);new Uint8Array(r.buffer,r.byteOffset,r.byteLength).set(new Uint8Array(n)),this.chunks[e]=r;for(let t of this._liveViews())t.chunks[e]=new t.LaneType(r.buffer,r.byteOffset,r.byteLength/t.LaneType.BYTES_PER_ELEMENT);this._spilled.delete(e)}}_liveViews(){return this._weakViews&&=this._weakViews.filter(e=>e.deref()),[...this._views??[],...(this._weakViews??[]).map(e=>e.deref())]}isResident(e=0,t=this.recordCount){if(!this._spilled?.size||t<=0)return!0;let n=e/this.recordsPerChunk|0,r=(e+t-1)/this.recordsPerChunk|0;for(let e=n;e<=r;e++)if(this._spilled.has(e))return!1;return!0}get spilledChunks(){return this._spilled?.size??0}baseOf(e){return e%this.recordsPerChunk*this.lanesPerRecord}isContiguous(e,t){return t<=0?!0:(e/this.recordsPerChunk|0)==((e+t-1)/this.recordsPerChunk|0)}slice(e,t){let n=this.baseOf(e),r=t*this.lanesPerRecord;if(this.isContiguous(e,t))return this.chunkFor(e).subarray(n,n+r);let i=new this.LaneType(r);return this.readRecords(e,t,i),i}readRecords(e,t,n){let r=0;for(;r<t;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,t-r);n.set(a.subarray(o,o+c*this.lanesPerRecord),r*this.lanesPerRecord),r+=c}return n}setRecords(e,t){let n=t.length/this.lanesPerRecord,r=0;for(;r<n;){let i=e+r,a=this.chunkFor(i),o=this.baseOf(i),s=this.recordsPerChunk-i%this.recordsPerChunk,c=Math.min(s,n-r);a.set(t.subarray(r*this.lanesPerRecord,(r+c)*this.lanesPerRecord),o),r+=c}}copyOf(e,t){return this.readRecords(e,t,new this.LaneType(t*this.lanesPerRecord))}trimTo(t){let n=Math.max(1,Math.ceil(t/this.recordsPerChunk)),r=this.chunks.slice(0,n),i=(t-(n-1)*this.recordsPerChunk)*this.lanesPerRecord,a=r[n-1];return a.length>i&&(r[n-1]=a.subarray(0,Math.max(0,i))),e.adopt(r,t,this.lanesPerRecord,this.recordsPerChunk)}grow(e){if(e<=this.recordCount)return;let t=this.chunks.length-1,n=(e,t)=>Math.min(this.recordsPerChunk,t-e*this.recordsPerChunk)*this.lanesPerRecord,r=this.chunks[t];this.recordCount=e;for(let t of this._liveViews())t.recordCount=e;if(this.chunks.length*this.recordsPerChunk<e){this.chunks.length=Math.ceil(e/this.recordsPerChunk);for(let e of this._liveViews())e.chunks.length=this.chunks.length}if(r&&r.length<n(t,e)){let i=b(this.LaneType,n(t,e),this.shared);i.set(r),this.chunks[t]=i;for(let e of this._liveViews())e.chunks[t]=new e.LaneType(i.buffer,i.byteOffset,i.byteLength/e.LaneType.BYTES_PER_ELEMENT)}else if(!r&&this._spilled?.has(t))throw Error(`ChunkedRecords: cannot grow past chunk ${t}, which is on disk`)}release(e,t){let n=this.recordsPerChunk,r=Math.ceil(e/n),i=Math.floor((e+t)/n),a=0;for(let e=r;e<i;e++){let t=this.chunks[e];if(t){a+=t.byteLength,this.chunks[e]=void 0;for(let t of this._liveViews())t.chunks[e]=void 0}}return a}trimInPlace(e){let t=Math.max(1,Math.ceil(e/this.recordsPerChunk)),n=Math.max(0,(e-(t-1)*this.recordsPerChunk)*this.lanesPerRecord),r=[this,...this._liveViews()];for(let i of r){i.chunks.length=t;let r=i.chunks[t-1];r&&r.length>n&&(i.chunks[t-1]=r.subarray(0,n)),i.recordCount=e}if(this._spilled)for(let e of this._spilled)e>=t&&this._spilled.delete(e);return this}viewAs(t){let n=e=>new t(e.buffer,e.byteOffset,e.byteLength/t.BYTES_PER_ELEMENT),r=e.adopt(this.chunks.map(e=>e?n(e):void 0),this.recordCount,this.lanesPerRecord,this.recordsPerChunk);return r.LaneType=t,r._owner=this,this._views?this._views.push(r):(this._weakViews??=[]).push(new WeakRef(r)),r._spilled=this._spilled??=new Set,r}};const S=new v;let C=null,w=null,T=0;self.onmessage=function(e){let{type:t}=e.data;if(t===`init`){C=x.adopt(e.data.sharedBvhBufs.map(e=>new Float32Array(e)),e.data.bvhRecordCount,16,e.data.bvhRecordsPerChunk),w=x.adopt(e.data.sharedTriBufs.map(e=>new Uint32Array(e)),e.data.triRecordCount,e.data.triLanesPerRecord,e.data.triRecordsPerChunk),T=C.recordCount;return}if(t===`refit`)try{let e=performance.now();S.refit(C,w,T),self.postMessage({type:`refitComplete`,refitTimeMs:performance.now()-e})}catch(e){console.error(`[BVHRefitWorker] Refit error:`,e),self.postMessage({type:`error`,error:e.message})}};",qh=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Kh],{type:`text/javascript;charset=utf-8`});function Jh(e){let t;try{if(t=qh&&(self.URL||self.webkitURL).createObjectURL(qh),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Kh),{type:`module`,name:e?.name})}}var Yh="const e=Math.PI/180;function t(e){let t=2*Math.PI*(e-1)/365;return .006918-.399912*Math.cos(t)+.070257*Math.sin(t)-.006758*Math.cos(2*t)+907e-6*Math.sin(2*t)-.002697*Math.cos(3*t)+.00148*Math.sin(3*t)}function n({hours:n,dayOfYear:r,latitude:i}){let a=t(r),o=(n-12)*15*e,s=i*e,c=Math.sin(s)*Math.sin(a)+Math.cos(s)*Math.cos(a)*Math.cos(o),l=Math.asin(Math.min(1,Math.max(-1,c)))/e;return{azimuth:(Math.atan2(Math.sin(o),Math.cos(o)*Math.sin(s)-Math.tan(a)*Math.cos(s))/e+540)%360,elevation:l}}const r=e=>[0,31,59,90,120,151,181,212,243,273,304,334][e-1]+21,i=Object.freeze({time:10,month:3,latitude:40}),a=n({hours:i.time,dayOfYear:r(i.month),latitude:i.latitude}),o=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`look`}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1,dofMode:`physical`})}),s={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:o.viewer.toneMapping,exposure:1,saturation:o.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:o.viewer.environmentRotation,groundProjectionEnabled:!1,groundProjectionRadius:100,groundProjectionHeight:15,groundProjectionLevel:0,enableGroundCatcher:!1,groundCatcherHeight:0,globalIlluminationIntensity:1,environmentMode:`hdri`,gradientZenithColor:`#0077BE`,gradientHorizonColor:`#87CEEB`,gradientGroundColor:`#654321`,solidSkyColor:`#87CEEB`,skySunAzimuth:180-a.azimuth,skySunElevation:a.elevation,skySunStrength:1,skySunSize:.53,skyTurbidity:2,skyOzone:300,skyAirDensity:1,skyGroundAlbedo:`#959595`,skyAltitude:50,skyPreset:`clearDay`,cameraProjection:`perspective`,panoramaLonRange:[-180,180],panoramaLatRange:[-90,90],panoramaLevelHorizon:!0,enableDOF:!1,fov:55,focusDistance:.8,aperture:5.6,focalLength:50,apertureScale:1,anamorphicRatio:1,unitsPerMetre:1,dofMode:o.viewer.dofMode,dofBlur:.05,autoFocusMode:`auto`,afScreenPoint:{x:.5,y:.5},afSmoothingFactor:.15,enablePathTracer:!0,enableAccumulation:!0,pauseRendering:!1,maxSamples:60,bounces:3,transmissiveBounces:5,maxSubsurfaceSteps:8,maxTransparentBounces:32,useAdaptiveSampling:!0,noiseThreshold:.1,adaptiveMinSamples:8,adaptiveStopFraction:.9,usePixelFreeze:!0,pixelFreezeThreshold:.02,pixelFreezeStability:8,convergenceOverlay:!1,samplingTechnique:2,enableEmissiveTriangleSampling:!1,emissiveBoost:1,fireflyThreshold:3,shadowTerminatorOffset:.1,wavefrontSortMaterials:!0,renderLimitMode:`frames`,renderTimeLimit:30,renderMode:0,enableAlphaShadows:!1,tilesHelper:!0,showLightHelper:!1,directionalLightIntensity:0,directionalLightColor:`#ffffff`,directionalLightPosition:[1,1,1],directionalLightAngle:0,filterStrength:1,edgeAtrousIterations:5,edgePhiLuminance:4,edgePhiNormal:64,edgePhiDepth:.1,enableOIDN:!1,oidnQuality:`fast`,continuousDenoise:!1,continuousDenoiseInterval:8,oidnTemporalHistory:!0,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,interactionRenderScale:.5,debugVisScale:100,denoiserStrategy:`none`,enableASVGF:!1,asvgfTemporalAlpha:.1,asvgfAtrousIterations:8,asvgfPhiColor:10,asvgfPhiNormal:128,asvgfPhiDepth:1,asvgfVarianceBoost:1,asvgfMaxAccumFrames:32,asvgfGradientStrength:1,asvgfGradientSigmaScale:2,asvgfGradientNoiseFloor:0,asvgfDebugMode:0,asvgfQualityPreset:`medium`,showAsvgfHeatmap:!1,nrdQualityPreset:`medium`,nrdDebugMode:0,autoExposure:!1,autoExposureKeyValue:.18,autoExposureMinExposure:.1,autoExposureMaxExposure:20,autoExposureAdaptSpeedBright:3,autoExposureAdaptSpeedDark:.5};Object.freeze({perspective:0,equirectangular:1,orthographic:2}),s.fov,s.focusDistance,s.aperture,s.focalLength,180-a.azimuth,a.elevation,c({color:[1,1,1],emissive:[0,0,0],emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:0,attenuationColor:[1,1,1],attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:[0,0,0],specularIntensity:1,specularColor:[1,1,1],clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:[1,1],bumpScale:1,displacementScale:1,transparent:0,alphaTest:0,alphaMode:0,side:0,depthWrite:1,subsurface:0,subsurfaceColor:[1,1,1],subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0});function c(e){for(let t of Object.values(e))typeof t==`object`&&Object.freeze(t);return Object.freeze(e)}const l={TRIANGLE_LEAF:1073741824,BLAS_POINTER_LEAF:1073741825,FRONTIER:1073741826};function u(e){return new Uint32Array(e.buffer,e.byteOffset,e.length)}function d(e,t){if(e>=1073741824)throw RangeError(`${t} is ${e.toLocaleString()}, at or past the BVH index limit of ${1073741824 .toLocaleString()}. Node indices are stored as u32 bit patterns and the leaf tags occupy everything above that.`);return e}Math.min(typeof navigator<`u`&&navigator.hardwareConcurrency||4,6),s.maxSamples,s.bounces,s.renderMode,s.enableAlphaShadows,s.maxSubsurfaceSteps;const f=Float64Array.from([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function p(e,t){return e[t]*(e[t+5]*e[t+10]-e[t+6]*e[t+9])-e[t+4]*(e[t+1]*e[t+10]-e[t+2]*e[t+9])+e[t+8]*(e[t+1]*e[t+6]-e[t+2]*e[t+5])}function m(e,t,n){let r=p(e,t);if(!Number.isFinite(r)||Math.abs(r)<1e-20)return n.set(f),n;let i=1/r;return n[0]=(e[t+5]*e[t+10]-e[t+6]*e[t+9])*i,n[1]=(e[t+2]*e[t+9]-e[t+1]*e[t+10])*i,n[2]=(e[t+1]*e[t+6]-e[t+2]*e[t+5])*i,n[3]=0,n[4]=(e[t+6]*e[t+8]-e[t+4]*e[t+10])*i,n[5]=(e[t]*e[t+10]-e[t+2]*e[t+8])*i,n[6]=(e[t+2]*e[t+4]-e[t]*e[t+6])*i,n[7]=0,n[8]=(e[t+4]*e[t+9]-e[t+5]*e[t+8])*i,n[9]=(e[t+1]*e[t+8]-e[t]*e[t+9])*i,n[10]=(e[t]*e[t+5]-e[t+1]*e[t+4])*i,n[11]=0,n[12]=-(n[0]*e[t+12]+n[4]*e[t+13]+n[8]*e[t+14]),n[13]=-(n[1]*e[t+12]+n[5]*e[t+13]+n[9]*e[t+14]),n[14]=-(n[2]*e[t+12]+n[6]*e[t+13]+n[10]*e[t+14]),n[15]=1,n}function h(e,t){for(let n=0;n<16;n++)if(e[t+n]!==f[n])return!1;return!0}const g=e=>e<32?e:32,_=new Float64Array(16);var v=class e{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0,this._binCounts=new Int32Array(96),this._binBounds=new Float64Array(576),this._binSuffix=new Float64Array(32),this._binSuffixCount=new Int32Array(32),this._order=null,this._stackI=null,this._stackB=null,this._stackFrames=0,this._sortScratch=[],this._suffix=null,this._bounds=new Float64Array(12),this._extent=new Float64Array(3),this._cMin=new Float64Array(3)}static nodeCountFor(e){return e>0?e*2-1:0}releaseFlattenBuffer(){this._flatBuffer=null,this._flatBufferCapacity=0}build(t){let n=new Float64Array(t.count*6);t.writeWorldAABBs(n);let r=this.buildStructure(n,t.count);return e.fillLeaves(r.data,r.nodeCount,t),r}buildStructure(t,n){let r=e.nodeCountFor(n);if(n===0)return{data:new Float32Array,nodeCount:0};d(r,`TLAS node count`);let i=r*16;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer,o=u(a);(!this._order||this._order.length<n)&&(this._order=new Int32Array(n));let s=this._order;for(let e=0;e<n;e++)s[e]=e;this._ensureStack(64);let c=0,f=0,p=0,m=n,h=this._bounds;this._rangeBounds(t,s,p,m,h,0);let g=h[0],_=h[1],v=h[2],y=h[3],b=h[4],x=h[5];for(;;){if(m-p===1){let e=f*16;o[e]=0,o[e+1]=s[p],a[e+2]=0,o[e+3]=l.BLAS_POINTER_LEAF}else{let e=this._partition(t,s,p,m,g,_,v,y,b,x),n=e-p,r=f+1,i=r+(n*2-1),l=f*16;a[l]=h[0],a[l+1]=h[1],a[l+2]=h[2],o[l+3]=r,a[l+4]=h[3],a[l+5]=h[4],a[l+6]=h[5],o[l+7]=i,a[l+8]=h[6],a[l+9]=h[7],a[l+10]=h[8],a[l+11]=0,a[l+12]=h[9],a[l+13]=h[10],a[l+14]=h[11],a[l+15]=0;let u=n<=m-e,d=u?0:6,S=u?6:0;c=this._push(c,u?i:r,u?e:p,u?m:e,h,S),f=u?r:i,u?m=e:p=e,g=h[d],_=h[d+1],v=h[d+2],y=h[d+3],b=h[d+4],x=h[d+5];continue}if(c===0)break;c--;let e=c*3,n=c*6;f=this._stackI[e],p=this._stackI[e+1],m=this._stackI[e+2],g=this._stackB[n],_=this._stackB[n+1],v=this._stackB[n+2],y=this._stackB[n+3],b=this._stackB[n+4],x=this._stackB[n+5]}return{data:a.subarray(0,i),nodeCount:r}}_push(e,t,n,r,i,a){e>=this._stackFrames&&this._ensureStack(this._stackFrames*2);let o=e*3,s=e*6;this._stackI[o]=t,this._stackI[o+1]=n,this._stackI[o+2]=r;for(let e=0;e<6;e++)this._stackB[s+e]=i[a+e];return e+1}_ensureStack(e){if(this._stackFrames>=e)return;let t=new Int32Array(e*3),n=new Float64Array(e*6);this._stackI&&(t.set(this._stackI),n.set(this._stackB)),this._stackI=t,this._stackB=n,this._stackFrames=e}static fillLeaves(t,n,r){let i=r.world,a=r.sourceMesh,o=r.tplBlasOffset,s=r.visible,c=r.tlasLeafIndex,d=u(t);for(let r=0;r<n;r++){let n=r*16;if(d[n+3]!==l.BLAS_POINTER_LEAF)continue;let u=d[n+1]&1073741823;d[n]=o[a[u]],t[n+2]=+!!s[u],e.writeLeafMatrix(t,d,n,i,u),c[u]=r}}static writeLeafMatrix(e,t,n,r,i){let a=_;m(r,i*16,a),e[n+4]=a[0],e[n+5]=a[4],e[n+6]=a[8],e[n+7]=a[12],e[n+8]=a[1],e[n+9]=a[5],e[n+10]=a[9],e[n+11]=a[13],e[n+12]=a[2],e[n+13]=a[6],e[n+14]=a[10],e[n+15]=a[14],t[n+1]=(i|(h(r,i*16)?1073741824:0))>>>0}_partition(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=0;if(u===2)d=n+1;else if(u<=8)d=n+(u>>1),this._insertionSortRange(e,t,n,r,this._widestCentroidAxis(e,t,n,r));else{if(d=this._binnedSplit(e,t,n,r,i,a,o,s,c,l),d>n&&d<r)return d;if(d=this._sweepSplit(e,t,n,r,i,a,o,s,c,l),!(d>n&&d<r)){let f=s-i,p=c-a,m=l-o,h=p>f&&p>m?1:m>f?2:0;this._sortRange(e,t,n,r,h),d=n+(u>>1)}}let f=this._bounds;return this._rangeBounds(e,t,n,d,f,0),this._rangeBounds(e,t,d,r,f,6),d}_binnedSplit(e,t,n,r,i,a,o,s,c,l){let u=this._surfaceArea(i,a,o,s,c,l);if(!(u>0)||!isFinite(u))return n;let d=1/0,f=1/0,p=1/0,m=-1/0,h=-1/0,_=-1/0;for(let i=n;i<r;i++){let n=t[i]*6,r=(e[n]+e[n+3])*.5,a=(e[n+1]+e[n+4])*.5,o=(e[n+2]+e[n+5])*.5;r<d&&(d=r),r>m&&(m=r),a<f&&(f=a),a>h&&(h=a),o<p&&(p=o),o>_&&(_=o)}let v=this._extent,y=this._cMin;v[0]=m-d,v[1]=h-f,v[2]=_-p,y[0]=d,y[1]=f,y[2]=p;let b=1/0,x=-1,S=-1,C=this._binCounts,w=this._binBounds,T=v[0]>1e-12,E=v[1]>1e-12,D=v[2]>1e-12;if(!T&&!E&&!D)return n;let O=g(r-n),k=T?O/v[0]:0,A=E?O/v[1]:0,j=D?O/v[2]:0;C.fill(0,0,O*3);for(let e=0;e<O*3;e++){let t=e*6;w[t]=w[t+1]=w[t+2]=1/0,w[t+3]=w[t+4]=w[t+5]=-1/0}for(let i=n;i<r;i++){let n=t[i]*6,r=e[n],a=e[n+1],o=e[n+2],s=e[n+3],c=e[n+4],l=e[n+5];for(let e=0;e<3;e++){let t=e===0?k:e===1?A:j;if(t===0)continue;let n=((e===0?(r+s)*.5:e===1?(a+c)*.5:(o+l)*.5)-y[e])*t|0;n<0?n=0:n>=O&&(n=O-1),n+=e*O,C[n]++;let i=n*6;r<w[i]&&(w[i]=r),a<w[i+1]&&(w[i+1]=a),o<w[i+2]&&(w[i+2]=o),s>w[i+3]&&(w[i+3]=s),c>w[i+4]&&(w[i+4]=c),l>w[i+5]&&(w[i+5]=l)}}for(let e=0;e<3;e++){if(!(v[e]>1e-12))continue;let t=e*O,n=this._binSuffix,r=this._binSuffixCount,i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0,d=0;for(let e=O-1;e>=1;e--){let u=(t+e)*6;w[u]<i&&(i=w[u]),w[u+1]<a&&(a=w[u+1]),w[u+2]<o&&(o=w[u+2]),w[u+3]>s&&(s=w[u+3]),w[u+4]>c&&(c=w[u+4]),w[u+5]>l&&(l=w[u+5]),d+=C[t+e],n[e]=d?this._surfaceArea(i,a,o,s,c,l):0,r[e]=d}let f=1/0,p=1/0,m=1/0,h=-1/0,g=-1/0,_=-1/0,y=0;for(let i=1;i<O;i++){let a=(t+i-1)*6;if(w[a]<f&&(f=w[a]),w[a+1]<p&&(p=w[a+1]),w[a+2]<m&&(m=w[a+2]),w[a+3]>h&&(h=w[a+3]),w[a+4]>g&&(g=w[a+4]),w[a+5]>_&&(_=w[a+5]),y+=C[t+i-1],y===0||r[i]===0)continue;let o=1+(this._surfaceArea(f,p,m,h,g,_)*y+n[i]*r[i])/u;o<b&&(b=o,x=e,S=i)}}if(x<0)return n;let M=O/v[x],N=y[x],P=this._bounds;P[0]=P[1]=P[2]=P[6]=P[7]=P[8]=1/0,P[3]=P[4]=P[5]=P[9]=P[10]=P[11]=-1/0;let F=n,I=r-1;for(;F<=I;){let n=t[F]*6,r=((e[n+x]+e[n+3+x])*.5-N)*M|0;r<0?r=0:r>=O&&(r=O-1);let i=r<S?0:6;if(e[n]<P[i]&&(P[i]=e[n]),e[n+1]<P[i+1]&&(P[i+1]=e[n+1]),e[n+2]<P[i+2]&&(P[i+2]=e[n+2]),e[n+3]>P[i+3]&&(P[i+3]=e[n+3]),e[n+4]>P[i+4]&&(P[i+4]=e[n+4]),e[n+5]>P[i+5]&&(P[i+5]=e[n+5]),i===0)F++;else{let e=t[F];t[F]=t[I],t[I]=e,I--}}return F}_sweepSplit(e,t,n,r,i,a,o,s,c,l){let u=r-n,d=this._surfaceArea(i,a,o,s,c,l);if(!(d>0)||!isFinite(d))return n;let f=this._suffixBuffer(u),p=1/0,m=-1,h=-1;for(let i=0;i<3;i++){this._sortRange(e,t,n,r,i);let a=1/0,o=1/0,s=1/0,c=-1/0,l=-1/0,g=-1/0;for(let r=u-1;r>=1;r--){let i=t[n+r]*6;e[i]<a&&(a=e[i]),e[i+1]<o&&(o=e[i+1]),e[i+2]<s&&(s=e[i+2]),e[i+3]>c&&(c=e[i+3]),e[i+4]>l&&(l=e[i+4]),e[i+5]>g&&(g=e[i+5]);let u=r*6;f[u]=a,f[u+1]=o,f[u+2]=s,f[u+3]=c,f[u+4]=l,f[u+5]=g}let _=1/0,v=1/0,y=1/0,b=-1/0,x=-1/0,S=-1/0;for(let r=1;r<u;r++){let a=t[n+r-1]*6;e[a]<_&&(_=e[a]),e[a+1]<v&&(v=e[a+1]),e[a+2]<y&&(y=e[a+2]),e[a+3]>b&&(b=e[a+3]),e[a+4]>x&&(x=e[a+4]),e[a+5]>S&&(S=e[a+5]);let o=r*6,s=this._surfaceArea(_,v,y,b,x,S),c=this._surfaceArea(f[o],f[o+1],f[o+2],f[o+3],f[o+4],f[o+5]),l=1+(s*r+c*(u-r))/d;l<p&&(p=l,m=i,h=r)}}return m<0||h<=0?n:(m!==2&&this._sortRange(e,t,n,r,m),n+h)}_widestCentroidAxis(e,t,n,r){let i=1/0,a=1/0,o=1/0,s=-1/0,c=-1/0,l=-1/0;for(let u=n;u<r;u++){let n=t[u]*6,r=(e[n]+e[n+3])*.5,d=(e[n+1]+e[n+4])*.5,f=(e[n+2]+e[n+5])*.5;r<i&&(i=r),r>s&&(s=r),d<a&&(a=d),d>c&&(c=d),f<o&&(o=f),f>l&&(l=f)}let u=s-i,d=c-a,f=l-o;return d>u&&d>f?1:f>u?2:0}_insertionSortRange(e,t,n,r,i){let a=i,o=3+i;for(let i=n+1;i<r;i++){let r=t[i],s=e[r*6+a]+e[r*6+o],c=i-1;for(;c>=n&&e[t[c]*6+a]+e[t[c]*6+o]>s;)t[c+1]=t[c],c--;t[c+1]=r}}_sortRange(e,t,n,r,i){let a=r-n,o=this._sortScratch;o.length=a;for(let e=0;e<a;e++)o[e]=t[n+e];let s=i,c=3+i;o.sort((t,n)=>e[t*6+s]+e[t*6+c]-(e[n*6+s]+e[n*6+c]));for(let e=0;e<a;e++)t[n+e]=o[e]}_suffixBuffer(e){let t=e*6;return(!this._suffix||this._suffix.length<t)&&(this._suffix=new Float64Array(t)),this._suffix}_rangeBounds(e,t,n,r,i,a){let o=1/0,s=1/0,c=1/0,l=-1/0,u=-1/0,d=-1/0;for(let i=n;i<r;i++){let n=t[i]*6;e[n]<o&&(o=e[n]),e[n+1]<s&&(s=e[n+1]),e[n+2]<c&&(c=e[n+2]),e[n+3]>l&&(l=e[n+3]),e[n+4]>u&&(u=e[n+4]),e[n+5]>d&&(d=e[n+5])}i[a]=o,i[a+1]=s,i[a+2]=c,i[a+3]=l,i[a+4]=u,i[a+5]=d}_surfaceArea(e,t,n,r,i,a){let o=r-e,s=i-t,c=a-n;return 2*(o*s+s*c+c*o)}};const y={silent:0,error:1,warn:2,info:3,debug:4},b=`info`,x=`rayzeeLogLevel`,S=`rayzeeLogNamespaces`,C=`color:#7c8494`,w=`color:inherit`;let T=null,E=null;function D(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function O(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function k(){if(T!==null)return T;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in y?(T=y[e],T):(T=y[D(x)]??y[b],T)}function A(){if(E!==null)return E;let e=globalThis.__RAYZEE_LOG_NS__??D(S);return E=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],E}function j(e,t){if(t<y.debug)return!0;let n=A();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function M(e,t,n){if(e>k()||!j(t,e))return;let r=e===y.error?console.error:e===y.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,C,w,...n.slice(1)):r(`%c${i}`,C,...n)}const N={n:e=>Number(e).toLocaleString(`en-US`),ms:e=>e<10?`${Number(e).toFixed(1)} ms`:`${Math.round(e)} ms`,mb:e=>{let t=e/(1024*1024);return t<10?`${t.toFixed(1)} MB`:`${Math.round(t)} MB`},px:(e,t)=>`${e}×${t}`,count:(e,t,n=`${t}s`)=>`${N.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},P={levels:y,setLevel(e){return e in y?(globalThis.__RAYZEE_LOG_LEVEL__=e,T=y[e],O(x,e===b?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(y).join(`, `)}`),this.getLevel())},getLevel(){let e=k();return Object.keys(y).find(t=>y[t]===e)},isEnabled(e){return(y[e]??y.debug)<=k()},only(...e){let t=e.flat().filter(Boolean);return E=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),O(S,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return T=null,E=null,this.getLevel()}};function F(e){return{namespace:e,error:(...t)=>M(y.error,e,t),warn:(...t)=>M(y.warn,e,t),info:(...t)=>M(y.info,e,t),debug:(...t)=>M(y.debug,e,t),isEnabled:e=>P.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){M(y.info,e,[t]),r.forEach(t=>M(y.debug,e,[t]));return}y.info>k()||((k()>=y.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,C,w),r.forEach(e=>console.log(e)),console.groupEnd())}}}function I(e){e&&e in y&&(globalThis.__RAYZEE_LOG_LEVEL__=e,T=y[e])}const L=F(`bvh`);self.onmessage=function(e){let{aabbs:t,count:n,logLevel:r}=e.data;I(r);try{let e=performance.now(),{data:r,nodeCount:i}=new v().buildStructure(new Float64Array(t),n);L.debug(`TLAS ${N.n(i)} nodes in ${N.ms(performance.now()-e)}`),self.postMessage({tlasData:r,nodeCount:i},[r.buffer])}catch(e){L.error(`TLAS build failed:`,e),self.postMessage({error:e.message})}};",Xh=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Yh],{type:`text/javascript;charset=utf-8`});function Zh(e){let t;try{if(t=Xh&&(self.URL||self.webkitURL).createObjectURL(Xh),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Yh),{type:`module`,name:e?.name})}}rn(),Js();var Qh=5e4,$h=2e5,eg=2e6,tg=1<<19,ng=4e7,rg=1.5*1024**3,ig=256*1024*1024,ag=Wt(`scene`),og=e=>Array.isArray(e)?e:[e],sg=e=>og(e).reduce((e,t)=>e+t.byteLength,0),cg=64*1024*1024;async function lg(e,t,n){for(let r of og(n))await e.writeAt(t,r),t+=r.byteLength}function ug(e){let t=0;return e.traverse(e=>{let n=e.isMesh?e.geometry:null;n&&(t=Math.max(t,Math.ceil((n.index?n.index.count:n.attributes.position?.count??0)/3)))}),t}var dg=class{constructor(e={}){this.config={useWorkers:!0,bvhDepth:30,maxLeafSize:4,verbose:!1,useFloat32Array:!0,textureQuality:`adaptive`,maxTextureSize:xt.DEFAULT_MAX_TEXTURE_SIZE,enableTextureCache:!0,maxConcurrentTextureTasks:Math.min(navigator.hardwareConcurrency||4,6),maxSceneBytes:Bm,enableTreeletOptimization:!1,treeletSize:7,treeletOptimizationPasses:1,treeletMinImprovement:.01,treeletComplexityThreshold:5e4,sceneCache:!0,sceneCacheMinBuildMs:Uh,...e},this.triangleData=null,this.triangleFloats=null,this.triangleCount=0,this.materials=[],this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.roughnessMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this.spheres=[],this.bvhRoot=null,this.bvh=null,this.bvhData=null,this.bvhIndexChunks=null,this.bvhIndex=null,this.materialData=null,this.instanceTable=null,this._refitWorker=null,this._refitSharedBuffers=null,this._rebuildGeneration=0,this._pendingRebuilds=new Map,this.srgbBucketTextures=null,this.linearBucketTextures=null,this.emissiveTriangleData=null,this.emissiveTriangleCount=0,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this._initProcessors(),this.isProcessing=!1,this.processingStage=null,this.memory=new Gm,this.memoryPreflight=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,blasBuildTime:0,blasWorkerTime:0,tlasBuildTime:0,bvhAssembleTime:0,totalProcessingTime:0}}setMaxTextureSize(e){return this.config.maxTextureSize=e,this.textureCreator?.setMaxTextureSize(e)}_initProcessors(){this.geometryExtractor=new Rr({issues:this.config.issues}),this.bvhBuilder=new Rp,this.bvhBuilder.maxLeafSize=this.config.maxLeafSize,this.bvhBuilder.setTreeletConfig({enabled:this.config.enableTreeletOptimization,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold}),this.textureCreator=new ph({maxTextureSize:this.config.maxTextureSize,issues:this.config.issues}),this.emissiveTriangleBuilder=new xh,this.tlasBuilder=new Nm,this._tlasWorker=null,this._tlasWorkerFailed=!1}_log(e,t){t===void 0?ag.debug(e):ag.debug(e,t)}_preflightMemory(e){let t=this.config.maxSceneBytes??9663676416,n=this.geometryExtractor.surveyScene(e),r=Um(n);if(this._progressive&&(r.total-=r.bvh),this._streaming){let t=rg+ug(e)*(st.FLOATS_PER_TRIANGLE*4+44);r.total-=Math.max(0,r.triangles-t)}let i={...n,estimate:r,safeBytes:zm,maxBytes:t,fits:r.total<=zm};if(this.memoryPreflight=i,r.total<1610612736)return i;if(ag.debug(J.list([`memory preflight: ${J.mb(r.total)} estimated`,`triangles ${J.mb(r.triangles)} · bvh ${J.mb(r.bvh)} · geometry ${J.mb(r.geometry)}`,`${J.n(n.triangles)} tris · ${J.n(n.placements)} placements`])),r.total>t){let e=`Scene needs about ${J.mb(r.total)} of CPU memory, past the ${J.mb(t)} a browser tab can hold — loading it would crash the tab rather than fail. Reduce the scene (it has ${J.n(n.triangles)} triangles), or raise maxSceneBytes to try anyway.`;throw this.config.issues?.record(Y.SCENE_MEMORY_BUDGET,e,{...n,estimate:r,maxBytes:t}),Error(e)}return i.fits||this.config.issues?.warn(Y.SCENE_MEMORY_BUDGET,`Scene needs about ${J.mb(r.total)} of CPU memory, above the ${J.mb(zm)} a fresh browser session can usually place. It may still load, but a long-running session will probably fail during BVH assembly; restarting the browser recovers the address space.`,{...n,estimate:r,safeBytes:zm}),i}_checkAssemblyHeadroom(e){let t=e*64;if(t<1610612736)return!0;let n=Wm(Math.ceil(t*Vm),{shared:Cn});return this.memoryPreflight&&(this.memoryPreflight.assemblyProbed=n.placed),n.exhausted&&this.config.issues?.warn(Y.SCENE_MEMORY_BUDGET,`BVH assembly needs ${J.mb(t)} but only ${J.mb(n.placed)} could be allocated. Restarting the browser usually recovers the address space.`,{totalNodes:e,need:t,placeable:n.placed}),!n.exhausted}_liveMemoryParts(){let e=this.instanceTable,t={triangles:this.triangles?.byteLength??0,bvh:this.bvh?.byteLength??0,geometry:this._geometryBytes??this.memoryPreflight?.geometryBytes??0,placements:e?.world?.byteLength??0,blasScratch:0,orderMaps:0};if(e){for(let n of e.blasData.values())t.blasScratch+=n?sg(n):0;for(let n of e.bvhToOriginal.values())t.orderMaps+=n?.byteLength??0;for(let n of e.originalToBvhMap.values())t.orderMaps+=n?.byteLength??0}return t}sceneBounds(){if(!this.bvh||this.bvh.recordCount===0)return null;let e=this.bvh.chunkFor(0),t=this.bvh.baseOf(0),n=[],r=[];for(let i=0;i<3;i++)n.push(Math.min(e[t+i],e[t+8+i])),r.push(Math.max(e[t+4+i],e[t+12+i]));return{min:n,max:r}}_sampleMemory(e){this.memory.sample(e,this._liveMemoryParts())}_logMemoryReport(){let{allocatedBytes:e,peakLiveBytes:t,byPhase:n}=this.memory;if(e===0)return;let r=Object.keys(n).filter(e=>n[e].allocated>0).map(e=>`${e} ${J.mb(n[e].allocated)}`),i=this.memoryPreflight?.estimate?.total;ag.debug(J.list([`memory: peak live ${J.mb(t)}`,`allocated ${J.mb(e)}`,i?`predicted ${J.mb(i)}`:null,r.join(` · `)]))}async buildBVH(e,{sceneKey:t=null,progressive:n=null}={}){if(this.isProcessing)throw Error(`Already processing a scene. Call dispose() first.`);this.isProcessing=!0,this.processingStage=`init`,this.memory.reset(),this._geometryBytes=0,Tn(e=>this.memory.alloc(e));let r=new Sh(e.name??``,{namespace:`scene`});try{this._reset(),this._sceneKey=t,this._blasKey=null,this._blasRestored=!1,this._progressive=n?.storage&&n.uploader?n:null;let i=this.geometryExtractor._countStoredTriangles(e);this._streaming=!!this._progressive&&i>Math.floor(67108864/(st.FLOATS_PER_TRIANGLE*4)),this._foldLeaves=i>ng,this.bvhBuilder.foldLeaves=this._foldLeaves,this._log(`Starting scene processing`),this.memory.mark(`preflight`),this._preflightMemory(e),this.processingStage=`extraction`,this.memory.mark(`extraction`),r.start(`Geometry extraction`),this._streaming?await this._extractStreaming(e):await this._extractGeometry(e),r.end(`Geometry extraction`),this.performanceMetrics.geometryExtractionTime=r.getDuration(`Geometry extraction`),this._geometryBytes=Mr(e),this._sampleMemory(`after extraction`),this.processingStage=`bvh`,r.start(`BVH construction (worker)`),r.start(`Material textures (parallel)`);let a=!1,o=this._buildBVH().then(()=>r.end(`BVH construction (worker)`)),s=this._createMaterialTextures().then(()=>{r.end(`Material textures (parallel)`),a=!0});return await o,H({status:`Building light data...`,progress:77}),r.start(`Emissive extraction + Light BVH`),this._buildEmissiveData(),r.end(`Emissive extraction + Light BVH`),a||H({status:`Processing material textures...`,progress:80}),await s,this.performanceMetrics.bvhBuildTime=r.getDuration(`BVH construction (worker)`),this.performanceMetrics.textureCreationTime=r.getDuration(`Material textures (parallel)`),this.processingStage=`finalize`,r.start(`BVH data packing`),this.bvhRoot&&!this.bvh&&this._setBVHData(this.textureCreator.createBVHRawData(this.bvhRoot)),r.end(`BVH data packing`),this.spheres=this._createSpheres(),this.performanceMetrics.totalProcessingTime=performance.now()-r.totalStart,r.print(),this.processingStage=`complete`,await this._restoreGeometry(e),H({status:`Scene data ready`,progress:85}),this._blasKey&&!this._blasRestored&&this.performanceMetrics.totalProcessingTime>=this.config.sceneCacheMinBuildMs&&(this._blasStoring=this._storeBLASes(e.name??``).catch(e=>ag.debug(`storing BLASes failed:`,e))),this}catch(e){throw this.processingStage=`error`,ag.error(`processing failed:`,e),H({status:`Error: ${e.message}`,failed:!0,progress:100}),e}finally{this._disposeGeometrySpill(),Tn(null),this._sampleMemory(`at ${this.processingStage}`),this._logMemoryReport(),this.isProcessing=!1}}async _extractGeometry(e){H({isLoading:!0,title:`Processing`,status:`Extracting geometry...`,progress:15}),await new Promise(e=>setTimeout(e,0)),this._log(`Extracting geometry`);let t=performance.now();try{this._adoptExtraction(this.geometryExtractor.extract(e));let n=performance.now()-t;this._log(`Geometry extraction complete (${n.toFixed(2)}ms)`,{triangleCount:this.triangleCount,materials:this.materials.length}),H({status:`Extracted ${this.triangleCount.toLocaleString()} triangles`,progress:25})}catch(e){throw ag.error(`geometry extraction failed:`,e),H({status:`Extraction error: ${e.message}`,failed:!0,progress:25}),e}}async _extractStreaming(e){H({isLoading:!0,title:`Processing`,status:`Extracting geometry and building BVHs...`,progress:15}),await new Promise(e=>setTimeout(e,0));let t=performance.now(),n=this.geometryExtractor,{storage:r,uploader:i}=this._progressive,a=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,o=n._countStoredTriangles(e),s=Dn.lazy(o,st.FLOATS_PER_TRIANGLE,Uint32Array),c=s.recordsPerChunk*s.lanesPerRecord*4,l=await _r.create(r,`${a}:tri`,c,{label:`Triangle records`,expectedBytes:o*c/s.recordsPerChunk}),u=l&&await _r.create(r,`${a}:blas`,0,{label:`BLAS nodes (while building)`});if(!u)return await l?.dispose(),this._streaming=!1,this._extractGeometry(e);let d=await Cr.create(r,`${a}:geo`,this.memoryPreflight?.geometryBytes??0);this._geometrySpill=d;let f={key:a,triStore:l,blasStore:u,bvhStore:null,blasBytes:0,blasAt:new Map,pending:[],extractedChunks:0,emitterChunks:new Set,isEmitter:e=>n._emissiveMaterial(e),uploadTriangles:null,chain:Promise.resolve(),error:null};this._spillStores=[l],this._blasKey=null;let p=new Map,m=this._blasWorkerOpts(),h=[],g=()=>new Promise(e=>h.push(e)),_=()=>{let e=h;h=[];for(let t of e)t()},v=null,y=(e,t,n)=>{let r=n.bvhData,i=new Float32Array(6);Tm.rootAABB(og(r)[0],v,t.start,t.count,i,0),p.set(e,{result:n,aabb:i});let a=f.blasBytes;f.blasBytes+=sg(r),f.blasAt.set(e,a),n.nodeCount=sg(r)/64,n.bvhData=null,this._queueSpill(f,()=>lg(u,a,r)),this._forEachChunk(v,t.start,t.count,e=>{--f.pending[e]===0&&e<f.extractedChunks&&this._finishTriangleChunk(f,e)}),_()},b=0,x=this._blasPool(m,()=>b++,(e,t,n)=>y(e,t,n)),S=Promise.resolve(),C=0,w=e=>{let t=e>=v.recordCount?v.chunks.length:Math.floor(e/v.recordsPerChunk);for(let e=f.extractedChunks;e<t;e++)f.pending[e]||this._finishTriangleChunk(f,e);f.extractedChunks=Math.max(f.extractedChunks,t)},T;try{if(T=await n.extractStreaming(e,{onStore:e=>{v=e,this._setTriangleData(e),f.uploadTriangles=i(e,`triangles`)},onRange:(e,t)=>{this._forEachChunk(v,t.start,t.count,e=>f.pending[e]=(f.pending[e]??0)+1),this._isLargeMesh(t)?(C++,S=S.then(async()=>{y(e,t,await this._buildLargeBLAS(t,m)),C--}),S.catch(e=>{f.error??=e,_()})):x.submit({m:e,range:t})},releaseGeometry:d?e=>d.add(e):null,pause:async e=>{for(w(e),d?.queuedBytes>ig&&await d.written(),H({status:`Extracted ${e.toLocaleString()} triangles, ${b.toLocaleString()} BVHs built...`,progress:15+Math.floor(20*e/Math.max(1,o))}),await new Promise(e=>setTimeout(e,0));v.byteLength>rg&&(x.pending>0||C>0)&&!f.error&&!x.error;)await Promise.race([g(),new Promise(e=>setTimeout(e,50))]);if(f.error||x.error)throw f.error??x.error}}),w(1/0),await Promise.all([x.close(),S]),await f.chain,f.error)throw f.error}catch(e){throw x.abort(e),ag.error(`streamed extraction failed:`,e),H({status:`Extraction error: ${e.message}`,failed:!0,progress:25}),e}this._adoptExtraction(T),this._streamed={state:f,templates:p},this._log(`Geometry extracted and ${p.size} BLASes built together (${(performance.now()-t).toFixed(0)}ms)`)}_adoptExtraction(e){if(this._setTriangleData(e.triangleData),this.geometryExtractor.releaseTriangles(),this.triangleCount=bt(e.triangleCount,`triangle count`),this._foldLeaves&&this.triangleCount>134217728)throw RangeError(`${this.triangleCount.toLocaleString()} triangles is past the ${vt.toLocaleString()} a folded BVH leaf can address`);this.expandedTriangleCount=e.expandedTriangleCount??e.triangleCount,this.instanceSource=e.instanceSource||null,this.instanceMatrices=e.instanceMatrices||null,this.instanceCount=e.instanceCount||0,this.bakeInverse=e.bakeInverse||null,this._log(`Using Float32Array format: ${this.triangleCount} triangles, ${(this.triangles.byteLength/(1024*1024)).toFixed(2)}MB`),this.materials=e.materials,this.materialTriangleCounts=e.materialTriangleCounts,this.meshes=e.meshes,this.meshTriangleRanges=e.meshTriangleRanges,this.maps=e.maps,this.normalMaps=e.normalMaps,this.bumpMaps=e.bumpMaps,this.roughnessMaps=e.roughnessMaps,this.metalnessMaps=e.metalnessMaps,this.emissiveMaps=e.emissiveMaps,this.displacementMaps=e.displacementMaps,this.anisotropyMaps=e.anisotropyMaps,this.transmissionMaps=e.transmissionMaps,this.clearcoatMaps=e.clearcoatMaps,this.clearcoatRoughnessMaps=e.clearcoatRoughnessMaps,this.sheenColorMaps=e.sheenColorMaps,this.sheenRoughnessMaps=e.sheenRoughnessMaps,this.iridescenceMaps=e.iridescenceMaps,this.iridescenceThicknessMaps=e.iridescenceThicknessMaps,this.specularIntensityMaps=e.specularIntensityMaps,this.specularColorMaps=e.specularColorMaps,this.directionalLights=e.directionalLights,this.cameras=e.cameras}async _buildBVH(){if(H({status:`Building BVH...`,progress:25}),this.triangleCount===0)throw Error(`No triangles to build BVH from`);this._log(`Building two-level BVH (TLAS/BLAS)`),this.memory.mark(`blas`);let e=performance.now();try{let t=this.meshTriangleRanges;if(!t||t.length===0)throw Error(`No mesh triangle ranges available for TLAS/BLAS build`);let n=this.instanceCount>0,r=n?this.instanceCount:t.length,i=this.instanceSource,a=n?this.instanceMatrices:null,o=e=>n?i[e]:e;this.instanceTable=new Tm,this.instanceTable.allocate(r,t.length,a,n?i:null),this.instanceTable.tplBakeInverse=this.bakeInverse;let s=this._streamed;this._streamed=null;let c=[],l=[],u=[],d=new Map,f=new Map;for(let e=0;e<r;e++){let n=t[o(e)];if(!n||n.count===0)continue;let r=f.get(n.start);if(r!==void 0){d.set(e,r);continue}f.set(n.start,e),s?u.push({m:e,range:n}):this._isLargeMesh(n)?l.push({m:e,range:n}):c.push({m:e,range:n})}let p=this._blasWorkerOpts(),m=c.length+l.length,h=0,g=()=>{h++,H({status:`Building BLAS ${h}/${m}...`,progress:25+Math.floor(h/m*45)})},_=[...c,...l].map(({m:e,range:t})=>({m:e,range:t,t:o(e),triOffset:t.start,triCount:t.count})).sort((e,t)=>e.t-t.t),v=s?null:await this._restoreBLASes(_,Nm.nodeCountFor(r),p),y=s?s.state:!v&&this._progressive&&this.triangles.chunks.length>1?await this._beginProgressiveSpill(_):null,b=y&&!s?(e,t,n)=>this._onBLASBuilt(y,o(e),t,n):null;if(s)for(let[e,t]of s.templates)this.instanceTable.tplObjectAABB.set(t.aabb,e*6);v&&(c.length=0,l.length=0,H({status:`Restored stored BVHs`,progress:68}));let x=v?Promise.resolve(v.results):s?Promise.resolve(u.map(({m:e,range:t})=>({m:e,range:t,result:s.templates.get(o(e)).result}))):this._buildBLASesWithPool(c,p,g,b),S=[],C=(async()=>{for(let{m:e,range:t}of l){let n=await this._buildLargeBLAS(t,p);b?.(e,t,n),S.push({m:e,range:t,result:n}),g()}})(),[w]=await Promise.all([x,C]);if(y&&(await y.chain,y.error))throw y.error;let T={sah:0,objMed:0,spatMed:0,failed:0,treeletsImproved:0,treeletsProcessed:0};for(let{m:e,range:t,result:r}of[...w,...S]){let i=r.splitStats;i&&(T.sah+=i.sahSplits??0,T.objMed+=i.objectMedianSplits??0,T.spatMed+=i.spatialMedianSplits??0,T.failed+=i.failedSplits??0,T.treeletsImproved+=i.treeletsImproved??0,T.treeletsProcessed+=i.treeletsProcessed??0,this.performanceMetrics.blasWorkerTime+=i.totalBuildTime??0),this.instanceTable.setEntry({meshIndex:e,blasNodeCount:r.nodeCount??sg(r.bvhData)/64,triOffset:t.start,triCount:t.count,originalToBvhMap:r.originalToBvh||null,bvhData:r.bvhData,matrixWorld:n?a:this.meshes?.[e]?.matrixWorld?.elements??null,matrixOffset:n?e*16:0,expandedStart:t.expandedStart,sourceMesh:o(e)})}for(let[e,r]of d)this.instanceTable.setAlias(e,r,n?a:this.meshes?.[e]?.matrixWorld?.elements??null,t[o(e)].expandedStart,o(e),n?e*16:0);H({status:`Built all BLASes`,progress:70}),this.performanceMetrics.blasBuildTime=performance.now()-e,H({status:`Building TLAS...`,progress:72}),this._sampleMemory(`BLASes built`),this.memory.mark(`tlas`);let E=performance.now(),D=this.instanceTable;this.instanceTable.computeAABBs(this.triangles,{owners:!y}),this.instanceTable.assignOffsets(Nm.nodeCountFor(D.count));let O=this.instanceTable.totalNodeCount,k=await this._buildTLAS(D);this.performanceMetrics.tlasBuildTime=performance.now()-E,this.memory.mark(`assemble`);let A=performance.now();y||this._checkAssemblyHeadroom(O),this._setBVHData(Dn.lazy(O,16,Float32Array,void 0,Cn));let j=y?await this._beginBVHSpill(y,D.tlasNodeCount):null;this.bvh.setRecords(0,k),k=null,this.tlasBuilder.releaseFlattenBuffer();let M=Math.max(1,Math.ceil(D.templateCount/32));if(v){try{let e=performance.now();await jh(v.nodes,this.bvh,D.tlasNodeCount,O-D.tlasNodeCount),this.performanceMetrics.blasRestore.readMs=performance.now()-e}finally{v.release()}D.blasData.clear()}else{for(let e=0;e<D.templateCount;e++){let t=y?await this._readSpilledBLAS(y,e):D.blasData.get(e);if(!t)continue;let n=D.tplBlasOffset[e],r=n;for(let e of og(t))this.bvh.setRecords(r,e),r+=e.length/16;this._offsetBLASInPlace(n,r-n,n,D.tplTriOffset[e]),D.blasData.delete(e),await j?.(r),e%M===0&&this._sampleMemory(`assembling ${e}/${D.templateCount}`)}await j?.(O,!0),y&&await y.blasStore.dispose()}if(this._setBVHData(this.bvh.materializeAll()),v)for(let[e,t]of v.orders)D.bvhToOriginal.set(e,t);else this._buildBvhToOriginalMaps();this.performanceMetrics.bvhAssembleTime=performance.now()-A,D.originalToBvhMap.clear(),D.blasData.clear(),this.bvhRoot=!0,this._disposeRefitWorker();let N=performance.now()-e;ag.debug(J.list([`${J.n(D.setCount)} BLASes + TLAS`,`${J.n(this.bvh.recordCount)} nodes`,`SAH ${J.n(T.sah)} · objMed ${T.objMed} · spatMed ${T.spatMed} · failed ${T.failed}`,T.treeletsProcessed?`treelets ${T.treeletsImproved}/${T.treeletsProcessed} improved`:null,J.ms(N)])),H({status:`BVH construction complete`,progress:75})}catch(e){throw ag.error(`BVH build failed:`,e),H({status:`BVH error: ${e.message}`,failed:!0,progress:75}),e}}_blasWorkerOpts(){return{depth:this.config.bvhDepth,treeletOptimization:{enabled:this.config.enableTreeletOptimization!==!1,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold},reinsertionOptimization:{enabled:this.bvhBuilder.enableReinsertionOptimization,batchSizeRatio:this.bvhBuilder.reinsertionBatchSizeRatio,maxIterations:this.bvhBuilder.reinsertionMaxIterations},maxLeafSize:this.bvhBuilder.maxLeafSize,foldLeaves:this._foldLeaves===!0,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,logLevel:Kt()}}_isLargeMesh(e){return e.count>=$h&&_m(e.count)}async _buildLargeBLAS(e,t){if(e.count>eg)return this._buildSplitBLAS(e,t);let n=new Uint32Array(new SharedArrayBuffer(e.count*this.triangles.lanesPerRecord*4));this.triangles.readRecords(e.start,e.count,n),this.triangles.release(e.start,e.count);let r=await mm(n,this.config.bvhDepth,null,t);return r.reorderedTriangles?(this.triangles.setRecords(e.start,r.reorderedTriangles),delete r.reorderedTriangles):r.order&&(this._writeInOrder(e.start,r.triangles,r.order),delete r.order,delete r.triangles),r}async _buildSplitBLAS(e,t){let n=this.triangles,{order:r,pieces:i,tree:a}=await Lh(n,e.start,e.count,tg,{pause:()=>new Promise(e=>setTimeout(e,0))}),o=this._blasPool(t,null,null,Math.min(navigator.hardwareConcurrency||4,8));i.forEach((t,n)=>o.submit({m:n,range:{start:e.start+t.start,count:t.count}}));let s=[],c={};for(let{m:e,range:t,result:r}of await o.close()){r.aabb=new Float32Array(6),Tm.rootAABB(r.bvhData,n,t.start,t.count,r.aabb,0),s[e]=r;for(let[e,t]of Object.entries(r.splitStats??{}))typeof t==`number`&&(c[e]=(c[e]??0)+t)}return{...Vh(a,i,s,r),splitStats:c}}_blasCacheKey(e){let t={...e};delete t.logLevel;let n=typeof navigator<`u`?navigator.hardwareConcurrency:0;return`blas:2:${Hh}:${JSON.stringify(t)}:${n}:${this._sceneKey}`}async _restoreBLASes(e,t,n){if(!this._sceneKey||this.config.sceneCache===!1)return null;let r=Pu(Ks().cacheNamespace);if(!r)return null;this._blasKey=this._blasCacheKey(n);let i=await kh(r,this._blasKey);if(!i)return null;let a=e=>(ag.debug(`stored BLASes not used: ${e}`),i.release(),null),{index:o}=i;if(o.tlasNodeCount!==t||o.templates.length!==e.length)return a(`layout changed`);let s=t;for(let t=0;t<e.length;t++){let[n,r,i,c,l]=o.templates[t],u=e[t];if(u.t!==n||u.triOffset!==r||u.triCount!==i||l!==s)return a(`layout changed`);s+=c}if(s!==o.totalNodes)return a(`layout changed`);let c=performance.now(),l=await Oh(this.triangles,e);for(let t=0;t<e.length;t++)if(l[t]!==o.templates[t][6])return a(`triangles changed`);let u=performance.now();try{let t=new Map,n=[];for(let r=0;r<e.length;r++){let[a,s,c,l,,u,,d]=o.templates[r],f=await Mh(i.order,u,c);this._permuteRange(s,c,f),t.set(a,f),n.push({m:e[r].m,range:e[r].range,result:{bvhData:new Float32Array(Uint32Array.from(d).buffer),originalToBvh:null,nodeCount:l}})}return this._blasRestored=!0,this.performanceMetrics.blasRestore={checksumMs:u-c,permuteMs:performance.now()-u},ag.debug(`restored ${J.n(e.length)} stored BLASes`),{results:n,orders:t,nodes:i.nodes,release:i.release}}catch(e){throw i.release(),e}}_writeInOrder(e,t,n){let r=this.triangles,i=r.lanesPerRecord;for(let a=0,o=n.length;a<o;){let s=r.chunkFor(e+a),c=Math.min(o,(((e+a)/r.recordsPerChunk|0)+1)*r.recordsPerChunk-e);for(let o=r.baseOf(e+a);a<c;a++,o+=i){let e=n[a]*i;for(let n=0;n<i;n++)s[o+n]=t[e+n]}}}_permuteRange(e,t,n){let r=!0;for(let e=0;e<t&&r;e++)r=n[e]===e;if(r)return;let i=this.triangles.lanesPerRecord,a=this.triangles.slice(e,t),o=new a.constructor(a.length);if(i===20)for(let e=0,r=0;e<t;e++,r+=20){let t=n[e]*20;o[r]=a[t],o[r+1]=a[t+1],o[r+2]=a[t+2],o[r+3]=a[t+3],o[r+4]=a[t+4],o[r+5]=a[t+5],o[r+6]=a[t+6],o[r+7]=a[t+7],o[r+8]=a[t+8],o[r+9]=a[t+9],o[r+10]=a[t+10],o[r+11]=a[t+11],o[r+12]=a[t+12],o[r+13]=a[t+13],o[r+14]=a[t+14],o[r+15]=a[t+15],o[r+16]=a[t+16],o[r+17]=a[t+17],o[r+18]=a[t+18],o[r+19]=a[t+19]}else for(let e=0;e<t;e++){let t=n[e]*i,r=e*i;for(let e=0;e<i;e++)o[r+e]=a[t+e]}this.triangles.setRecords(e,o)}async _storeBLASes(e){let t=Pu(Ks().cacheNamespace),n=this.instanceTable;if(!t||!n||!this.bvh)return!1;let r=this._blasKey,i=this._geometryVersion,a=()=>this._geometryVersion!==i||this._blasKey!==r,o=[];for(let e=0;e<n.templateCount;e++){let t=n.tplOwner[e];t<0||n.sourceMesh[t]!==e||o.push({t:e,triOffset:n.tplTriOffset[e],triCount:n.tplTriCount[e],nodeCount:n.tplNodeCount[e],blasOffset:n.tplBlasOffset[e]})}let s=await Oh(this.triangles,o);if(a())return!1;let c=e=>{let t=this.bvhIndexChunks.chunkFor(e),n=this.bvhIndexChunks.baseOf(e);return Array.from(t.subarray(n,n+16))},l=0,u=[],d=o.map((e,t)=>{u.push(n.bvhToOriginal.get(e.t)??Uint32Array.from({length:e.triCount},(e,t)=>t));let r=[e.t,e.triOffset,e.triCount,e.nodeCount,e.blasOffset,l,s[t],c(e.blasOffset)];return l+=e.triCount,r}),f=await Ah(t,r,{index:{v:2,tlasNodeCount:n.tlasNodeCount,totalNodes:n.totalNodeCount,templates:d},bvh:this.bvh,orders:u,isStale:a,label:e});return f&&ag.debug(`stored ${J.n(o.length)} BLASes for the next load`),f}async _beginProgressiveSpill(e){let{storage:t,uploader:n}=this._progressive,r=this.triangles,i=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,a=r.recordsPerChunk*r.lanesPerRecord*r.LaneType.BYTES_PER_ELEMENT,o=await _r.create(t,`${i}:tri`,a,{label:`Triangle records`,expectedBytes:r.byteLength}),s=o&&await _r.create(t,`${i}:blas`,0,{label:`BLAS nodes (while building)`});if(!s)return await o?.dispose(),null;let c={key:i,triStore:o,blasStore:s,bvhStore:null,blasBytes:0,blasAt:new Map,pending:new Int32Array(r.chunks.length),emitterChunks:new Set,isEmitter:e=>{let t=this.materials[e];return(t?.emissiveIntensity??0)>0&&!!t.emissive&&(t.emissive.r>0||t.emissive.g>0||t.emissive.b>0)},uploadTriangles:n(r,`triangles`),chain:Promise.resolve(),error:null};this._spillStores=[o],this._blasKey=null;for(let{triOffset:t,triCount:n}of e)this._forEachChunk(r,t,n,e=>c.pending[e]++);for(let e=0;e<r.chunks.length;e++)c.pending[e]===0&&this._finishTriangleChunk(c,e);return c}_forEachChunk(e,t,n,r){if(n<=0)return;let i=(t+n-1)/e.recordsPerChunk|0;for(let n=t/e.recordsPerChunk|0;n<=i;n++)r(n)}_onBLASBuilt(e,t,n,r){let i=this.instanceTable,a=r.bvhData;i.tplTriOffset[t]=n.start,i.tplTriCount[t]=n.count,i._readRootAABB(og(a)[0],t,this.triangles,i.tplObjectAABB,t*6);let o=e.blasBytes;e.blasBytes+=sg(a),e.blasAt.set(t,o),r.nodeCount=sg(a)/64,r.bvhData=null,this._queueSpill(e,()=>lg(e.blasStore,o,a)),this._forEachChunk(this.triangles,n.start,n.count,t=>{--e.pending[t]===0&&this._finishTriangleChunk(e,t)})}_queueSpill(e,t){e.chain=e.chain.then(t).catch(t=>{e.error??=t})}_finishTriangleChunk(e,t){this._queueSpill(e,async()=>{let n=this.triangles,r=n.chunks[t];if(!r)return;e.uploadTriangles(t);let i=n.lanesPerRecord;for(let n=st.MATERIAL_FLAGS_OFFSET;n<r.length;n+=i)if(e.isEmitter(r[n]&16777215)){e.emitterChunks.add(t);return}await n.spillChunk(t,e.triStore)})}async _readSpilledBLAS(e,t){let n=e.blasAt.get(t);if(n===void 0)return null;let r=this.instanceTable.tplNodeCount[t]*64,i=[];for(let t=0;t<r;t+=cg)i.push(new Float32Array(await e.blasStore.readAt(n+t,Math.min(cg,r-t))));return i}async _beginBVHSpill(e,t){let{storage:n,uploader:r}=this._progressive,i=this.bvh,a=i.recordsPerChunk*i.lanesPerRecord*i.LaneType.BYTES_PER_ELEMENT,o=await _r.create(n,`${e.key}:bvh`,a,{label:`BLAS nodes`,expectedBytes:i.recordCount*64}),s=r(i),c=Math.ceil(t/i.recordsPerChunk);o&&this._spillStores.push(o);let l=c;return async(e,t=!1)=>{for(;l<i.chunks.length&&(t||(l+1)*i.recordsPerChunk<=e);)i.chunks[l]||i._materialize(l),s(l),o&&await i.spillChunk(l,o),l++;if(t)for(let e=0;e<Math.min(c,i.chunks.length);e++)i.chunks[e]||i._materialize(e),s(e)}}_offsetBLASInPlace(e,t,n,r){let i=this.bvhIndexChunks;for(let a=e,o=e+t;a<o;){let e=i.chunkFor(a),t=Math.min(o,((a/i.recordsPerChunk|0)+1)*i.recordsPerChunk),s=i.baseOf(a);Tp(e,n,r,s,s+(t-a)*16),a=t}}_buildBLASesWithPool(e,t,n,r=null){let i=this._blasPool(t,n,r);for(let t of e)i.submit(t);return i.close()}_blasPool(e,t,n=null,r=this.config.maxConcurrentTextureTasks||4){let i=[],a=[],o=[],s=[],c=!1,l=0,u=0,d=null,f,p=new Promise((e,t)=>f={resolve:e,reject:t});p.catch(()=>{});let m=e=>{d||(d=e,o.forEach(e=>e.terminate()),f.reject(e))},h=()=>{d||!c||i.length>0||l>0||(o.forEach(e=>e.terminate()),f.resolve(a))},g=t=>{let n=i.shift();if(!n){s.push(t),h();return}let{m:r,range:a}=n;l++;try{let n=this.triangles.copyOf(a.start,a.count),i=a.count,o=i<=500?{...e.treeletOptimization,enabled:!1}:e.treeletOptimization;t._currentTask={m:r,range:a},t.postMessage({triangleData:n.buffer,triangleByteOffset:n.byteOffset,triangleByteLength:n.byteLength,triangleCount:i,depth:e.depth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:o,reinsertionOptimization:e.reinsertionOptimization,maxLeafSize:e.maxLeafSize,foldLeaves:e.foldLeaves,numBins:e.numBins,maxBins:e.maxBins,minBins:e.minBins,logLevel:e.logLevel},[n.buffer])}catch(e){m(e)}},_=(e,r)=>{let i=r.data;if(i.error){m(Error(i.error));return}if(i.progress!==void 0)return;let{m:o,range:s}=e._currentTask;l--;try{i.triangles&&this.triangles.setRecords(s.start,i.triangles);let e={bvhData:i.bvhData,originalToBvh:i.originalToBvh||null,splitStats:i.treeletStats||null};n?.(o,s,e),a.push({m:o,range:s,result:e})}catch(e){m(e);return}u++,t?.(u),g(e)},v=()=>{let e=new om;return e.onmessage=t=>_(e,t),e.onerror=e=>m(e),o.push(e),e};return{submit(e){if(!d){i.push(e);try{let e=s.pop()??(o.length<r?v():null);e&&g(e)}catch(e){m(e)}}},close(){return c=!0,h(),p},abort(e){m(e??Error(`BLAS pool aborted`))},get pending(){return i.length+l},get error(){return d}}}_buildBvhToOriginalMaps(){let e=this.instanceTable;for(let t=0;t<e.count;t++){if(!e.isSet[t]||!e.isOwner(t))continue;let n=e.sourceMesh[t],r=e.tplTriCount[n],i=e.originalToBvhMap.get(n),a=new Uint32Array(r);if(i)for(let e=0;e<r;e++)a[i[e]]=e;else for(let e=0;e<r;e++)a[e]=e;e.bvhToOriginal.set(n,a),e.originalToBvhMap.delete(n)}}async _createMaterialTextures(){this._log(`Creating material textures (parallel with BVH)`);try{let{srgbLists:e,linearLists:t,remap:n}=this._bucketTextures();this._remapMaterialTextureIndices(n),this.materials?.length&&(this.materialData=this.textureCreator.createMaterialRawData(this.materials));let i=(e,t)=>e.length===0?Promise.resolve(null):this.textureCreator.createTexturesToDataTexture(e,{srgbPool:t}).then(e=>(e&&t&&(e.colorSpace=r.SRGBColorSpace),e)),[a,o]=await Promise.all([Promise.all(e.map(e=>i(e,!0))),Promise.all(t.map(e=>i(e,!1)))]);this.srgbBucketTextures=a,this.linearBucketTextures=o,this._log(`Material textures complete`,{materialData:!!this.materialData,srgbBuckets:a.map(e=>e?`${e.image.width}x${e.image.height}x${e.image.depth}`:`-`).join(`,`),linearBuckets:o.map(e=>e?`${e.image.width}x${e.image.height}x${e.image.depth}`:`-`).join(`,`)})}catch(e){throw ag.error(`texture creation failed:`,e),e}}_bucketTextures(){let e=this.config.maxTextureSize,t=xt.MATERIAL_BUCKET_COUNT,n=xt.BUCKET_LAYER_STRIDE,r=e=>{let t=new Set,n=[];for(let r of e)for(let e of r||[]){if(!e?.image)continue;let r=e.source?.uuid??e.uuid;t.has(r)||(t.add(r),n.push({width:e.image.width,height:e.image.height}))}return n},i=[this.maps,this.emissiveMaps,this.sheenColorMaps,this.specularColorMaps],a=[this.normalMaps,this.bumpMaps,this.roughnessMaps,this.metalnessMaps,this.displacementMaps,this.anisotropyMaps,this.transmissionMaps,this.clearcoatMaps,this.clearcoatRoughnessMaps,this.sheenRoughnessMaps,this.iridescenceMaps,this.iridescenceThicknessMaps,this.specularIntensityMaps],o=At(r(i),e,t),s=At(r(a),e,t);this._srgbBucketShapes=o,this._linearBucketShapes=s;let c=Array.from({length:t},()=>[]),l=Array.from({length:t},()=>[]),u=Array.from({length:t},()=>new Map),d=Array.from({length:t},()=>new Map);this._srgbTexPacked=new Map,this._linearTexPacked=new Map;let f=!1,p=!1,m=(e,t,r,i,a)=>{if(!e)return-1;if(!e.image)return p||this.config.issues?.record(Y.TEXTURE_BUILD_FAILED,`a material map had not finished decoding when the scene was packed; it renders untextured`,{texture:e.name||e.source?.uuid||e.uuid}),p=!0,-1;let o=jt(e.image.width,e.image.height,a),s=e.source?.uuid??e.uuid,c=r[o].get(s);if(c!==void 0)return Mt(o,c);if(t[o].length>=n)return ag.warn(`texture bucket ${o} full (${n}); dropping a map`),f||this.config.issues?.record(Y.TEXTURE_LIMIT_EXCEEDED,`texture bucket ${o} full (${n} layers); the rest render untextured`,{bucket:o,limit:n}),f=!0,-1;t[o].push(e);let l=t[o].length-1;r[o].set(s,l);let u=Mt(o,l);return i.set(s,u),u},h=(e,t,n,r,i)=>(e||[]).map(e=>m(e,t,n,r,i));return{srgbLists:c,linearLists:l,remap:{albedo:h(this.maps,c,u,this._srgbTexPacked,o),emissive:h(this.emissiveMaps,c,u,this._srgbTexPacked,o),normal:h(this.normalMaps,l,d,this._linearTexPacked,s),bump:h(this.bumpMaps,l,d,this._linearTexPacked,s),roughness:h(this.roughnessMaps,l,d,this._linearTexPacked,s),metalness:h(this.metalnessMaps,l,d,this._linearTexPacked,s),displacement:h(this.displacementMaps,l,d,this._linearTexPacked,s),anisotropy:h(this.anisotropyMaps,l,d,this._linearTexPacked,s),transmission:h(this.transmissionMaps,l,d,this._linearTexPacked,s),clearcoat:h(this.clearcoatMaps,l,d,this._linearTexPacked,s),clearcoatRoughness:h(this.clearcoatRoughnessMaps,l,d,this._linearTexPacked,s),sheenColor:h(this.sheenColorMaps,c,u,this._srgbTexPacked,o),sheenRoughness:h(this.sheenRoughnessMaps,l,d,this._linearTexPacked,s),iridescence:h(this.iridescenceMaps,l,d,this._linearTexPacked,s),iridescenceThickness:h(this.iridescenceThicknessMaps,l,d,this._linearTexPacked,s),specularIntensity:h(this.specularIntensityMaps,l,d,this._linearTexPacked,s),specularColor:h(this.specularColorMaps,c,u,this._srgbTexPacked,o)}}}_remapMaterialTextureIndices(e){let t=(e,t)=>e>=0&&e<t.length?t[e]:-1;for(let n of this.materials)n.map=t(n.map,e.albedo),n.emissiveMap=t(n.emissiveMap,e.emissive),n.normalMap=t(n.normalMap,e.normal),n.bumpMap=t(n.bumpMap,e.bump),n.roughnessMap=t(n.roughnessMap,e.roughness),n.metalnessMap=t(n.metalnessMap,e.metalness),n.displacementMap=t(n.displacementMap,e.displacement),n.anisotropyMap=t(n.anisotropyMap,e.anisotropy),n.transmissionMap=t(n.transmissionMap,e.transmission),n.clearcoatMap=t(n.clearcoatMap,e.clearcoat),n.clearcoatRoughnessMap=t(n.clearcoatRoughnessMap,e.clearcoatRoughness),n.sheenColorMap=t(n.sheenColorMap,e.sheenColor),n.sheenRoughnessMap=t(n.sheenRoughnessMap,e.sheenRoughness),n.iridescenceMap=t(n.iridescenceMap,e.iridescence),n.iridescenceThicknessMap=t(n.iridescenceThicknessMap,e.iridescenceThickness),n.specularIntensityMap=t(n.specularIntensityMap,e.specularIntensity),n.specularColorMap=t(n.specularColorMap,e.specularColor)}_buildEmissiveData(){this.emissiveTriangleCount=this.emissiveTriangleBuilder.extractEmissiveTriangles(this.triangles,this.materials,this.triangleCount,this.instanceTable??null),this.emissiveTriangleData=this.emissiveTriangleBuilder.createEmissiveRawData(),this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower,this._log(`Emissive triangle extraction complete`,this.emissiveTriangleBuilder.getStats()),this.emissiveTriangleBuilder.buildLightBVH(),this.lightBVHNodeData=this.emissiveTriangleBuilder.lightBVHNodeData,this.lightBVHNodeCount=this.emissiveTriangleBuilder.lightBVHNodeCount,this.emissiveTriangleData=this.emissiveTriangleBuilder.emissiveTriangleData||this.emissiveTriangleData,this.emissiveBitTrailMap=this.emissiveTriangleBuilder.emissiveBitTrailMap,this.emissiveTriangleCount=this.emissiveTriangleBuilder.emissiveCount,this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower}_createSpheres(){return[]}_reset(){this._geometryVersion=(this._geometryVersion??0)+1,this._disposeSpill(),this._disposeGeometrySpill(),this._disposeTextures(),this.triangles=[],this._setTriangleData(null),this.triangleCount=0,this.materials=[],this.meshTriangleRanges=null,this.maps=[],this.normalMaps=[],this.bumpMaps=[],this.roughnessMaps=[],this.metalnessMaps=[],this.emissiveMaps=[],this.displacementMaps=[],this.anisotropyMaps=[],this.transmissionMaps=[],this.clearcoatMaps=[],this.clearcoatRoughnessMaps=[],this.sheenColorMaps=[],this.sheenRoughnessMaps=[],this.iridescenceMaps=[],this.iridescenceThicknessMaps=[],this.specularIntensityMaps=[],this.specularColorMaps=[],this.directionalLights=[],this.cameras=[],this.spheres=[],this.bvhRoot=null,this.bvh=null,this.bvhData=null,this.bvhIndexChunks=null,this.bvhIndex=null,this.instanceTable=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,blasBuildTime:0,blasWorkerTime:0,tlasBuildTime:0,bvhAssembleTime:0,totalProcessingTime:0}}_disposeTextures(){this._disposeBucketTextures()}_disposeBucketTextures(){for(let e of[`srgbBucketTextures`,`linearBucketTextures`]){let t=this[e];if(t){for(let n of t)if(n&&typeof n.dispose==`function`)try{n.dispose()}catch(t){ag.warn(`error disposing ${e}:`,t)}this[e]=null}}}async rebuildMaterials(e){if(this.isProcessing)throw Error(`Already processing. Cannot rebuild materials during processing.`);this._log(`Rebuilding materials and textures`);let t=performance.now();try{this.isProcessing=!0;let n=this.geometryExtractor.extractMaterialsOnly(e);this._disposeMaterialTextures(),this.materials=n.materials,this.meshes=n.meshes,this.maps=n.maps,this.normalMaps=n.normalMaps,this.bumpMaps=n.bumpMaps,this.roughnessMaps=n.roughnessMaps,this.metalnessMaps=n.metalnessMaps,this.emissiveMaps=n.emissiveMaps,this.displacementMaps=n.displacementMaps,await this._createMaterialTextures();let r=performance.now()-t;return this._log(`Material rebuild complete (${r.toFixed(2)}ms)`,{materials:this.materials.length,textures:this.maps.length}),this}catch(e){throw ag.error(`material rebuild failed:`,e),e}finally{this.isProcessing=!1}}_disposeMaterialTextures(){this._disposeBucketTextures(),this.textureCreator&&this.textureCreator.textureCache&&(this.textureCreator.textureCache.dispose(),this.textureCreator.textureCache=new this.textureCreator.textureCache.constructor)}getStatistics(){let e={triangleCount:this.triangleCount,materialCount:this.materials.length,textureCount:this.maps.length,lightCount:this.directionalLights.length,cameraCount:this.cameras.length,processingComplete:this.processingStage===`complete`,hasBVH:!!this.bvhRoot,hasTextures:!!this.materialData&&!!this.bvh,useFloat32Array:this.config.useFloat32Array,triangleDataSize:this.triangles?(this.triangles.byteLength/(1024*1024)).toFixed(2)+`MB`:`0MB`};return this.performanceMetrics.totalProcessingTime>0&&(e.performance={totalTime:this.performanceMetrics.totalProcessingTime,textureTime:this.performanceMetrics.textureCreationTime,bvhTime:this.performanceMetrics.bvhBuildTime,extractionTime:this.performanceMetrics.geometryExtractionTime,texturePercentage:(this.performanceMetrics.textureCreationTime/this.performanceMetrics.totalProcessingTime*100).toFixed(1)+`%`}),this.textureCreator&&this.textureCreator.capabilities&&(e.textureCapabilities=this.textureCreator.capabilities),e}updateConfig(e){Object.assign(this.config,e),this.bvhBuilder&&(this.bvhBuilder.maxLeafSize=this.config.maxLeafSize,this.bvhBuilder.setTreeletConfig({enabled:this.config.enableTreeletOptimization,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold})),this._log(`Configuration updated`,this.config)}_adoptSharedChunks(e,t){let n=this[e];if(n.shared)return;let r=n.chunks.map(e=>{let n=new t(new SharedArrayBuffer(e.byteLength));return n.set(e),n}),i=Dn.adopt(r,n.recordCount,n.lanesPerRecord,n.recordsPerChunk);e===`bvh`?this._setBVHData(i):this._setTriangleData(i)}_meshSource(e,t){if(e==null)return null;let n=this.instanceTable;if(typeof e==`function`)return r=>{let i=n.sourceMesh[r],a=e(i,n.triCountOf(r)),o=n.triCountOf(r)*9;if(a&&a.length!==o)throw Error(`SceneProcessor: ${t}s for mesh ${i} must be ${o} floats (${n.triCountOf(r)} triangles × 9), got ${a.length}.`);return a??null};let r=(this.expandedTriangleCount??this.triangleCount)*9;if(e.length!==r)throw Error(`SceneProcessor: expected ${r} ${t} floats (${r/9} triangles × 9, full scene), got ${e.length}. Pass a per-mesh callback instead to avoid building one array for the whole scene.`);return t=>{let r=n.expandedStartOf(t)*9;return e.subarray(r,r+n.triCountOf(t)*9)}}async refitBVH(e,t){if(this._geometryVersion=(this._geometryVersion??0)+1,!this.bvh||!this.triangles||!this.instanceTable)throw Error(`No BVH data available for refit. Run buildBVH() first.`);let n=this._meshSource(e,`position`),r=this._meshSource(t,`normal`);if(!n)throw Error(`SceneProcessor.refitBVH: positions are required.`);if(this._refitWorker||=new Jh,!this._refitSharedBuffers){this._adoptSharedChunks(`bvh`,Float32Array),this._adoptSharedChunks(`triangles`,Uint32Array);let e=this.bvh.chunks.map(e=>e.buffer),t=this.triangles.chunks.map(e=>e.buffer);this._refitSharedBuffers={bvhBufs:e,triBufs:t},this._refitWorker.postMessage({type:`init`,sharedBvhBufs:e,bvhRecordCount:this.bvh.recordCount,bvhRecordsPerChunk:this.bvh.recordsPerChunk,sharedTriBufs:t,triRecordCount:this.triangles.recordCount,triLanesPerRecord:this.triangles.lanesPerRecord,triRecordsPerChunk:this.triangles.recordsPerChunk})}let i=this.instanceTable;for(let e=0;e<i.count;e++){if(!i.isSet[e]||!i.isOwner(e))continue;let t=n(e);if(t&&(this._updateMeshTrianglePositions(e,t),r)){let t=r(e);t&&this._patchMeshSmoothNormals(e,t)}}return new Promise((e,t)=>{this._refitWorker.onmessage=n=>{let r=n.data;r.type===`refitComplete`?e({refitTimeMs:r.refitTimeMs}):r.type===`error`&&t(Error(r.error))},this._refitWorker.postMessage({type:`refit`})})}_patchSmoothNormals(e){let t=this.instanceTable;if(t)for(let n=0;n<t.count;n++){if(!t.isSet[n]||!t.isOwner(n))continue;let r=e(n);r&&this._patchMeshSmoothNormals(n,r)}}_placementOf(e){return this.instanceTable?.placementRunOf(e)?.start??-1}refitBLASes(e,t,n){if(this._geometryVersion=(this._geometryVersion??0)+1,!this.instanceTable||!this.bvh||!this.triangles)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let r=this._meshSource(t,`position`),i=this._meshSource(n,`normal`);if(!r)throw Error(`SceneProcessor.refitBLASes: positions are required.`);let a=performance.now();this._blasRefitter||=new rm;let o=this.instanceTable;for(let t of e){let e=this._placementOf(t);if(e<0||!o.isSet[e])continue;if(!o.isOwner(e)){let n=o.tplOwner[o.sourceMesh[e]];this.config.issues?.record(Y.REFIT_SHARED_GEOMETRY,`mesh ${t} shares its triangles with another placement; deforming it would move every copy, so it was skipped`,{meshIndex:t,owner:o.sourceMesh[n]??n});continue}let n=r(e);if(n){if(this._updateMeshTrianglePositions(e,n),i){let t=i(e);t&&this._patchMeshSmoothNormals(e,t)}this._blasRefitter.refitRange(this.bvh,this.triangles,o.blasOffsetOf(e),o.blasNodeCountOf(e)),this.instanceTable.recomputeAABB(e,this.bvh,this.triangles)}}return this._refitTLAS(),{refitTimeMs:performance.now()-a}}updateMeshTransforms(e){if(!this.instanceTable||!this.bvh)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let t=performance.now(),n=this.instanceTable,r=this._transformScratch??=new Float32Array(16),i=0;for(let t of e){let e=this.meshes?.[t],a=n.placementRunOf(t);if(!e||!a)continue;e.updateMatrixWorld(!0);let o=e.matrixWorld.elements,s=e.isInstancedMesh?this._ownInstanceMatrices(e):null,c=n.tplBakeInverse?.get(n.sourceMesh[a.start])??null;for(let e=0;e<a.count;e++){let t=a.start+e;n.isSet[t]&&(s?(xm(o,s,e*16,r),n.setPlacementMatrix(t,r)):c?(xm(o,c,0,r),n.setPlacementMatrix(t,r)):n.setPlacementMatrix(t,o),this._writeLeafMatrix(t),i++)}}return this._refitTLAS(),{refitTimeMs:performance.now()-t,placements:i}}_ownInstanceMatrices(e){let t=e.instanceMatrix;return t?.array?(t.array.buffer===this.instanceTable.world.buffer&&(t.array=t.array.slice(),t.needsUpdate=!0),t.array):null}_writeLeafMatrix(e){let t=this.instanceTable.tlasLeafIndex[e];t<0||Nm.writeLeafMatrix(this.bvh.chunkFor(t),this.bvhIndexChunks.chunkFor(t),this.bvh.baseOf(t),this.instanceTable.world,e)}computeTLASDirtyRange(){return{offset:0,count:this.instanceTable.tlasNodeCount*16}}computeBLASDirtyRanges(e){let t=st.FLOATS_PER_TRIANGLE,n=[],r=[];for(let i of e){let e=this.instanceTable,a=this._placementOf(i);a<0||!e.isSet[a]||(n.push({offset:e.triOffsetOf(a)*t,count:e.triCountOf(a)*t}),r.push({offset:e.blasOffsetOf(a)*16,count:e.blasNodeCountOf(a)*16}))}return r.push({offset:0,count:this.instanceTable.tlasNodeCount*16}),{triRanges:n,bvhRanges:r}}uploadToPathTracer(e,t,n,r,{keepUserLights:i=!1}={}){return this.triangles?(e.setTriangleData(this.triangles,this.triangleCount),this.bvh?(e.setBVHData(this.bvh),e.setInstanceTable(this.instanceTable),this.materialData?e.materialData.setMaterialData(this.materialData,this.materials.map(e=>e.sources)):ag.warn(`no material data, using defaults`),r&&e.environment.setEnvironmentTexture(r),e.materialData.setMaterialTextures({srgbBuckets:this.srgbBucketTextures,linearBuckets:this.linearBucketTextures}),e.materialData.setTexturePackMaps?.(this._srgbTexPacked,this._linearTexPacked),this.emissiveTriangleData&&(e.setEmissiveTriangleData(this.emissiveTriangleData,this.emissiveTriangleCount,this.emissiveTotalPower,this.emissiveBitTrailMap),this._releaseBitTrailMap()),this.lightBVHNodeData&&e.setLightBVHData(this.lightBVHNodeData,this.lightBVHNodeCount),t.transferSceneLights(n,{keepUserLights:i}),!0):(ag.error(`failed to get BVH data`),!1)):(ag.error(`failed to get triangle data`),!1)}updateMaterialEmissive(e,t,n){if(!this.emissiveTriangleBuilder)return null;let r=this.materials[e];return!r||(t===`emissive`?r.emissive=n:t===`emissiveIntensity`&&(r.emissiveIntensity=n),!this.emissiveTriangleBuilder.updateMaterialEmissive(e,r,this.triangles,this.materials,this.triangleCount))?null:this._collectEmissivePayload()}rebuildEmissiveColors(){return!this.emissiveTriangleBuilder||!this.triangleCount?null:(this.emissiveTriangleBuilder.extractEmissiveTriangles(this.triangles,this.materials,this.triangleCount,this.instanceTable??null),this.emissiveTriangleBuilder.createEmissiveRawData(),this._collectEmissivePayload())}rebuildEmissiveForVisibility(e,t=!1){return!this.emissiveTriangleBuilder||!this.emissiveTriangleBuilder.setHiddenMeshes(e)&&!t?null:this._collectEmissivePayload()}movesEmitters(e){let t=this.emissiveTriangleBuilder?.emissiveMeshes;return!!t?.size&&e.some(e=>t.has(e))}refreshEmissiveTransforms(){let e=this.emissiveTriangleBuilder;return!e?.emissiveTriangles.length||!this.instanceTable||!this.triangles?null:(e.refreshTransforms(this.triangles,this.instanceTable),this._collectEmissivePayload())}_collectEmissivePayload(){this.emissiveTriangleBuilder.buildLightBVH(),this.lightBVHNodeData=this.emissiveTriangleBuilder.lightBVHNodeData,this.lightBVHNodeCount=this.emissiveTriangleBuilder.lightBVHNodeCount,this.emissiveTriangleData=this.emissiveTriangleBuilder.emissiveTriangleData,this.emissiveBitTrailMap=this.emissiveTriangleBuilder.emissiveBitTrailMap,this.emissiveTriangleCount=this.emissiveTriangleBuilder.emissiveCount,this.emissiveTotalPower=this.emissiveTriangleBuilder.totalEmissivePower;let e=this.emissiveBitTrailMap;return this._releaseBitTrailMap(),{rawData:this.emissiveTriangleData,emissiveCount:this.emissiveTriangleCount,totalPower:this.emissiveTotalPower,bitTrailMap:e,lightBVHNodeData:this.lightBVHNodeData,lightBVHNodeCount:this.lightBVHNodeCount}}get spilled(){return!!(this.triangles?.spilledChunks||this.bvh?.spilledChunks)}async spillToDisk(e){let t=this.triangles,n=this.bvh;if(!e||this.spilled||this._spillStores||!t?.chunks||t.chunks.length<2||!n?.chunks)return null;await this._blasStoring;let r=this._geometryVersion,i=performance.now(),a=`spill:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,o=e=>e.recordsPerChunk*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT,s=await _r.create(e,`${a}:tri`,o(t),{label:`Triangle records`,expectedBytes:t.byteLength}),c=s&&await _r.create(e,`${a}:bvh`,o(n),{label:`BLAS nodes`,expectedBytes:n.byteLength});if(!s||!c)return await s?.dispose(),null;this._spillStores=[s,c];let l=Math.ceil((this.instanceTable?.tlasNodeCount??1)/n.recordsPerChunk),u=await t.spill(s);if(u+=await n.spill(c,{keep:e=>e<l}),await s.flush(),await c.flush(),r!==this._geometryVersion)return null;let d=performance.now()-i;return ag.info(`spilled ${(u/1048576).toFixed(0)} MB of triangles and BLAS nodes to disk in ${d.toFixed(0)} ms`),{bytes:u,ms:d}}ensureResident(){return this._paging??=(async()=>{await this.triangles?.ensureResident?.(),await this.bvh?.ensureResident?.(),this.spilled||this._disposeSpill()})().finally(()=>{this._paging=null}),this._paging}async _restoreGeometry(e){let t=this._geometrySpill;if(!t?.bytes)return;H({status:`Reading scene geometry back...`,progress:84});let n=performance.now(),r=t.bytes;await t.restore(),this._disposeGeometrySpill(),this._geometryBytes=Mr(e),ag.info(`read ${J.mb(r)} of scene geometry back from disk in ${J.ms(performance.now()-n)}`),t.error&&ag.warn(`some scene geometry stayed in memory, its spill write failed:`,t.error)}_disposeGeometrySpill(){let e=this._geometrySpill;this._geometrySpill=null,e?.dispose().catch(()=>{})}_disposeSpill(){let e=this._spillStores;this._spillStores=null;for(let t of e??[])t.dispose().catch(()=>{})}_releaseBitTrailMap(){this.emissiveBitTrailMap=null,this.emissiveTriangleBuilder&&(this.emissiveTriangleBuilder.emissiveBitTrailMap=null)}async _buildTLAS(e){let t=e.count;if(t>=Qh&&!this._tlasWorkerFailed)try{let n=new Float64Array(t*6);e.writeWorldAABBs(n);let{tlasData:r,nodeCount:i}=await this._runTLASWorker(n,t);return Nm.fillLeaves(r,i,e),r}catch(e){this._tlasWorkerFailed=!0,ag.warn(`TLAS worker unavailable (${e.message}); building on the main thread`)}return this.tlasBuilder.build(e).data}_runTLASWorker(e,t){this._tlasWorker||=new Zh;let n=this._tlasWorker;return new Promise((r,i)=>{let a=e=>{n.removeEventListener(`message`,a),n.removeEventListener(`error`,o),e.data?.error?i(Error(e.data.error)):r(e.data)},o=e=>{n.removeEventListener(`message`,a),n.removeEventListener(`error`,o),i(Error(e.message||`worker error`))};n.addEventListener(`message`,a),n.addEventListener(`error`,o),n.postMessage({aabbs:e.buffer,count:t,logLevel:Kt()},[e.buffer])})}_setBVHData(e){let t=e?e instanceof Dn?e:Dn.adopt([e],e.length/16,16,e.length/16):null;this.bvh=t,t&&this._foldLeaves&&(t.foldedLeaves=!0),this.bvhIndexChunks=t?t.viewAs(Uint32Array):null,this.bvhData=t?t.single:null,this.bvhIndex=this.bvhIndexChunks?this.bvhIndexChunks.single:null}_setTriangleData(e){let t=st.FLOATS_PER_TRIANGLE,n=e?e instanceof Dn?e:Dn.adopt([e],e.length/t,t,e.length/t):null;this.triangles=n,this.triangleFloatChunks=n?n.viewAs(Float32Array):null,this.triangleData=n?n.single:null,this.triangleFloats=this.triangleFloatChunks?this.triangleFloatChunks.single:null}_updateMeshTrianglePositions(e,t){let n=st.POSITION_A_OFFSET,r=st.POSITION_B_OFFSET,i=st.POSITION_C_OFFSET,a=st.NORMAL_A_PACKED_OFFSET,o=st.NORMAL_B_PACKED_OFFSET,s=st.NORMAL_C_PACKED_OFFSET,c=this.triangles,l=this.triangleFloatChunks,u=this.instanceTable,d=u.bvhToOriginalOf(e),f=u.triOffsetOf(e),p=u.triCountOf(e),m=u.matrixInverseOf(e),h=Sm(m);for(let e=0;e<p;e++){let u=d?d[e]:e,p=f+e,g=l.chunkFor(p),_=c.chunkFor(p),v=c.baseOf(p),y=u*9,b=t[y],x=t[y+1],S=t[y+2],C=t[y+3],w=t[y+4],T=t[y+5],E=t[y+6],D=t[y+7],O=t[y+8];if(!h){let e=(e,t,n)=>m[0]*e+m[4]*t+m[8]*n+m[12],t=(e,t,n)=>m[1]*e+m[5]*t+m[9]*n+m[13],n=(e,t,n)=>m[2]*e+m[6]*t+m[10]*n+m[14],r=[e(b,x,S),t(b,x,S),n(b,x,S)],i=[e(C,w,T),t(C,w,T),n(C,w,T)],a=[e(E,D,O),t(E,D,O),n(E,D,O)];b=r[0],x=r[1],S=r[2],C=i[0],w=i[1],T=i[2],E=a[0],D=a[1],O=a[2]}g[v+n]=b,g[v+n+1]=x,g[v+n+2]=S,g[v+r]=C,g[v+r+1]=w,g[v+r+2]=T,g[v+i]=E,g[v+i+1]=D,g[v+i+2]=O;let k=C-b,A=w-x,j=T-S,M=E-b,N=D-x,P=O-S,F=dt(A*P-j*N,j*M-k*P,k*N-A*M);_[v+a]=F,_[v+o]=F,_[v+s]=F}}_patchMeshSmoothNormals(e,t){let n=this.instanceTable;this._patchNormalsRange(t,n.triOffsetOf(e),n.triCountOf(e),n.matrixWorldOf(e),n.bvhToOriginalOf(e))}_patchNormalsRange(e,t,n,r,i){let a=st.NORMAL_A_PACKED_OFFSET,o=st.NORMAL_B_PACKED_OFFSET,s=st.NORMAL_C_PACKED_OFFSET,c=r,l=!c||Sm(c),u=[a,o,s];for(let r=0;r<n;r++){let n=t+r,a=this.triangles.chunkFor(n),o=this.triangles.baseOf(n),s=(i?i[r]:r)*9;for(let t=0;t<3;t++){let n=s+t*3,r=e[n],i=e[n+1],d=e[n+2],f=r,p=i,m=d;if(!l){f=c[0]*r+c[1]*i+c[2]*d,p=c[4]*r+c[5]*i+c[6]*d,m=c[8]*r+c[9]*i+c[10]*d;let e=Math.hypot(f,p,m)||1;f/=e,p/=e,m/=e}a[o+u[t]]=dt(f,p,m)}}}_refitTLAS(){let e=this.instanceTable.tlasNodeCount;(!this._tlasBounds||this._tlasBounds.length<e*6)&&(this._tlasBounds=new Float32Array(e*6));let t=this.instanceTable;for(let n=e-1;n>=0;n--){let e=this.bvhIndexChunks.chunkFor(n),r=this.bvh.chunkFor(n),i=this.bvh.baseOf(n),a=e[i+3];if(a===_t.BLAS_POINTER_LEAF){let r=e[i+1]>r<t.count&&t.writeWorldAABB(r,this._tlasBounds,n*6)}else if(a<_t.TRIANGLE_LEAF){let t=a,o=e[i+7],s=t*6,c=o*6,l=this._tlasBounds;r[i]=l[s],r[i+1]=l[s+1],r[i+2]=l[s+2],r[i+4]=l[s+3],r[i+5]=l[s+4],r[i+6]=l[s+5],r[i+8]=l[c],r[i+9]=l[c+1],r[i+10]=l[c+2],r[i+12]=l[c+3],r[i+13]=l[c+4],r[i+14]=l[c+5];let u=n*6;l[u]=Math.min(l[s],l[c]),l[u+1]=Math.min(l[s+1],l[c+1]),l[u+2]=Math.min(l[s+2],l[c+2]),l[u+3]=Math.max(l[s+3],l[c+3]),l[u+4]=Math.max(l[s+4],l[c+4]),l[u+5]=Math.max(l[s+5],l[c+5])}}}scheduleBackgroundRebuild(e,t){if(!this.instanceTable||!this.triangles)return;this._rebuildGeneration++;let n=this._rebuildGeneration,r=(e,r,i)=>{let a=this.triangles.copyOf(r.triOffset,r.triCount);this._pendingRebuilds.set(e,i),i.onmessage=a=>{let o=a.data;if(i.terminate(),this._pendingRebuilds.delete(e),o.error){ag.error(`background BLAS rebuild failed (mesh ${e}):`,o.error);return}n===this._rebuildGeneration&&this._swapBLAS(e,r,o,t)},i.onerror=t=>{ag.error(`background BLAS rebuild worker failed (mesh ${e}):`,t),i.terminate(),this._pendingRebuilds.delete(e)};let o=r.triCount>500;i.postMessage({triangleData:a.buffer,triangleByteOffset:a.byteOffset,triangleByteLength:a.byteLength,triangleCount:r.triCount,depth:this.config.bvhDepth,maxLeafSize:this.bvhBuilder.maxLeafSize,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:{enabled:o,size:this.config.treeletSize,passes:this.config.treeletOptimizationPasses,minImprovement:this.config.treeletMinImprovement,complexityThreshold:this.config.treeletComplexityThreshold},reinsertionOptimization:{enabled:this.bvhBuilder.enableReinsertionOptimization,batchSizeRatio:this.bvhBuilder.reinsertionBatchSizeRatio,maxIterations:this.bvhBuilder.reinsertionMaxIterations}},[a.buffer])};for(let t of e){let e=this._placementOf(t);if(e<0)continue;let n=this.instanceTable.entryAt(e);if(!n||!this.instanceTable.isOwner(e))continue;let i=this._pendingRebuilds.get(e);i&&i.terminate(),r(e,n,new om)}}_swapBLAS(e,t,n,r){this._geometryVersion=(this._geometryVersion??0)+1;let i=n.bvhData,a=i.length/16;if(a>t.blasNodeCount){ag.warn(`background rebuild does not fit for mesh ${e} (${a} nodes vs ${t.blasNodeCount} reserved), skipping swap`);return}this.bvh.setRecords(t.blasOffset,i),this._offsetBLASInPlace(t.blasOffset,a,t.blasOffset,t.triOffset);let o=n.triangles;o&&this.triangles.setRecords(t.triOffset,o),this.instanceTable.setBlasNodeCount(e,a);let s=n.originalToBvh;if(s){let n=this.instanceTable.bvhToOriginalOf(e),r=new Uint32Array(t.triCount);for(let e=0;e<t.triCount;e++)r[s[e]]=n?n[e]:e;this.instanceTable.setBvhToOriginal(e,r)}this.instanceTable.recomputeAABB(e,this.bvh,this.triangles),this._refitTLAS(),this._log(`Background BLAS rebuild complete for mesh ${e}`),r?.(this.instanceTable.sourceMesh[e]??e)}cancelBackgroundRebuilds(){for(let e of this._pendingRebuilds.values())e.terminate();this._pendingRebuilds.clear()}_disposeRefitWorker(){this._refitWorker&&=(this._refitWorker.terminate(),null),this._refitSharedBuffers=null,this.cancelBackgroundRebuilds()}_disposeTLASWorker(){this._tlasWorker&&=(this._tlasWorker.terminate(),null)}dispose(){this._geometryVersion=(this._geometryVersion??0)+1,this._log(`Disposing resources`),this._disposeRefitWorker(),this._disposeTLASWorker(),this._disposeTextures(),this._reset(),this.textureCreator&&=(this.textureCreator.dispose(),null),this.geometryExtractor=null,this.bvhBuilder=null,this.tlasBuilder=null,this._blasRefitter=null}},fg=[[1619.19106,-.00205010916,5.02995757],[2488.45471,-.00111330907,3.22621544],[3341.43193,-.000486551192,1.76486769],[4094.61742,-.000127446582,.725731635],[4670.28036,291258199e-13,.126703442],[4595.09185,287495649e-13,.15034502],[3787.1745,935907826e-14,.399075871]],pg=[[-488.999748,.000604330754,-.0755807526],[-755.994277,.000316730098,.478306139],[-1023.63977,.00012022347,.936662319],[-1265.71316,487340896e-14,1.27054498],[-1425.29332,-401150431e-13,1.43972784],[-1175.54822,-216378048e-13,1.30408023],[-500.799571,-459832026e-14,1.09098763]],mg=[[596945309e-19,-4.85742887e-8,-970622247e-13,-.00407936148],[240430366e-19,5.55021075e-8,-.000198503712,.0289312858],[-140949732e-19,1.89878968e-7,-.000356632824,.0910767778],[-361460868e-19,2.84822009e-7,-.000493211319,.15672344],[-197075738e-19,1.75359352e-7,-.000250542825,-.0222783266],[-161997957e-21,-1.64216008e-8,.000386216271,-.738077418],[672650283e-21,-2.73078809e-8,.000424098264,-.752335691]];function hg(e){let t,n,r;if(e>=12e3)t=.8262954810464208,n=.9945080501520986,r=1.566307710274283;else if(e<800)t=5.413294490189271,n=-.20319390035873933,r=-.0822535242887164;else{let i=e>=6365?6:e>=3315?5:e>=1902?4:e>=1449?3:e>=1167?2:+(e>=965),a=fg[i],o=pg[i],s=mg[i],c=1/e;t=a[0]*c+a[1]*e+a[2],n=o[0]*c+o[1]*e+o[2],r=((s[0]*e+s[1])*e+s[2])*e+s[3]}return[Math.max(0,t),Math.max(0,n),Math.max(0,r)]}var gg=1/(4*Math.PI);function _g(e){let t=e.userData||{},n=Number.isFinite(t.exposure)?t.exposure:0,r=e.intensity*2**n,i=[e.color.r,e.color.g,e.color.b];if(t.useTemperature){let[e,n,r]=hg(t.temperature??6500);i[0]*=e,i[1]*=n,i[2]*=r}return Wr(i),{r:i[0],g:i[1],b:i[2],intensity:r}}var vg=class{constructor(){this.lightData={directional:[],rectArea:[],point:[],spot:[]},this.directionalLightCache=[],this.areaLightCache=[],this.pointLightCache=[],this.spotLightCache=[]}clear(){this.lightData.directional=[],this.lightData.rectArea=[],this.lightData.point=[],this.lightData.spot=[],this.directionalLightCache=[],this.areaLightCache=[],this.pointLightCache=[],this.spotLightCache=[]}calculateLightImportance(e,t=`directional`){let n=.2126*e.color.r+.7152*e.color.g+.0722*e.color.b,r=e.intensity*n;if(t===`area`){let t=e.width*e.height;r*=Math.sqrt(t)}else if(t===`point`)r*=Math.sqrt(e.distance||100);else if(t===`spot`){let t=Math.sin(e.angle||Math.PI/4);r*=Math.sqrt(e.distance||100)*t}return r}addDirectionalLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n;if(e.target){e.target.updateMatrixWorld();let i=e.target.getWorldPosition(new r.Vector3);n=t.sub(i).normalize()}else n=t.normalize();let i=this.calculateLightImportance(e,`directional`),a=e.userData.angle||e.angle||0,o=_g(e),s=e.userData?.gobo,c=s&&Number.isInteger(s.index)?s.index:-1,l=s&&typeof s.intensity==`number`?s.intensity:1,u=s&&s.inverted?-Math.abs(l):Math.abs(l),d=s&&typeof s.scale==`number`?s.scale:5;this.directionalLightCache.push({data:[n.x,n.y,n.z,o.r,o.g,o.b,o.intensity,a,c,u,d,0],importance:i,light:e})}addRectAreaLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=e.getWorldQuaternion(new r.Quaternion),i=e.getWorldScale(new r.Vector3),a=e.width*i.x*.5,o=e.height*i.y*.5,s=new r.Vector3(a,0,0).applyQuaternion(n),c=new r.Vector3(0,-o,0).applyQuaternion(n),l=this.calculateLightImportance(e,`area`),u=e.userData?.normalize??!0?1:0,d=Number.isFinite(e.userData?.spread)?e.userData.spread:Math.PI,f=+(e.userData?.shape===`ellipse`||e.userData?.shape===`disk`||e.userData?.shape===1),p=_g(e);this.areaLightCache.push({data:[t.x,t.y,t.z,s.x,s.y,s.z,c.x,c.y,c.z,p.r,p.g,p.b,p.intensity,u,d,f],importance:l,light:e})}addPointLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=this.calculateLightImportance(e,`point`),i=_g(e);this.pointLightCache.push({data:[t.x,t.y,t.z,i.r,i.g,i.b,i.intensity*gg,e.distance||0,e.decay===void 0?2:e.decay],importance:n,light:e})}addSpotLight(e){if(!e.visible||e.intensity<=0)return;e.updateMatrixWorld();let t=e.getWorldPosition(new r.Vector3),n=(e.target?e.target.getWorldPosition(new r.Vector3):new r.Vector3(0,0,-1)).sub(t).normalize(),i=this.calculateLightImportance(e,`spot`),a=e.userData?.gobo,o=a&&Number.isInteger(a.index)?a.index:-1,s=a&&typeof a.intensity==`number`?a.intensity:1,c=a&&a.inverted?-Math.abs(s):Math.abs(s),l=e.userData?.ies,u=l&&Number.isInteger(l.index)?l.index:-1,d=l&&typeof l.intensity==`number`?l.intensity:1,f=_g(e);this.spotLightCache.push({data:[t.x,t.y,t.z,n.x,n.y,n.z,f.r,f.g,f.b,f.intensity*gg,e.angle||Math.PI/4,e.penumbra||0,e.distance||0,e.decay===void 0?2:e.decay,o,c,u,d,0,0],importance:i,light:e})}preprocessLights(){this.directionalLightCache.sort((e,t)=>t.importance-e.importance),this.areaLightCache.sort((e,t)=>t.importance-e.importance),this.pointLightCache.sort((e,t)=>t.importance-e.importance),this.spotLightCache.sort((e,t)=>t.importance-e.importance),this.lightData.directional=[],this.lightData.rectArea=[],this.lightData.point=[],this.lightData.spot=[],this.directionalLightCache.forEach(e=>{this.lightData.directional.push(...e.data)}),this.areaLightCache.forEach(e=>{this.lightData.rectArea.push(...e.data)}),this.pointLightCache.forEach(e=>{this.lightData.point.push(...e.data)}),this.spotLightCache.forEach(e=>{this.lightData.spot.push(...e.data)}),this.areaLightCache.length>0&&console.log(`Preprocessed ${this.areaLightCache.length} area lights by importance`),this.pointLightCache.length>0&&console.log(`Preprocessed ${this.pointLightCache.length} point lights by importance`),this.spotLightCache.length>0&&console.log(`Preprocessed ${this.spotLightCache.length} spot lights by importance`)}updateShaderUniforms(e){let t=Math.floor(this.lightData.directional.length/12),n=Math.floor(this.lightData.rectArea.length/16),r=Math.floor(this.lightData.point.length/9),i=Math.floor(this.lightData.spot.length/20);e.defines.MAX_DIRECTIONAL_LIGHTS=t,e.defines.MAX_AREA_LIGHTS=n,e.defines.MAX_POINT_LIGHTS=r,e.defines.MAX_SPOT_LIGHTS=i,e.uniforms.directionalLights.value=new Float32Array(this.lightData.directional),e.uniforms.areaLights.value=new Float32Array(this.lightData.rectArea),e.uniforms.pointLights.value=new Float32Array(this.lightData.point),e.uniforms.spotLights.value=new Float32Array(this.lightData.spot),e.needsUpdate=!0}processSceneLights(e,t){this.clear(),e.traverse(e=>{e.isDirectionalLight?this.addDirectionalLight(e):e.isRectAreaLight?this.addRectAreaLight(e):e.isPointLight?this.addPointLight(e):e.isSpotLight&&this.addSpotLight(e)}),this.preprocessLights(),this.updateShaderUniforms(t)}getLightStatistics(){return{directionalLights:this.directionalLightCache.map(e=>({intensity:e.light.intensity,importance:e.importance,color:e.light.color})),areaLights:this.areaLightCache.map(e=>({intensity:e.light.intensity,importance:e.importance,color:e.light.color,size:e.light.width*e.light.height}))}}};Js();var yg=864e5,bg=Object.freeze({IMMUTABLE:`immutable`,REVALIDATE:`revalidate`,NETWORK:`network`}),xg=(e,t)=>({loaded:e,total:t,lengthComputable:t>0&&e<=t}),Sg=(e,t)=>e.headers?.get?.(t)??null,Cg=e=>e.reason??new DOMException(`aborted`,`AbortError`);function wg(e){try{let t=new URL(e,globalThis.location?.href??`http://localhost/`).pathname;return decodeURIComponent(t.split(`/`).pop())||`download`}catch{return`download`}}async function Tg(e,{onProgress:t,signal:n}){let r=Number(Sg(e,`content-length`))||0,i=Sg(e,`content-type`)??``;if(!e.body)return new Blob([await e.arrayBuffer()],{type:i});let a=e.body.getReader(),o=[],s=0;for(;;){if(n?.aborted)throw a.cancel().catch(()=>{}),Cg(n);let{done:e,value:i}=await a.read();if(e)break;o.push(i),s+=i.length,t?.(xg(s,r))}return new Blob(o,{type:i})}var Eg=(e,t,n)=>new File([e],t,{type:n||e.type,lastModified:e.lastModified??Date.now()}),Dg=()=>{},Og=class{constructor(e){this._storage=e,this._revalidating=new Set}get _area(){return this._storage?.area(Zn.DOWNLOADS)??null}async fetch(e,{key:t=e,name:n=wg(e),policy:r=bg.REVALIDATE,maxAgeMs:i=yg,onProgress:a=null,signal:o=null,fetchOptions:s={}}={}){let c=this._area;if(c&&r!==bg.NETWORK){let o=await c.open(t);if(o){let c=await o.file(`data`);if(c)return r===bg.REVALIDATE&&Date.now()-(o.extra.checkedAt??0)>=i&&this._revalidate(e,t,n,o.extra,s),a?.(xg(c.size,c.size)),{file:Eg(c,n,o.extra.contentType),release:()=>o.release(),fromCache:!0};o.release()}}return this._download(e,t,n,{onProgress:a,signal:o,fetchOptions:s,cache:!!c})}async has(e){return await this._area?.has(e)===!0}async _download(e,t,n,{onProgress:r,signal:i,fetchOptions:a,cache:o}){if(i?.aborted)throw Cg(i);let s=await fetch(e,{...a,signal:i});if(!s.ok)throw Error(`HTTP ${s.status} fetching ${e}`);let c=Number(Sg(s,`content-length`))||0,l={url:e,contentType:Sg(s,`content-type`)??``,lastModified:Sg(s,`last-modified`),contentLength:c||null,checkedAt:Date.now()},u=o&&s.body?await this._area.create(t,{label:n,expectedBytes:c}):null;if(!u)return{file:Eg(await Tg(s,{onProgress:r,signal:i}),n,l.contentType),release:Dg,fromCache:!1};try{await u.writeStream(`data`,s.body,{signal:i,onProgress:e=>r?.(xg(e,c))}),await u.commit(l)}catch(o){if(await u.abort(),o?.name!==`QuotaExceededError`)throw o;return this._download(e,t,n,{onProgress:r,signal:i,fetchOptions:a,cache:!1})}let d=await this._area.open(t,{wait:!0}),f=d&&await d.file(`data`);if(!f)throw d?.release(),Error(`storage: ${n} vanished right after it was saved`);return{file:Eg(f,n,l.contentType),release:()=>d.release(),fromCache:!1}}async _revalidate(e,t,n,r,i){if(!this._revalidating.has(t)){this._revalidating.add(t);try{let a=await fetch(e,{...i,method:`HEAD`});if(!a.ok)return;let o=Sg(a,`last-modified`),s=Number(Sg(a,`content-length`))||null;if(o&&r.lastModified&&o!==r.lastModified||s&&r.contentLength&&s!==r.contentLength){let{release:r}=await this._download(e,t,n,{fetchOptions:i,cache:!0});r()}else await this._area.patchMeta(t,{extra:{...r,checkedAt:Date.now()}})}catch{}finally{this._revalidating.delete(t)}}}};function kg(e,t,n){return new Og(t).fetch(e,n)}function Ag(){return new Og(Pu(Ks().cacheNamespace))}async function jg(e,{downloads:t=Ag(),...n}={}){if(!t._storage||!/^https?:/i.test(e))return{url:e,release:Dg,cached:!1};let{file:r,release:i}=await t.fetch(e,n),a=URL.createObjectURL(r);return{url:a,cached:!0,release:()=>{URL.revokeObjectURL(a),i()}}}Js(),rn();var Mg=1<<18,Ng=Wt(`pathtracer`),Pg=100,Fg=4,Ig=class extends xe{constructor(e,t,n,i={}){super(`PathTracer`,{...i,executionMode:be.ALWAYS});let a=i.width||1920,o=i.height||1080;this.camera=n,this.width=a,this.height=o,this.renderer=e,this.scene=t,this.sdfs=new dg,this.lightSerializer=new vg,this.accumulationEnabled=!0,this.isComplete=!1,this.cameras=[],this.performanceMonitor=Ie(),this.completionThreshold=0,this.renderLimitMode=`frames`,this._initDataTextures(),this.storageTextures=new cn(0,0),this.uniforms=new un(a,o),this._defineUniformGetters(),this.materialData=new ni(this.sdfs),this.materialData.callbacks.onReset=()=>this.reset(),this.materialData.callbacks.getTriangleData=()=>({array:this._triangleFlat,records:this._triangleRecords,count:this.triangleCount}),this.materialData.callbacks.onTriangleDataChanged=()=>{this.triangleShadeAttr&&this._uploadTriangles(0,this._triangleRecordCount,{geo:!1})},this.environment=new qu(this.scene,this.uniforms,this.renderer),this.environment.callbacks.onReset=()=>this.reset(),this.environment.callbacks.getSceneTextureNodes=()=>this.shaderBuilder.getSceneTextureNodes(),this.shaderBuilder=new lp,this._initRenderingState(),this.setupBlueNoise(),this.tempVector2=new r.Vector2,this.lastCameraMatrix=new r.Matrix4,this.lastProjectionMatrix=new r.Matrix4,this._seedTick=0,this._pinSeedToFrame=!1,this.tracedFrames=0,this.resetCount=0,this.lastRenderMode=-1,this.renderModeChangeTimeout=null,this.renderModeChangeDelay=50,this.pendingRenderMode=null,this.lastInteractionModeState=!1,this.cameraChanged=!1,this._lastViewChangeAt=-1/0,this.updateCompletionThreshold()}_initDataTextures(){this.triangleGeoAttr=null,this.triangleShadeAttr=null,this._triangleRecords=null,this._triangleFlat=null,this._triangleRecordCount=0,this.triangleStorageNode=null,this.triangleCount=0,this.bvhStorageAttr=null,this._bvhRecords=null,this.bvhStorageNode=null,this.bvhNodeCount=0,this.directionalLightsData=null,this.pointLightsData=null,this.spotLightsData=null,this.areaLightsData=null,this.goboMaps=null,this.iesProfiles=null,this.stbnScalarTexture=null,this.stbnVec2Texture=null,this.blueNoiseReady=Promise.resolve(),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(new Float32Array(16),4),this.lightStorageNode=(0,n.storage)(this.lightStorageAttr,`vec4`,1).toReadOnly(),this._lightBufferRealloc=!1,this._lbvhDataCache=null,this._emissiveDataCache=null,this._bitTrailMapCache=null,this._bitTrailOffset=0,this._bitTrailLength=0,this._instanceTable=null,this.spheres=[]}_defineUniformGetters(){let e=this.uniforms;for(let t of e.keys())Object.defineProperty(this,t,{get:()=>e.get(t),configurable:!0});let t=e.getLightBufferNodes();for(let[e,n]of Object.entries(t))Object.defineProperty(this,`${e}LightsBufferNode`,{get:()=>n,configurable:!0})}_initRenderingState(){this.isReady=!1,this.frameCount=0}_initCameraOptimizer(){let e=this;this.cameraOptimizer=new Se(this.renderer,{uniforms:{enableAccumulation:{get value(){return e.enableAccumulation.value},set value(t){e.enableAccumulation.value=t}},fireflyThreshold:{get value(){return e.fireflyThreshold.value},set value(t){e.fireflyThreshold.value=t}},cameraIsMoving:{get value(){return e.cameraIsMoving.value},set value(t){e.cameraIsMoving.value=t}}}},{enabled:U.interactionModeEnabled,qualitySettings:{enableAccumulation:!1,fireflyThreshold:e=>e*8},onEnter:()=>this.emit(`pathtracer:interactionStart`),onExit:()=>this.emit(`pathtracer:interactionEnd`),onReset:()=>{this.reset(),this.emit(`pathtracer:viewpointChanged`)}})}setupBlueNoise(){let e=new r.TextureLoader;e.setCrossOrigin(`anonymous`);let t=e=>(e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e.wrapS=r.RepeatWrapping,e.wrapT=r.RepeatWrapping,e.generateMipmaps=!1,e),{stbnScalarAtlas:n,stbnVec2Atlas:i}=Ks(),a=async t=>{let n=await jg(t,{policy:bg.REVALIDATE});try{return await e.loadAsync(n.url)}finally{n.release()}},o=a(n).then(e=>{this.stbnScalarTexture=t(e),L.value=e,Ng.debug(`STBN scalar atlas ${J.px(e.image.width,e.image.height)}`)}),s=a(i).then(e=>{this.stbnVec2Texture=t(e),R.value=e,Ng.debug(`STBN vec2 atlas ${J.px(e.image.width,e.image.height)}`)});this.blueNoiseReady=Promise.allSettled([o,s]).then(e=>{for(let t of e)t.status===`rejected`&&Ng.warn(`STBN atlas failed to load`,t.reason)})}setupEventListeners(){this.on(`pipeline:reset`,()=>{this.reset()}),this.on(`pipeline:resize`,e=>{e&&e.width&&e.height&&this.setSize(e.width,e.height)}),this.on(`pathtracer:setCompletionThreshold`,e=>{e&&e.threshold!==void 0&&(this.completionThreshold=e.threshold)})}async build(e){this.dispose(),this.scene=e,await this.sdfs.buildBVH(e),this.cameras=this.sdfs.cameras,this.updateSceneUniforms(),this.updateLights(),this._initCameraOptimizer(),this.setupMaterial()}updateSceneUniforms(){this.setTriangleData(this.sdfs.triangleData,this.sdfs.triangleCount),this.setBVHData(this.sdfs.bvhData),this.setInstanceTable(this.sdfs.instanceTable),this.materialData.setMaterialData(this.sdfs.materialData,this.sdfs.materials?.map(e=>e.sources)),this.materialData.loadTexturesFromSdfs(),this.sdfs.emissiveTriangleData?this.setEmissiveTriangleData(this.sdfs.emissiveTriangleData,this.sdfs.emissiveTriangleCount||0):this.emissiveTriangleCount.value=0,this.sdfs.lightBVHNodeData?this.setLightBVHData(this.sdfs.lightBVHNodeData,this.sdfs.lightBVHNodeCount||0):this.lightBVHNodeCount.value=0,this._meshRefs=this._collectMeshRefs(this.scene),this.setMeshVisibilityData(this._meshRefs),this.spheres=this.sdfs.spheres||[]}updateLights(){let e={uniforms:{directionalLights:{value:null},pointLights:{value:null},spotLights:{value:null},areaLights:{value:null}},defines:{}};this.lightSerializer.processSceneLights(this.scene,e),this.directionalLightsData=e.uniforms.directionalLights.value,this.pointLightsData=e.uniforms.pointLights.value,this.spotLightsData=e.uniforms.spotLights.value,this.areaLightsData=e.uniforms.areaLights.value,this._updateLightBufferNodes()}_updateLightBufferNodes(){this.directionalLightsData&&this.directionalLightsData.length>0?(this.directionalLightsBufferNode.array=Array.from(this.directionalLightsData),this.numDirectionalLights.value=Math.floor(this.directionalLightsData.length/12)):this.numDirectionalLights.value=0,this.areaLightsData&&this.areaLightsData.length>0?(this.areaLightsBufferNode.array=Array.from(this.areaLightsData),this.numAreaLights.value=Math.floor(this.areaLightsData.length/16)):this.numAreaLights.value=0,this.pointLightsData&&this.pointLightsData.length>0?(this.pointLightsBufferNode.array=Array.from(this.pointLightsData),this.numPointLights.value=Math.floor(this.pointLightsData.length/9)):this.numPointLights.value=0,this.spotLightsData&&this.spotLightsData.length>0?(this.spotLightsBufferNode.array=Array.from(this.spotLightsData),this.numSpotLights.value=Math.floor(this.spotLightsData.length/20)):this.numSpotLights.value=0}reset(){this.resetCount++,this.frameCount=0,this.frame.value=0,this.hasPreviousAccumulated.value=0,this.storageTextures.currentTarget=0,this.updateCompletionThreshold(),this.isComplete=!1,this.performanceMonitor?.reset(),this.lastInteractionModeState=!1,this._pinSeedToFrame&&(this._seedTick=0)}setSize(e,t){this.width=e,this.height=t,this.resolution.value.set(e,t),this.createStorageTextures(e,t)}setAccumulationEnabled(e){this.accumulationEnabled=e,this.enableAccumulation.value=+!!e}enterInteractionMode(){this.cameraOptimizer?.enterInteractionMode()}setInteractionModeEnabled(e){this.cameraOptimizer?.setInteractionModeEnabled(e)}get interactionMode(){return this.cameraOptimizer?.isInInteractionMode()??!1}get viewIsChanging(){return this.interactionMode||performance.now()-this._lastViewChangeAt<Pg}noteViewChanged(){this._lastViewChangeAt=performance.now()}setTriangleData(e,t){if(!e)return;let r=e.chunks&&e.chunks.length>1?e:null,i=r?null:e.chunks?e.chunks[0]:e,a=r?r.recordCount:Math.ceil(i.length/st.FLOATS_PER_TRIANGLE),o=r?._gpuUpload?.triangles?r._gpuUpload:null,{geo:s,shade:c}=o??this._allocateTriangleBuffers(a);this.triangleStorageNode?(this.triangleStorageNode.geo.value=s,this.triangleStorageNode.geo.bufferCount=s.count,this.triangleStorageNode.shade.value=c,this.triangleStorageNode.shade.bufferCount=c.count):this.triangleStorageNode={geo:(0,n.storage)(s,`uvec4`,s.count).toReadOnly(),shade:(0,n.storage)(c,`uvec4`,c.count).toReadOnly()},this.triangleGeoAttr=s,this.triangleShadeAttr=c,this._triangleRecords=r,this._triangleFlat=i,this._triangleRecordCount=a,this.triangleCount=t,this._uploadTriangles(0,a,{skipChunks:o?.uploaded}),Ng.debug(`${J.n(this.triangleCount)} triangles (storage buffer)`)}_allocateTriangleBuffers(e){let t=Math.max(1,e);this._assertFitsGPU(t*3*16);let n=S(t*3,4,Uint32Array),r=S(t*2,4,Uint32Array);return this.renderer.backend.createStorageAttribute(n),this.renderer.backend.createStorageAttribute(r),{geo:n,shade:r}}_uploadTriangles(e,t,{geo:n=!0,shade:r=!0,skipChunks:i=null,source:a=null,sourceStart:o=0,geoAttr:s=this.triangleGeoAttr,shadeAttr:c=this.triangleShadeAttr}={}){if(t<=0||!s)return;let l=this.renderer.backend,u=l.get(s).buffer,d=l.get(c).buffer,f=st.FLOATS_PER_TRIANGLE,p=this._triangleRecords,m=a?t:p?p.recordsPerChunk:this._triangleRecordCount,h=Mg;this._triangleStaging??={geo:new Uint32Array(h*12),shade:new Uint32Array(h*8)};let g=this._triangleStaging.geo,_=this._triangleStaging.shade;for(let s=e,c=e+t;s<c;){let t=a?0:Math.floor(s/m),v=a?e:t*m,y=Math.min(c,v+m);if(i?.has(t)){s=y;continue}let b=a??(p?p.chunks[t]:this._triangleFlat);if(!b)throw Error(`triangle chunk ${t} is on disk and was never uploaded`);let x=Math.min(h,y-s),S=(a?s-e+o:s-v)*f;for(let e=0,t=0,i=0;e<x;e++,S+=f){if(n)for(let e=0;e<12;e++)g[t++]=b[S+e];if(r)for(let e=12;e<f;e++)_[i++]=b[S+e]}n&&l.device.queue.writeBuffer(u,s*12*4,g,0,x*12),r&&l.device.queue.writeBuffer(d,s*8*4,_,0,x*8),s+=x}}createChunkUploader(e){this._assertFitsGPU(e.recordCount*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT);let t=S(e.recordCount*e.lanesPerRecord/4,4,e.LaneType),n=this.renderer.backend;n.createStorageAttribute(t);let r=n.get(t).buffer,i=e.recordsPerChunk*e.lanesPerRecord*e.LaneType.BYTES_PER_ELEMENT,a=new Set;return e._gpuUpload={attr:t,uploaded:a},t=>{let o=e.chunks[t];n.device.queue.writeBuffer(r,t*i,o,0,o.length),a.add(t)}}createTriangleChunkUploader(e){let{geo:t,shade:n}=this._allocateTriangleBuffers(e.recordCount),r=new Set;e._gpuUpload={triangles:!0,geo:t,shade:n,uploaded:r};let i=e.recordsPerChunk;return a=>{let o=a*i,s=Math.min(i,e.recordCount-o);this._uploadTriangles(o,s,{source:e.chunks[a],geoAttr:t,shadeAttr:n}),r.add(a)}}_assertFitsGPU(e){let t=this.renderer?.backend?.device?.limits,n=Math.min(t?.maxBufferSize??1/0,t?.maxStorageBufferBindingSize??1/0);if(e>n)throw Error(`the scene needs a ${J.mb(e)} GPU buffer, past the ${J.mb(n)} this GPU allows for one — load fewer triangles`)}_uploadChunked(e,t){let n=t._gpuUpload;if(!n||n.attr!==e){w(this.renderer,e,t.chunks);return}let r=this.renderer.backend.get(e).buffer,i=t.recordsPerChunk*t.lanesPerRecord*t.LaneType.BYTES_PER_ELEMENT;for(let e=0;e<t.chunks.length;e++){if(n.uploaded.has(e))continue;let a=t.chunks[e];if(!a)throw Error(`chunk ${e} is on disk and was never uploaded`);this.renderer.backend.device.queue.writeBuffer(r,e*i,a,0,a.length),n.uploaded.add(e)}}setBVHData(e){if(!e)return;let r=e.chunks&&e.chunks.length>1?e:null,i=r?null:e.chunks?e.chunks[0]:e,a=r?r.recordCount*r.lanesPerRecord:i.length,o=a/4;this._assertFitsGPU(a*4);let s=()=>r?r._gpuUpload?.attr??S(o,4,Float32Array):new t.StorageInstancedBufferAttribute(i,4);this.bvhStorageNode?(this.bvhStorageAttr=s(),this.bvhStorageNode.value=this.bvhStorageAttr,this.bvhStorageNode.bufferCount=o):(this.bvhStorageAttr=s(),this.bvhStorageNode=(0,n.storage)(this.bvhStorageAttr,`vec4`,o).toReadOnly()),this.bvhStorageAttr.foldedLeaves=e.foldedLeaves===!0,this._bvhRecords=r,r&&this._uploadChunked(this.bvhStorageAttr,r),this.bvhNodeCount=Math.floor(o/Fg),Ng.debug(`${J.n(this.bvhNodeCount)} BVH nodes (storage buffer)`)}setInstanceTable(e){this._instanceTable=e}setMeshVisibilityData(e){!e||e.length===0||!this._instanceTable||(this._patchVisibilityFromMeshes(e),this._flushBVHEdits())}_patchVisibilityFromMeshes(e){let t=this._instanceTable,n=new Map;for(let r=0;r<t.count;r++){if(!t.isSet[r])continue;let i=t.sourceMesh[r],a=n.get(i);a===void 0&&n.set(i,a=this._isWorldVisible(e[i])),this._patchTLASLeafVisibility(r,a)}}updateMeshVisibility(e,t){this._patchTLASLeafVisibility(e,t)&&this._flushBVHEdits()}updateAllMeshVisibility(){!this._meshRefs||!this._instanceTable||(this._patchVisibilityFromMeshes(this._meshRefs),this._flushBVHEdits())}_patchTLASLeafVisibility(e,t){let n=this._instanceTable;if(!n||!n.isSet?.[e]||!this.bvhStorageAttr)return!1;let r=n.tlasLeafIndex[e];return r<0?!1:(n.visible[e]=+!!t,this._bvhRecords?this._bvhRecords.chunkFor(r)[this._bvhRecords.baseOf(r)+2]=+!!t:this.bvhStorageAttr.array[r*16+2]=+!!t,this._dirtyBVHLeaves??=new Set,this._dirtyBVHLeaves.add(r),!0)}_flushBVHEdits(){if(this.bvhStorageAttr){if(!this._bvhRecords){let e=1/0,t=-1;for(let n of this._dirtyBVHLeaves??[])n<e&&(e=n),n>t&&(t=n);t>=0&&(this.bvhStorageAttr.addUpdateRange(e*16,(t-e+1)*16),this.bvhStorageAttr.version++),this._dirtyBVHLeaves?.clear();return}for(let e of this._dirtyBVHLeaves??[])T(this.renderer,this.bvhStorageAttr,this._bvhRecords,e*16,16);this._dirtyBVHLeaves?.clear()}}_collectMeshRefs(e){if(!e)return[];let t=[];return e.traverse(e=>{e.isMesh&&e.userData.meshIndex!==void 0&&(t[e.userData.meshIndex]=e)}),t}_isWorldVisible(e){for(;e;){if(!e.visible)return!1;e=e.parent}return!0}_updateStorageBuffer(e,t){e&&(e.array.set(t),e.clearUpdateRanges(),e.needsUpdate=!0)}updateTriangleData(e){e?.chunks?.length>1?this._triangleRecords=e:e&&(this._triangleFlat=e.chunks?e.chunks[0]:e),this._uploadTriangles(0,this._triangleRecordCount)}updateBVHData(e){if(this._bvhRecords){w(this.renderer,this.bvhStorageAttr,this._bvhRecords.chunks);return}this._updateStorageBuffer(this.bvhStorageAttr,e?.chunks?e.chunks[0]:e)}updateBufferRanges(e,t){if(this.triangleGeoAttr&&e.length>0){let t=st.FLOATS_PER_TRIANGLE;for(let n of e){let e=Math.floor(n.offset/t);this._uploadTriangles(e,Math.ceil((n.offset+n.count)/t)-e)}}if(this.bvhStorageAttr&&t.length>0)if(this._bvhRecords)for(let e of t)T(this.renderer,this.bvhStorageAttr,this._bvhRecords,e.offset,e.count);else{this.bvhStorageAttr.clearUpdateRanges();for(let e of t)this.bvhStorageAttr.addUpdateRange(e.offset,e.count);this.bvhStorageAttr.version++}}createStorageTextures(e,t){this.storageTextures.writeColor?this.storageTextures.setSize(e,t):this.storageTextures.create(e,t),this.resolution.value.set(e,t)}setupMaterial(){if(this.cameraOptimizer||this._initCameraOptimizer(),!this.triangleStorageNode){Ng.error(`triangle data required`);return}if(!this.bvhStorageNode){Ng.error(`BVH data required`);return}if(this.isReady&&this.shaderBuilder.getSceneTextureNodes()){this.shaderBuilder.updateSceneTextures(this);return}this._ensureStorageTextures(),this.shaderBuilder.createSceneTextureNodes(this,this.storageTextures),this.isReady=!0}_ensureStorageTextures(){let e=this.renderer.domElement,t=Math.max(1,e.width||this.width),n=Math.max(1,e.height||this.height);this.storageTextures.ensureSize(t,n)&&this.resolution.value.set(t,n)}_handleResize(){let{width:e,height:t}=this.renderer.domElement;(e!==this.storageTextures.renderWidth||t!==this.storageTextures.renderHeight)&&(this.createStorageTextures(e,t),this.frameCount=0),this.resolution.value.set(e,t)}_matricesApproxEqual(e,t,n=1e-10){let r=e.elements,i=t.elements;for(let e=0;e<16;e++)if(Math.abs(r[e]-i[e])>n)return!1;return!0}_updateCameraUniforms(){return!this._matricesApproxEqual(this.lastCameraMatrix,this.camera.matrixWorld)||!this._matricesApproxEqual(this.lastProjectionMatrix,this.camera.projectionMatrixInverse)?(this.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this.cameraViewMatrix.value.copy(this.camera.matrixWorldInverse),this.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.lastCameraMatrix.copy(this.camera.matrixWorld),this.lastProjectionMatrix.copy(this.camera.projectionMatrixInverse),!0):!1}_updateAccumulationUniforms(e){let t=this.cameraOptimizer?.isInInteractionMode()??!1;this.lastInteractionModeState=t,this.accumulationEnabled?t?(this.accumulationAlpha.value=1,this.hasPreviousAccumulated.value=0):(this.accumulationAlpha.value=Fe(e),this.hasPreviousAccumulated.value=+(e>0)):(this.accumulationAlpha.value=1,this.hasPreviousAccumulated.value=0)}_publishTexturesToContext(e,t){e.setTexture(`pathtracer:color`,t.color),e.setTexture(`pathtracer:normalDepth`,t.normalDepth),e.setTexture(`pathtracer:albedo`,t.albedo),e.setState(`pathtracer:samples`,this.frameCount),e.setState(`interactionMode`,this.cameraOptimizer?.isInInteractionMode()??!1),e.setState(`renderMode`,this.renderMode.value)}_emitStateEvents(){this.emit(`pathtracer:frameComplete`,{frame:this.frameCount,isComplete:this.isComplete}),this.cameraChanged&&=(this.emit(`camera:moved`),!1)}updateCompletionThreshold(){this.completionThreshold=Pe(this.renderMode.value,this.maxSamples.value)}setRenderLimitMode(e){this.renderLimitMode=e,this.updateCompletionThreshold()}manageASVGFForRenderMode(e){e!==this.lastRenderMode&&(this.renderModeChangeTimeout&&clearTimeout(this.renderModeChangeTimeout),this.pendingRenderMode=e,this.renderModeChangeTimeout=setTimeout(()=>{this.pendingRenderMode!==null&&this.pendingRenderMode!==this.lastRenderMode&&(this.lastRenderMode=this.pendingRenderMode,this.emit(`asvgf:reset`),this.emit(`denoiser:reset`)),this.renderModeChangeTimeout=null,this.pendingRenderMode=null},this.renderModeChangeDelay))}setUniform(e,t){this.uniforms.set(e,t)}setBlueNoiseTexture(e){this.stbnScalarTexture=e,e&&(L.value=e)}_rebuildLightBuffer(){let e=this._lbvhDataCache,n=this._emissiveDataCache,r=this.lightStorageAttr?.array,i=this._bitTrailMapCache??(r&&this._bitTrailLength?r.slice(this._bitTrailOffset,this._bitTrailOffset+this._bitTrailLength):null);this._bitTrailMapCache=null;let a=e?e.length:0,o=n?n.length:0,s=i?Math.ceil(i.length/4)*4:0,c=Math.max(a+o+s,4);if(this.lightStorageAttr&&c<=this.lightStorageAttr.array.length){let t=this.lightStorageAttr.array;e&&t.set(e,0),n&&t.set(n,a),i&&t.set(i,a+o),this.lightStorageAttr.needsUpdate=!0}else{let r=new Float32Array(c);e&&r.set(e,0),n&&r.set(n,a),i&&r.set(i,a+o),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(r,4),this.lightStorageNode.value=this.lightStorageAttr,this.lightStorageNode.bufferCount=r.length/4,this._lightBufferRealloc=!0}this.emissiveVec4Offset.value=(this.lightBVHNodeCount.value||0)*4,this.reverseMapVec4Offset.value=(a+o)/4,this._bitTrailOffset=a+o,this._bitTrailLength=i?i.length:0}setEmissiveTriangleData(e,t,n=0,r=null){e&&(this._emissiveDataCache=e,r&&(this._bitTrailMapCache=r),this.emissiveTriangleCount.value=t,this.emissiveTotalPower.value=n,this._rebuildLightBuffer(),Ng.debug(`${J.n(t)} emissive triangles · totalPower ${n.toFixed(4)} (storage buffer)`))}setLightBVHData(e,t){e&&(this._lbvhDataCache=e,this.lightBVHNodeCount.value=t,this._rebuildLightBuffer(),Ng.debug(`light BVH ${J.n(t)} nodes`))}updateUniforms(e){let t=!1;for(let[n,r]of Object.entries(e))this[n]&&this[n].value!==void 0&&this[n].value!==r&&(this[n].value=r,t=!0);t&&this.reset()}async rebuildMaterials(e){if(!this.sdfs)throw Error(`Scene not built yet. Call build() first.`);try{Ng.debug(`material rebuild started`),await this.sdfs.rebuildMaterials(e),this.materialData.setMaterialData(this.sdfs.materialData,this.sdfs.materials?.map(e=>e.sources)),this.materialData.loadTexturesFromSdfs(),this.shaderBuilder.updateSceneTextures(this),this.updateLights(),this.reset(),Ng.debug(`material rebuild complete`)}catch(e){Ng.error(`material rebuild failed:`,e);try{Ng.warn(`attempting recovery by resetting the path tracer`),this.reset()}catch(e){Ng.error(`recovery failed:`,e)}throw e}}dispose(){this.renderModeChangeTimeout&&=(clearTimeout(this.renderModeChangeTimeout),null),this.cameraOptimizer?.dispose(),this.materialData?.dispose(),this.environment?.dispose(),this.shaderBuilder?.dispose(),this.uniforms?.dispose(),this.storageTextures?.dispose(),this.stbnScalarTexture?.dispose(),this.stbnVec2Texture?.dispose(),this.placeholderTexture?.dispose(),this.triangleGeoAttr=null,this.triangleShadeAttr=null,this._triangleStaging=null,this._triangleRecords=null,this._triangleFlat=null,this._triangleRecordCount=0,this.triangleStorageNode=null,this.bvhStorageAttr=null,this._bvhRecords=null,this.bvhStorageNode=null,this.placeholderTexture=null,this.isReady=!1}};rn();var Lg=Wt(`gpu`),$={ACTIVE_RAY_COUNT:0,ENTERING_COUNT:1,CONVERGED_COUNT:2,RESERVED_3:3,ACTIVE_PIXEL_COUNT:4,GEOMETRY_COUNT:5,CONVERGED_GEOMETRY_COUNT:6,ACTIVE_ENERGY:7,COUNT:8},Rg=65535,zg={BOUNCE_MASK:255,ACTIVE:256,SPECULAR:512,INSIDE_MEDIUM:1024,RAY_TYPE_SHIFT:11,RAY_TYPE_MASK:63488,HAS_HIT_OPAQUE:65536,AUX_LOCKED:1<<17,REDIRECTED:1<<18,SUN_NEE:1<<19},Bg=class{constructor(e=0,t=null){this._renderer=t,this.capacity=0,this.counters=null,this.activeIndices=null,this.activeIndicesRO=null,this.sortedIndices=null,this.sortedIndicesRO=null,this.sortGlobalHistogram=null,this.pingPong=0,e>0&&this.allocate(e)}allocate(e){this.dispose(),this.capacity=e,this._countersAttr=new t.StorageInstancedBufferAttribute(new Uint32Array($.COUNT),1),this.counters=(0,n.storage)(this._countersAttr,`uint`).toAtomic(),this.MAX_BOUNCE_SNAPSHOTS=32,this._bounceCountsAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(2*this.MAX_BOUNCE_SNAPSHOTS),1),this.bounceCounts=(0,n.storage)(this._bounceCountsAttr,`uint`);let r=S(e,1,Uint32Array),i=S(e,1,Uint32Array);this._attrA=r,this._attrB=i,this.activeIndices={a:(0,n.storage)(r,`uint`),b:(0,n.storage)(i,`uint`)},this.activeIndicesRO={a:(0,n.storage)(r,`uint`).toReadOnly(),b:(0,n.storage)(i,`uint`).toReadOnly()};let a=S(e,1,Uint32Array);this._sortAttr=a,this.sortedIndices=(0,n.storage)(a,`uint`),this.sortedIndicesRO=(0,n.storage)(a,`uint`).toReadOnly(),this._sortGlobalHistAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(256),1),this.sortGlobalHistogram=(0,n.storage)(this._sortGlobalHistAttr,`uint`).toAtomic(),this.pingPong=0,this.totalBytes=$.COUNT*4+e*4*3,Lg.debug(`queues capacity ${J.n(e)} · ${J.mb(this.totalBytes)}`)}resize(e){return e<=this.capacity&&this.capacity>0?!1:(this.allocate(e),!0)}getCounters(){return this.counters}getActiveReadRO(){return this.pingPong===0?this.activeIndicesRO.a:this.activeIndicesRO.b}getActiveRead(){return this.pingPong===0?this.activeIndices.a:this.activeIndices.b}getActiveWrite(){return this.pingPong===0?this.activeIndices.b:this.activeIndices.a}getSortedRW(){return this.sortedIndices}getSortedRO(){return this.sortedIndicesRO}getSortGlobalHistogram(){return this.sortGlobalHistogram}getCountersAttribute(){return this._countersAttr}getBounceCounts(){return this.bounceCounts}getBounceCountsAttribute(){return this._bounceCountsAttr}swap(){this.pingPong=1-this.pingPong}resetPingPong(){this.pingPong=0}dispose(){ba(this._renderer,this._countersAttr),ba(this._renderer,this._bounceCountsAttr),ba(this._renderer,this._attrA),ba(this._renderer,this._attrB),ba(this._renderer,this._sortAttr),ba(this._renderer,this._sortGlobalHistAttr),this._countersAttr=this._bounceCountsAttr=null,this._attrA=this._attrB=this._sortAttr=this._sortGlobalHistAttr=null,this.counters=null,this.activeIndices=null,this.activeIndicesRO=null,this.sortedIndices=null,this.sortedIndicesRO=null,this.sortGlobalHistogram=null,this.capacity=0}},Vg={[r.RGBAFormat]:4,[r.RGBFormat]:3,[r.RGFormat]:2,[r.RedFormat]:1},Hg={[r.FloatType]:4,[r.HalfFloatType]:2,[r.UnsignedByteType]:1,[r.ByteType]:1,[r.UnsignedShortType]:2,[r.ShortType]:2,[r.UnsignedIntType]:4,[r.IntType]:4};function Ug(e){return(Vg[e.format]??4)*(Hg[e.type]??4)}function Wg(e){return e?.gpuByteLength??e?.array?.byteLength??0}function Gg(e){if(!e)return 0;if(e.isRenderTarget){let t=e.textures?.length?e.textures:[e.texture],n=e.width||0,r=e.height||0,i=e.depth||1,a=0;for(let e of t)e&&(a+=n*r*i*Ug(e));return a}let t=e.image||{},n=t.width??e.width??0,r=t.height??e.height??0,i=t.depth??1;return n*r*i*Ug(e)}var Kg=class{constructor(e=null){this._providers=[],this._renderer=e,this.current=0,this.peak=0,this.byCategory={}}setRenderer(e){this._renderer=e}register(e,t){this._providers.push({category:e,fn:t})}measure(){let e=new WeakSet,t={},n=0;for(let{category:r,fn:i}of this._providers){let a;try{a=i()}catch{a=null}if(!a)continue;let o=0;for(let t of Array.isArray(a)?a:[a])o+=this._resourceBytes(t,e);t[r]=(t[r]||0)+o,n+=o}return this.byCategory=t,this.current=n,n>this.peak&&(this.peak=n),{current:n,peak:this.peak,byCategory:t}}_resourceBytes(e,t){return e?typeof e.bytes==`number`&&!e.isTexture&&!e.isRenderTarget?e.bytes:e.gpuByteLength==null?e.array&&e.array.byteLength!=null?t.has(e.array)?0:(t.add(e.array),e.array.byteLength):e.isRenderTarget||e.isTexture?t.has(e)?0:(t.add(e),this._residentTextureBytes(e)):0:t.has(e)?0:(t.add(e),e.gpuByteLength):0}_isResident(e){let t=this._renderer?.backend;if(!t||typeof t.get!=`function`)return!0;if(typeof t.has==`function`&&!t.has(e))return!1;let n=t.get(e);return!!(n&&(n.texture||n.gpuTexture))}_residentTextureBytes(e){if(e.isRenderTarget){let t=e.textures?.length?e.textures:[e.texture],n=e.width||0,r=e.height||0,i=e.depth||1,a=0;for(let e of t)e&&this._isResident(e)&&(a+=n*r*i*Ug(e));return a}return this._isResident(e)?Gg(e):0}resetPeak(){this.peak=this.current}getReport(){let e=e=>(e/1048576).toFixed(1),t=Object.entries(this.byCategory).map(([t,n])=>`${t}=${e(n)}`);return`VRAM current=${e(this.current)}MB peak=${e(this.peak)}MB [${t.join(` `)}]`}};rn();var qg=Wt(`wavefront`),Jg=class{constructor(e){this.renderer=e,this.kernels=new Map,this.timing=new Map,this.profiling=!1,this.profile=new Map,this._firstDispatches=[],this._firstDispatchFlush=null}_recordFirstDispatch(e,t){this._firstDispatches.push({name:e,ms:t}),clearTimeout(this._firstDispatchFlush),this._firstDispatchFlush=setTimeout(()=>this._flushFirstDispatches(),0)}_flushFirstDispatches(){let e=this._firstDispatches;if(this._firstDispatches=[],this._firstDispatchFlush=null,e.length===0)return;let t=e.reduce((e,t)=>e+t.ms,0),n=[...e].sort((e,t)=>t.ms-e.ms);qg.info(J.list([`${e.length} kernel${e.length===1?``:`s`} compiled in ${J.ms(t)}`,`slowest ${n.slice(0,2).map(e=>`${e.name} ${J.ms(e.ms)}`).join(`, `)}`])),e.forEach(e=>qg.debug(`kernel '${e.name}' first dispatch (incl. compilation) ${J.ms(e.ms)}`))}register(e,t){this.kernels.set(e,t),this.timing.set(e,{compiledOnce:!1,lastDispatchMs:0})}dispatch(e){let t=this.kernels.get(e);if(!t)throw Error(`KernelManager: Unknown kernel '${e}'`);let n=this.timing.get(e);if(n&&!n.compiledOnce){let r=performance.now();this.renderer.compute(t);let i=performance.now();n.compiledOnce=!0,n.lastDispatchMs=i-r,this._recordFirstDispatch(e,i-r)}else if(this.profiling){let n=performance.now();this.renderer.compute(t);let r=performance.now(),i=this.profile.get(e);i||(i={calls:0,totalMs:0},this.profile.set(e,i)),i.calls++,i.totalMs+=r-n}else this.renderer.compute(t)}setDispatchForCount(e,t){let n=this.kernels.get(e);if(!n)return;let r=Math.ceil(t/n.workgroupSize[0]),i=this.renderer?.backend?.device?.limits.maxComputeWorkgroupsPerDimension??65535;n.dispatchSize=r>i?[i,Math.ceil(r/i),1]:[r,1,1]}setDispatchForGrid(e,t,n){let r=this.kernels.get(e);if(!r)return;let i=r.workgroupSize;r.dispatchSize=[Math.ceil(t/i[0]),Math.ceil(n/i[1]),1]}has(e){return this.kernels.has(e)}get(e){return this.kernels.get(e)}getTimingReport(){let e={};for(let[t,n]of this.timing)e[t]={...n};return e}enableProfiling(e){this.profiling=e,e&&this.profile.clear()}getProfileReport(){let e=[],t=0;for(let[n,{calls:r,totalMs:i}]of this.profile)t+=i,e.push({name:n,calls:r,totalMs:+i.toFixed(2),avgMs:+(i/r).toFixed(3)});return e.sort((e,t)=>t.totalMs-e.totalMs),e.push({name:`TOTAL`,calls:e.reduce((e,t)=>e+t.calls,0),totalMs:+t.toFixed(2),avgMs:null}),e}dispose(){clearTimeout(this._firstDispatchFlush),this._firstDispatchFlush=null,this._firstDispatches=[],this.kernels.clear(),this.timing.clear(),this.profile.clear()}},Yg=(0,n.int)(Ke.equirectangular),Xg=(0,n.int)(Ke.orthographic),Zg=e=>e.equal(Xg);function Qg(){let e={cameraProjection:(0,n.uniform)(0,`int`),panoLonRange:(0,n.uniform)(new r.Vector2,`vec2`),panoLatRange:(0,n.uniform)(new r.Vector2,`vec2`),panoLevelHorizon:(0,n.uniform)(1,`int`),sync(t){e.cameraProjection.value=t.get(`cameraProjection`).value,e.panoLonRange.value.copy(t.get(`panoLonRange`).value),e.panoLatRange.value.copy(t.get(`panoLatRange`).value),e.panoLevelHorizon.value=t.get(`panoLevelHorizon`).value}};return e}var $g=(e,t,n,r)=>({origin:t_(e,t,n,r.cameraProjection),direction:n_(e,t,n,r.cameraProjection,r.panoLonRange,r.panoLatRange,r.panoLevelHorizon)}),e_=(e,t,n,r,i)=>{let{origin:a,direction:o}=$g(e,n,r,i);return a.add(o.mul(t))},t_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec3)(t[3]).toVar();return(0,n.If)(Zg(i),()=>{let i=r.mul((0,n.vec4)(e.x.mul(2).sub(1),(0,n.float)(1).sub(e.y.mul(2)),0,1));a.assign(t.mul((0,n.vec4)(i.xy,0,1)).xyz)}),a}),n_=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.vec3)(0).toVar();return(0,n.If)(i.equal(Yg),()=>{let r=(0,n.mix)(a.x,a.y,e.x).toVar(),i=(0,n.mix)(o.y,o.x,e.y).toVar(),l=(0,n.cos)(i).toVar(),u=(0,n.vec3)(0).toVar(),d=(0,n.vec3)(0).toVar(),f=(0,n.vec3)(0).toVar();(0,n.If)(s.equal((0,n.int)(1)),()=>{let e=(0,n.vec3)(t[2].x,0,t[2].z).toVar();(0,n.If)((0,n.dot)(e,e).lessThan((0,n.float)(1e-8)),()=>{e.assign((0,n.vec3)(t[1].x,0,t[1].z))}),f.assign((0,n.normalize)(e)),d.assign((0,n.vec3)(0,1,0)),u.assign((0,n.cross)(d,f))}).Else(()=>{u.assign((0,n.normalize)((0,n.vec3)(t[0]))),d.assign((0,n.normalize)((0,n.vec3)(t[1]))),f.assign((0,n.normalize)((0,n.vec3)(t[2])))}),c.assign((0,n.normalize)(u.mul((0,n.sin)(r).mul(l)).add(d.mul((0,n.sin)(i))).sub(f.mul((0,n.cos)(r).mul(l)))))}).ElseIf(Zg(i),()=>{c.assign((0,n.normalize)((0,n.vec3)(t[2])).negate())}).Else(()=>{let i=(0,n.vec3)(e.x.mul(2).sub(1),(0,n.float)(1).sub(e.y.mul(2)),1),a=r.mul((0,n.vec4)(i,1));c.assign((0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(a.xyz.div(a.w))))}),c}),r_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_])=>{let v=t_(e,r,i,a).toVar(),y=n_(e,r,i,a,o,s,c).toVar(),b=v.toVar(),x=y.toVar(),S=g.equal((0,n.int)(1)),C=S.and(_.greaterThan(0)).or(S.not().and(u.greaterThan(0)).and(d.lessThan(64)));return(0,n.If)(l.and(C).and(f.greaterThan(.001)),()=>{let e=(0,n.select)(a.equal(Yg),s.y.sub(s.x).mul(.5),(0,n.select)(Zg(a),(0,n.float)(1),i[1].y)),o=(0,n.select)(S,_.mul(f).mul(e),u.div(d.mul(2)).mul(.001).mul(p).mul(m)),c=ae(t),l=c.x.mul(h.max(.01)),g=c.y,C=(0,n.vec3)(0).toVar(),w=f.toVar();(0,n.If)(a.equal(Yg),()=>{C.assign(Ki({N:y}).mul((0,n.vec3)(l,g,0)))}).Else(()=>{let e=(0,n.normalize)((0,n.vec3)(r[0])),t=(0,n.normalize)((0,n.vec3)(r[1]));C.assign(e.mul(l).add(t.mul(g))),w.assign(f.div((0,n.dot)(y,(0,n.normalize)((0,n.vec3)(r[2]))).negate()))}),b.assign(v.add(C.mul(o))),x.assign((0,n.normalize)(v.add(y.mul(w)).sub(b)))}),di({origin:b,direction:x})});function i_(e){let{rayBufferRW:t,hitBufferRW:r,gBufferRW:i,resolution:a,frame:o,cameraWorldMatrix:s,cameraProjectionMatrixInverse:c,cameraProjection:l,panoLonRange:u,panoLatRange:d,panoLevelHorizon:f,enableDOF:p,focalLength:m,aperture:h,focusDistance:g,unitsPerMetre:_,apertureScale:v,anamorphicRatio:y,dofMode:b,dofBlur:x,renderWidth:S,chunkRowBase:C,chunkRows:w,transmissiveBounces:T,auxGBufferEnabled:E,listDriven:D=!1,activeIndicesRO:O=null,counters:k=null}=e,A=E.greaterThan((0,n.uint)(0)),j=(e,S,C)=>{let w=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(S).add(.5)),E=ne({state:ye({pixelCoord:w,rayIndex:(0,n.int)(0),frame:o}).toVar()}).toVar(),D=ve(w,(0,n.int)(1),(0,n.int)(1),E,a,o).toVar().sub(.5),O=(0,n.vec2)(w.x.add(D.x),w.y.sub(D.y)).div(a),k=di.wrap(r_(O,E,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x));La(t,C,k.origin,(0,n.int)(0),(0,n.int)(0)),Ra(t,C,k.direction,(0,n.uint)(zg.ACTIVE)),za(t,C,(0,n.vec4)(1,1,1,0).xyz,(0,n.float)(0)),Ba(t,C,(0,n.vec4)((0,n.vec3)(0),(0,n.float)(1))),(0,n.If)(A,()=>{ka(i,C,(0,n.vec3)(0,0,1),(0,n.float)(1),(0,n.vec3)(0),(0,n.float)(0)),io(t,C,(0,n.vec3)(1))}),Qa(t,C,(0,n.uint)(0),(0,n.uint)(T),(0,n.float)(1),(0,n.float)(1),(0,n.float)(1)),Ya(r,C,E)};return(0,n.Fn)(()=>{if(D){let e=n.instanceIndex;(0,n.If)(e.lessThan((0,n.atomicLoad)(k.element((0,n.uint)($.ENTERING_COUNT)))),()=>{let t=(0,n.int)(O.element(e)),r=t.add(C.mul(S));j(r.mod(S),r.div(S),(0,n.uint)(t))})}else{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),t=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(S).and(t.lessThan(w)),()=>{j(e,t.add(C),(0,n.uint)(t.mul(S).add(e)))})}})}var a_=32,o_=4096,s_=4,c_=1e8,l_=()=>(0,n.array)(`int`,a_).toVar(),u_=e=>(0,n.int)((0,n.uint)(e.bitNot()).shiftRight((0,n.uint)(4))),d_=e=>(0,n.int)((0,n.uint)(e.bitNot()).bitAnd((0,n.uint)(15))),f_=e=>e?e=>e.shiftRight((0,n.uint)(30)).equal((0,n.uint)(1)):e=>e.greaterThanEqual((0,n.uint)(mt)),p_=e=>{let t=(0,n.mix)((0,n.vec3)(1),(0,n.sign)(e),(0,n.notEqual)(e,(0,n.vec3)(0)));return(0,n.mix)((0,n.vec3)(1).div(e),(0,n.vec3)(c_).mul(t),(0,n.lessThan)((0,n.abs)(e),(0,n.vec3)(1e-8)))},m_=(e,t)=>(0,n.vec3)(e[0].xyz.dot(t).add(e[0].w),e[1].xyz.dot(t).add(e[1].w),e[2].xyz.dot(t).add(e[2].w)),h_=(e,t)=>(0,n.vec3)(e[0].xyz.dot(t),e[1].xyz.dot(t),e[2].xyz.dot(t)),g_=(0,n.wgslFn)(`
|
|
716
716
|
fn RayTriangleGeometry( rayOrigin: vec3f, rayDir: vec3f, pA: vec3f, pB: vec3f, pC: vec3f, closestHitDst: f32, woopParams: vec4f ) -> vec4f {
|
|
717
717
|
|
|
718
718
|
// Returns vec4(t, u, v, hit) where hit > 0.5 means intersection.
|
|
@@ -854,7 +854,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
854
854
|
let texSample = textureSampleLevel( tex, samp, uv, 0.0 );
|
|
855
855
|
return texSample * environmentIntensity;
|
|
856
856
|
}
|
|
857
|
-
`,[A_]),F_=(0,n.Fn)(([e,t,r,i])=>{let a=t.toConst(),o=e.toVar();o.y.subAssign(i);let s=r.mul(r).toConst(),c=o.dot(a).toConst(),l=o.dot(o).sub(s).toConst(),u=c.mul(c).sub(l).toConst(),d=t.toVar();return(0,n.If)(u.greaterThanEqual(0),()=>{let t=(0,n.sqrt)(u).sub(c).toVar(),i=(0,n.float)(1e6).toVar(),l=a.y.toConst();(0,n.If)(l.lessThanEqual(0),()=>{let t=e.y.negate().div(l).toConst(),r=e.add(a.mul(t)).toConst();(0,n.If)(r.dot(r).lessThan(s),()=>{i.assign(t)})}),(0,n.If)(t.greaterThan(0),()=>{d.assign(o.add(a.mul((0,n.min)(t,i))).div(r))})}),d}),I_=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=t.toVar();return(0,n.If)(r,()=>{let r=(0,n.vec3)(e.x,e.y.sub(o),e.z);s.assign(F_(r,t,i,a))}),s}),L_=(0,n.Fn)(([e,t])=>{let r=(0,n.vec3)(0).toVar();return(0,n.If)(e.roughness.greaterThan(.98).and(e.metalness.lessThan(.02)).and(e.transmission.equal(0)).and(e.clearcoat.equal(0)).and(e.sheen.equal(0)).and(e.iridescence.equal(0)),()=>{r.assign(e.color.rgb.mul((0,n.float)(1).sub(e.metalness)).mul(Ai))}).Else(()=>{let i=Si.wrap(bd(e,e.color.rgb)).toVar(),a=i.F0.toVar(),o=(0,n.vec3)(0).toVar(),s=e.color.rgb.toVar();(0,n.If)(e.dispersion.greaterThan(0).and(e.transmission.greaterThan(.5)),()=>{let t=(0,n.clamp)(e.dispersion.mul(.1),0,.8),r=(0,n.max)((0,n.max)(s.r,s.g),s.b),i=(0,n.min)((0,n.min)(s.r,s.g),s.b);(0,n.If)(r.greaterThan(i),()=>{let e=s.sub(i).div(r.sub(i));s.assign((0,n.mix)(s,e,t.mul(.3)))})}),(0,n.If)(e.iridescence.greaterThan(0),()=>{let r=e.iridescenceThicknessRange.y;o.assign(Od((0,n.float)(1),e.iridescenceIOR,t.VoH,r,a)),a.assign((0,n.mix)(a,o,e.iridescence))});let c=(0,n.mix)((0,n.mix)((0,n.mix)(i.f0,(0,n.vec3)(i.f90),rd(t.VoH,i.eta)),Zu(t.VoH,i.F0m),e.metalness),Zu(t.VoH,o),e.iridescence).toVar(),l=(0,n.vec3)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let n=Sd(e.roughness,e.anisotropy),r=Cd(n.x,n.y,t.NoH,t.ToH,t.BoH),i=wd(n.x,n.y,t.ToV,t.BoV,t.ToL,t.BoL,t.NoV,t.NoL);l.assign(c.mul(r.mul(i)))}).Else(()=>{let n=ad(t.NoH,e.roughness),r=ud(t.NoV,t.NoL,e.roughness);l.assign(n.mul(r).mul(c))});let u=xi.wrap(yd(i.f0,i.f90,i.eta,i.F0m,e.metalness,o,e.iridescence,a,t.NoV,e.roughness)),d=l.mul(u.compensation),f=(0,n.vec3)(1).sub(u.E_total).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).mul(s).mul(Ai).add(d).toVar();(0,n.If)(e.sheen.greaterThan(0),()=>{let i=od(t.NoH,e.sheenRoughness),a=cd(t.NoV,t.NoL),o=e.sheenColor.mul(e.sheen).mul(i).mul(a),s=vd(t.NoV,e.sheenRoughness),c=(0,n.clamp)(e.sheenColor.mul(e.sheen).mul(s),(0,n.vec3)(0),(0,n.vec3)(1)),l=(0,n.vec3)(1).sub(c);r.assign(f.mul(l).add(o))}).Else(()=>{r.assign(f)}),(0,n.If)(e.clearcoat.greaterThan(0),()=>{let i=(0,n.max)(e.clearcoatRoughness,Pi),a=(0,n.vec3)(.04),o=xi.wrap(yd(a,(0,n.float)(1),(0,n.float)(1.5),(0,n.vec3)(0),(0,n.float)(0),(0,n.vec3)(0),(0,n.float)(0),a,t.NoV,i)),s=ad(t.NoH,i),c=ud(t.NoV,t.NoL,i),l=nd(t.VoH,(0,n.float)(1.5)),u=(0,n.vec3)(s.mul(c).mul(l)).mul(o.compensation),d=(0,n.vec3)(1).sub(o.E_total.mul(e.clearcoat));r.assign(r.mul(d).add(u.mul(e.clearcoat)))})}),r}),R_=(0,n.Fn)(([e,t,n,r])=>L_(r,bi.wrap(Ji(n,e,t,r)))),z_=(0,n.vec3)(...qo),B_=(0,n.vec3)(...qo.map(e=>(e+2)/2)),V_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec3)(0).toVar();return(0,n.If)((0,n.dot)(e,t).greaterThanEqual(i.x).and(e.y.greaterThanEqual(i.w.negate())),()=>{let o=(0,n.cross)(e,t),s=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub((0,n.dot)(o,o).mul(i.z)),1e-8));a.assign(r.mul((0,n.pow)((0,n.vec3)(s),z_)).mul(B_))}),a}),H_=(0,n.Fn)(([e,t,r])=>{let i=r.x.mul(t.y.mul(1/(2*Math.PI))),a=(0,n.float)(1).sub(i),o=(0,n.sqrt)((0,n.max)(i.mul((0,n.float)(2).sub(i)),0)),s=r.y.mul(2*Math.PI),c=e,l=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(c.x).greaterThan(.9),(0,n.vec3)(0,1,0),(0,n.vec3)(1,0,0)),c)),u=(0,n.cross)(c,l);return(0,n.normalize)(c.mul(a).add(l.mul((0,n.cos)(s)).add(u.mul((0,n.sin)(s))).mul(o)))}),U_=2*ki,W_=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(t.lessThan((0,n.float)(ki).sub(.001)).and(e.greaterThan(0)),()=>{let i=t.mul(.5).toVar(),a=(0,n.tan)(i).toVar(),o=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(e.mul(e)),0)).div((0,n.max)(e,1e-4)),s=(0,n.select)(i.greaterThan(.05),(0,n.float)(1).div((0,n.max)(a.sub(i),1e-6)),(0,n.float)(3).div((0,n.max)(i.mul(i).mul(i),1e-9)));r.assign((0,n.max)(a.sub(o).mul(s),0))}),r}),G_=(0,n.Fn)(([e])=>{let t=(0,n.select)(e.normalize.greaterThan(.5),(0,n.float)(1).div((0,n.max)(e.area,1e-10)),(0,n.float)(1));return e.color.mul(e.intensity).mul(Ai).mul(t)}),K_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.bool)(!1).toVar(),o=(0,n.vec3)(0,1,0).toVar(),s=(0,n.vec3)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.int)(2).toVar();return(0,n.If)(e.area.greaterThan(0),()=>{let d=(0,n.vec3)(0).toVar(),f=(0,n.float)(-1).toVar();(0,n.If)(e.shape.greaterThan(.5),()=>{let t=(0,n.sqrt)(r.x).toVar(),i=(0,n.float)(U_).mul(r.y).toVar();d.assign(e.position.add(e.u.mul(t.mul((0,n.cos)(i)))).add(e.v.mul(t.mul((0,n.sin)(i)))))}).Else(()=>{let i=sp(t,e.position.sub(e.u).sub(e.v),e.u.mul(2),e.v.mul(2),r).toVar();(0,n.If)(i.w.greaterThan(0),()=>{d.assign(i.xyz),f.assign(i.w)}).Else(()=>{d.assign(e.position.add(e.u.mul(r.x.mul(2).sub(1))).add(e.v.mul(r.y.mul(2).sub(1))))})});let p=d.sub(t).toVar(),m=(0,n.dot)(p,p).toVar();(0,n.If)(m.greaterThanEqual(1e-10),()=>{let t=(0,n.sqrt)(m).toVar(),r=p.div(t).toVar(),d=(0,n.dot)(r.negate(),e.normal).toVar();u.assign((0,n.int)(1)),c.assign(t),o.assign(r),s.assign(G_(e).mul(W_(d,e.spread)));let h=m.div((0,n.max)(e.area.mul((0,n.max)(d,.001)),1e-10)),g=(0,n.select)(f.greaterThan(0),f,h);l.assign(g.mul(i)),a.assign(d.greaterThan(0))})}),Hf({valid:a,direction:o,emission:s,distance:c,pdf:l,lightType:u,selectionTotalWeight:(0,n.float)(0)})}),q_=(0,n.Fn)(([e,t,r])=>{let i=(0,n.bool)(!1).toVar(),a=(0,n.vec3)(0,1,0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.int)(3).toVar(),u=e.position.sub(t).toVar(),d=(0,n.dot)(u,u).toVar();return(0,n.If)(d.greaterThanEqual(1e-20),()=>{let t=(0,n.sqrt)(d).toVar(),l=u.div(t).toVar(),f=(0,n.dot)(l.negate(),e.direction).toVar(),p=(0,n.cos)(e.angle).toVar();a.assign(l),s.assign(t),c.assign(r),i.assign(f.greaterThanEqual(p)),(0,n.If)(i,()=>{let n=Xf({coneCosine:p,blend:e.penumbra,angleCosine:f}),r=Yf({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay}),i=$f(e,l),a=rp(e,l);o.assign(e.color.mul(e.intensity).mul(r).mul(n).mul(i).mul(a))})}),Hf({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),J_=(0,n.Fn)(([e,t,r])=>{let i=(0,n.bool)(!1).toVar(),a=(0,n.vec3)(0,1,0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.int)(2).toVar(),u=e.position.sub(t).toVar(),d=(0,n.dot)(u,u).toVar();return(0,n.If)(d.greaterThanEqual(1e-20),()=>{let t=(0,n.sqrt)(d).toVar(),f=u.div(t),p=Yf({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay});l.assign((0,n.int)(2)),a.assign(f),s.assign(t),o.assign(e.color.mul(e.intensity).mul(p)),c.assign(r),i.assign((0,n.bool)(!0))}),Hf({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),Y_=(0,n.Fn)(([e,t,r,i,a])=>{let o=(0,n.bool)(!1).toVar(),s=(0,n.vec3)(0,1,0).toVar(),c=(0,n.vec3)(0).toVar(),l=(0,n.float)(0).toVar();return(0,n.If)(e.intensity.greaterThan(0),()=>{let u=(0,n.normalize)(e.direction).toVar(),d=e.color.mul(e.intensity).mul(ep(e,t)).toVar();s.assign(u),l.assign(r),(0,n.If)(e.angle.greaterThan(0),()=>{let t=(0,n.cos)(e.angle.mul(.5)).toVar(),o=(0,n.mix)(t,(0,n.float)(1),i).toVar(),c=(0,n.sqrt)((0,n.max)((0,n.float)(0),(0,n.float)(1).sub(o.mul(o)))).toVar(),f=(0,n.float)(U_).mul(a).toVar(),p=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(u.x).greaterThan(.9),(0,n.vec3)(0,1,0),(0,n.vec3)(1,0,0)),u)).toVar(),m=(0,n.cross)(u,p).toVar();s.assign((0,n.normalize)(u.mul(o).add(p.mul((0,n.cos)(f)).add(m.mul((0,n.sin)(f))).mul(c))));let h=(0,n.float)(U_).mul((0,n.max)((0,n.float)(1).sub(t),1e-10)).toVar();d.assign(d.div(h)),l.assign(r.div(h))}),c.assign(d),o.assign((0,n.bool)(!0))}),Hf({valid:o,direction:s,emission:c,distance:(0,n.float)(1e6),pdf:l,lightType:(0,n.int)(0),selectionTotalWeight:(0,n.float)(0)})}),X_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v])=>{let y=(0,n.bool)(!1).toVar(),b=(0,n.vec3)(0,1,0).toVar(),x=(0,n.vec3)(0).toVar(),S=(0,n.float)(0).toVar(),C=(0,n.float)(0).toVar(),w=(0,n.int)(2).toVar(),T=(0,n.float)(0).toVar(),E=f.add(m).add(g).add(v).toVar();return(0,n.If)(E.greaterThan((0,n.int)(0)),()=>{let D=(0,n.int)(se+64).toVar(),O=D.add(f).toVar(),k=O.add(m).toVar(),A=k.add(g).toVar(),j=(0,n.int)(-1).toVar(),M=(0,n.int)(-1).toVar(),N=(0,n.float)(0).toVar();(0,n.If)(f.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:f,type:`int`,condition:`<`},({i:e})=>{let i=Pf(Rf.wrap(Wf(d,e)),t,r,a).toVar();T.addAssign(i),(0,n.If)(i.greaterThan(0).and(ve(s,(0,n.int)(0),D.add(e),o,c,l).mul(T).lessThan(i)),()=>{j.assign(0),M.assign(e),N.assign(i)})})}),(0,n.If)(m.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:m,type:`int`,condition:`<`},({i})=>{let a=zf.wrap(Gf(p,i)),u=(0,n.select)(a.intensity.greaterThan(0),Ff(a,e,t,r),(0,n.float)(0)).toVar();T.addAssign(u),(0,n.If)(u.greaterThan(0).and(ve(s,(0,n.int)(0),O.add(i),o,c,l).mul(T).lessThan(u)),()=>{j.assign(1),M.assign(i),N.assign(u)})})}),(0,n.If)(g.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:g,type:`int`,condition:`<`},({i})=>{let a=If(Bf.wrap(Kf(h,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(ve(s,(0,n.int)(0),k.add(i),o,c,l).mul(T).lessThan(a)),()=>{j.assign(2),M.assign(i),N.assign(a)})})}),(0,n.If)(v.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:v,type:`int`,condition:`<`},({i})=>{let a=Lf(Vf.wrap(qf(_,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(ve(s,(0,n.int)(0),A.add(i),o,c,l).mul(T).lessThan(a)),()=>{j.assign(3),M.assign(i),N.assign(a)})})}),(0,n.If)(T.lessThanEqual(0),()=>{let t=(0,n.int)(i.x.mul((0,n.float)(E))).toVar(),r=(0,n.float)(1).div((0,n.max)((0,n.float)(E),1)).toVar();C.assign(r);let a=(0,n.bool)(!1).toVar(),T=(0,n.int)(0).toVar();(0,n.If)(f.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(f))),()=>{let f=Rf.wrap(Wf(d,t.sub(T)));(0,n.If)(f.intensity.greaterThan(0),()=>{let t=Hf.wrap(Y_(f,e,r,i.y,ve(s,(0,n.int)(0),u.add((0,n.int)(14)),o,c,l)));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(f)}),(0,n.If)(m.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(m))),()=>{let d=zf.wrap(Gf(p,t.sub(T)));(0,n.If)(d.intensity.greaterThan(0),()=>{let t=(0,n.vec2)(i.y,ve(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),f=Hf.wrap(K_(d,e,t,r));y.assign(f.valid),b.assign(f.direction),x.assign(f.emission),S.assign(f.distance),C.assign(f.pdf),w.assign(f.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(m)}),(0,n.If)(g.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(g))),()=>{let i=Bf.wrap(Kf(h,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Hf.wrap(J_(i,e,r));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(g)}),(0,n.If)(v.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(v))),()=>{let i=Vf.wrap(qf(_,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Hf.wrap(q_(i,e,r));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})})})}).Else(()=>{let t=N.div((0,n.max)(T,1e-10)).toVar();(0,n.If)(j.equal((0,n.int)(0)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let r=Rf.wrap(Wf(d,M)),a=Hf.wrap(Y_(r,e,t,i.y,ve(s,(0,n.int)(0),u.add((0,n.int)(14)),o,c,l)));b.assign(a.direction),x.assign(a.emission),S.assign(a.distance),C.assign(a.pdf),w.assign(a.lightType),y.assign(a.valid)}),(0,n.If)(j.equal((0,n.int)(1)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let r=zf.wrap(Gf(p,M)),a=(0,n.vec2)(i.y,ve(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),d=Hf.wrap(K_(r,e,a,t));y.assign(d.valid),b.assign(d.direction),x.assign(d.emission),S.assign(d.distance),C.assign(d.pdf),w.assign(d.lightType)}),(0,n.If)(j.equal((0,n.int)(2)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let n=Bf.wrap(Kf(h,M)),r=Hf.wrap(J_(n,e,t));y.assign(r.valid),b.assign(r.direction),x.assign(r.emission),S.assign(r.distance),C.assign(r.pdf),w.assign(r.lightType)}),(0,n.If)(j.equal((0,n.int)(3)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let n=Vf.wrap(qf(_,M)),r=Hf.wrap(q_(n,e,t));y.assign(r.valid),b.assign(r.direction),x.assign(r.emission),S.assign(r.distance),C.assign(r.pdf),w.assign(r.lightType)})})}),Hf({valid:y,direction:b,emission:x,distance:S,pdf:C,lightType:w,selectionTotalWeight:T})}),Z_=(0,n.Fn)(([e,t])=>(0,n.max)(Md(e,t),1e-8)),Q_=(0,n.Fn)(([e,t,n,r])=>Z_(r,bi.wrap(Ji(n,e,t,r)))),$_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,F,I,L,ee,te,ne,re])=>{let ie=(0,n.vec3)(0).toVar(),R=(0,n.vec3)(0).toVar(),ae=Di(e,I).toVar(),oe=t=>w_({hitPoint:e,offsetNormal:I,lift:F,faceN:I,smoothN:r,L:t,cutoff:L}),se=(0,n.Fn)(([e,t,n])=>Nf(e,t,n,S_,C,w,T)),ce=g.add(v).add(b).add(S).toVar(),le=ce.greaterThan((0,n.int)(0)).toVar(),ue=(0,n.float)(0).toVar();return(0,n.If)(le,()=>{let o=_e(d,(0,n.int)(0),m.add((0,n.int)(2)),u,f,p).toVar(),s=Hf.wrap(X_(e,t,i,o,l,u,d,f,p,m,h,g,_,v,y,b,x,S));ue.assign(s.selectionTotalWeight),(0,n.If)(s.valid.and(s.pdf.greaterThan(0)),()=>{let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,s.direction)).toVar();(0,n.If)(o.greaterThan(0).and(Jf({direction:s.direction,surfaceNormal:r})),()=>{let r=oe(s.direction).toVar(),c=e.add(s.direction.mul(s.distance)).sub(r).toVar(),l=(0,n.length)(c).toVar(),u=se(r,c.div(l),l.mul(Oi));(0,n.If)(u.greaterThan(0).or(P),()=>{let e=bi.wrap(Ji(t,a,s.direction,i)),r=L_(i,e),c=Z_(i,e).toVar(),l=(0,n.float)(1).toVar();(0,n.If)(c.greaterThan(0).and(s.lightType.equal((0,n.int)(1))),()=>{l.assign(Wi({pdf1:s.pdf,pdf2:c}))});let d=s.emission.mul(r).mul(o).mul(l).div((0,n.max)(s.pdf,1e-10));ie.addAssign(d.mul(u)),(0,n.If)(P,()=>{R.addAssign(d)})})})})}),(0,n.If)(s.greaterThan(0).and(v.greaterThan((0,n.int)(0))),()=>{let a=(0,n.max)((0,n.float)(0),(0,n.dot)(t,o)).toVar();(0,n.If)(a.greaterThan(0).and(Jf({direction:o,surfaceNormal:r})),()=>{let r=(0,n.float)(1e30).toVar(),l=(0,n.int)(-1).toVar();(0,n.Loop)({start:(0,n.int)(0),end:v,type:`int`,condition:`<`},({i:t})=>{let i=zf.wrap(Gf(_,t));(0,n.If)(i.intensity.greaterThan(0),()=>{let a=ap(i,e,o).toVar();(0,n.If)(a.greaterThan(0).and(a.lessThan(r)),()=>{r.assign(a),l.assign(t)})})}),(0,n.If)(l.greaterThanEqual((0,n.int)(0)),()=>{let u=zf.wrap(Gf(_,l)),d=e.add(o.mul(r)).sub(ae).toVar(),f=(0,n.length)(d).toVar(),p=se(ae,d.div(f),f.mul(Oi));(0,n.If)(p.greaterThan(0).or(P),()=>{let l=(0,n.max)((0,n.float)(0),(0,n.dot)(o,u.normal).negate()).toVar();(0,n.If)(l.greaterThan(0),()=>{let o=op(e,u.position.sub(u.u).sub(u.v),u.u.mul(2),u.v.mul(2)).toVar(),d=r.mul(r).div((0,n.max)(u.area.mul(l),Mi)),f=(0,n.select)(u.shape.lessThan(.5).and(o.greaterThan(1e-5)),(0,n.float)(1).div((0,n.max)(o,1e-10)),d).toVar(),m=Ff(u,e,t,i),h=(0,n.select)(ue.greaterThan(0),m.div((0,n.max)(ue,1e-10)),(0,n.float)(1).div((0,n.max)((0,n.float)(ce),1))),g=Wi({pdf1:s,pdf2:f.mul(h).toVar()}).toVar(),_=G_(u).mul(W_(l,u.spread)).mul(c).mul(a).mul(g).div((0,n.max)(s,1e-10));ie.addAssign(_.mul(p)),(0,n.If)(P,()=>{R.addAssign(_)})})})})})}),(0,n.If)(N,()=>{let e=(0,n.select)(ee.greaterThan((0,n.int)(0)),(0,n.int)(2),(0,n.int)(1));(0,n.Loop)({start:(0,n.int)(0),end:e,type:`int`,condition:`<`,name:`envPass`},({envPass:e})=>{let o=e.equal((0,n.int)(1)).toVar(),s=(0,n.vec3)(0).toVar(),c=(0,n.vec3)(0,1,0).toVar(),l=(0,n.float)(0).toVar();(0,n.If)(o,()=>{let e=_e(d,(0,n.int)(0),m.add((0,n.int)(9)),u,f,p);c.assign(H_(te,re,e)),s.assign(V_(c,te,ne,re).mul(D)),l.assign((0,n.select)(s.x.add(s.y).add(s.z).greaterThan(0),(0,n.float)(1).div(re.y),(0,n.float)(0)))}).Else(()=>{let e=_e(d,(0,n.int)(0),m.add((0,n.int)(1)),u,f,p).toVar(),t=(0,n.vec3)(0).toVar(),r=N_(E,k,O,D,A,j,M,e,t).toVar();c.assign(r.xyz),s.assign(t),l.assign(r.w)}),(0,n.If)(l.greaterThan(0),()=>{let e=(0,n.max)((0,n.float)(0),(0,n.dot)(t,c)).toVar();(0,n.If)(e.greaterThan(0).and(Jf({direction:c,surfaceNormal:r})),()=>{let r=se(oe(c),c,(0,n.float)(0x56bc75e2d63100000));(0,n.If)(r.greaterThan(0).or(P),()=>{let u=bi.wrap(Ji(t,a,c,i)),d=L_(i,u),f=Z_(i,u).toVar(),p=(0,n.select)(f.greaterThan(0),(0,n.select)(o,Wi({pdf1:l,pdf2:f}),Gi({pdf1:l,pdf2:f})),(0,n.float)(1)).toVar(),m=s.mul(d).mul(e).mul(p).div((0,n.max)(l,1e-10));ie.addAssign(m.mul(r)),(0,n.If)(P,()=>{R.addAssign(m)})})})})})}),hi({shadowed:ie,unoccluded:R})}),ev=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=(0,n.vec3)(0).toVar(),m=(0,n.vec3)(0).toVar(),h=(0,n.float)(0).toVar();return(0,n.If)(i.greaterThan(0).not(),()=>{let r=_e(l,(0,n.int)(0),f.add((0,n.int)(8)),c,u,d);p.assign(Fd(e,r)),m.assign(t.color.xyz),h.assign(1)}).Else(()=>{let c=(0,n.max)((0,n.dot)(e,r),0).toVar(),l=(0,n.max)(i,Fi).toVar();p.assign(r),h.assign(l),m.assign((0,n.select)(o,t.color.xyz.mul(s),a.mul(c).div(l)))}),Uf({direction:p,throughput:m,combinedPdf:h})}),tv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h])=>{let g=(0,n.vec3)(0).toVar(),_=(0,n.vec3)(0).toVar(),v=(0,n.float)(0).toVar(),y=(0,n.bool)(!1).toVar(),b=(0,n.vec3)(1).toVar(),x=p.toVar();(0,n.If)(f.not(),()=>{(0,n.If)(m,()=>{x.assign(kd(r,d,h))}).Else(()=>{let e=Ei({invRoughness:(0,n.float)(1).sub(r.roughness),metalFactor:(0,n.float)(.5).add((0,n.float)(.5).mul(r.metalness)),iorFactor:(0,n.min)((0,n.float)(2).div(r.ior),1),maxSheenColor:(0,n.max)(r.sheenColor.x,(0,n.max)(r.sheenColor.y,r.sheenColor.z))}).toVar();x.assign(kd(r,d,e))})});let S=a.toVar(),C=(0,n.vec3)(0).toVar(),w=x.diffuse.toVar(),T=w.add(x.specular).toVar(),E=T.add(x.sheen).toVar(),D=E.add(x.clearcoat);return(0,n.If)(S.lessThan(w),()=>{g.assign(Pd({N:t,xi:i}))}).ElseIf(S.lessThan(T),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let a=yi.wrap(qi(t,r.anisotropyRotation)),o=a.Ta,s=a.Ba,c=(0,n.vec3)((0,n.dot)(e,o),(0,n.dot)(e,s),(0,n.dot)(e,t)),l=Sd(r.roughness,r.anisotropy),u=Ld({V:c,alphaX:l.x,alphaY:l.y,Xi:i});C.assign(o.mul(u.x).add(s.mul(u.y)).add(t.mul(u.z))),g.assign((0,n.reflect)(e.negate(),C))}).Else(()=>{let a=Ki({N:t}),o=Id({V:a.transpose().mul(e),roughness:r.roughness,Xi:i});C.assign(a.mul(o)),g.assign((0,n.reflect)(e.negate(),C))})}).ElseIf(S.lessThan(E),()=>{C.assign(Nd({N:t,roughness:sd(r.sheenRoughness),Xi:i})),g.assign((0,n.reflect)(e.negate(),C))}).ElseIf(S.lessThan(D),()=>{let a=(0,n.clamp)(r.clearcoatRoughness,Pi,1),o=Ki({N:t});C.assign(o.mul(Id({V:o.transpose().mul(e),roughness:a,Xi:i}))),g.assign((0,n.reflect)(e.negate(),C))}).Else(()=>{let a=(0,n.dot)(e,t).greaterThan(0),d=Jd.wrap(ef(e,t,r.ior,r.roughness,a,r.dispersion,i,o,(0,n.float)(0),s,c,l,u));g.assign(d.direction),v.assign((0,n.max)(x.transmission.mul(d.pdf),Fi)),b.assign(d.colorWeight),y.assign(!0)}),(0,n.If)(y.not(),()=>{let n=bi.wrap(Ji(t,e,g,r));_.assign(L_(r,n)),v.assign(Ad(r,x,n))}),v.assign((0,n.max)(v,Fi)),_i({direction:g,value:_,pdf:v,isTransmission:y,colorWeight:b})}),nv=(0,n.wgslFn)(`
|
|
857
|
+
`,[A_]),F_=(0,n.Fn)(([e,t,r,i])=>{let a=t.toConst(),o=e.toVar();o.y.subAssign(i);let s=r.mul(r).toConst(),c=o.dot(a).toConst(),l=o.dot(o).sub(s).toConst(),u=c.mul(c).sub(l).toConst(),d=t.toVar();return(0,n.If)(u.greaterThanEqual(0),()=>{let t=(0,n.sqrt)(u).sub(c).toVar(),i=(0,n.float)(1e6).toVar(),l=a.y.toConst();(0,n.If)(l.lessThanEqual(0),()=>{let t=e.y.negate().div(l).toConst(),r=e.add(a.mul(t)).toConst();(0,n.If)(r.dot(r).lessThan(s),()=>{i.assign(t)})}),(0,n.If)(t.greaterThan(0),()=>{d.assign(o.add(a.mul((0,n.min)(t,i))).div(r))})}),d}),I_=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=t.toVar();return(0,n.If)(r,()=>{let r=(0,n.vec3)(e.x,e.y.sub(o),e.z);s.assign(F_(r,t,i,a))}),s}),L_=(0,n.Fn)(([e,t])=>{let r=(0,n.vec3)(0).toVar();return(0,n.If)(e.roughness.greaterThan(.98).and(e.metalness.lessThan(.02)).and(e.transmission.equal(0)).and(e.clearcoat.equal(0)).and(e.sheen.equal(0)).and(e.iridescence.equal(0)),()=>{r.assign(e.color.rgb.mul((0,n.float)(1).sub(e.metalness)).mul(Ai))}).Else(()=>{let i=Si.wrap(bd(e,e.color.rgb)).toVar(),a=i.F0.toVar(),o=(0,n.vec3)(0).toVar(),s=e.color.rgb.toVar();(0,n.If)(e.dispersion.greaterThan(0).and(e.transmission.greaterThan(.5)),()=>{let t=(0,n.clamp)(e.dispersion.mul(.1),0,.8),r=(0,n.max)((0,n.max)(s.r,s.g),s.b),i=(0,n.min)((0,n.min)(s.r,s.g),s.b);(0,n.If)(r.greaterThan(i),()=>{let e=s.sub(i).div(r.sub(i));s.assign((0,n.mix)(s,e,t.mul(.3)))})}),(0,n.If)(e.iridescence.greaterThan(0),()=>{let r=e.iridescenceThicknessRange.y;o.assign(Od((0,n.float)(1),e.iridescenceIOR,t.VoH,r,a)),a.assign((0,n.mix)(a,o,e.iridescence))});let c=(0,n.mix)((0,n.mix)((0,n.mix)(i.f0,(0,n.vec3)(i.f90),rd(t.VoH,i.eta)),Zu(t.VoH,i.F0m),e.metalness),Zu(t.VoH,o),e.iridescence).toVar(),l=(0,n.vec3)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let n=Sd(e.roughness,e.anisotropy),r=Cd(n.x,n.y,t.NoH,t.ToH,t.BoH),i=wd(n.x,n.y,t.ToV,t.BoV,t.ToL,t.BoL,t.NoV,t.NoL);l.assign(c.mul(r.mul(i)))}).Else(()=>{let n=ad(t.NoH,e.roughness),r=ud(t.NoV,t.NoL,e.roughness);l.assign(n.mul(r).mul(c))});let u=xi.wrap(yd(i.f0,i.f90,i.eta,i.F0m,e.metalness,o,e.iridescence,a,t.NoV,e.roughness)),d=l.mul(u.compensation),f=(0,n.vec3)(1).sub(u.E_total).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).mul(s).mul(Ai).add(d).toVar();(0,n.If)(e.sheen.greaterThan(0),()=>{let i=od(t.NoH,e.sheenRoughness),a=cd(t.NoV,t.NoL),o=e.sheenColor.mul(e.sheen).mul(i).mul(a),s=vd(t.NoV,e.sheenRoughness),c=(0,n.clamp)(e.sheenColor.mul(e.sheen).mul(s),(0,n.vec3)(0),(0,n.vec3)(1)),l=(0,n.vec3)(1).sub(c);r.assign(f.mul(l).add(o))}).Else(()=>{r.assign(f)}),(0,n.If)(e.clearcoat.greaterThan(0),()=>{let i=(0,n.max)(e.clearcoatRoughness,Pi),a=(0,n.vec3)(.04),o=xi.wrap(yd(a,(0,n.float)(1),(0,n.float)(1.5),(0,n.vec3)(0),(0,n.float)(0),(0,n.vec3)(0),(0,n.float)(0),a,t.NoV,i)),s=ad(t.NoH,i),c=ud(t.NoV,t.NoL,i),l=nd(t.VoH,(0,n.float)(1.5)),u=(0,n.vec3)(s.mul(c).mul(l)).mul(o.compensation),d=(0,n.vec3)(1).sub(o.E_total.mul(e.clearcoat));r.assign(r.mul(d).add(u.mul(e.clearcoat)))})}),r}),R_=(0,n.Fn)(([e,t,n,r])=>L_(r,bi.wrap(Ji(n,e,t,r)))),z_=(0,n.vec3)(...qo),B_=(0,n.vec3)(...qo.map(e=>(e+2)/2)),V_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec3)(0).toVar();return(0,n.If)((0,n.dot)(e,t).greaterThanEqual(i.x).and(e.y.greaterThanEqual(i.w.negate())),()=>{let o=(0,n.cross)(e,t),s=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub((0,n.dot)(o,o).mul(i.z)),1e-8));a.assign(r.mul((0,n.pow)((0,n.vec3)(s),z_)).mul(B_))}),a}),H_=(0,n.Fn)(([e,t,r])=>{let i=r.x.mul(t.y.mul(1/(2*Math.PI))),a=(0,n.float)(1).sub(i),o=(0,n.sqrt)((0,n.max)(i.mul((0,n.float)(2).sub(i)),0)),s=r.y.mul(2*Math.PI),c=e,l=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(c.x).greaterThan(.9),(0,n.vec3)(0,1,0),(0,n.vec3)(1,0,0)),c)),u=(0,n.cross)(c,l);return(0,n.normalize)(c.mul(a).add(l.mul((0,n.cos)(s)).add(u.mul((0,n.sin)(s))).mul(o)))}),U_=2*ki,W_=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(t.lessThan((0,n.float)(ki).sub(.001)).and(e.greaterThan(0)),()=>{let i=t.mul(.5).toVar(),a=(0,n.tan)(i).toVar(),o=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(e.mul(e)),0)).div((0,n.max)(e,1e-4)),s=(0,n.select)(i.greaterThan(.05),(0,n.float)(1).div((0,n.max)(a.sub(i),1e-6)),(0,n.float)(3).div((0,n.max)(i.mul(i).mul(i),1e-9)));r.assign((0,n.max)(a.sub(o).mul(s),0))}),r}),G_=(0,n.Fn)(([e])=>{let t=(0,n.select)(e.normalize.greaterThan(.5),(0,n.float)(1).div((0,n.max)(e.area,1e-10)),(0,n.float)(1));return e.color.mul(e.intensity).mul(Ai).mul(t)}),K_=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.bool)(!1).toVar(),o=(0,n.vec3)(0,1,0).toVar(),s=(0,n.vec3)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.int)(2).toVar();return(0,n.If)(e.area.greaterThan(0),()=>{let d=(0,n.vec3)(0).toVar(),f=(0,n.float)(-1).toVar();(0,n.If)(e.shape.greaterThan(.5),()=>{let t=(0,n.sqrt)(r.x).toVar(),i=(0,n.float)(U_).mul(r.y).toVar();d.assign(e.position.add(e.u.mul(t.mul((0,n.cos)(i)))).add(e.v.mul(t.mul((0,n.sin)(i)))))}).Else(()=>{let i=sp(t,e.position.sub(e.u).sub(e.v),e.u.mul(2),e.v.mul(2),r).toVar();(0,n.If)(i.w.greaterThan(0),()=>{d.assign(i.xyz),f.assign(i.w)}).Else(()=>{d.assign(e.position.add(e.u.mul(r.x.mul(2).sub(1))).add(e.v.mul(r.y.mul(2).sub(1))))})});let p=d.sub(t).toVar(),m=(0,n.dot)(p,p).toVar();(0,n.If)(m.greaterThanEqual(1e-10),()=>{let t=(0,n.sqrt)(m).toVar(),r=p.div(t).toVar(),d=(0,n.dot)(r.negate(),e.normal).toVar();u.assign((0,n.int)(1)),c.assign(t),o.assign(r),s.assign(G_(e).mul(W_(d,e.spread)));let h=m.div((0,n.max)(e.area.mul((0,n.max)(d,.001)),1e-10)),g=(0,n.select)(f.greaterThan(0),f,h);l.assign(g.mul(i)),a.assign(d.greaterThan(0))})}),Hf({valid:a,direction:o,emission:s,distance:c,pdf:l,lightType:u,selectionTotalWeight:(0,n.float)(0)})}),q_=(0,n.Fn)(([e,t,r])=>{let i=(0,n.bool)(!1).toVar(),a=(0,n.vec3)(0,1,0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.int)(3).toVar(),u=e.position.sub(t).toVar(),d=(0,n.dot)(u,u).toVar();return(0,n.If)(d.greaterThanEqual(1e-20),()=>{let t=(0,n.sqrt)(d).toVar(),l=u.div(t).toVar(),f=(0,n.dot)(l.negate(),e.direction).toVar(),p=(0,n.cos)(e.angle).toVar();a.assign(l),s.assign(t),c.assign(r),i.assign(f.greaterThanEqual(p)),(0,n.If)(i,()=>{let n=Xf({coneCosine:p,blend:e.penumbra,angleCosine:f}),r=Yf({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay}),i=$f(e,l),a=rp(e,l);o.assign(e.color.mul(e.intensity).mul(r).mul(n).mul(i).mul(a))})}),Hf({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),J_=(0,n.Fn)(([e,t,r])=>{let i=(0,n.bool)(!1).toVar(),a=(0,n.vec3)(0,1,0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.int)(2).toVar(),u=e.position.sub(t).toVar(),d=(0,n.dot)(u,u).toVar();return(0,n.If)(d.greaterThanEqual(1e-20),()=>{let t=(0,n.sqrt)(d).toVar(),f=u.div(t),p=Yf({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay});l.assign((0,n.int)(2)),a.assign(f),s.assign(t),o.assign(e.color.mul(e.intensity).mul(p)),c.assign(r),i.assign((0,n.bool)(!0))}),Hf({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),Y_=(0,n.Fn)(([e,t,r,i,a])=>{let o=(0,n.bool)(!1).toVar(),s=(0,n.vec3)(0,1,0).toVar(),c=(0,n.vec3)(0).toVar(),l=(0,n.float)(0).toVar();return(0,n.If)(e.intensity.greaterThan(0),()=>{let u=(0,n.normalize)(e.direction).toVar(),d=e.color.mul(e.intensity).mul(ep(e,t)).toVar();s.assign(u),l.assign(r),(0,n.If)(e.angle.greaterThan(0),()=>{let t=(0,n.cos)(e.angle.mul(.5)).toVar(),o=(0,n.mix)(t,(0,n.float)(1),i).toVar(),c=(0,n.sqrt)((0,n.max)((0,n.float)(0),(0,n.float)(1).sub(o.mul(o)))).toVar(),f=(0,n.float)(U_).mul(a).toVar(),p=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(u.x).greaterThan(.9),(0,n.vec3)(0,1,0),(0,n.vec3)(1,0,0)),u)).toVar(),m=(0,n.cross)(u,p).toVar();s.assign((0,n.normalize)(u.mul(o).add(p.mul((0,n.cos)(f)).add(m.mul((0,n.sin)(f))).mul(c))));let h=(0,n.float)(U_).mul((0,n.max)((0,n.float)(1).sub(t),1e-10)).toVar();d.assign(d.div(h)),l.assign(r.div(h))}),c.assign(d),o.assign((0,n.bool)(!0))}),Hf({valid:o,direction:s,emission:c,distance:(0,n.float)(1e6),pdf:l,lightType:(0,n.int)(0),selectionTotalWeight:(0,n.float)(0)})}),X_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v])=>{let y=(0,n.bool)(!1).toVar(),b=(0,n.vec3)(0,1,0).toVar(),x=(0,n.vec3)(0).toVar(),S=(0,n.float)(0).toVar(),C=(0,n.float)(0).toVar(),w=(0,n.int)(2).toVar(),T=(0,n.float)(0).toVar(),E=f.add(m).add(g).add(v).toVar();return(0,n.If)(E.greaterThan((0,n.int)(0)),()=>{let D=(0,n.int)(oe+64).toVar(),O=D.add(f).toVar(),k=O.add(m).toVar(),A=k.add(g).toVar(),j=(0,n.int)(-1).toVar(),M=(0,n.int)(-1).toVar(),N=(0,n.float)(0).toVar();(0,n.If)(f.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:f,type:`int`,condition:`<`},({i:e})=>{let i=Pf(Rf.wrap(Wf(d,e)),t,r,a).toVar();T.addAssign(i),(0,n.If)(i.greaterThan(0).and(_e(s,(0,n.int)(0),D.add(e),o,c,l).mul(T).lessThan(i)),()=>{j.assign(0),M.assign(e),N.assign(i)})})}),(0,n.If)(m.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:m,type:`int`,condition:`<`},({i})=>{let a=zf.wrap(Gf(p,i)),u=(0,n.select)(a.intensity.greaterThan(0),Ff(a,e,t,r),(0,n.float)(0)).toVar();T.addAssign(u),(0,n.If)(u.greaterThan(0).and(_e(s,(0,n.int)(0),O.add(i),o,c,l).mul(T).lessThan(u)),()=>{j.assign(1),M.assign(i),N.assign(u)})})}),(0,n.If)(g.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:g,type:`int`,condition:`<`},({i})=>{let a=If(Bf.wrap(Kf(h,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(_e(s,(0,n.int)(0),k.add(i),o,c,l).mul(T).lessThan(a)),()=>{j.assign(2),M.assign(i),N.assign(a)})})}),(0,n.If)(v.greaterThan((0,n.int)(0)),()=>{(0,n.Loop)({start:(0,n.int)(0),end:v,type:`int`,condition:`<`},({i})=>{let a=Lf(Vf.wrap(qf(_,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(_e(s,(0,n.int)(0),A.add(i),o,c,l).mul(T).lessThan(a)),()=>{j.assign(3),M.assign(i),N.assign(a)})})}),(0,n.If)(T.lessThanEqual(0),()=>{let t=(0,n.int)(i.x.mul((0,n.float)(E))).toVar(),r=(0,n.float)(1).div((0,n.max)((0,n.float)(E),1)).toVar();C.assign(r);let a=(0,n.bool)(!1).toVar(),T=(0,n.int)(0).toVar();(0,n.If)(f.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(f))),()=>{let f=Rf.wrap(Wf(d,t.sub(T)));(0,n.If)(f.intensity.greaterThan(0),()=>{let t=Hf.wrap(Y_(f,e,r,i.y,_e(s,(0,n.int)(0),u.add((0,n.int)(14)),o,c,l)));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(f)}),(0,n.If)(m.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(m))),()=>{let d=zf.wrap(Gf(p,t.sub(T)));(0,n.If)(d.intensity.greaterThan(0),()=>{let t=(0,n.vec2)(i.y,_e(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),f=Hf.wrap(K_(d,e,t,r));y.assign(f.valid),b.assign(f.direction),x.assign(f.emission),S.assign(f.distance),C.assign(f.pdf),w.assign(f.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(m)}),(0,n.If)(g.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(g))),()=>{let i=Bf.wrap(Kf(h,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Hf.wrap(J_(i,e,r));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})}),T.addAssign(g)}),(0,n.If)(v.greaterThan((0,n.int)(0)),()=>{(0,n.If)(a.not().and(t.greaterThanEqual(T)).and(t.lessThan(T.add(v))),()=>{let i=Vf.wrap(qf(_,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Hf.wrap(q_(i,e,r));y.assign(t.valid),b.assign(t.direction),x.assign(t.emission),S.assign(t.distance),C.assign(t.pdf),w.assign(t.lightType),a.assign((0,n.bool)(!0))})})})}).Else(()=>{let t=N.div((0,n.max)(T,1e-10)).toVar();(0,n.If)(j.equal((0,n.int)(0)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let r=Rf.wrap(Wf(d,M)),a=Hf.wrap(Y_(r,e,t,i.y,_e(s,(0,n.int)(0),u.add((0,n.int)(14)),o,c,l)));b.assign(a.direction),x.assign(a.emission),S.assign(a.distance),C.assign(a.pdf),w.assign(a.lightType),y.assign(a.valid)}),(0,n.If)(j.equal((0,n.int)(1)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let r=zf.wrap(Gf(p,M)),a=(0,n.vec2)(i.y,_e(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),d=Hf.wrap(K_(r,e,a,t));y.assign(d.valid),b.assign(d.direction),x.assign(d.emission),S.assign(d.distance),C.assign(d.pdf),w.assign(d.lightType)}),(0,n.If)(j.equal((0,n.int)(2)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let n=Bf.wrap(Kf(h,M)),r=Hf.wrap(J_(n,e,t));y.assign(r.valid),b.assign(r.direction),x.assign(r.emission),S.assign(r.distance),C.assign(r.pdf),w.assign(r.lightType)}),(0,n.If)(j.equal((0,n.int)(3)).and(M.greaterThanEqual((0,n.int)(0))),()=>{let n=Vf.wrap(qf(_,M)),r=Hf.wrap(q_(n,e,t));y.assign(r.valid),b.assign(r.direction),x.assign(r.emission),S.assign(r.distance),C.assign(r.pdf),w.assign(r.lightType)})})}),Hf({valid:y,direction:b,emission:x,distance:S,pdf:C,lightType:w,selectionTotalWeight:T})}),Z_=(0,n.Fn)(([e,t])=>(0,n.max)(Md(e,t),1e-8)),Q_=(0,n.Fn)(([e,t,n,r])=>Z_(r,bi.wrap(Ji(n,e,t,r)))),$_=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,F,I,L,R,ee,te,ne])=>{let re=(0,n.vec3)(0).toVar(),z=(0,n.vec3)(0).toVar(),ie=Di(e,I).toVar(),ae=t=>w_({hitPoint:e,offsetNormal:I,lift:F,faceN:I,smoothN:r,L:t,cutoff:L}),oe=(0,n.Fn)(([e,t,n])=>Nf(e,t,n,S_,C,w,T)),se=g.add(v).add(b).add(S).toVar(),ce=se.greaterThan((0,n.int)(0)).toVar(),le=(0,n.float)(0).toVar();return(0,n.If)(ce,()=>{let o=ge(d,(0,n.int)(0),m.add((0,n.int)(2)),u,f,p).toVar(),s=Hf.wrap(X_(e,t,i,o,l,u,d,f,p,m,h,g,_,v,y,b,x,S));le.assign(s.selectionTotalWeight),(0,n.If)(s.valid.and(s.pdf.greaterThan(0)),()=>{let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,s.direction)).toVar();(0,n.If)(o.greaterThan(0).and(Jf({direction:s.direction,surfaceNormal:r})),()=>{let r=ae(s.direction).toVar(),c=e.add(s.direction.mul(s.distance)).sub(r).toVar(),l=(0,n.length)(c).toVar(),u=oe(r,c.div(l),l.mul(Oi));(0,n.If)(u.greaterThan(0).or(P),()=>{let e=bi.wrap(Ji(t,a,s.direction,i)),r=L_(i,e),c=Z_(i,e).toVar(),l=(0,n.float)(1).toVar();(0,n.If)(c.greaterThan(0).and(s.lightType.equal((0,n.int)(1))),()=>{l.assign(Wi({pdf1:s.pdf,pdf2:c}))});let d=s.emission.mul(r).mul(o).mul(l).div((0,n.max)(s.pdf,1e-10));re.addAssign(d.mul(u)),(0,n.If)(P,()=>{z.addAssign(d)})})})})}),(0,n.If)(s.greaterThan(0).and(v.greaterThan((0,n.int)(0))),()=>{let a=(0,n.max)((0,n.float)(0),(0,n.dot)(t,o)).toVar();(0,n.If)(a.greaterThan(0).and(Jf({direction:o,surfaceNormal:r})),()=>{let r=(0,n.float)(1e30).toVar(),l=(0,n.int)(-1).toVar();(0,n.Loop)({start:(0,n.int)(0),end:v,type:`int`,condition:`<`},({i:t})=>{let i=zf.wrap(Gf(_,t));(0,n.If)(i.intensity.greaterThan(0),()=>{let a=ap(i,e,o).toVar();(0,n.If)(a.greaterThan(0).and(a.lessThan(r)),()=>{r.assign(a),l.assign(t)})})}),(0,n.If)(l.greaterThanEqual((0,n.int)(0)),()=>{let u=zf.wrap(Gf(_,l)),d=e.add(o.mul(r)).sub(ie).toVar(),f=(0,n.length)(d).toVar(),p=oe(ie,d.div(f),f.mul(Oi));(0,n.If)(p.greaterThan(0).or(P),()=>{let l=(0,n.max)((0,n.float)(0),(0,n.dot)(o,u.normal).negate()).toVar();(0,n.If)(l.greaterThan(0),()=>{let o=op(e,u.position.sub(u.u).sub(u.v),u.u.mul(2),u.v.mul(2)).toVar(),d=r.mul(r).div((0,n.max)(u.area.mul(l),Mi)),f=(0,n.select)(u.shape.lessThan(.5).and(o.greaterThan(1e-5)),(0,n.float)(1).div((0,n.max)(o,1e-10)),d).toVar(),m=Ff(u,e,t,i),h=(0,n.select)(le.greaterThan(0),m.div((0,n.max)(le,1e-10)),(0,n.float)(1).div((0,n.max)((0,n.float)(se),1))),g=Wi({pdf1:s,pdf2:f.mul(h).toVar()}).toVar(),_=G_(u).mul(W_(l,u.spread)).mul(c).mul(a).mul(g).div((0,n.max)(s,1e-10));re.addAssign(_.mul(p)),(0,n.If)(P,()=>{z.addAssign(_)})})})})})}),(0,n.If)(N,()=>{let e=(0,n.select)(R.greaterThan((0,n.int)(0)),(0,n.int)(2),(0,n.int)(1));(0,n.Loop)({start:(0,n.int)(0),end:e,type:`int`,condition:`<`,name:`envPass`},({envPass:e})=>{let o=e.equal((0,n.int)(1)).toVar(),s=(0,n.vec3)(0).toVar(),c=(0,n.vec3)(0,1,0).toVar(),l=(0,n.float)(0).toVar();(0,n.If)(o,()=>{let e=ge(d,(0,n.int)(0),m.add((0,n.int)(9)),u,f,p);c.assign(H_(ee,ne,e)),s.assign(V_(c,ee,te,ne).mul(D)),l.assign((0,n.select)(s.x.add(s.y).add(s.z).greaterThan(0),(0,n.float)(1).div(ne.y),(0,n.float)(0)))}).Else(()=>{let e=ge(d,(0,n.int)(0),m.add((0,n.int)(1)),u,f,p).toVar(),t=(0,n.vec3)(0).toVar(),r=N_(E,k,O,D,A,j,M,e,t).toVar();c.assign(r.xyz),s.assign(t),l.assign(r.w)}),(0,n.If)(l.greaterThan(0),()=>{let e=(0,n.max)((0,n.float)(0),(0,n.dot)(t,c)).toVar();(0,n.If)(e.greaterThan(0).and(Jf({direction:c,surfaceNormal:r})),()=>{let r=oe(ae(c),c,(0,n.float)(0x56bc75e2d63100000));(0,n.If)(r.greaterThan(0).or(P),()=>{let u=bi.wrap(Ji(t,a,c,i)),d=L_(i,u),f=Z_(i,u).toVar(),p=(0,n.select)(f.greaterThan(0),(0,n.select)(o,Wi({pdf1:l,pdf2:f}),Gi({pdf1:l,pdf2:f})),(0,n.float)(1)).toVar(),m=s.mul(d).mul(e).mul(p).div((0,n.max)(l,1e-10));re.addAssign(m.mul(r)),(0,n.If)(P,()=>{z.addAssign(m)})})})})})}),hi({shadowed:re,unoccluded:z})}),ev=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=(0,n.vec3)(0).toVar(),m=(0,n.vec3)(0).toVar(),h=(0,n.float)(0).toVar();return(0,n.If)(i.greaterThan(0).not(),()=>{let r=ge(l,(0,n.int)(0),f.add((0,n.int)(8)),c,u,d);p.assign(Fd(e,r)),m.assign(t.color.xyz),h.assign(1)}).Else(()=>{let c=(0,n.max)((0,n.dot)(e,r),0).toVar(),l=(0,n.max)(i,Fi).toVar();p.assign(r),h.assign(l),m.assign((0,n.select)(o,t.color.xyz.mul(s),a.mul(c).div(l)))}),Uf({direction:p,throughput:m,combinedPdf:h})}),tv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h])=>{let g=(0,n.vec3)(0).toVar(),_=(0,n.vec3)(0).toVar(),v=(0,n.float)(0).toVar(),y=(0,n.bool)(!1).toVar(),b=(0,n.vec3)(1).toVar(),x=p.toVar();(0,n.If)(f.not(),()=>{(0,n.If)(m,()=>{x.assign(kd(r,d,h))}).Else(()=>{let e=Ei({invRoughness:(0,n.float)(1).sub(r.roughness),metalFactor:(0,n.float)(.5).add((0,n.float)(.5).mul(r.metalness)),iorFactor:(0,n.min)((0,n.float)(2).div(r.ior),1),maxSheenColor:(0,n.max)(r.sheenColor.x,(0,n.max)(r.sheenColor.y,r.sheenColor.z))}).toVar();x.assign(kd(r,d,e))})});let S=a.toVar(),C=(0,n.vec3)(0).toVar(),w=x.diffuse.toVar(),T=w.add(x.specular).toVar(),E=T.add(x.sheen).toVar(),D=E.add(x.clearcoat);return(0,n.If)(S.lessThan(w),()=>{g.assign(Pd({N:t,xi:i}))}).ElseIf(S.lessThan(T),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let a=yi.wrap(qi(t,r.anisotropyRotation)),o=a.Ta,s=a.Ba,c=(0,n.vec3)((0,n.dot)(e,o),(0,n.dot)(e,s),(0,n.dot)(e,t)),l=Sd(r.roughness,r.anisotropy),u=Ld({V:c,alphaX:l.x,alphaY:l.y,Xi:i});C.assign(o.mul(u.x).add(s.mul(u.y)).add(t.mul(u.z))),g.assign((0,n.reflect)(e.negate(),C))}).Else(()=>{let a=Ki({N:t}),o=Id({V:a.transpose().mul(e),roughness:r.roughness,Xi:i});C.assign(a.mul(o)),g.assign((0,n.reflect)(e.negate(),C))})}).ElseIf(S.lessThan(E),()=>{C.assign(Nd({N:t,roughness:sd(r.sheenRoughness),Xi:i})),g.assign((0,n.reflect)(e.negate(),C))}).ElseIf(S.lessThan(D),()=>{let a=(0,n.clamp)(r.clearcoatRoughness,Pi,1),o=Ki({N:t});C.assign(o.mul(Id({V:o.transpose().mul(e),roughness:a,Xi:i}))),g.assign((0,n.reflect)(e.negate(),C))}).Else(()=>{let a=(0,n.dot)(e,t).greaterThan(0),d=Jd.wrap(ef(e,t,r.ior,r.roughness,a,r.dispersion,i,o,(0,n.float)(0),s,c,l,u));g.assign(d.direction),v.assign((0,n.max)(x.transmission.mul(d.pdf),Fi)),b.assign(d.colorWeight),y.assign(!0)}),(0,n.If)(y.not(),()=>{let n=bi.wrap(Ji(t,e,g,r));_.assign(L_(r,n)),v.assign(Ad(r,x,n))}),v.assign((0,n.max)(v,Fi)),_i({direction:g,value:_,pdf:v,isTransmission:y,colorWeight:b})}),nv=(0,n.wgslFn)(`
|
|
858
858
|
fn regularizePathContribution( contribution: vec3f, pathLength: f32, fireflyThreshold: f32, frame: i32 ) -> vec3f {
|
|
859
859
|
// Indirect-only clamp: pathLength 0 is a direct/primary contribution (bounce-0 hit, direct NEE,
|
|
860
860
|
// or a directly-viewed backdrop/sun) — that is signal, not a firefly, and clamping it darkens
|
|
@@ -871,14 +871,14 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
871
871
|
let ndcDepth = clipPos.z / clipPos.w * 0.5f + 0.5f;
|
|
872
872
|
return clamp( ndcDepth, 0.0f, 1.0f );
|
|
873
873
|
}
|
|
874
|
-
`),iv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u])=>{let d=(0,n.float)(1).toVar();return(0,n.If)(e.greaterThanEqual((0,n.int)(3)),()=>{let f=(0,n.max)((0,n.max)((0,n.max)(t.x,t.y),t.z),0).toVar();(0,n.If)(f.lessThan(8e-4).and(e.greaterThan((0,n.int)(4))),()=>{let e=(0,n.max)(f.mul(125),.01),t=ve(o,(0,n.int)(0),l.add((0,n.int)(3)),a,s,c);d.assign((0,n.select)(t.lessThan(e),e,(0,n.float)(0)))}).Else(()=>{let t=r.complexityScore.toVar();(0,n.If)(r.isMetallic.and(r.isSmooth).and(e.lessThan((0,n.int)(7))),()=>{t.addAssign(.3)}),(0,n.If)(r.isTransmissive.and(e.lessThan((0,n.int)(6))),()=>{t.addAssign(.25)}),(0,n.If)(r.isEmissive.and(e.lessThan((0,n.int)(4))),()=>{t.addAssign(.15)}),t.assign((0,n.clamp)(t,0,1));let p=(0,n.int)(3).toVar();(0,n.If)(t.greaterThan(.6),()=>{p.assign(5)}).ElseIf(t.greaterThan(.4),()=>{p.assign(4)}),(0,n.If)(e.lessThan(p),()=>{d.assign(1)}).Else(()=>{let m=r.complexityScore.toVar();(0,n.If)(r.isMetallic.and(r.isSmooth),()=>{m.addAssign(.15)}),(0,n.If)(r.isTransmissive.and(r.hasClearcoat),()=>{m.addAssign(.12)}),(0,n.If)(r.isEmissive,()=>{m.addAssign(.1)}),m.assign((0,n.clamp)(m,0,1));let h=(0,n.float)(.5).toVar();(0,n.If)(u.and(f.greaterThan(.01)),()=>{let e=(0,n.clamp)(i.y,0,1);h.assign((0,n.mix)((0,n.float)(.3),(0,n.float)(.8),e.mul(e)))});let g=(0,n.smoothstep)((0,n.float)(.001),(0,n.float)(.1),f),_=f.mul((0,n.mix)(m.mul(.7),h,.3)).mul(g).toVar(),v=(0,n.mix)((0,n.clamp)(t.mul(.4).add(f.mul(.6)).mul(1.2),.15,.95),(0,n.clamp)(f.mul(.4).add(t.mul(.1)),.03,.6),(0,n.clamp)((0,n.float)(e.sub(p)).div(10),0,1)).toVar();v.assign((0,n.mix)(v,(0,n.max)(v,_),.4)),(0,n.If)(t.greaterThan(.5),()=>{let e=t.sub(.5).mul(.6);v.assign((0,n.mix)(v,(0,n.float)(1),e))});let y=(0,n.float)(.12).add(t.mul(.08)),b=(0,n.exp)((0,n.float)(e.sub(p)).negate().mul(y));v.mulAssign(b);let x=(0,n.select)(r.isEmissive,(0,n.float)(.04),(0,n.float)(.02));v.assign((0,n.clamp)(v,x,1));let S=ve(o,(0,n.int)(0),l.add((0,n.int)(3)),a,s,c);d.assign((0,n.select)(S.lessThan(v),v,(0,n.float)(0)))})})}),d}),av=j({brdf:`vec3`,L:`vec3`,pdf:`float`}),ov=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=t.normal,d=e.direction.negate(),f=(0,n.max)(r.clearcoatRoughness,Pi),p=(0,n.max)(r.roughness,Pi),m=vi.wrap(jd(r)).toVar(),h=m.clearcoat.toVar(),g=m.specular.toVar(),_=ve(o,(0,n.int)(0),l.add((0,n.int)(13)),a,s,c),v=(0,n.vec3)(0).toVar(),y=(0,n.vec3)(0).toVar();(0,n.If)(_.lessThan(h),()=>{let e=Ki({N:u});y.assign(e.mul(Id({V:e.transpose().mul(d),roughness:f,Xi:i}))),v.assign((0,n.reflect)(d.negate(),y))}).ElseIf(_.lessThan(h.add(g)),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let e=yi.wrap(qi(u,r.anisotropyRotation)),t=(0,n.vec3)((0,n.dot)(d,e.Ta),(0,n.dot)(d,e.Ba),(0,n.dot)(d,u)),a=Sd(r.roughness,r.anisotropy),o=Ld({V:t,alphaX:a.x,alphaY:a.y,Xi:i});y.assign(e.Ta.mul(o.x).add(e.Ba.mul(o.y)).add(u.mul(o.z)))}).Else(()=>{let e=Ki({N:u});y.assign(e.mul(Id({V:e.transpose().mul(d),roughness:p,Xi:i})))}),v.assign((0,n.reflect)(d.negate(),y))}).Else(()=>{v.assign(Pd({N:u,xi:i})),y.assign((0,n.normalize)(d.add(v)))});let b=bi.wrap(Ji(u,d,v,r)),x=(0,n.max)(Ad(r,m,b),.001);return av({brdf:L_(r,b),L:v,pdf:x})}),sv=32,cv=16,lv=5,uv=j({hitPoint:`vec3`,uv:`vec2`,normal:`vec3`,height:`float`}),dv=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=t.hitPoint.toVar(),l=t.uv.toVar(),u=t.normal.toVar(),d=(0,n.float)(0).toVar(),f=t.triangleIndex,p=(0,n.uintBitsToFloat)($i(r,f,0).xyz).toVar(),m=(0,n.uintBitsToFloat)($i(r,f,1).xyz),h=(0,n.uintBitsToFloat)($i(r,f,2).xyz),g=(0,n.uintBitsToFloat)($i(r,f,3)).toVar(),_=(0,n.uintBitsToFloat)($i(r,f,4).xy),v=g.xy.toVar(),y=g.zw,b=_,x=m.sub(p).toVar(),S=h.sub(p).toVar();(0,n.If)(s.greaterThanEqual((0,n.int)(0)),()=>{let e=ua(o,s),t={r0:e[0].xyz,r1:e[1].xyz,r2:e[2].xyz};x.assign(pa({...t,v:x})),S.assign(pa({...t,v:S}))});let C=y.sub(v).toVar(),w=b.sub(v).toVar(),T=C.x.mul(w.y).sub(w.x.mul(C.y)).toVar();return(0,n.If)((0,n.abs)(T).greaterThan(1e-8),()=>{let r=(0,n.float)(1).div(T),o=x.mul(w.y).sub(S.mul(C.y)).mul(r).toVar(),s=S.mul(C.x).sub(x.mul(w.x)).mul(r).toVar(),f=t.normal.toVar(),p=i.displacementScale.div((0,n.float)(10)),m=e.direction,h=(0,n.dot)(m,f).toVar(),g=m.sub(f.mul(h)).toVar(),_=(0,n.dot)(o,o),v=(0,n.dot)(o,s),y=(0,n.dot)(s,s),b=_.mul(y).sub(v.mul(v)).toVar();(0,n.If)((0,n.abs)(b).greaterThan(1e-10),()=>{let e=(0,n.float)(1).div(b),r=(0,n.dot)(g,o),x=(0,n.dot)(g,s),S=(0,n.vec2)(y.mul(r).sub(v.mul(x)).mul(e),_.mul(x).sub(v.mul(r)).mul(e)).toVar(),C=h.toVar(),w=(0,n.max)((0,n.abs)(C),.001),T=p.div(w).toVar(),E=(0,n.int)(a.equal((0,n.int)(0)).select((0,n.int)(sv),(0,n.int)(cv))).toVar(),D=T.negate().toVar(),O=T.sub(D).div((0,n.float)(E)).toVar(),k=D.toVar(),A=D.toVar(),j=(0,n.int)(0).toVar();(0,n.Loop)({start:(0,n.int)(0),end:E,type:`int`,condition:`<`},({i:e})=>{(0,n.If)(j.equal((0,n.int)(0)),()=>{let r=D.add(O.mul((0,n.float)(e))).toVar(),a=t.uv.add(S.mul(r)),o=r.mul(C),s=Af(i.displacementMapIndex,a,i.displacementTransform).sub(.5).mul(p);(0,n.If)(o.lessThanEqual(s).and(e.greaterThan((0,n.int)(0))),()=>{j.assign(1),A.assign(r)}).Else(()=>{k.assign(r)})})}),(0,n.If)(j.equal((0,n.int)(1)),()=>{let e=k.toVar(),r=A.toVar();(0,n.Loop)({start:(0,n.int)(0),end:(0,n.int)(lv),type:`int`,condition:`<`},()=>{let a=e.add(r).mul(.5).toVar(),o=t.uv.add(S.mul(a)),s=a.mul(C),c=Af(i.displacementMapIndex,o,i.displacementTransform).sub(.5).mul(p);(0,n.If)(s.lessThanEqual(c),()=>{r.assign(a)}).Else(()=>{e.assign(a)})});let a=e.add(r).mul(.5).toVar(),h=t.uv.add(S.mul(a)).toVar(),g=t.hitPoint.add(m.mul(a)),_=Af(i.displacementMapIndex,h,i.displacementTransform),v=_.sub(.5).mul(p),y=uf(df(),i.displacementMapIndex).toVar(),b=_,x=Af(i.displacementMapIndex,h.add((0,n.vec2)(y.x,0)),i.displacementTransform),w=Af(i.displacementMapIndex,h.add((0,n.vec2)(0,y.y)),i.displacementTransform),T=(0,n.normalize)(o).toVar(),E=(0,n.normalize)(s).toVar(),D=x.sub(b).mul(p),O=w.sub(b).mul(p),j=(0,n.normalize)(f.sub(T.mul(D)).sub(E.mul(O)));c.assign(g),l.assign(h),u.assign(j),d.assign(v)})})}),uv({hitPoint:c,uv:l,normal:u,height:d})}),fv=j({position:`vec3`,normal:`vec3`,emission:`vec3`,direction:`vec3`,distance:`float`,pdf:`float`,area:`float`,cosThetaLight:`float`,valid:`bool`}),pv=j({contribution:`vec3`,hasEmissive:`bool`,emissionOnly:`vec3`,distance:`float`}),mv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.sqrt)(i.x),o=(0,n.float)(1).sub(a),s=i.y.mul(a),c=(0,n.float)(1).sub(o).sub(s);return e.mul(o).add(t.mul(s)).add(r.mul(c))}),hv=(0,n.Fn)(([e,t,r])=>(0,n.length)((0,n.cross)(t.sub(e),r.sub(e))).mul(.5)),gv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.normalize)(e.sub(i)),o=(0,n.normalize)(t.sub(i)),s=(0,n.normalize)(r.sub(i)),c=(0,n.abs)((0,n.dot)(a,(0,n.cross)(o,s))),l=(0,n.float)(1).add((0,n.dot)(o,s)).add((0,n.dot)(a,s)).add((0,n.dot)(a,o));return(0,n.max)((0,n.float)(2).mul((0,n.atan)(c,(0,n.max)(l,(0,n.float)(1e-10)))),(0,n.float)(0))}),_v=(0,n.Fn)(([e,t,r,i])=>{let a=t.sub(e),o=r.sub(e),s=r.sub(t),c=(0,n.max)((0,n.dot)(a,a),(0,n.max)((0,n.dot)(o,o),(0,n.dot)(s,s))),l=(0,n.cross)(a,o),u=(0,n.dot)(l,l),d=(0,n.bool)(!1).toVar();return(0,n.If)(u.greaterThan(1e-20),()=>{let t=(0,n.dot)(l,i.sub(e)),r=t.mul(t).div(u),a=c.mul(c).lessThan(u.mul(64));d.assign(c.greaterThan(r).and(a))}),d}),vv=j({direction:`vec3`,position:`vec3`,solidAngle:`float`,valid:`bool`}),yv=(0,n.Fn)(([e])=>{let t=(0,n.length)(e);return(0,n.select)(t.greaterThan(1e-10),e.div(t),(0,n.vec3)(0))}),bv=(0,n.Fn)(([e,t,r,i,a])=>{let o=vv({direction:(0,n.vec3)(0),position:(0,n.vec3)(0),solidAngle:(0,n.float)(0),valid:!1}).toVar(),s=(0,n.normalize)(e.sub(i)),c=(0,n.normalize)(t.sub(i)),l=(0,n.normalize)(r.sub(i)),u=gv(e,t,r,i);return o.solidAngle.assign(u),(0,n.If)(u.greaterThan(1e-7),()=>{let d=(0,n.clamp)((0,n.dot)(yv((0,n.cross)(s,c)),yv((0,n.cross)(s,l))),-1,1),f=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(d.mul(d)),0)),p=(0,n.acos)(d),m=a.x.mul(u).sub(p),h=(0,n.sin)(m),g=(0,n.cos)(m),_=(0,n.clamp)((0,n.dot)(s,c),-1,1),v=g.sub(d),y=h.add(f.mul(_)),b=y.mul(g).sub(v.mul(h)).mul(d).sub(y),x=y.mul(h).add(v.mul(g)).mul(f),S=(0,n.clamp)((0,n.select)((0,n.abs)(x).greaterThan(1e-10),b.div(x),(0,n.float)(1)),-1,1),C=(0,n.dot)(l,s),w=yv(l.sub(s.mul(C))),T=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(S.mul(S)),0)),E=(0,n.normalize)(s.mul(S).add(w.mul(T))),D=(0,n.dot)(E,c),O=(0,n.float)(1).sub(a.y.mul((0,n.float)(1).sub(D))),k=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(O.mul(O)),0)),A=yv(E.sub(c.mul(D))),j=(0,n.normalize)(c.mul(O).add(A.mul(k))),M=(0,n.normalize)((0,n.cross)(t.sub(e),r.sub(e))),N=(0,n.dot)(M,j);(0,n.If)((0,n.abs)(N).greaterThan(1e-10),()=>{let t=(0,n.dot)(M,e.sub(i)).div(N);(0,n.If)(t.greaterThan(0),()=>{o.direction.assign(j),o.position.assign(i.add(j.mul(t))),o.valid.assign(!0)})})}),o}),xv=(0,n.Fn)(([e,t,r,i])=>{let a=r.sub(t),o=i.sub(t),s=e.sub(t),c=(0,n.dot)(a,a),l=(0,n.dot)(a,o),u=(0,n.dot)(o,o),d=(0,n.dot)(s,a),f=(0,n.dot)(s,o),p=(0,n.float)(1).div((0,n.max)(c.mul(u).sub(l.mul(l)),(0,n.float)(1e-10))),m=u.mul(d).sub(l.mul(f)).mul(p),h=c.mul(f).sub(l.mul(d)).mul(p);return(0,n.vec3)((0,n.float)(1).sub(m).sub(h),m,h)}),Sv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.sqrt)(i.x),o=(0,n.float)(1).sub(a),s=i.y.mul(a),c=(0,n.float)(1).sub(o).sub(s);return(0,n.normalize)(e.mul(o).add(t.mul(s)).add(r.mul(c)))});(0,n.Fn)(([e])=>e.emissiveIntensity.greaterThan(0).and((0,n.length)(e.emissive).greaterThan(0)));var Cv=2,wv=j({v0:`vec3`,v1:`vec3`,v2:`vec3`,n0:`vec3`,n1:`vec3`,n2:`vec3`,materialIndex:`int`}),Tv=(0,n.Fn)(([e,t,r,i])=>{let a=$i(t,e,0).toVar(),o=$i(t,e,1).toVar(),s=$i(t,e,2).toVar(),c=$i(t,e,4),l=(0,n.uintBitsToFloat)(a.xyz).toVar(),u=(0,n.uintBitsToFloat)(o.xyz).toVar(),d=(0,n.uintBitsToFloat)(s.xyz).toVar(),f=ta(a.w).toVar(),p=ta(o.w).toVar(),m=ta(s.w).toVar();return(0,n.If)(i.greaterThanEqual((0,n.int)(0)),()=>{let e=ua(r,i);l.assign(ma(e,l)),u.assign(ma(e,u)),d.assign(ma(e,d)),f.assign((0,n.normalize)(da(e,f))),p.assign((0,n.normalize)(da(e,p))),m.assign((0,n.normalize)(da(e,m)))}),wv({v0:l,v1:u,v2:d,n0:f,n1:p,n2:m,materialIndex:(0,n.int)(c.z.bitAnd((0,n.uint)(ct)))})}),Ev=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=wv.wrap(Tv(e,a,c,l)),d=hv(u.v0,u.v1,u.v2),f=Q(o,u.materialIndex,(0,n.int)(Bi.EMISSIVE_ROUGHNESS),X),p=Q(o,u.materialIndex,(0,n.int)(Bi.IOR_TRANSMISSION),X),m=(0,n.max)(f.x.mul(.2126).add(f.y.mul(.7152)).add(f.z.mul(.0722)).mul(p.a).mul(d),(0,n.float)(1e-10)).div((0,n.max)(s,(0,n.float)(1e-10))),h=(0,n.float)(0).toVar();return(0,n.If)(_v(u.v0,u.v1,u.v2,i),()=>{let e=gv(u.v0,u.v1,u.v2,i);h.assign(m.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(u.v1.sub(u.v0),u.v2.sub(u.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),.001),a=t.mul(t),o=m.div(d);h.assign(o.mul(a).div(i))}),(0,n.max)(h,Fi)}),Dv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.int)(0).toVar(),o=r.sub(1).toVar();return(0,n.Loop)(a.lessThan(o),()=>{let r=a.add(o).div(2).toVar(),s=e.element(t.add(r.mul((0,n.int)(Cv)))).b;(0,n.If)(s.lessThan(i),()=>{a.assign(r.add(1))}).Else(()=>{o.assign(r)})}),a}),Ov=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p])=>{let m=fv({position:(0,n.vec3)(0),normal:(0,n.vec3)(0),emission:(0,n.vec3)(0),direction:(0,n.vec3)(0),distance:(0,n.float)(0),pdf:(0,n.float)(0),area:(0,n.float)(0),cosThetaLight:(0,n.float)(0),valid:!1}).toVar();return(0,n.If)(u.greaterThan((0,n.int)(0)),()=>{let h=Dv(c,l,u,ve(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o)).toVar(),g=l.add(h.mul((0,n.int)(Cv))),_=c.element(g),v=c.element(g.add(1)),y=(0,n.int)(_.r),b=(0,n.max)(_.g,(0,n.float)(1e-10)),x=v.xyz,S=v.w,C=(0,n.int)(_.a),w=wv.wrap(Tv(y,f,p,C)),T=_e(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),E=(0,n.normalize)((0,n.cross)(w.v1.sub(w.v0),w.v2.sub(w.v0)));(0,n.If)(_v(w.v0,w.v1,w.v2,e),()=>{let r=vv.wrap(bv(w.v0,w.v1,w.v2,e,T));(0,n.If)(r.valid.and(r.solidAngle.greaterThan(1e-7)),()=>{let i=r.direction,a=r.position,o=(0,n.dot)(i,t),s=(0,n.dot)(i,E.negate());(0,n.If)(o.greaterThan(0).and(s.greaterThan(0)),()=>{let t=xv(a,w.v0,w.v1,w.v2),o=(0,n.normalize)(w.n0.mul(t.x).add(w.n1.mul(t.y)).add(w.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=b.div((0,n.max)(d,(0,n.float)(1e-10))).div(r.solidAngle);m.position.assign(a),m.normal.assign(o),m.emission.assign(x),m.direction.assign(i),m.distance.assign(c),m.pdf.assign((0,n.max)(l,Fi)),m.area.assign(S),m.cosThetaLight.assign(s),m.valid.assign(!0)})})}).Else(()=>{let r=mv(w.v0,w.v1,w.v2,T),i=Sv(w.n0,w.n1,w.n2,T),a=r.sub(e),o=(0,n.dot)(a,a),s=(0,n.sqrt)(o),c=a.div(s),l=(0,n.dot)(c,t),u=(0,n.dot)(c,i.negate());(0,n.If)(l.greaterThan(0).and(u.greaterThan(0)),()=>{let e=b.div((0,n.max)(d,(0,n.float)(1e-10)).mul(S)).mul(o).div(u);m.position.assign(r),m.normal.assign(i),m.emission.assign(x),m.direction.assign(c),m.distance.assign(s),m.pdf.assign((0,n.max)(e,Fi)),m.area.assign(S),m.cosThetaLight.assign(u),m.valid.assign(!0)})})}),m}),kv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b])=>{let x=pv({contribution:(0,n.vec3)(0),hasEmissive:!1,emissionOnly:(0,n.vec3)(0),distance:(0,n.float)(0)}).toVar(),S=fv.wrap(Ov(e,t,s,c,l,u,d,p,m,h,g,_,v));return(0,n.If)(S.valid.and(S.pdf.greaterThan(0)),()=>{x.hasEmissive.assign(!0),x.emissionOnly.assign(S.emission),x.distance.assign(S.distance);let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,S.direction));(0,n.If)(o.greaterThan(0).and((0,n.dot)(S.direction,r).greaterThan(0)),()=>{let s=e.add(b(e,r,S.direction)),c=S.position.sub(s).toVar(),l=(0,n.length)(c).toVar(),u=y(s,c.div(l),l.mul(Oi));(0,n.If)(u.greaterThan(0),()=>{let e=bi.wrap(Ji(t,i,S.direction,a)),r=L_(a,e),s=Z_(a,e),c=(0,n.select)(s.greaterThan(0),Wi({pdf1:S.pdf,pdf2:s}),(0,n.float)(1));x.contribution.assign(S.emission.mul(r).mul(o).div(S.pdf).mul(u).mul(f).mul(c))})})}),x}),Av=(0,n.Fn)(([e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y])=>pv.wrap(kv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y)).contribution),jv=4,Mv=2,Nv=32,Pv=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(1),t.mul(i).add(e.mul(r)))),Fv=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(0),e.mul(i).sub(t.mul(r)))),Iv=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=e.add(r).mul(.5),c=(0,n.length)(r.sub(e)),l=o.sub(s),u=(0,n.max)((0,n.dot)(l,l),(0,n.float)(1e-12)),d=(0,n.max)(u,c.mul(.5)),f=(0,n.dot)(i,l.div((0,n.sqrt)(u))),p=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(f.mul(f)),(0,n.float)(0))),m=c.mul(c).mul(.25),h=(0,n.clamp)(m.div(u),(0,n.float)(0),(0,n.float)(1)),g=(0,n.select)(u.lessThan(m),(0,n.float)(-1),(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(h),(0,n.float)(0)))),_=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(g.mul(g)),(0,n.float)(0))),v=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(a.mul(a)),(0,n.float)(0))),y=Pv(p,f,v,a),b=Pv(Fv(p,f,v,a),y,_,g);return(0,n.max)((0,n.select)(b.greaterThan((0,n.float)(0)),t.mul(b).div(d),(0,n.float)(0)),(0,n.float)(0))}),Lv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=fv({position:(0,n.vec3)(0),normal:(0,n.vec3)(0),emission:(0,n.vec3)(0),direction:(0,n.vec3)(0),distance:(0,n.float)(0),pdf:(0,n.float)(0),area:(0,n.float)(0),cosThetaLight:(0,n.float)(0),valid:!1}).toVar(),m=(0,n.float)(1).toVar(),h=(0,n.int)(0).toVar(),g=(0,n.bool)(!1).toVar(),_=ve(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o).toVar();return(0,n.Loop)(Nv,()=>{let t=h.mul((0,n.int)(jv)),r=c.element(t.add((0,n.int)(1))),i=c.element(t.add((0,n.int)(2)));(0,n.If)(r.w.greaterThan(.5),()=>{g.assign((0,n.bool)(!0)),(0,n.Break)()});let a=(0,n.int)(i.x),o=(0,n.int)(i.y),s=a.mul((0,n.int)(jv)),l=c.element(s),u=c.element(s.add((0,n.int)(1))),d=o.mul((0,n.int)(jv)),f=c.element(d),p=c.element(d.add((0,n.int)(1))),v=c.element(s.add((0,n.int)(3))),y=c.element(d.add((0,n.int)(3))),b=Iv(l.xyz,l.w,u.xyz,v.xyz,v.w,e),x=Iv(f.xyz,f.w,p.xyz,y.xyz,y.w,e),S=b.add(x);(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{h.assign(a)}).Else(()=>{let e=b.div(S);(0,n.If)(_.lessThan(e),()=>{_.assign((0,n.clamp)(_.div((0,n.max)(e,(0,n.float)(1e-6))),0,.999999)),m.mulAssign(e),h.assign(a)}).Else(()=>{let t=(0,n.float)(1).sub(e).toVar();_.assign((0,n.clamp)(_.sub(e).div((0,n.max)(t,(0,n.float)(1e-6))),0,.999999)),m.mulAssign(t),h.assign(o)})})}),(0,n.If)(g,()=>{let g=h.mul((0,n.int)(jv)),v=c.element(g),y=c.element(g.add((0,n.int)(2))),b=(0,n.int)(y.x),x=(0,n.int)(y.y),S=(0,n.max)(v.w,(0,n.float)(1e-10)),C=_.mul(S),w=(0,n.float)(0).toVar(),T=b.add(x.sub((0,n.int)(1))).toVar(),E=(0,n.float)(1e-10).toVar();(0,n.Loop)({start:(0,n.int)(0),end:x},({i:e})=>{let t=b.add(e),r=u.add(t.mul((0,n.int)(Mv))),i=(0,n.max)(l.element(r).g,(0,n.float)(0));w.addAssign(i),(0,n.If)(w.greaterThanEqual(C).and(i.greaterThan((0,n.float)(0))),()=>{T.assign(t),E.assign(i),(0,n.Break)()})}),m.mulAssign(E.div(S));let D=u.add(T.mul((0,n.int)(Mv))),O=l.element(D),k=l.element(D.add((0,n.int)(1))),A=(0,n.int)(O.r),j=k.xyz,M=k.w,N=(0,n.int)(O.a),P=wv.wrap(Tv(A,d,f,N)),F=_e(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),I=(0,n.normalize)((0,n.cross)(P.v1.sub(P.v0),P.v2.sub(P.v0)));(0,n.If)(_v(P.v0,P.v1,P.v2,e),()=>{let r=vv.wrap(bv(P.v0,P.v1,P.v2,e,F));(0,n.If)(r.valid.and(r.solidAngle.greaterThan((0,n.float)(1e-7))),()=>{let i=r.direction,a=r.position,o=(0,n.dot)(i,t),s=(0,n.dot)(i,I.negate());(0,n.If)(o.greaterThan((0,n.float)(0)).and(s.greaterThan((0,n.float)(0))),()=>{let t=xv(a,P.v0,P.v1,P.v2),o=(0,n.normalize)(P.n0.mul(t.x).add(P.n1.mul(t.y)).add(P.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=m.div((0,n.max)(r.solidAngle,(0,n.float)(1e-10)));p.position.assign(a),p.normal.assign(o),p.emission.assign(j),p.direction.assign(i),p.distance.assign(c),p.pdf.assign((0,n.max)(l,Fi)),p.area.assign(M),p.cosThetaLight.assign(s),p.valid.assign(!0)})})}).Else(()=>{let r=mv(P.v0,P.v1,P.v2,F),i=Sv(P.n0,P.n1,P.n2,F),a=r.sub(e),o=(0,n.dot)(a,a),s=(0,n.sqrt)(o),c=a.div(s),l=(0,n.dot)(c,t),u=(0,n.dot)(c,i.negate());(0,n.If)(l.greaterThan((0,n.float)(0)).and(u.greaterThan((0,n.float)(0))),()=>{let e=m.div((0,n.max)(M,(0,n.float)(1e-10))).mul(o).div(u);p.position.assign(r),p.normal.assign(i),p.emission.assign(j),p.direction.assign(c),p.distance.assign(s),p.pdf.assign((0,n.max)(e,Fi)),p.area.assign(M),p.cosThetaLight.assign(u),p.valid.assign(!0)})})}),p}),Rv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=(0,n.float)(0).toVar(),d=(0,n.int)(e).toVar(),f=a.element(s.add(d.shiftRight((0,n.int)(2)))),p=d.bitAnd((0,n.int)(3)),m=(0,n.select)(p.equal((0,n.int)(0)),f.x,(0,n.select)(p.equal((0,n.int)(1)),f.y,(0,n.select)(p.equal((0,n.int)(2)),f.z,f.w))).toVar();return(0,n.If)(m.greaterThanEqual((0,n.float)(0)),()=>{let e=(0,n.int)(m).toVar(),s=(0,n.float)(1).toVar(),f=(0,n.int)(0).toVar(),p=(0,n.int)(0).toVar(),h=(0,n.bool)(!1).toVar();(0,n.Loop)(Nv,()=>{let t=f.mul((0,n.int)(jv));(0,n.If)(a.element(t.add((0,n.int)(1))).w.greaterThan(.5),()=>{h.assign((0,n.bool)(!0)),(0,n.Break)()});let r=a.element(t.add((0,n.int)(2))),o=(0,n.int)(r.x),c=(0,n.int)(r.y),l=o.mul((0,n.int)(jv)),u=a.element(l),d=a.element(l.add((0,n.int)(1))),m=a.element(l.add((0,n.int)(3))),g=c.mul((0,n.int)(jv)),_=a.element(g),v=a.element(g.add((0,n.int)(1))),y=a.element(g.add((0,n.int)(3))),b=Iv(u.xyz,u.w,d.xyz,m.xyz,m.w,i),x=Iv(_.xyz,_.w,v.xyz,y.xyz,y.w,i),S=b.add(x),C=e.shiftRight(p).bitAnd((0,n.int)(1)).equal((0,n.int)(1));(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{(0,n.If)(C,()=>{s.assign((0,n.float)(0)),f.assign(c)}).Else(()=>{f.assign(o)})}).Else(()=>{let e=b.div(S);(0,n.If)(C,()=>{s.mulAssign((0,n.float)(1).sub(e)),f.assign(c)}).Else(()=>{s.mulAssign(e),f.assign(o)})}),p.addAssign((0,n.int)(1))}),(0,n.If)(h.and(s.greaterThan((0,n.float)(0))),()=>{let e=f.mul((0,n.int)(jv)),p=a.element(e),m=a.element(e.add((0,n.int)(2))),h=(0,n.int)(m.x),g=(0,n.int)(m.y),_=(0,n.max)(p.w,(0,n.float)(1e-10)),v=(0,n.float)(0).toVar(),y=(0,n.int)(-1).toVar();(0,n.Loop)({start:(0,n.int)(0),end:g},({i:e})=>{let t=h.add(e),r=a.element(o.add(t.mul((0,n.int)(Mv))));(0,n.If)((0,n.int)(r.r).equal(d),()=>{v.assign((0,n.max)(r.g,(0,n.float)(0))),y.assign((0,n.int)(r.a)),(0,n.Break)()})}),s.mulAssign(v.div(_));let b=wv.wrap(Tv(d,c,l,y));(0,n.If)(_v(b.v0,b.v1,b.v2,i),()=>{let e=gv(b.v0,b.v1,b.v2,i);u.assign(s.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(b.v1.sub(b.v0),b.v2.sub(b.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),(0,n.float)(.001)),a=hv(b.v0,b.v1,b.v2),o=t.mul(t),c=s.div((0,n.max)(a,(0,n.float)(1e-10)));u.assign(c.mul(o).div(i))})})}),(0,n.max)(u,Fi)}),zv=0x8ac7230489e80000,Bv=1e-4,Vv=1e-4,Hv=.001;function Uv(e){let{bvhBuffer:t,triangleBuffer:r,materialBuffer:i,envCDFTexture:a,lightBuffer:o,rayBufferRW:s,hitBufferRW:c,gBufferRW:l,counters:u,activeIndicesRO:d,envTexture:f,environmentIntensity:p,envMatrix:m,enableEnvironmentLight:h,groundProjectionEnabled:g,groundProjectionRadius:_,groundProjectionHeight:v,groundProjectionLevel:y,enableGroundCatcher:b,groundCatcherHeight:x,envTotalSum:S,envCompensationDelta:C,envResolution:w,directionalLightsBuffer:T,numDirectionalLights:E,areaLightsBuffer:D,numAreaLights:O,pointLightsBuffer:k,numPointLights:A,spotLightsBuffer:j,numSpotLights:M,maxBounceCount:N,maxSubsurfaceSteps:P,maxTransparentBounces:F,currentBounce:I,transparentBackground:L,backgroundIntensity:ee,backgroundColor:te,backgroundBlurriness:ne,backgroundBlurSamples:re,showBackground:ie,globalIlluminationIntensity:R,cameraProjectionMatrix:ae,cameraViewMatrix:oe,fireflyThreshold:ce,frame:le,resolution:ue,shadowTerminatorOffset:de,accumFrame:fe,chunkRowBase:pe,emissiveTriangleCount:me,emissiveVec4Offset:he,emissiveTotalPower:ye,emissiveBoost:be,totalTriangleCount:z,enableEmissiveTriangleSampling:xe,lightBVHNodeCount:Se,reverseMapVec4Offset:B,maxRayCount:Ce,auxGBufferEnabled:V,hasSun:we,sunDirection:Te,sunRadiance:H,sunParams:Ee}=e,De=V.greaterThan((0,n.uint)(0)),Oe=o!==void 0,ke=(e,t,r,i,a)=>{let o=(0,n.normalize)(e).toVar(),s=(0,n.max)(r,(0,n.int)(1)).toVar(),c=(0,n.vec3)(0).toVar();return(0,n.Loop)({start:(0,n.int)(0),end:s,type:`int`,condition:`<`},({i:e})=>{let r=ip(o,t,_e(a,(0,n.int)(0),(0,n.int)(se).add(e),i,ue,le).toVar()).toVar();c.addAssign(P_({tex:f,samp:(0,n.sampler)(f),direction:r,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),c.div((0,n.float)(s))};return(0,n.Fn)(()=>{let e=n.instanceIndex;u&&(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(u.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(u.element((0,n.uint)($.ACTIVE_ENERGY)),(0,n.uint)(0))});let se=u?(0,n.atomicLoad)(u.element((0,n.uint)($.ENTERING_COUNT))):Ce;(0,n.If)(e.greaterThanEqual(se),()=>{(0,n.Return)()});let z=d.element(e),V=wa(s,z).toVar();(0,n.If)(V.bitAnd((0,n.uint)(zg.ACTIVE)).equal((0,n.uint)(0)),()=>{(0,n.Return)()});let Ae=V.bitAnd((0,n.uint)(zg.REDIRECTED)).equal((0,n.uint)(0)).toVar(),je=Sa(s,z).toVar(),Me=Ca(s,z).toVar(),Ne=Ta(s,z).toVar(),Pe=Da(s,z).toVar(),Fe=z,Ie=Ja(c,z).toVar(),Le=(0,n.int)(ue.x).toVar(),Re=(0,n.int)(Fe).add(pe.mul(Le)),ze=(0,n.vec2)((0,n.float)(Re.mod(Le)).add(.5),(0,n.float)(Re.div(Le)).add(.5)),Be=(0,n.int)(I).mul((0,n.int)(32)),Ve=ro(s,z).toVar(),He=Va(c,z).toVar(),Ue=Wa(c,z).toVar(),We=Ua(c,z).toVar(),Ge=Ga(c,z).toVar(),U=Ha(c,z).toVar(),Ke=Ka(c,z).toVar(),qe=ao(s,z).toVar(),Je=(0,n.int)(I).toVar(),Xe=oo(s,z).toVar(),Ze=so(s,z).toVar();(0,n.If)(De.and(qe.equal(1)),()=>{let e=oe.mul((0,n.vec4)(je,1)).z.abs().mul(Ye).add(3);Aa(l,Fe,Ia(s,z).add((0,n.min)(He,(0,n.float)(1e6))).div((0,n.max)(e,(0,n.float)(1e-4))).clamp(0,1))}),(0,n.If)(b.and(Je.equal(0)),()=>{let e=Me.y.toVar();(0,n.If)(e.abs().greaterThan((0,n.float)(Mi)),()=>{let o=x.sub(je.y).div(e).toVar();(0,n.If)(o.greaterThan((0,n.float)(Bv)).and(o.lessThan(He)),()=>{let e=je.add(Me.mul(o)).toVar(),u=(0,n.vec3)(0,1,0),d=Me.negate().toVar(),b=fi.wrap(ia()).toVar(),x=Fd(u,_e(ze,(0,n.int)(0),Be.add((0,n.int)(7)),Ie,ue,le).toVar()).toVar(),N=x.y.mul(Ai).toVar(),P=(0,n.vec3)(Ai),F=hi.wrap($_(e,u,u,b,d,x,N,P,Je,Ie,ze,ue,le,Be,T,E,D,O,k,A,j,M,t,r,i,f,p,m,a,S,C,w,h,(0,n.bool)(!0),(0,n.vec3)(0),u,(0,n.float)(0),we,Te,H,Ee)).toVar(),I=(0,n.max)((0,n.dot)(F.shadowed,Ii),(0,n.float)(0)),R=(0,n.max)((0,n.dot)(F.unoccluded,Ii),(0,n.float)(0)).toVar(),se=(0,n.clamp)(I.div((0,n.max)(R,(0,n.float)(Vv))),0,1).toVar();(0,n.If)(R.lessThan((0,n.float)(Hv)),()=>{se.assign(1)});let ce=I_(je,Me,g,_,v,y).toVar(),de=(0,n.vec3)(0).toVar();(0,n.If)(ie,()=>{(0,n.If)(ne.greaterThan(0),()=>{de.assign(ke(ce,ne.mul(1.3),re,Ie,ze))}).Else(()=>{de.assign(P_({tex:f,samp:(0,n.sampler)(f),direction:ce,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)})});let fe=(0,n.select)(ie,de.mul(ee),te),pe=(0,n.select)(L,(0,n.vec3)(0),fe.mul(se)),me=(0,n.select)(L,(0,n.float)(1).sub(se),(0,n.float)(1));(0,n.If)(De,()=>{ka(l,Fe,u,rv({worldPos:e,cameraProjectionMatrix:ae,cameraViewMatrix:oe}),(0,n.vec3)(1))}),Ba(s,z,(0,n.vec4)(pe,me)),Ra(s,z,Me,V.bitOr((0,n.uint)(zg.AUX_LOCKED)).bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,z,Ie),(0,n.Return)()})})}),(0,n.If)(He.greaterThan(zv),()=>{let e=Ae.and(ie),t=Ae.not().and(h),r=(0,n.vec3)(0).toVar();(0,n.If)(e.or(t),()=>{let e=Me.toVar();(0,n.If)(Ae,()=>{e.assign(I_(je,Me,g,_,v,y))});let t=(0,n.vec3)(0).toVar();(0,n.If)(Ae.and(ne.greaterThan(0)),()=>{t.assign(ke(e,ne.mul(1.3),re,Ie,ze))}).Else(()=>{t.assign(P_({tex:f,samp:(0,n.sampler)(f),direction:e,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),r.assign((0,n.clamp)(t,(0,n.vec3)(0),(0,n.vec3)(1)));let i=(0,n.float)(1).toVar();(0,n.If)(Ae.not(),()=>{let e=Ea(s,z);(0,n.If)(e.greaterThan(0),()=>{let t=M_(f,Me,m,S,C,w).w;(0,n.If)(t.greaterThan(0),()=>{i.assign(Gi({pdf1:e,pdf2:t}))})})});let a=(0,n.select)(Ae.not(),R,(0,n.float)(1)),o=(0,n.select)(Ae,ee,i.mul(a)),c=(0,n.select)(Ae,(0,n.float)(0),(0,n.float)(Je));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(t).mul(o),c,ce,(0,n.int)(fe))),Pe.w)),(0,n.If)(we,()=>{let t=(0,n.vec3)(0).toVar();(0,n.If)(Ae.and(ne.greaterThan(0)),()=>{let r=ne.mul(1.3).toVar(),i=(0,n.acos)((0,n.clamp)((0,n.dot)((0,n.normalize)(e),Te),-1,1));(0,n.If)(i.lessThan(r),()=>{let e=(0,n.float)(1).sub(i.div(r).pow(2)).pow(2);t.assign(H.mul(p).mul(Ee.y).mul(e).mul(3/Math.PI).div(r.mul(r)))})}).Else(()=>{t.assign(V_((0,n.normalize)(e),Te,H,Ee).mul(p))}),(0,n.If)(t.x.add(t.y).add(t.z).greaterThan(0),()=>{let e=(0,n.float)(1).toVar();(0,n.If)(Ae.not().and(V.bitAnd((0,n.uint)(zg.SUN_NEE)).notEqual((0,n.uint)(0))),()=>{e.assign(Wi({pdf1:Ea(s,z),pdf2:(0,n.float)(1).div(Ee.y)}))});let r=(0,n.max)(Je.sub(1),(0,n.int)(0)),i=(0,n.select)(Ae,ee,e.mul((0,n.select)(r.greaterThan((0,n.int)(0)),R,(0,n.float)(1))));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(t).mul(i),(0,n.select)(Ae,(0,n.float)(0),(0,n.float)(r)),ce,(0,n.int)(fe))),Pe.w))})})}),(0,n.If)(Ae.and(ie.not()).and(L.not()),()=>{Pe.assign((0,n.vec4)(Pe.xyz.add(Ne.mul(te)),Pe.w))}),(0,n.If)(V.bitAnd((0,n.uint)(zg.HAS_HIT_OPAQUE)).equal((0,n.uint)(0)),()=>{Pe.w.assign(0)}),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))).and(V.bitAnd((0,n.uint)(zg.REDIRECTED)).notEqual((0,n.uint)(0))),()=>{let e=ja(l,Fe);ka(l,Fe,(0,n.normalize)(Me),Na(e).w,(0,n.clamp)(r.mul(Ve),(0,n.vec3)(0),(0,n.vec3)(1)))}),Ba(s,z,Pe),Ra(s,z,Me,V.bitAnd((0,n.uint)(~zg.ACTIVE))),(0,n.Return)()});let W=je.add(Me.mul(He)).toVar(),Qe=(0,n.normalize)(Ue).toVar(),$e=Za(s,z),et=(0,n.int)($e.stackDepth).toVar(),tt=$e.ior1.toVar(),nt=$e.ior2.toVar(),rt=$e.ior3.toVar(),it=(0,n.int)($e.transTraversals).toVar(),at=(0,n.float)($e.wavelength).toVar();(0,n.If)(et.greaterThan(0),()=>{let e=$a(s,z).toVar(),t=co(s,z),r=t.sigmaS.toVar(),i=t.g.toVar();(0,n.If)((0,n.max)((0,n.max)(r.x,r.y),r.z).lessThanEqual(0),()=>{let t=(0,n.exp)(e.mul(He).negate()).toVar();Ne.mulAssign(t),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{Ve.mulAssign(t)})}).Else(()=>{let t=e.add(r),a=Rd.wrap(Hd(t,r,Ne,He,Ie,ze,ue,le,Be)).toVar();Ne.mulAssign(a.weight),(0,n.If)(a.didScatter,()=>{let e=_e(ze,(0,n.int)(0),Be.add((0,n.int)(6)),Ie,ue,le),t=je.add(Me.mul(a.t)),r=Vd(Me,i,e).toVar();Xe.addAssign(1);let o=(0,n.clamp)((0,n.max)((0,n.max)(Ne.x,Ne.y),Ne.z),.02,1).toVar();(0,n.If)(Xe.greaterThanEqual(P).or(ve(ze,(0,n.int)(0),Be.add((0,n.int)(12)),Ie,ue,le).greaterThan(o)).toVar(),()=>{Ba(s,z,Pe),Ra(s,z,Me,V.bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,z,Ie),(0,n.Return)()}),Ne.divAssign(o),V.assign(V.bitOr((0,n.uint)(zg.REDIRECTED))),La(s,z,t,qe,Xe,Ze),Ra(s,z,r,V),za(s,z,Ne,Ea(s,z)),Ba(s,z,Pe),Ya(c,z,Ie),(0,n.Return)()})})});let G=fi.wrap(ra((0,n.int)(Ge),i)).toVar(),ot=We.toVar(),st=Qe.toVar();(0,n.If)(G.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(G.displacementScale.greaterThan(0)),()=>{let e=di({origin:je,direction:Me}),i=gi({didHit:!0,dst:He,hitPoint:W,normal:Qe,uv:We,materialIndex:(0,n.int)(Ge),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(U),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),a=uv.wrap(dv(e,i,r,G,Je,t,Ke)).toVar();ot.assign(a.uv),st.assign(a.normal),W.assign(a.hitPoint)});let ct=(0,n.vec4)(0).toVar();(0,n.If)(G.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{ct.assign(Cf(r,(0,n.int)(U),Qe,G.normalTransform,t,Ke))});let lt=Ci.wrap(kf(G,ot,Qe,ct)).toVar(),ut=lt.roughness.toVar();G.color.assign(lt.albedo),G.metalness.assign(lt.metalness.clamp(0,1)),G.roughness.assign(lt.roughness.clamp(.05,1)),G.sheenRoughness.assign(G.sheenRoughness.clamp(.05,1));let dt=gf({uv:ot,transform:G.albedoTransform}).toVar();(0,n.If)(G.anisotropyMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let e=Ef(G,dt).toVar();G.anisotropy.assign(e.x),G.anisotropyRotation.assign(e.y)});let K=pi.wrap(Df(G,dt)).toVar();G.transmission.assign(K.transmission),G.clearcoat.assign(K.clearcoat),G.clearcoatRoughness.assign(K.clearcoatRoughness),G.sheenColor.assign(K.sheenColor),G.sheenRoughness.assign(K.sheenRoughness),G.iridescence.assign(K.iridescence),G.iridescenceThicknessRange.assign((0,n.vec2)(G.iridescenceThicknessRange.x,K.iridescenceThickness)),G.specularIntensity.assign(K.specularIntensity),G.specularColor.assign(K.specularColor);let ft=lt.albedo.toVar();(0,n.If)(G.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(G.displacementScale.greaterThan(0)),()=>{Qe.assign((0,n.normalize)(st.add(lt.normal.sub((0,n.normalize)(Ue)))))}).Else(()=>{Qe.assign(lt.normal)});let q=G.metalness.toVar(),pt=G.transmission.toVar(),mt=(0,n.smoothstep)((0,n.float)(0),(0,n.float)(.15),ut).toVar(),ht=(0,n.clamp)((0,n.float)(1).sub(q).mul((0,n.float)(1).sub(pt)).add(mt.mul(q.mul((0,n.float)(1).sub(pt)).add(pt))),0,1).greaterThanEqual((0,n.float)(.25)).toVar(),gt=Ve.toVar(),_t=e=>{(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let t=Na(ja(l,Fe)).w;ka(l,Fe,e,t,(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1)))})},vt=()=>{Ba(s,z,Pe),Ra(s,z,Me,V.bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,z,Ie)};(0,n.If)(Je.equal(0).and(De),()=>{let e=rv({worldPos:W,cameraProjectionMatrix:ae,cameraViewMatrix:oe});ka(l,Fe,(0,n.vec3)(0,0,1),e,(0,n.vec3)(0))});let yt=(0,n.float)(1).toVar(),bt=(0,n.float)(1).toVar();(0,n.If)(et.equal(1),()=>{yt.assign(tt)}).ElseIf(et.equal(2),()=>{yt.assign(nt),bt.assign(tt)}).ElseIf(et.equal(3),()=>{yt.assign(rt),bt.assign(nt)});let xt=di({origin:je,direction:Me}),St=Kd.wrap(nf(xt,Qe,G,Ie,ze,ue,le,Be,(0,n.int)(it),yt,bt,at)).toVar();at.assign(St.pathWavelength),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Na(ja(l,Fe)).w,t=(0,n.select)((0,n.dot)(Qe,Me.negate()).lessThan(0),Qe.negate(),Qe).toVar(),r=(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1)).toVar();(0,n.If)(G.alphaMode.equal((0,n.int)(2)),()=>{ka(l,Fe,t,e,r),V.assign(V.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).ElseIf(St.isAlphaSkip,()=>{}).ElseIf(St.isSubsurface,()=>{ka(l,Fe,t,e,r),V.assign(V.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).ElseIf(St.isTransmissive,()=>{(0,n.If)(ht.or(G.dispersion.greaterThan(0)),()=>{ka(l,Fe,t,e,r),V.assign(V.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).Else(()=>{Ve.mulAssign((0,n.clamp)(ft,(0,n.vec3)(0),(0,n.vec3)(1)))})})}),(0,n.If)(St.continueRay,()=>{(0,n.If)(St.isTransmissive.and(St.didReflect.not()),()=>{(0,n.If)(St.entering,()=>{(0,n.If)(et.lessThan(3),()=>{et.addAssign(1),(0,n.If)(et.equal(1),()=>{tt.assign(G.ior)}),(0,n.If)(et.equal(2),()=>{nt.assign(G.ior)}),(0,n.If)(et.equal(3),()=>{rt.assign(G.ior)}),eo(s,z,(0,n.select)(G.attenuationDistance.greaterThan(0),(0,n.log)((0,n.max)(G.attenuationColor,(0,n.vec3)(.001))).negate().div(G.attenuationDistance),(0,n.vec3)(0))),lo(s,z,(0,n.vec3)(0),(0,n.float)(0))})}).Else(()=>{(0,n.If)(et.greaterThan(0),()=>{et.subAssign(1)})})}),(0,n.If)(St.isSubsurface.and(St.didReflect.not()),()=>{(0,n.If)(St.entering,()=>{(0,n.If)(et.lessThan(3),()=>{et.addAssign(1),(0,n.If)(et.equal(1),()=>{tt.assign(G.ior)}),(0,n.If)(et.equal(2),()=>{nt.assign(G.ior)}),(0,n.If)(et.equal(3),()=>{rt.assign(G.ior)});let e=zd.wrap(Ud(G.subsurfaceColor,G.subsurfaceRadius,G.subsurfaceRadiusScale)).toVar();eo(s,z,e.sigmaT.sub(e.sigmaS)),lo(s,z,e.sigmaS,(0,n.clamp)(G.subsurfaceAnisotropy,-.99,.99))})}).Else(()=>{(0,n.If)(et.greaterThan(0),()=>{et.subAssign(1)})})}),(0,n.If)(St.isTransmissive.and(it.greaterThan(0)),()=>{it.subAssign(1)}),Ne.mulAssign(St.throughput);let e=O_(qa(c,z)).faceN,t=Di(W,(0,n.select)((0,n.dot)(e,St.direction).lessThan(0),e.negate(),e));(0,n.If)(St.isAlphaSkip.not(),()=>{V.assign(V.bitOr((0,n.uint)(zg.REDIRECTED)))}).Else(()=>{Ze.addAssign(1),(0,n.If)(Ze.greaterThan(F),()=>{_t((0,n.select)((0,n.dot)(Qe,Me.negate()).lessThan(0),Qe.negate(),Qe)),vt(),(0,n.Return)()})}),La(s,z,t,qe,Xe,Ze,(0,n.select)(St.isAlphaSkip,Ia(s,z).add(He),(0,n.float)(0))),Ra(s,z,St.direction,V),za(s,z,Ne,Ea(s,z)),Ba(s,z,Pe),Qa(s,z,(0,n.uint)(et),(0,n.uint)(it),tt,nt,rt,(0,n.uint)(at.add(.5))),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{io(s,z,Ve)}),Ya(c,z,Ie),(0,n.Return)()}),V.assign(V.bitOr((0,n.uint)(zg.HAS_HIT_OPAQUE|zg.REDIRECTED)));let Ct=lt.emissive.toVar();(0,n.If)((0,n.length)(Ct).greaterThan(0),()=>{let e=(0,n.select)(Ae.not(),R,(0,n.float)(1)),a=(0,n.float)(1).toVar();Oe&&(0,n.If)(xe.equal((0,n.int)(1)).and(me.greaterThan((0,n.int)(0))).and(Je.greaterThan(0)),()=>{let e=Ea(s,z);(0,n.If)(e.greaterThan(0),()=>{let c=Ia(s,z).toVar(),l=je.sub(Me.mul(c)).toVar(),u=He.add(c).toVar(),d=(0,n.float)(0).toVar();(0,n.If)(Se.greaterThan((0,n.int)(0)),()=>{d.assign(Rv((0,n.int)(U),u,Me,l,o,he,B,r,t))}).Else(()=>{d.assign(Ev((0,n.int)(U),u,Me,l,r,i,ye,t,Ke))}),a.assign(Wi({pdf1:e,pdf2:d}))})}),Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ct.mul(Ne).mul(e).mul(a),(0,n.float)(Je),ce,(0,n.int)(fe))),Pe.w))});let wt=Me.negate().toVar(),Tt=(0,n.normalize)(Ue),Et=(0,n.select)((0,n.dot)(Tt,wt).lessThan(0),Tt.negate(),Tt).toVar(),Dt=O_(qa(c,z)),Ot=Dt.faceN.toVar(),kt=Tt.mul(Dt.liftScale),At=e=>w_({hitPoint:W,offsetNormal:Ot,lift:kt,faceN:Ot,smoothN:Et,L:e,cutoff:de});(0,n.If)((0,n.dot)(Tt,wt).lessThan(0),()=>{Qe.assign(Qe.negate())}),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Na(ja(l,Fe)).w;(0,n.If)(ht,()=>{ka(l,Fe,Qe,e,(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1))),V.assign(V.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).Else(()=>{let e=(0,n.max)((0,n.dot)(Qe,wt),(0,n.float)(.001)),t=Si.wrap(bd(G,ft));Ve.mulAssign(xi.wrap(yd(t.f0,t.f90,t.eta,t.F0m,G.metalness,(0,n.vec3)(0),(0,n.float)(0),t.F0,e,(0,n.max)(ut,(0,n.float)(.02)))).E_total)})});let jt=wi.wrap(Qi(G.metalness,G.roughness,G.transmission,G.clearcoat,G.emissive,G.subsurface)).toVar(),Mt=ge(ze,(0,n.int)(0),Je,Ie,(0,n.int)(-1),ue,le).toVar(),Nt=ve(ze,(0,n.int)(0),Be.add((0,n.int)(2)),Ie,ue,le).toVar(),Pt=vi({specular:(0,n.float)(0),diffuse:(0,n.float)(0),sheen:(0,n.float)(0),clearcoat:(0,n.float)(0),transmission:(0,n.float)(0),iridescence:(0,n.float)(0)}),Ft=Ei({invRoughness:(0,n.float)(0),metalFactor:(0,n.float)(.5),iorFactor:(0,n.float)(.67),maxSheenColor:(0,n.float)(0)}),It=(0,n.vec3)(0).toVar(),Lt=(0,n.vec3)(0).toVar(),Rt=(0,n.float)(0).toVar(),zt=(0,n.bool)(!1).toVar(),Bt=(0,n.vec3)(1).toVar();(0,n.If)(G.clearcoat.greaterThan(0),()=>{let e=di({origin:je,direction:Me}),t=gi({didHit:!0,dst:He,hitPoint:W,normal:Qe,uv:We,materialIndex:(0,n.int)(Ge),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(0),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),r=av.wrap(ov(e,t,G,Mt,Ie,ze,ue,le,Be));It.assign(r.L),Lt.assign(r.brdf),Rt.assign(r.pdf)}).Else(()=>{let e=_i.wrap(tv(wt,Qe,G,Mt,Nt,Ie,ze,ue,le,Be,jt,!1,Pt,!1,Ft));It.assign(e.direction),Lt.assign(e.value),Rt.assign(e.pdf),zt.assign(e.isTransmission),Bt.assign(e.colorWeight)});let Vt=hi.wrap($_(W,Qe,Et,G,wt,It,Rt,Lt,Je,Ie,ze,ue,le,Be,T,E,D,O,k,A,j,M,t,r,i,f,p,m,a,S,C,w,h,(0,n.bool)(!1),kt,Ot,de,we,Te,H,Ee)).shadowed.toVar(),Ht=(0,n.select)(Je.greaterThan(0),R,(0,n.float)(1));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(Vt).mul(Ht),(0,n.float)(Je),ce,(0,n.int)(fe))),Pe.w)),Oe&&(0,n.If)(xe.equal((0,n.int)(1)).and(me.greaterThan((0,n.int)(0))),()=>{let e=(0,n.Fn)(([e,n,a])=>Nf(e,n,a,S_,t,r,i));(0,n.If)(Se.greaterThan((0,n.int)(0)),()=>{let i=fv.wrap(Lv(W,Qe,Ie,ze,ue,le,Be,o,o,he,r,t));(0,n.If)(i.valid.and(i.pdf.greaterThan(0)),()=>{let t=(0,n.max)((0,n.float)(0),(0,n.dot)(Qe,i.direction));(0,n.If)(t.greaterThan(0).and((0,n.dot)(i.direction,Et).greaterThan(0)),()=>{let r=At(i.direction).toVar(),a=i.position.sub(r).toVar(),o=(0,n.length)(a).toVar(),s=e(r,a.div(o),o.mul(Oi));(0,n.If)(s.greaterThan(0),()=>{let e=R_(wt,i.direction,Qe,G),r=Q_(wt,i.direction,Qe,G),a=(0,n.select)(r.greaterThan(0),Wi({pdf1:i.pdf,pdf2:r}),(0,n.float)(1)),o=i.emission.mul(e).mul(t).div(i.pdf).mul(s).mul(be).mul(a);Pe.assign((0,n.vec4)(Pe.xyz.add(nv(o.mul(Ne).mul(Ht),(0,n.float)(Je),ce,(0,n.int)(fe))),Pe.w))})})})}).Else(()=>{let i=Av(W,Qe,Et,wt,G,Je,Ie,ze,ue,le,Be,be,o,he,me,ye,r,t,e,(0,n.Fn)(([e,,t])=>At(t).sub(e)));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(i.mul(Ne).mul(Ht),(0,n.float)(Je),ce,(0,n.int)(fe))),Pe.w))})});let Ut=Uf.wrap(ev(Qe,G,It,Rt,Lt,zt,Bt,Ie,ze,ue,le,Be)).toVar(),Wt=Ut.direction.toVar();(0,n.If)(zt.not().and((0,n.dot)(Wt,Et).lessThanEqual(0)),()=>{_t(Qe),vt(),(0,n.Return)()});let Gt=(0,n.max)(Ut.combinedPdf,.001).toVar();Ne.mulAssign(Ut.throughput);let Kt=iv(Je,Ne,jt,Wt,Ie,ze,ue,le,Be,h).toVar();(0,n.If)(Kt.lessThanEqual(0),()=>{_t(Qe),vt(),(0,n.Return)()}),Ne.divAssign(Kt),(0,n.If)(qe.greaterThanEqual(N),()=>{_t(Qe),vt(),(0,n.Return)()});let qt=Di(W,(0,n.select)((0,n.dot)(Ot,Wt).lessThan(0),Ot.negate(),Ot)),Jt=zt.not().and((0,n.dot)(Qe,Wt).greaterThan(0));V.assign(V.sub(V.bitAnd((0,n.uint)(zg.SUN_NEE))).bitOr((0,n.select)(Jt,(0,n.uint)(zg.SUN_NEE),(0,n.uint)(0)))),La(s,z,qt,qe.add(1),Xe,Ze),Ra(s,z,Wt,V),za(s,z,Ne,Gt),Ba(s,z,Pe),Qa(s,z,(0,n.uint)(et),(0,n.uint)(it),tt,nt,rt,(0,n.uint)(at.add(.5))),(0,n.If)(De.and(V.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{io(s,z,Ve)}),Ya(c,z,Ie)})}var Wv=(e,t)=>{let r=Ta(e,t);return(0,n.min)((0,n.uint)((0,n.max)((0,n.max)(r.x,r.y),r.z).max(0).mul(64).add(.5)),(0,n.uint)(Rg))};function Gv(e){let{rayBufferRO:t,activeIndicesReadRO:r,activeIndicesWriteRW:i,counters:a,currentActiveCount:o}=e;return(0,n.Fn)(()=>{let e=n.instanceIndex,s=a?(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))):o;(0,n.If)(e.greaterThanEqual(s),()=>{(0,n.Return)()});let c=r.element(e);(0,n.If)(wa(t,c).bitAnd((0,n.uint)(zg.ACTIVE)).notEqual((0,n.uint)(0)),()=>{let e=(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(1));i.element(e).assign(c),(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_ENERGY)),Wv(t,c))})})}function Kv(e){let{rayBufferRO:t,activeIndicesReadRO:r,activeIndicesWriteRW:i,counters:a,currentActiveCount:o}=e;return(0,n.Fn)(()=>{let e=n.instanceIndex,s=a?(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))):o,c=e.lessThan(s),l=r.element(e),u=wa(t,l),d=c.and(u.bitAnd((0,n.uint)(zg.ACTIVE)).notEqual((0,n.uint)(0))),f=(0,n.select)(d,(0,n.uint)(1),(0,n.uint)(0)),p=(0,n.select)(d,Wv(t,l),(0,n.uint)(0)),m=(0,n.subgroupExclusiveAdd)(f).toVar(),h=(0,n.subgroupAdd)(f).toVar(),g=(0,n.subgroupAdd)(p).toVar(),_=(0,n.subgroupExclusiveAdd)((0,n.uint)(1)).toVar(),v=(0,n.uint)(0).toVar();(0,n.If)(_.equal((0,n.uint)(0)),()=>{v.assign((0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_RAY_COUNT)),h)),(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_ENERGY)),g)});let y=(0,n.subgroupBroadcast)(v,(0,n.uint)(0)).toVar();(0,n.If)(d,()=>{i.element(y.add(m)).assign(l)})})}var qv=(0,n.wgslFn)(`
|
|
874
|
+
`),iv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u])=>{let d=(0,n.float)(1).toVar();return(0,n.If)(e.greaterThanEqual((0,n.int)(3)),()=>{let f=(0,n.max)((0,n.max)((0,n.max)(t.x,t.y),t.z),0).toVar();(0,n.If)(f.lessThan(8e-4).and(e.greaterThan((0,n.int)(4))),()=>{let e=(0,n.max)(f.mul(125),.01),t=_e(o,(0,n.int)(0),l.add((0,n.int)(3)),a,s,c);d.assign((0,n.select)(t.lessThan(e),e,(0,n.float)(0)))}).Else(()=>{let t=r.complexityScore.toVar();(0,n.If)(r.isMetallic.and(r.isSmooth).and(e.lessThan((0,n.int)(7))),()=>{t.addAssign(.3)}),(0,n.If)(r.isTransmissive.and(e.lessThan((0,n.int)(6))),()=>{t.addAssign(.25)}),(0,n.If)(r.isEmissive.and(e.lessThan((0,n.int)(4))),()=>{t.addAssign(.15)}),t.assign((0,n.clamp)(t,0,1));let p=(0,n.int)(3).toVar();(0,n.If)(t.greaterThan(.6),()=>{p.assign(5)}).ElseIf(t.greaterThan(.4),()=>{p.assign(4)}),(0,n.If)(e.lessThan(p),()=>{d.assign(1)}).Else(()=>{let m=r.complexityScore.toVar();(0,n.If)(r.isMetallic.and(r.isSmooth),()=>{m.addAssign(.15)}),(0,n.If)(r.isTransmissive.and(r.hasClearcoat),()=>{m.addAssign(.12)}),(0,n.If)(r.isEmissive,()=>{m.addAssign(.1)}),m.assign((0,n.clamp)(m,0,1));let h=(0,n.float)(.5).toVar();(0,n.If)(u.and(f.greaterThan(.01)),()=>{let e=(0,n.clamp)(i.y,0,1);h.assign((0,n.mix)((0,n.float)(.3),(0,n.float)(.8),e.mul(e)))});let g=(0,n.smoothstep)((0,n.float)(.001),(0,n.float)(.1),f),_=f.mul((0,n.mix)(m.mul(.7),h,.3)).mul(g).toVar(),v=(0,n.mix)((0,n.clamp)(t.mul(.4).add(f.mul(.6)).mul(1.2),.15,.95),(0,n.clamp)(f.mul(.4).add(t.mul(.1)),.03,.6),(0,n.clamp)((0,n.float)(e.sub(p)).div(10),0,1)).toVar();v.assign((0,n.mix)(v,(0,n.max)(v,_),.4)),(0,n.If)(t.greaterThan(.5),()=>{let e=t.sub(.5).mul(.6);v.assign((0,n.mix)(v,(0,n.float)(1),e))});let y=(0,n.float)(.12).add(t.mul(.08)),b=(0,n.exp)((0,n.float)(e.sub(p)).negate().mul(y));v.mulAssign(b);let x=(0,n.select)(r.isEmissive,(0,n.float)(.04),(0,n.float)(.02));v.assign((0,n.clamp)(v,x,1));let S=_e(o,(0,n.int)(0),l.add((0,n.int)(3)),a,s,c);d.assign((0,n.select)(S.lessThan(v),v,(0,n.float)(0)))})})}),d}),av=j({brdf:`vec3`,L:`vec3`,pdf:`float`}),ov=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=t.normal,d=e.direction.negate(),f=(0,n.max)(r.clearcoatRoughness,Pi),p=(0,n.max)(r.roughness,Pi),m=vi.wrap(jd(r)).toVar(),h=m.clearcoat.toVar(),g=m.specular.toVar(),_=_e(o,(0,n.int)(0),l.add((0,n.int)(13)),a,s,c),v=(0,n.vec3)(0).toVar(),y=(0,n.vec3)(0).toVar();(0,n.If)(_.lessThan(h),()=>{let e=Ki({N:u});y.assign(e.mul(Id({V:e.transpose().mul(d),roughness:f,Xi:i}))),v.assign((0,n.reflect)(d.negate(),y))}).ElseIf(_.lessThan(h.add(g)),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let e=yi.wrap(qi(u,r.anisotropyRotation)),t=(0,n.vec3)((0,n.dot)(d,e.Ta),(0,n.dot)(d,e.Ba),(0,n.dot)(d,u)),a=Sd(r.roughness,r.anisotropy),o=Ld({V:t,alphaX:a.x,alphaY:a.y,Xi:i});y.assign(e.Ta.mul(o.x).add(e.Ba.mul(o.y)).add(u.mul(o.z)))}).Else(()=>{let e=Ki({N:u});y.assign(e.mul(Id({V:e.transpose().mul(d),roughness:p,Xi:i})))}),v.assign((0,n.reflect)(d.negate(),y))}).Else(()=>{v.assign(Pd({N:u,xi:i})),y.assign((0,n.normalize)(d.add(v)))});let b=bi.wrap(Ji(u,d,v,r)),x=(0,n.max)(Ad(r,m,b),.001);return av({brdf:L_(r,b),L:v,pdf:x})}),sv=32,cv=16,lv=5,uv=j({hitPoint:`vec3`,uv:`vec2`,normal:`vec3`,height:`float`}),dv=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=t.hitPoint.toVar(),l=t.uv.toVar(),u=t.normal.toVar(),d=(0,n.float)(0).toVar(),f=t.triangleIndex,p=(0,n.uintBitsToFloat)($i(r,f,0).xyz).toVar(),m=(0,n.uintBitsToFloat)($i(r,f,1).xyz),h=(0,n.uintBitsToFloat)($i(r,f,2).xyz),g=(0,n.uintBitsToFloat)($i(r,f,3)).toVar(),_=(0,n.uintBitsToFloat)($i(r,f,4).xy),v=g.xy.toVar(),y=g.zw,b=_,x=m.sub(p).toVar(),S=h.sub(p).toVar();(0,n.If)(s.greaterThanEqual((0,n.int)(0)),()=>{let e=ua(o,s),t={r0:e[0].xyz,r1:e[1].xyz,r2:e[2].xyz};x.assign(pa({...t,v:x})),S.assign(pa({...t,v:S}))});let C=y.sub(v).toVar(),w=b.sub(v).toVar(),T=C.x.mul(w.y).sub(w.x.mul(C.y)).toVar();return(0,n.If)((0,n.abs)(T).greaterThan(1e-8),()=>{let r=(0,n.float)(1).div(T),o=x.mul(w.y).sub(S.mul(C.y)).mul(r).toVar(),s=S.mul(C.x).sub(x.mul(w.x)).mul(r).toVar(),f=t.normal.toVar(),p=i.displacementScale.div((0,n.float)(10)),m=e.direction,h=(0,n.dot)(m,f).toVar(),g=m.sub(f.mul(h)).toVar(),_=(0,n.dot)(o,o),v=(0,n.dot)(o,s),y=(0,n.dot)(s,s),b=_.mul(y).sub(v.mul(v)).toVar();(0,n.If)((0,n.abs)(b).greaterThan(1e-10),()=>{let e=(0,n.float)(1).div(b),r=(0,n.dot)(g,o),x=(0,n.dot)(g,s),S=(0,n.vec2)(y.mul(r).sub(v.mul(x)).mul(e),_.mul(x).sub(v.mul(r)).mul(e)).toVar(),C=h.toVar(),w=(0,n.max)((0,n.abs)(C),.001),T=p.div(w).toVar(),E=(0,n.int)(a.equal((0,n.int)(0)).select((0,n.int)(sv),(0,n.int)(cv))).toVar(),D=T.negate().toVar(),O=T.sub(D).div((0,n.float)(E)).toVar(),k=D.toVar(),A=D.toVar(),j=(0,n.int)(0).toVar();(0,n.Loop)({start:(0,n.int)(0),end:E,type:`int`,condition:`<`},({i:e})=>{(0,n.If)(j.equal((0,n.int)(0)),()=>{let r=D.add(O.mul((0,n.float)(e))).toVar(),a=t.uv.add(S.mul(r)),o=r.mul(C),s=Af(i.displacementMapIndex,a,i.displacementTransform).sub(.5).mul(p);(0,n.If)(o.lessThanEqual(s).and(e.greaterThan((0,n.int)(0))),()=>{j.assign(1),A.assign(r)}).Else(()=>{k.assign(r)})})}),(0,n.If)(j.equal((0,n.int)(1)),()=>{let e=k.toVar(),r=A.toVar();(0,n.Loop)({start:(0,n.int)(0),end:(0,n.int)(lv),type:`int`,condition:`<`},()=>{let a=e.add(r).mul(.5).toVar(),o=t.uv.add(S.mul(a)),s=a.mul(C),c=Af(i.displacementMapIndex,o,i.displacementTransform).sub(.5).mul(p);(0,n.If)(s.lessThanEqual(c),()=>{r.assign(a)}).Else(()=>{e.assign(a)})});let a=e.add(r).mul(.5).toVar(),h=t.uv.add(S.mul(a)).toVar(),g=t.hitPoint.add(m.mul(a)),_=Af(i.displacementMapIndex,h,i.displacementTransform),v=_.sub(.5).mul(p),y=uf(df(),i.displacementMapIndex).toVar(),b=_,x=Af(i.displacementMapIndex,h.add((0,n.vec2)(y.x,0)),i.displacementTransform),w=Af(i.displacementMapIndex,h.add((0,n.vec2)(0,y.y)),i.displacementTransform),T=(0,n.normalize)(o).toVar(),E=(0,n.normalize)(s).toVar(),D=x.sub(b).mul(p),O=w.sub(b).mul(p),j=(0,n.normalize)(f.sub(T.mul(D)).sub(E.mul(O)));c.assign(g),l.assign(h),u.assign(j),d.assign(v)})})}),uv({hitPoint:c,uv:l,normal:u,height:d})}),fv=j({position:`vec3`,normal:`vec3`,emission:`vec3`,direction:`vec3`,distance:`float`,pdf:`float`,area:`float`,cosThetaLight:`float`,valid:`bool`}),pv=j({contribution:`vec3`,hasEmissive:`bool`,emissionOnly:`vec3`,distance:`float`}),mv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.sqrt)(i.x),o=(0,n.float)(1).sub(a),s=i.y.mul(a),c=(0,n.float)(1).sub(o).sub(s);return e.mul(o).add(t.mul(s)).add(r.mul(c))}),hv=(0,n.Fn)(([e,t,r])=>(0,n.length)((0,n.cross)(t.sub(e),r.sub(e))).mul(.5)),gv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.normalize)(e.sub(i)),o=(0,n.normalize)(t.sub(i)),s=(0,n.normalize)(r.sub(i)),c=(0,n.abs)((0,n.dot)(a,(0,n.cross)(o,s))),l=(0,n.float)(1).add((0,n.dot)(o,s)).add((0,n.dot)(a,s)).add((0,n.dot)(a,o));return(0,n.max)((0,n.float)(2).mul((0,n.atan)(c,(0,n.max)(l,(0,n.float)(1e-10)))),(0,n.float)(0))}),_v=(0,n.Fn)(([e,t,r,i])=>{let a=t.sub(e),o=r.sub(e),s=r.sub(t),c=(0,n.max)((0,n.dot)(a,a),(0,n.max)((0,n.dot)(o,o),(0,n.dot)(s,s))),l=(0,n.cross)(a,o),u=(0,n.dot)(l,l),d=(0,n.bool)(!1).toVar();return(0,n.If)(u.greaterThan(1e-20),()=>{let t=(0,n.dot)(l,i.sub(e)),r=t.mul(t).div(u),a=c.mul(c).lessThan(u.mul(64));d.assign(c.greaterThan(r).and(a))}),d}),vv=j({direction:`vec3`,position:`vec3`,solidAngle:`float`,valid:`bool`}),yv=(0,n.Fn)(([e])=>{let t=(0,n.length)(e);return(0,n.select)(t.greaterThan(1e-10),e.div(t),(0,n.vec3)(0))}),bv=(0,n.Fn)(([e,t,r,i,a])=>{let o=vv({direction:(0,n.vec3)(0),position:(0,n.vec3)(0),solidAngle:(0,n.float)(0),valid:!1}).toVar(),s=(0,n.normalize)(e.sub(i)),c=(0,n.normalize)(t.sub(i)),l=(0,n.normalize)(r.sub(i)),u=gv(e,t,r,i);return o.solidAngle.assign(u),(0,n.If)(u.greaterThan(1e-7),()=>{let d=(0,n.clamp)((0,n.dot)(yv((0,n.cross)(s,c)),yv((0,n.cross)(s,l))),-1,1),f=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(d.mul(d)),0)),p=(0,n.acos)(d),m=a.x.mul(u).sub(p),h=(0,n.sin)(m),g=(0,n.cos)(m),_=(0,n.clamp)((0,n.dot)(s,c),-1,1),v=g.sub(d),y=h.add(f.mul(_)),b=y.mul(g).sub(v.mul(h)).mul(d).sub(y),x=y.mul(h).add(v.mul(g)).mul(f),S=(0,n.clamp)((0,n.select)((0,n.abs)(x).greaterThan(1e-10),b.div(x),(0,n.float)(1)),-1,1),C=(0,n.dot)(l,s),w=yv(l.sub(s.mul(C))),T=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(S.mul(S)),0)),E=(0,n.normalize)(s.mul(S).add(w.mul(T))),D=(0,n.dot)(E,c),O=(0,n.float)(1).sub(a.y.mul((0,n.float)(1).sub(D))),k=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(O.mul(O)),0)),A=yv(E.sub(c.mul(D))),j=(0,n.normalize)(c.mul(O).add(A.mul(k))),M=(0,n.normalize)((0,n.cross)(t.sub(e),r.sub(e))),N=(0,n.dot)(M,j);(0,n.If)((0,n.abs)(N).greaterThan(1e-10),()=>{let t=(0,n.dot)(M,e.sub(i)).div(N);(0,n.If)(t.greaterThan(0),()=>{o.direction.assign(j),o.position.assign(i.add(j.mul(t))),o.valid.assign(!0)})})}),o}),xv=(0,n.Fn)(([e,t,r,i])=>{let a=r.sub(t),o=i.sub(t),s=e.sub(t),c=(0,n.dot)(a,a),l=(0,n.dot)(a,o),u=(0,n.dot)(o,o),d=(0,n.dot)(s,a),f=(0,n.dot)(s,o),p=(0,n.float)(1).div((0,n.max)(c.mul(u).sub(l.mul(l)),(0,n.float)(1e-10))),m=u.mul(d).sub(l.mul(f)).mul(p),h=c.mul(f).sub(l.mul(d)).mul(p);return(0,n.vec3)((0,n.float)(1).sub(m).sub(h),m,h)}),Sv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.sqrt)(i.x),o=(0,n.float)(1).sub(a),s=i.y.mul(a),c=(0,n.float)(1).sub(o).sub(s);return(0,n.normalize)(e.mul(o).add(t.mul(s)).add(r.mul(c)))});(0,n.Fn)(([e])=>e.emissiveIntensity.greaterThan(0).and((0,n.length)(e.emissive).greaterThan(0)));var Cv=2,wv=j({v0:`vec3`,v1:`vec3`,v2:`vec3`,n0:`vec3`,n1:`vec3`,n2:`vec3`,materialIndex:`int`}),Tv=(0,n.Fn)(([e,t,r,i])=>{let a=$i(t,e,0).toVar(),o=$i(t,e,1).toVar(),s=$i(t,e,2).toVar(),c=$i(t,e,4),l=(0,n.uintBitsToFloat)(a.xyz).toVar(),u=(0,n.uintBitsToFloat)(o.xyz).toVar(),d=(0,n.uintBitsToFloat)(s.xyz).toVar(),f=ta(a.w).toVar(),p=ta(o.w).toVar(),m=ta(s.w).toVar();return(0,n.If)(i.greaterThanEqual((0,n.int)(0)),()=>{let e=ua(r,i);l.assign(ma(e,l)),u.assign(ma(e,u)),d.assign(ma(e,d)),f.assign((0,n.normalize)(da(e,f))),p.assign((0,n.normalize)(da(e,p))),m.assign((0,n.normalize)(da(e,m)))}),wv({v0:l,v1:u,v2:d,n0:f,n1:p,n2:m,materialIndex:(0,n.int)(c.z.bitAnd((0,n.uint)(ct)))})}),Ev=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=wv.wrap(Tv(e,a,c,l)),d=hv(u.v0,u.v1,u.v2),f=Q(o,u.materialIndex,(0,n.int)(Bi.EMISSIVE_ROUGHNESS),X),p=Q(o,u.materialIndex,(0,n.int)(Bi.IOR_TRANSMISSION),X),m=(0,n.max)(f.x.mul(.2126).add(f.y.mul(.7152)).add(f.z.mul(.0722)).mul(p.a).mul(d),(0,n.float)(1e-10)).div((0,n.max)(s,(0,n.float)(1e-10))),h=(0,n.float)(0).toVar();return(0,n.If)(_v(u.v0,u.v1,u.v2,i),()=>{let e=gv(u.v0,u.v1,u.v2,i);h.assign(m.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(u.v1.sub(u.v0),u.v2.sub(u.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),.001),a=t.mul(t),o=m.div(d);h.assign(o.mul(a).div(i))}),(0,n.max)(h,Fi)}),Dv=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.int)(0).toVar(),o=r.sub(1).toVar();return(0,n.Loop)(a.lessThan(o),()=>{let r=a.add(o).div(2).toVar(),s=e.element(t.add(r.mul((0,n.int)(Cv)))).b;(0,n.If)(s.lessThan(i),()=>{a.assign(r.add(1))}).Else(()=>{o.assign(r)})}),a}),Ov=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p])=>{let m=fv({position:(0,n.vec3)(0),normal:(0,n.vec3)(0),emission:(0,n.vec3)(0),direction:(0,n.vec3)(0),distance:(0,n.float)(0),pdf:(0,n.float)(0),area:(0,n.float)(0),cosThetaLight:(0,n.float)(0),valid:!1}).toVar();return(0,n.If)(u.greaterThan((0,n.int)(0)),()=>{let h=Dv(c,l,u,_e(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o)).toVar(),g=l.add(h.mul((0,n.int)(Cv))),_=c.element(g),v=c.element(g.add(1)),y=(0,n.int)(_.r),b=(0,n.max)(_.g,(0,n.float)(1e-10)),x=v.xyz,S=v.w,C=(0,n.int)(_.a),w=wv.wrap(Tv(y,f,p,C)),T=ge(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),E=(0,n.normalize)((0,n.cross)(w.v1.sub(w.v0),w.v2.sub(w.v0)));(0,n.If)(_v(w.v0,w.v1,w.v2,e),()=>{let r=vv.wrap(bv(w.v0,w.v1,w.v2,e,T));(0,n.If)(r.valid.and(r.solidAngle.greaterThan(1e-7)),()=>{let i=r.direction,a=r.position,o=(0,n.dot)(i,t),s=(0,n.dot)(i,E.negate());(0,n.If)(o.greaterThan(0).and(s.greaterThan(0)),()=>{let t=xv(a,w.v0,w.v1,w.v2),o=(0,n.normalize)(w.n0.mul(t.x).add(w.n1.mul(t.y)).add(w.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=b.div((0,n.max)(d,(0,n.float)(1e-10))).div(r.solidAngle);m.position.assign(a),m.normal.assign(o),m.emission.assign(x),m.direction.assign(i),m.distance.assign(c),m.pdf.assign((0,n.max)(l,Fi)),m.area.assign(S),m.cosThetaLight.assign(s),m.valid.assign(!0)})})}).Else(()=>{let r=mv(w.v0,w.v1,w.v2,T),i=Sv(w.n0,w.n1,w.n2,T),a=r.sub(e),o=(0,n.dot)(a,a),s=(0,n.sqrt)(o),c=a.div(s),l=(0,n.dot)(c,t),u=(0,n.dot)(c,i.negate());(0,n.If)(l.greaterThan(0).and(u.greaterThan(0)),()=>{let e=b.div((0,n.max)(d,(0,n.float)(1e-10)).mul(S)).mul(o).div(u);m.position.assign(r),m.normal.assign(i),m.emission.assign(x),m.direction.assign(c),m.distance.assign(s),m.pdf.assign((0,n.max)(e,Fi)),m.area.assign(S),m.cosThetaLight.assign(u),m.valid.assign(!0)})})}),m}),kv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b])=>{let x=pv({contribution:(0,n.vec3)(0),hasEmissive:!1,emissionOnly:(0,n.vec3)(0),distance:(0,n.float)(0)}).toVar(),S=fv.wrap(Ov(e,t,s,c,l,u,d,p,m,h,g,_,v));return(0,n.If)(S.valid.and(S.pdf.greaterThan(0)),()=>{x.hasEmissive.assign(!0),x.emissionOnly.assign(S.emission),x.distance.assign(S.distance);let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,S.direction));(0,n.If)(o.greaterThan(0).and((0,n.dot)(S.direction,r).greaterThan(0)),()=>{let s=e.add(b(e,r,S.direction)),c=S.position.sub(s).toVar(),l=(0,n.length)(c).toVar(),u=y(s,c.div(l),l.mul(Oi));(0,n.If)(u.greaterThan(0),()=>{let e=bi.wrap(Ji(t,i,S.direction,a)),r=L_(a,e),s=Z_(a,e),c=(0,n.select)(s.greaterThan(0),Wi({pdf1:S.pdf,pdf2:s}),(0,n.float)(1));x.contribution.assign(S.emission.mul(r).mul(o).div(S.pdf).mul(u).mul(f).mul(c))})})}),x}),Av=(0,n.Fn)(([e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y])=>pv.wrap(kv(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y)).contribution),jv=4,Mv=2,Nv=32,Pv=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(1),t.mul(i).add(e.mul(r)))),Fv=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(0),e.mul(i).sub(t.mul(r)))),Iv=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=e.add(r).mul(.5),c=(0,n.length)(r.sub(e)),l=o.sub(s),u=(0,n.max)((0,n.dot)(l,l),(0,n.float)(1e-12)),d=(0,n.max)(u,c.mul(.5)),f=(0,n.dot)(i,l.div((0,n.sqrt)(u))),p=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(f.mul(f)),(0,n.float)(0))),m=c.mul(c).mul(.25),h=(0,n.clamp)(m.div(u),(0,n.float)(0),(0,n.float)(1)),g=(0,n.select)(u.lessThan(m),(0,n.float)(-1),(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(h),(0,n.float)(0)))),_=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(g.mul(g)),(0,n.float)(0))),v=(0,n.sqrt)((0,n.max)((0,n.float)(1).sub(a.mul(a)),(0,n.float)(0))),y=Pv(p,f,v,a),b=Pv(Fv(p,f,v,a),y,_,g);return(0,n.max)((0,n.select)(b.greaterThan((0,n.float)(0)),t.mul(b).div(d),(0,n.float)(0)),(0,n.float)(0))}),Lv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=fv({position:(0,n.vec3)(0),normal:(0,n.vec3)(0),emission:(0,n.vec3)(0),direction:(0,n.vec3)(0),distance:(0,n.float)(0),pdf:(0,n.float)(0),area:(0,n.float)(0),cosThetaLight:(0,n.float)(0),valid:!1}).toVar(),m=(0,n.float)(1).toVar(),h=(0,n.int)(0).toVar(),g=(0,n.bool)(!1).toVar(),_=_e(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o).toVar();return(0,n.Loop)(Nv,()=>{let t=h.mul((0,n.int)(jv)),r=c.element(t.add((0,n.int)(1))),i=c.element(t.add((0,n.int)(2)));(0,n.If)(r.w.greaterThan(.5),()=>{g.assign((0,n.bool)(!0)),(0,n.Break)()});let a=(0,n.int)(i.x),o=(0,n.int)(i.y),s=a.mul((0,n.int)(jv)),l=c.element(s),u=c.element(s.add((0,n.int)(1))),d=o.mul((0,n.int)(jv)),f=c.element(d),p=c.element(d.add((0,n.int)(1))),v=c.element(s.add((0,n.int)(3))),y=c.element(d.add((0,n.int)(3))),b=Iv(l.xyz,l.w,u.xyz,v.xyz,v.w,e),x=Iv(f.xyz,f.w,p.xyz,y.xyz,y.w,e),S=b.add(x);(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{h.assign(a)}).Else(()=>{let e=b.div(S);(0,n.If)(_.lessThan(e),()=>{_.assign((0,n.clamp)(_.div((0,n.max)(e,(0,n.float)(1e-6))),0,.999999)),m.mulAssign(e),h.assign(a)}).Else(()=>{let t=(0,n.float)(1).sub(e).toVar();_.assign((0,n.clamp)(_.sub(e).div((0,n.max)(t,(0,n.float)(1e-6))),0,.999999)),m.mulAssign(t),h.assign(o)})})}),(0,n.If)(g,()=>{let g=h.mul((0,n.int)(jv)),v=c.element(g),y=c.element(g.add((0,n.int)(2))),b=(0,n.int)(y.x),x=(0,n.int)(y.y),S=(0,n.max)(v.w,(0,n.float)(1e-10)),C=_.mul(S),w=(0,n.float)(0).toVar(),T=b.add(x.sub((0,n.int)(1))).toVar(),E=(0,n.float)(1e-10).toVar();(0,n.Loop)({start:(0,n.int)(0),end:x},({i:e})=>{let t=b.add(e),r=u.add(t.mul((0,n.int)(Mv))),i=(0,n.max)(l.element(r).g,(0,n.float)(0));w.addAssign(i),(0,n.If)(w.greaterThanEqual(C).and(i.greaterThan((0,n.float)(0))),()=>{T.assign(t),E.assign(i),(0,n.Break)()})}),m.mulAssign(E.div(S));let D=u.add(T.mul((0,n.int)(Mv))),O=l.element(D),k=l.element(D.add((0,n.int)(1))),A=(0,n.int)(O.r),j=k.xyz,M=k.w,N=(0,n.int)(O.a),P=wv.wrap(Tv(A,d,f,N)),F=ge(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),I=(0,n.normalize)((0,n.cross)(P.v1.sub(P.v0),P.v2.sub(P.v0)));(0,n.If)(_v(P.v0,P.v1,P.v2,e),()=>{let r=vv.wrap(bv(P.v0,P.v1,P.v2,e,F));(0,n.If)(r.valid.and(r.solidAngle.greaterThan((0,n.float)(1e-7))),()=>{let i=r.direction,a=r.position,o=(0,n.dot)(i,t),s=(0,n.dot)(i,I.negate());(0,n.If)(o.greaterThan((0,n.float)(0)).and(s.greaterThan((0,n.float)(0))),()=>{let t=xv(a,P.v0,P.v1,P.v2),o=(0,n.normalize)(P.n0.mul(t.x).add(P.n1.mul(t.y)).add(P.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=m.div((0,n.max)(r.solidAngle,(0,n.float)(1e-10)));p.position.assign(a),p.normal.assign(o),p.emission.assign(j),p.direction.assign(i),p.distance.assign(c),p.pdf.assign((0,n.max)(l,Fi)),p.area.assign(M),p.cosThetaLight.assign(s),p.valid.assign(!0)})})}).Else(()=>{let r=mv(P.v0,P.v1,P.v2,F),i=Sv(P.n0,P.n1,P.n2,F),a=r.sub(e),o=(0,n.dot)(a,a),s=(0,n.sqrt)(o),c=a.div(s),l=(0,n.dot)(c,t),u=(0,n.dot)(c,i.negate());(0,n.If)(l.greaterThan((0,n.float)(0)).and(u.greaterThan((0,n.float)(0))),()=>{let e=m.div((0,n.max)(M,(0,n.float)(1e-10))).mul(o).div(u);p.position.assign(r),p.normal.assign(i),p.emission.assign(j),p.direction.assign(c),p.distance.assign(s),p.pdf.assign((0,n.max)(e,Fi)),p.area.assign(M),p.cosThetaLight.assign(u),p.valid.assign(!0)})})}),p}),Rv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=(0,n.float)(0).toVar(),d=(0,n.int)(e).toVar(),f=a.element(s.add(d.shiftRight((0,n.int)(2)))),p=d.bitAnd((0,n.int)(3)),m=(0,n.select)(p.equal((0,n.int)(0)),f.x,(0,n.select)(p.equal((0,n.int)(1)),f.y,(0,n.select)(p.equal((0,n.int)(2)),f.z,f.w))).toVar();return(0,n.If)(m.greaterThanEqual((0,n.float)(0)),()=>{let e=(0,n.int)(m).toVar(),s=(0,n.float)(1).toVar(),f=(0,n.int)(0).toVar(),p=(0,n.int)(0).toVar(),h=(0,n.bool)(!1).toVar();(0,n.Loop)(Nv,()=>{let t=f.mul((0,n.int)(jv));(0,n.If)(a.element(t.add((0,n.int)(1))).w.greaterThan(.5),()=>{h.assign((0,n.bool)(!0)),(0,n.Break)()});let r=a.element(t.add((0,n.int)(2))),o=(0,n.int)(r.x),c=(0,n.int)(r.y),l=o.mul((0,n.int)(jv)),u=a.element(l),d=a.element(l.add((0,n.int)(1))),m=a.element(l.add((0,n.int)(3))),g=c.mul((0,n.int)(jv)),_=a.element(g),v=a.element(g.add((0,n.int)(1))),y=a.element(g.add((0,n.int)(3))),b=Iv(u.xyz,u.w,d.xyz,m.xyz,m.w,i),x=Iv(_.xyz,_.w,v.xyz,y.xyz,y.w,i),S=b.add(x),C=e.shiftRight(p).bitAnd((0,n.int)(1)).equal((0,n.int)(1));(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{(0,n.If)(C,()=>{s.assign((0,n.float)(0)),f.assign(c)}).Else(()=>{f.assign(o)})}).Else(()=>{let e=b.div(S);(0,n.If)(C,()=>{s.mulAssign((0,n.float)(1).sub(e)),f.assign(c)}).Else(()=>{s.mulAssign(e),f.assign(o)})}),p.addAssign((0,n.int)(1))}),(0,n.If)(h.and(s.greaterThan((0,n.float)(0))),()=>{let e=f.mul((0,n.int)(jv)),p=a.element(e),m=a.element(e.add((0,n.int)(2))),h=(0,n.int)(m.x),g=(0,n.int)(m.y),_=(0,n.max)(p.w,(0,n.float)(1e-10)),v=(0,n.float)(0).toVar(),y=(0,n.int)(-1).toVar();(0,n.Loop)({start:(0,n.int)(0),end:g},({i:e})=>{let t=h.add(e),r=a.element(o.add(t.mul((0,n.int)(Mv))));(0,n.If)((0,n.int)(r.r).equal(d),()=>{v.assign((0,n.max)(r.g,(0,n.float)(0))),y.assign((0,n.int)(r.a)),(0,n.Break)()})}),s.mulAssign(v.div(_));let b=wv.wrap(Tv(d,c,l,y));(0,n.If)(_v(b.v0,b.v1,b.v2,i),()=>{let e=gv(b.v0,b.v1,b.v2,i);u.assign(s.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(b.v1.sub(b.v0),b.v2.sub(b.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),(0,n.float)(.001)),a=hv(b.v0,b.v1,b.v2),o=t.mul(t),c=s.div((0,n.max)(a,(0,n.float)(1e-10)));u.assign(c.mul(o).div(i))})})}),(0,n.max)(u,Fi)}),zv=0x8ac7230489e80000,Bv=1e-4,Vv=1e-4,Hv=.001;function Uv(e){let{bvhBuffer:t,triangleBuffer:r,materialBuffer:i,envCDFTexture:a,lightBuffer:o,rayBufferRW:s,hitBufferRW:c,gBufferRW:l,counters:u,activeIndicesRO:d,envTexture:f,environmentIntensity:p,envMatrix:m,enableEnvironmentLight:h,groundProjectionEnabled:g,groundProjectionRadius:_,groundProjectionHeight:v,groundProjectionLevel:y,enableGroundCatcher:b,groundCatcherHeight:x,envTotalSum:S,envCompensationDelta:C,envResolution:w,directionalLightsBuffer:T,numDirectionalLights:E,areaLightsBuffer:D,numAreaLights:O,pointLightsBuffer:k,numPointLights:A,spotLightsBuffer:j,numSpotLights:M,maxBounceCount:N,maxSubsurfaceSteps:P,maxTransparentBounces:F,currentBounce:I,transparentBackground:L,backgroundIntensity:R,backgroundColor:ee,backgroundBlurriness:te,backgroundBlurSamples:ne,showBackground:re,globalIlluminationIntensity:z,cameraProjectionMatrix:ie,cameraViewMatrix:ae,fireflyThreshold:se,frame:ce,resolution:le,shadowTerminatorOffset:ue,accumFrame:de,chunkRowBase:fe,emissiveTriangleCount:pe,emissiveVec4Offset:me,emissiveTotalPower:ve,emissiveBoost:ye,enableEmissiveTriangleSampling:be,lightBVHNodeCount:xe,reverseMapVec4Offset:Se,maxRayCount:B,auxGBufferEnabled:V,hasSun:Ce,sunDirection:we,sunRadiance:Te,sunParams:H}=e,Ee=V.greaterThan((0,n.uint)(0)),De=o!==void 0,Oe=(e,t,r,i,a)=>{let o=(0,n.normalize)(e).toVar(),s=(0,n.max)(r,(0,n.int)(1)).toVar(),c=(0,n.vec3)(0).toVar();return(0,n.Loop)({start:(0,n.int)(0),end:s,type:`int`,condition:`<`},({i:e})=>{let r=ip(o,t,ge(a,(0,n.int)(0),(0,n.int)(oe).add(e),i,le,ce).toVar()).toVar();c.addAssign(P_({tex:f,samp:(0,n.sampler)(f),direction:r,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),c.div((0,n.float)(s))};return(0,n.Fn)(()=>{let e=n.instanceIndex;u&&(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(u.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(u.element((0,n.uint)($.ACTIVE_ENERGY)),(0,n.uint)(0))});let oe=u?(0,n.atomicLoad)(u.element((0,n.uint)($.ENTERING_COUNT))):B;(0,n.If)(e.greaterThanEqual(oe),()=>{(0,n.Return)()});let V=d.element(e),ke=wa(s,V).toVar();(0,n.If)(ke.bitAnd((0,n.uint)(zg.ACTIVE)).equal((0,n.uint)(0)),()=>{(0,n.Return)()});let Ae=ke.bitAnd((0,n.uint)(zg.REDIRECTED)).equal((0,n.uint)(0)).toVar(),je=Sa(s,V).toVar(),Me=Ca(s,V).toVar(),Ne=Ta(s,V).toVar(),Pe=Da(s,V).toVar(),Fe=V,Ie=Ja(c,V).toVar(),Le=(0,n.int)(le.x).toVar(),Re=(0,n.int)(Fe).add(fe.mul(Le)),ze=(0,n.vec2)((0,n.float)(Re.mod(Le)).add(.5),(0,n.float)(Re.div(Le)).add(.5)),Be=(0,n.int)(I).mul((0,n.int)(32)),Ve=ro(s,V).toVar(),He=Va(c,V).toVar(),Ue=Wa(c,V).toVar(),We=Ua(c,V).toVar(),Ge=Ga(c,V).toVar(),U=Ha(c,V).toVar(),Ke=Ka(c,V).toVar(),qe=ao(s,V).toVar(),Je=(0,n.int)(I).toVar(),Xe=oo(s,V).toVar(),Ze=so(s,V).toVar();(0,n.If)(Ee.and(qe.equal(1)),()=>{let e=ae.mul((0,n.vec4)(je,1)).z.abs().mul(Ye).add(3);Aa(l,Fe,Ia(s,V).add((0,n.min)(He,(0,n.float)(1e6))).div((0,n.max)(e,(0,n.float)(1e-4))).clamp(0,1))}),(0,n.If)(b.and(Je.equal(0)),()=>{let e=Me.y.toVar();(0,n.If)(e.abs().greaterThan((0,n.float)(Mi)),()=>{let o=x.sub(je.y).div(e).toVar();(0,n.If)(o.greaterThan((0,n.float)(Bv)).and(o.lessThan(He)),()=>{let e=je.add(Me.mul(o)).toVar(),u=(0,n.vec3)(0,1,0),d=Me.negate().toVar(),b=fi.wrap(ia()).toVar(),x=Fd(u,ge(ze,(0,n.int)(0),Be.add((0,n.int)(7)),Ie,le,ce).toVar()).toVar(),N=x.y.mul(Ai).toVar(),P=(0,n.vec3)(Ai),F=hi.wrap($_(e,u,u,b,d,x,N,P,Je,Ie,ze,le,ce,Be,T,E,D,O,k,A,j,M,t,r,i,f,p,m,a,S,C,w,h,(0,n.bool)(!0),(0,n.vec3)(0),u,(0,n.float)(0),Ce,we,Te,H)).toVar(),I=(0,n.max)((0,n.dot)(F.shadowed,Ii),(0,n.float)(0)),z=(0,n.max)((0,n.dot)(F.unoccluded,Ii),(0,n.float)(0)).toVar(),oe=(0,n.clamp)(I.div((0,n.max)(z,(0,n.float)(Vv))),0,1).toVar();(0,n.If)(z.lessThan((0,n.float)(Hv)),()=>{oe.assign(1)});let se=I_(je,Me,g,_,v,y).toVar(),ue=(0,n.vec3)(0).toVar();(0,n.If)(re,()=>{(0,n.If)(te.greaterThan(0),()=>{ue.assign(Oe(se,te.mul(1.3),ne,Ie,ze))}).Else(()=>{ue.assign(P_({tex:f,samp:(0,n.sampler)(f),direction:se,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)})});let de=(0,n.select)(re,ue.mul(R),ee),fe=(0,n.select)(L,(0,n.vec3)(0),de.mul(oe)),pe=(0,n.select)(L,(0,n.float)(1).sub(oe),(0,n.float)(1));(0,n.If)(Ee,()=>{ka(l,Fe,u,rv({worldPos:e,cameraProjectionMatrix:ie,cameraViewMatrix:ae}),(0,n.vec3)(1))}),Ba(s,V,(0,n.vec4)(fe,pe)),Ra(s,V,Me,ke.bitOr((0,n.uint)(zg.AUX_LOCKED)).bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,V,Ie),(0,n.Return)()})})}),(0,n.If)(He.greaterThan(zv),()=>{let e=Ae.and(re),t=Ae.not().and(h),r=(0,n.vec3)(0).toVar();(0,n.If)(e.or(t),()=>{let e=Me.toVar();(0,n.If)(Ae,()=>{e.assign(I_(je,Me,g,_,v,y))});let t=(0,n.vec3)(0).toVar();(0,n.If)(Ae.and(te.greaterThan(0)),()=>{t.assign(Oe(e,te.mul(1.3),ne,Ie,ze))}).Else(()=>{t.assign(P_({tex:f,samp:(0,n.sampler)(f),direction:e,environmentMatrix:m,environmentIntensity:p,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),r.assign((0,n.clamp)(t,(0,n.vec3)(0),(0,n.vec3)(1)));let i=(0,n.float)(1).toVar();(0,n.If)(Ae.not(),()=>{let e=Ea(s,V);(0,n.If)(e.greaterThan(0),()=>{let t=M_(f,Me,m,S,C,w).w;(0,n.If)(t.greaterThan(0),()=>{i.assign(Gi({pdf1:e,pdf2:t}))})})});let a=(0,n.select)(Ae.not(),z,(0,n.float)(1)),o=(0,n.select)(Ae,R,i.mul(a)),c=(0,n.select)(Ae,(0,n.float)(0),(0,n.float)(Je));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(t).mul(o),c,se,(0,n.int)(de))),Pe.w)),(0,n.If)(Ce,()=>{let t=(0,n.vec3)(0).toVar();(0,n.If)(Ae.and(te.greaterThan(0)),()=>{let r=te.mul(1.3).toVar(),i=(0,n.acos)((0,n.clamp)((0,n.dot)((0,n.normalize)(e),we),-1,1));(0,n.If)(i.lessThan(r),()=>{let e=(0,n.float)(1).sub(i.div(r).pow(2)).pow(2);t.assign(Te.mul(p).mul(H.y).mul(e).mul(3/Math.PI).div(r.mul(r)))})}).Else(()=>{t.assign(V_((0,n.normalize)(e),we,Te,H).mul(p))}),(0,n.If)(t.x.add(t.y).add(t.z).greaterThan(0),()=>{let e=(0,n.float)(1).toVar();(0,n.If)(Ae.not().and(ke.bitAnd((0,n.uint)(zg.SUN_NEE)).notEqual((0,n.uint)(0))),()=>{e.assign(Wi({pdf1:Ea(s,V),pdf2:(0,n.float)(1).div(H.y)}))});let r=(0,n.max)(Je.sub(1),(0,n.int)(0)),i=(0,n.select)(Ae,R,e.mul((0,n.select)(r.greaterThan((0,n.int)(0)),z,(0,n.float)(1))));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(t).mul(i),(0,n.select)(Ae,(0,n.float)(0),(0,n.float)(r)),se,(0,n.int)(de))),Pe.w))})})}),(0,n.If)(Ae.and(re.not()).and(L.not()),()=>{Pe.assign((0,n.vec4)(Pe.xyz.add(Ne.mul(ee)),Pe.w))}),(0,n.If)(ke.bitAnd((0,n.uint)(zg.HAS_HIT_OPAQUE)).equal((0,n.uint)(0)),()=>{Pe.w.assign(0)}),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))).and(ke.bitAnd((0,n.uint)(zg.REDIRECTED)).notEqual((0,n.uint)(0))),()=>{let e=ja(l,Fe);ka(l,Fe,(0,n.normalize)(Me),Na(e).w,(0,n.clamp)(r.mul(Ve),(0,n.vec3)(0),(0,n.vec3)(1)))}),Ba(s,V,Pe),Ra(s,V,Me,ke.bitAnd((0,n.uint)(~zg.ACTIVE))),(0,n.Return)()});let W=je.add(Me.mul(He)).toVar(),Qe=(0,n.normalize)(Ue).toVar(),$e=Za(s,V),et=(0,n.int)($e.stackDepth).toVar(),tt=$e.ior1.toVar(),nt=$e.ior2.toVar(),rt=$e.ior3.toVar(),it=(0,n.int)($e.transTraversals).toVar(),at=(0,n.float)($e.wavelength).toVar();(0,n.If)(et.greaterThan(0),()=>{let e=$a(s,V).toVar(),t=co(s,V),r=t.sigmaS.toVar(),i=t.g.toVar();(0,n.If)((0,n.max)((0,n.max)(r.x,r.y),r.z).lessThanEqual(0),()=>{let t=(0,n.exp)(e.mul(He).negate()).toVar();Ne.mulAssign(t),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{Ve.mulAssign(t)})}).Else(()=>{let t=e.add(r),a=Rd.wrap(Hd(t,r,Ne,He,Ie,ze,le,ce,Be)).toVar();Ne.mulAssign(a.weight),(0,n.If)(a.didScatter,()=>{let e=ge(ze,(0,n.int)(0),Be.add((0,n.int)(6)),Ie,le,ce),t=je.add(Me.mul(a.t)),r=Vd(Me,i,e).toVar();Xe.addAssign(1);let o=(0,n.clamp)((0,n.max)((0,n.max)(Ne.x,Ne.y),Ne.z),.02,1).toVar();(0,n.If)(Xe.greaterThanEqual(P).or(_e(ze,(0,n.int)(0),Be.add((0,n.int)(12)),Ie,le,ce).greaterThan(o)).toVar(),()=>{Ba(s,V,Pe),Ra(s,V,Me,ke.bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,V,Ie),(0,n.Return)()}),Ne.divAssign(o),ke.assign(ke.bitOr((0,n.uint)(zg.REDIRECTED))),La(s,V,t,qe,Xe,Ze),Ra(s,V,r,ke),za(s,V,Ne,Ea(s,V)),Ba(s,V,Pe),Ya(c,V,Ie),(0,n.Return)()})})});let G=fi.wrap(ra((0,n.int)(Ge),i)).toVar(),ot=We.toVar(),st=Qe.toVar();(0,n.If)(G.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(G.displacementScale.greaterThan(0)),()=>{let e=di({origin:je,direction:Me}),i=gi({didHit:!0,dst:He,hitPoint:W,normal:Qe,uv:We,materialIndex:(0,n.int)(Ge),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(U),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),a=uv.wrap(dv(e,i,r,G,Je,t,Ke)).toVar();ot.assign(a.uv),st.assign(a.normal),W.assign(a.hitPoint)});let ct=(0,n.vec4)(0).toVar();(0,n.If)(G.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{ct.assign(Cf(r,(0,n.int)(U),Qe,G.normalTransform,t,Ke))});let lt=Ci.wrap(kf(G,ot,Qe,ct)).toVar(),ut=lt.roughness.toVar();G.color.assign(lt.albedo),G.metalness.assign(lt.metalness.clamp(0,1)),G.roughness.assign(lt.roughness.clamp(.05,1)),G.sheenRoughness.assign(G.sheenRoughness.clamp(.05,1));let dt=gf({uv:ot,transform:G.albedoTransform}).toVar();(0,n.If)(G.anisotropyMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let e=Ef(G,dt).toVar();G.anisotropy.assign(e.x),G.anisotropyRotation.assign(e.y)});let K=pi.wrap(Df(G,dt)).toVar();G.transmission.assign(K.transmission),G.clearcoat.assign(K.clearcoat),G.clearcoatRoughness.assign(K.clearcoatRoughness),G.sheenColor.assign(K.sheenColor),G.sheenRoughness.assign(K.sheenRoughness),G.iridescence.assign(K.iridescence),G.iridescenceThicknessRange.assign((0,n.vec2)(G.iridescenceThicknessRange.x,K.iridescenceThickness)),G.specularIntensity.assign(K.specularIntensity),G.specularColor.assign(K.specularColor);let ft=lt.albedo.toVar();(0,n.If)(G.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(G.displacementScale.greaterThan(0)),()=>{Qe.assign((0,n.normalize)(st.add(lt.normal.sub((0,n.normalize)(Ue)))))}).Else(()=>{Qe.assign(lt.normal)});let q=G.metalness.toVar(),pt=G.transmission.toVar(),mt=(0,n.smoothstep)((0,n.float)(0),(0,n.float)(.15),ut).toVar(),ht=(0,n.clamp)((0,n.float)(1).sub(q).mul((0,n.float)(1).sub(pt)).add(mt.mul(q.mul((0,n.float)(1).sub(pt)).add(pt))),0,1).greaterThanEqual((0,n.float)(.25)).toVar(),gt=Ve.toVar(),_t=e=>{(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let t=Na(ja(l,Fe)).w;ka(l,Fe,e,t,(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1)))})},vt=()=>{Ba(s,V,Pe),Ra(s,V,Me,ke.bitAnd((0,n.uint)(~zg.ACTIVE))),Ya(c,V,Ie)};(0,n.If)(Je.equal(0).and(Ee),()=>{let e=rv({worldPos:W,cameraProjectionMatrix:ie,cameraViewMatrix:ae});ka(l,Fe,(0,n.vec3)(0,0,1),e,(0,n.vec3)(0))});let yt=(0,n.float)(1).toVar(),bt=(0,n.float)(1).toVar();(0,n.If)(et.equal(1),()=>{yt.assign(tt)}).ElseIf(et.equal(2),()=>{yt.assign(nt),bt.assign(tt)}).ElseIf(et.equal(3),()=>{yt.assign(rt),bt.assign(nt)});let xt=di({origin:je,direction:Me}),St=Kd.wrap(nf(xt,Qe,G,Ie,ze,le,ce,Be,(0,n.int)(it),yt,bt,at)).toVar();at.assign(St.pathWavelength),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Na(ja(l,Fe)).w,t=(0,n.select)((0,n.dot)(Qe,Me.negate()).lessThan(0),Qe.negate(),Qe).toVar(),r=(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1)).toVar();(0,n.If)(G.alphaMode.equal((0,n.int)(2)),()=>{ka(l,Fe,t,e,r),ke.assign(ke.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).ElseIf(St.isAlphaSkip,()=>{}).ElseIf(St.isSubsurface,()=>{ka(l,Fe,t,e,r),ke.assign(ke.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).ElseIf(St.isTransmissive,()=>{(0,n.If)(ht.or(G.dispersion.greaterThan(0)),()=>{ka(l,Fe,t,e,r),ke.assign(ke.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).Else(()=>{Ve.mulAssign((0,n.clamp)(ft,(0,n.vec3)(0),(0,n.vec3)(1)))})})}),(0,n.If)(St.continueRay,()=>{(0,n.If)(St.isTransmissive.and(St.didReflect.not()),()=>{(0,n.If)(St.entering,()=>{(0,n.If)(et.lessThan(3),()=>{et.addAssign(1),(0,n.If)(et.equal(1),()=>{tt.assign(G.ior)}),(0,n.If)(et.equal(2),()=>{nt.assign(G.ior)}),(0,n.If)(et.equal(3),()=>{rt.assign(G.ior)}),eo(s,V,(0,n.select)(G.attenuationDistance.greaterThan(0),(0,n.log)((0,n.max)(G.attenuationColor,(0,n.vec3)(.001))).negate().div(G.attenuationDistance),(0,n.vec3)(0))),lo(s,V,(0,n.vec3)(0),(0,n.float)(0))})}).Else(()=>{(0,n.If)(et.greaterThan(0),()=>{et.subAssign(1)})})}),(0,n.If)(St.isSubsurface.and(St.didReflect.not()),()=>{(0,n.If)(St.entering,()=>{(0,n.If)(et.lessThan(3),()=>{et.addAssign(1),(0,n.If)(et.equal(1),()=>{tt.assign(G.ior)}),(0,n.If)(et.equal(2),()=>{nt.assign(G.ior)}),(0,n.If)(et.equal(3),()=>{rt.assign(G.ior)});let e=zd.wrap(Ud(G.subsurfaceColor,G.subsurfaceRadius,G.subsurfaceRadiusScale)).toVar();eo(s,V,e.sigmaT.sub(e.sigmaS)),lo(s,V,e.sigmaS,(0,n.clamp)(G.subsurfaceAnisotropy,-.99,.99))})}).Else(()=>{(0,n.If)(et.greaterThan(0),()=>{et.subAssign(1)})})}),(0,n.If)(St.isTransmissive.and(it.greaterThan(0)),()=>{it.subAssign(1)}),Ne.mulAssign(St.throughput);let e=O_(qa(c,V)).faceN,t=Di(W,(0,n.select)((0,n.dot)(e,St.direction).lessThan(0),e.negate(),e));(0,n.If)(St.isAlphaSkip.not(),()=>{ke.assign(ke.bitOr((0,n.uint)(zg.REDIRECTED)))}).Else(()=>{Ze.addAssign(1),(0,n.If)(Ze.greaterThan(F),()=>{_t((0,n.select)((0,n.dot)(Qe,Me.negate()).lessThan(0),Qe.negate(),Qe)),vt(),(0,n.Return)()})}),La(s,V,t,qe,Xe,Ze,(0,n.select)(St.isAlphaSkip,Ia(s,V).add(He),(0,n.float)(0))),Ra(s,V,St.direction,ke),za(s,V,Ne,Ea(s,V)),Ba(s,V,Pe),Qa(s,V,(0,n.uint)(et),(0,n.uint)(it),tt,nt,rt,(0,n.uint)(at.add(.5))),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{io(s,V,Ve)}),Ya(c,V,Ie),(0,n.Return)()}),ke.assign(ke.bitOr((0,n.uint)(zg.HAS_HIT_OPAQUE|zg.REDIRECTED)));let Ct=lt.emissive.toVar();(0,n.If)((0,n.length)(Ct).greaterThan(0),()=>{let e=(0,n.select)(Ae.not(),z,(0,n.float)(1)),a=(0,n.float)(1).toVar();De&&(0,n.If)(be.equal((0,n.int)(1)).and(pe.greaterThan((0,n.int)(0))).and(Je.greaterThan(0)),()=>{let e=Ea(s,V);(0,n.If)(e.greaterThan(0),()=>{let c=Ia(s,V).toVar(),l=je.sub(Me.mul(c)).toVar(),u=He.add(c).toVar(),d=(0,n.float)(0).toVar();(0,n.If)(xe.greaterThan((0,n.int)(0)),()=>{d.assign(Rv((0,n.int)(U),u,Me,l,o,me,Se,r,t))}).Else(()=>{d.assign(Ev((0,n.int)(U),u,Me,l,r,i,ve,t,Ke))}),a.assign(Wi({pdf1:e,pdf2:d}))})}),Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ct.mul(Ne).mul(e).mul(a),(0,n.float)(Je),se,(0,n.int)(de))),Pe.w))});let wt=Me.negate().toVar(),Tt=(0,n.normalize)(Ue),Et=(0,n.select)((0,n.dot)(Tt,wt).lessThan(0),Tt.negate(),Tt).toVar(),Dt=O_(qa(c,V)),Ot=Dt.faceN.toVar(),kt=Tt.mul(Dt.liftScale),At=e=>w_({hitPoint:W,offsetNormal:Ot,lift:kt,faceN:Ot,smoothN:Et,L:e,cutoff:ue});(0,n.If)((0,n.dot)(Tt,wt).lessThan(0),()=>{Qe.assign(Qe.negate())}),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Na(ja(l,Fe)).w;(0,n.If)(ht,()=>{ka(l,Fe,Qe,e,(0,n.clamp)(ft.mul(gt),(0,n.vec3)(0),(0,n.vec3)(1))),ke.assign(ke.bitOr((0,n.uint)(zg.AUX_LOCKED)))}).Else(()=>{let e=(0,n.max)((0,n.dot)(Qe,wt),(0,n.float)(.001)),t=Si.wrap(bd(G,ft));Ve.mulAssign(xi.wrap(yd(t.f0,t.f90,t.eta,t.F0m,G.metalness,(0,n.vec3)(0),(0,n.float)(0),t.F0,e,(0,n.max)(ut,(0,n.float)(.02)))).E_total)})});let jt=wi.wrap(Qi(G.metalness,G.roughness,G.transmission,G.clearcoat,G.emissive,G.subsurface)).toVar(),Mt=he(ze,(0,n.int)(0),Je,Ie,(0,n.int)(-1),le,ce).toVar(),Nt=_e(ze,(0,n.int)(0),Be.add((0,n.int)(2)),Ie,le,ce).toVar(),Pt=vi({specular:(0,n.float)(0),diffuse:(0,n.float)(0),sheen:(0,n.float)(0),clearcoat:(0,n.float)(0),transmission:(0,n.float)(0),iridescence:(0,n.float)(0)}),Ft=Ei({invRoughness:(0,n.float)(0),metalFactor:(0,n.float)(.5),iorFactor:(0,n.float)(.67),maxSheenColor:(0,n.float)(0)}),It=(0,n.vec3)(0).toVar(),Lt=(0,n.vec3)(0).toVar(),Rt=(0,n.float)(0).toVar(),zt=(0,n.bool)(!1).toVar(),Bt=(0,n.vec3)(1).toVar();(0,n.If)(G.clearcoat.greaterThan(0),()=>{let e=di({origin:je,direction:Me}),t=gi({didHit:!0,dst:He,hitPoint:W,normal:Qe,uv:We,materialIndex:(0,n.int)(Ge),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(0),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),r=av.wrap(ov(e,t,G,Mt,Ie,ze,le,ce,Be));It.assign(r.L),Lt.assign(r.brdf),Rt.assign(r.pdf)}).Else(()=>{let e=_i.wrap(tv(wt,Qe,G,Mt,Nt,Ie,ze,le,ce,Be,jt,!1,Pt,!1,Ft));It.assign(e.direction),Lt.assign(e.value),Rt.assign(e.pdf),zt.assign(e.isTransmission),Bt.assign(e.colorWeight)});let Vt=hi.wrap($_(W,Qe,Et,G,wt,It,Rt,Lt,Je,Ie,ze,le,ce,Be,T,E,D,O,k,A,j,M,t,r,i,f,p,m,a,S,C,w,h,(0,n.bool)(!1),kt,Ot,ue,Ce,we,Te,H)).shadowed.toVar(),Ht=(0,n.select)(Je.greaterThan(0),z,(0,n.float)(1));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(Ne.mul(Vt).mul(Ht),(0,n.float)(Je),se,(0,n.int)(de))),Pe.w)),De&&(0,n.If)(be.equal((0,n.int)(1)).and(pe.greaterThan((0,n.int)(0))),()=>{let e=(0,n.Fn)(([e,n,a])=>Nf(e,n,a,S_,t,r,i));(0,n.If)(xe.greaterThan((0,n.int)(0)),()=>{let i=fv.wrap(Lv(W,Qe,Ie,ze,le,ce,Be,o,o,me,r,t));(0,n.If)(i.valid.and(i.pdf.greaterThan(0)),()=>{let t=(0,n.max)((0,n.float)(0),(0,n.dot)(Qe,i.direction));(0,n.If)(t.greaterThan(0).and((0,n.dot)(i.direction,Et).greaterThan(0)),()=>{let r=At(i.direction).toVar(),a=i.position.sub(r).toVar(),o=(0,n.length)(a).toVar(),s=e(r,a.div(o),o.mul(Oi));(0,n.If)(s.greaterThan(0),()=>{let e=R_(wt,i.direction,Qe,G),r=Q_(wt,i.direction,Qe,G),a=(0,n.select)(r.greaterThan(0),Wi({pdf1:i.pdf,pdf2:r}),(0,n.float)(1)),o=i.emission.mul(e).mul(t).div(i.pdf).mul(s).mul(ye).mul(a);Pe.assign((0,n.vec4)(Pe.xyz.add(nv(o.mul(Ne).mul(Ht),(0,n.float)(Je),se,(0,n.int)(de))),Pe.w))})})})}).Else(()=>{let i=Av(W,Qe,Et,wt,G,Je,Ie,ze,le,ce,Be,ye,o,me,pe,ve,r,t,e,(0,n.Fn)(([e,,t])=>At(t).sub(e)));Pe.assign((0,n.vec4)(Pe.xyz.add(nv(i.mul(Ne).mul(Ht),(0,n.float)(Je),se,(0,n.int)(de))),Pe.w))})});let Ut=Uf.wrap(ev(Qe,G,It,Rt,Lt,zt,Bt,Ie,ze,le,ce,Be)).toVar(),Wt=Ut.direction.toVar();(0,n.If)(zt.not().and((0,n.dot)(Wt,Et).lessThanEqual(0)),()=>{_t(Qe),vt(),(0,n.Return)()});let Gt=(0,n.max)(Ut.combinedPdf,.001).toVar();Ne.mulAssign(Ut.throughput);let Kt=iv(Je,Ne,jt,Wt,Ie,ze,le,ce,Be,h).toVar();(0,n.If)(Kt.lessThanEqual(0),()=>{_t(Qe),vt(),(0,n.Return)()}),Ne.divAssign(Kt),(0,n.If)(qe.greaterThanEqual(N),()=>{_t(Qe),vt(),(0,n.Return)()});let qt=Di(W,(0,n.select)((0,n.dot)(Ot,Wt).lessThan(0),Ot.negate(),Ot)),Jt=zt.not().and((0,n.dot)(Qe,Wt).greaterThan(0));ke.assign(ke.sub(ke.bitAnd((0,n.uint)(zg.SUN_NEE))).bitOr((0,n.select)(Jt,(0,n.uint)(zg.SUN_NEE),(0,n.uint)(0)))),La(s,V,qt,qe.add(1),Xe,Ze),Ra(s,V,Wt,ke),za(s,V,Ne,Gt),Ba(s,V,Pe),Qa(s,V,(0,n.uint)(et),(0,n.uint)(it),tt,nt,rt,(0,n.uint)(at.add(.5))),(0,n.If)(Ee.and(ke.bitAnd((0,n.uint)(zg.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{io(s,V,Ve)}),Ya(c,V,Ie)})}var Wv=(e,t)=>{let r=Ta(e,t);return(0,n.min)((0,n.uint)((0,n.max)((0,n.max)(r.x,r.y),r.z).max(0).mul(64).add(.5)),(0,n.uint)(Rg))};function Gv(e){let{rayBufferRO:t,activeIndicesReadRO:r,activeIndicesWriteRW:i,counters:a,currentActiveCount:o}=e;return(0,n.Fn)(()=>{let e=n.instanceIndex,s=a?(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))):o;(0,n.If)(e.greaterThanEqual(s),()=>{(0,n.Return)()});let c=r.element(e);(0,n.If)(wa(t,c).bitAnd((0,n.uint)(zg.ACTIVE)).notEqual((0,n.uint)(0)),()=>{let e=(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(1));i.element(e).assign(c),(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_ENERGY)),Wv(t,c))})})}function Kv(e){let{rayBufferRO:t,activeIndicesReadRO:r,activeIndicesWriteRW:i,counters:a,currentActiveCount:o}=e;return(0,n.Fn)(()=>{let e=n.instanceIndex,s=a?(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))):o,c=e.lessThan(s),l=r.element(e),u=wa(t,l),d=c.and(u.bitAnd((0,n.uint)(zg.ACTIVE)).notEqual((0,n.uint)(0))),f=(0,n.select)(d,(0,n.uint)(1),(0,n.uint)(0)),p=(0,n.select)(d,Wv(t,l),(0,n.uint)(0)),m=(0,n.subgroupExclusiveAdd)(f).toVar(),h=(0,n.subgroupAdd)(f).toVar(),g=(0,n.subgroupAdd)(p).toVar(),_=(0,n.subgroupExclusiveAdd)((0,n.uint)(1)).toVar(),v=(0,n.uint)(0).toVar();(0,n.If)(_.equal((0,n.uint)(0)),()=>{v.assign((0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_RAY_COUNT)),h)),(0,n.atomicAdd)(a.element((0,n.uint)($.ACTIVE_ENERGY)),g)});let y=(0,n.subgroupBroadcast)(v,(0,n.uint)(0)).toVar();(0,n.If)(d,()=>{i.element(y.add(m)).assign(l)})})}var qv=(0,n.wgslFn)(`
|
|
875
875
|
fn nanInfToRed( c: vec3f ) -> vec3f {
|
|
876
876
|
let isNan = c.x != c.x || c.y != c.y || c.z != c.z;
|
|
877
877
|
let isInf = abs( c.x ) > 1e30f || abs( c.y ) > 1e30f || abs( c.z ) > 1e30f;
|
|
878
878
|
if ( isNan || isInf ) { return vec3f( 1.0f, 0.0f, 0.0f ); }
|
|
879
879
|
return vec3f( 0.0f );
|
|
880
880
|
}
|
|
881
|
-
`);function Jv(e){let{rayBufferRO:t,gBufferRO:r,writeColorTex:i,writeNDTex:a,writeAlbedoTex:o,resolution:s,frame:c,enableAccumulation:l,hasPreviousAccumulated:u,accumulationAlpha:d,cameraIsMoving:f,hasPreviousAux:p,auxAccumulationAlpha:m,transparentBackground:h,prevAccumTexture:g,prevAlbedoTexture:_,prevNormalDepthTexture:v,renderWidth:y,chunkRowBase:b,chunkRows:x,visMode:S,auxGBufferEnabled:C,cleanAuxNormalEnabled:w,m2BufferRW:T,useAdaptiveSampling:E,noiseThreshold:D,adaptiveMinSamples:O,usePixelFreeze:k,pixelFreezeThreshold:A,streakBufferRW:j,frozenMaskRO:M,convergenceOverlay:N}=e,P=C.greaterThan((0,n.uint)(0)),F=w.greaterThan((0,n.uint)(0)),I=E.greaterThan((0,n.int)(0)),L=k.greaterThan((0,n.int)(0)),
|
|
881
|
+
`);function Jv(e){let{rayBufferRO:t,gBufferRO:r,writeColorTex:i,writeNDTex:a,writeAlbedoTex:o,resolution:s,frame:c,enableAccumulation:l,hasPreviousAccumulated:u,accumulationAlpha:d,cameraIsMoving:f,hasPreviousAux:p,auxAccumulationAlpha:m,transparentBackground:h,prevAccumTexture:g,prevAlbedoTexture:_,prevNormalDepthTexture:v,renderWidth:y,chunkRowBase:b,chunkRows:x,visMode:S,auxGBufferEnabled:C,cleanAuxNormalEnabled:w,m2BufferRW:T,useAdaptiveSampling:E,noiseThreshold:D,adaptiveMinSamples:O,usePixelFreeze:k,pixelFreezeThreshold:A,streakBufferRW:j,frozenMaskRO:M,convergenceOverlay:N}=e,P=C.greaterThan((0,n.uint)(0)),F=w.greaterThan((0,n.uint)(0)),I=E.greaterThan((0,n.int)(0)),L=k.greaterThan((0,n.int)(0)),R=I.or(L).or(N.greaterThan((0,n.int)(0)));return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(y).and(C.lessThan(x)),()=>{let x=C.add(b),w=(0,n.uint)(C.mul(y).add(e)),E=(0,n.uint)(x.mul(y).add(e)),k=Da(t,w),N=k.xyz.toVar(),ee=(0,n.select)(h,k.w,(0,n.float)(1)).toVar(),te=L.and(c.greaterThan((0,n.uint)(0))).and(M.element(E).equal((0,n.uint)(1))).toVar(),ne=(0,n.vec4)(0).toVar(),re=(0,n.vec4)(0).xyz.toVar(),z=(0,n.float)(0).toVar();(0,n.If)(P,()=>{let e=ja(r,w);ne.assign(Na(e)),re.assign((0,n.vec4)(Pa(e),0).xyz),z.assign(Ma(e))});let ie=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(x).add(.5)).div(s);(0,n.If)(l.and(f.not()).and(c.greaterThan((0,n.uint)(0))).and(u).and(S.notEqual((0,n.int)(11))),()=>{let e=(0,n.texture)(g,ie,0).toVar();N.assign((0,n.select)(te,e.xyz,(0,n.mix)(e.xyz,k.xyz,d))),(0,n.If)(P.and(p),()=>{let e=(0,n.texture)(_,ie,0).toVar();re.assign((0,n.mix)(e.xyz,re,m)),z.assign((0,n.mix)(e.w,z,m)),(0,n.If)(F,()=>{let e=(0,n.texture)(v,ie,0).xyz.mul(2).sub(1),t=ne.xyz.mul(2).sub(1).toVar(),r=(0,n.mix)(e,t,m).toVar(),i=(0,n.length)(r),a=(0,n.select)(i.greaterThan(1e-4),r.div(i),t);ne.assign((0,n.vec4)(a.mul(.5).add(.5),ne.w))})}),(0,n.If)(h,()=>{ee.assign((0,n.select)(te,e.w,(0,n.mix)(e.w,k.w,d)))})}),(0,n.If)(R,()=>{let e=Ui(k.xyz),t=T.element(E).toVar(),r=(0,n.select)(te,t,(0,n.mix)(t,e.mul(e),d)).toVar();T.element(E).assign(r);let i=Ui(N).toVar(),a=r.sub(i.mul(i)).max((0,n.float)(0)).div((0,n.float)(c).add(1)).sqrt().toVar(),o=a.div(i.add((0,n.float)(1e-4))),s=(0,n.select)(i.lessThan((0,n.float)(1)),i.sqrt(),i),l=a.div(s.add((0,n.float)(1e-4))).lessThan(D);(0,n.If)(I.or(L),()=>{let e=I.and(c.greaterThanEqual((0,n.uint)(O))).and(l),t=j.element(E).toVar(),r=t.bitAnd((0,n.uint)(1073741823)).toVar(),a=r.toVar(),s=k.w.greaterThan((0,n.float)(.5)),u=t.bitAnd((0,n.uint)(1073741824)).notEqual((0,n.uint)(0)),d=(0,n.select)(c.equal((0,n.uint)(0)),(0,n.select)(s,(0,n.uint)(1073741824),(0,n.uint)(0)),(0,n.select)(s.or(u),(0,n.uint)(1073741824),(0,n.uint)(0))).toVar();(0,n.If)(L,()=>{(0,n.If)(c.equal((0,n.uint)(0)),()=>{a.assign((0,n.uint)(0))}),(0,n.If)(te.not().and(c.greaterThan((0,n.uint)(0))),()=>{let e=c.greaterThanEqual((0,n.uint)(O)).and(o.lessThan(A)).and(i.greaterThan((0,n.float)(0)));a.assign((0,n.select)(e,r.add((0,n.uint)(1)),(0,n.uint)(0)))})}),j.element(E).assign(a.bitOr((0,n.select)(e,(0,n.uint)(2147483648),(0,n.uint)(0))).bitOr(d))})}),(0,n.If)(S.equal((0,n.int)(11)),()=>{N.assign(qv(N))});let ae=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(x));(0,n.textureStore)(i,ae,(0,n.vec4)(N,ee)).toWriteOnly(),(0,n.If)(P,()=>{(0,n.textureStore)(a,ae,ne).toWriteOnly(),(0,n.textureStore)(o,ae,(0,n.vec4)(re,z)).toWriteOnly()})})})}var Yv=(0,n.wgslFn)(`
|
|
882
882
|
fn visualizeDepth( depth: f32 ) -> vec3f {
|
|
883
883
|
return vec3f( 1.0f - depth );
|
|
884
884
|
}
|
|
@@ -892,7 +892,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
892
892
|
let ndcDepth = clipPos.z / clipPos.w * 0.5f + 0.5f;
|
|
893
893
|
return clamp( ndcDepth, 0.0f, 1.0f );
|
|
894
894
|
}
|
|
895
|
-
`),Qv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g])=>{let _=(0,n.vec4)(1,0,1,1).toVar(),v=di({origin:e,direction:t}),y=gi.wrap(x_(v,r,i).toVar());return(0,n.If)(u.equal((0,n.int)(7)),()=>{let e=(0,n.float)(y.triTests).div(d);_.assign((0,n.select)(e.lessThan(1),(0,n.vec4)((0,n.vec3)(e),1),(0,n.vec4)(1,0,0,1)))}),(0,n.If)(u.equal((0,n.int)(8)),()=>{let e=(0,n.float)(y.boxTests).div(d);_.assign((0,n.select)(e.lessThan(1),(0,n.vec4)((0,n.vec3)(e),1),(0,n.vec4)(1,0,0,1)))}),(0,n.If)(u.equal((0,n.int)(10)),()=>{(0,n.If)(l,()=>{let e=P_({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).toVar(),r=(0,n.dot)(e.xyz,Ii).toVar(),i=r,a=(0,n.max)(d.mul(.1),.001),u=r.div(a),m=(0,n.log)(r.add(1e-6)).add(10).div(10),h=(0,n.select)(d.greaterThan(1),u,m).toVar(),g=(0,n.vec3)(0).toVar();(0,n.If)(h.lessThan(.2),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,0),(0,n.vec3)(0,0,.5),h.mul(5)))}).ElseIf(h.lessThan(.4),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,.5),(0,n.vec3)(0,0,1),h.sub(.2).mul(5)))}).ElseIf(h.lessThan(.6),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,1),(0,n.vec3)(0,1,0),h.sub(.4).mul(5)))}).ElseIf(h.lessThan(.8),()=>{g.assign((0,n.mix)((0,n.vec3)(0,1,0),(0,n.vec3)(1,1,0),h.sub(.6).mul(5)))}).ElseIf(h.lessThan(1),()=>{g.assign((0,n.mix)((0,n.vec3)(1,1,0),(0,n.vec3)(1,0,0),h.sub(.8).mul(5)))}).Else(()=>{g.assign((0,n.mix)((0,n.vec3)(1,0,0),(0,n.vec3)(1,1,1),(0,n.min)(h.sub(1),1)))});let v=f.div(p);(0,n.If)(v.x.lessThan(.1).and(v.y.lessThan(.1)),()=>{let e=i.mul(1);g.assign((0,n.vec3)(e))}).ElseIf(v.x.greaterThan(.9).and(v.y.lessThan(.1)),()=>{g.assign(e.xyz.mul(1))}),_.assign((0,n.vec4)(g,1))}).Else(()=>{_.assign((0,n.vec4)(1,0,1,1))})}),(0,n.If)(u.equal((0,n.int)(4)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let t=fi.wrap(ra(y.materialIndex,a)).toVar(),r=Ci.wrap(kf(t,y.uv,y.normal,(0,n.vec4)(0))).toVar().emissive.toVar(),i=(0,n.length)(r).toVar();(0,n.If)(i.greaterThan(0),()=>{let t=r.div((0,n.max)(i.mul(.1),.001)).toVar(),a=(0,n.length)(e.sub(y.hitPoint)),o=(0,n.clamp)((0,n.float)(1).sub(a.div(10)),0,1),s=(0,n.mix)(t,t.mul((0,n.vec3)(1,.8,.6)),o.mul(.3));_.assign((0,n.vec4)(s,1))}).Else(()=>{_.assign((0,n.vec4)(0,0,.1,1))})})}),(0,n.If)(u.equal((0,n.int)(1)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(.5,.5,1,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=(0,n.normalize)(Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().normal);_.assign((0,n.vec4)(Xv({normal:t}),1))})}),(0,n.If)(u.equal((0,n.int)(2)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)((0,n.vec3)(1),1))}).Else(()=>{let e=Zv({worldPos:y.hitPoint,cameraProjectionMatrix:m,cameraViewMatrix:h});_.assign((0,n.vec4)(Yv({depth:e}),1))})}),(0,n.If)(u.equal((0,n.int)(3)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().albedo.rgb;_.assign((0,n.vec4)(t,1))})}),(0,n.If)(u.equal((0,n.int)(5)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar(),u=t.albedo.rgb,d=(0,n.normalize)(t.normal).toVar(),p=re({state:ie({seed:(0,n.uint)(f.x).mul((0,n.uint)(1973)).add((0,n.uint)(f.y).mul((0,n.uint)(9277))).add(g.mul((0,n.uint)(26699)))})}).toVar(),m=Fd({N:d,xi:(0,n.vec2)(ae(p).toVar(),ae(p).toVar())}).toVar(),h=di({origin:Di(y.hitPoint,d),direction:m}),v=gi.wrap(x_(h,r,i).toVar()),b=(0,n.vec3)(0).toVar();(0,n.If)(v.didHit.not(),()=>{(0,n.If)(l,()=>{b.assign(P_({tex:o,samp:(0,n.sampler)(o),direction:m,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz)})}).Else(()=>{let e=fi.wrap(ra(v.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,v.uv,v.normal,(0,n.vec4)(0))).toVar();b.assign(t.emissive),(0,n.If)(l,()=>{let e=(0,n.normalize)(t.normal).toVar(),r=P_({tex:o,samp:(0,n.sampler)(o),direction:e,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz;b.addAssign(t.albedo.rgb.mul(r))})});let x=u.mul(b);_.assign((0,n.vec4)(x,1))})}),(0,n.If)(u.equal((0,n.int)(6)),()=>{(0,n.If)(y.didHit,()=>{let e=y.normal.toVar(),r=(0,n.normalize)(t.sub(e.mul((0,n.dot)(t,e).mul(2)))).toVar(),i=P_({tex:o,samp:(0,n.sampler)(o),direction:r,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz,a=i.div(i.add(1));_.assign((0,n.vec4)(a,1))}).Else(()=>{let e=P_({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz,r=e.div(e.add(1));_.assign((0,n.vec4)(r,1))})}),_});function $v(e){let{writeColorTex:t,writeNDTex:r,writeAlbedoTex:i,resolution:a,renderWidth:o,renderHeight:s,cameraWorldMatrix:c,cameraProjectionMatrixInverse:l,cameraProjectionMatrix:u,cameraViewMatrix:d,cameraProjection:f,panoLonRange:p,panoLatRange:m,panoLevelHorizon:h,enableDOF:g,focalLength:_,aperture:v,focusDistance:y,unitsPerMetre:b,apertureScale:x,anamorphicRatio:S,dofMode:C,dofBlur:w,bvhBuffer:T,triangleBuffer:E,materialBuffer:D,envTexture:O,environmentMatrix:k,environmentIntensity:A,enableEnvironmentLight:j,visMode:M,debugVisScale:N,frame:P}=e;return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),F=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(o).and(F.lessThan(s)),()=>{let o=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(F).add(.5)),s=re({state:(0,n.uint)(F.mul((0,n.int)(a.x)).add(e)).add((0,n.uint)(1))}).toVar(),I=di.wrap(r_(o.div(a),s,c,l,f,p,m,h,g,_,v,y,b,x,S,C,w)),L=(0,n.vec4)(1,0,1,1).toVar();(0,n.If)(M.equal((0,n.int)(9)),()=>{let e=ye(o,(0,n.int)(0),(0,n.int)(1),s,a,P);L.assign((0,n.vec4)(e,1,1))}).Else(()=>{L.assign(Qv(I.origin,I.direction,T,E,D,O,k,A,j,M,N,o,a,u,d,P))});let ee=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(F));(0,n.textureStore)(t,ee,L).toWriteOnly(),(0,n.textureStore)(r,ee,(0,n.vec4)(.5,.5,1,1)).toWriteOnly(),(0,n.textureStore)(i,ee,(0,n.vec4)(L.xyz,1)).toWriteOnly()})})}function ey({sortGlobalHistogram:e,bins:t=256}){return(0,n.Fn)(()=>{(0,n.If)(n.instanceIndex.lessThan((0,n.uint)(t)),()=>{(0,n.atomicStore)(e.element(n.instanceIndex),(0,n.uint)(0))})})}function ty({hitBufferRO:e,activeIndicesReadRO:t,sortGlobalHistogram:r,counters:i,bins:a=256}){return(0,n.Fn)(()=>{let o=n.instanceIndex,s=n.localId.x,c=(0,n.workgroupArray)(`uint`,a).toAtomic();(0,n.If)(s.lessThan((0,n.uint)(a)),()=>{(0,n.atomicStore)(c.element(s),(0,n.uint)(0))}),(0,n.workgroupBarrier)();let l=(0,n.atomicLoad)(i.element((0,n.uint)($.ENTERING_COUNT)));(0,n.If)(o.lessThan(l),()=>{let r=(0,n.uint)(Ga(e,t.element(o))).clamp((0,n.uint)(0),(0,n.uint)(a-1));(0,n.atomicAdd)(c.element(r),(0,n.uint)(1))}),(0,n.workgroupBarrier)(),(0,n.If)(s.lessThan((0,n.uint)(a)),()=>{let e=(0,n.atomicLoad)(c.element(s));(0,n.If)(e.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicAdd)(r.element(s),e)})})})}function ny({sortGlobalHistogram:e,bins:t=256}){return(0,n.Fn)(()=>{(0,n.If)(n.instanceIndex.equal((0,n.uint)(0)),()=>{let r=(0,n.uint)(0).toVar();(0,n.Loop)({start:(0,n.uint)(0),end:(0,n.uint)(t),type:`uint`},({i:t})=>{let i=e.element(t),a=(0,n.atomicLoad)(i);(0,n.atomicStore)(i,r),r.addAssign(a)})})})}function ry({hitBufferRO:e,activeIndicesReadRO:t,sortedIndicesRW:r,sortGlobalHistogram:i,counters:a,bins:o=256}){return(0,n.Fn)(()=>{let s=n.instanceIndex,c=n.localId.x,l=(0,n.workgroupArray)(`uint`,o).toAtomic();(0,n.If)(c.lessThan((0,n.uint)(o)),()=>{(0,n.atomicStore)(l.element(c),(0,n.uint)(0))}),(0,n.workgroupBarrier)();let u=(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))),d=s.lessThan(u),f=(0,n.uint)(0).toVar(),p=(0,n.uint)(0).toVar();(0,n.If)(d,()=>{f.assign(t.element(s)),p.assign((0,n.uint)(Ga(e,f)).clamp((0,n.uint)(0),(0,n.uint)(o-1))),(0,n.atomicAdd)(l.element(p),(0,n.uint)(1))}),(0,n.workgroupBarrier)(),(0,n.If)(c.lessThan((0,n.uint)(o)),()=>{let e=l.element(c),t=(0,n.atomicLoad)(e);(0,n.If)(t.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(e,(0,n.atomicAdd)(i.element(c),t))})}),(0,n.workgroupBarrier)(),(0,n.If)(d,()=>{r.element((0,n.atomicAdd)(l.element(p),(0,n.uint)(1))).assign(f)})})}rn();var iy=Wt(`wavefront`),ay=256,oy=[`extend`,`shade`,`globalHist`,`globalScatter`,`compact`,`compactCopyback`],sy=class extends Ig{constructor(e,t,r,i={}){super(e,t,r,i),this.name=`PathTracer`,this._packedBuffers=null,this._queueManager=null,this._kernelManager=null,this._gBufferAttr=null,this._m2Attr=null,this._streakAttr=null,this._frozenMaskAttr=null,this._convDebugSource=null,this._dilateFrozenUniform=(0,n.uniform)(1,`int`),this._wavefrontReady=!1,this._auxGBufferEnabled=!1,this._auxGBufferUniform=(0,n.uniform)(0,`uint`),this._cleanAuxNormalEnabled=!1,this._cleanAuxNormalUniform=(0,n.uniform)(0,`uint`),this._auxSamples=0,this._auxSeedPending=!1,this._useDynamicDispatch=!0,this._sortMaterials=!1,this._useSubgroupCompact=!1,this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-1,this._lastBounceCountsLoopBound=-1,this._readbackPending=!1,this._readbackEveryNFrames=4,this._readbackFrameCounter=0,this._readbackGeneration=0,this._curveSizingValid=!1,this._bounceEarlyExitThreshold=1e-4,this._convergedFraction=0,this._convergedGeometryFraction=0,this._geometryPixelCount=0,this._convergedReadbackPending=!1,this._lastActivePixelCount=0,this._wfRenderWidth=(0,n.uniform)(1920,`int`),this._wfRenderHeight=(0,n.uniform)(1080,`int`),this._wfMaxRayCount=(0,n.uniform)(0,`uint`),this._wfCurrentBounce=(0,n.uniform)(0,`int`),this._wfChunkRowBase=(0,n.uniform)(0,`int`),this._wfChunkRows=(0,n.uniform)(0,`int`),this._wfIsFirstChunk=(0,n.uniform)(1,`uint`),this._pathBudget=0,this._pathBudgetOverride=0,this._chunkRows=0,this._numChunks=1,this.vramTracker=new Kg(this.renderer),this._registerVRAMProviders(),iy.debug(`initialized (wavefront)`)}_registerVRAMProviders(){let e=this.vramTracker;e.register(`rays`,()=>{let e=this._packedBuffers?._attrs;return e?[e.ray,e.rng,e.hit]:null}),e.register(`queues`,()=>{let e=this._queueManager;return e?[e._countersAttr,e._bounceCountsAttr,e._attrA,e._attrB,e._sortAttr]:null}),e.register(`gbuffer`,()=>{let e=[];return this._gBufferAttr&&e.push(this._gBufferAttr),this._m2Attr&&e.push(this._m2Attr),this._streakAttr&&e.push(this._streakAttr),this._frozenMaskAttr&&e.push(this._frozenMaskAttr),e.length?e:null}),e.register(`accum`,()=>{let e=this.storageTextures;return e?[e.writeColor,e.writeNormalDepth,e.writeAlbedo,e.readTarget]:null}),e.register(`geometry`,()=>[this.triangleGeoAttr,this.triangleShadeAttr,this.bvhStorageAttr,this.lightStorageAttr]),e.register(`materials`,()=>{let e=this.materialData;return e?[e.materialStorageAttr,...(e.srgbBuckets||[]).filter(Boolean),...(e.linearBuckets||[]).filter(Boolean)]:null}),e.register(`environment`,()=>{let e=this.environment;return e?[e.environmentTexture,e.envCDFTexture]:null})}setupMaterial(){super.setupMaterial(),this.materialData?.materialCount>0&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}render(e){if(!this.isReady||!this._wavefrontReady||this._lightBufferRealloc&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels(),!this._wavefrontReady))return;if(this.isComplete||this.frameCount>=this.completionThreshold||this._isConvergedComplete())if(this._auxSeedPending)this.isComplete=!1;else{this.isComplete||=!0;return}this.performanceMonitor?.start();let t=this.frameCount,n=this.renderMode.value,r=null;n===1&&t===0&&(r=this.maxBounces.value,this.maxBounces.value=1),this._handleResize(),this.manageASVGFForRenderMode(n),e&&e.setState(`tileRenderingComplete`,!0),this.cameraChanged=this._updateCameraUniforms(),this.cameraOptimizer?.updateInteractionMode(this.cameraChanged),this.cameraChanged&&(this._curveSizingValid=!1,this._readbackGeneration++,this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0),this._updateAccumulationUniforms(t,n);let i=this._updateAuxAccumulationUniforms(t);this.frame.value=t,this.seedFrame.value=this._seedTick++,this.tracedFrames++,this._setWfDispatch();let a=this.storageTextures.getReadTextures();this.shaderBuilder.prevColorTexNode&&(this.shaderBuilder.prevColorTexNode.value=a.color,this.shaderBuilder.prevAlbedoTexNode.value=a.albedo,this.shaderBuilder.prevNormalDepthTexNode.value=a.normalDepth),this._refreshWfTextureNodes();let o=this._kernelManager;if((this.visMode?.value|0)>0&&this.visMode.value!==11){o.dispatch(`debug`),this.storageTextures.copyToReadTargets(this.renderer);let t=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,t),this._emitStateEvents(),this.cameraOptimizer?.isInInteractionMode()||this.frameCount++,r!==null&&(this.maxBounces.value=r),this.performanceMonitor?.end();return}let s=this.maxBounces.value,c=this._bounceLoopBound(),l=this._wfRenderHeight.value,u=this._chunkRows,d=this._numChunks<=1;c>this._lastBounceCountsLoopBound&&(this._curveSizingValid=!1);let f=this._lastBounceCounts,p=s<=this._lastBounceCountsBudget&&c<=this._lastBounceCountsLoopBound,m=d&&f?p?c+1:Math.min(this._lastBounceCountsBudget,this._lastBounceCountsLoopBound):0;for(let e=0,n=0;n<l;n+=u,e++){let r=Math.min(u,l-n),i=this._setChunk(n,r,e),a=this.usePixelFreeze.value>0&&!this._auxSeedPending,s=d&&a&&this._curveSizingValid&&this._lastActivePixelCount>0?this._lastActivePixelCount:i;if(a){let e=Math.min(i,Math.ceil(s*1.5)+1024);o.setDispatchForCount(`generateList`,e),o.dispatch(`resetFrameCounters`),o.dispatch(`buildActivePixels`),o.dispatch(`seedEnter`),o.dispatch(`generateList`)}else o.dispatch(`generate`),o.dispatch(`initActiveIndices`);e===0&&t>0&&this.useAdaptiveSampling.value>0&&this._willReadCountersThisFrame()&&o.dispatch(`countConvergedDilated`);let p=this._lastBounceEnergy,h=this._bounceEarlyExitThreshold>=0?this._bounceEarlyExitThreshold*i*64:-1;for(let e=0;e<=c;e++){this._wfCurrentBounce.value=e;let t=this._useDynamicDispatch;if(t){let t=i;if(d&&e>0&&this._curveSizingValid){let n=e-1,r;n<m&&f[n]!==void 0?r=f[n]:m>0&&(r=f[m-1]),t=r>0?r:i}else e===0&&a&&(t=s);let n=Math.min(i,Math.ceil(t*1.5)+1024);for(let e of oy)o.setDispatchForCount(e,n)}else{o.dispatch(`enterFull`);for(let e of oy)o.setDispatchForCount(e,i)}if(o.dispatch(`extend`),this._sortMaterials&&(o.dispatch(`resetGlobalHist`),o.dispatch(`globalHist`),o.dispatch(`globalPrefix`),o.dispatch(`globalScatter`)),o.dispatch(`shade`),o.dispatch(`compact`),t?o.dispatch(`compactCopyback`):o.dispatch(`snapshotBounceCount`),h>=0&&e<m&&e<c&&p?.[e]!==void 0&&p[e]<=h)break}o.dispatch(`finalWrite`)}this._maybeReadbackCounters(),this.storageTextures.copyToReadTargets(this.renderer,this._auxGBufferEnabled);let h=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,h),this._emitStateEvents(),this.cameraOptimizer?.isInInteractionMode()||this.frameCount++,this._auxGBufferEnabled&&(this._auxSamples=i?this._auxSamples+1:1),this._auxSeedPending=!1,r!==null&&(this.maxBounces.value=r),this.performanceMonitor?.end()}_isConvergedComplete(){return this.useAdaptiveSampling.value>0&&this.frameCount>=this.adaptiveMinSamples.value&&this._convergedFraction>=this.adaptiveStopFraction.value&&this._convergedGeometryFraction>=this.adaptiveStopFraction.value}async captureAccumulation(){let e=this.storageTextures,t=e.renderWidth,n=e.renderHeight,r=t*n,i=async i=>{let a=await this.renderer.readRenderTargetPixelsAsync(e.readTarget,0,0,t,n,i),o=Math.ceil(t*16/256)*64;if(o===t*4)return new Float32Array(a.buffer,a.byteOffset,r*4).slice();let s=new Float32Array(r*4);for(let e=0;e<n;e++)s.set(a.subarray(e*o,e*o+t*4),e*t*4);return s},a=async(e,t)=>e?new t(await this.renderer.getArrayBufferAsync(e,null,0,r*4)):null,o=this._auxGBufferEnabled&&this._auxSamples>0,s={frameCount:this.frameCount,seedTick:this._seedTick,auxSamples:o?this._auxSamples:0,convergedFraction:this._convergedFraction,convergedGeometryFraction:this._convergedGeometryFraction,isComplete:this.isComplete},c=[i(0),o?i(1):null,o?i(2):null,a(this._m2Attr,Float32Array),a(this._streakAttr,Uint32Array),a(this._frozenMaskAttr,Uint32Array)],[l,u,d,f,p,m]=await Promise.all(c);return{width:t,height:n,state:s,color:l,normalDepth:u,albedo:d,m2:f,streak:p,frozenMask:m}}restoreAccumulation(e){let t=this.storageTextures,{width:n,height:r,state:i}=e;if(t.renderWidth!==n||t.renderHeight!==r)throw Error(`checkpoint is ${n}×${r}; the render is ${t.renderWidth}×${t.renderHeight}`);let a=this.renderer.backend,o=a.device;a.get(t.readTarget.textures[0]).texture||this.renderer.initRenderTarget(t.readTarget);let s=(e,i)=>o.queue.writeTexture({texture:a.get(t.readTarget.textures[e]).texture},i,{bytesPerRow:n*16,rowsPerImage:r},{width:n,height:r}),c=(e,t)=>{e&&t&&o.queue.writeBuffer(a.get(e).buffer,0,t)};s(0,e.color),e.normalDepth&&s(1,e.normalDepth),e.albedo&&s(2,e.albedo),c(this._m2Attr,e.m2),c(this._streakAttr,e.streak),c(this._frozenMaskAttr,e.frozenMask),this.frameCount=i.frameCount,this.frame.value=i.frameCount,this._seedTick=i.seedTick,this.hasPreviousAccumulated.value=+(i.frameCount>0),this._auxSamples=e.normalDepth?i.auxSamples:0,this._auxSeedPending=this._auxGBufferEnabled&&!e.normalDepth,this._convergedFraction=i.convergedFraction??0,this._convergedGeometryFraction=i.convergedGeometryFraction??0,this.isComplete=!1}reset(){super.reset(),this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0,this._auxSamples=0,this._auxSeedPending=!1}getConvergenceDebugSource(){return!this._m2Attr||!this._frozenMaskAttr?null:(this._convDebugSource?.m2===this._m2Attr&&this._convDebugSource.frozenMask===this._frozenMaskAttr||(this._convDebugSource={m2:this._m2Attr,frozenMask:this._frozenMaskAttr,frame:this.frame,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,noiseThreshold:this.noiseThreshold,pixelFreezeThreshold:this.pixelFreezeThreshold,usePixelFreeze:this.usePixelFreeze,adaptiveMinSamples:this.adaptiveMinSamples}),this._convDebugSource)}getConvergenceStats(){let e=this._wfRenderWidth.value*this._wfRenderHeight.value;return{converged:this._convergedFraction,convergedGeometry:this._convergedGeometryFraction,geometryPixels:this._geometryPixelCount,activePixels:this._lastActivePixelCount,totalPixels:e,frame:this.frameCount}}_handleResize(){let e=this.storageTextures.renderWidth,t=this.storageTextures.renderHeight;super._handleResize(),this._rebuildKernelsIfResized(e,t)}setAuxGBufferEnabled(e){e=!!e,this._auxGBufferEnabled!==e&&(this._auxGBufferEnabled=e,this._auxGBufferUniform.value=+!!e,this.restartAuxAccumulation())}setCleanAuxNormal(e){e=!!e,this._cleanAuxNormalEnabled!==e&&(this._cleanAuxNormalEnabled=e,this._cleanAuxNormalUniform.value=+!!e,this.restartAuxAccumulation())}restartAuxAccumulation(){this._auxSamples=0,this._auxSeedPending=this._auxGBufferEnabled}_updateAuxAccumulationUniforms(e){let t=this.accumulationEnabled&&!this.cameraIsMoving.value&&e>0&&this.hasPreviousAccumulated.value>0&&this.visMode.value!==11,n=this._auxGBufferEnabled&&t&&!this._auxSeedPending&&this._auxSamples>0;return this.hasPreviousAux.value=+!!n,this.auxAccumulationAlpha.value=n?1/(this._auxSamples+1):1,n}setSize(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;super.setSize(e,t),this._rebuildKernelsIfResized(n,r)}_willReadCountersThisFrame(){return this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()||this._readbackPending||this._convergedReadbackPending?!1:this._readbackFrameCounter+1>=this._readbackEveryNFrames}_bounceLoopBound(){return this.maxBounces.value+this.transmissiveBounces.value+this.maxSubsurfaceSteps.value}_maybeReadbackCounters(){if(this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()){this._readbackFrameCounter=this._readbackEveryNFrames;return}if(this._readbackPending||((this.maxBounces.value!==this._lastBounceCountsBudget||this._bounceLoopBound()!==this._lastBounceCountsLoopBound)&&(this._readbackFrameCounter=this._readbackEveryNFrames),this._readbackFrameCounter++,this._readbackFrameCounter<this._readbackEveryNFrames))return;this._readbackFrameCounter=0;let e=this._queueManager?.getBounceCountsAttribute();if(!e)return;this._readbackPending=!0;let t=this._readbackGeneration,n=this.maxBounces.value,r=this._bounceLoopBound(),i=this._queueManager.MAX_BOUNCE_SNAPSHOTS;if(this.renderer.getArrayBufferAsync(e).then(e=>{if(t===this._readbackGeneration){let t=new Uint32Array(e.slice(0));this._lastBounceCounts=t.subarray(0,i),this._lastBounceEnergy=t.subarray(i,2*i),this._lastBounceCountsBudget=n,this._lastBounceCountsLoopBound=r,this._curveSizingValid=!0}this._readbackPending=!1}).catch(e=>{iy.warn(`bounceCounts readback failed:`,e),this._readbackPending=!1}),!this._convergedReadbackPending){let e=this._queueManager?.getCountersAttribute();if(e){this._convergedReadbackPending=!0;let t=this._readbackGeneration,n=this._wfRenderWidth.value*this._wfRenderHeight.value;this.renderer.getArrayBufferAsync(e).then(e=>{if(t===this._readbackGeneration&&n>0){let t=new Uint32Array(e);this._convergedFraction=t[$.CONVERGED_COUNT]/n;let r=t[$.GEOMETRY_COUNT];this._geometryPixelCount=r,this._convergedGeometryFraction=r>0?t[$.CONVERGED_GEOMETRY_COUNT]/r:1,this._lastActivePixelCount=t[$.ACTIVE_PIXEL_COUNT]}this._convergedReadbackPending=!1}).catch(()=>{this._convergedReadbackPending=!1})}}}_refreshWfTextureNodes(){let e=this._wfTexNodes;if(!e)return;let t=this.environment?.environmentTexture;t&&e.envTex&&(e.envTex.value=t),this.environment?.envCDFTexture&&e.envCDFTex&&(e.envCDFTex.value=this.environment.envCDFTexture);let n=this.materialData;n&&(mf(e.srgbBuckets,n.srgbBuckets),mf(e.linearBuckets,n.linearBuckets))}_rebuildKernelsIfResized(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;if(!(n===e&&r===t||!(this.materialData?.materialCount>0))){if(this._lastBounceCounts&&this._numChunks<=1&&e>0&&t>0){let i=n*r/(e*t),a=e=>Math.min(4294967295,Math.round(e*i));this._lastBounceCounts=this._lastBounceCounts.map(a),this._lastBounceEnergy=this._lastBounceEnergy.map(a)}else this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-1,this._lastBounceCountsLoopBound=-1;this._curveSizingValid=!1,this._readbackFrameCounter=0,this._readbackGeneration++,this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0,this._packedBuffers?this._resizeWavefrontInPlace(n,r):(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}}_resizeWavefrontInPlace(e,t){this._wfRenderWidth.value=e,this._wfRenderHeight.value=t,this._updateChunkLayout()}_computePathBudget(){if(this._pathBudgetOverride>0)return this._pathBudgetOverride;let e=this.renderer?.backend?.device?.limits,t=e?.maxStorageBufferBindingSize||128*1024*1024,n=e?.maxBufferSize||t,r=Math.floor(t*.9/112),i=(typeof navigator<`u`&&navigator.deviceMemory||4)*1024*1024*1024,a=Math.min(i*.25,n*4),o=Math.floor(a/192),s=Math.min(r,o,2048*2048);return s=Math.max(262144,s),s}_updateChunkLayout(){let e=Math.max(1,this.storageTextures.renderWidth),t=this.storageTextures.renderHeight,n=this._pathBudget||e*t;this._chunkRows=Math.max(1,Math.min(Math.floor(n/e),t)),this._numChunks=Math.max(1,Math.ceil(t/this._chunkRows))}reallocateReservedStorage(){if(!this.storageTextures.writeColor)return;let e=Math.min(this.storageTextures.renderWidth||1,W),t=Math.min(this.storageTextures.renderHeight||1,W);this.storageTextures.create(e,t),this.resolution.value.set(e,t),!(!this._packedBuffers||!(this.materialData?.materialCount>0))&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}_buildWavefrontKernels(){let e=this.shaderBuilder.getSceneTextureNodes();if(!e)return;this._lightBufferRealloc=!1;let t=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;this._pathBudget||=this._computePathBudget();let i=this._pathBudget;this._updateChunkLayout();let a=this._chunkRows*t;this._packedBuffers?this._packedBuffers.resize(i):this._packedBuffers=new xa(i,this.renderer);let o=i*1;ba(this.renderer,this._gBufferAttr),this._gBufferAttr=S(o,4,Uint32Array);let s=(0,n.storage)(this._gBufferAttr,`uvec4`),c=(0,n.storage)(this._gBufferAttr,`uvec4`).toReadOnly(),l=W*W;(!this._m2Attr||this._m2Attr.count<l)&&(ba(this.renderer,this._m2Attr),this._m2Attr=S(l,1),ba(this.renderer,this._streakAttr),this._streakAttr=S(l,1,Uint32Array),ba(this.renderer,this._frozenMaskAttr),this._frozenMaskAttr=S(l,1,Uint32Array));let u=(0,n.storage)(this._m2Attr,`float`),d=(0,n.storage)(this._streakAttr,`uint`),f=(0,n.storage)(this._streakAttr,`uint`).toReadOnly(),p=(0,n.storage)(this._frozenMaskAttr,`uint`),m=(0,n.storage)(this._frozenMaskAttr,`uint`).toReadOnly();this._queueManager?this._queueManager.resize(this._packedBuffers.capacity):this._queueManager=new Bg(this._packedBuffers.capacity,this.renderer),this._kernelManager||=new Jg(this.renderer);let h=this._packedBuffers,g=this._queueManager;this._wfRenderWidth.value=t,this._wfRenderHeight.value=r,this._wfMaxRayCount.value=Math.min(i,this._chunkRows*t);let _=this.shaderBuilder.prevColorTexNode,v=this.shaderBuilder.prevAlbedoTexNode,y=this.shaderBuilder.prevNormalDepthTexNode,b=this.storageTextures.getWriteTextures(),x=g.getCounters(),C=g.getBounceCounts(),w=this._wfCurrentBounce,T=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT))),t=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS-1));C.element(t).assign(e),C.element(t.add((0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),e)});this._kernelManager.register(`snapshotBounceCount`,T().compute([1,1,1],[1,1,1]));let E=g.activeIndices.a,D=(0,n.Fn)(()=>{let e=n.instanceIndex;(0,n.If)(e.lessThan(this._wfMaxRayCount),()=>{E.element(e).assign(e)}),(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),this._wfMaxRayCount),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})})});this._kernelManager.register(`initActiveIndices`,D().compute([Math.ceil(this._chunkRows*t/ay),1,1],[ay,1,1]));let O={rayBufferRW:h.rayBuffer.rw,hitBufferRW:h.hitBuffer.rw,gBufferRW:s,resolution:this.resolution,frame:this.seedFrame,cameraWorldMatrix:this.cameraWorldMatrix,cameraProjectionMatrixInverse:this.cameraProjectionMatrixInverse,cameraProjection:this.cameraProjection,panoLonRange:this.panoLonRange,panoLatRange:this.panoLatRange,panoLevelHorizon:this.panoLevelHorizon,enableDOF:this.enableDOF,focalLength:this.focalLength,aperture:this.aperture,focusDistance:this.focusDistance,unitsPerMetre:this.unitsPerMetre,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,dofMode:this.dofMode,dofBlur:this.dofBlur,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows,transmissiveBounces:this.transmissiveBounces,transparentBackground:this.transparentBackground,auxGBufferEnabled:this._auxGBufferUniform},k=i_(O);this._kernelManager.register(`generate`,k().compute([Math.ceil(t/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let A=this.pixelFreezeStability,j=(0,n.Fn)(()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})});this._kernelManager.register(`resetFrameCounters`,j().compute([1,1,1],[1,1,1]));let M=(0,n.Fn)(()=>{let e=n.instanceIndex;(0,n.If)(e.lessThan(this._wfMaxRayCount),()=>{let t=(0,n.uint)((0,n.int)(e).add(this._wfChunkRowBase.mul(this._wfRenderWidth))).toVar(),r=(0,n.uint)(0).toVar();(0,n.If)(this.frame.greaterThan((0,n.uint)(0)).and(f.element(t).bitAnd((0,n.uint)(1073741823)).greaterThanEqual((0,n.uint)(A))),()=>{r.assign((0,n.uint)(1)),(0,n.If)(this._dilateFrozenUniform.greaterThan((0,n.int)(0)),()=>{let e=(0,n.int)(t).mod(this._wfRenderWidth),i=(0,n.int)(t).div(this._wfRenderWidth);for(let[t,a]of[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]]){let o=e.add((0,n.int)(t)),s=i.add((0,n.int)(a));(0,n.If)(o.greaterThanEqual((0,n.int)(0)).and(o.lessThan(this._wfRenderWidth)).and(s.greaterThanEqual((0,n.int)(0))).and(s.lessThan(this._wfRenderHeight)),()=>{(0,n.If)(f.element((0,n.uint)(s.mul(this._wfRenderWidth).add(o))).bitAnd((0,n.uint)(1073741823)).lessThan((0,n.uint)(A)),()=>{r.assign((0,n.uint)(0))})})}})}),p.element(t).assign(r),(0,n.If)(r.equal((0,n.uint)(0)),()=>{let t=(0,n.atomicAdd)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(1));E.element(t).assign(e)})})});this._kernelManager.register(`buildActivePixels`,M().compute([Math.ceil(this._chunkRows*t/ay),1,1],[ay,1,1]));let N=(0,n.Fn)(()=>{let e=n.instanceIndex,t=this._wfRenderWidth,r=this._wfRenderHeight;(0,n.If)(e.lessThan((0,n.uint)(t.mul(r))),()=>{let i=(0,n.int)(e).mod(t),a=(0,n.int)(e).div(t),o=(0,n.uint)(2147483648),s=(0,n.uint)(1073741824),c=f.element(e).toVar(),l=c.bitAnd(s).notEqual((0,n.uint)(0)),u=c.bitAnd(o).notEqual((0,n.uint)(0)).toVar();(0,n.If)(u,()=>{for(let[e,s]of[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]]){let c=i.add((0,n.int)(e)),l=a.add((0,n.int)(s));(0,n.If)(c.greaterThanEqual((0,n.int)(0)).and(c.lessThan(t)).and(l.greaterThanEqual((0,n.int)(0))).and(l.lessThan(r)),()=>{(0,n.If)(f.element((0,n.uint)(l.mul(t).add(c))).bitAnd(o).equal((0,n.uint)(0)),()=>{u.assign(!1)})})}}),(0,n.If)(u,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(1))}),(0,n.If)(l,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(1)),(0,n.If)(u,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(1))})})})});this._kernelManager.register(`countConvergedDilated`,N().compute([Math.ceil(t*r/ay),1,1],[ay,1,1]));let P=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)));(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),e),(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_PIXEL_COUNT)),e)});this._kernelManager.register(`seedEnter`,P().compute([1,1,1],[1,1,1]));let F=i_({...O,listDriven:!0,activeIndicesRO:g.activeIndicesRO.a,counters:x});this._kernelManager.register(`generateList`,F().compute([Math.ceil(a/ay),1,1],[ay,1,1]));let I=this.bvhStorageNode,L=this.triangleStorageNode,ee=this.materialData.materialStorageNode,te=(0,n.texture)(this.environment.envCDFTexture),ne=this.lightStorageNode,re=this.materialData,ie=this.environment,R=pf(re.srgbBuckets),ae=pf(re.linearBuckets);sf(R,ae),Mf(R);let oe=ie.environmentTexture?(0,n.texture)(ie.environmentTexture):e.envTex;this._wfTexNodes={envTex:oe,envCDFTex:te,srgbBuckets:R,linearBuckets:ae},this._sortMaterials=(U.wavefrontSortMaterials??!1)&&(this.materialData?.materialCount??0)>8;let se=k_({bvhBuffer:I,triangleBuffer:L,rayBufferRO:h.rayBuffer.ro,hitBufferRW:h.hitBuffer.rw,activeIndicesRO:g.getActiveReadRO(),counters:x,maxRayCount:this._wfMaxRayCount,shadowTerminatorOffset:this.shadowTerminatorOffset});if(this._kernelManager.register(`extend`,se().compute([Math.ceil(a/256),1,1],[256,1,1])),this._sortMaterials){let e=g.getSortGlobalHistogram(),t=Math.min(256,this.materialData?.materialCount??256);this._kernelManager.register(`resetGlobalHist`,ey({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[256,1,1])),this._kernelManager.register(`globalHist`,ty({hitBufferRO:h.hitBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),sortGlobalHistogram:e,counters:x,bins:t})().compute([Math.ceil(a/256),1,1],[256,1,1])),this._kernelManager.register(`globalPrefix`,ny({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[1,1,1])),this._kernelManager.register(`globalScatter`,ry({hitBufferRO:h.hitBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),sortedIndicesRW:g.getSortedRW(),sortGlobalHistogram:e,counters:x,bins:t})().compute([Math.ceil(a/256),1,1],[256,1,1]))}let ce=Uv({gBufferRW:s,envCompensationDelta:this.envCompensationDelta,bvhBuffer:I,triangleBuffer:L,materialBuffer:ee,envCDFTexture:te,lightBuffer:ne,rayBufferRW:h.rayBuffer.rw,hitBufferRW:h.hitBuffer.rw,counters:x,activeIndicesRO:this._sortMaterials?g.getSortedRO():g.getActiveReadRO(),envTexture:oe,environmentIntensity:this.environmentIntensity,envMatrix:this.environmentMatrix,enableEnvironmentLight:this.enableEnvironment,groundProjectionEnabled:this.groundProjectionEnabled,groundProjectionRadius:this.groundProjectionRadius,groundProjectionHeight:this.groundProjectionHeight,groundProjectionLevel:this.groundProjectionLevel,enableGroundCatcher:this.enableGroundCatcher,groundCatcherHeight:this.groundCatcherHeight,envTotalSum:this.envTotalSum,envResolution:this.envResolution,directionalLightsBuffer:this.directionalLightsBufferNode,numDirectionalLights:this.numDirectionalLights,areaLightsBuffer:this.areaLightsBufferNode,numAreaLights:this.numAreaLights,pointLightsBuffer:this.pointLightsBufferNode,numPointLights:this.numPointLights,spotLightsBuffer:this.spotLightsBufferNode,numSpotLights:this.numSpotLights,maxBounceCount:this.maxBounces,maxSubsurfaceSteps:this.maxSubsurfaceSteps,maxTransparentBounces:this.maxTransparentBounces,transparentBackground:this.transparentBackground,backgroundIntensity:this.backgroundIntensity,backgroundColor:this.backgroundColor,backgroundBlurriness:this.backgroundBlurriness,backgroundBlurSamples:this.backgroundBlurSamples,showBackground:this.showBackground,globalIlluminationIntensity:this.globalIlluminationIntensity,cameraProjectionMatrix:this.cameraProjectionMatrix,cameraViewMatrix:this.cameraViewMatrix,fireflyThreshold:this.fireflyThreshold,shadowTerminatorOffset:this.shadowTerminatorOffset,frame:this.seedFrame,accumFrame:this.frame,resolution:this.resolution,emissiveTriangleCount:this.emissiveTriangleCount,emissiveVec4Offset:this.emissiveVec4Offset,emissiveTotalPower:this.emissiveTotalPower,emissiveBoost:this.emissiveBoost,totalTriangleCount:this.totalTriangleCount,enableEmissiveTriangleSampling:this.enableEmissiveTriangleSampling,lightBVHNodeCount:this.lightBVHNodeCount,reverseMapVec4Offset:this.reverseMapVec4Offset,currentBounce:this._wfCurrentBounce,maxRayCount:this._wfMaxRayCount,chunkRowBase:this._wfChunkRowBase,auxGBufferEnabled:this._auxGBufferUniform,hasSun:this.hasSun,sunDirection:this.sunDirection,sunRadiance:this.sunRadiance,sunParams:this.sunParams});this._kernelManager.register(`shade`,ce().compute([Math.ceil(a/256),1,1],[256,1,1]));let le=this._useSubgroupCompact&&(this.renderer.hasFeature?this.renderer.hasFeature(`subgroups`):!1);this._compactIsSubgroup=le;let ue=(le?Kv:Gv)({rayBufferRO:h.rayBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),activeIndicesWriteRW:g.getActiveWrite(),counters:x,currentActiveCount:this._wfMaxRayCount});this._kernelManager.register(`compact`,ue().compute([Math.ceil(a/256),1,1],[256,1,1]));let de=(0,n.Fn)(()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount)});this._kernelManager.register(`enterFull`,de().compute([1,1,1],[1,1,1]));let fe=g.activeIndicesRO.b,pe=g.activeIndices.a,me=(0,n.Fn)(()=>{let e=n.instanceIndex,t=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)));(0,n.If)(e.equal((0,n.uint)(0)),()=>{let e=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS-1));C.element(e).assign(t),C.element(e.add((0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),t)}),(0,n.If)(e.greaterThanEqual(t),()=>{(0,n.Return)()}),pe.element(e).assign(fe.element(e))});this._kernelManager.register(`compactCopyback`,me().compute([Math.ceil(a/ay),1,1],[ay,1,1]));let he=Jv({rayBufferRO:h.rayBuffer.ro,gBufferRO:c,writeColorTex:b.color,writeNDTex:b.normalDepth,writeAlbedoTex:b.albedo,resolution:this.resolution,frame:this.frame,enableAccumulation:this.enableAccumulation,hasPreviousAccumulated:this.hasPreviousAccumulated,accumulationAlpha:this.accumulationAlpha,hasPreviousAux:this.hasPreviousAux,auxAccumulationAlpha:this.auxAccumulationAlpha,cameraIsMoving:this.cameraIsMoving,transparentBackground:this.transparentBackground,prevAccumTexture:_,prevAlbedoTexture:v,prevNormalDepthTexture:y,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,visMode:this.visMode,auxGBufferEnabled:this._auxGBufferUniform,cleanAuxNormalEnabled:this._cleanAuxNormalUniform,m2BufferRW:u,useAdaptiveSampling:this.useAdaptiveSampling,noiseThreshold:this.noiseThreshold,adaptiveMinSamples:this.adaptiveMinSamples,usePixelFreeze:this.usePixelFreeze,pixelFreezeThreshold:this.pixelFreezeThreshold,streakBufferRW:d,frozenMaskRO:m,convergenceOverlay:this.convergenceOverlay,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows});this._kernelManager.register(`finalWrite`,he().compute([Math.ceil(t/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let ge=$v({writeColorTex:b.color,writeNDTex:b.normalDepth,writeAlbedoTex:b.albedo,resolution:this.resolution,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,cameraWorldMatrix:this.cameraWorldMatrix,cameraProjectionMatrixInverse:this.cameraProjectionMatrixInverse,cameraProjectionMatrix:this.cameraProjectionMatrix,cameraViewMatrix:this.cameraViewMatrix,cameraProjection:this.cameraProjection,panoLonRange:this.panoLonRange,panoLatRange:this.panoLatRange,panoLevelHorizon:this.panoLevelHorizon,enableDOF:this.enableDOF,focalLength:this.focalLength,aperture:this.aperture,focusDistance:this.focusDistance,unitsPerMetre:this.unitsPerMetre,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,dofMode:this.dofMode,dofBlur:this.dofBlur,bvhBuffer:I,triangleBuffer:L,materialBuffer:ee,envTexture:oe,environmentMatrix:this.environmentMatrix,environmentIntensity:this.environmentIntensity,enableEnvironmentLight:this.enableEnvironment,visMode:this.visMode,debugVisScale:this.debugVisScale,frame:this.frame});this._kernelManager.register(`debug`,ge().compute([Math.ceil(t/16),Math.ceil(r/16),1],[16,16,1])),this._wavefrontReady=!0;let _e=(this._packedBuffers?.totalBytes??0)+(this._queueManager?.totalBytes??0);iy.info(J.list([J.px(t,r),`${J.mb(_e)} wavefront buffers`,`budget ${J.n(i)} paths`,this._numChunks>1?`${this._numChunks} chunks of ≤${this._chunkRows} rows`:null]))}_setWfDispatch(){let e=this._wfRenderWidth.value,t=this._wfRenderHeight.value;this._kernelManager.setDispatchForGrid(`debug`,e,t),this._kernelManager.setDispatchForCount(`countConvergedDilated`,e*t)}_setChunk(e,t,n){let r=this._wfRenderWidth.value,i=t*r;this._wfChunkRowBase.value=e,this._wfChunkRows.value=t,this._wfIsFirstChunk.value=+(n===0),this._wfMaxRayCount.value=i;let a=this._kernelManager;return a.setDispatchForGrid(`generate`,r,t),a.setDispatchForGrid(`finalWrite`,r,t),a.setDispatchForCount(`initActiveIndices`,i),a.setDispatchForCount(`buildActivePixels`,i),i}dispose(){super.dispose(),this._packedBuffers?.dispose(),this._queueManager?.dispose(),this._kernelManager?.dispose(),this._gBufferAttr?.dispose?.(),this._m2Attr?.dispose?.(),this._streakAttr?.dispose?.(),this._frozenMaskAttr?.dispose?.(),this._packedBuffers=null,this._queueManager=null,this._kernelManager=null,this._gBufferAttr=null,this._m2Attr=null,this._streakAttr=null,this._frozenMaskAttr=null,this._convDebugSource=null,this._wavefrontReady=!1}},cy=class extends xe{constructor(e,i={}){super(`NormalDepth`,{...i,executionMode:z.ALWAYS}),this.renderer=e,this.pathTracer=i.pathTracer,this._dirty=!0,this.cameraWorldMatrix=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraProjectionMatrixInverse=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraRay=Qg(),this.resolutionWidth=(0,n.uniform)(i.width||1),this.resolutionHeight=(0,n.uniform)(i.height||1);let a=i.width||1,o=i.height||1;this._outputStorageTex=new t.StorageTexture(W,W),this._outputStorageTex.type=r.HalfFloatType,this._outputStorageTex.format=r.RGBAFormat,this._outputStorageTex.minFilter=r.NearestFilter,this._outputStorageTex.magFilter=r.NearestFilter,this._shadingStorageTex=new t.StorageTexture(W,W),this._shadingStorageTex.type=r.HalfFloatType,this._shadingStorageTex.format=r.RGBAFormat,this._shadingStorageTex.minFilter=r.NearestFilter,this._shadingStorageTex.magFilter=r.NearestFilter,this._shadingRT=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1}),this._leafStorageTex=null,this._leafRT=null,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0));let s={type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this._rtA=new t.RenderTarget(a,o,s),this._rtB=new t.RenderTarget(a,o,s),this._currentIdx=0,this._hasHistory=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._triStorageNode=null,this._bvhStorageNode=null,this._matStorageNode=null,this._lastTriAttr=null,this._lastBvhAttr=null,this._lastMatAttr=null,this._computeNode=null,this._computeBuilt=!1,this._linearBuckets=null}setupEventListeners(){this.on(`camera:moved`,()=>{this._dirty=!0}),this.on(`pipeline:reset`,()=>{this._dirty=!0})}_syncStorageBuffers(){let e=this.pathTracer;if(!e)return!1;let t=e.materialData?.materialStorageAttr,r=e.triangleGeoAttr&&e.triangleGeoAttr!==this._lastTriAttr,i=e.bvhStorageAttr&&e.bvhStorageAttr!==this._lastBvhAttr,a=t&&t!==this._lastMatAttr;return(r||i||a)&&(this._computeNode?.dispose?.(),this._computeNode=null,this._computeBuilt=!1,this._triStorageNode=null,this._bvhStorageNode=null,this._matStorageNode=null,this._dirty=!0,this._hasHistory=!1),e.triangleGeoAttr&&!this._triStorageNode&&(this._triStorageNode={geo:(0,n.storage)(e.triangleGeoAttr,`uvec4`,e.triangleGeoAttr.count).toReadOnly(),shade:(0,n.storage)(e.triangleShadeAttr,`uvec4`,e.triangleShadeAttr.count).toReadOnly()}),e.bvhStorageAttr&&!this._bvhStorageNode&&(this._bvhStorageNode=(0,n.storage)(e.bvhStorageAttr,`vec4`,e.bvhStorageAttr.count).toReadOnly()),t&&!this._matStorageNode&&(this._matStorageNode=(0,n.storage)(t,`vec4`,t.count).toReadOnly()),this._linearBuckets&&mf(this._linearBuckets,e.materialData?.linearBuckets),this._lastTriAttr=e.triangleGeoAttr||this._lastTriAttr,this._lastBvhAttr=e.bvhStorageAttr||this._lastBvhAttr,this._lastMatAttr=t||this._lastMatAttr,!!(this._triStorageNode&&this._bvhStorageNode&&this._matStorageNode)}_buildCompute(){let e=this._triStorageNode,t=this._bvhStorageNode,r=this._matStorageNode;this._linearBuckets=pf(this.pathTracer?.materialData?.linearBuckets),sf(pf(null),this._linearBuckets);let i=this.cameraWorldMatrix,a=this.cameraProjectionMatrixInverse,o=this.resolutionWidth,s=this.resolutionHeight,c=this._outputStorageTex,l=this._shadingStorageTex,u=this._leafStorageTex;this._computeNode=(0,n.Fn)(([i,a])=>{let d=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(o)).and(f.lessThan((0,n.int)(s))),()=>{let p=di($g((0,n.vec2)((0,n.float)(d).add(.5).div(o),(0,n.float)(f).add(.5).div(s)),i,a,this.cameraRay)),m=gi.wrap(b_(p,t,e)),h=m.normal.mul(.5).add(.5),g=(0,n.min)(m.dst,(0,n.float)(65504)),_=m.didHit.select((0,n.vec4)(h,g),(0,n.vec4)(0,0,0,(0,n.float)(65504)));(0,n.textureStore)(c,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),_).toWriteOnly(),u&&(0,n.textureStore)(u,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),(0,n.uvec4)((0,n.uint)(m.instanceLeaf.add(1)),0,0,0)).toWriteOnly();let v=m.normal.toVar(),y=(0,n.float)(1).toVar();(0,n.If)(m.didHit,()=>{let i=fi.wrap(ra(m.materialIndex,r)).toVar(),a=Ti.wrap(yf(m.uv,i)).toVar(),o=(0,n.vec4)(0).toVar();(0,n.If)(i.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{o.assign(Cf(e,m.triangleIndex,m.normal,i.normalTransform,t,m.instanceLeaf))});let s=wf(m.normal,i,a,o).toVar();v.assign(Tf(s,i,a)),y.assign(xf(i,a).y.clamp(.05,1))});let b=m.didHit.select((0,n.vec4)(v.mul(.5).add(.5),y),(0,n.vec4)(0,0,0,1));(0,n.textureStore)(l,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),b).toWriteOnly()})})(i,a).compute([this._dispatchX,this._dispatchY,1],[8,8,1]),this._computeBuilt=!0}render(e){if(!this.enabled||!this._syncStorageBuffers())return;this._computeBuilt||this._buildCompute();let t=this.pathTracer;if(t&&(this.cameraWorldMatrix.value.copy(t.uniforms.get(`cameraWorldMatrix`).value),this.cameraProjectionMatrixInverse.value.copy(t.uniforms.get(`cameraProjectionMatrixInverse`).value),this.cameraRay.sync(t.uniforms)),!this._dirty&&this._hasHistory){let t=this._currentIdx===0?this._rtA:this._rtB;e.setTexture(`pathtracer:normalDepth`,t.texture),e.setTexture(`pathtracer:prevNormalDepth`,t.texture),e.setTexture(`pathtracer:shadingNormal`,this._shadingRT.texture),this._publishLeaf(e);return}let n=e.getTexture(`pathtracer:color`);if(n&&n.image){let e=n.image;e.width>0&&e.height>0&&(e.width!==this._rtA.width||e.height!==this._rtA.height)&&this.setSize(e.width,e.height)}this._hasHistory&&(this._currentIdx=1-this._currentIdx);let r=this._currentIdx===0?this._rtA:this._rtB,i=this._currentIdx===0?this._rtB:this._rtA;this.renderer.compute(this._computeNode),this._srcRegion.max.set(r.width,r.height),this.renderer.copyTextureToTexture(this._outputStorageTex,r.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._shadingStorageTex,this._shadingRT.texture,this._srcRegion),this._leafRT&&this.renderer.copyTextureToTexture(this._leafStorageTex,this._leafRT.texture,this._srcRegion),this._hasHistory||=(this.renderer.copyTextureToTexture(this._outputStorageTex,i.texture,this._srcRegion),!0),e.setTexture(`pathtracer:normalDepth`,r.texture),e.setTexture(`pathtracer:prevNormalDepth`,i.texture),e.setTexture(`pathtracer:shadingNormal`,this._shadingRT.texture),this._publishLeaf(e),this._dirty=!1}releaseGPUMemory(){this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._leafStorageTex?.dispose(),this.reset(),this._hasHistory=!1}reset(){this._dirty=!0}setSize(e,t){this._rtA.setSize(e,t),this._rtA.texture.needsUpdate=!0,this._rtB.setSize(e,t),this._rtB.texture.needsUpdate=!0,this._shadingRT.setSize(e,t),this._shadingRT.texture.needsUpdate=!0,this._leafRT&&(this._leafRT.setSize(e,t),this._leafRT.texture.needsUpdate=!0),this._hasHistory=!1,this.resolutionWidth.value=e,this.resolutionHeight.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._computeNode&&(this._computeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]),this._dirty=!0}reallocateReservedStorage(){this._computeNode?.dispose(),this._computeNode=null,this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e};this._outputStorageTex=e(),this._shadingStorageTex=e(),this._leafStorageTex&&=(this._leafStorageTex.dispose(),this._makeLeafStorage()),this._computeBuilt=!1}setInstanceLeafOutput(e){e=!!e,e!==!!this._leafStorageTex&&(this._computeNode?.dispose(),this._computeNode=null,this._computeBuilt=!1,this._dirty=!0,e?(this._leafStorageTex=this._makeLeafStorage(),this._leafRT=new t.RenderTarget(this._rtA.width,this._rtA.height,{type:r.UnsignedIntType,format:r.RedIntegerFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1})):(this._leafStorageTex.dispose(),this._leafRT.dispose(),this._leafStorageTex=null,this._leafRT=null))}_publishLeaf(e){this._leafRT?e.setTexture(`pathtracer:instanceLeaf`,this._leafRT.texture):e.getTexture(`pathtracer:instanceLeaf`)&&e.removeTexture(`pathtracer:instanceLeaf`)}_makeLeafStorage(){let e=new t.StorageTexture(W,W);return e.type=r.UnsignedIntType,e.format=r.RedIntegerFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e}dispose(){this._computeNode?.dispose(),this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._shadingRT?.dispose(),this._leafStorageTex?.dispose(),this._leafRT?.dispose(),this._rtA?.dispose(),this._rtB?.dispose()}},ly=class extends xe{constructor(e,i,a={}){super(`MotionVector`,{...a,executionMode:z.ALWAYS}),this.renderer=e,this.camera=i,this.pathTracer=a.pathTracer||null;let o=a.width||1,s=a.height||1;this.prevViewProjectionMatrix=new r.Matrix4,this.currentViewProjectionMatrix=new r.Matrix4,this.matricesInitialized=!1,this.isFirstFrame=!0,this.frameCount=0,this.cameraWorldMatrix=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraProjectionMatrixInverse=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraRay=Qg(),this.prevVP=(0,n.uniform)(new r.Matrix4,`mat4`),this.isFirstFrameU=(0,n.uniform)(1),this.deltaTime=(0,n.uniform)(1/60),this.velocityScale=(0,n.uniform)(1),this.resolutionWidth=(0,n.uniform)(o),this.resolutionHeight=(0,n.uniform)(s),this._normalDepthTexNode=new t.TextureNode,this._screenSpaceStorageTex=new t.StorageTexture(W,W),this._screenSpaceStorageTex.type=r.HalfFloatType,this._screenSpaceStorageTex.format=r.RGBAFormat,this._screenSpaceStorageTex.minFilter=r.NearestFilter,this._screenSpaceStorageTex.magFilter=r.NearestFilter,this._worldSpaceStorageTex=new t.StorageTexture(W,W),this._worldSpaceStorageTex.type=r.HalfFloatType,this._worldSpaceStorageTex.format=r.RGBAFormat,this._worldSpaceStorageTex.minFilter=r.NearestFilter,this._worldSpaceStorageTex.magFilter=r.NearestFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0));let c={type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this.screenSpaceTarget=new t.RenderTarget(o,s,c),this.worldSpaceTarget=new t.RenderTarget(o,s,c),this._dispatchX=Math.ceil(o/16),this._dispatchY=Math.ceil(s/16),this._buildScreenSpaceCompute(),this._buildWorldSpaceCompute()}_buildScreenSpaceCompute(){let e=this._normalDepthTexNode,t=this.cameraWorldMatrix,r=this.cameraProjectionMatrixInverse,i=this.prevVP,a=this.resolutionWidth,o=this.resolutionHeight,s=this._screenSpaceStorageTex;this._screenSpaceComputeNode=(0,n.Fn)(([t,r])=>{let c=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),l=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(c.lessThan((0,n.int)(a)).and(l.lessThan((0,n.int)(o))),()=>{let u=(0,n.textureLoad)(e,(0,n.ivec2)(c,l)).w,d=(0,n.vec2)((0,n.float)(c).add(.5).div(a),(0,n.float)(l).add(.5).div(o)),f=(0,n.vec4)(0,0,u,1).toVar();(0,n.If)(u.lessThan((0,n.float)(6e4)),()=>{let e=e_(d,u,t,r,this.cameraRay),a=i.mul((0,n.vec4)(e,1)),o=a.xy.div(a.w),s=(0,n.vec2)(o.x.mul(.5).add(.5),o.y.mul(-.5).add(.5)),c=d.sub(s),l=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1));f.assign(l.select((0,n.vec4)(c,u,1),(0,n.vec4)((0,n.float)(1e3),(0,n.float)(1e3),u,0)))}),(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(c),(0,n.uint)(l)),f).toWriteOnly()})})(t,r).compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_buildWorldSpaceCompute(){let e=this._normalDepthTexNode,t=this.cameraWorldMatrix,r=this.cameraProjectionMatrixInverse,i=this.prevVP,a=this.isFirstFrameU,o=this.deltaTime,s=this.velocityScale,c=this.resolutionWidth,l=this.resolutionHeight,u=this._worldSpaceStorageTex;this._worldSpaceComputeNode=(0,n.Fn)(([t,r])=>{let d=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(c)).and(f.lessThan((0,n.int)(l))),()=>{let p=(0,n.textureLoad)(e,(0,n.ivec2)(d,f)).w,m=(0,n.vec4)(0,0,0,0).toVar();(0,n.If)(a.lessThan(.5).and(p.lessThan((0,n.float)(6e4))),()=>{let e=(0,n.vec2)((0,n.float)(d).add(.5).div(c),(0,n.float)(f).add(.5).div(l)),a=e_(e,p,t,r,this.cameraRay),u=i.mul((0,n.vec4)(a,1)),h=u.xy.div(u.w),g=(0,n.vec2)(h.x.mul(.5).add(.5),h.y.mul(-.5).add(.5)),_=g.x.greaterThanEqual(0).and(g.x.lessThanEqual(1)).and(g.y.greaterThanEqual(0)).and(g.y.lessThanEqual(1)),v=e.sub(g),y=(0,n.vec3)(v.x.div(o).mul(s),v.y.div(o).mul(s),0);m.assign(_.select((0,n.vec4)(y,1),(0,n.vec4)(0,0,0,.5)))}),(0,n.textureStore)(u,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),m).toWriteOnly()})})(t,r).compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_updateCameraMatrices(){let e=this.pathTracer,t,n,r,i;if(e&&e.uniforms)this.cameraRay.sync(e.uniforms),t=e.uniforms.get(`cameraWorldMatrix`).value,n=e.uniforms.get(`cameraViewMatrix`).value,r=e.uniforms.get(`cameraProjectionMatrix`).value,i=e.uniforms.get(`cameraProjectionMatrixInverse`).value;else{let e=this.camera;if(!e)return;t=e.matrixWorld,n=e.matrixWorldInverse,r=e.projectionMatrix,i=e.projectionMatrixInverse}this.matricesInitialized?this.prevViewProjectionMatrix.copy(this.currentViewProjectionMatrix):(this.currentViewProjectionMatrix.multiplyMatrices(r,n),this.prevViewProjectionMatrix.copy(this.currentViewProjectionMatrix),this.matricesInitialized=!0),this.currentViewProjectionMatrix.multiplyMatrices(r,n),this.cameraWorldMatrix.value.copy(t),this.cameraProjectionMatrixInverse.value.copy(i),this.prevVP.value.copy(this.prevViewProjectionMatrix)}setupEventListeners(){this.on(`pipeline:reset`,()=>{this.reset()})}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:normalDepth`);if(!t)return;this._updateCameraMatrices(),this.isFirstFrameU.value=+!!this.isFirstFrame,this.frameCount++;let n=t.image;n&&n.width>0&&n.height>0&&(n.width!==this.screenSpaceTarget.width||n.height!==this.screenSpaceTarget.height)&&this.setSize(n.width,n.height),this._normalDepthTexNode.value=t,this.renderer.compute(this._screenSpaceComputeNode),this.renderer.compute(this._worldSpaceComputeNode),this._srcRegion.max.set(this.screenSpaceTarget.width,this.screenSpaceTarget.height),this.renderer.copyTextureToTexture(this._screenSpaceStorageTex,this.screenSpaceTarget.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._worldSpaceStorageTex,this.worldSpaceTarget.texture,this._srcRegion),e.setTexture(`motionVector:screenSpace`,this.screenSpaceTarget.texture),e.setTexture(`motionVector:worldSpace`,this.worldSpaceTarget.texture),e.setTexture(`motionVector:motion`,this.screenSpaceTarget.texture),this.emit(`motionvector:computed`,{frame:this.frameCount,isFirstFrame:this.isFirstFrame}),this.isFirstFrame=!1}releaseGPUMemory(){this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose(),this.reset()}reset(){this.matricesInitialized||(this.isFirstFrame=!0),this.frameCount=0}setSize(e,t){this.screenSpaceTarget.setSize(e,t),this.screenSpaceTarget.texture.needsUpdate=!0,this.worldSpaceTarget.setSize(e,t),this.worldSpaceTarget.texture.needsUpdate=!0,this.resolutionWidth.value=e,this.resolutionHeight.value=t,this._dispatchX=Math.ceil(e/16),this._dispatchY=Math.ceil(t/16),this._screenSpaceComputeNode&&(this._screenSpaceComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]),this._worldSpaceComputeNode&&(this._worldSpaceComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1])}setVelocityScale(e){this.velocityScale.value=e}setDeltaTime(e){this.deltaTime.value=e}reallocateReservedStorage(){this._screenSpaceComputeNode?.dispose(),this._worldSpaceComputeNode?.dispose(),this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e};this._screenSpaceStorageTex=e(),this._worldSpaceStorageTex=e(),this._buildScreenSpaceCompute(),this._buildWorldSpaceCompute()}dispose(){this._screenSpaceComputeNode?.dispose(),this._worldSpaceComputeNode?.dispose(),this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose(),this.screenSpaceTarget?.dispose(),this.worldSpaceTarget?.dispose(),this._normalDepthTexNode?.dispose()}},uy=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),dy=e=>(0,n.vec3)(uy(e.x),uy(e.y),uy(e.z)),fy=class extends xe{constructor(e,i={}){super(`ASVGF`,{...i,executionMode:z.PER_CYCLE}),this.renderer=e,this.temporalAlpha=(0,n.uniform)(i.temporalAlpha??0),this.gradientStrength=(0,n.uniform)(i.gradientStrength??1),this.gradientSigmaScale=(0,n.uniform)(i.gradientSigmaScale??2),this.gradientNoiseFloor=(0,n.uniform)(i.gradientNoiseFloor??0),this.maxAccumFrames=(0,n.uniform)(i.maxAccumFrames??32),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this.temporalEnabledU=(0,n.uniform)(1),this.forceResetU=(0,n.uniform)(0),this._colorTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._motionTexNode=new t.TextureNode,this._normalDepthTexNode=new t.TextureNode,this._prevNormalDepthTexNode=new t.TextureNode,this._readTemporalTexNode=new t.TextureNode,this._gradientReadTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._temporalTexA=new t.StorageTexture(W,W),this._temporalTexA.type=r.FloatType,this._temporalTexA.format=r.RGBAFormat,this._temporalTexA.minFilter=r.LinearFilter,this._temporalTexA.magFilter=r.LinearFilter,this._temporalTexB=new t.StorageTexture(W,W),this._temporalTexB.type=r.FloatType,this._temporalTexB.format=r.RGBAFormat,this._temporalTexB.minFilter=r.LinearFilter,this._temporalTexB.magFilter=r.LinearFilter,this._outputModulatedTex=new t.StorageTexture(W,W),this._outputModulatedTex.type=r.FloatType,this._outputModulatedTex.format=r.RGBAFormat,this._outputModulatedTex.minFilter=r.LinearFilter,this._outputModulatedTex.magFilter=r.LinearFilter,this._gradientStorageTex=new t.StorageTexture(W,W),this._gradientStorageTex.type=r.HalfFloatType,this._gradientStorageTex.format=r.RGBAFormat,this._gradientStorageTex.minFilter=r.LinearFilter,this._gradientStorageTex.magFilter=r.LinearFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this._demodulatedRT=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._outputRT=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._gradientRT=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this.currentMoments=0,this._compiled=!1,this._needsWarmReset=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._buildGradientCompute(),this._buildTemporalCompute(),this.showHeatmap=!1,this.debugMode=(0,n.uniform)(0,`int`),this._heatmapStorageTex=new t.StorageTexture(W,W),this._heatmapStorageTex.type=r.FloatType,this._heatmapStorageTex.format=r.RGBAFormat,this._heatmapStorageTex.minFilter=r.NearestFilter,this._heatmapStorageTex.magFilter=r.NearestFilter,this.heatmapTarget=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1}),this._heatmapRawColorTexNode=new t.TextureNode,this._heatmapColorTexNode=new t.TextureNode,this._heatmapTemporalTexNode=new t.TextureNode,this._heatmapNDTexNode=new t.TextureNode,this._heatmapMotionTexNode=new t.TextureNode,this._heatmapGradientTexNode=new t.TextureNode,this._buildHeatmapCompute()}_buildGradientCompute(){let e=this._colorTexNode,t=this._albedoTexNode,r=this._motionTexNode,i=this._readTemporalTexNode,a=this.gradientNoiseFloor,o=this.gradientSigmaScale,s=this._gradientStorageTex,c=this.resW,l=this.resH,u=(0,n.workgroupArray)(`float`,144),d=(0,n.workgroupArray)(`float`,144);this._gradientNode=(0,n.Fn)(()=>{let f=n.localId.x,p=n.localId.y,m=p.mul(8).add(f),h=(0,n.int)(n.workgroupId.x).mul(8).sub(2).toVar(),g=(0,n.int)(n.workgroupId.y).mul(8).sub(2).toVar(),_=a=>{let o=a.mod((0,n.uint)(12)),s=a.div((0,n.uint)(12)),f=h.add((0,n.int)(o)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),p=g.add((0,n.int)(s)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),m=(0,n.textureLoad)(e,(0,n.ivec2)(f,p)).xyz,_=(0,n.textureLoad)(t,(0,n.ivec2)(f,p)).xyz,v=Ui(dy(m.div((0,n.max)(_,(0,n.vec3)(Xe))))).toVar();u.element(a).assign(v);let y=(0,n.textureLoad)(r,(0,n.ivec2)(f,p)),b=(0,n.float)(f).sub(y.x.mul(c)),x=(0,n.float)(p).sub(y.y.mul(l)),S=(0,n.int)(b.add(.5)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),C=(0,n.int)(x.add(.5)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),w=y.w.greaterThan(.5),T=(0,n.textureLoad)(i,(0,n.ivec2)(S,C)).xyz,E=w.select(Ui(T),v);d.element(a).assign(E)};_(m);let v=m.add((0,n.uint)(64));(0,n.If)(v.lessThan((0,n.uint)(144)),()=>{_(v)});let y=m.add((0,n.uint)(128));(0,n.If)(y.lessThan((0,n.uint)(144)),()=>{_(y)}),(0,n.workgroupBarrier)();let b=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(f)),x=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(p));(0,n.If)(b.lessThan((0,n.int)(c)).and(x.lessThan((0,n.int)(l))),()=>{let e=(0,n.float)(0).toVar(),t=(0,n.float)(0).toVar();for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++){let a=p.add((0,n.uint)(2+r)).mul((0,n.uint)(12)).add(f.add((0,n.uint)(2+i))),o=u.element(a);e.addAssign(o),t.addAssign(o.mul(o))}let m=e.div(25),h=(0,n.sqrt)((0,n.max)(t.div(25).sub(m.mul(m)),(0,n.float)(0))).mul(o).toVar(),g=(0,n.float)(0).toVar();for(let e=-2;e<=2;e++)for(let t=-2;t<=2;t++){let r=p.add((0,n.uint)(2+e)).mul((0,n.uint)(12)).add(f.add((0,n.uint)(2+t))),i=u.element(r),o=d.element(r),s=(0,n.max)((0,n.max)((0,n.abs)(i.sub(o)).sub(h),(0,n.float)(0)).div((0,n.max)((0,n.max)(i,o),(0,n.float)(.001))).sub(a),(0,n.float)(0)).div((0,n.max)((0,n.float)(1).sub(a),(0,n.float)(1e-4)));g.addAssign(s.mul(s))}let _=g.div(25).clamp(0,1).toVar(),v=(0,n.textureLoad)(r,(0,n.ivec2)(b,x)),y=(0,n.int)((0,n.float)(b).sub(v.x.mul(c)).add(.5)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),S=(0,n.int)((0,n.float)(x).sub(v.y.mul(l)).add(.5)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),C=v.w.greaterThan(.5).select((0,n.textureLoad)(i,(0,n.ivec2)(y,S)).w,(0,n.float)(0)).div(4).clamp(0,1),w=_.mul(C);(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(b),(0,n.uint)(x)),(0,n.vec4)(w,_,h,1)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}_buildTemporalCompute(){this._temporalNodeA=this._buildTemporalForDirection(this._temporalTexA),this._temporalNodeB=this._buildTemporalForDirection(this._temporalTexB)}_buildTemporalForDirection(e){let t=this._colorTexNode,r=this._albedoTexNode,i=this._motionTexNode,a=this._normalDepthTexNode,o=this._prevNormalDepthTexNode,s=this._readTemporalTexNode,c=this._gradientReadTexNode,l=this._outputModulatedTex,u=this.maxAccumFrames,d=this.temporalAlpha,f=this.gradientStrength,p=this.temporalEnabledU,m=this.forceResetU,h=this.resW,g=this.resH;return(0,n.Fn)(()=>{let _=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),v=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(_.lessThan((0,n.int)(h)).and(v.lessThan((0,n.int)(g))),()=>{let y=(0,n.ivec2)(_,v),b=(0,n.textureLoad)(t,y),x=b.xyz,S=b.w,C=(0,n.textureLoad)(r,y).xyz,w=(0,n.max)(C,(0,n.vec3)(Xe)),T=dy(x.div(w)),E=(0,n.vec4)(T,1).toVar(),D=(0,n.vec4)(x,S).toVar();(0,n.If)(p.greaterThan(.5).and(m.lessThan(.5)),()=>{let e=(0,n.textureLoad)(i,y),t=e.w.greaterThan(.5),r=(0,n.float)(_).sub(e.x.mul(h)),l=(0,n.float)(v).sub(e.y.mul(g)),p=r.greaterThanEqual(0).and(r.lessThan((0,n.float)(h))).and(l.greaterThanEqual(0)).and(l.lessThan((0,n.float)(g)));(0,n.If)(t.and(p),()=>{let e=(0,n.textureLoad)(a,y),t=e.xyz.mul(2).sub(1),i=e.w,p=(0,n.int)(r),m=(0,n.int)(l),_=p.add((0,n.int)(1)),v=m.add((0,n.int)(1)),b=r.sub((0,n.float)(p)),x=l.sub((0,n.float)(m)),C=p.clamp((0,n.int)(0),(0,n.int)(h).sub(1)),O=_.clamp((0,n.int)(0),(0,n.int)(h).sub(1)),k=m.clamp((0,n.int)(0),(0,n.int)(g).sub(1)),A=v.clamp((0,n.int)(0),(0,n.int)(g).sub(1)),j=(0,n.float)(1).sub(b).mul((0,n.float)(1).sub(x)),M=b.mul((0,n.float)(1).sub(x)),N=(0,n.float)(1).sub(b).mul(x),P=b.mul(x),F=(e,r,a)=>{let s=(0,n.textureLoad)(o,(0,n.ivec2)(e,r)),c=s.xyz.mul(2).sub(1),l=s.w,u=(0,n.pow)((0,n.dot)(t,c).clamp(0,1),(0,n.float)(16)),d=(0,n.exp)((0,n.abs)(i.sub(l)).div((0,n.max)(i,(0,n.float)(.001))).div((0,n.float)(.05)).negate());return a.mul(u).mul(d)},I=F(C,k,j),L=F(O,k,M),ee=F(C,A,N),te=F(O,A,P),ne=I.add(L).add(ee).add(te);(0,n.If)(ne.greaterThan((0,n.float)(.01)),()=>{let e=(0,n.textureLoad)(s,(0,n.ivec2)(C,k)),t=(0,n.textureLoad)(s,(0,n.ivec2)(O,k)),r=(0,n.textureLoad)(s,(0,n.ivec2)(C,A)),i=(0,n.textureLoad)(s,(0,n.ivec2)(O,A)),a=(0,n.float)(1).div(ne),o=e.xyz.mul(I).add(t.xyz.mul(L)).add(r.xyz.mul(ee)).add(i.xyz.mul(te)).mul(a),l=e.w.mul(I).add(t.w.mul(L)).add(r.w.mul(ee)).add(i.w.mul(te)).mul(a),p=(0,n.textureLoad)(c,y).x.mul(f).clamp(0,1),m=dy((0,n.mix)(o,T,(0,n.mix)((0,n.max)((0,n.float)(1).div(l.add(1)),d),(0,n.float)(1),p))),h=(0,n.min)(l.add(1),u);E.assign((0,n.vec4)(m,h)),D.assign((0,n.vec4)(m.mul(w),S))})})}),(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(_),(0,n.uint)(v)),E).toWriteOnly(),(0,n.textureStore)(l,(0,n.uvec2)((0,n.uint)(_),(0,n.uint)(v)),D).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}_buildHeatmapCompute(){let e=this._heatmapRawColorTexNode,t=this._heatmapColorTexNode,r=this._heatmapTemporalTexNode,i=this._heatmapNDTexNode,a=this._heatmapMotionTexNode,o=this._heatmapGradientTexNode,s=this._heatmapStorageTex,c=this.debugMode,l=this.resW,u=this.resH;this._heatmapComputeNode=(0,n.Fn)(()=>{let d=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(l)).and(f.lessThan((0,n.int)(u))),()=>{let p=(0,n.ivec2)(d,f),m=(0,n.vec4)(0,0,0,1).toVar();(0,n.If)(c.equal((0,n.int)(0)),()=>{let e=(0,n.textureLoad)(t,p).xyz;m.assign((0,n.vec4)(e,1))}).ElseIf(c.equal((0,n.int)(1)),()=>{let t=(0,n.float)(0).toVar(),r=(0,n.float)(0).toVar();for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){let o=(0,n.textureLoad)(e,(0,n.ivec2)(d.add(a).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),f.add(i).clamp((0,n.int)(0),(0,n.int)(u).sub(1)))).xyz,s=Ui(o);t.addAssign(s),r.addAssign(s.mul(s))}t.divAssign(9),r.divAssign(9);let i=(0,n.max)(r.sub(t.mul(t)),(0,n.float)(0)).div((0,n.max)(t.mul(t),(0,n.float)(1e-4))).mul(10).clamp(0,1),a=i.sub(.5).mul(4).clamp(0,1),o=i.mul(4).clamp(0,1).sub(i.sub(.75).mul(4).clamp(0,1)),s=(0,n.float)(1).sub(i.sub(.25).mul(4).clamp(0,1));m.assign((0,n.vec4)(a,o,s,1))}).ElseIf(c.equal((0,n.int)(2)),()=>{let e=(0,n.textureLoad)(r,p).w.div(32).clamp(0,1);m.assign((0,n.vec4)((0,n.float)(1).sub(e),e,(0,n.float)(.2),1))}).ElseIf(c.equal((0,n.int)(3)),()=>{let e=(0,n.textureLoad)(a,p),t=(0,n.abs)(e.x).mul(100).clamp(0,1),r=(0,n.abs)(e.y).mul(100).clamp(0,1),i=t.add(r).clamp(0,1);m.assign((0,n.vec4)(t,r,i.mul(.3),1))}).ElseIf(c.equal((0,n.int)(4)),()=>{let e=(0,n.textureLoad)(i,p);m.assign((0,n.vec4)(e.xyz,1))}).Else(()=>{let e=(0,n.textureLoad)(o,p).x.mul(5).clamp(0,1);m.assign((0,n.vec4)(e,e.mul(.5),(0,n.float)(1).sub(e),1))}),(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),m).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}setupEventListeners(){this.on(`asvgf:reset`,()=>this.resetTemporalData()),this.on(`asvgf:updateParameters`,e=>this.updateParameters(e))}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:albedo`),r=e.getTexture(`pathtracer:normalDepth`),i=e.getTexture(`pathtracer:prevNormalDepth`)||r,a=e.getTexture(`motionVector:screenSpace`);if(!t)return;let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this._outputRT.width||o.height!==this._outputRT.height)&&this.setSize(o.width,o.height),this._colorTexNode.value=t,n&&(this._albedoTexNode.value=n),a&&(this._motionTexNode.value=a),r&&(this._normalDepthTexNode.value=r),i&&(this._prevNormalDepthTexNode.value=i);let s=this.currentMoments===0?this._temporalTexB:this._temporalTexA,c=this.currentMoments===0?this._temporalNodeA:this._temporalNodeB,l=this.currentMoments===0?this._temporalTexA:this._temporalTexB;this._compiled||=(this.renderer.compute(this._gradientNode),this.renderer.compute(this._temporalNodeA),this.renderer.compute(this._temporalNodeB),!0),this._readTemporalTexNode.value=s,this._gradientReadTexNode.value=this._gradientStorageTex;let u=this.gradientStrength.value>0||this.showHeatmap;u&&this.renderer.compute(this._gradientNode),this.forceResetU.value=+!!this._needsWarmReset,this.renderer.compute(c),this._needsWarmReset=!1,this._srcRegion.max.set(this.resW.value,this.resH.value),this.renderer.copyTextureToTexture(l,this._demodulatedRT.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._outputModulatedTex,this._outputRT.texture,this._srcRegion),u&&this.renderer.copyTextureToTexture(this._gradientStorageTex,this._gradientRT.texture,this._srcRegion),e.setTexture(`asvgf:demodulated`,this._demodulatedRT.texture),e.setTexture(`asvgf:output`,this._outputRT.texture),e.setTexture(`asvgf:gradient`,this._gradientRT.texture),this.currentMoments=1-this.currentMoments,this.showHeatmap&&(this._heatmapRawColorTexNode.value=t,this._heatmapColorTexNode.value=this._outputModulatedTex,this._heatmapTemporalTexNode.value=l,r&&(this._heatmapNDTexNode.value=r),a&&(this._heatmapMotionTexNode.value=a),this._heatmapGradientTexNode.value=this._gradientStorageTex,this.renderer.compute(this._heatmapComputeNode),this._srcRegion.max.set(this.heatmapTarget.width,this.heatmapTarget.height),this.renderer.copyTextureToTexture(this._heatmapStorageTex,this.heatmapTarget.texture,this._srcRegion))}setHeatmapEnabled(e){this.showHeatmap=e}setTemporalEnabled(e){this.temporalEnabledU.value=+!!e}updateParameters(e){e&&(e.temporalAlpha!==void 0&&(this.temporalAlpha.value=e.temporalAlpha),e.gradientStrength!==void 0&&(this.gradientStrength.value=e.gradientStrength),e.gradientSigmaScale!==void 0&&(this.gradientSigmaScale.value=e.gradientSigmaScale),e.gradientNoiseFloor!==void 0&&(this.gradientNoiseFloor.value=e.gradientNoiseFloor),e.maxAccumFrames!==void 0&&(this.maxAccumFrames.value=e.maxAccumFrames),e.debugMode!==void 0&&(this.debugMode.value=e.debugMode))}resetTemporalData(){this.currentMoments=0,this._needsWarmReset=!0}reallocateReservedStorage(){this._gradientNode?.dispose(),this._temporalNodeA?.dispose(),this._temporalNodeB?.dispose(),this._heatmapComputeNode?.dispose(),this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._heatmapStorageTex?.dispose();let e=(e,n)=>{let i=new t.StorageTexture(W,W);return i.type=e,i.format=r.RGBAFormat,i.minFilter=n,i.magFilter=n,i};this._temporalTexA=e(r.FloatType,r.LinearFilter),this._temporalTexB=e(r.FloatType,r.LinearFilter),this._outputModulatedTex=e(r.FloatType,r.LinearFilter),this._gradientStorageTex=e(r.HalfFloatType,r.LinearFilter),this._heatmapStorageTex=e(r.FloatType,r.NearestFilter),this._buildGradientCompute(),this._buildTemporalCompute(),this._buildHeatmapCompute(),this._compiled=!1,this.currentMoments=0,this._needsWarmReset=!0}setSize(e,t){this._demodulatedRT.setSize(e,t),this._demodulatedRT.texture.needsUpdate=!0,this._outputRT.setSize(e,t),this._outputRT.texture.needsUpdate=!0,this._gradientRT.setSize(e,t),this._gradientRT.texture.needsUpdate=!0,this.heatmapTarget.setSize(e,t),this.heatmapTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._gradientNode.dispatchSize=[this._dispatchX,this._dispatchY,1],this._temporalNodeA.dispatchSize=[this._dispatchX,this._dispatchY,1],this._temporalNodeB.dispatchSize=[this._dispatchX,this._dispatchY,1],this._heatmapComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]}reset(){}releaseGPUMemory(){this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._heatmapStorageTex?.dispose(),this.context?.removeTexture(`asvgf:demodulated`),this.context?.removeTexture(`asvgf:output`),this.context?.removeTexture(`asvgf:gradient`),this._demodulatedRT?.texture?.dispose(),this._outputRT?.texture?.dispose(),this._gradientRT?.texture?.dispose(),this.heatmapTarget?.texture?.dispose(),this.resetTemporalData()}dispose(){this._gradientNode?.dispose(),this._temporalNodeA?.dispose(),this._temporalNodeB?.dispose(),this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._demodulatedRT?.dispose(),this._outputRT?.dispose(),this._gradientRT?.dispose(),this._heatmapComputeNode?.dispose(),this._heatmapStorageTex?.dispose(),this.heatmapTarget?.dispose(),this._colorTexNode?.dispose(),this._albedoTexNode?.dispose(),this._motionTexNode?.dispose(),this._normalDepthTexNode?.dispose(),this._prevNormalDepthTexNode?.dispose(),this._readTemporalTexNode?.dispose(),this._gradientReadTexNode?.dispose(),this._heatmapRawColorTexNode?.dispose(),this._heatmapColorTexNode?.dispose(),this._heatmapTemporalTexNode?.dispose(),this._heatmapNDTexNode?.dispose(),this._heatmapMotionTexNode?.dispose(),this._heatmapGradientTexNode?.dispose()}},py=1e-6,my=1.5/255,hy=.01,gy=3,_y=2,vy=2,yy=3,by=2,xy=38,Sy=.1,Cy=4,wy=Math.cos(89*Math.PI/180),Ty=.5,Ey=16,Dy={pre:{radiusScale:1,fractionScale:2},blur:{radiusScale:1,fractionScale:1},post:{radiusScale:2,fractionScale:.5}},Oy=.25*Math.SQRT2,ky=[[-1,0,1],[0,1,1],[1,0,1],[0,-1,1],[-Oy,Oy,.5],[Oy,Oy,.5],[Oy,-Oy,.5],[-Oy,-Oy,.5]],Ay=(e,t,r)=>(0,n.smoothstep)(0,1,(0,n.float)(1).sub(e.mul(t).add(r).abs())),jy=(e,t,r)=>{let i=e.mul(t).add(r).abs().mul(-gy);return(0,n.float)(1).div(i.mul(i).sub(i).add(1))},My=e=>(0,n.mix)((0,n.float)(1.570796),(0,n.float)(1.395402),(0,n.saturate)(e)).mul((0,n.sqrt)((0,n.saturate)((0,n.float)(1).sub(e)))),Ny=(e,t)=>(0,n.float)(1).sub((0,n.exp2)(e.mul(e).mul(-200))).mul((0,n.pow)((0,n.saturate)(e),t)),Py=(e,t)=>(0,n.saturate)(e).mul((0,n.sqrt)(t.div((0,n.float)(1).sub(t).add(py)))),Fy=(e,t,r,i)=>{let a=(0,n.max)((0,n.atan)(Py(r,i.mul((0,n.mix)((0,n.saturate)(t),(0,n.float)(1),e)))),(0,n.float)(my));return(0,n.float)(1).div(a)},Iy=(e,t)=>{let r=(0,n.float)(1).div((0,n.mix)((0,n.float)(hy),(0,n.float)(1),(0,n.saturate)(e.mul(t))));return(0,n.vec2)(r,e.mul(r).negate())},Ly=(e,t,r)=>{let i=(0,n.float)(1).div((0,n.mix)((0,n.float)(r),(0,n.float)(1),(0,n.mix)(e.mul(e),e,(0,n.saturate)(t))));return(0,n.vec2)(i,e.mul(i).negate())},Ry=(e,t)=>{let r=(0,n.float)(1).div(t);return(0,n.vec2)(r,e.mul(r).negate())},zy=(e,t,r,i)=>{let a=(0,n.float)(1).div(e.mul(t));return(0,n.vec2)(a,(0,n.dot)(i,r).mul(a).negate())},By=e=>(0,n.vec2)(1).sub((0,n.vec2)(1).sub((0,n.fract)(e.mul(.5)).mul(2)).abs()).min(.99999),Vy=e=>(0,n.vec3)((0,n.dot)(e,(0,n.vec3)(.25,.5,.25)),(0,n.dot)(e,(0,n.vec3)(.5,0,-.5)),(0,n.dot)(e,(0,n.vec3)(-.25,.5,-.25))),Hy=e=>{let t=e.x.sub(e.z);return(0,n.max)((0,n.vec3)(t.add(e.y),e.x.add(e.z),t.sub(e.y)),(0,n.vec3)(0))},Uy=(e,t)=>t.add(py).div(e.add(py)),Wy=(e,t)=>(0,n.vec4)(e.xyz.mul(Uy(e.x,t)),e.w),Gy=e=>(0,n.vec4)(Vy(Hy(e.xyz)),(0,n.saturate)(e.w)),Ky=(e,t)=>(0,n.sqrt)(t.sub(e.mul(e)).abs()),qy=(e,t)=>(0,n.vec2)(e.x.mul(t.x).add(e.y.mul(t.y)),e.z.mul(t.x).add(e.w.mul(t.y))),Jy=(e,t)=>(0,n.select)(e.equal(0),(0,n.vec4)(0),t);function Yy(e){let t=Math.imul(e|0,2654435761)>>>0;return t^=t>>>15,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t/4294967296}var Xy=class extends xe{constructor(e,i={}){super(`NRD`,{...i,executionMode:z.PER_CYCLE}),this.renderer=e,this.pathTracer=i.pathTracer||null,this.settings={...et,...i.settings||{}};let a=i.width||1,o=i.height||1;this.resW=(0,n.uniform)(a),this.resH=(0,n.uniform)(o),this.minRectDimMulUnproject=(0,n.uniform)(1),this.inputFrames=(0,n.uniform)(0),this.resetU=(0,n.uniform)(0),this.debugMode=(0,n.uniform)(0,`int`),this.rotPre=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.rotBlur=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.rotPost=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.camWorld=(0,n.uniform)(new r.Matrix4,`mat4`),this.camProjInv=(0,n.uniform)(new r.Matrix4,`mat4`),this.camView=(0,n.uniform)(new r.Matrix4,`mat4`),this.prevCamView=(0,n.uniform)(new r.Matrix4,`mat4`),this.camPos=(0,n.uniform)(new r.Vector3,`vec3`),this.prevCamPos=(0,n.uniform)(new r.Vector3,`vec3`),this.viewVector=(0,n.uniform)(new r.Vector3,`vec3`),this.prevViewVector=(0,n.uniform)(new r.Vector3,`vec3`),this.cameraRay=Qg(),this.u={};for(let e of[`maxAccum`,`maxFast`,`stabilizationStrength`,`historyFixFrameNum`,`historyFixStride`,`prepassBlurRadius`,`minBlurRadius`,`maxBlurRadius`,`lobeAngleFraction`,`roughnessFraction`,`planeDistSensitivity`,`minHitDistanceWeight`,`fastClampSigmaScale`,`fireflyMinRelativeScale`,`antiFirefly`,`disocclusionThreshold`,`lobeVolumePercent`,`handoverFrames`])this.u[e]=(0,n.uniform)(0);this.u.antilag=(0,n.uniform)(new r.Vector2,`vec2`),this.u.convergence=(0,n.uniform)(new r.Vector3,`vec3`),this._syncUniforms(),this._colorTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._ndTexNode=new t.TextureNode,this._snTexNode=new t.TextureNode,this._motionTexNode=new t.TextureNode,this._placeholders=new Map;let s=()=>{let e=new r.DataTexture(new Float32Array(4),1,1,r.RGBAFormat,r.FloatType);e.needsUpdate=!0;let n=new t.TextureNode(e);return this._placeholders.set(n,e),n};this._nTmpA=s(),this._nTmpB=s(),this._nHist=s(),this._nFast=s(),this._nInternal=s(),this._nGeom=s(),this._nData=s(),this._nStabRead=s(),this._allocStorage(),this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this.outputTarget=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._needsReset=!0,this._stabPing=0,this._camInitialized=!1,this._dispatchX=Math.ceil(a/Ey),this._dispatchY=Math.ceil(o/Ey),this._buildKernels()}_allocStorage(){let e=()=>on(r.HalfFloatType);this._tmpA=e(),this._tmpB=e(),this._hist=e(),this._fastHist=e(),this._internal=e(),this._geomPrev=e(),this._stabA=e(),this._stabB=e(),this._dataT=e()}_disposeStorage(){for(let e of[this._tmpA,this._tmpB,this._hist,this._fastHist,this._internal,this._geomPrev,this._stabA,this._stabB,this._dataT])e?.dispose()}_disposeKernels(){for(let e of this._kernels??[])e?.dispose()}updateParameters(e){if(e){for(let t of Object.keys(e))t===`debugMode`?this.debugMode.value=e.debugMode|0:t in et&&(this.settings[t]=e[t]);this._syncUniforms()}}_syncUniforms(){let e=this.settings,t=this.u,n=Math.min(e.maxAccumulatedFrameNum,63),r=Math.min(e.maxStabilizedFrameNum,n),i=Math.max(e.maxBlurRadius,e.minBlurRadius);t.maxAccum.value=n,t.maxFast.value=e.maxFastAccumulatedFrameNum,t.stabilizationStrength.value=r/(1+r),t.historyFixFrameNum.value=e.historyFixFrameNum,t.historyFixStride.value=e.historyFixBasePixelStride,t.prepassBlurRadius.value=e.prepassBlurRadius,t.minBlurRadius.value=e.minBlurRadius,t.maxBlurRadius.value=i,t.lobeAngleFraction.value=e.lobeAngleFraction*e.lobeAngleFraction,t.roughnessFraction.value=e.roughnessFraction,t.planeDistSensitivity.value=e.planeDistanceSensitivity,t.minHitDistanceWeight.value=e.minHitDistanceWeight;let a=Math.min(1,Math.max(0,i/2));t.fastClampSigmaScale.value=3+(e.fastHistoryClampingSigmaScale-3)*a,t.fireflyMinRelativeScale.value=e.fireflySuppressorMinRelativeScale,t.antiFirefly.value=+!!e.enableAntiFirefly,t.antilag.value.set(e.antilagLuminanceSigmaScale,e.antilagLuminanceSensitivity),t.disocclusionThreshold.value=e.disocclusionThreshold,t.convergence.value.set(e.convergenceS,e.convergenceB,e.convergenceP),t.lobeVolumePercent.value=e.lobeVolumePercent,t.handoverFrames.value=e.handoverFrames>0?e.handoverFrames:2*n}_worldPosAt(e,t,n,r){return e_(e,t,n,r,this.cameraRay)}_viewVector(e,t,r){return(0,n.select)(Zg(this.cameraRay.cameraProjection),r,(0,n.normalize)(t.sub(e)))}_frustumSize(e){return this.minRectDimMulUnproject.mul((0,n.select)(Zg(this.cameraRay.cameraProjection),(0,n.float)(1),e))}_pixelUv(e,t){return(0,n.vec2)((0,n.float)(e).add(.5).div(this.resW),(0,n.float)(t).add(.5).div(this.resH))}_clampCoord(e,t){return(0,n.ivec2)(e.clamp((0,n.int)(0),(0,n.int)(this.resW).sub(1)),t.clamp((0,n.int)(0),(0,n.int)(this.resH).sub(1)))}_uvToCoord(e){return this._clampCoord((0,n.int)(e.x.mul(this.resW)),(0,n.int)(e.y.mul(this.resH)))}_advancedNonLinear(e){let t=this.u.convergence,r=(0,n.saturate)(e.div((0,n.float)(1).add(this.u.maxAccum.mul(t.z)))),i=t.x.mul((0,n.mix)(t.y,(0,n.float)(1),r));return(0,n.float)(1).div((0,n.float)(1).add(i.mul(e)))}_handover(e){return(0,n.saturate)(e.div((0,n.max)(this.u.handoverFrames,1)))}_bilinear(e){let t=e.mul((0,n.vec2)(this.resW,this.resH)).sub(.5),r=(0,n.floor)(t),i=(0,n.saturate)(t.sub(r)),a=(0,n.int)(r.x),o=(0,n.int)(r.y),s=(e,t)=>(0,n.select)(e.greaterThanEqual((0,n.int)(0)).and(t.greaterThanEqual((0,n.int)(0))).and(e.lessThan((0,n.int)(this.resW))).and(t.lessThan((0,n.int)(this.resH))),(0,n.float)(1),(0,n.float)(0));return{f:i,taps:[this._clampCoord(a,o),this._clampCoord(a.add(1),o),this._clampCoord(a,o.add(1)),this._clampCoord(a.add(1),o.add(1))],inScreen:[s(a,o),s(a.add(1),o),s(a,o.add(1)),s(a.add(1),o.add(1))],customWeights:e=>[e[0].mul((0,n.float)(1).sub(i.x)).mul((0,n.float)(1).sub(i.y)),e[1].mul(i.x).mul((0,n.float)(1).sub(i.y)),e[2].mul((0,n.float)(1).sub(i.x)).mul(i.y),e[3].mul(i.x).mul(i.y)],filter:e=>(0,n.mix)((0,n.mix)(e[0],e[1],i.x),(0,n.mix)(e[2],e[3],i.x),i.y)}}_applyCustomWeights(e,t,r){let i=e[0].mul(t[0]).add(e[1].mul(t[1])).add(e[2].mul(t[2])).add(e[3].mul(t[3])),a=t[0].add(t[1]).add(t[2]).add(t[3]);return(0,n.select)(a.lessThan(1e-4),r,i.div((0,n.max)(a,1e-4)))}_sampleHistory(e,t,r,i,a){let o=(0,n.vec4)(0).toVar();return(0,n.If)(a,()=>{let r=(0,n.saturate)(t).mul((0,n.vec2)(this.resW,this.resH)),i=(0,n.floor)(r.sub(.5)).add(.5),a=(0,n.saturate)(r.sub(i)),s=Ty,c=a.mul(a.mul(a.mul(-s).add(2*s)).sub(s)),l=a.mul(a.mul(a.mul(2-s).sub(3-s))).add(1),u=a.mul(a.mul(a.mul(-(2-s)).add(3-2*s)).add(s)),d=a.mul(a.mul(a.mul(s).sub(s))),f=[c.x,l.x,u.x,d.x],p=[c.y,l.y,u.y,d.y],m=(0,n.int)(i.x).sub(1),h=(0,n.int)(i.y).sub(1),g=(0,n.vec4)(0).toVar(),_=(0,n.float)(0).toVar();for(let t=0;t<4;t++)for(let n=0;n<4;n++){if((n===0||n===3)&&(t===0||t===3))continue;let r=f[n].mul(p[t]);g.addAssign(e(this._clampCoord(m.add(n),h.add(t))).mul(r)),_.addAssign(r)}o.assign((0,n.select)(_.lessThan(1e-4),(0,n.vec4)(0),g.div((0,n.max)(_,1e-4))))}).Else(()=>{o.assign(this._applyCustomWeights(r.taps.map(t=>e(t)),i,(0,n.vec4)(0)))}),o}_buildKernels(){this._kPre=this._buildSpatial(`pre`),this._kTa=this._buildTemporalAccumulation(),this._kHf=this._buildHistoryFix(),this._kBlur=this._buildSpatial(`blur`),this._kPost=this._buildSpatial(`post`),this._kTsA=this._buildTemporalStabilization(this._stabA),this._kTsB=this._buildTemporalStabilization(this._stabB),this._kernels=[this._kPre,this._kTa,this._kHf,this._kBlur,this._kPost,this._kTsA,this._kTsB]}_dispatchOf(e){return e(this.camWorld,this.camProjInv).compute([this._dispatchX,this._dispatchY,1],[Ey,Ey,1])}_buildSpatial(e){let t=e===`pre`,{radiusScale:r,fractionScale:i}=Dy[e],a=this.u,o=this._colorTexNode,s=this._albedoTexNode,c=this._ndTexNode,l=this._snTexNode,u=this._nData,d=e===`blur`?this._nTmpA:this._nTmpB,f=e===`blur`?this._tmpB:t?this._tmpA:this._hist,p=this._geomPrev,m=t?this.rotPre:e===`blur`?this.rotBlur:this.rotPost,h=t?a.prepassBlurRadius:a.maxBlurRadius,g=this.camView,_=this.camPos,v=this.resW,y=this.resH,b=this.inputFrames,x=t?e=>{let t=(0,n.textureLoad)(o,e),r=(0,n.textureLoad)(s,e);return(0,n.vec4)(Vy(zi(t.xyz.div((0,n.max)(r.xyz,(0,n.vec3)(Xe))))),Ri(r.w,Li).min(1))}:e=>(0,n.textureLoad)(d,e),S=(0,n.Fn)(([o,s])=>{let d=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),S=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(v)).and(S.lessThan((0,n.int)(y))),()=>{let C=(0,n.ivec2)(d,S),w=(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(S)),T=(0,n.textureLoad)(c,C).w.toVar(),E=T.greaterThanEqual(qe),D=(0,n.textureLoad)(l,C).toVar(),O=(0,n.normalize)(D.xyz.mul(2).sub(1)).toVar(),k=D.w.clamp(.05,1).toVar(),A=(0,n.float)(qe).toVar(),j=x(C).toVar();(0,n.If)(E.not(),()=>{let e=this._pixelUv(d,S),f=this._worldPosAt(e,T,o,s).toVar();A.assign(g.mul((0,n.vec4)(f,1)).z.abs()),(0,n.If)(h.greaterThan(0),()=>{let d=(0,n.dot)(O,this._viewVector(f,_,this.viewVector)).abs().toVar(),p=this._frustumSize(A).toVar(),S=b.add(1),w=t?(0,n.max)(b,(0,n.float)(10)):(0,n.textureLoad)(u,C).y.add(b),T=(t?(0,n.float)(1).div(w.add(1)):this._advancedNonLinear(w)).toVar(),E=Ny(k,.5).toVar(),D=A.mul(Ye).add(3),M=j.w.toVar(),N=(0,n.saturate)(M.mul(D).div(p)),P=(0,n.float)(1).sub(this._handover(S)),F=(t?N.div(S):N.mul(T)).mul(P),I=a.minBlurRadius.mul((0,n.saturate)((0,n.float)(2).sub(w.div((0,n.max)(a.maxAccum,1))))),L=(0,n.max)((0,n.saturate)((0,n.sqrt)((0,n.saturate)(F)).mul(r)).mul(h).mul(E),I.mul(E)).toVar(),ee=zy(a.planeDistSensitivity,p,f,O).toVar(),te=Fy(T,a.lobeAngleFraction,k,a.lobeVolumePercent).div(i).toVar(),ne=Iy(k,a.roughnessFraction.mul(i)).toVar(),re=Ry(M,T).toVar(),ie=a.minHitDistanceWeight.mul(i).mul(E);t||(ie=ie.mul(T)),ie=ie.toVar();let R=(0,n.vec2)(1);if(!t){let e=g.mul((0,n.vec4)(O,0)).xy;R=(0,n.mix)((0,n.vec2)(1).sub(e.abs()),(0,n.vec2)(1),d),R=R.div((0,n.max)(R.x,R.y))}let ae=R.mul((0,n.vec2)((0,n.float)(1).div(v),(0,n.float)(1).div(y))).mul(L).toVar(),oe=(0,n.float)(1).toVar();for(let t=0;t<ky.length;t++){let r=ky[t],i=e.add(qy(m,(0,n.vec2)(r[0],r[1])).mul(ae)),a=By(i),u=(0,n.select)(a.x.notEqual(i.x).or(a.y.notEqual(i.y)),(0,n.float)(1),(0,n.float)(Math.exp(-.66*r[2]*r[2]))).toVar(),d=this._uvToCoord(a),f=(0,n.textureLoad)(c,d).w,p=this._worldPosAt(a,f,o,s),h=(0,n.textureLoad)(l,d),g=My((0,n.dot)(O,(0,n.normalize)(h.xyz.mul(2).sub(1))));u.mulAssign(Ay(g,te,(0,n.float)(0))),u.mulAssign(Ay(h.w,ne.x,ne.y)),u.mulAssign(Ay((0,n.dot)(O,p),ee.x,ee.y)),u.assign((0,n.select)(f.greaterThanEqual(qe),(0,n.float)(0),u));let _=Jy(u,x(d));u.mulAssign(ie.add(jy(_.w,re.x,re.y))),oe.addAssign(u),j.addAssign(_.mul(u))}j.divAssign((0,n.max)(oe,1e-6)),t||j.assign((0,n.vec4)(j.xyz,M))})}),(0,n.textureStore)(f,w,j).toWriteOnly(),e===`post`&&(0,n.textureStore)(p,w,(0,n.vec4)(O,A)).toWriteOnly()})});return this._dispatchOf(S)}_buildTemporalAccumulation(){let e=this.u,t=this._ndTexNode,r=this._snTexNode,i=this._motionTexNode,a=this._nTmpA,o=this._nHist,s=this._nFast,c=this._nInternal,l=this._nGeom,u=this._tmpB,d=this._dataT,f=this.camView,p=this.prevCamView,m=this.camPos,h=this.prevCamPos,g=this.resW,_=this.resH,v=this.inputFrames,y=this.resetU,b=(0,n.Fn)(([b,x])=>{let S=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(S.lessThan((0,n.int)(g)).and(C.lessThan((0,n.int)(_))),()=>{let g=(0,n.ivec2)(S,C),_=(0,n.uvec2)((0,n.uint)(S),(0,n.uint)(C)),w=(0,n.textureLoad)(t,g).w,T=(0,n.textureLoad)(a,g).toVar();(0,n.If)(w.greaterThanEqual(qe),()=>{(0,n.textureStore)(u,_,T).toWriteOnly(),(0,n.textureStore)(d,_,(0,n.vec4)(0)).toWriteOnly(),(0,n.Return)()});let E=e.maxAccum.mul((0,n.float)(1).sub(y)).toVar(),D=e.maxFast.mul((0,n.float)(1).sub(y)).toVar(),O=(0,n.textureLoad)(r,g),k=(0,n.normalize)(O.xyz.mul(2).sub(1)).toVar(),A=O.w.clamp(.05,1).toVar(),j=this._pixelUv(S,C),M=this._worldPosAt(j,w,b,x).toVar(),N=f.mul((0,n.vec4)(M,1)).z.abs().toVar(),P=(0,n.dot)(k,this._viewVector(M,m,this.viewVector)).abs().toVar(),F=this._frustumSize(N).toVar(),I=(0,n.vec3)(0).toVar();I.addAssign(k.mul(.25));for(let e=-1;e<=0;e++)for(let i=-1;i<=0;i++){if(i===0&&e===0)continue;let a=this._clampCoord(S.add(i),C.add(e)),o=(0,n.normalize)((0,n.textureLoad)(r,a).xyz.mul(2).sub(1)),s=(0,n.textureLoad)(t,a).w.lessThan(qe);I.addAssign((0,n.select)(s,o,k).mul(.25))}let L=(0,n.textureLoad)(i,g),ee=j.sub(L.xy).toVar(),te=p.mul((0,n.vec4)(M,1)).z.abs().toVar(),ne=this._bilinear(ee),re=F.mul((0,n.saturate)(e.disocclusionThreshold.div((0,n.max)(P,.05)))).sub(py).toVar(),ie=(0,n.float)(1).sub(y),R=[],ae=[];for(let e=0;e<4;e++){let t=(0,n.textureLoad)(l,ne.taps[e]),r=(0,n.select)((0,n.dot)(t.xyz,I).greaterThan(wy),(0,n.float)(1),(0,n.float)(0)),i=(0,n.select)(t.w.sub(te).abs().lessThanEqual(re),(0,n.float)(1),(0,n.float)(0)),a=(0,n.select)(t.w.lessThan(qe),(0,n.float)(1),(0,n.float)(0));R.push(r.mul(i).mul(a).mul(ne.inScreen[e]).mul(ie).toVar()),ae.push((0,n.textureLoad)(c,ne.taps[e]).x)}let oe=ne.customWeights(R).map(e=>e.toVar()),se=R[0].add(R[1]).add(R[2]).add(R[3]).greaterThan(3.5).toVar(),ce=R[0].add(R[1].mul(2)).add(R[2].mul(4)).add(R[3].mul(8)),le=this._applyCustomWeights(ae,oe,(0,n.float)(0)).toVar(),ue=(0,n.dot)(k,this._viewVector(M,h,this.prevViewVector)).abs().add(.001).div(P.add(.001)).toVar();ue.assign((0,n.mix)((0,n.float)(.1),(0,n.float)(1),(0,n.saturate)(ue.mul(ue))));let de=(0,n.sqrt)((0,n.saturate)(ne.filter(R))).mul(ue).toVar();le.assign(le.mul((0,n.mix)(de,(0,n.float)(1),(0,n.float)(1).div(le.add(1))))),le.assign((0,n.min)(le,E));let fe=Gy(this._sampleHistory(e=>(0,n.textureLoad)(o,e),ee,ne,oe,se)).toVar(),pe=(0,n.max)(this._applyCustomWeights(ne.taps.map(e=>(0,n.textureLoad)(s,e).x),oe,(0,n.float)(0)),0).toVar(),me=v.add(1),he=this._handover(me).toVar(),ge=le.mul((0,n.float)(1).sub(he)),_e=me.div(me.add(ge)).toVar(),ve=(0,n.float)(1).div((0,n.float)(1).add(Ny(A,.25).mul(.5).mul(E))),ye=(0,n.vec4)((0,n.mix)(fe.xyz,T.xyz,_e),(0,n.mix)(fe.w,T.w,(0,n.max)(_e,ve))).toVar(),be=e.fireflyMinRelativeScale.add((0,n.float)(xy).div(le.add(1))).toVar(),z=le.mul(e.maxBlurRadius).mul(Sy).toVar();z.assign(z.div(z.add(1)).mul((0,n.float)(1).sub(he)));let xe=(0,n.mix)(ye.x,(0,n.min)(ye.x,fe.x.mul(be)),z);ye.assign(Wy(ye,xe));let Se=(0,n.float)(1.2).add((0,n.float)(1).div(le.add(1)));ye.assign((0,n.vec4)(ye.xyz,(0,n.mix)(ye.w,(0,n.min)(ye.w,fe.w.mul(Se)),z))),(0,n.textureStore)(u,_,ye).toWriteOnly();let B=(0,n.min)(le,D).mul((0,n.float)(1).sub(he)),Ce=me.div(me.add(B)),V=(0,n.mix)(pe,T.x,Ce).toVar(),we=(0,n.min)(V,fe.x.mul(be).mul(Cy));V.assign((0,n.mix)(V,we,z)),(0,n.textureStore)(d,_,(0,n.vec4)(V,le,ce,(0,n.select)(se,(0,n.float)(1),(0,n.float)(0)))).toWriteOnly()})});return this._dispatchOf(b)}_buildHistoryFix(){let e=this.u,t=this._ndTexNode,r=this._snTexNode,i=this._nTmpB,a=this._nData,o=this._tmpA,s=this._fastHist,c=this.camView,l=this.resW,u=this.resH,d=this.inputFrames,f=(0,n.Fn)(([f,p])=>{let m=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),h=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(m.lessThan((0,n.int)(l)).and(h.lessThan((0,n.int)(u))),()=>{let g=(0,n.ivec2)(m,h),_=(0,n.uvec2)((0,n.uint)(m),(0,n.uint)(h)),v=(0,n.textureLoad)(t,g).w;(0,n.If)(v.greaterThanEqual(qe),()=>{let e=(0,n.textureLoad)(i,g);(0,n.textureStore)(o,_,e).toWriteOnly(),(0,n.textureStore)(s,_,(0,n.vec4)(e.x,0,0,0)).toWriteOnly(),(0,n.Return)()});let y=(0,n.textureLoad)(a,g).toVar(),b=y.y.toVar(),x=b.add(d),S=this._handover(d.add(1)).toVar(),C=(0,n.textureLoad)(r,g),w=(0,n.normalize)(C.xyz.mul(2).sub(1)).toVar(),T=C.w.clamp(.05,1).toVar(),E=this._pixelUv(m,h),D=this._worldPosAt(E,v,f,p).toVar(),O=c.mul((0,n.vec4)(D,1)).z.abs(),k=this._frustumSize(O).toVar(),A=(0,n.textureLoad)(i,g).toVar(),j=(0,n.float)(1).div(x.add(1)).toVar(),M=O.mul(Ye).add(3),N=(0,n.saturate)(A.w.mul(M).div(k)),P=A.w.toVar(),F=(0,n.round)((0,n.select)(x.lessThan(e.historyFixFrameNum),(0,n.float)(1),(0,n.float)(0)).mul(.5).mul(2/_y).mul(e.historyFixStride).mul((0,n.mix)((0,n.float)(.25).add((0,n.sqrt)(N).mul(.75)),(0,n.float)(1),j))).toVar();(0,n.If)(F.notEqual(0),()=>{let o=Fy(j,e.lobeAngleFraction,T,e.lobeVolumePercent).toVar(),s=zy(e.planeDistSensitivity,k,D,w).toVar(),c=Ry(P,j).toVar(),d=Ly(T.mul(T),(0,n.sqrt)(e.roughnessFraction),hy).toVar(),m=(0,n.float)(1).add(b).toVar();A.mulAssign(m);for(let e=-_y;e<=_y;e++)for(let h=-_y;h<=_y;h++){if(h===0&&e===0||Math.abs(h)+Math.abs(e)===_y*2)continue;let g=By(E.add((0,n.vec2)(h,e).mul(F).mul((0,n.vec2)((0,n.float)(1).div(l),(0,n.float)(1).div(u))))),_=this._uvToCoord(g),v=(0,n.textureLoad)(t,_).w,y=this._worldPosAt(g,v,f,p),b=(0,n.textureLoad)(r,_),x=jy(My((0,n.dot)((0,n.normalize)(b.xyz.mul(2).sub(1)),w)),o,(0,n.float)(0)).toVar();x.mulAssign(jy(b.w.mul(b.w),d.x,d.y)),x.mulAssign((0,n.float)(1).add((0,n.textureLoad)(a,_).y)),x.mulAssign(Ay((0,n.dot)(w,y),s.x,s.y)),x.assign((0,n.select)(v.greaterThanEqual(qe),(0,n.float)(0),x));let S=Jy(x,(0,n.textureLoad)(i,_));x.mulAssign(jy(S.w,c.x,c.y)),m.addAssign(x),A.addAssign(S.mul(x))}A.divAssign((0,n.max)(m,1e-6))});let I=A.x.toVar(),L=(0,n.saturate)(b.div((0,n.max)(e.historyFixFrameNum,py))),ee=(0,n.mix)(I,y.x,L).toVar();(0,n.textureStore)(s,_,(0,n.vec4)(ee,0,0,0)).toWriteOnly();let te=ee.toVar(),ne=ee.mul(ee).toVar(),re=(0,n.float)(0).toVar(),ie=(0,n.float)(0).toVar(),R=(e,r,i)=>{let o=this._clampCoord(m.add(e),h.add(r)),s=(0,n.textureLoad)(t,o).w,c=(0,n.select)(s.greaterThanEqual(qe),ee,(0,n.textureLoad)(a,o).x);Math.abs(e)<=vy&&Math.abs(r)<=vy&&(te.addAssign(c),ne.addAssign(c.mul(c))),i&&(re.addAssign(c),ie.addAssign(c.mul(c)))},ae=e.antiFirefly.greaterThan(.5);for(let e=-vy;e<=vy;e++)for(let t=-vy;t<=vy;t++)t===0&&e===0||R(t,e,Math.abs(t)>1||Math.abs(e)>1);(0,n.If)(ae,()=>{for(let e=-yy;e<=yy;e++)for(let t=-yy;t<=yy;t++)Math.abs(t)<=vy&&Math.abs(e)<=vy||R(t,e,!0)}),(0,n.If)(ae,()=>{let e=1/((yy*2+1)**2-9),t=re.mul(e),r=Ky(t,ie.mul(e)).mul(by);I.assign((0,n.mix)(I.clamp(t.sub(r),t.add(r)),I,S))});{let t=1/(vy*2+1)**2,r=te.mul(t),i=Ky(r,ne.mul(t)).mul(e.fastClampSigmaScale),a=I.clamp(r.sub(i),r.add(i)),o=(0,n.select)(e.maxFast.lessThan(e.maxAccum),(0,n.float)(1),(0,n.float)(0)),s=(0,n.mix)((0,n.float)(1).div((0,n.float)(1).add(o.mul(b).mul(2))),(0,n.float)(1),S);I.assign((0,n.mix)(a,I,s))}(0,n.textureStore)(o,_,Wy(A,I)).toWriteOnly()})});return this._dispatchOf(f)}_buildTemporalStabilization(e){let t=this.u,r=this._colorTexNode,i=this._albedoTexNode,a=this._ndTexNode,o=this._snTexNode,s=this._motionTexNode,c=this._nHist,l=this._nData,u=this._nStabRead,d=this._internal,f=this._tmpA,p=this.resW,m=this.resH,h=this.inputFrames,g=this.resetU,_=this.debugMode;return(0,n.Fn)(()=>{let v=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),y=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(v.lessThan((0,n.int)(p)).and(y.lessThan((0,n.int)(m))),()=>{let p=(0,n.ivec2)(v,y),m=(0,n.uvec2)((0,n.uint)(v),(0,n.uint)(y)),b=(0,n.textureLoad)(a,p).w,x=(0,n.textureLoad)(r,p).toVar();(0,n.If)(b.greaterThanEqual(qe),()=>{(0,n.textureStore)(f,m,x).toWriteOnly(),(0,n.textureStore)(e,m,(0,n.vec4)((0,n.textureLoad)(c,p).x,0,0,0)).toWriteOnly(),(0,n.textureStore)(d,m,(0,n.vec4)(0,1,0,0)).toWriteOnly(),(0,n.Return)()});let S=(0,n.textureLoad)(o,p).w.clamp(.05,1),C=this._pixelUv(v,y),w=(0,n.textureLoad)(s,p),T=C.sub(w.xy).toVar(),E=(0,n.textureLoad)(l,p).toVar(),D=E.y.toVar(),O=(0,n.uint)(E.z.add(.5)).toVar(),k=E.w.greaterThan(.5),A=this._bilinear(T),j=[1,2,4,8].map(e=>(0,n.select)(O.bitAnd((0,n.uint)(e)).notEqual((0,n.uint)(0)),(0,n.float)(1),(0,n.float)(0))),M=A.customWeights(j).map(e=>e.toVar()),N=(0,n.sqrt)((0,n.saturate)(A.filter(j))).toVar(),P=(0,n.textureLoad)(c,p).toVar(),F=P.x.toVar(),I=F.toVar(),L=F.mul(F).toVar();for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){if(t===0&&e===0)continue;let r=this._clampCoord(v.add(t),y.add(e)),i=(0,n.textureLoad)(a,r).w,o=(0,n.select)(i.greaterThanEqual(qe),F,(0,n.textureLoad)(c,r).x);I.addAssign(o),L.addAssign(o.mul(o))}I.divAssign(9),L.divAssign(9);let ee=Ky(I,L).toVar();(0,n.If)(D.lessThan(t.historyFixFrameNum),()=>{F.assign((0,n.min)(F,I.mul((0,n.float)(1.2).add((0,n.float)(1).div(D.add(1))))))});let te=(0,n.max)(this._sampleHistory(e=>(0,n.textureLoad)(u,e),T,A,M,k).x,0).toVar(),ne=ee.mul(t.antilag.x),re=t.antilag.y.mul(4),ie=te.clamp(I.sub(ne),I.add(ne)),R=te.sub(ie).abs().div((0,n.max)(te,ie).add(py)),ae=(0,n.float)(1).div((0,n.float)(1).add(R.mul(D.mul(N)).div(re))).toVar(),oe=(0,n.min)(D,t.historyFixFrameNum);D.assign((0,n.mix)(oe,D,ae));let se=h.add(1),ce=this._handover(se),le=N.mul((0,n.float)(1).sub(this._advancedNonLinear(D.mul((0,n.float)(1).sub(ce)).div(se)))).mul(ae).toVar(),ue=(0,n.float)(1).add(le.mul(6)),de=t.stabilizationStrength.mul((0,n.float)(1).sub(g)),fe=(0,n.mix)(F,te.clamp(I.sub(ee.mul(ue)),I.add(ee.mul(ue))),(0,n.min)(le,de)).toVar();P.assign(Wy(P,fe)),(0,n.textureStore)(e,m,(0,n.vec4)(fe,0,0,0)).toWriteOnly();let pe=t.maxAccum.mul((0,n.float)(1).sub(g));(0,n.textureStore)(d,m,(0,n.vec4)((0,n.min)(D.add(1),pe),S,0,0)).toWriteOnly();let me=(0,n.textureLoad)(i,p),he=(0,n.vec4)(Hy(P.xyz).mul((0,n.max)(me.xyz,(0,n.vec3)(Xe))),x.w).toVar();(0,n.If)(_.equal((0,n.int)(1)),()=>{let e=(0,n.saturate)(D.div((0,n.max)(t.maxAccum,1)));he.assign((0,n.vec4)((0,n.float)(1).sub(e),e,.2,1))}).ElseIf(_.equal((0,n.int)(2)),()=>{he.assign((0,n.vec4)((0,n.vec3)(P.w),1))}).ElseIf(_.equal((0,n.int)(3)),()=>{he.assign((0,n.vec4)((0,n.vec3)(S),1))}).ElseIf(_.equal((0,n.int)(4)),()=>{let e=E.x.div(E.x.add(1));he.assign((0,n.vec4)((0,n.vec3)(e),1))}).ElseIf(_.equal((0,n.int)(5)),()=>{he.assign((0,n.vec4)((0,n.vec3)(E.z.div(15)),1))}),(0,n.textureStore)(f,m,he).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[Ey,Ey,1])}setupEventListeners(){this.on(`denoiser:reset`,()=>this.resetHistory())}resetHistory(){this._needsReset=!0}_updateCamera(){let e=this.pathTracer;if(!e?.uniforms)return;let t=e.uniforms.get(`cameraWorldMatrix`).value,n=e.uniforms.get(`cameraViewMatrix`).value,r=e.uniforms.get(`cameraProjectionMatrixInverse`).value,i=e.uniforms.get(`cameraProjectionMatrix`).value;this._camInitialized&&(this.prevCamView.value.copy(this.camView.value),this.prevCamPos.value.copy(this.camPos.value),this.prevViewVector.value.copy(this.viewVector.value)),this.camWorld.value.copy(t),this.camProjInv.value.copy(r),this.camView.value.copy(n),this.camPos.value.setFromMatrixPosition(t),this.viewVector.value.setFromMatrixColumn(t,2).normalize(),this.cameraRay.sync(e.uniforms),this._camInitialized||=(this.prevCamView.value.copy(n),this.prevCamPos.value.copy(this.camPos.value),this.prevViewVector.value.copy(this.viewVector.value),!0);let a=i.elements[5]||1,o=1/(.5*this.resH.value*a);this.minRectDimMulUnproject.value=Math.min(this.resW.value,this.resH.value)*o}_updateRotators(e){let t=(t,n)=>{let r=Yy(e*3+n)*Math.PI*2;t.value.set(Math.cos(r),Math.sin(r),-Math.sin(r),Math.cos(r))};t(this.rotPre,0),t(this.rotBlur,1),t(this.rotPost,2)}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:albedo`),r=e.getTexture(`pathtracer:normalDepth`),i=e.getTexture(`pathtracer:shadingNormal`),a=e.getTexture(`motionVector:screenSpace`);if(!t)return;if(!n||!r||!i||!a){e.setTexture(`nrd:output`,t);return}let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this.outputTarget.width||o.height!==this.outputTarget.height)&&this.setSize(o.width,o.height);let s=e.getState(`pathtracer:samples`)??this.pathTracer?.frameCount??0;if(s+1>=this.u.handoverFrames.value){e.setTexture(`nrd:output`,t),this._needsReset=!0;return}if(this._colorTexNode.value=t,this._albedoTexNode.value=n,this._ndTexNode.value=r,this._snTexNode.value=i,this._motionTexNode.value=a,this._updateCamera(),this.inputFrames.value=s,this._updateRotators(this.pathTracer?.uniforms?.get(`seedFrame`)?.value??e.getState(`frame`)??0),this.resetU.value=+!!this._needsReset,!this._compiled){for(let e of this._kernels)this.renderer.compute(e);this._compiled=!0}this._nTmpA.value=this._tmpA,this._nTmpB.value=this._tmpB,this._nHist.value=this._hist,this._nFast.value=this._fastHist,this._nInternal.value=this._internal,this._nGeom.value=this._geomPrev,this._nData.value=this._dataT,this._nStabRead.value=this._stabPing===0?this._stabB:this._stabA,this.renderer.compute(this._kPre),this.renderer.compute(this._kTa),this.renderer.compute(this._kHf),this.renderer.compute(this._kBlur),this.renderer.compute(this._kPost),this.renderer.compute(this._stabPing===0?this._kTsA:this._kTsB),this._srcRegion.max.set(this.outputTarget.width,this.outputTarget.height),this.renderer.copyTextureToTexture(this._tmpA,this.outputTarget.texture,this._srcRegion),e.setTexture(`nrd:output`,this.outputTarget.texture),this._stabPing=1-this._stabPing,this._needsReset=!1,this._needsReset=!1}setSize(e,t){this.outputTarget.setSize(e,t),this.outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/Ey),this._dispatchY=Math.ceil(t/Ey);let n=[this._dispatchX,this._dispatchY,1];for(let e of this._kernels)e&&(e.dispatchSize=n);this._needsReset=!0}releaseGPUMemory(){this._disposeStorage(),this.context?.removeTexture(`nrd:output`),this.outputTarget?.texture?.dispose(),this._needsReset=!0}reallocateReservedStorage(){this._disposeKernels(),this._disposeStorage();for(let[e,t]of this._placeholders)e.value=t;this._allocStorage(),this._buildKernels(),this._compiled=!1,this._needsReset=!0,this._stabPing=0}dispose(){this._disposeKernels(),this._disposeStorage(),this.outputTarget?.dispose();for(let e of[this._colorTexNode,this._albedoTexNode,this._ndTexNode,this._snTexNode,this._motionTexNode])e?.dispose();for(let[e,t]of this._placeholders)e.dispose(),t.dispose();this._placeholders.clear()}},Zy=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),Qy=(0,n.wgslFn)(`
|
|
895
|
+
`),Qv=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g])=>{let _=(0,n.vec4)(1,0,1,1).toVar(),v=di({origin:e,direction:t}),y=gi.wrap(x_(v,r,i).toVar());return(0,n.If)(u.equal((0,n.int)(7)),()=>{let e=(0,n.float)(y.triTests).div(d);_.assign((0,n.select)(e.lessThan(1),(0,n.vec4)((0,n.vec3)(e),1),(0,n.vec4)(1,0,0,1)))}),(0,n.If)(u.equal((0,n.int)(8)),()=>{let e=(0,n.float)(y.boxTests).div(d);_.assign((0,n.select)(e.lessThan(1),(0,n.vec4)((0,n.vec3)(e),1),(0,n.vec4)(1,0,0,1)))}),(0,n.If)(u.equal((0,n.int)(10)),()=>{(0,n.If)(l,()=>{let e=P_({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).toVar(),r=(0,n.dot)(e.xyz,Ii).toVar(),i=r,a=(0,n.max)(d.mul(.1),.001),u=r.div(a),m=(0,n.log)(r.add(1e-6)).add(10).div(10),h=(0,n.select)(d.greaterThan(1),u,m).toVar(),g=(0,n.vec3)(0).toVar();(0,n.If)(h.lessThan(.2),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,0),(0,n.vec3)(0,0,.5),h.mul(5)))}).ElseIf(h.lessThan(.4),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,.5),(0,n.vec3)(0,0,1),h.sub(.2).mul(5)))}).ElseIf(h.lessThan(.6),()=>{g.assign((0,n.mix)((0,n.vec3)(0,0,1),(0,n.vec3)(0,1,0),h.sub(.4).mul(5)))}).ElseIf(h.lessThan(.8),()=>{g.assign((0,n.mix)((0,n.vec3)(0,1,0),(0,n.vec3)(1,1,0),h.sub(.6).mul(5)))}).ElseIf(h.lessThan(1),()=>{g.assign((0,n.mix)((0,n.vec3)(1,1,0),(0,n.vec3)(1,0,0),h.sub(.8).mul(5)))}).Else(()=>{g.assign((0,n.mix)((0,n.vec3)(1,0,0),(0,n.vec3)(1,1,1),(0,n.min)(h.sub(1),1)))});let v=f.div(p);(0,n.If)(v.x.lessThan(.1).and(v.y.lessThan(.1)),()=>{let e=i.mul(1);g.assign((0,n.vec3)(e))}).ElseIf(v.x.greaterThan(.9).and(v.y.lessThan(.1)),()=>{g.assign(e.xyz.mul(1))}),_.assign((0,n.vec4)(g,1))}).Else(()=>{_.assign((0,n.vec4)(1,0,1,1))})}),(0,n.If)(u.equal((0,n.int)(4)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let t=fi.wrap(ra(y.materialIndex,a)).toVar(),r=Ci.wrap(kf(t,y.uv,y.normal,(0,n.vec4)(0))).toVar().emissive.toVar(),i=(0,n.length)(r).toVar();(0,n.If)(i.greaterThan(0),()=>{let t=r.div((0,n.max)(i.mul(.1),.001)).toVar(),a=(0,n.length)(e.sub(y.hitPoint)),o=(0,n.clamp)((0,n.float)(1).sub(a.div(10)),0,1),s=(0,n.mix)(t,t.mul((0,n.vec3)(1,.8,.6)),o.mul(.3));_.assign((0,n.vec4)(s,1))}).Else(()=>{_.assign((0,n.vec4)(0,0,.1,1))})})}),(0,n.If)(u.equal((0,n.int)(1)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(.5,.5,1,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=(0,n.normalize)(Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().normal);_.assign((0,n.vec4)(Xv({normal:t}),1))})}),(0,n.If)(u.equal((0,n.int)(2)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)((0,n.vec3)(1),1))}).Else(()=>{let e=Zv({worldPos:y.hitPoint,cameraProjectionMatrix:m,cameraViewMatrix:h});_.assign((0,n.vec4)(Yv({depth:e}),1))})}),(0,n.If)(u.equal((0,n.int)(3)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().albedo.rgb;_.assign((0,n.vec4)(t,1))})}),(0,n.If)(u.equal((0,n.int)(5)),()=>{(0,n.If)(y.didHit.not(),()=>{_.assign((0,n.vec4)(0,0,0,1))}).Else(()=>{let e=fi.wrap(ra(y.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,y.uv,y.normal,(0,n.vec4)(0))).toVar(),u=t.albedo.rgb,d=(0,n.normalize)(t.normal).toVar(),p=ne({state:re({seed:(0,n.uint)(f.x).mul((0,n.uint)(1973)).add((0,n.uint)(f.y).mul((0,n.uint)(9277))).add(g.mul((0,n.uint)(26699)))})}).toVar(),m=Fd({N:d,xi:(0,n.vec2)(ie(p).toVar(),ie(p).toVar())}).toVar(),h=di({origin:Di(y.hitPoint,d),direction:m}),v=gi.wrap(x_(h,r,i).toVar()),b=(0,n.vec3)(0).toVar();(0,n.If)(v.didHit.not(),()=>{(0,n.If)(l,()=>{b.assign(P_({tex:o,samp:(0,n.sampler)(o),direction:m,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz)})}).Else(()=>{let e=fi.wrap(ra(v.materialIndex,a)).toVar(),t=Ci.wrap(kf(e,v.uv,v.normal,(0,n.vec4)(0))).toVar();b.assign(t.emissive),(0,n.If)(l,()=>{let e=(0,n.normalize)(t.normal).toVar(),r=P_({tex:o,samp:(0,n.sampler)(o),direction:e,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz;b.addAssign(t.albedo.rgb.mul(r))})});let x=u.mul(b);_.assign((0,n.vec4)(x,1))})}),(0,n.If)(u.equal((0,n.int)(6)),()=>{(0,n.If)(y.didHit,()=>{let e=y.normal.toVar(),r=(0,n.normalize)(t.sub(e.mul((0,n.dot)(t,e).mul(2)))).toVar(),i=P_({tex:o,samp:(0,n.sampler)(o),direction:r,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz,a=i.div(i.add(1));_.assign((0,n.vec4)(a,1))}).Else(()=>{let e=P_({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz,r=e.div(e.add(1));_.assign((0,n.vec4)(r,1))})}),_});function $v(e){let{writeColorTex:t,writeNDTex:r,writeAlbedoTex:i,resolution:a,renderWidth:o,renderHeight:s,cameraWorldMatrix:c,cameraProjectionMatrixInverse:l,cameraProjectionMatrix:u,cameraViewMatrix:d,cameraProjection:f,panoLonRange:p,panoLatRange:m,panoLevelHorizon:h,enableDOF:g,focalLength:_,aperture:v,focusDistance:y,unitsPerMetre:b,apertureScale:x,anamorphicRatio:S,dofMode:C,dofBlur:w,bvhBuffer:T,triangleBuffer:E,materialBuffer:D,envTexture:O,environmentMatrix:k,environmentIntensity:A,enableEnvironmentLight:j,visMode:M,debugVisScale:N,frame:P}=e;return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),F=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(o).and(F.lessThan(s)),()=>{let o=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(F).add(.5)),s=ne({state:(0,n.uint)(F.mul((0,n.int)(a.x)).add(e)).add((0,n.uint)(1))}).toVar(),I=di.wrap(r_(o.div(a),s,c,l,f,p,m,h,g,_,v,y,b,x,S,C,w)),L=(0,n.vec4)(1,0,1,1).toVar();(0,n.If)(M.equal((0,n.int)(9)),()=>{let e=ve(o,(0,n.int)(0),(0,n.int)(1),s,a,P);L.assign((0,n.vec4)(e,1,1))}).Else(()=>{L.assign(Qv(I.origin,I.direction,T,E,D,O,k,A,j,M,N,o,a,u,d,P))});let R=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(F));(0,n.textureStore)(t,R,L).toWriteOnly(),(0,n.textureStore)(r,R,(0,n.vec4)(.5,.5,1,1)).toWriteOnly(),(0,n.textureStore)(i,R,(0,n.vec4)(L.xyz,1)).toWriteOnly()})})}function ey({sortGlobalHistogram:e,bins:t=256}){return(0,n.Fn)(()=>{(0,n.If)(n.instanceIndex.lessThan((0,n.uint)(t)),()=>{(0,n.atomicStore)(e.element(n.instanceIndex),(0,n.uint)(0))})})}function ty({hitBufferRO:e,activeIndicesReadRO:t,sortGlobalHistogram:r,counters:i,bins:a=256}){return(0,n.Fn)(()=>{let o=n.instanceIndex,s=n.localId.x,c=(0,n.workgroupArray)(`uint`,a).toAtomic();(0,n.If)(s.lessThan((0,n.uint)(a)),()=>{(0,n.atomicStore)(c.element(s),(0,n.uint)(0))}),(0,n.workgroupBarrier)();let l=(0,n.atomicLoad)(i.element((0,n.uint)($.ENTERING_COUNT)));(0,n.If)(o.lessThan(l),()=>{let r=(0,n.uint)(Ga(e,t.element(o))).clamp((0,n.uint)(0),(0,n.uint)(a-1));(0,n.atomicAdd)(c.element(r),(0,n.uint)(1))}),(0,n.workgroupBarrier)(),(0,n.If)(s.lessThan((0,n.uint)(a)),()=>{let e=(0,n.atomicLoad)(c.element(s));(0,n.If)(e.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicAdd)(r.element(s),e)})})})}function ny({sortGlobalHistogram:e,bins:t=256}){return(0,n.Fn)(()=>{(0,n.If)(n.instanceIndex.equal((0,n.uint)(0)),()=>{let r=(0,n.uint)(0).toVar();(0,n.Loop)({start:(0,n.uint)(0),end:(0,n.uint)(t),type:`uint`},({i:t})=>{let i=e.element(t),a=(0,n.atomicLoad)(i);(0,n.atomicStore)(i,r),r.addAssign(a)})})})}function ry({hitBufferRO:e,activeIndicesReadRO:t,sortedIndicesRW:r,sortGlobalHistogram:i,counters:a,bins:o=256}){return(0,n.Fn)(()=>{let s=n.instanceIndex,c=n.localId.x,l=(0,n.workgroupArray)(`uint`,o).toAtomic();(0,n.If)(c.lessThan((0,n.uint)(o)),()=>{(0,n.atomicStore)(l.element(c),(0,n.uint)(0))}),(0,n.workgroupBarrier)();let u=(0,n.atomicLoad)(a.element((0,n.uint)($.ENTERING_COUNT))),d=s.lessThan(u),f=(0,n.uint)(0).toVar(),p=(0,n.uint)(0).toVar();(0,n.If)(d,()=>{f.assign(t.element(s)),p.assign((0,n.uint)(Ga(e,f)).clamp((0,n.uint)(0),(0,n.uint)(o-1))),(0,n.atomicAdd)(l.element(p),(0,n.uint)(1))}),(0,n.workgroupBarrier)(),(0,n.If)(c.lessThan((0,n.uint)(o)),()=>{let e=l.element(c),t=(0,n.atomicLoad)(e);(0,n.If)(t.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(e,(0,n.atomicAdd)(i.element(c),t))})}),(0,n.workgroupBarrier)(),(0,n.If)(d,()=>{r.element((0,n.atomicAdd)(l.element(p),(0,n.uint)(1))).assign(f)})})}rn();var iy=Wt(`wavefront`),ay=256,oy=[`extend`,`shade`,`globalHist`,`globalScatter`,`compact`,`compactCopyback`],sy=class extends Ig{constructor(e,t,r,i={}){super(e,t,r,i),this.name=`PathTracer`,this._packedBuffers=null,this._queueManager=null,this._kernelManager=null,this._gBufferAttr=null,this._m2Attr=null,this._streakAttr=null,this._frozenMaskAttr=null,this._convDebugSource=null,this._dilateFrozenUniform=(0,n.uniform)(1,`int`),this._wavefrontReady=!1,this._auxGBufferEnabled=!1,this._auxGBufferUniform=(0,n.uniform)(0,`uint`),this._cleanAuxNormalEnabled=!1,this._cleanAuxNormalUniform=(0,n.uniform)(0,`uint`),this._auxSamples=0,this._auxSeedPending=!1,this._useDynamicDispatch=!0,this._sortMaterials=!1,this._useSubgroupCompact=!1,this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-1,this._lastBounceCountsLoopBound=-1,this._readbackPending=!1,this._readbackEveryNFrames=4,this._readbackFrameCounter=0,this._readbackGeneration=0,this._curveSizingValid=!1,this._bounceEarlyExitThreshold=1e-4,this._convergedFraction=0,this._convergedGeometryFraction=0,this._geometryPixelCount=0,this._convergedReadbackPending=!1,this._lastActivePixelCount=0,this._wfRenderWidth=(0,n.uniform)(1920,`int`),this._wfRenderHeight=(0,n.uniform)(1080,`int`),this._wfMaxRayCount=(0,n.uniform)(0,`uint`),this._wfCurrentBounce=(0,n.uniform)(0,`int`),this._wfChunkRowBase=(0,n.uniform)(0,`int`),this._wfChunkRows=(0,n.uniform)(0,`int`),this._wfIsFirstChunk=(0,n.uniform)(1,`uint`),this._pathBudget=0,this._pathBudgetOverride=0,this._chunkRows=0,this._numChunks=1,this.vramTracker=new Kg(this.renderer),this._registerVRAMProviders(),iy.debug(`initialized (wavefront)`)}_registerVRAMProviders(){let e=this.vramTracker;e.register(`rays`,()=>{let e=this._packedBuffers?._attrs;return e?[e.ray,e.rng,e.hit]:null}),e.register(`queues`,()=>{let e=this._queueManager;return e?[e._countersAttr,e._bounceCountsAttr,e._attrA,e._attrB,e._sortAttr]:null}),e.register(`gbuffer`,()=>{let e=[];return this._gBufferAttr&&e.push(this._gBufferAttr),this._m2Attr&&e.push(this._m2Attr),this._streakAttr&&e.push(this._streakAttr),this._frozenMaskAttr&&e.push(this._frozenMaskAttr),e.length?e:null}),e.register(`accum`,()=>{let e=this.storageTextures;return e?[e.writeColor,e.writeNormalDepth,e.writeAlbedo,e.readTarget]:null}),e.register(`geometry`,()=>[this.triangleGeoAttr,this.triangleShadeAttr,this.bvhStorageAttr,this.lightStorageAttr]),e.register(`materials`,()=>{let e=this.materialData;return e?[e.materialStorageAttr,...(e.srgbBuckets||[]).filter(Boolean),...(e.linearBuckets||[]).filter(Boolean)]:null}),e.register(`environment`,()=>{let e=this.environment;return e?[e.environmentTexture,e.envCDFTexture]:null})}setupMaterial(){super.setupMaterial(),this.materialData?.materialCount>0&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}render(e){if(!this.isReady||!this._wavefrontReady||this._lightBufferRealloc&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels(),!this._wavefrontReady))return;if(this.isComplete||this.frameCount>=this.completionThreshold||this._isConvergedComplete())if(this._auxSeedPending)this.isComplete=!1;else{this.isComplete||=!0;return}this.performanceMonitor?.start();let t=this.frameCount,n=this.renderMode.value,r=null;n===1&&t===0&&(r=this.maxBounces.value,this.maxBounces.value=1),this._handleResize(),this.manageASVGFForRenderMode(n),e&&e.setState(`tileRenderingComplete`,!0),this.cameraChanged=this._updateCameraUniforms(),this.cameraOptimizer?.updateInteractionMode(this.cameraChanged),this.cameraChanged&&(this._curveSizingValid=!1,this._readbackGeneration++,this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0),this._updateAccumulationUniforms(t);let i=this._updateAuxAccumulationUniforms(t);this.frame.value=t,this.seedFrame.value=this._seedTick++,this.tracedFrames++,this._setWfDispatch();let a=this.storageTextures.getReadTextures();this.shaderBuilder.prevColorTexNode&&(this.shaderBuilder.prevColorTexNode.value=a.color,this.shaderBuilder.prevAlbedoTexNode.value=a.albedo,this.shaderBuilder.prevNormalDepthTexNode.value=a.normalDepth),this._refreshWfTextureNodes();let o=this._kernelManager;if((this.visMode?.value|0)>0&&this.visMode.value!==11){o.dispatch(`debug`),this.storageTextures.copyToReadTargets(this.renderer);let t=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,t),this._emitStateEvents(),this.cameraOptimizer?.isInInteractionMode()||this.frameCount++,r!==null&&(this.maxBounces.value=r),this.performanceMonitor?.end();return}let s=this.maxBounces.value,c=this._bounceLoopBound(),l=this._wfRenderHeight.value,u=this._chunkRows,d=this._numChunks<=1;c>this._lastBounceCountsLoopBound&&(this._curveSizingValid=!1);let f=this._lastBounceCounts,p=s<=this._lastBounceCountsBudget&&c<=this._lastBounceCountsLoopBound,m=d&&f?p?c+1:Math.min(this._lastBounceCountsBudget,this._lastBounceCountsLoopBound):0;for(let e=0,n=0;n<l;n+=u,e++){let r=Math.min(u,l-n),i=this._setChunk(n,r,e),a=this.usePixelFreeze.value>0&&!this._auxSeedPending,s=d&&a&&this._curveSizingValid&&this._lastActivePixelCount>0?this._lastActivePixelCount:i;if(a){let e=Math.min(i,Math.ceil(s*1.5)+1024);o.setDispatchForCount(`generateList`,e),o.dispatch(`resetFrameCounters`),o.dispatch(`buildActivePixels`),o.dispatch(`seedEnter`),o.dispatch(`generateList`)}else o.dispatch(`generate`),o.dispatch(`initActiveIndices`);e===0&&t>0&&this.useAdaptiveSampling.value>0&&this._willReadCountersThisFrame()&&o.dispatch(`countConvergedDilated`);let p=this._lastBounceEnergy,h=this._bounceEarlyExitThreshold>=0?this._bounceEarlyExitThreshold*i*64:-1;for(let e=0;e<=c;e++){this._wfCurrentBounce.value=e;let t=this._useDynamicDispatch;if(t){let t=i;if(d&&e>0&&this._curveSizingValid){let n=e-1,r;n<m&&f[n]!==void 0?r=f[n]:m>0&&(r=f[m-1]),t=r>0?r:i}else e===0&&a&&(t=s);let n=Math.min(i,Math.ceil(t*1.5)+1024);for(let e of oy)o.setDispatchForCount(e,n)}else{o.dispatch(`enterFull`);for(let e of oy)o.setDispatchForCount(e,i)}if(o.dispatch(`extend`),this._sortMaterials&&(o.dispatch(`resetGlobalHist`),o.dispatch(`globalHist`),o.dispatch(`globalPrefix`),o.dispatch(`globalScatter`)),o.dispatch(`shade`),o.dispatch(`compact`),t?o.dispatch(`compactCopyback`):o.dispatch(`snapshotBounceCount`),h>=0&&e<m&&e<c&&p?.[e]!==void 0&&p[e]<=h)break}o.dispatch(`finalWrite`)}this._maybeReadbackCounters(),this.storageTextures.copyToReadTargets(this.renderer,this._auxGBufferEnabled);let h=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,h),this._emitStateEvents(),this.cameraOptimizer?.isInInteractionMode()||this.frameCount++,this._auxGBufferEnabled&&(this._auxSamples=i?this._auxSamples+1:1),this._auxSeedPending=!1,r!==null&&(this.maxBounces.value=r),this.performanceMonitor?.end()}_isConvergedComplete(){return this.useAdaptiveSampling.value>0&&this.frameCount>=this.adaptiveMinSamples.value&&this._convergedFraction>=this.adaptiveStopFraction.value&&this._convergedGeometryFraction>=this.adaptiveStopFraction.value}async captureAccumulation(){let e=this.storageTextures,t=e.renderWidth,n=e.renderHeight,r=t*n,i=async i=>{let a=await this.renderer.readRenderTargetPixelsAsync(e.readTarget,0,0,t,n,i),o=Math.ceil(t*16/256)*64;if(o===t*4)return new Float32Array(a.buffer,a.byteOffset,r*4).slice();let s=new Float32Array(r*4);for(let e=0;e<n;e++)s.set(a.subarray(e*o,e*o+t*4),e*t*4);return s},a=async(e,t)=>e?new t(await this.renderer.getArrayBufferAsync(e,null,0,r*4)):null,o=this._auxGBufferEnabled&&this._auxSamples>0,s={frameCount:this.frameCount,seedTick:this._seedTick,auxSamples:o?this._auxSamples:0,convergedFraction:this._convergedFraction,convergedGeometryFraction:this._convergedGeometryFraction,isComplete:this.isComplete},c=[i(0),o?i(1):null,o?i(2):null,a(this._m2Attr,Float32Array),a(this._streakAttr,Uint32Array),a(this._frozenMaskAttr,Uint32Array)],[l,u,d,f,p,m]=await Promise.all(c);return{width:t,height:n,state:s,color:l,normalDepth:u,albedo:d,m2:f,streak:p,frozenMask:m}}restoreAccumulation(e){let t=this.storageTextures,{width:n,height:r,state:i}=e;if(t.renderWidth!==n||t.renderHeight!==r)throw Error(`checkpoint is ${n}×${r}; the render is ${t.renderWidth}×${t.renderHeight}`);let a=this.renderer.backend,o=a.device;a.get(t.readTarget.textures[0]).texture||this.renderer.initRenderTarget(t.readTarget);let s=(e,i)=>o.queue.writeTexture({texture:a.get(t.readTarget.textures[e]).texture},i,{bytesPerRow:n*16,rowsPerImage:r},{width:n,height:r}),c=(e,t)=>{e&&t&&o.queue.writeBuffer(a.get(e).buffer,0,t)};s(0,e.color),e.normalDepth&&s(1,e.normalDepth),e.albedo&&s(2,e.albedo),c(this._m2Attr,e.m2),c(this._streakAttr,e.streak),c(this._frozenMaskAttr,e.frozenMask),this.frameCount=i.frameCount,this.frame.value=i.frameCount,this._seedTick=i.seedTick,this.hasPreviousAccumulated.value=+(i.frameCount>0),this._auxSamples=e.normalDepth?i.auxSamples:0,this._auxSeedPending=this._auxGBufferEnabled&&!e.normalDepth,this._convergedFraction=i.convergedFraction??0,this._convergedGeometryFraction=i.convergedGeometryFraction??0,this.isComplete=!1}reset(){super.reset(),this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0,this._auxSamples=0,this._auxSeedPending=!1}getConvergenceDebugSource(){return!this._m2Attr||!this._frozenMaskAttr?null:(this._convDebugSource?.m2===this._m2Attr&&this._convDebugSource.frozenMask===this._frozenMaskAttr||(this._convDebugSource={m2:this._m2Attr,frozenMask:this._frozenMaskAttr,frame:this.frame,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,noiseThreshold:this.noiseThreshold,pixelFreezeThreshold:this.pixelFreezeThreshold,usePixelFreeze:this.usePixelFreeze,adaptiveMinSamples:this.adaptiveMinSamples}),this._convDebugSource)}getConvergenceStats(){let e=this._wfRenderWidth.value*this._wfRenderHeight.value;return{converged:this._convergedFraction,convergedGeometry:this._convergedGeometryFraction,geometryPixels:this._geometryPixelCount,activePixels:this._lastActivePixelCount,totalPixels:e,frame:this.frameCount}}_handleResize(){let e=this.storageTextures.renderWidth,t=this.storageTextures.renderHeight;super._handleResize(),this._rebuildKernelsIfResized(e,t)}setAuxGBufferEnabled(e){e=!!e,this._auxGBufferEnabled!==e&&(this._auxGBufferEnabled=e,this._auxGBufferUniform.value=+!!e,this.restartAuxAccumulation())}setCleanAuxNormal(e){e=!!e,this._cleanAuxNormalEnabled!==e&&(this._cleanAuxNormalEnabled=e,this._cleanAuxNormalUniform.value=+!!e,this.restartAuxAccumulation())}restartAuxAccumulation(){this._auxSamples=0,this._auxSeedPending=this._auxGBufferEnabled}_updateAuxAccumulationUniforms(e){let t=this.accumulationEnabled&&!this.cameraIsMoving.value&&e>0&&this.hasPreviousAccumulated.value>0&&this.visMode.value!==11,n=this._auxGBufferEnabled&&t&&!this._auxSeedPending&&this._auxSamples>0;return this.hasPreviousAux.value=+!!n,this.auxAccumulationAlpha.value=n?1/(this._auxSamples+1):1,n}setSize(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;super.setSize(e,t),this._rebuildKernelsIfResized(n,r)}_willReadCountersThisFrame(){return this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()||this._readbackPending||this._convergedReadbackPending?!1:this._readbackFrameCounter+1>=this._readbackEveryNFrames}_bounceLoopBound(){return this.maxBounces.value+this.transmissiveBounces.value+this.maxSubsurfaceSteps.value}_maybeReadbackCounters(){if(this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()){this._readbackFrameCounter=this._readbackEveryNFrames;return}if(this._readbackPending||((this.maxBounces.value!==this._lastBounceCountsBudget||this._bounceLoopBound()!==this._lastBounceCountsLoopBound)&&(this._readbackFrameCounter=this._readbackEveryNFrames),this._readbackFrameCounter++,this._readbackFrameCounter<this._readbackEveryNFrames))return;this._readbackFrameCounter=0;let e=this._queueManager?.getBounceCountsAttribute();if(!e)return;this._readbackPending=!0;let t=this._readbackGeneration,n=this.maxBounces.value,r=this._bounceLoopBound(),i=this._queueManager.MAX_BOUNCE_SNAPSHOTS;if(this.renderer.getArrayBufferAsync(e).then(e=>{if(t===this._readbackGeneration){let t=new Uint32Array(e.slice(0));this._lastBounceCounts=t.subarray(0,i),this._lastBounceEnergy=t.subarray(i,2*i),this._lastBounceCountsBudget=n,this._lastBounceCountsLoopBound=r,this._curveSizingValid=!0}this._readbackPending=!1}).catch(e=>{iy.warn(`bounceCounts readback failed:`,e),this._readbackPending=!1}),!this._convergedReadbackPending){let e=this._queueManager?.getCountersAttribute();if(e){this._convergedReadbackPending=!0;let t=this._readbackGeneration,n=this._wfRenderWidth.value*this._wfRenderHeight.value;this.renderer.getArrayBufferAsync(e).then(e=>{if(t===this._readbackGeneration&&n>0){let t=new Uint32Array(e);this._convergedFraction=t[$.CONVERGED_COUNT]/n;let r=t[$.GEOMETRY_COUNT];this._geometryPixelCount=r,this._convergedGeometryFraction=r>0?t[$.CONVERGED_GEOMETRY_COUNT]/r:1,this._lastActivePixelCount=t[$.ACTIVE_PIXEL_COUNT]}this._convergedReadbackPending=!1}).catch(()=>{this._convergedReadbackPending=!1})}}}_refreshWfTextureNodes(){let e=this._wfTexNodes;if(!e)return;let t=this.environment?.environmentTexture;t&&e.envTex&&(e.envTex.value=t),this.environment?.envCDFTexture&&e.envCDFTex&&(e.envCDFTex.value=this.environment.envCDFTexture);let n=this.materialData;n&&(mf(e.srgbBuckets,n.srgbBuckets),mf(e.linearBuckets,n.linearBuckets))}_rebuildKernelsIfResized(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;if(!(n===e&&r===t||!(this.materialData?.materialCount>0))){if(this._lastBounceCounts&&this._numChunks<=1&&e>0&&t>0){let i=n*r/(e*t),a=e=>Math.min(4294967295,Math.round(e*i));this._lastBounceCounts=this._lastBounceCounts.map(a),this._lastBounceEnergy=this._lastBounceEnergy.map(a)}else this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-1,this._lastBounceCountsLoopBound=-1;this._curveSizingValid=!1,this._readbackFrameCounter=0,this._readbackGeneration++,this._convergedFraction=0,this._convergedGeometryFraction=0,this._lastActivePixelCount=0,this._packedBuffers?this._resizeWavefrontInPlace(n,r):(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}}_resizeWavefrontInPlace(e,t){this._wfRenderWidth.value=e,this._wfRenderHeight.value=t,this._updateChunkLayout()}_computePathBudget(){if(this._pathBudgetOverride>0)return this._pathBudgetOverride;let e=this.renderer?.backend?.device?.limits,t=e?.maxStorageBufferBindingSize||128*1024*1024,n=e?.maxBufferSize||t,r=Math.floor(t*.9/112),i=(typeof navigator<`u`&&navigator.deviceMemory||4)*1024*1024*1024,a=Math.min(i*.25,n*4),o=Math.floor(a/192),s=Math.min(r,o,2048*2048);return s=Math.max(262144,s),s}_updateChunkLayout(){let e=Math.max(1,this.storageTextures.renderWidth),t=this.storageTextures.renderHeight,n=this._pathBudget||e*t;this._chunkRows=Math.max(1,Math.min(Math.floor(n/e),t)),this._numChunks=Math.max(1,Math.ceil(t/this._chunkRows))}reallocateReservedStorage(){if(!this.storageTextures.writeColor)return;let e=Math.min(this.storageTextures.renderWidth||1,W),t=Math.min(this.storageTextures.renderHeight||1,W);this.storageTextures.create(e,t),this.resolution.value.set(e,t),!(!this._packedBuffers||!(this.materialData?.materialCount>0))&&(this._kernelManager&&this._kernelManager.dispose(),this._wavefrontReady=!1,this._buildWavefrontKernels())}_buildWavefrontKernels(){let e=this.shaderBuilder.getSceneTextureNodes();if(!e)return;this._lightBufferRealloc=!1;let t=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;this._pathBudget||=this._computePathBudget();let i=this._pathBudget;this._updateChunkLayout();let a=this._chunkRows*t;this._packedBuffers?this._packedBuffers.resize(i):this._packedBuffers=new xa(i,this.renderer);let o=i*1;ba(this.renderer,this._gBufferAttr),this._gBufferAttr=S(o,4,Uint32Array);let s=(0,n.storage)(this._gBufferAttr,`uvec4`),c=(0,n.storage)(this._gBufferAttr,`uvec4`).toReadOnly(),l=W*W;(!this._m2Attr||this._m2Attr.count<l)&&(ba(this.renderer,this._m2Attr),this._m2Attr=S(l,1),ba(this.renderer,this._streakAttr),this._streakAttr=S(l,1,Uint32Array),ba(this.renderer,this._frozenMaskAttr),this._frozenMaskAttr=S(l,1,Uint32Array));let u=(0,n.storage)(this._m2Attr,`float`),d=(0,n.storage)(this._streakAttr,`uint`),f=(0,n.storage)(this._streakAttr,`uint`).toReadOnly(),p=(0,n.storage)(this._frozenMaskAttr,`uint`),m=(0,n.storage)(this._frozenMaskAttr,`uint`).toReadOnly();this._queueManager?this._queueManager.resize(this._packedBuffers.capacity):this._queueManager=new Bg(this._packedBuffers.capacity,this.renderer),this._kernelManager||=new Jg(this.renderer);let h=this._packedBuffers,g=this._queueManager;this._wfRenderWidth.value=t,this._wfRenderHeight.value=r,this._wfMaxRayCount.value=Math.min(i,this._chunkRows*t);let _=this.shaderBuilder.prevColorTexNode,v=this.shaderBuilder.prevAlbedoTexNode,y=this.shaderBuilder.prevNormalDepthTexNode,b=this.storageTextures.getWriteTextures(),x=g.getCounters(),C=g.getBounceCounts(),w=this._wfCurrentBounce,T=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT))),t=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS-1));C.element(t).assign(e),C.element(t.add((0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),e)});this._kernelManager.register(`snapshotBounceCount`,T().compute([1,1,1],[1,1,1]));let E=g.activeIndices.a,D=(0,n.Fn)(()=>{let e=n.instanceIndex;(0,n.If)(e.lessThan(this._wfMaxRayCount),()=>{E.element(e).assign(e)}),(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),this._wfMaxRayCount),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})})});this._kernelManager.register(`initActiveIndices`,D().compute([Math.ceil(this._chunkRows*t/ay),1,1],[ay,1,1]));let O={rayBufferRW:h.rayBuffer.rw,hitBufferRW:h.hitBuffer.rw,gBufferRW:s,resolution:this.resolution,frame:this.seedFrame,cameraWorldMatrix:this.cameraWorldMatrix,cameraProjectionMatrixInverse:this.cameraProjectionMatrixInverse,cameraProjection:this.cameraProjection,panoLonRange:this.panoLonRange,panoLatRange:this.panoLatRange,panoLevelHorizon:this.panoLevelHorizon,enableDOF:this.enableDOF,focalLength:this.focalLength,aperture:this.aperture,focusDistance:this.focusDistance,unitsPerMetre:this.unitsPerMetre,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,dofMode:this.dofMode,dofBlur:this.dofBlur,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows,transmissiveBounces:this.transmissiveBounces,transparentBackground:this.transparentBackground,auxGBufferEnabled:this._auxGBufferUniform},k=i_(O);this._kernelManager.register(`generate`,k().compute([Math.ceil(t/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let A=this.pixelFreezeStability,j=(0,n.Fn)(()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})});this._kernelManager.register(`resetFrameCounters`,j().compute([1,1,1],[1,1,1]));let M=(0,n.Fn)(()=>{let e=n.instanceIndex;(0,n.If)(e.lessThan(this._wfMaxRayCount),()=>{let t=(0,n.uint)((0,n.int)(e).add(this._wfChunkRowBase.mul(this._wfRenderWidth))).toVar(),r=(0,n.uint)(0).toVar();(0,n.If)(this.frame.greaterThan((0,n.uint)(0)).and(f.element(t).bitAnd((0,n.uint)(1073741823)).greaterThanEqual((0,n.uint)(A))),()=>{r.assign((0,n.uint)(1)),(0,n.If)(this._dilateFrozenUniform.greaterThan((0,n.int)(0)),()=>{let e=(0,n.int)(t).mod(this._wfRenderWidth),i=(0,n.int)(t).div(this._wfRenderWidth);for(let[t,a]of[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]]){let o=e.add((0,n.int)(t)),s=i.add((0,n.int)(a));(0,n.If)(o.greaterThanEqual((0,n.int)(0)).and(o.lessThan(this._wfRenderWidth)).and(s.greaterThanEqual((0,n.int)(0))).and(s.lessThan(this._wfRenderHeight)),()=>{(0,n.If)(f.element((0,n.uint)(s.mul(this._wfRenderWidth).add(o))).bitAnd((0,n.uint)(1073741823)).lessThan((0,n.uint)(A)),()=>{r.assign((0,n.uint)(0))})})}})}),p.element(t).assign(r),(0,n.If)(r.equal((0,n.uint)(0)),()=>{let t=(0,n.atomicAdd)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(1));E.element(t).assign(e)})})});this._kernelManager.register(`buildActivePixels`,M().compute([Math.ceil(this._chunkRows*t/ay),1,1],[ay,1,1]));let N=(0,n.Fn)(()=>{let e=n.instanceIndex,t=this._wfRenderWidth,r=this._wfRenderHeight;(0,n.If)(e.lessThan((0,n.uint)(t.mul(r))),()=>{let i=(0,n.int)(e).mod(t),a=(0,n.int)(e).div(t),o=(0,n.uint)(2147483648),s=(0,n.uint)(1073741824),c=f.element(e).toVar(),l=c.bitAnd(s).notEqual((0,n.uint)(0)),u=c.bitAnd(o).notEqual((0,n.uint)(0)).toVar();(0,n.If)(u,()=>{for(let[e,s]of[[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]]){let c=i.add((0,n.int)(e)),l=a.add((0,n.int)(s));(0,n.If)(c.greaterThanEqual((0,n.int)(0)).and(c.lessThan(t)).and(l.greaterThanEqual((0,n.int)(0))).and(l.lessThan(r)),()=>{(0,n.If)(f.element((0,n.uint)(l.mul(t).add(c))).bitAnd(o).equal((0,n.uint)(0)),()=>{u.assign(!1)})})}}),(0,n.If)(u,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(1))}),(0,n.If)(l,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(1)),(0,n.If)(u,()=>{(0,n.atomicAdd)(x.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(1))})})})});this._kernelManager.register(`countConvergedDilated`,N().compute([Math.ceil(t*r/ay),1,1],[ay,1,1]));let P=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)));(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),e),(0,n.atomicStore)(x.element((0,n.uint)($.ACTIVE_PIXEL_COUNT)),e)});this._kernelManager.register(`seedEnter`,P().compute([1,1,1],[1,1,1]));let F=i_({...O,listDriven:!0,activeIndicesRO:g.activeIndicesRO.a,counters:x});this._kernelManager.register(`generateList`,F().compute([Math.ceil(a/ay),1,1],[ay,1,1]));let I=this.bvhStorageNode,L=this.triangleStorageNode,R=this.materialData.materialStorageNode,ee=(0,n.texture)(this.environment.envCDFTexture),te=this.lightStorageNode,ne=this.materialData,re=this.environment,z=pf(ne.srgbBuckets),ie=pf(ne.linearBuckets);sf(z,ie),Mf(z);let ae=re.environmentTexture?(0,n.texture)(re.environmentTexture):e.envTex;this._wfTexNodes={envTex:ae,envCDFTex:ee,srgbBuckets:z,linearBuckets:ie},this._sortMaterials=(U.wavefrontSortMaterials??!1)&&(this.materialData?.materialCount??0)>8;let oe=k_({bvhBuffer:I,triangleBuffer:L,rayBufferRO:h.rayBuffer.ro,hitBufferRW:h.hitBuffer.rw,activeIndicesRO:g.getActiveReadRO(),counters:x,maxRayCount:this._wfMaxRayCount,shadowTerminatorOffset:this.shadowTerminatorOffset});if(this._kernelManager.register(`extend`,oe().compute([Math.ceil(a/256),1,1],[256,1,1])),this._sortMaterials){let e=g.getSortGlobalHistogram(),t=Math.min(256,this.materialData?.materialCount??256);this._kernelManager.register(`resetGlobalHist`,ey({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[256,1,1])),this._kernelManager.register(`globalHist`,ty({hitBufferRO:h.hitBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),sortGlobalHistogram:e,counters:x,bins:t})().compute([Math.ceil(a/256),1,1],[256,1,1])),this._kernelManager.register(`globalPrefix`,ny({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[1,1,1])),this._kernelManager.register(`globalScatter`,ry({hitBufferRO:h.hitBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),sortedIndicesRW:g.getSortedRW(),sortGlobalHistogram:e,counters:x,bins:t})().compute([Math.ceil(a/256),1,1],[256,1,1]))}let se=Uv({gBufferRW:s,envCompensationDelta:this.envCompensationDelta,bvhBuffer:I,triangleBuffer:L,materialBuffer:R,envCDFTexture:ee,lightBuffer:te,rayBufferRW:h.rayBuffer.rw,hitBufferRW:h.hitBuffer.rw,counters:x,activeIndicesRO:this._sortMaterials?g.getSortedRO():g.getActiveReadRO(),envTexture:ae,environmentIntensity:this.environmentIntensity,envMatrix:this.environmentMatrix,enableEnvironmentLight:this.enableEnvironment,groundProjectionEnabled:this.groundProjectionEnabled,groundProjectionRadius:this.groundProjectionRadius,groundProjectionHeight:this.groundProjectionHeight,groundProjectionLevel:this.groundProjectionLevel,enableGroundCatcher:this.enableGroundCatcher,groundCatcherHeight:this.groundCatcherHeight,envTotalSum:this.envTotalSum,envResolution:this.envResolution,directionalLightsBuffer:this.directionalLightsBufferNode,numDirectionalLights:this.numDirectionalLights,areaLightsBuffer:this.areaLightsBufferNode,numAreaLights:this.numAreaLights,pointLightsBuffer:this.pointLightsBufferNode,numPointLights:this.numPointLights,spotLightsBuffer:this.spotLightsBufferNode,numSpotLights:this.numSpotLights,maxBounceCount:this.maxBounces,maxSubsurfaceSteps:this.maxSubsurfaceSteps,maxTransparentBounces:this.maxTransparentBounces,transparentBackground:this.transparentBackground,backgroundIntensity:this.backgroundIntensity,backgroundColor:this.backgroundColor,backgroundBlurriness:this.backgroundBlurriness,backgroundBlurSamples:this.backgroundBlurSamples,showBackground:this.showBackground,globalIlluminationIntensity:this.globalIlluminationIntensity,cameraProjectionMatrix:this.cameraProjectionMatrix,cameraViewMatrix:this.cameraViewMatrix,fireflyThreshold:this.fireflyThreshold,shadowTerminatorOffset:this.shadowTerminatorOffset,frame:this.seedFrame,accumFrame:this.frame,resolution:this.resolution,emissiveTriangleCount:this.emissiveTriangleCount,emissiveVec4Offset:this.emissiveVec4Offset,emissiveTotalPower:this.emissiveTotalPower,emissiveBoost:this.emissiveBoost,totalTriangleCount:this.totalTriangleCount,enableEmissiveTriangleSampling:this.enableEmissiveTriangleSampling,lightBVHNodeCount:this.lightBVHNodeCount,reverseMapVec4Offset:this.reverseMapVec4Offset,currentBounce:this._wfCurrentBounce,maxRayCount:this._wfMaxRayCount,chunkRowBase:this._wfChunkRowBase,auxGBufferEnabled:this._auxGBufferUniform,hasSun:this.hasSun,sunDirection:this.sunDirection,sunRadiance:this.sunRadiance,sunParams:this.sunParams});this._kernelManager.register(`shade`,se().compute([Math.ceil(a/256),1,1],[256,1,1]));let ce=this._useSubgroupCompact&&(this.renderer.hasFeature?this.renderer.hasFeature(`subgroups`):!1);this._compactIsSubgroup=ce;let le=(ce?Kv:Gv)({rayBufferRO:h.rayBuffer.ro,activeIndicesReadRO:g.getActiveReadRO(),activeIndicesWriteRW:g.getActiveWrite(),counters:x,currentActiveCount:this._wfMaxRayCount});this._kernelManager.register(`compact`,le().compute([Math.ceil(a/256),1,1],[256,1,1]));let ue=(0,n.Fn)(()=>{(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount)});this._kernelManager.register(`enterFull`,ue().compute([1,1,1],[1,1,1]));let de=g.activeIndicesRO.b,fe=g.activeIndices.a,pe=(0,n.Fn)(()=>{let e=n.instanceIndex,t=(0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_RAY_COUNT)));(0,n.If)(e.equal((0,n.uint)(0)),()=>{let e=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS-1));C.element(e).assign(t),C.element(e.add((0,n.uint)(g.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(x.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(x.element((0,n.uint)($.ENTERING_COUNT)),t)}),(0,n.If)(e.greaterThanEqual(t),()=>{(0,n.Return)()}),fe.element(e).assign(de.element(e))});this._kernelManager.register(`compactCopyback`,pe().compute([Math.ceil(a/ay),1,1],[ay,1,1]));let me=Jv({rayBufferRO:h.rayBuffer.ro,gBufferRO:c,writeColorTex:b.color,writeNDTex:b.normalDepth,writeAlbedoTex:b.albedo,resolution:this.resolution,frame:this.frame,enableAccumulation:this.enableAccumulation,hasPreviousAccumulated:this.hasPreviousAccumulated,accumulationAlpha:this.accumulationAlpha,hasPreviousAux:this.hasPreviousAux,auxAccumulationAlpha:this.auxAccumulationAlpha,cameraIsMoving:this.cameraIsMoving,transparentBackground:this.transparentBackground,prevAccumTexture:_,prevAlbedoTexture:v,prevNormalDepthTexture:y,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,visMode:this.visMode,auxGBufferEnabled:this._auxGBufferUniform,cleanAuxNormalEnabled:this._cleanAuxNormalUniform,m2BufferRW:u,useAdaptiveSampling:this.useAdaptiveSampling,noiseThreshold:this.noiseThreshold,adaptiveMinSamples:this.adaptiveMinSamples,usePixelFreeze:this.usePixelFreeze,pixelFreezeThreshold:this.pixelFreezeThreshold,streakBufferRW:d,frozenMaskRO:m,convergenceOverlay:this.convergenceOverlay,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows});this._kernelManager.register(`finalWrite`,me().compute([Math.ceil(t/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let he=$v({writeColorTex:b.color,writeNDTex:b.normalDepth,writeAlbedoTex:b.albedo,resolution:this.resolution,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,cameraWorldMatrix:this.cameraWorldMatrix,cameraProjectionMatrixInverse:this.cameraProjectionMatrixInverse,cameraProjectionMatrix:this.cameraProjectionMatrix,cameraViewMatrix:this.cameraViewMatrix,cameraProjection:this.cameraProjection,panoLonRange:this.panoLonRange,panoLatRange:this.panoLatRange,panoLevelHorizon:this.panoLevelHorizon,enableDOF:this.enableDOF,focalLength:this.focalLength,aperture:this.aperture,focusDistance:this.focusDistance,unitsPerMetre:this.unitsPerMetre,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,dofMode:this.dofMode,dofBlur:this.dofBlur,bvhBuffer:I,triangleBuffer:L,materialBuffer:R,envTexture:ae,environmentMatrix:this.environmentMatrix,environmentIntensity:this.environmentIntensity,enableEnvironmentLight:this.enableEnvironment,visMode:this.visMode,debugVisScale:this.debugVisScale,frame:this.frame});this._kernelManager.register(`debug`,he().compute([Math.ceil(t/16),Math.ceil(r/16),1],[16,16,1])),this._wavefrontReady=!0;let ge=(this._packedBuffers?.totalBytes??0)+(this._queueManager?.totalBytes??0);iy.info(J.list([J.px(t,r),`${J.mb(ge)} wavefront buffers`,`budget ${J.n(i)} paths`,this._numChunks>1?`${this._numChunks} chunks of ≤${this._chunkRows} rows`:null]))}_setWfDispatch(){let e=this._wfRenderWidth.value,t=this._wfRenderHeight.value;this._kernelManager.setDispatchForGrid(`debug`,e,t),this._kernelManager.setDispatchForCount(`countConvergedDilated`,e*t)}_setChunk(e,t,n){let r=this._wfRenderWidth.value,i=t*r;this._wfChunkRowBase.value=e,this._wfChunkRows.value=t,this._wfIsFirstChunk.value=+(n===0),this._wfMaxRayCount.value=i;let a=this._kernelManager;return a.setDispatchForGrid(`generate`,r,t),a.setDispatchForGrid(`finalWrite`,r,t),a.setDispatchForCount(`initActiveIndices`,i),a.setDispatchForCount(`buildActivePixels`,i),i}dispose(){super.dispose(),this._packedBuffers?.dispose(),this._queueManager?.dispose(),this._kernelManager?.dispose(),this._gBufferAttr?.dispose?.(),this._m2Attr?.dispose?.(),this._streakAttr?.dispose?.(),this._frozenMaskAttr?.dispose?.(),this._packedBuffers=null,this._queueManager=null,this._kernelManager=null,this._gBufferAttr=null,this._m2Attr=null,this._streakAttr=null,this._frozenMaskAttr=null,this._convDebugSource=null,this._wavefrontReady=!1}},cy=class extends xe{constructor(e,i={}){super(`NormalDepth`,{...i,executionMode:be.ALWAYS}),this.renderer=e,this.pathTracer=i.pathTracer,this._dirty=!0,this.cameraWorldMatrix=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraProjectionMatrixInverse=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraRay=Qg(),this.resolutionWidth=(0,n.uniform)(i.width||1),this.resolutionHeight=(0,n.uniform)(i.height||1);let a=i.width||1,o=i.height||1;this._outputStorageTex=new t.StorageTexture(W,W),this._outputStorageTex.type=r.HalfFloatType,this._outputStorageTex.format=r.RGBAFormat,this._outputStorageTex.minFilter=r.NearestFilter,this._outputStorageTex.magFilter=r.NearestFilter,this._shadingStorageTex=new t.StorageTexture(W,W),this._shadingStorageTex.type=r.HalfFloatType,this._shadingStorageTex.format=r.RGBAFormat,this._shadingStorageTex.minFilter=r.NearestFilter,this._shadingStorageTex.magFilter=r.NearestFilter,this._shadingRT=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1}),this._leafStorageTex=null,this._leafRT=null,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0));let s={type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this._rtA=new t.RenderTarget(a,o,s),this._rtB=new t.RenderTarget(a,o,s),this._currentIdx=0,this._hasHistory=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._triStorageNode=null,this._bvhStorageNode=null,this._matStorageNode=null,this._lastTriAttr=null,this._lastBvhAttr=null,this._lastMatAttr=null,this._computeNode=null,this._computeBuilt=!1,this._linearBuckets=null}setupEventListeners(){this.on(`camera:moved`,()=>{this._dirty=!0}),this.on(`pipeline:reset`,()=>{this._dirty=!0})}_syncStorageBuffers(){let e=this.pathTracer;if(!e)return!1;let t=e.materialData?.materialStorageAttr,r=e.triangleGeoAttr&&e.triangleGeoAttr!==this._lastTriAttr,i=e.bvhStorageAttr&&e.bvhStorageAttr!==this._lastBvhAttr,a=t&&t!==this._lastMatAttr;return(r||i||a)&&(this._computeNode?.dispose?.(),this._computeNode=null,this._computeBuilt=!1,this._triStorageNode=null,this._bvhStorageNode=null,this._matStorageNode=null,this._dirty=!0,this._hasHistory=!1),e.triangleGeoAttr&&!this._triStorageNode&&(this._triStorageNode={geo:(0,n.storage)(e.triangleGeoAttr,`uvec4`,e.triangleGeoAttr.count).toReadOnly(),shade:(0,n.storage)(e.triangleShadeAttr,`uvec4`,e.triangleShadeAttr.count).toReadOnly()}),e.bvhStorageAttr&&!this._bvhStorageNode&&(this._bvhStorageNode=(0,n.storage)(e.bvhStorageAttr,`vec4`,e.bvhStorageAttr.count).toReadOnly()),t&&!this._matStorageNode&&(this._matStorageNode=(0,n.storage)(t,`vec4`,t.count).toReadOnly()),this._linearBuckets&&mf(this._linearBuckets,e.materialData?.linearBuckets),this._lastTriAttr=e.triangleGeoAttr||this._lastTriAttr,this._lastBvhAttr=e.bvhStorageAttr||this._lastBvhAttr,this._lastMatAttr=t||this._lastMatAttr,!!(this._triStorageNode&&this._bvhStorageNode&&this._matStorageNode)}_buildCompute(){let e=this._triStorageNode,t=this._bvhStorageNode,r=this._matStorageNode;this._linearBuckets=pf(this.pathTracer?.materialData?.linearBuckets),sf(pf(null),this._linearBuckets);let i=this.cameraWorldMatrix,a=this.cameraProjectionMatrixInverse,o=this.resolutionWidth,s=this.resolutionHeight,c=this._outputStorageTex,l=this._shadingStorageTex,u=this._leafStorageTex;this._computeNode=(0,n.Fn)(([i,a])=>{let d=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(o)).and(f.lessThan((0,n.int)(s))),()=>{let p=di($g((0,n.vec2)((0,n.float)(d).add(.5).div(o),(0,n.float)(f).add(.5).div(s)),i,a,this.cameraRay)),m=gi.wrap(b_(p,t,e)),h=m.normal.mul(.5).add(.5),g=(0,n.min)(m.dst,(0,n.float)(65504)),_=m.didHit.select((0,n.vec4)(h,g),(0,n.vec4)(0,0,0,(0,n.float)(65504)));(0,n.textureStore)(c,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),_).toWriteOnly(),u&&(0,n.textureStore)(u,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),(0,n.uvec4)((0,n.uint)(m.instanceLeaf.add(1)),0,0,0)).toWriteOnly();let v=m.normal.toVar(),y=(0,n.float)(1).toVar();(0,n.If)(m.didHit,()=>{let i=fi.wrap(ra(m.materialIndex,r)).toVar(),a=Ti.wrap(yf(m.uv,i)).toVar(),o=(0,n.vec4)(0).toVar();(0,n.If)(i.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{o.assign(Cf(e,m.triangleIndex,m.normal,i.normalTransform,t,m.instanceLeaf))});let s=wf(m.normal,i,a,o).toVar();v.assign(Tf(s,i,a)),y.assign(xf(i,a).y.clamp(.05,1))});let b=m.didHit.select((0,n.vec4)(v.mul(.5).add(.5),y),(0,n.vec4)(0,0,0,1));(0,n.textureStore)(l,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),b).toWriteOnly()})})(i,a).compute([this._dispatchX,this._dispatchY,1],[8,8,1]),this._computeBuilt=!0}render(e){if(!this.enabled||!this._syncStorageBuffers())return;this._computeBuilt||this._buildCompute();let t=this.pathTracer;if(t&&(this.cameraWorldMatrix.value.copy(t.uniforms.get(`cameraWorldMatrix`).value),this.cameraProjectionMatrixInverse.value.copy(t.uniforms.get(`cameraProjectionMatrixInverse`).value),this.cameraRay.sync(t.uniforms)),!this._dirty&&this._hasHistory){let t=this._currentIdx===0?this._rtA:this._rtB;e.setTexture(`pathtracer:normalDepth`,t.texture),e.setTexture(`pathtracer:prevNormalDepth`,t.texture),e.setTexture(`pathtracer:shadingNormal`,this._shadingRT.texture),this._publishLeaf(e);return}let n=e.getTexture(`pathtracer:color`);if(n&&n.image){let e=n.image;e.width>0&&e.height>0&&(e.width!==this._rtA.width||e.height!==this._rtA.height)&&this.setSize(e.width,e.height)}this._hasHistory&&(this._currentIdx=1-this._currentIdx);let r=this._currentIdx===0?this._rtA:this._rtB,i=this._currentIdx===0?this._rtB:this._rtA;this.renderer.compute(this._computeNode),this._srcRegion.max.set(r.width,r.height),this.renderer.copyTextureToTexture(this._outputStorageTex,r.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._shadingStorageTex,this._shadingRT.texture,this._srcRegion),this._leafRT&&this.renderer.copyTextureToTexture(this._leafStorageTex,this._leafRT.texture,this._srcRegion),this._hasHistory||=(this.renderer.copyTextureToTexture(this._outputStorageTex,i.texture,this._srcRegion),!0),e.setTexture(`pathtracer:normalDepth`,r.texture),e.setTexture(`pathtracer:prevNormalDepth`,i.texture),e.setTexture(`pathtracer:shadingNormal`,this._shadingRT.texture),this._publishLeaf(e),this._dirty=!1}releaseGPUMemory(){this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._leafStorageTex?.dispose(),this.reset(),this._hasHistory=!1}reset(){this._dirty=!0}setSize(e,t){this._rtA.setSize(e,t),this._rtA.texture.needsUpdate=!0,this._rtB.setSize(e,t),this._rtB.texture.needsUpdate=!0,this._shadingRT.setSize(e,t),this._shadingRT.texture.needsUpdate=!0,this._leafRT&&(this._leafRT.setSize(e,t),this._leafRT.texture.needsUpdate=!0),this._hasHistory=!1,this.resolutionWidth.value=e,this.resolutionHeight.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._computeNode&&(this._computeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]),this._dirty=!0}reallocateReservedStorage(){this._computeNode?.dispose(),this._computeNode=null,this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e};this._outputStorageTex=e(),this._shadingStorageTex=e(),this._leafStorageTex&&=(this._leafStorageTex.dispose(),this._makeLeafStorage()),this._computeBuilt=!1}setInstanceLeafOutput(e){e=!!e,e!==!!this._leafStorageTex&&(this._computeNode?.dispose(),this._computeNode=null,this._computeBuilt=!1,this._dirty=!0,e?(this._leafStorageTex=this._makeLeafStorage(),this._leafRT=new t.RenderTarget(this._rtA.width,this._rtA.height,{type:r.UnsignedIntType,format:r.RedIntegerFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1})):(this._leafStorageTex.dispose(),this._leafRT.dispose(),this._leafStorageTex=null,this._leafRT=null))}_publishLeaf(e){this._leafRT?e.setTexture(`pathtracer:instanceLeaf`,this._leafRT.texture):e.getTexture(`pathtracer:instanceLeaf`)&&e.removeTexture(`pathtracer:instanceLeaf`)}_makeLeafStorage(){let e=new t.StorageTexture(W,W);return e.type=r.UnsignedIntType,e.format=r.RedIntegerFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e}dispose(){this._computeNode?.dispose(),this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._shadingRT?.dispose(),this._leafStorageTex?.dispose(),this._leafRT?.dispose(),this._rtA?.dispose(),this._rtB?.dispose()}},ly=class extends xe{constructor(e,i,a={}){super(`MotionVector`,{...a,executionMode:be.ALWAYS}),this.renderer=e,this.camera=i,this.pathTracer=a.pathTracer||null;let o=a.width||1,s=a.height||1;this.prevViewProjectionMatrix=new r.Matrix4,this.currentViewProjectionMatrix=new r.Matrix4,this.matricesInitialized=!1,this.isFirstFrame=!0,this.frameCount=0,this.cameraWorldMatrix=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraProjectionMatrixInverse=(0,n.uniform)(new r.Matrix4,`mat4`),this.cameraRay=Qg(),this.prevVP=(0,n.uniform)(new r.Matrix4,`mat4`),this.isFirstFrameU=(0,n.uniform)(1),this.deltaTime=(0,n.uniform)(1/60),this.velocityScale=(0,n.uniform)(1),this.resolutionWidth=(0,n.uniform)(o),this.resolutionHeight=(0,n.uniform)(s),this._normalDepthTexNode=new t.TextureNode,this._screenSpaceStorageTex=new t.StorageTexture(W,W),this._screenSpaceStorageTex.type=r.HalfFloatType,this._screenSpaceStorageTex.format=r.RGBAFormat,this._screenSpaceStorageTex.minFilter=r.NearestFilter,this._screenSpaceStorageTex.magFilter=r.NearestFilter,this._worldSpaceStorageTex=new t.StorageTexture(W,W),this._worldSpaceStorageTex.type=r.HalfFloatType,this._worldSpaceStorageTex.format=r.RGBAFormat,this._worldSpaceStorageTex.minFilter=r.NearestFilter,this._worldSpaceStorageTex.magFilter=r.NearestFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0));let c={type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this.screenSpaceTarget=new t.RenderTarget(o,s,c),this.worldSpaceTarget=new t.RenderTarget(o,s,c),this._dispatchX=Math.ceil(o/16),this._dispatchY=Math.ceil(s/16),this._buildScreenSpaceCompute(),this._buildWorldSpaceCompute()}_buildScreenSpaceCompute(){let e=this._normalDepthTexNode,t=this.cameraWorldMatrix,r=this.cameraProjectionMatrixInverse,i=this.prevVP,a=this.resolutionWidth,o=this.resolutionHeight,s=this._screenSpaceStorageTex;this._screenSpaceComputeNode=(0,n.Fn)(([t,r])=>{let c=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),l=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(c.lessThan((0,n.int)(a)).and(l.lessThan((0,n.int)(o))),()=>{let u=(0,n.textureLoad)(e,(0,n.ivec2)(c,l)).w,d=(0,n.vec2)((0,n.float)(c).add(.5).div(a),(0,n.float)(l).add(.5).div(o)),f=(0,n.vec4)(0,0,u,1).toVar();(0,n.If)(u.lessThan((0,n.float)(6e4)),()=>{let e=e_(d,u,t,r,this.cameraRay),a=i.mul((0,n.vec4)(e,1)),o=a.xy.div(a.w),s=(0,n.vec2)(o.x.mul(.5).add(.5),o.y.mul(-.5).add(.5)),c=d.sub(s),l=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1));f.assign(l.select((0,n.vec4)(c,u,1),(0,n.vec4)((0,n.float)(1e3),(0,n.float)(1e3),u,0)))}),(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(c),(0,n.uint)(l)),f).toWriteOnly()})})(t,r).compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_buildWorldSpaceCompute(){let e=this._normalDepthTexNode,t=this.cameraWorldMatrix,r=this.cameraProjectionMatrixInverse,i=this.prevVP,a=this.isFirstFrameU,o=this.deltaTime,s=this.velocityScale,c=this.resolutionWidth,l=this.resolutionHeight,u=this._worldSpaceStorageTex;this._worldSpaceComputeNode=(0,n.Fn)(([t,r])=>{let d=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(c)).and(f.lessThan((0,n.int)(l))),()=>{let p=(0,n.textureLoad)(e,(0,n.ivec2)(d,f)).w,m=(0,n.vec4)(0,0,0,0).toVar();(0,n.If)(a.lessThan(.5).and(p.lessThan((0,n.float)(6e4))),()=>{let e=(0,n.vec2)((0,n.float)(d).add(.5).div(c),(0,n.float)(f).add(.5).div(l)),a=e_(e,p,t,r,this.cameraRay),u=i.mul((0,n.vec4)(a,1)),h=u.xy.div(u.w),g=(0,n.vec2)(h.x.mul(.5).add(.5),h.y.mul(-.5).add(.5)),_=g.x.greaterThanEqual(0).and(g.x.lessThanEqual(1)).and(g.y.greaterThanEqual(0)).and(g.y.lessThanEqual(1)),v=e.sub(g),y=(0,n.vec3)(v.x.div(o).mul(s),v.y.div(o).mul(s),0);m.assign(_.select((0,n.vec4)(y,1),(0,n.vec4)(0,0,0,.5)))}),(0,n.textureStore)(u,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),m).toWriteOnly()})})(t,r).compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_updateCameraMatrices(){let e=this.pathTracer,t,n,r,i;if(e&&e.uniforms)this.cameraRay.sync(e.uniforms),t=e.uniforms.get(`cameraWorldMatrix`).value,n=e.uniforms.get(`cameraViewMatrix`).value,r=e.uniforms.get(`cameraProjectionMatrix`).value,i=e.uniforms.get(`cameraProjectionMatrixInverse`).value;else{let e=this.camera;if(!e)return;t=e.matrixWorld,n=e.matrixWorldInverse,r=e.projectionMatrix,i=e.projectionMatrixInverse}this.matricesInitialized?this.prevViewProjectionMatrix.copy(this.currentViewProjectionMatrix):(this.currentViewProjectionMatrix.multiplyMatrices(r,n),this.prevViewProjectionMatrix.copy(this.currentViewProjectionMatrix),this.matricesInitialized=!0),this.currentViewProjectionMatrix.multiplyMatrices(r,n),this.cameraWorldMatrix.value.copy(t),this.cameraProjectionMatrixInverse.value.copy(i),this.prevVP.value.copy(this.prevViewProjectionMatrix)}setupEventListeners(){this.on(`pipeline:reset`,()=>{this.reset()})}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:normalDepth`);if(!t)return;this._updateCameraMatrices(),this.isFirstFrameU.value=+!!this.isFirstFrame,this.frameCount++;let n=t.image;n&&n.width>0&&n.height>0&&(n.width!==this.screenSpaceTarget.width||n.height!==this.screenSpaceTarget.height)&&this.setSize(n.width,n.height),this._normalDepthTexNode.value=t,this.renderer.compute(this._screenSpaceComputeNode),this.renderer.compute(this._worldSpaceComputeNode),this._srcRegion.max.set(this.screenSpaceTarget.width,this.screenSpaceTarget.height),this.renderer.copyTextureToTexture(this._screenSpaceStorageTex,this.screenSpaceTarget.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._worldSpaceStorageTex,this.worldSpaceTarget.texture,this._srcRegion),e.setTexture(`motionVector:screenSpace`,this.screenSpaceTarget.texture),e.setTexture(`motionVector:worldSpace`,this.worldSpaceTarget.texture),e.setTexture(`motionVector:motion`,this.screenSpaceTarget.texture),this.emit(`motionvector:computed`,{frame:this.frameCount,isFirstFrame:this.isFirstFrame}),this.isFirstFrame=!1}releaseGPUMemory(){this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose(),this.reset()}reset(){this.matricesInitialized||(this.isFirstFrame=!0),this.frameCount=0}setSize(e,t){this.screenSpaceTarget.setSize(e,t),this.screenSpaceTarget.texture.needsUpdate=!0,this.worldSpaceTarget.setSize(e,t),this.worldSpaceTarget.texture.needsUpdate=!0,this.resolutionWidth.value=e,this.resolutionHeight.value=t,this._dispatchX=Math.ceil(e/16),this._dispatchY=Math.ceil(t/16),this._screenSpaceComputeNode&&(this._screenSpaceComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]),this._worldSpaceComputeNode&&(this._worldSpaceComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1])}setVelocityScale(e){this.velocityScale.value=e}setDeltaTime(e){this.deltaTime.value=e}reallocateReservedStorage(){this._screenSpaceComputeNode?.dispose(),this._worldSpaceComputeNode?.dispose(),this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.NearestFilter,e.magFilter=r.NearestFilter,e};this._screenSpaceStorageTex=e(),this._worldSpaceStorageTex=e(),this._buildScreenSpaceCompute(),this._buildWorldSpaceCompute()}dispose(){this._screenSpaceComputeNode?.dispose(),this._worldSpaceComputeNode?.dispose(),this._screenSpaceStorageTex?.dispose(),this._worldSpaceStorageTex?.dispose(),this.screenSpaceTarget?.dispose(),this.worldSpaceTarget?.dispose(),this._normalDepthTexNode?.dispose()}},uy=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),dy=e=>(0,n.vec3)(uy(e.x),uy(e.y),uy(e.z)),fy=class extends xe{constructor(e,i={}){super(`ASVGF`,{...i,executionMode:be.PER_CYCLE}),this.renderer=e,this.temporalAlpha=(0,n.uniform)(i.temporalAlpha??0),this.gradientStrength=(0,n.uniform)(i.gradientStrength??1),this.gradientSigmaScale=(0,n.uniform)(i.gradientSigmaScale??2),this.gradientNoiseFloor=(0,n.uniform)(i.gradientNoiseFloor??0),this.maxAccumFrames=(0,n.uniform)(i.maxAccumFrames??32),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this.temporalEnabledU=(0,n.uniform)(1),this.forceResetU=(0,n.uniform)(0),this._colorTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._motionTexNode=new t.TextureNode,this._normalDepthTexNode=new t.TextureNode,this._prevNormalDepthTexNode=new t.TextureNode,this._readTemporalTexNode=new t.TextureNode,this._gradientReadTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._temporalTexA=new t.StorageTexture(W,W),this._temporalTexA.type=r.FloatType,this._temporalTexA.format=r.RGBAFormat,this._temporalTexA.minFilter=r.LinearFilter,this._temporalTexA.magFilter=r.LinearFilter,this._temporalTexB=new t.StorageTexture(W,W),this._temporalTexB.type=r.FloatType,this._temporalTexB.format=r.RGBAFormat,this._temporalTexB.minFilter=r.LinearFilter,this._temporalTexB.magFilter=r.LinearFilter,this._outputModulatedTex=new t.StorageTexture(W,W),this._outputModulatedTex.type=r.FloatType,this._outputModulatedTex.format=r.RGBAFormat,this._outputModulatedTex.minFilter=r.LinearFilter,this._outputModulatedTex.magFilter=r.LinearFilter,this._gradientStorageTex=new t.StorageTexture(W,W),this._gradientStorageTex.type=r.HalfFloatType,this._gradientStorageTex.format=r.RGBAFormat,this._gradientStorageTex.minFilter=r.LinearFilter,this._gradientStorageTex.magFilter=r.LinearFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this._demodulatedRT=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._outputRT=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._gradientRT=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this.currentMoments=0,this._compiled=!1,this._needsWarmReset=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._buildGradientCompute(),this._buildTemporalCompute(),this.showHeatmap=!1,this.debugMode=(0,n.uniform)(0,`int`),this._heatmapStorageTex=new t.StorageTexture(W,W),this._heatmapStorageTex.type=r.FloatType,this._heatmapStorageTex.format=r.RGBAFormat,this._heatmapStorageTex.minFilter=r.NearestFilter,this._heatmapStorageTex.magFilter=r.NearestFilter,this.heatmapTarget=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1}),this._heatmapRawColorTexNode=new t.TextureNode,this._heatmapColorTexNode=new t.TextureNode,this._heatmapTemporalTexNode=new t.TextureNode,this._heatmapNDTexNode=new t.TextureNode,this._heatmapMotionTexNode=new t.TextureNode,this._heatmapGradientTexNode=new t.TextureNode,this._buildHeatmapCompute()}_buildGradientCompute(){let e=this._colorTexNode,t=this._albedoTexNode,r=this._motionTexNode,i=this._readTemporalTexNode,a=this.gradientNoiseFloor,o=this.gradientSigmaScale,s=this._gradientStorageTex,c=this.resW,l=this.resH,u=(0,n.workgroupArray)(`float`,144),d=(0,n.workgroupArray)(`float`,144);this._gradientNode=(0,n.Fn)(()=>{let f=n.localId.x,p=n.localId.y,m=p.mul(8).add(f),h=(0,n.int)(n.workgroupId.x).mul(8).sub(2).toVar(),g=(0,n.int)(n.workgroupId.y).mul(8).sub(2).toVar(),_=a=>{let o=a.mod((0,n.uint)(12)),s=a.div((0,n.uint)(12)),f=h.add((0,n.int)(o)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),p=g.add((0,n.int)(s)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),m=(0,n.textureLoad)(e,(0,n.ivec2)(f,p)).xyz,_=(0,n.textureLoad)(t,(0,n.ivec2)(f,p)).xyz,v=Ui(dy(m.div((0,n.max)(_,(0,n.vec3)(Xe))))).toVar();u.element(a).assign(v);let y=(0,n.textureLoad)(r,(0,n.ivec2)(f,p)),b=(0,n.float)(f).sub(y.x.mul(c)),x=(0,n.float)(p).sub(y.y.mul(l)),S=(0,n.int)(b.add(.5)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),C=(0,n.int)(x.add(.5)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),w=y.w.greaterThan(.5),T=(0,n.textureLoad)(i,(0,n.ivec2)(S,C)).xyz,E=w.select(Ui(T),v);d.element(a).assign(E)};_(m);let v=m.add((0,n.uint)(64));(0,n.If)(v.lessThan((0,n.uint)(144)),()=>{_(v)});let y=m.add((0,n.uint)(128));(0,n.If)(y.lessThan((0,n.uint)(144)),()=>{_(y)}),(0,n.workgroupBarrier)();let b=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(f)),x=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(p));(0,n.If)(b.lessThan((0,n.int)(c)).and(x.lessThan((0,n.int)(l))),()=>{let e=(0,n.float)(0).toVar(),t=(0,n.float)(0).toVar();for(let r=-2;r<=2;r++)for(let i=-2;i<=2;i++){let a=p.add((0,n.uint)(2+r)).mul((0,n.uint)(12)).add(f.add((0,n.uint)(2+i))),o=u.element(a);e.addAssign(o),t.addAssign(o.mul(o))}let m=e.div(25),h=(0,n.sqrt)((0,n.max)(t.div(25).sub(m.mul(m)),(0,n.float)(0))).mul(o).toVar(),g=(0,n.float)(0).toVar();for(let e=-2;e<=2;e++)for(let t=-2;t<=2;t++){let r=p.add((0,n.uint)(2+e)).mul((0,n.uint)(12)).add(f.add((0,n.uint)(2+t))),i=u.element(r),o=d.element(r),s=(0,n.max)((0,n.max)((0,n.abs)(i.sub(o)).sub(h),(0,n.float)(0)).div((0,n.max)((0,n.max)(i,o),(0,n.float)(.001))).sub(a),(0,n.float)(0)).div((0,n.max)((0,n.float)(1).sub(a),(0,n.float)(1e-4)));g.addAssign(s.mul(s))}let _=g.div(25).clamp(0,1).toVar(),v=(0,n.textureLoad)(r,(0,n.ivec2)(b,x)),y=(0,n.int)((0,n.float)(b).sub(v.x.mul(c)).add(.5)).clamp((0,n.int)(0),(0,n.int)(c).sub(1)),S=(0,n.int)((0,n.float)(x).sub(v.y.mul(l)).add(.5)).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),C=v.w.greaterThan(.5).select((0,n.textureLoad)(i,(0,n.ivec2)(y,S)).w,(0,n.float)(0)).div(4).clamp(0,1),w=_.mul(C);(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(b),(0,n.uint)(x)),(0,n.vec4)(w,_,h,1)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}_buildTemporalCompute(){this._temporalNodeA=this._buildTemporalForDirection(this._temporalTexA),this._temporalNodeB=this._buildTemporalForDirection(this._temporalTexB)}_buildTemporalForDirection(e){let t=this._colorTexNode,r=this._albedoTexNode,i=this._motionTexNode,a=this._normalDepthTexNode,o=this._prevNormalDepthTexNode,s=this._readTemporalTexNode,c=this._gradientReadTexNode,l=this._outputModulatedTex,u=this.maxAccumFrames,d=this.temporalAlpha,f=this.gradientStrength,p=this.temporalEnabledU,m=this.forceResetU,h=this.resW,g=this.resH;return(0,n.Fn)(()=>{let _=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),v=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(_.lessThan((0,n.int)(h)).and(v.lessThan((0,n.int)(g))),()=>{let y=(0,n.ivec2)(_,v),b=(0,n.textureLoad)(t,y),x=b.xyz,S=b.w,C=(0,n.textureLoad)(r,y).xyz,w=(0,n.max)(C,(0,n.vec3)(Xe)),T=dy(x.div(w)),E=(0,n.vec4)(T,1).toVar(),D=(0,n.vec4)(x,S).toVar();(0,n.If)(p.greaterThan(.5).and(m.lessThan(.5)),()=>{let e=(0,n.textureLoad)(i,y),t=e.w.greaterThan(.5),r=(0,n.float)(_).sub(e.x.mul(h)),l=(0,n.float)(v).sub(e.y.mul(g)),p=r.greaterThanEqual(0).and(r.lessThan((0,n.float)(h))).and(l.greaterThanEqual(0)).and(l.lessThan((0,n.float)(g)));(0,n.If)(t.and(p),()=>{let e=(0,n.textureLoad)(a,y),t=e.xyz.mul(2).sub(1),i=e.w,p=(0,n.int)(r),m=(0,n.int)(l),_=p.add((0,n.int)(1)),v=m.add((0,n.int)(1)),b=r.sub((0,n.float)(p)),x=l.sub((0,n.float)(m)),C=p.clamp((0,n.int)(0),(0,n.int)(h).sub(1)),O=_.clamp((0,n.int)(0),(0,n.int)(h).sub(1)),k=m.clamp((0,n.int)(0),(0,n.int)(g).sub(1)),A=v.clamp((0,n.int)(0),(0,n.int)(g).sub(1)),j=(0,n.float)(1).sub(b).mul((0,n.float)(1).sub(x)),M=b.mul((0,n.float)(1).sub(x)),N=(0,n.float)(1).sub(b).mul(x),P=b.mul(x),F=(e,r,a)=>{let s=(0,n.textureLoad)(o,(0,n.ivec2)(e,r)),c=s.xyz.mul(2).sub(1),l=s.w,u=(0,n.pow)((0,n.dot)(t,c).clamp(0,1),(0,n.float)(16)),d=(0,n.exp)((0,n.abs)(i.sub(l)).div((0,n.max)(i,(0,n.float)(.001))).div((0,n.float)(.05)).negate());return a.mul(u).mul(d)},I=F(C,k,j),L=F(O,k,M),R=F(C,A,N),ee=F(O,A,P),te=I.add(L).add(R).add(ee);(0,n.If)(te.greaterThan((0,n.float)(.01)),()=>{let e=(0,n.textureLoad)(s,(0,n.ivec2)(C,k)),t=(0,n.textureLoad)(s,(0,n.ivec2)(O,k)),r=(0,n.textureLoad)(s,(0,n.ivec2)(C,A)),i=(0,n.textureLoad)(s,(0,n.ivec2)(O,A)),a=(0,n.float)(1).div(te),o=e.xyz.mul(I).add(t.xyz.mul(L)).add(r.xyz.mul(R)).add(i.xyz.mul(ee)).mul(a),l=e.w.mul(I).add(t.w.mul(L)).add(r.w.mul(R)).add(i.w.mul(ee)).mul(a),p=(0,n.textureLoad)(c,y).x.mul(f).clamp(0,1),m=dy((0,n.mix)(o,T,(0,n.mix)((0,n.max)((0,n.float)(1).div(l.add(1)),d),(0,n.float)(1),p))),h=(0,n.min)(l.add(1),u);E.assign((0,n.vec4)(m,h)),D.assign((0,n.vec4)(m.mul(w),S))})})}),(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(_),(0,n.uint)(v)),E).toWriteOnly(),(0,n.textureStore)(l,(0,n.uvec2)((0,n.uint)(_),(0,n.uint)(v)),D).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}_buildHeatmapCompute(){let e=this._heatmapRawColorTexNode,t=this._heatmapColorTexNode,r=this._heatmapTemporalTexNode,i=this._heatmapNDTexNode,a=this._heatmapMotionTexNode,o=this._heatmapGradientTexNode,s=this._heatmapStorageTex,c=this.debugMode,l=this.resW,u=this.resH;this._heatmapComputeNode=(0,n.Fn)(()=>{let d=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),f=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(l)).and(f.lessThan((0,n.int)(u))),()=>{let p=(0,n.ivec2)(d,f),m=(0,n.vec4)(0,0,0,1).toVar();(0,n.If)(c.equal((0,n.int)(0)),()=>{let e=(0,n.textureLoad)(t,p).xyz;m.assign((0,n.vec4)(e,1))}).ElseIf(c.equal((0,n.int)(1)),()=>{let t=(0,n.float)(0).toVar(),r=(0,n.float)(0).toVar();for(let i=-1;i<=1;i++)for(let a=-1;a<=1;a++){let o=(0,n.textureLoad)(e,(0,n.ivec2)(d.add(a).clamp((0,n.int)(0),(0,n.int)(l).sub(1)),f.add(i).clamp((0,n.int)(0),(0,n.int)(u).sub(1)))).xyz,s=Ui(o);t.addAssign(s),r.addAssign(s.mul(s))}t.divAssign(9),r.divAssign(9);let i=(0,n.max)(r.sub(t.mul(t)),(0,n.float)(0)).div((0,n.max)(t.mul(t),(0,n.float)(1e-4))).mul(10).clamp(0,1),a=i.sub(.5).mul(4).clamp(0,1),o=i.mul(4).clamp(0,1).sub(i.sub(.75).mul(4).clamp(0,1)),s=(0,n.float)(1).sub(i.sub(.25).mul(4).clamp(0,1));m.assign((0,n.vec4)(a,o,s,1))}).ElseIf(c.equal((0,n.int)(2)),()=>{let e=(0,n.textureLoad)(r,p).w.div(32).clamp(0,1);m.assign((0,n.vec4)((0,n.float)(1).sub(e),e,(0,n.float)(.2),1))}).ElseIf(c.equal((0,n.int)(3)),()=>{let e=(0,n.textureLoad)(a,p),t=(0,n.abs)(e.x).mul(100).clamp(0,1),r=(0,n.abs)(e.y).mul(100).clamp(0,1),i=t.add(r).clamp(0,1);m.assign((0,n.vec4)(t,r,i.mul(.3),1))}).ElseIf(c.equal((0,n.int)(4)),()=>{let e=(0,n.textureLoad)(i,p);m.assign((0,n.vec4)(e.xyz,1))}).Else(()=>{let e=(0,n.textureLoad)(o,p).x.mul(5).clamp(0,1);m.assign((0,n.vec4)(e,e.mul(.5),(0,n.float)(1).sub(e),1))}),(0,n.textureStore)(s,(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(f)),m).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}setupEventListeners(){this.on(`asvgf:reset`,()=>this.resetTemporalData()),this.on(`asvgf:updateParameters`,e=>this.updateParameters(e))}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:albedo`),r=e.getTexture(`pathtracer:normalDepth`),i=e.getTexture(`pathtracer:prevNormalDepth`)||r,a=e.getTexture(`motionVector:screenSpace`);if(!t)return;let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this._outputRT.width||o.height!==this._outputRT.height)&&this.setSize(o.width,o.height),this._colorTexNode.value=t,n&&(this._albedoTexNode.value=n),a&&(this._motionTexNode.value=a),r&&(this._normalDepthTexNode.value=r),i&&(this._prevNormalDepthTexNode.value=i);let s=this.currentMoments===0?this._temporalTexB:this._temporalTexA,c=this.currentMoments===0?this._temporalNodeA:this._temporalNodeB,l=this.currentMoments===0?this._temporalTexA:this._temporalTexB;this._compiled||=(this.renderer.compute(this._gradientNode),this.renderer.compute(this._temporalNodeA),this.renderer.compute(this._temporalNodeB),!0),this._readTemporalTexNode.value=s,this._gradientReadTexNode.value=this._gradientStorageTex;let u=this.gradientStrength.value>0||this.showHeatmap;u&&this.renderer.compute(this._gradientNode),this.forceResetU.value=+!!this._needsWarmReset,this.renderer.compute(c),this._needsWarmReset=!1,this._srcRegion.max.set(this.resW.value,this.resH.value),this.renderer.copyTextureToTexture(l,this._demodulatedRT.texture,this._srcRegion),this.renderer.copyTextureToTexture(this._outputModulatedTex,this._outputRT.texture,this._srcRegion),u&&this.renderer.copyTextureToTexture(this._gradientStorageTex,this._gradientRT.texture,this._srcRegion),e.setTexture(`asvgf:demodulated`,this._demodulatedRT.texture),e.setTexture(`asvgf:output`,this._outputRT.texture),e.setTexture(`asvgf:gradient`,this._gradientRT.texture),this.currentMoments=1-this.currentMoments,this.showHeatmap&&(this._heatmapRawColorTexNode.value=t,this._heatmapColorTexNode.value=this._outputModulatedTex,this._heatmapTemporalTexNode.value=l,r&&(this._heatmapNDTexNode.value=r),a&&(this._heatmapMotionTexNode.value=a),this._heatmapGradientTexNode.value=this._gradientStorageTex,this.renderer.compute(this._heatmapComputeNode),this._srcRegion.max.set(this.heatmapTarget.width,this.heatmapTarget.height),this.renderer.copyTextureToTexture(this._heatmapStorageTex,this.heatmapTarget.texture,this._srcRegion))}setHeatmapEnabled(e){this.showHeatmap=e}setTemporalEnabled(e){this.temporalEnabledU.value=+!!e}updateParameters(e){e&&(e.temporalAlpha!==void 0&&(this.temporalAlpha.value=e.temporalAlpha),e.gradientStrength!==void 0&&(this.gradientStrength.value=e.gradientStrength),e.gradientSigmaScale!==void 0&&(this.gradientSigmaScale.value=e.gradientSigmaScale),e.gradientNoiseFloor!==void 0&&(this.gradientNoiseFloor.value=e.gradientNoiseFloor),e.maxAccumFrames!==void 0&&(this.maxAccumFrames.value=e.maxAccumFrames),e.debugMode!==void 0&&(this.debugMode.value=e.debugMode))}resetTemporalData(){this.currentMoments=0,this._needsWarmReset=!0}reallocateReservedStorage(){this._gradientNode?.dispose(),this._temporalNodeA?.dispose(),this._temporalNodeB?.dispose(),this._heatmapComputeNode?.dispose(),this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._heatmapStorageTex?.dispose();let e=(e,n)=>{let i=new t.StorageTexture(W,W);return i.type=e,i.format=r.RGBAFormat,i.minFilter=n,i.magFilter=n,i};this._temporalTexA=e(r.FloatType,r.LinearFilter),this._temporalTexB=e(r.FloatType,r.LinearFilter),this._outputModulatedTex=e(r.FloatType,r.LinearFilter),this._gradientStorageTex=e(r.HalfFloatType,r.LinearFilter),this._heatmapStorageTex=e(r.FloatType,r.NearestFilter),this._buildGradientCompute(),this._buildTemporalCompute(),this._buildHeatmapCompute(),this._compiled=!1,this.currentMoments=0,this._needsWarmReset=!0}setSize(e,t){this._demodulatedRT.setSize(e,t),this._demodulatedRT.texture.needsUpdate=!0,this._outputRT.setSize(e,t),this._outputRT.texture.needsUpdate=!0,this._gradientRT.setSize(e,t),this._gradientRT.texture.needsUpdate=!0,this.heatmapTarget.setSize(e,t),this.heatmapTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._gradientNode.dispatchSize=[this._dispatchX,this._dispatchY,1],this._temporalNodeA.dispatchSize=[this._dispatchX,this._dispatchY,1],this._temporalNodeB.dispatchSize=[this._dispatchX,this._dispatchY,1],this._heatmapComputeNode.dispatchSize=[this._dispatchX,this._dispatchY,1]}reset(){}releaseGPUMemory(){this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._heatmapStorageTex?.dispose(),this.context?.removeTexture(`asvgf:demodulated`),this.context?.removeTexture(`asvgf:output`),this.context?.removeTexture(`asvgf:gradient`),this._demodulatedRT?.texture?.dispose(),this._outputRT?.texture?.dispose(),this._gradientRT?.texture?.dispose(),this.heatmapTarget?.texture?.dispose(),this.resetTemporalData()}dispose(){this._gradientNode?.dispose(),this._temporalNodeA?.dispose(),this._temporalNodeB?.dispose(),this._temporalTexA?.dispose(),this._temporalTexB?.dispose(),this._outputModulatedTex?.dispose(),this._gradientStorageTex?.dispose(),this._demodulatedRT?.dispose(),this._outputRT?.dispose(),this._gradientRT?.dispose(),this._heatmapComputeNode?.dispose(),this._heatmapStorageTex?.dispose(),this.heatmapTarget?.dispose(),this._colorTexNode?.dispose(),this._albedoTexNode?.dispose(),this._motionTexNode?.dispose(),this._normalDepthTexNode?.dispose(),this._prevNormalDepthTexNode?.dispose(),this._readTemporalTexNode?.dispose(),this._gradientReadTexNode?.dispose(),this._heatmapRawColorTexNode?.dispose(),this._heatmapColorTexNode?.dispose(),this._heatmapTemporalTexNode?.dispose(),this._heatmapNDTexNode?.dispose(),this._heatmapMotionTexNode?.dispose(),this._heatmapGradientTexNode?.dispose()}},py=1e-6,my=1.5/255,hy=.01,gy=3,_y=2,vy=2,yy=3,by=2,xy=38,Sy=.1,Cy=4,wy=Math.cos(89*Math.PI/180),Ty=.5,Ey=16,Dy={pre:{radiusScale:1,fractionScale:2},blur:{radiusScale:1,fractionScale:1},post:{radiusScale:2,fractionScale:.5}},Oy=.25*Math.SQRT2,ky=[[-1,0,1],[0,1,1],[1,0,1],[0,-1,1],[-Oy,Oy,.5],[Oy,Oy,.5],[Oy,-Oy,.5],[-Oy,-Oy,.5]],Ay=(e,t,r)=>(0,n.smoothstep)(0,1,(0,n.float)(1).sub(e.mul(t).add(r).abs())),jy=(e,t,r)=>{let i=e.mul(t).add(r).abs().mul(-gy);return(0,n.float)(1).div(i.mul(i).sub(i).add(1))},My=e=>(0,n.mix)((0,n.float)(1.570796),(0,n.float)(1.395402),(0,n.saturate)(e)).mul((0,n.sqrt)((0,n.saturate)((0,n.float)(1).sub(e)))),Ny=(e,t)=>(0,n.float)(1).sub((0,n.exp2)(e.mul(e).mul(-200))).mul((0,n.pow)((0,n.saturate)(e),t)),Py=(e,t)=>(0,n.saturate)(e).mul((0,n.sqrt)(t.div((0,n.float)(1).sub(t).add(py)))),Fy=(e,t,r,i)=>{let a=(0,n.max)((0,n.atan)(Py(r,i.mul((0,n.mix)((0,n.saturate)(t),(0,n.float)(1),e)))),(0,n.float)(my));return(0,n.float)(1).div(a)},Iy=(e,t)=>{let r=(0,n.float)(1).div((0,n.mix)((0,n.float)(hy),(0,n.float)(1),(0,n.saturate)(e.mul(t))));return(0,n.vec2)(r,e.mul(r).negate())},Ly=(e,t,r)=>{let i=(0,n.float)(1).div((0,n.mix)((0,n.float)(r),(0,n.float)(1),(0,n.mix)(e.mul(e),e,(0,n.saturate)(t))));return(0,n.vec2)(i,e.mul(i).negate())},Ry=(e,t)=>{let r=(0,n.float)(1).div(t);return(0,n.vec2)(r,e.mul(r).negate())},zy=(e,t,r,i)=>{let a=(0,n.float)(1).div(e.mul(t));return(0,n.vec2)(a,(0,n.dot)(i,r).mul(a).negate())},By=e=>(0,n.vec2)(1).sub((0,n.vec2)(1).sub((0,n.fract)(e.mul(.5)).mul(2)).abs()).min(.99999),Vy=e=>(0,n.vec3)((0,n.dot)(e,(0,n.vec3)(.25,.5,.25)),(0,n.dot)(e,(0,n.vec3)(.5,0,-.5)),(0,n.dot)(e,(0,n.vec3)(-.25,.5,-.25))),Hy=e=>{let t=e.x.sub(e.z);return(0,n.max)((0,n.vec3)(t.add(e.y),e.x.add(e.z),t.sub(e.y)),(0,n.vec3)(0))},Uy=(e,t)=>t.add(py).div(e.add(py)),Wy=(e,t)=>(0,n.vec4)(e.xyz.mul(Uy(e.x,t)),e.w),Gy=e=>(0,n.vec4)(Vy(Hy(e.xyz)),(0,n.saturate)(e.w)),Ky=(e,t)=>(0,n.sqrt)(t.sub(e.mul(e)).abs()),qy=(e,t)=>(0,n.vec2)(e.x.mul(t.x).add(e.y.mul(t.y)),e.z.mul(t.x).add(e.w.mul(t.y))),Jy=(e,t)=>(0,n.select)(e.equal(0),(0,n.vec4)(0),t);function Yy(e){let t=Math.imul(e|0,2654435761)>>>0;return t^=t>>>15,t=Math.imul(t,2246822507)>>>0,t^=t>>>13,t=Math.imul(t,3266489909)>>>0,t^=t>>>16,t/4294967296}var Xy=class extends xe{constructor(e,i={}){super(`NRD`,{...i,executionMode:be.PER_CYCLE}),this.renderer=e,this.pathTracer=i.pathTracer||null,this.settings={...et,...i.settings||{}};let a=i.width||1,o=i.height||1;this.resW=(0,n.uniform)(a),this.resH=(0,n.uniform)(o),this.minRectDimMulUnproject=(0,n.uniform)(1),this.inputFrames=(0,n.uniform)(0),this.resetU=(0,n.uniform)(0),this.debugMode=(0,n.uniform)(0,`int`),this.rotPre=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.rotBlur=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.rotPost=(0,n.uniform)(new r.Vector4(1,0,0,1),`vec4`),this.camWorld=(0,n.uniform)(new r.Matrix4,`mat4`),this.camProjInv=(0,n.uniform)(new r.Matrix4,`mat4`),this.camView=(0,n.uniform)(new r.Matrix4,`mat4`),this.prevCamView=(0,n.uniform)(new r.Matrix4,`mat4`),this.camPos=(0,n.uniform)(new r.Vector3,`vec3`),this.prevCamPos=(0,n.uniform)(new r.Vector3,`vec3`),this.viewVector=(0,n.uniform)(new r.Vector3,`vec3`),this.prevViewVector=(0,n.uniform)(new r.Vector3,`vec3`),this.cameraRay=Qg(),this.u={};for(let e of[`maxAccum`,`maxFast`,`stabilizationStrength`,`historyFixFrameNum`,`historyFixStride`,`prepassBlurRadius`,`minBlurRadius`,`maxBlurRadius`,`lobeAngleFraction`,`roughnessFraction`,`planeDistSensitivity`,`minHitDistanceWeight`,`fastClampSigmaScale`,`fireflyMinRelativeScale`,`antiFirefly`,`disocclusionThreshold`,`lobeVolumePercent`,`handoverFrames`])this.u[e]=(0,n.uniform)(0);this.u.antilag=(0,n.uniform)(new r.Vector2,`vec2`),this.u.convergence=(0,n.uniform)(new r.Vector3,`vec3`),this._syncUniforms(),this._colorTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._ndTexNode=new t.TextureNode,this._snTexNode=new t.TextureNode,this._motionTexNode=new t.TextureNode,this._placeholders=new Map;let s=()=>{let e=new r.DataTexture(new Float32Array(4),1,1,r.RGBAFormat,r.FloatType);e.needsUpdate=!0;let n=new t.TextureNode(e);return this._placeholders.set(n,e),n};this._nTmpA=s(),this._nTmpB=s(),this._nHist=s(),this._nFast=s(),this._nInternal=s(),this._nGeom=s(),this._nData=s(),this._nStabRead=s(),this._allocStorage(),this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this.outputTarget=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._needsReset=!0,this._stabPing=0,this._camInitialized=!1,this._dispatchX=Math.ceil(a/Ey),this._dispatchY=Math.ceil(o/Ey),this._buildKernels()}_allocStorage(){let e=()=>on(r.HalfFloatType);this._tmpA=e(),this._tmpB=e(),this._hist=e(),this._fastHist=e(),this._internal=e(),this._geomPrev=e(),this._stabA=e(),this._stabB=e(),this._dataT=e()}_disposeStorage(){for(let e of[this._tmpA,this._tmpB,this._hist,this._fastHist,this._internal,this._geomPrev,this._stabA,this._stabB,this._dataT])e?.dispose()}_disposeKernels(){for(let e of this._kernels??[])e?.dispose()}updateParameters(e){if(e){for(let t of Object.keys(e))t===`debugMode`?this.debugMode.value=e.debugMode|0:t in et&&(this.settings[t]=e[t]);this._syncUniforms()}}_syncUniforms(){let e=this.settings,t=this.u,n=Math.min(e.maxAccumulatedFrameNum,63),r=Math.min(e.maxStabilizedFrameNum,n),i=Math.max(e.maxBlurRadius,e.minBlurRadius);t.maxAccum.value=n,t.maxFast.value=e.maxFastAccumulatedFrameNum,t.stabilizationStrength.value=r/(1+r),t.historyFixFrameNum.value=e.historyFixFrameNum,t.historyFixStride.value=e.historyFixBasePixelStride,t.prepassBlurRadius.value=e.prepassBlurRadius,t.minBlurRadius.value=e.minBlurRadius,t.maxBlurRadius.value=i,t.lobeAngleFraction.value=e.lobeAngleFraction*e.lobeAngleFraction,t.roughnessFraction.value=e.roughnessFraction,t.planeDistSensitivity.value=e.planeDistanceSensitivity,t.minHitDistanceWeight.value=e.minHitDistanceWeight;let a=Math.min(1,Math.max(0,i/2));t.fastClampSigmaScale.value=3+(e.fastHistoryClampingSigmaScale-3)*a,t.fireflyMinRelativeScale.value=e.fireflySuppressorMinRelativeScale,t.antiFirefly.value=+!!e.enableAntiFirefly,t.antilag.value.set(e.antilagLuminanceSigmaScale,e.antilagLuminanceSensitivity),t.disocclusionThreshold.value=e.disocclusionThreshold,t.convergence.value.set(e.convergenceS,e.convergenceB,e.convergenceP),t.lobeVolumePercent.value=e.lobeVolumePercent,t.handoverFrames.value=e.handoverFrames>0?e.handoverFrames:2*n}_worldPosAt(e,t,n,r){return e_(e,t,n,r,this.cameraRay)}_viewVector(e,t,r){return(0,n.select)(Zg(this.cameraRay.cameraProjection),r,(0,n.normalize)(t.sub(e)))}_frustumSize(e){return this.minRectDimMulUnproject.mul((0,n.select)(Zg(this.cameraRay.cameraProjection),(0,n.float)(1),e))}_pixelUv(e,t){return(0,n.vec2)((0,n.float)(e).add(.5).div(this.resW),(0,n.float)(t).add(.5).div(this.resH))}_clampCoord(e,t){return(0,n.ivec2)(e.clamp((0,n.int)(0),(0,n.int)(this.resW).sub(1)),t.clamp((0,n.int)(0),(0,n.int)(this.resH).sub(1)))}_uvToCoord(e){return this._clampCoord((0,n.int)(e.x.mul(this.resW)),(0,n.int)(e.y.mul(this.resH)))}_advancedNonLinear(e){let t=this.u.convergence,r=(0,n.saturate)(e.div((0,n.float)(1).add(this.u.maxAccum.mul(t.z)))),i=t.x.mul((0,n.mix)(t.y,(0,n.float)(1),r));return(0,n.float)(1).div((0,n.float)(1).add(i.mul(e)))}_handover(e){return(0,n.saturate)(e.div((0,n.max)(this.u.handoverFrames,1)))}_bilinear(e){let t=e.mul((0,n.vec2)(this.resW,this.resH)).sub(.5),r=(0,n.floor)(t),i=(0,n.saturate)(t.sub(r)),a=(0,n.int)(r.x),o=(0,n.int)(r.y),s=(e,t)=>(0,n.select)(e.greaterThanEqual((0,n.int)(0)).and(t.greaterThanEqual((0,n.int)(0))).and(e.lessThan((0,n.int)(this.resW))).and(t.lessThan((0,n.int)(this.resH))),(0,n.float)(1),(0,n.float)(0));return{f:i,taps:[this._clampCoord(a,o),this._clampCoord(a.add(1),o),this._clampCoord(a,o.add(1)),this._clampCoord(a.add(1),o.add(1))],inScreen:[s(a,o),s(a.add(1),o),s(a,o.add(1)),s(a.add(1),o.add(1))],customWeights:e=>[e[0].mul((0,n.float)(1).sub(i.x)).mul((0,n.float)(1).sub(i.y)),e[1].mul(i.x).mul((0,n.float)(1).sub(i.y)),e[2].mul((0,n.float)(1).sub(i.x)).mul(i.y),e[3].mul(i.x).mul(i.y)],filter:e=>(0,n.mix)((0,n.mix)(e[0],e[1],i.x),(0,n.mix)(e[2],e[3],i.x),i.y)}}_applyCustomWeights(e,t,r){let i=e[0].mul(t[0]).add(e[1].mul(t[1])).add(e[2].mul(t[2])).add(e[3].mul(t[3])),a=t[0].add(t[1]).add(t[2]).add(t[3]);return(0,n.select)(a.lessThan(1e-4),r,i.div((0,n.max)(a,1e-4)))}_sampleHistory(e,t,r,i,a){let o=(0,n.vec4)(0).toVar();return(0,n.If)(a,()=>{let r=(0,n.saturate)(t).mul((0,n.vec2)(this.resW,this.resH)),i=(0,n.floor)(r.sub(.5)).add(.5),a=(0,n.saturate)(r.sub(i)),s=Ty,c=a.mul(a.mul(a.mul(-s).add(2*s)).sub(s)),l=a.mul(a.mul(a.mul(2-s).sub(3-s))).add(1),u=a.mul(a.mul(a.mul(-(2-s)).add(3-2*s)).add(s)),d=a.mul(a.mul(a.mul(s).sub(s))),f=[c.x,l.x,u.x,d.x],p=[c.y,l.y,u.y,d.y],m=(0,n.int)(i.x).sub(1),h=(0,n.int)(i.y).sub(1),g=(0,n.vec4)(0).toVar(),_=(0,n.float)(0).toVar();for(let t=0;t<4;t++)for(let n=0;n<4;n++){if((n===0||n===3)&&(t===0||t===3))continue;let r=f[n].mul(p[t]);g.addAssign(e(this._clampCoord(m.add(n),h.add(t))).mul(r)),_.addAssign(r)}o.assign((0,n.select)(_.lessThan(1e-4),(0,n.vec4)(0),g.div((0,n.max)(_,1e-4))))}).Else(()=>{o.assign(this._applyCustomWeights(r.taps.map(t=>e(t)),i,(0,n.vec4)(0)))}),o}_buildKernels(){this._kPre=this._buildSpatial(`pre`),this._kTa=this._buildTemporalAccumulation(),this._kHf=this._buildHistoryFix(),this._kBlur=this._buildSpatial(`blur`),this._kPost=this._buildSpatial(`post`),this._kTsA=this._buildTemporalStabilization(this._stabA),this._kTsB=this._buildTemporalStabilization(this._stabB),this._kernels=[this._kPre,this._kTa,this._kHf,this._kBlur,this._kPost,this._kTsA,this._kTsB]}_dispatchOf(e){return e(this.camWorld,this.camProjInv).compute([this._dispatchX,this._dispatchY,1],[Ey,Ey,1])}_buildSpatial(e){let t=e===`pre`,{radiusScale:r,fractionScale:i}=Dy[e],a=this.u,o=this._colorTexNode,s=this._albedoTexNode,c=this._ndTexNode,l=this._snTexNode,u=this._nData,d=e===`blur`?this._nTmpA:this._nTmpB,f=e===`blur`?this._tmpB:t?this._tmpA:this._hist,p=this._geomPrev,m=t?this.rotPre:e===`blur`?this.rotBlur:this.rotPost,h=t?a.prepassBlurRadius:a.maxBlurRadius,g=this.camView,_=this.camPos,v=this.resW,y=this.resH,b=this.inputFrames,x=t?e=>{let t=(0,n.textureLoad)(o,e),r=(0,n.textureLoad)(s,e);return(0,n.vec4)(Vy(zi(t.xyz.div((0,n.max)(r.xyz,(0,n.vec3)(Xe))))),Ri(r.w,Li).min(1))}:e=>(0,n.textureLoad)(d,e),S=(0,n.Fn)(([o,s])=>{let d=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),S=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(d.lessThan((0,n.int)(v)).and(S.lessThan((0,n.int)(y))),()=>{let C=(0,n.ivec2)(d,S),w=(0,n.uvec2)((0,n.uint)(d),(0,n.uint)(S)),T=(0,n.textureLoad)(c,C).w.toVar(),E=T.greaterThanEqual(qe),D=(0,n.textureLoad)(l,C).toVar(),O=(0,n.normalize)(D.xyz.mul(2).sub(1)).toVar(),k=D.w.clamp(.05,1).toVar(),A=(0,n.float)(qe).toVar(),j=x(C).toVar();(0,n.If)(E.not(),()=>{let e=this._pixelUv(d,S),f=this._worldPosAt(e,T,o,s).toVar();A.assign(g.mul((0,n.vec4)(f,1)).z.abs()),(0,n.If)(h.greaterThan(0),()=>{let d=(0,n.dot)(O,this._viewVector(f,_,this.viewVector)).abs().toVar(),p=this._frustumSize(A).toVar(),S=b.add(1),w=t?(0,n.max)(b,(0,n.float)(10)):(0,n.textureLoad)(u,C).y.add(b),T=(t?(0,n.float)(1).div(w.add(1)):this._advancedNonLinear(w)).toVar(),E=Ny(k,.5).toVar(),D=A.mul(Ye).add(3),M=j.w.toVar(),N=(0,n.saturate)(M.mul(D).div(p)),P=(0,n.float)(1).sub(this._handover(S)),F=(t?N.div(S):N.mul(T)).mul(P),I=a.minBlurRadius.mul((0,n.saturate)((0,n.float)(2).sub(w.div((0,n.max)(a.maxAccum,1))))),L=(0,n.max)((0,n.saturate)((0,n.sqrt)((0,n.saturate)(F)).mul(r)).mul(h).mul(E),I.mul(E)).toVar(),R=zy(a.planeDistSensitivity,p,f,O).toVar(),ee=Fy(T,a.lobeAngleFraction,k,a.lobeVolumePercent).div(i).toVar(),te=Iy(k,a.roughnessFraction.mul(i)).toVar(),ne=Ry(M,T).toVar(),re=a.minHitDistanceWeight.mul(i).mul(E);t||(re=re.mul(T)),re=re.toVar();let z=(0,n.vec2)(1);if(!t){let e=g.mul((0,n.vec4)(O,0)).xy;z=(0,n.mix)((0,n.vec2)(1).sub(e.abs()),(0,n.vec2)(1),d),z=z.div((0,n.max)(z.x,z.y))}let ie=z.mul((0,n.vec2)((0,n.float)(1).div(v),(0,n.float)(1).div(y))).mul(L).toVar(),ae=(0,n.float)(1).toVar();for(let t=0;t<ky.length;t++){let r=ky[t],i=e.add(qy(m,(0,n.vec2)(r[0],r[1])).mul(ie)),a=By(i),u=(0,n.select)(a.x.notEqual(i.x).or(a.y.notEqual(i.y)),(0,n.float)(1),(0,n.float)(Math.exp(-.66*r[2]*r[2]))).toVar(),d=this._uvToCoord(a),f=(0,n.textureLoad)(c,d).w,p=this._worldPosAt(a,f,o,s),h=(0,n.textureLoad)(l,d),g=My((0,n.dot)(O,(0,n.normalize)(h.xyz.mul(2).sub(1))));u.mulAssign(Ay(g,ee,(0,n.float)(0))),u.mulAssign(Ay(h.w,te.x,te.y)),u.mulAssign(Ay((0,n.dot)(O,p),R.x,R.y)),u.assign((0,n.select)(f.greaterThanEqual(qe),(0,n.float)(0),u));let _=Jy(u,x(d));u.mulAssign(re.add(jy(_.w,ne.x,ne.y))),ae.addAssign(u),j.addAssign(_.mul(u))}j.divAssign((0,n.max)(ae,1e-6)),t||j.assign((0,n.vec4)(j.xyz,M))})}),(0,n.textureStore)(f,w,j).toWriteOnly(),e===`post`&&(0,n.textureStore)(p,w,(0,n.vec4)(O,A)).toWriteOnly()})});return this._dispatchOf(S)}_buildTemporalAccumulation(){let e=this.u,t=this._ndTexNode,r=this._snTexNode,i=this._motionTexNode,a=this._nTmpA,o=this._nHist,s=this._nFast,c=this._nInternal,l=this._nGeom,u=this._tmpB,d=this._dataT,f=this.camView,p=this.prevCamView,m=this.camPos,h=this.prevCamPos,g=this.resW,_=this.resH,v=this.inputFrames,y=this.resetU,b=(0,n.Fn)(([b,x])=>{let S=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(S.lessThan((0,n.int)(g)).and(C.lessThan((0,n.int)(_))),()=>{let g=(0,n.ivec2)(S,C),_=(0,n.uvec2)((0,n.uint)(S),(0,n.uint)(C)),w=(0,n.textureLoad)(t,g).w,T=(0,n.textureLoad)(a,g).toVar();(0,n.If)(w.greaterThanEqual(qe),()=>{(0,n.textureStore)(u,_,T).toWriteOnly(),(0,n.textureStore)(d,_,(0,n.vec4)(0)).toWriteOnly(),(0,n.Return)()});let E=e.maxAccum.mul((0,n.float)(1).sub(y)).toVar(),D=e.maxFast.mul((0,n.float)(1).sub(y)).toVar(),O=(0,n.textureLoad)(r,g),k=(0,n.normalize)(O.xyz.mul(2).sub(1)).toVar(),A=O.w.clamp(.05,1).toVar(),j=this._pixelUv(S,C),M=this._worldPosAt(j,w,b,x).toVar(),N=f.mul((0,n.vec4)(M,1)).z.abs().toVar(),P=(0,n.dot)(k,this._viewVector(M,m,this.viewVector)).abs().toVar(),F=this._frustumSize(N).toVar(),I=(0,n.vec3)(0).toVar();I.addAssign(k.mul(.25));for(let e=-1;e<=0;e++)for(let i=-1;i<=0;i++){if(i===0&&e===0)continue;let a=this._clampCoord(S.add(i),C.add(e)),o=(0,n.normalize)((0,n.textureLoad)(r,a).xyz.mul(2).sub(1)),s=(0,n.textureLoad)(t,a).w.lessThan(qe);I.addAssign((0,n.select)(s,o,k).mul(.25))}let L=(0,n.textureLoad)(i,g),R=j.sub(L.xy).toVar(),ee=p.mul((0,n.vec4)(M,1)).z.abs().toVar(),te=this._bilinear(R),ne=F.mul((0,n.saturate)(e.disocclusionThreshold.div((0,n.max)(P,.05)))).sub(py).toVar(),re=(0,n.float)(1).sub(y),z=[],ie=[];for(let e=0;e<4;e++){let t=(0,n.textureLoad)(l,te.taps[e]),r=(0,n.select)((0,n.dot)(t.xyz,I).greaterThan(wy),(0,n.float)(1),(0,n.float)(0)),i=(0,n.select)(t.w.sub(ee).abs().lessThanEqual(ne),(0,n.float)(1),(0,n.float)(0)),a=(0,n.select)(t.w.lessThan(qe),(0,n.float)(1),(0,n.float)(0));z.push(r.mul(i).mul(a).mul(te.inScreen[e]).mul(re).toVar()),ie.push((0,n.textureLoad)(c,te.taps[e]).x)}let ae=te.customWeights(z).map(e=>e.toVar()),oe=z[0].add(z[1]).add(z[2]).add(z[3]).greaterThan(3.5).toVar(),se=z[0].add(z[1].mul(2)).add(z[2].mul(4)).add(z[3].mul(8)),ce=this._applyCustomWeights(ie,ae,(0,n.float)(0)).toVar(),le=(0,n.dot)(k,this._viewVector(M,h,this.prevViewVector)).abs().add(.001).div(P.add(.001)).toVar();le.assign((0,n.mix)((0,n.float)(.1),(0,n.float)(1),(0,n.saturate)(le.mul(le))));let ue=(0,n.sqrt)((0,n.saturate)(te.filter(z))).mul(le).toVar();ce.assign(ce.mul((0,n.mix)(ue,(0,n.float)(1),(0,n.float)(1).div(ce.add(1))))),ce.assign((0,n.min)(ce,E));let de=Gy(this._sampleHistory(e=>(0,n.textureLoad)(o,e),R,te,ae,oe)).toVar(),fe=(0,n.max)(this._applyCustomWeights(te.taps.map(e=>(0,n.textureLoad)(s,e).x),ae,(0,n.float)(0)),0).toVar(),pe=v.add(1),me=this._handover(pe).toVar(),he=ce.mul((0,n.float)(1).sub(me)),ge=pe.div(pe.add(he)).toVar(),_e=(0,n.float)(1).div((0,n.float)(1).add(Ny(A,.25).mul(.5).mul(E))),ve=(0,n.vec4)((0,n.mix)(de.xyz,T.xyz,ge),(0,n.mix)(de.w,T.w,(0,n.max)(ge,_e))).toVar(),ye=e.fireflyMinRelativeScale.add((0,n.float)(xy).div(ce.add(1))).toVar(),be=ce.mul(e.maxBlurRadius).mul(Sy).toVar();be.assign(be.div(be.add(1)).mul((0,n.float)(1).sub(me)));let xe=(0,n.mix)(ve.x,(0,n.min)(ve.x,de.x.mul(ye)),be);ve.assign(Wy(ve,xe));let Se=(0,n.float)(1.2).add((0,n.float)(1).div(ce.add(1)));ve.assign((0,n.vec4)(ve.xyz,(0,n.mix)(ve.w,(0,n.min)(ve.w,de.w.mul(Se)),be))),(0,n.textureStore)(u,_,ve).toWriteOnly();let B=(0,n.min)(ce,D).mul((0,n.float)(1).sub(me)),V=pe.div(pe.add(B)),Ce=(0,n.mix)(fe,T.x,V).toVar(),we=(0,n.min)(Ce,de.x.mul(ye).mul(Cy));Ce.assign((0,n.mix)(Ce,we,be)),(0,n.textureStore)(d,_,(0,n.vec4)(Ce,ce,se,(0,n.select)(oe,(0,n.float)(1),(0,n.float)(0)))).toWriteOnly()})});return this._dispatchOf(b)}_buildHistoryFix(){let e=this.u,t=this._ndTexNode,r=this._snTexNode,i=this._nTmpB,a=this._nData,o=this._tmpA,s=this._fastHist,c=this.camView,l=this.resW,u=this.resH,d=this.inputFrames,f=(0,n.Fn)(([f,p])=>{let m=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),h=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(m.lessThan((0,n.int)(l)).and(h.lessThan((0,n.int)(u))),()=>{let g=(0,n.ivec2)(m,h),_=(0,n.uvec2)((0,n.uint)(m),(0,n.uint)(h)),v=(0,n.textureLoad)(t,g).w;(0,n.If)(v.greaterThanEqual(qe),()=>{let e=(0,n.textureLoad)(i,g);(0,n.textureStore)(o,_,e).toWriteOnly(),(0,n.textureStore)(s,_,(0,n.vec4)(e.x,0,0,0)).toWriteOnly(),(0,n.Return)()});let y=(0,n.textureLoad)(a,g).toVar(),b=y.y.toVar(),x=b.add(d),S=this._handover(d.add(1)).toVar(),C=(0,n.textureLoad)(r,g),w=(0,n.normalize)(C.xyz.mul(2).sub(1)).toVar(),T=C.w.clamp(.05,1).toVar(),E=this._pixelUv(m,h),D=this._worldPosAt(E,v,f,p).toVar(),O=c.mul((0,n.vec4)(D,1)).z.abs(),k=this._frustumSize(O).toVar(),A=(0,n.textureLoad)(i,g).toVar(),j=(0,n.float)(1).div(x.add(1)).toVar(),M=O.mul(Ye).add(3),N=(0,n.saturate)(A.w.mul(M).div(k)),P=A.w.toVar(),F=(0,n.round)((0,n.select)(x.lessThan(e.historyFixFrameNum),(0,n.float)(1),(0,n.float)(0)).mul(.5).mul(2/_y).mul(e.historyFixStride).mul((0,n.mix)((0,n.float)(.25).add((0,n.sqrt)(N).mul(.75)),(0,n.float)(1),j))).toVar();(0,n.If)(F.notEqual(0),()=>{let o=Fy(j,e.lobeAngleFraction,T,e.lobeVolumePercent).toVar(),s=zy(e.planeDistSensitivity,k,D,w).toVar(),c=Ry(P,j).toVar(),d=Ly(T.mul(T),(0,n.sqrt)(e.roughnessFraction),hy).toVar(),m=(0,n.float)(1).add(b).toVar();A.mulAssign(m);for(let e=-_y;e<=_y;e++)for(let h=-_y;h<=_y;h++){if(h===0&&e===0||Math.abs(h)+Math.abs(e)===_y*2)continue;let g=By(E.add((0,n.vec2)(h,e).mul(F).mul((0,n.vec2)((0,n.float)(1).div(l),(0,n.float)(1).div(u))))),_=this._uvToCoord(g),v=(0,n.textureLoad)(t,_).w,y=this._worldPosAt(g,v,f,p),b=(0,n.textureLoad)(r,_),x=jy(My((0,n.dot)((0,n.normalize)(b.xyz.mul(2).sub(1)),w)),o,(0,n.float)(0)).toVar();x.mulAssign(jy(b.w.mul(b.w),d.x,d.y)),x.mulAssign((0,n.float)(1).add((0,n.textureLoad)(a,_).y)),x.mulAssign(Ay((0,n.dot)(w,y),s.x,s.y)),x.assign((0,n.select)(v.greaterThanEqual(qe),(0,n.float)(0),x));let S=Jy(x,(0,n.textureLoad)(i,_));x.mulAssign(jy(S.w,c.x,c.y)),m.addAssign(x),A.addAssign(S.mul(x))}A.divAssign((0,n.max)(m,1e-6))});let I=A.x.toVar(),L=(0,n.saturate)(b.div((0,n.max)(e.historyFixFrameNum,py))),R=(0,n.mix)(I,y.x,L).toVar();(0,n.textureStore)(s,_,(0,n.vec4)(R,0,0,0)).toWriteOnly();let ee=R.toVar(),te=R.mul(R).toVar(),ne=(0,n.float)(0).toVar(),re=(0,n.float)(0).toVar(),z=(e,r,i)=>{let o=this._clampCoord(m.add(e),h.add(r)),s=(0,n.textureLoad)(t,o).w,c=(0,n.select)(s.greaterThanEqual(qe),R,(0,n.textureLoad)(a,o).x);Math.abs(e)<=vy&&Math.abs(r)<=vy&&(ee.addAssign(c),te.addAssign(c.mul(c))),i&&(ne.addAssign(c),re.addAssign(c.mul(c)))},ie=e.antiFirefly.greaterThan(.5);for(let e=-vy;e<=vy;e++)for(let t=-vy;t<=vy;t++)t===0&&e===0||z(t,e,Math.abs(t)>1||Math.abs(e)>1);(0,n.If)(ie,()=>{for(let e=-yy;e<=yy;e++)for(let t=-yy;t<=yy;t++)Math.abs(t)<=vy&&Math.abs(e)<=vy||z(t,e,!0)}),(0,n.If)(ie,()=>{let e=1/((yy*2+1)**2-9),t=ne.mul(e),r=Ky(t,re.mul(e)).mul(by);I.assign((0,n.mix)(I.clamp(t.sub(r),t.add(r)),I,S))});{let t=1/(vy*2+1)**2,r=ee.mul(t),i=Ky(r,te.mul(t)).mul(e.fastClampSigmaScale),a=I.clamp(r.sub(i),r.add(i)),o=(0,n.select)(e.maxFast.lessThan(e.maxAccum),(0,n.float)(1),(0,n.float)(0)),s=(0,n.mix)((0,n.float)(1).div((0,n.float)(1).add(o.mul(b).mul(2))),(0,n.float)(1),S);I.assign((0,n.mix)(a,I,s))}(0,n.textureStore)(o,_,Wy(A,I)).toWriteOnly()})});return this._dispatchOf(f)}_buildTemporalStabilization(e){let t=this.u,r=this._colorTexNode,i=this._albedoTexNode,a=this._ndTexNode,o=this._snTexNode,s=this._motionTexNode,c=this._nHist,l=this._nData,u=this._nStabRead,d=this._internal,f=this._tmpA,p=this.resW,m=this.resH,h=this.inputFrames,g=this.resetU,_=this.debugMode;return(0,n.Fn)(()=>{let v=(0,n.int)(n.workgroupId.x).mul(Ey).add((0,n.int)(n.localId.x)),y=(0,n.int)(n.workgroupId.y).mul(Ey).add((0,n.int)(n.localId.y));(0,n.If)(v.lessThan((0,n.int)(p)).and(y.lessThan((0,n.int)(m))),()=>{let p=(0,n.ivec2)(v,y),m=(0,n.uvec2)((0,n.uint)(v),(0,n.uint)(y)),b=(0,n.textureLoad)(a,p).w,x=(0,n.textureLoad)(r,p).toVar();(0,n.If)(b.greaterThanEqual(qe),()=>{(0,n.textureStore)(f,m,x).toWriteOnly(),(0,n.textureStore)(e,m,(0,n.vec4)((0,n.textureLoad)(c,p).x,0,0,0)).toWriteOnly(),(0,n.textureStore)(d,m,(0,n.vec4)(0,1,0,0)).toWriteOnly(),(0,n.Return)()});let S=(0,n.textureLoad)(o,p).w.clamp(.05,1),C=this._pixelUv(v,y),w=(0,n.textureLoad)(s,p),T=C.sub(w.xy).toVar(),E=(0,n.textureLoad)(l,p).toVar(),D=E.y.toVar(),O=(0,n.uint)(E.z.add(.5)).toVar(),k=E.w.greaterThan(.5),A=this._bilinear(T),j=[1,2,4,8].map(e=>(0,n.select)(O.bitAnd((0,n.uint)(e)).notEqual((0,n.uint)(0)),(0,n.float)(1),(0,n.float)(0))),M=A.customWeights(j).map(e=>e.toVar()),N=(0,n.sqrt)((0,n.saturate)(A.filter(j))).toVar(),P=(0,n.textureLoad)(c,p).toVar(),F=P.x.toVar(),I=F.toVar(),L=F.mul(F).toVar();for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){if(t===0&&e===0)continue;let r=this._clampCoord(v.add(t),y.add(e)),i=(0,n.textureLoad)(a,r).w,o=(0,n.select)(i.greaterThanEqual(qe),F,(0,n.textureLoad)(c,r).x);I.addAssign(o),L.addAssign(o.mul(o))}I.divAssign(9),L.divAssign(9);let R=Ky(I,L).toVar();(0,n.If)(D.lessThan(t.historyFixFrameNum),()=>{F.assign((0,n.min)(F,I.mul((0,n.float)(1.2).add((0,n.float)(1).div(D.add(1))))))});let ee=(0,n.max)(this._sampleHistory(e=>(0,n.textureLoad)(u,e),T,A,M,k).x,0).toVar(),te=R.mul(t.antilag.x),ne=t.antilag.y.mul(4),re=ee.clamp(I.sub(te),I.add(te)),z=ee.sub(re).abs().div((0,n.max)(ee,re).add(py)),ie=(0,n.float)(1).div((0,n.float)(1).add(z.mul(D.mul(N)).div(ne))).toVar(),ae=(0,n.min)(D,t.historyFixFrameNum);D.assign((0,n.mix)(ae,D,ie));let oe=h.add(1),se=this._handover(oe),ce=N.mul((0,n.float)(1).sub(this._advancedNonLinear(D.mul((0,n.float)(1).sub(se)).div(oe)))).mul(ie).toVar(),le=(0,n.float)(1).add(ce.mul(6)),ue=t.stabilizationStrength.mul((0,n.float)(1).sub(g)),de=(0,n.mix)(F,ee.clamp(I.sub(R.mul(le)),I.add(R.mul(le))),(0,n.min)(ce,ue)).toVar();P.assign(Wy(P,de)),(0,n.textureStore)(e,m,(0,n.vec4)(de,0,0,0)).toWriteOnly();let fe=t.maxAccum.mul((0,n.float)(1).sub(g));(0,n.textureStore)(d,m,(0,n.vec4)((0,n.min)(D.add(1),fe),S,0,0)).toWriteOnly();let pe=(0,n.textureLoad)(i,p),me=(0,n.vec4)(Hy(P.xyz).mul((0,n.max)(pe.xyz,(0,n.vec3)(Xe))),x.w).toVar();(0,n.If)(_.equal((0,n.int)(1)),()=>{let e=(0,n.saturate)(D.div((0,n.max)(t.maxAccum,1)));me.assign((0,n.vec4)((0,n.float)(1).sub(e),e,.2,1))}).ElseIf(_.equal((0,n.int)(2)),()=>{me.assign((0,n.vec4)((0,n.vec3)(P.w),1))}).ElseIf(_.equal((0,n.int)(3)),()=>{me.assign((0,n.vec4)((0,n.vec3)(S),1))}).ElseIf(_.equal((0,n.int)(4)),()=>{let e=E.x.div(E.x.add(1));me.assign((0,n.vec4)((0,n.vec3)(e),1))}).ElseIf(_.equal((0,n.int)(5)),()=>{me.assign((0,n.vec4)((0,n.vec3)(E.z.div(15)),1))}),(0,n.textureStore)(f,m,me).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[Ey,Ey,1])}setupEventListeners(){this.on(`denoiser:reset`,()=>this.resetHistory())}resetHistory(){this._needsReset=!0}_updateCamera(){let e=this.pathTracer;if(!e?.uniforms)return;let t=e.uniforms.get(`cameraWorldMatrix`).value,n=e.uniforms.get(`cameraViewMatrix`).value,r=e.uniforms.get(`cameraProjectionMatrixInverse`).value,i=e.uniforms.get(`cameraProjectionMatrix`).value;this._camInitialized&&(this.prevCamView.value.copy(this.camView.value),this.prevCamPos.value.copy(this.camPos.value),this.prevViewVector.value.copy(this.viewVector.value)),this.camWorld.value.copy(t),this.camProjInv.value.copy(r),this.camView.value.copy(n),this.camPos.value.setFromMatrixPosition(t),this.viewVector.value.setFromMatrixColumn(t,2).normalize(),this.cameraRay.sync(e.uniforms),this._camInitialized||=(this.prevCamView.value.copy(n),this.prevCamPos.value.copy(this.camPos.value),this.prevViewVector.value.copy(this.viewVector.value),!0);let a=i.elements[5]||1,o=1/(.5*this.resH.value*a);this.minRectDimMulUnproject.value=Math.min(this.resW.value,this.resH.value)*o}_updateRotators(e){let t=(t,n)=>{let r=Yy(e*3+n)*Math.PI*2;t.value.set(Math.cos(r),Math.sin(r),-Math.sin(r),Math.cos(r))};t(this.rotPre,0),t(this.rotBlur,1),t(this.rotPost,2)}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:albedo`),r=e.getTexture(`pathtracer:normalDepth`),i=e.getTexture(`pathtracer:shadingNormal`),a=e.getTexture(`motionVector:screenSpace`);if(!t)return;if(!n||!r||!i||!a){e.setTexture(`nrd:output`,t);return}let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this.outputTarget.width||o.height!==this.outputTarget.height)&&this.setSize(o.width,o.height);let s=e.getState(`pathtracer:samples`)??this.pathTracer?.frameCount??0;if(s+1>=this.u.handoverFrames.value){e.setTexture(`nrd:output`,t),this._needsReset=!0;return}if(this._colorTexNode.value=t,this._albedoTexNode.value=n,this._ndTexNode.value=r,this._snTexNode.value=i,this._motionTexNode.value=a,this._updateCamera(),this.inputFrames.value=s,this._updateRotators(this.pathTracer?.uniforms?.get(`seedFrame`)?.value??e.getState(`frame`)??0),this.resetU.value=+!!this._needsReset,!this._compiled){for(let e of this._kernels)this.renderer.compute(e);this._compiled=!0}this._nTmpA.value=this._tmpA,this._nTmpB.value=this._tmpB,this._nHist.value=this._hist,this._nFast.value=this._fastHist,this._nInternal.value=this._internal,this._nGeom.value=this._geomPrev,this._nData.value=this._dataT,this._nStabRead.value=this._stabPing===0?this._stabB:this._stabA,this.renderer.compute(this._kPre),this.renderer.compute(this._kTa),this.renderer.compute(this._kHf),this.renderer.compute(this._kBlur),this.renderer.compute(this._kPost),this.renderer.compute(this._stabPing===0?this._kTsA:this._kTsB),this._srcRegion.max.set(this.outputTarget.width,this.outputTarget.height),this.renderer.copyTextureToTexture(this._tmpA,this.outputTarget.texture,this._srcRegion),e.setTexture(`nrd:output`,this.outputTarget.texture),this._stabPing=1-this._stabPing,this._needsReset=!1,this._needsReset=!1}setSize(e,t){this.outputTarget.setSize(e,t),this.outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/Ey),this._dispatchY=Math.ceil(t/Ey);let n=[this._dispatchX,this._dispatchY,1];for(let e of this._kernels)e&&(e.dispatchSize=n);this._needsReset=!0}releaseGPUMemory(){this._disposeStorage(),this.context?.removeTexture(`nrd:output`),this.outputTarget?.texture?.dispose(),this._needsReset=!0}reallocateReservedStorage(){this._disposeKernels(),this._disposeStorage();for(let[e,t]of this._placeholders)e.value=t;this._allocStorage(),this._buildKernels(),this._compiled=!1,this._needsReset=!0,this._stabPing=0}dispose(){this._disposeKernels(),this._disposeStorage(),this.outputTarget?.dispose();for(let e of[this._colorTexNode,this._albedoTexNode,this._ndTexNode,this._snTexNode,this._motionTexNode])e?.dispose();for(let[e,t]of this._placeholders)e.dispose(),t.dispose();this._placeholders.clear()}},Zy=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),Qy=(0,n.wgslFn)(`
|
|
896
896
|
fn temporalAccumulate(
|
|
897
897
|
lum: f32,
|
|
898
898
|
prevMean: f32,
|
|
@@ -914,7 +914,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
914
914
|
);
|
|
915
915
|
|
|
916
916
|
}
|
|
917
|
-
`),$y=class extends xe{constructor(e,i={}){super(`VarianceEstimation`,{...i,executionMode:
|
|
917
|
+
`),$y=class extends xe{constructor(e,i={}){super(`VarianceEstimation`,{...i,executionMode:be.ALWAYS}),this.renderer=e,this.inputTextureName=i.inputTextureName||`pathtracer:color`,this.varianceBoost=(0,n.uniform)(i.varianceBoost??1),this.temporalAlpha=(0,n.uniform)(i.temporalAlpha??.1),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this._colorTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._storageTexA=new t.StorageTexture(W,W),this._storageTexA.type=r.FloatType,this._storageTexA.format=r.RGBAFormat,this._storageTexA.minFilter=r.LinearFilter,this._storageTexA.magFilter=r.LinearFilter,this._storageTexB=new t.StorageTexture(W,W),this._storageTexB.type=r.FloatType,this._storageTexB.format=r.RGBAFormat,this._storageTexB.minFilter=r.LinearFilter,this._storageTexB.magFilter=r.LinearFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this._outputTarget=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this.currentMoments=0,this._compiled=!1,this._needsWarmReset=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._buildCompute()}setupEventListeners(){this.on(`pathtracer:viewpointChanged`,()=>this.reset())}_buildCompute(){this._readTexNodeA=new t.TextureNode,this._readTexNodeB=new t.TextureNode,this._computeNodeA=this._buildComputeForDirection(this._storageTexA,this._readTexNodeB),this._computeNodeB=this._buildComputeForDirection(this._storageTexB,this._readTexNodeA)}_buildComputeForDirection(e,t){let r=this._colorTexNode,i=this.temporalAlpha,a=this.varianceBoost,o=this.resW,s=this.resH,c=(0,n.workgroupArray)(`float`,100);return(0,n.Fn)(()=>{let l=n.localId.x,u=n.localId.y,d=u.mul(8).add(l),f=(0,n.int)(n.workgroupId.x).mul(8).sub(1),p=(0,n.int)(n.workgroupId.y).mul(8).sub(1),m=d.mod(10),h=d.div(10),g=(0,n.textureLoad)(r,(0,n.ivec2)(f.add((0,n.int)(m)).clamp((0,n.int)(0),(0,n.int)(o).sub(1)),p.add((0,n.int)(h)).clamp((0,n.int)(0),(0,n.int)(s).sub(1)))).xyz;c.element(d).assign(Zy(Ui(g))),(0,n.If)(d.lessThan((0,n.uint)(36)),()=>{let e=d.add((0,n.uint)(64)),t=e.mod(10),i=e.div(10),a=(0,n.textureLoad)(r,(0,n.ivec2)(f.add((0,n.int)(t)).clamp((0,n.int)(0),(0,n.int)(o).sub(1)),p.add((0,n.int)(i)).clamp((0,n.int)(0),(0,n.int)(s).sub(1)))).xyz;c.element(e).assign(Zy(Ui(a)))}),(0,n.workgroupBarrier)();let _=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(l)),v=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(u));(0,n.If)(_.lessThan((0,n.int)(o)).and(v.lessThan((0,n.int)(s))),()=>{let r=(0,n.float)(0).toVar(),o=(0,n.float)(0).toVar();for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let n=c.element(u.add(1+e).mul(10).add(l.add(1+t)));r.addAssign(n),o.addAssign(n.mul(n))}r.divAssign(9),o.divAssign(9);let s=(0,n.max)(o.sub(r.mul(r)),(0,n.float)(0)),d=c.element(u.add(1).mul(10).add(l.add(1))),f=(0,n.textureLoad)(t,(0,n.ivec2)(_,v));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(_),(0,n.uint)(v)),Qy(d,f.x,f.y,i,s,a)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}render(e){if(!this.enabled)return;let t=e.getTexture(this.inputTextureName);if(!t)return;let n=t.image;if(n&&n.width>0&&n.height>0&&(n.width!==this._outputTarget.width||n.height!==this._outputTarget.height)&&this.setSize(n.width,n.height),this._colorTexNode.value=t,this._compiled||=(this.renderer.compute(this._computeNodeA),this.renderer.compute(this._computeNodeB),!0),this._readTexNodeA.value=this._storageTexA,this._readTexNodeB.value=this._storageTexB,this._needsWarmReset){let e=this.temporalAlpha.value;this.temporalAlpha.value=1,this.renderer.compute(this._computeNodeA),this.renderer.compute(this._computeNodeB),this.temporalAlpha.value=e,this._needsWarmReset=!1}let r=this.currentMoments===0?this._computeNodeA:this._computeNodeB;this.renderer.compute(r);let i=this.currentMoments===0?this._storageTexA:this._storageTexB;this.currentMoments=1-this.currentMoments,this._srcRegion.max.set(this._outputTarget.width,this._outputTarget.height),this.renderer.copyTextureToTexture(i,this._outputTarget.texture,this._srcRegion),e.setTexture(`variance:output`,this._outputTarget.texture)}releaseGPUMemory(){this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.context?.removeTexture(`variance:output`),this._outputTarget?.texture?.dispose(),this.reset()}reset(){this.currentMoments=0,this._needsWarmReset=!0,this.context&&this.context.removeTexture(`variance:output`)}setSize(e,t){this._outputTarget.setSize(e,t),this._outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._computeNodeA.dispatchSize=[this._dispatchX,this._dispatchY,1],this._computeNodeB.dispatchSize=[this._dispatchX,this._dispatchY,1]}reallocateReservedStorage(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.FloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e};this._storageTexA=e(),this._storageTexB=e(),this._buildCompute(),this._compiled=!1}dispose(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this._outputTarget?.dispose(),this._colorTexNode?.dispose(),this._readTexNodeA?.dispose(),this._readTexNodeB?.dispose()}},eb=(0,n.wgslFn)(`
|
|
918
918
|
fn bilateralWeight(
|
|
919
919
|
centerLum: f32, sLum: f32,
|
|
920
920
|
centerNormal: vec3f, sNormal: vec3f,
|
|
@@ -939,7 +939,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
939
939
|
return kernelW * lumW * normW * depW * colW;
|
|
940
940
|
|
|
941
941
|
}
|
|
942
|
-
`),tb=class extends xe{constructor(e,i={}){super(`BilateralFiltering`,{...i,executionMode:z.ALWAYS}),this.renderer=e,this.inputTextureName=i.inputTextureName||`asvgf:demodulated`,this.normalDepthTextureName=i.normalDepthTextureName||`pathtracer:normalDepth`,this.shadingNormalTextureName=i.shadingNormalTextureName||`pathtracer:shadingNormal`,this.albedoTextureName=i.albedoTextureName||`pathtracer:albedo`,this.varianceTextureName=i.varianceTextureName||`variance:output`,this.iterations=i.iterations??4,this.phiColor=(0,n.uniform)(i.phiColor??.5),this.phiNormal=(0,n.uniform)(i.phiNormal??128),this.phiDepth=(0,n.uniform)(i.phiDepth??.05),this.phiLuminance=(0,n.uniform)(i.phiLuminance??4),this.spatialVarianceWeight=(0,n.uniform)(i.spatialVarianceWeight??1),this.stepSizeU=(0,n.uniform)(1,`int`),this.isLastIterationU=(0,n.uniform)(0,`int`),this.isFirstIterationU=(0,n.uniform)(1,`int`),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this._readTexNode=new t.TextureNode,this._normalDepthTexNode=new t.TextureNode,this._shadingNormalTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._varianceTexNode=new t.TextureNode,this._srcAlphaTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._storageTexA=new t.StorageTexture(W,W),this._storageTexA.type=r.HalfFloatType,this._storageTexA.format=r.RGBAFormat,this._storageTexA.minFilter=r.LinearFilter,this._storageTexA.magFilter=r.LinearFilter,this._storageTexB=new t.StorageTexture(W,W),this._storageTexB.type=r.HalfFloatType,this._storageTexB.format=r.RGBAFormat,this._storageTexB.minFilter=r.LinearFilter,this._storageTexB.magFilter=r.LinearFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this._outputTarget=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._buildCompute()}_buildCompute(){this._computeNodeA=this._buildComputeForDirection(this._storageTexA),this._computeNodeB=this._buildComputeForDirection(this._storageTexB)}_buildComputeForDirection(e){let t=this._readTexNode,r=this._normalDepthTexNode,i=this._shadingNormalTexNode,a=this._albedoTexNode,o=this._varianceTexNode,s=this._srcAlphaTexNode,c=this.phiColor,l=this.phiNormal,u=this.phiDepth,d=this.phiLuminance,f=this.spatialVarianceWeight,p=this.stepSizeU,m=this.isLastIterationU,h=this.isFirstIterationU,g=this.resW,_=this.resH,v=[1/256,4/256,6/256,4/256,1/256,4/256,16/256,24/256,16/256,4/256,6/256,24/256,36/256,24/256,6/256,4/256,16/256,24/256,16/256,4/256,1/256,4/256,6/256,4/256,1/256];return(0,n.Fn)(()=>{let y=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),b=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(y.lessThan((0,n.int)(g)).and(b.lessThan((0,n.int)(_))),()=>{let x=(0,n.ivec2)(y,b),S=(0,n.textureLoad)(t,x),C=S.xyz,w=(0,n.textureLoad)(r,x),T=(0,n.textureLoad)(i,x).xyz.mul(2).sub(1),E=w.w,D=Ui(C),O=(0,n.max)((0,n.textureLoad)(a,x).xyz,(0,n.vec3)(Xe)),k=(0,n.max)(Ui(O),(0,n.float)(Xe)).toVar(),A=h.equal((0,n.int)(1)),j=e=>{let t=(0,n.textureLoad)(o,e);return(0,n.mix)(t.z,(0,n.max)(t.z,t.w),f)},M=A.select(j(x),S.w.mul(S.w)).toVar(),N=d.mul((0,n.sqrt)((0,n.max)(M,(0,n.float)(0)))).div(k).add((0,n.float)(1e-4)),P=(0,n.vec3)(0).toVar(),F=(0,n.float)(0).toVar(),I=(0,n.float)(0).toVar();for(let e=0;e<5;e++)for(let a=0;a<5;a++){let o=a-2,s=e-2,d=v[e*5+a],f=y.add(p.mul(o)).clamp((0,n.int)(0),(0,n.int)(g).sub(1)),m=b.add(p.mul(s)).clamp((0,n.int)(0),(0,n.int)(_).sub(1)),h=(0,n.textureLoad)(t,(0,n.ivec2)(f,m)),x=h.xyz,S=(0,n.textureLoad)(r,(0,n.ivec2)(f,m)),w=(0,n.textureLoad)(i,(0,n.ivec2)(f,m)).xyz.mul(2).sub(1),O=S.w,k=eb(D,Ui(x),T,w,E,O,C,x,(0,n.float)(d),N,l,u,c),M=A.select(j((0,n.ivec2)(f,m)),h.w.mul(h.w));P.addAssign(x.mul(k)),F.addAssign(k),I.addAssign(k.mul(k).mul((0,n.max)(M,(0,n.float)(0))))}let L=P.div((0,n.max)(F,(0,n.float)(1e-4))),ee=I.div((0,n.max)(F.mul(F),(0,n.float)(1e-8))),te=m.equal((0,n.int)(1)),ne=te.select(L.mul(O),L),re=te.select((0,n.textureLoad)(s,x).w,(0,n.sqrt)((0,n.max)(ee,(0,n.float)(0))));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(y),(0,n.uint)(b)),(0,n.vec4)(ne,re)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}render(e){if(!this.enabled)return;let t=e.getTexture(this.inputTextureName)||e.getTexture(`asvgf:output`)||e.getTexture(`pathtracer:color`),n=e.getTexture(this.normalDepthTextureName),r=e.getTexture(this.shadingNormalTextureName)||n,i=e.getTexture(this.albedoTextureName),a=e.getTexture(this.varianceTextureName),o=e.getTexture(`pathtracer:color`);if(!t)return;let s=t.image;s&&s.width>0&&s.height>0&&(s.width!==this._outputTarget.width||s.height!==this._outputTarget.height)&&this.setSize(s.width,s.height),n&&(this._normalDepthTexNode.value=n),r&&(this._shadingNormalTexNode.value=r),i&&(this._albedoTexNode.value=i),this._readTexNode.value=t,a&&(this._varianceTexNode.value=a),o&&(this._srcAlphaTexNode.value=o),this._compiled||=(this.renderer.compute(this._computeNodeA),this.renderer.compute(this._computeNodeB),!0);let c=t,l=this._computeNodeA,u=this._computeNodeB;for(let e=0;e<this.iterations;e++){this.stepSizeU.value=1<<e,this._readTexNode.value=c,this.isLastIterationU.value=+(e===this.iterations-1),this.isFirstIterationU.value=+(e===0),this.renderer.compute(l),c=l===this._computeNodeA?this._storageTexA:this._storageTexB;let t=l;l=u,u=t}this._srcRegion.max.set(this._outputTarget.width,this._outputTarget.height),this.renderer.copyTextureToTexture(c,this._outputTarget.texture,this._srcRegion),e.setTexture(`bilateralFiltering:output`,this._outputTarget.texture)}updateParameters(e){e&&(e.phiColor!==void 0&&(this.phiColor.value=e.phiColor),e.phiNormal!==void 0&&(this.phiNormal.value=e.phiNormal),e.phiDepth!==void 0&&(this.phiDepth.value=e.phiDepth),e.phiLuminance!==void 0&&(this.phiLuminance.value=e.phiLuminance),e.spatialVarianceWeight!==void 0&&(this.spatialVarianceWeight.value=e.spatialVarianceWeight),e.atrousIterations!==void 0&&(this.iterations=e.atrousIterations))}setSize(e,t){this._outputTarget.setSize(e,t),this._outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._computeNodeA.dispatchSize=[this._dispatchX,this._dispatchY,1],this._computeNodeB.dispatchSize=[this._dispatchX,this._dispatchY,1]}releaseGPUMemory(){this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.context?.removeTexture(`bilateralFiltering:output`),this._outputTarget?.texture?.dispose()}reset(){}reallocateReservedStorage(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e};this._storageTexA=e(),this._storageTexB=e(),this._buildCompute(),this._compiled=!1}dispose(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this._outputTarget?.dispose(),this._readTexNode?.dispose(),this._normalDepthTexNode?.dispose(),this._shadingNormalTexNode?.dispose(),this._albedoTexNode?.dispose(),this._varianceTexNode?.dispose(),this._srcAlphaTexNode?.dispose()}},nb=6e4,rb=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),ib=e=>(0,n.vec3)(rb(e.x),rb(e.y),rb(e.z)),ab=4,ob=[1/256,4/256,6/256,4/256,1/256,4/256,16/256,24/256,16/256,4/256,6/256,24/256,36/256,24/256,6/256,4/256,16/256,24/256,16/256,4/256,1/256,4/256,6/256,4/256,1/256],sb=class extends xe{constructor(e,i={}){super(`EdgeAwareFiltering`,{...i,executionMode:z.PER_CYCLE}),this.renderer=e,this.filterStrength=(0,n.uniform)(i.filterStrength??1),this.phiLuminance=(0,n.uniform)(i.phiLuminance??1),this.phiNormal=(0,n.uniform)(i.phiNormal??64),this.phiDepth=(0,n.uniform)(i.phiDepth??.1),this.iterations=i.atrousIterations??i.edgeAtrousIterations??5,this.stepSizeU=(0,n.uniform)(1,`int`),this.isLastIterationU=(0,n.uniform)(0,`int`),this.isFirstIterationU=(0,n.uniform)(1,`int`),this.varianceHistoryU=(0,n.uniform)(0,`int`),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this._colorTexNode=new t.TextureNode,this._ndTexNode=new t.TextureNode,this._snTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._varTexNode=new t.TextureNode,this._readTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._demodTex=this._makeStorageTex(),this._storageTexA=this._makeStorageTex(),this._storageTexB=this._makeStorageTex(),this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this.outputTarget=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._dispatchX=Math.ceil(a/16),this._dispatchY=Math.ceil(o/16),this._buildCompute()}_makeStorageTex(){let e=new t.StorageTexture(W,W);return e.type=r.FloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e}_buildCompute(){this._computeDemod=this._buildDemod(),this._computeAtrousA=this._buildAtrous(this._storageTexA),this._computeAtrousB=this._buildAtrous(this._storageTexB)}_buildDemod(){let e=this._colorTexNode,t=this._ndTexNode,r=this._albedoTexNode,i=this._demodTex,a=this.resW,o=this.resH;return(0,n.Fn)(()=>{let s=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),c=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(s.lessThan((0,n.int)(a)).and(c.lessThan((0,n.int)(o))),()=>{let a=(0,n.ivec2)(s,c),o=(0,n.textureLoad)(e,a).xyz,l=(0,n.textureLoad)(t,a).w.lessThan((0,n.float)(nb)),u=(0,n.textureLoad)(r,a).xyz,d=(0,n.select)(l,(0,n.max)(u,(0,n.vec3)(Xe)),(0,n.vec3)(1)),f=ib(o.div(d));(0,n.textureStore)(i,(0,n.uvec2)((0,n.uint)(s),(0,n.uint)(c)),(0,n.vec4)(f,1)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_buildAtrous(e){let t=this._readTexNode,r=this._colorTexNode,i=this._ndTexNode,a=this._snTexNode,o=this._albedoTexNode,s=this._varTexNode,c=this.filterStrength,l=this.phiLuminance,u=this.phiNormal,d=this.phiDepth,f=this.stepSizeU,p=this.isLastIterationU,m=this.isFirstIterationU,h=this.varianceHistoryU,g=this.resW,_=this.resH;return(0,n.Fn)(()=>{let v=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),y=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(v.lessThan((0,n.int)(g)).and(y.lessThan((0,n.int)(_))),()=>{let b=(0,n.ivec2)(v,y),x=(0,n.textureLoad)(t,b),S=x.xyz,C=Ui(S),w=(0,n.textureLoad)(i,b).w,T=(0,n.textureLoad)(a,b).xyz.mul(2).sub(1),E=w.lessThan((0,n.float)(nb)),D=(0,n.select)(E,(0,n.float)(1),(0,n.float)(0)),O=(0,n.textureLoad)(o,b).xyz,k=(0,n.select)(E,(0,n.max)(O,(0,n.vec3)(Xe)),(0,n.vec3)(1)),A=(0,n.max)(Ui(k),(0,n.float)(Xe)),j=m.equal((0,n.int)(1)),M=h.lessThan((0,n.int)(ab)),N=e=>{let t=(0,n.textureLoad)(s,e);return(0,n.select)(M,(0,n.max)(t.z,t.w),t.z)},P=j.select(N(b),x.w.mul(x.w)).toVar(),F=l.mul((0,n.sqrt)((0,n.max)(P,(0,n.float)(0)))).div(A).add((0,n.float)(1e-4)),I=(0,n.vec3)(0).toVar(),L=(0,n.float)(0).toVar(),ee=(0,n.float)(0).toVar();for(let e=0;e<5;e++)for(let r=0;r<5;r++){let o=r-2,s=e-2,c=ob[e*5+r],l=(0,n.ivec2)(v.add(f.mul(o)).clamp((0,n.int)(0),(0,n.int)(g).sub(1)),y.add(f.mul(s)).clamp((0,n.int)(0),(0,n.int)(_).sub(1))),p=(0,n.textureLoad)(t,l),m=p.xyz,h=Ui(m),b=(0,n.textureLoad)(i,l).w,x=(0,n.textureLoad)(a,l).xyz.mul(2).sub(1),S=(0,n.select)(b.lessThan((0,n.float)(nb)),(0,n.float)(1),(0,n.float)(0)),E=C.sub(h).abs().div(F).negate().exp(),O=(0,n.pow)((0,n.dot)(T,x).clamp(0,1),u),k=w.sub(b).abs().div((0,n.max)(w.mul(d),(0,n.float)(.001))).negate().exp(),A=D.mul(S),M=D.oneMinus().mul(S.oneMinus()),P=A.add(M),te=(0,n.mix)((0,n.float)(1),O.mul(k),A),ne=(0,n.float)(c).mul(E).mul(te).mul(P),re=j.select(N(l),p.w.mul(p.w));I.addAssign(m.mul(ne)),L.addAssign(ne),ee.addAssign(ne.mul(ne).mul((0,n.max)(re,(0,n.float)(0))))}let te=I.div((0,n.max)(L,(0,n.float)(1e-4))),ne=ee.div((0,n.max)(L.mul(L),(0,n.float)(1e-8))),re=p.equal((0,n.int)(1)),ie=(0,n.textureLoad)(r,b).xyz,R=(0,n.mix)(ie,te.mul(k),c),ae=re.select(R,te),oe=re.select((0,n.textureLoad)(r,b).w,(0,n.sqrt)((0,n.max)(ne,(0,n.float)(0))));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(v),(0,n.uint)(y)),(0,n.vec4)(ae,oe)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[16,16,1])}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:normalDepth`),r=e.getTexture(`pathtracer:shadingNormal`)||n,i=e.getTexture(`pathtracer:albedo`),a=e.getTexture(`variance:output`);if(!t||!n||!i||!a){t&&e.setTexture(`edgeFiltering:output`,t);return}if(e.getState(`interactionMode`)){e.setTexture(`edgeFiltering:output`,t);return}let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this.outputTarget.width||o.height!==this.outputTarget.height)&&this.setSize(o.width,o.height),this.varianceHistoryU.value=e.getState(`accumulatedFrames`)??0,this._colorTexNode.value=t,this._ndTexNode.value=n,this._snTexNode.value=r,this._albedoTexNode.value=i,this._varTexNode.value=a,this._compiled||=(this.renderer.compute(this._computeDemod),this.renderer.compute(this._computeAtrousA),this.renderer.compute(this._computeAtrousB),!0),this.renderer.compute(this._computeDemod);let s=this._demodTex,c=this._computeAtrousA,l=this._computeAtrousB;for(let e=0;e<this.iterations;e++){this.stepSizeU.value=1<<e,this.isLastIterationU.value=+(e===this.iterations-1),this.isFirstIterationU.value=+(e===0),this._readTexNode.value=s,this.renderer.compute(c),s=c===this._computeAtrousA?this._storageTexA:this._storageTexB;let t=c;c=l,l=t}this._srcRegion.max.set(this.outputTarget.width,this.outputTarget.height),this.renderer.copyTextureToTexture(s,this.outputTarget.texture,this._srcRegion),e.setTexture(`edgeFiltering:output`,this.outputTarget.texture)}setFilteringEnabled(e){this.enabled=e}updateUniforms(e){e&&(e.filterStrength!==void 0&&(this.filterStrength.value=e.filterStrength),e.phiLuminance!==void 0&&(this.phiLuminance.value=e.phiLuminance),e.phiNormal!==void 0&&(this.phiNormal.value=e.phiNormal),e.phiDepth!==void 0&&(this.phiDepth.value=e.phiDepth),e.atrousIterations!==void 0&&(this.iterations=e.atrousIterations))}releaseGPUMemory(){this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.context?.removeTexture(`edgeFiltering:output`),this.outputTarget?.texture?.dispose()}reset(){}setSize(e,t){this.outputTarget.setSize(e,t),this.outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/16),this._dispatchY=Math.ceil(t/16);let n=[this._dispatchX,this._dispatchY,1];this._computeDemod.dispatchSize=n,this._computeAtrousA.dispatchSize=n,this._computeAtrousB.dispatchSize=n}reallocateReservedStorage(){this._computeDemod?.dispose(),this._computeAtrousA?.dispose(),this._computeAtrousB?.dispose(),this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this._demodTex=this._makeStorageTex(),this._storageTexA=this._makeStorageTex(),this._storageTexB=this._makeStorageTex(),this._buildCompute(),this._compiled=!1}dispose(){this._computeDemod?.dispose(),this._computeAtrousA?.dispose(),this._computeAtrousB?.dispose(),this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.outputTarget?.dispose(),this._colorTexNode?.dispose(),this._ndTexNode?.dispose(),this._snTexNode?.dispose(),this._albedoTexNode?.dispose(),this._varTexNode?.dispose(),this._readTexNode?.dispose()}},cb=256,lb=-8,ub=6-lb,db=ub/cb,fb=1e4,pb=(0,n.wgslFn)(`
|
|
942
|
+
`),tb=class extends xe{constructor(e,i={}){super(`BilateralFiltering`,{...i,executionMode:be.ALWAYS}),this.renderer=e,this.inputTextureName=i.inputTextureName||`asvgf:demodulated`,this.normalDepthTextureName=i.normalDepthTextureName||`pathtracer:normalDepth`,this.shadingNormalTextureName=i.shadingNormalTextureName||`pathtracer:shadingNormal`,this.albedoTextureName=i.albedoTextureName||`pathtracer:albedo`,this.varianceTextureName=i.varianceTextureName||`variance:output`,this.iterations=i.iterations??4,this.phiColor=(0,n.uniform)(i.phiColor??.5),this.phiNormal=(0,n.uniform)(i.phiNormal??128),this.phiDepth=(0,n.uniform)(i.phiDepth??.05),this.phiLuminance=(0,n.uniform)(i.phiLuminance??4),this.spatialVarianceWeight=(0,n.uniform)(i.spatialVarianceWeight??1),this.stepSizeU=(0,n.uniform)(1,`int`),this.isLastIterationU=(0,n.uniform)(0,`int`),this.isFirstIterationU=(0,n.uniform)(1,`int`),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this._readTexNode=new t.TextureNode,this._normalDepthTexNode=new t.TextureNode,this._shadingNormalTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._varianceTexNode=new t.TextureNode,this._srcAlphaTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._storageTexA=new t.StorageTexture(W,W),this._storageTexA.type=r.HalfFloatType,this._storageTexA.format=r.RGBAFormat,this._storageTexA.minFilter=r.LinearFilter,this._storageTexA.magFilter=r.LinearFilter,this._storageTexB=new t.StorageTexture(W,W),this._storageTexB.type=r.HalfFloatType,this._storageTexB.format=r.RGBAFormat,this._storageTexB.minFilter=r.LinearFilter,this._storageTexB.magFilter=r.LinearFilter,this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this._outputTarget=new t.RenderTarget(a,o,{type:r.HalfFloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._dispatchX=Math.ceil(a/8),this._dispatchY=Math.ceil(o/8),this._buildCompute()}_buildCompute(){this._computeNodeA=this._buildComputeForDirection(this._storageTexA),this._computeNodeB=this._buildComputeForDirection(this._storageTexB)}_buildComputeForDirection(e){let t=this._readTexNode,r=this._normalDepthTexNode,i=this._shadingNormalTexNode,a=this._albedoTexNode,o=this._varianceTexNode,s=this._srcAlphaTexNode,c=this.phiColor,l=this.phiNormal,u=this.phiDepth,d=this.phiLuminance,f=this.spatialVarianceWeight,p=this.stepSizeU,m=this.isLastIterationU,h=this.isFirstIterationU,g=this.resW,_=this.resH,v=[1/256,4/256,6/256,4/256,1/256,4/256,16/256,24/256,16/256,4/256,6/256,24/256,36/256,24/256,6/256,4/256,16/256,24/256,16/256,4/256,1/256,4/256,6/256,4/256,1/256];return(0,n.Fn)(()=>{let y=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),b=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(y.lessThan((0,n.int)(g)).and(b.lessThan((0,n.int)(_))),()=>{let x=(0,n.ivec2)(y,b),S=(0,n.textureLoad)(t,x),C=S.xyz,w=(0,n.textureLoad)(r,x),T=(0,n.textureLoad)(i,x).xyz.mul(2).sub(1),E=w.w,D=Ui(C),O=(0,n.max)((0,n.textureLoad)(a,x).xyz,(0,n.vec3)(Xe)),k=(0,n.max)(Ui(O),(0,n.float)(Xe)).toVar(),A=h.equal((0,n.int)(1)),j=e=>{let t=(0,n.textureLoad)(o,e);return(0,n.mix)(t.z,(0,n.max)(t.z,t.w),f)},M=A.select(j(x),S.w.mul(S.w)).toVar(),N=d.mul((0,n.sqrt)((0,n.max)(M,(0,n.float)(0)))).div(k).add((0,n.float)(1e-4)),P=(0,n.vec3)(0).toVar(),F=(0,n.float)(0).toVar(),I=(0,n.float)(0).toVar();for(let e=0;e<5;e++)for(let a=0;a<5;a++){let o=a-2,s=e-2,d=v[e*5+a],f=y.add(p.mul(o)).clamp((0,n.int)(0),(0,n.int)(g).sub(1)),m=b.add(p.mul(s)).clamp((0,n.int)(0),(0,n.int)(_).sub(1)),h=(0,n.textureLoad)(t,(0,n.ivec2)(f,m)),x=h.xyz,S=(0,n.textureLoad)(r,(0,n.ivec2)(f,m)),w=(0,n.textureLoad)(i,(0,n.ivec2)(f,m)).xyz.mul(2).sub(1),O=S.w,k=eb(D,Ui(x),T,w,E,O,C,x,(0,n.float)(d),N,l,u,c),M=A.select(j((0,n.ivec2)(f,m)),h.w.mul(h.w));P.addAssign(x.mul(k)),F.addAssign(k),I.addAssign(k.mul(k).mul((0,n.max)(M,(0,n.float)(0))))}let L=P.div((0,n.max)(F,(0,n.float)(1e-4))),R=I.div((0,n.max)(F.mul(F),(0,n.float)(1e-8))),ee=m.equal((0,n.int)(1)),te=ee.select(L.mul(O),L),ne=ee.select((0,n.textureLoad)(s,x).w,(0,n.sqrt)((0,n.max)(R,(0,n.float)(0))));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(y),(0,n.uint)(b)),(0,n.vec4)(te,ne)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[8,8,1])}render(e){if(!this.enabled)return;let t=e.getTexture(this.inputTextureName)||e.getTexture(`asvgf:output`)||e.getTexture(`pathtracer:color`),n=e.getTexture(this.normalDepthTextureName),r=e.getTexture(this.shadingNormalTextureName)||n,i=e.getTexture(this.albedoTextureName),a=e.getTexture(this.varianceTextureName),o=e.getTexture(`pathtracer:color`);if(!t)return;let s=t.image;s&&s.width>0&&s.height>0&&(s.width!==this._outputTarget.width||s.height!==this._outputTarget.height)&&this.setSize(s.width,s.height),n&&(this._normalDepthTexNode.value=n),r&&(this._shadingNormalTexNode.value=r),i&&(this._albedoTexNode.value=i),this._readTexNode.value=t,a&&(this._varianceTexNode.value=a),o&&(this._srcAlphaTexNode.value=o),this._compiled||=(this.renderer.compute(this._computeNodeA),this.renderer.compute(this._computeNodeB),!0);let c=t,l=this._computeNodeA,u=this._computeNodeB;for(let e=0;e<this.iterations;e++){this.stepSizeU.value=1<<e,this._readTexNode.value=c,this.isLastIterationU.value=+(e===this.iterations-1),this.isFirstIterationU.value=+(e===0),this.renderer.compute(l),c=l===this._computeNodeA?this._storageTexA:this._storageTexB;let t=l;l=u,u=t}this._srcRegion.max.set(this._outputTarget.width,this._outputTarget.height),this.renderer.copyTextureToTexture(c,this._outputTarget.texture,this._srcRegion),e.setTexture(`bilateralFiltering:output`,this._outputTarget.texture)}updateParameters(e){e&&(e.phiColor!==void 0&&(this.phiColor.value=e.phiColor),e.phiNormal!==void 0&&(this.phiNormal.value=e.phiNormal),e.phiDepth!==void 0&&(this.phiDepth.value=e.phiDepth),e.phiLuminance!==void 0&&(this.phiLuminance.value=e.phiLuminance),e.spatialVarianceWeight!==void 0&&(this.spatialVarianceWeight.value=e.spatialVarianceWeight),e.atrousIterations!==void 0&&(this.iterations=e.atrousIterations))}setSize(e,t){this._outputTarget.setSize(e,t),this._outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/8),this._dispatchY=Math.ceil(t/8),this._computeNodeA.dispatchSize=[this._dispatchX,this._dispatchY,1],this._computeNodeB.dispatchSize=[this._dispatchX,this._dispatchY,1]}releaseGPUMemory(){this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.context?.removeTexture(`bilateralFiltering:output`),this._outputTarget?.texture?.dispose()}reset(){}reallocateReservedStorage(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose();let e=()=>{let e=new t.StorageTexture(W,W);return e.type=r.HalfFloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e};this._storageTexA=e(),this._storageTexB=e(),this._buildCompute(),this._compiled=!1}dispose(){this._computeNodeA?.dispose(),this._computeNodeB?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this._outputTarget?.dispose(),this._readTexNode?.dispose(),this._normalDepthTexNode?.dispose(),this._shadingNormalTexNode?.dispose(),this._albedoTexNode?.dispose(),this._varianceTexNode?.dispose(),this._srcAlphaTexNode?.dispose()}},nb=6e4,rb=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),ib=e=>(0,n.vec3)(rb(e.x),rb(e.y),rb(e.z)),ab=4,ob=[1/256,4/256,6/256,4/256,1/256,4/256,16/256,24/256,16/256,4/256,6/256,24/256,36/256,24/256,6/256,4/256,16/256,24/256,16/256,4/256,1/256,4/256,6/256,4/256,1/256],sb=class extends xe{constructor(e,i={}){super(`EdgeAwareFiltering`,{...i,executionMode:be.PER_CYCLE}),this.renderer=e,this.filterStrength=(0,n.uniform)(i.filterStrength??1),this.phiLuminance=(0,n.uniform)(i.phiLuminance??1),this.phiNormal=(0,n.uniform)(i.phiNormal??64),this.phiDepth=(0,n.uniform)(i.phiDepth??.1),this.iterations=i.atrousIterations??i.edgeAtrousIterations??5,this.stepSizeU=(0,n.uniform)(1,`int`),this.isLastIterationU=(0,n.uniform)(0,`int`),this.isFirstIterationU=(0,n.uniform)(1,`int`),this.varianceHistoryU=(0,n.uniform)(0,`int`),this.resW=(0,n.uniform)(i.width||1),this.resH=(0,n.uniform)(i.height||1),this._colorTexNode=new t.TextureNode,this._ndTexNode=new t.TextureNode,this._snTexNode=new t.TextureNode,this._albedoTexNode=new t.TextureNode,this._varTexNode=new t.TextureNode,this._readTexNode=new t.TextureNode;let a=i.width||1,o=i.height||1;this._demodTex=this._makeStorageTex(),this._storageTexA=this._makeStorageTex(),this._storageTexB=this._makeStorageTex(),this._srcRegion=new r.Box2(new r.Vector2(0,0),new r.Vector2(0,0)),this.outputTarget=new t.RenderTarget(a,o,{type:r.FloatType,format:r.RGBAFormat,minFilter:r.LinearFilter,magFilter:r.LinearFilter,depthBuffer:!1,stencilBuffer:!1}),this._compiled=!1,this._dispatchX=Math.ceil(a/16),this._dispatchY=Math.ceil(o/16),this._buildCompute()}_makeStorageTex(){let e=new t.StorageTexture(W,W);return e.type=r.FloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e}_buildCompute(){this._computeDemod=this._buildDemod(),this._computeAtrousA=this._buildAtrous(this._storageTexA),this._computeAtrousB=this._buildAtrous(this._storageTexB)}_buildDemod(){let e=this._colorTexNode,t=this._ndTexNode,r=this._albedoTexNode,i=this._demodTex,a=this.resW,o=this.resH;return(0,n.Fn)(()=>{let s=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),c=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(s.lessThan((0,n.int)(a)).and(c.lessThan((0,n.int)(o))),()=>{let a=(0,n.ivec2)(s,c),o=(0,n.textureLoad)(e,a).xyz,l=(0,n.textureLoad)(t,a).w.lessThan((0,n.float)(nb)),u=(0,n.textureLoad)(r,a).xyz,d=(0,n.select)(l,(0,n.max)(u,(0,n.vec3)(Xe)),(0,n.vec3)(1)),f=ib(o.div(d));(0,n.textureStore)(i,(0,n.uvec2)((0,n.uint)(s),(0,n.uint)(c)),(0,n.vec4)(f,1)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[16,16,1])}_buildAtrous(e){let t=this._readTexNode,r=this._colorTexNode,i=this._ndTexNode,a=this._snTexNode,o=this._albedoTexNode,s=this._varTexNode,c=this.filterStrength,l=this.phiLuminance,u=this.phiNormal,d=this.phiDepth,f=this.stepSizeU,p=this.isLastIterationU,m=this.isFirstIterationU,h=this.varianceHistoryU,g=this.resW,_=this.resH;return(0,n.Fn)(()=>{let v=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),y=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(v.lessThan((0,n.int)(g)).and(y.lessThan((0,n.int)(_))),()=>{let b=(0,n.ivec2)(v,y),x=(0,n.textureLoad)(t,b),S=x.xyz,C=Ui(S),w=(0,n.textureLoad)(i,b).w,T=(0,n.textureLoad)(a,b).xyz.mul(2).sub(1),E=w.lessThan((0,n.float)(nb)),D=(0,n.select)(E,(0,n.float)(1),(0,n.float)(0)),O=(0,n.textureLoad)(o,b).xyz,k=(0,n.select)(E,(0,n.max)(O,(0,n.vec3)(Xe)),(0,n.vec3)(1)),A=(0,n.max)(Ui(k),(0,n.float)(Xe)),j=m.equal((0,n.int)(1)),M=h.lessThan((0,n.int)(ab)),N=e=>{let t=(0,n.textureLoad)(s,e);return(0,n.select)(M,(0,n.max)(t.z,t.w),t.z)},P=j.select(N(b),x.w.mul(x.w)).toVar(),F=l.mul((0,n.sqrt)((0,n.max)(P,(0,n.float)(0)))).div(A).add((0,n.float)(1e-4)),I=(0,n.vec3)(0).toVar(),L=(0,n.float)(0).toVar(),R=(0,n.float)(0).toVar();for(let e=0;e<5;e++)for(let r=0;r<5;r++){let o=r-2,s=e-2,c=ob[e*5+r],l=(0,n.ivec2)(v.add(f.mul(o)).clamp((0,n.int)(0),(0,n.int)(g).sub(1)),y.add(f.mul(s)).clamp((0,n.int)(0),(0,n.int)(_).sub(1))),p=(0,n.textureLoad)(t,l),m=p.xyz,h=Ui(m),b=(0,n.textureLoad)(i,l).w,x=(0,n.textureLoad)(a,l).xyz.mul(2).sub(1),S=(0,n.select)(b.lessThan((0,n.float)(nb)),(0,n.float)(1),(0,n.float)(0)),E=C.sub(h).abs().div(F).negate().exp(),O=(0,n.pow)((0,n.dot)(T,x).clamp(0,1),u),k=w.sub(b).abs().div((0,n.max)(w.mul(d),(0,n.float)(.001))).negate().exp(),A=D.mul(S),M=D.oneMinus().mul(S.oneMinus()),P=A.add(M),ee=(0,n.mix)((0,n.float)(1),O.mul(k),A),te=(0,n.float)(c).mul(E).mul(ee).mul(P),ne=j.select(N(l),p.w.mul(p.w));I.addAssign(m.mul(te)),L.addAssign(te),R.addAssign(te.mul(te).mul((0,n.max)(ne,(0,n.float)(0))))}let ee=I.div((0,n.max)(L,(0,n.float)(1e-4))),te=R.div((0,n.max)(L.mul(L),(0,n.float)(1e-8))),ne=p.equal((0,n.int)(1)),re=(0,n.textureLoad)(r,b).xyz,z=(0,n.mix)(re,ee.mul(k),c),ie=ne.select(z,ee),ae=ne.select((0,n.textureLoad)(r,b).w,(0,n.sqrt)((0,n.max)(te,(0,n.float)(0))));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(v),(0,n.uint)(y)),(0,n.vec4)(ie,ae)).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[16,16,1])}render(e){if(!this.enabled)return;let t=e.getTexture(`pathtracer:color`),n=e.getTexture(`pathtracer:normalDepth`),r=e.getTexture(`pathtracer:shadingNormal`)||n,i=e.getTexture(`pathtracer:albedo`),a=e.getTexture(`variance:output`);if(!t||!n||!i||!a){t&&e.setTexture(`edgeFiltering:output`,t);return}if(e.getState(`interactionMode`)){e.setTexture(`edgeFiltering:output`,t);return}let o=t.image;o&&o.width>0&&o.height>0&&(o.width!==this.outputTarget.width||o.height!==this.outputTarget.height)&&this.setSize(o.width,o.height),this.varianceHistoryU.value=e.getState(`accumulatedFrames`)??0,this._colorTexNode.value=t,this._ndTexNode.value=n,this._snTexNode.value=r,this._albedoTexNode.value=i,this._varTexNode.value=a,this._compiled||=(this.renderer.compute(this._computeDemod),this.renderer.compute(this._computeAtrousA),this.renderer.compute(this._computeAtrousB),!0),this.renderer.compute(this._computeDemod);let s=this._demodTex,c=this._computeAtrousA,l=this._computeAtrousB;for(let e=0;e<this.iterations;e++){this.stepSizeU.value=1<<e,this.isLastIterationU.value=+(e===this.iterations-1),this.isFirstIterationU.value=+(e===0),this._readTexNode.value=s,this.renderer.compute(c),s=c===this._computeAtrousA?this._storageTexA:this._storageTexB;let t=c;c=l,l=t}this._srcRegion.max.set(this.outputTarget.width,this.outputTarget.height),this.renderer.copyTextureToTexture(s,this.outputTarget.texture,this._srcRegion),e.setTexture(`edgeFiltering:output`,this.outputTarget.texture)}setFilteringEnabled(e){this.enabled=e}updateUniforms(e){e&&(e.filterStrength!==void 0&&(this.filterStrength.value=e.filterStrength),e.phiLuminance!==void 0&&(this.phiLuminance.value=e.phiLuminance),e.phiNormal!==void 0&&(this.phiNormal.value=e.phiNormal),e.phiDepth!==void 0&&(this.phiDepth.value=e.phiDepth),e.atrousIterations!==void 0&&(this.iterations=e.atrousIterations))}releaseGPUMemory(){this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.context?.removeTexture(`edgeFiltering:output`),this.outputTarget?.texture?.dispose()}reset(){}setSize(e,t){this.outputTarget.setSize(e,t),this.outputTarget.texture.needsUpdate=!0,this.resW.value=e,this.resH.value=t,this._dispatchX=Math.ceil(e/16),this._dispatchY=Math.ceil(t/16);let n=[this._dispatchX,this._dispatchY,1];this._computeDemod.dispatchSize=n,this._computeAtrousA.dispatchSize=n,this._computeAtrousB.dispatchSize=n}reallocateReservedStorage(){this._computeDemod?.dispose(),this._computeAtrousA?.dispose(),this._computeAtrousB?.dispose(),this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this._demodTex=this._makeStorageTex(),this._storageTexA=this._makeStorageTex(),this._storageTexB=this._makeStorageTex(),this._buildCompute(),this._compiled=!1}dispose(){this._computeDemod?.dispose(),this._computeAtrousA?.dispose(),this._computeAtrousB?.dispose(),this._demodTex?.dispose(),this._storageTexA?.dispose(),this._storageTexB?.dispose(),this.outputTarget?.dispose(),this._colorTexNode?.dispose(),this._ndTexNode?.dispose(),this._snTexNode?.dispose(),this._albedoTexNode?.dispose(),this._varTexNode?.dispose(),this._readTexNode?.dispose()}},cb=256,lb=-8,ub=6-lb,db=ub/cb,fb=1e4,pb=(0,n.wgslFn)(`
|
|
943
943
|
fn adaptExposure(
|
|
944
944
|
geoMean: f32,
|
|
945
945
|
prevExposure: f32,
|
|
@@ -968,7 +968,7 @@ fn ${e}( c: vec3<f32> ) -> vec3<f32> {
|
|
|
968
968
|
return vec4f( newExposure, geoMean, targetExp, 1.0 );
|
|
969
969
|
|
|
970
970
|
}
|
|
971
|
-
`),mb=class extends xe{constructor(e,r={}){super(`AutoExposure`,{...r,executionMode:z.ALWAYS}),this.renderer=e,this.REDUCTION_SIZE=64,this.keyValueU=(0,n.uniform)(r.keyValue??.18),this.minExposureU=(0,n.uniform)(r.minExposure??.1),this.maxExposureU=(0,n.uniform)(r.maxExposure??20),this.adaptSpeedBrightU=(0,n.uniform)(r.adaptSpeedBright??3),this.adaptSpeedDarkU=(0,n.uniform)(r.adaptSpeedDark??.5),this.epsilonU=(0,n.uniform)(r.epsilon??1e-4),this.deltaTimeU=(0,n.uniform)(1/60),this.isFirstFrameU=(0,n.uniform)(1),this.previousExposureU=(0,n.uniform)(r.initialExposure??1),this.lowPercentileU=(0,n.uniform)(r.lowPercentile??.1),this.highPercentileU=(0,n.uniform)(r.highPercentile??.9),this.centerWeightU=(0,n.uniform)(r.centerWeight??8),this.inputResW=(0,n.uniform)(1),this.inputResH=(0,n.uniform)(1),this._inputTexNode=new t.TextureNode,this._reductionReadTexNode=new t.TextureNode,this.currentExposure=r.initialExposure??1,this.currentLuminance=.18,this.targetExposure=1,this.lastTime=performance.now(),this.isFirstFrame=!0,this._pendingReadback=!1,this._readbackGeneration=0,this._initRenderTargets(),this._buildCompute()}_initRenderTargets(){let e={type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this._downsampleTarget=new t.RenderTarget(this.REDUCTION_SIZE,this.REDUCTION_SIZE,e),this._downsampleStorageTex=new t.StorageTexture(this.REDUCTION_SIZE,this.REDUCTION_SIZE),this._downsampleStorageTex.type=r.FloatType,this._downsampleStorageTex.format=r.RGBAFormat,this._downsampleStorageTex.minFilter=r.NearestFilter,this._downsampleStorageTex.magFilter=r.NearestFilter,this._reductionStorageTex=new t.StorageTexture(1,1),this._reductionStorageTex.type=r.FloatType,this._reductionStorageTex.format=r.RGBAFormat,this._reductionStorageTex.minFilter=r.NearestFilter,this._reductionStorageTex.magFilter=r.NearestFilter,this._reductionReadTarget=new t.RenderTarget(1,1,e),this._adaptationResult=(0,n.attributeArray)(1,`vec4`),this._readbackBuffer=new t.ReadbackBuffer(16),this._readbackBuffer.name=`AutoExposureAdaptation`,this._histogramBuffer=(0,n.attributeArray)(cb,`uint`).toAtomic()}_buildCompute(){this._buildDownsampleCompute(),this._buildHistogramCompute(),this._buildHistogramAnalyzeCompute(),this._buildAdaptationCompute()}_buildDownsampleCompute(){let e=this._inputTexNode,t=this._downsampleStorageTex,r=this.epsilonU,i=this.inputResW,a=this.inputResH;this._downsampleComputeNode=(0,n.Fn)(()=>{let o=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),s=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y)),c=i.div((0,n.float)(64)),l=a.div((0,n.float)(64)),u=(0,n.float)(o).mul(c),d=(0,n.float)(s).mul(l),f=(0,n.float)(0).toVar(),p=(0,n.float)(0).toVar();for(let t=0;t<4;t++)for(let i=0;i<4;i++){let a=Ui((0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(u.add((0,n.float)((i+.5)/4).mul(c))),(0,n.int)(d.add((0,n.float)((t+.5)/4).mul(l))))).xyz);(0,n.If)(a.greaterThan(r),()=>{f.addAssign(a.add(r).log()),p.addAssign(1)})}(0,n.textureStore)(t,(0,n.uvec2)((0,n.uint)(o),(0,n.uint)(s)),(0,n.vec4)(f,p,0,1)).toWriteOnly()})().compute([64/8,64/8,1],[8,8,1])}_buildHistogramCompute(){let e=this._downsampleTarget.texture,t=this._histogramBuffer,r=this.centerWeightU;this._histogramComputeNode=(0,n.Fn)(()=>{let i=n.localId.x;(0,n.atomicStore)(t.element(i),(0,n.uint)(0)),(0,n.workgroupBarrier)();for(let a=0;a<16;a++){let o=i.mul(16).add(a),s=o.mod(64),c=o.div(64),l=(0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(s),(0,n.int)(c))),u=l.x,d=l.y;(0,n.If)(d.greaterThan(0),()=>{let e=(0,n.uint)(u.div(d).sub((0,n.float)(lb)).div((0,n.float)(ub)).mul((0,n.float)(cb)).floor().clamp(0,(0,n.float)(cb-1))),i=(0,n.float)(s).add(.5).div((0,n.float)(64)),a=(0,n.float)(c).add(.5).div((0,n.float)(64)),o=i.sub(.5),l=a.sub(.5),f=(0,n.uint)(o.mul(o).add(l.mul(l)).mul(r).negate().exp().mul((0,n.float)(fb)));(0,n.atomicAdd)(t.element(e),f)})}})().compute([1,1,1],[256,1,1])}_buildHistogramAnalyzeCompute(){let e=this._histogramBuffer,t=this._reductionStorageTex,r=this.lowPercentileU,i=this.highPercentileU;this._histogramAnalyzeNode=(0,n.Fn)(()=>{let a=(0,n.float)(0).toVar();(0,n.Loop)(cb,({i:t})=>{a.addAssign((0,n.float)((0,n.atomicLoad)(e.element(t))))});let o=a.mul(r),s=a.mul(i),c=(0,n.float)(0).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.float)(0).toVar(),d=(0,n.float)(0).toVar();(0,n.Loop)(cb,({i:t})=>{let r=(0,n.float)((0,n.atomicLoad)(e.element(t)));d.assign(c),c.addAssign(r),(0,n.If)(d.lessThan(s).and(c.greaterThan(o)),()=>{let e=(0,n.float)(lb).add((0,n.float)(t).add(.5).mul((0,n.float)(db)));l.addAssign(e.mul(r)),u.addAssign(r)})});let f=(0,n.max)(u,(0,n.float)(1)),p=l.div(f),m=p.exp();(0,n.textureStore)(t,(0,n.uvec2)((0,n.uint)(0),(0,n.uint)(0)),(0,n.vec4)(m,a,p,1)).toWriteOnly()})().compute(1,[1,1,1])}_buildAdaptationCompute(){let e=this._reductionReadTexNode,t=this._adaptationResult,r=this.keyValueU,i=this.minExposureU,a=this.maxExposureU,o=this.adaptSpeedBrightU,s=this.adaptSpeedDarkU,c=this.deltaTimeU,l=this.isFirstFrameU,u=this.previousExposureU;this._adaptationComputeNode=(0,n.Fn)(()=>{let d=(0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(0),(0,n.int)(0))).x,f=pb(d,u,r,i,a,o,s,c,l);t.element((0,n.uint)(0)).assign(f)})().compute(1,[1,1,1])}setupEventListeners(){this.on(`pipeline:reset`,()=>this.reset()),this.on(`autoexposure:resetHistory`,()=>this.resetHistory()),this.on(`autoexposure:toggle`,e=>{this.enabled=e}),this.on(`autoexposure:updateParameters`,e=>e&&this.updateParameters(e))}render(e){if(!this.enabled)return;let t=e.getTexture(`edgeFiltering:output`)||e.getTexture(`asvgf:output`)||e.getTexture(`pathtracer:color`);if(!t)return;let n=performance.now(),r=Math.min((n-this.lastTime)/1e3,.1);if(this.lastTime=n,this.deltaTimeU.value=this.isFirstFrame?1:r,this.isFirstFrameU.value=+!!this.isFirstFrame,this.previousExposureU.value=this.currentExposure,this.inputResW.value=t.image?.width||1,this.inputResH.value=t.image?.height||1,this._inputTexNode.value=t,this.renderer.compute(this._downsampleComputeNode),this.renderer.copyTextureToTexture(this._downsampleStorageTex,this._downsampleTarget.texture),this.renderer.compute(this._histogramComputeNode),this.renderer.compute(this._histogramAnalyzeNode),this.renderer.copyTextureToTexture(this._reductionStorageTex,this._reductionReadTarget.texture),this._reductionReadTexNode.value=this._reductionReadTarget.texture,this.renderer.compute(this._adaptationComputeNode),!this._pendingReadback){this._pendingReadback=!0;let e=this._readbackGeneration;this.renderer.getArrayBufferAsync(this._adaptationResult.value,this._readbackBuffer).then(t=>{let n=t&&t.buffer?new Float32Array(t.buffer.slice(0)):null;this._readbackBuffer.release(),this._pendingReadback=!1,n&&e===this._readbackGeneration&&this._applyReadback(n)}).catch(()=>{try{this._readbackBuffer.release()}catch{}this._pendingReadback=!1})}e.setState(`autoexposure:value`,this.currentExposure),e.setState(`autoexposure:avgLuminance`,this.currentLuminance),this.emit(`autoexposure:updated`,{exposure:this.currentExposure,luminance:this.currentLuminance,targetExposure:this.targetExposure}),this.isFirstFrame=!1}_applyReadback(e){if(!this.enabled||!e||e.length<3)return;let t=e[0],n=e[1],r=e[2];(!isFinite(t)||t<=0)&&(t=1),(!isFinite(n)||n<=0)&&(n=.18),(!isFinite(r)||r<=0)&&(r=t),this.currentExposure=t,this.currentLuminance=n,this.targetExposure=r,this.renderer.toneMappingExposure=t}reset(){this.lastTime=performance.now(),this._readbackGeneration++,this._pendingReadback=!1}resetHistory(){this.isFirstFrame=!0,this.currentExposure=1,this.currentLuminance=.18,this.targetExposure=1,this.lastTime=performance.now(),this._readbackGeneration++,this._pendingReadback=!1}setSize(){}setExposure(e){this.currentExposure=e,this.previousExposureU.value=e,this.renderer.toneMappingExposure=e}getExposure(){return this.currentExposure}getLuminance(){return this.currentLuminance}updateParameters(e){e.keyValue!==void 0&&(this.keyValueU.value=e.keyValue),e.minExposure!==void 0&&(this.minExposureU.value=e.minExposure),e.maxExposure!==void 0&&(this.maxExposureU.value=e.maxExposure),e.adaptSpeedBright!==void 0&&(this.adaptSpeedBrightU.value=e.adaptSpeedBright),e.adaptSpeedDark!==void 0&&(this.adaptSpeedDarkU.value=e.adaptSpeedDark),e.lowPercentile!==void 0&&(this.lowPercentileU.value=e.lowPercentile),e.highPercentile!==void 0&&(this.highPercentileU.value=e.highPercentile),e.centerWeight!==void 0&&(this.centerWeightU.value=e.centerWeight)}dispose(){this._downsampleComputeNode?.dispose(),this._histogramComputeNode?.dispose(),this._histogramAnalyzeNode?.dispose(),this._adaptationComputeNode?.dispose(),this._downsampleTarget?.dispose(),this._downsampleStorageTex?.dispose(),this._reductionStorageTex?.dispose(),this._reductionReadTarget?.dispose(),this._readbackBuffer?.dispose(),this._inputTexNode?.dispose(),this._reductionReadTexNode?.dispose()}},hb=class extends xe{constructor(e,i={}){super(`Compositor`,{...i,executionMode:z.ALWAYS}),this.renderer=e,this.saturation=(0,n.uniform)(i.saturation??1),this._transparentBackground=(0,n.uniform)(0,`int`),this._pathTracer=i.pathTracer??null,this._convergenceOverlay=!1,this._debugMaterial=null,this._debugQuad=null,this._debugTexNode=null,this._debugM2Attr=null,this._debugMaskAttr=null,this._debugExposureComp=(0,n.uniform)(1),this._sourceTexNode=new t.TextureNode;let a=this._sourceTexNode.sample((0,n.uv)()),o=(0,n.mix)((0,n.vec3)((0,n.dot)(a.xyz,Ii)),a.xyz,this.saturation),s=(0,n.select)(this._transparentBackground,a.w,1);this.compositorMaterial=new t.MeshBasicNodeMaterial,this.compositorMaterial.colorNode=(0,n.vec4)(o,s),this.compositorMaterial.blending=r.NoBlending,this.compositorQuad=new t.QuadMesh(this.compositorMaterial)}_resolveSourceTexture(e){return e.getTexture(`bloom:output`)||this.resolveLightTexture(e)}resolveLightTexture(e){return e.getTexture(`oidn:output`)||e.getTexture(`edgeFiltering:output`)||e.getTexture(`bilateralFiltering:output`)||e.getTexture(`asvgf:output`)||e.getTexture(`nrd:output`)||e.getTexture(`pathtracer:color`)}_ensureDebugMaterial(){let e=this._pathTracer?.getConvergenceDebugSource?.();if(!e)return!1;if(this._debugMaterial&&this._debugM2Attr===e.m2&&this._debugMaskAttr===e.frozenMask)return!0;this._debugMaterial?.dispose(),this._debugTexNode?.dispose(),this._debugM2Attr=e.m2,this._debugMaskAttr=e.frozenMask,this._debugTexNode=new t.TextureNode;let i=(0,n.Fn)(()=>{let t=(0,n.dot)(this._debugTexNode.sample((0,n.uv)()).toVar().xyz,Ii).toVar(),r=e.renderWidth,i=e.renderHeight,a=(0,n.int)((0,n.uv)().x.mul((0,n.float)(r))).min(r.sub((0,n.int)(1))).max((0,n.int)(0)),o=(0,n.uint)((0,n.int)((0,n.uv)().y.mul((0,n.float)(i))).min(i.sub((0,n.int)(1))).max((0,n.int)(0)).mul(r).add(a)).toVar(),s=(0,n.storage)(e.m2,`float`).toReadOnly().element(o).toVar(),c=(0,n.storage)(e.frozenMask,`uint`).toReadOnly().element(o).toVar(),l=s.sub(t.mul(t)).max((0,n.float)(0)).div((0,n.float)(e.frame).add(1)).sqrt().toVar(),u=e.usePixelFreeze.greaterThan((0,n.int)(0)),d=(0,n.select)(t.lessThan((0,n.float)(1)),t.sqrt(),t).toVar(),f=(0,n.select)(u,l.div(t.add((0,n.float)(1e-4))),l.div(d.add((0,n.float)(1e-4)))).toVar(),p=(0,n.select)(u,e.pixelFreezeThreshold,e.noiseThreshold).toVar(),m=f.div(p.max((0,n.float)(1e-6))).toVar(),h=(0,n.vec3)(t.div(t.add((0,n.float)(1))).sqrt().mul(.55)).toVar(),g=h.toVar(),_=(0,n.float)(e.frame).greaterThanEqual((0,n.float)(e.adaptiveMinSamples));return(0,n.If)(m.greaterThanEqual((0,n.float)(1)).or(_.not()),()=>{let e=(0,n.mix)((0,n.vec3)(1,.8,.1),(0,n.vec3)(1,.1,.05),m.sub(1).div(3).clamp(0,1));g.assign((0,n.mix)(h,e,.85))}),(0,n.If)(c.equal((0,n.uint)(1)).and(u),()=>{g.assign((0,n.mix)(h,(0,n.vec3)(.1,.45,1),.55))}),g});return this._debugMaterial=new t.MeshBasicNodeMaterial,this._debugMaterial.colorNode=(0,n.vec4)(i().pow(2.2).mul(this._debugExposureComp),1),this._debugMaterial.blending=r.NoBlending,this._debugQuad=new t.QuadMesh(this._debugMaterial),!0}render(e){if(!this.enabled)return;if(this._convergenceOverlay&&this._ensureDebugMaterial()){let t=e.getTexture(`pathtracer:color`);if(t){this._debugTexNode.value=t;let e=this.renderer.toneMapping!==r.NoToneMapping;this._debugExposureComp.value=e?1/Math.max(this.renderer.toneMappingExposure,1e-4):1,this.renderer.setRenderTarget(null),this._debugQuad.render(this.renderer);return}}let t=this._resolveSourceTexture(e);t&&(this._sourceTexNode.value=t,this.renderer.setRenderTarget(null),this.compositorQuad.render(this.renderer))}setConvergenceOverlay(e){this._convergenceOverlay=!!e}setSaturation(e){this.saturation.value=e}setTransparentBackground(e){this._transparentBackground.value=+!!e}dispose(){this._sourceTexNode?.dispose(),this.compositorMaterial?.dispose(),this._debugTexNode?.dispose(),this._debugMaterial?.dispose(),this.compositorQuad=null,this._debugQuad=null,this._debugMaterial=null,this._debugTexNode=null,this._pathTracer=null}},gb=class{constructor(){this.textures=new Map,this.renderTargets=new Map,this.uniforms=new Map,this.state={frame:0,accumulatedFrames:0,renderMode:0,interactionMode:!1,isComplete:!1,tileInfo:null,currentTile:0,totalTiles:0,cameraChanged:!1,cameraMoving:!1,width:0,height:0,time:0,deltaTime:0,enableASVGF:!1,enableEdgeFiltering:!1},this._stateChangeCallbacks=new Map}setTexture(e,t){this.textures.set(e,t)}getTexture(e){return this.textures.get(e)}hasTexture(e){return this.textures.has(e)}removeTexture(e){this.textures.delete(e)}getTextureNames(){return Array.from(this.textures.keys())}clearTextures(){this.textures.clear()}setRenderTarget(e,t){this.renderTargets.set(e,t)}getRenderTarget(e){return this.renderTargets.get(e)}hasRenderTarget(e){return this.renderTargets.has(e)}removeRenderTarget(e){this.renderTargets.delete(e)}getRenderTargetNames(){return Array.from(this.renderTargets.keys())}clearRenderTargets(){this.renderTargets.clear()}setUniform(e,t){this.uniforms.has(e)?this.uniforms.get(e).value=t:this.uniforms.set(e,{value:t})}getUniform(e){return this.uniforms.get(e)}getUniformValue(e){return this.uniforms.get(e)?.value}hasUniform(e){return this.uniforms.has(e)}removeUniform(e){this.uniforms.delete(e)}getUniformNames(){return Array.from(this.uniforms.keys())}clearUniforms(){this.uniforms.clear()}setState(e,t){let n=this.state[e],r=n!==t;return r&&(this.state[e]=t,this._notifyStateChange(e,t,n)),r}getState(e){return this.state[e]}getAllState(){return this.state}setStates(e){let t=[];for(let[n,r]of Object.entries(e))this.setState(n,r)&&t.push(n);return t}hasState(e){return e in this.state}watchState(e,t){this._stateChangeCallbacks.has(e)||this._stateChangeCallbacks.set(e,[]),this._stateChangeCallbacks.get(e).push(t)}unwatchState(e,t){if(!this._stateChangeCallbacks.has(e))return;let n=this._stateChangeCallbacks.get(e),r=n.indexOf(t);r>-1&&n.splice(r,1)}_notifyStateChange(e,t,n){if(!this._stateChangeCallbacks.has(e))return;let r=this._stateChangeCallbacks.get(e);for(let i of r)try{i(t,n)}catch(t){console.error(`Error in state change callback for '${e}':`,t)}}reset(){this.state.frame=0,this.state.accumulatedFrames=0,this.state.isComplete=!1,this.state.cameraChanged=!0,this.state.currentTile=0}incrementFrame(){return this.state.frame++,this.state.accumulatedFrames++,this.state.frame}dispose(){this.textures.clear(),this.renderTargets.clear(),this.uniforms.clear(),this._stateChangeCallbacks.clear(),this.state={}}},_b=class extends r.EventDispatcher{constructor(){super(),this._onceCallbacks=new Map}on(e,t){this.addEventListener(e,t)}once(e,t){let n=r=>{t(r),this.off(e,n),this._onceCallbacks.delete(t)};this._onceCallbacks.set(t,n),this.on(e,n)}off(e,t){let n=this._onceCallbacks.get(t);n?(this.removeEventListener(e,n),this._onceCallbacks.delete(t)):this.removeEventListener(e,t)}emit(e,t){t&&typeof t==`object`&&t.type?this.dispatchEvent(t):this.dispatchEvent({type:e,...t})}removeAllListeners(e){if(e){for(let[t,n]of this._onceCallbacks.entries())this.hasEventListener(e,n)&&(this.removeEventListener(e,n),this._onceCallbacks.delete(t));this._listeners&&this._listeners[e]&&delete this._listeners[e]}else this._onceCallbacks.clear(),this._listeners&&={}}listenerCount(e){return!this._listeners||!this._listeners[e]?0:this._listeners[e].length}clear(){this.removeAllListeners()}eventNames(){return this._listeners?Object.keys(this._listeners):[]}},vb=!1,yb=[],bb=new WeakMap;function xb(e){vb=!!e}function Sb(){return yb.slice()}function Cb(){yb.length=0}function wb(e){let t=[];for(let n of Object.keys(e))e[n]?.isTextureNode===!0&&t.push(n);return t}var Tb=e=>!e||!e.image||!(e.image.width>0);function Eb(e,t,n){if(!vb){n();return}let r=bb.get(e);if(r||(r={phase:`pending`,unboundAtCompile:[]},bb.set(e,r)),r.phase!==`pending`){n(),r.phase===`watch`&&Db(e,r);return}let i=Object.prototype.hasOwnProperty.call(t,`compute`),a=t.compute;t.compute=function(...t){return r.phase===`pending`&&(r.unboundAtCompile=wb(e).filter(t=>Tb(e[t].value)),r.phase=r.unboundAtCompile.length<2?`done`:`watch`),a.apply(this,t)};try{n()}finally{i?t.compute=a:delete t.compute}}function Db(e,t){let n=[];for(let r of t.unboundAtCompile){let t=e[r]?.value;if(Tb(t))return;t.isStorageTexture!==!0&&n.push(r)}t.phase=`done`,n.length!==0&&yb.push({stage:e.name,nodes:n,unboundAtCompile:t.unboundAtCompile.slice(),message:`${e.name}: ${n.join(`, `)} ${n.length===1?`was`:`were`} still holding EmptyTexture when the stage first dispatched, alongside ${t.unboundAtCompile.length-n.length} other unbound node(s), and later received a non-storage texture. Two nodes unbound at compile time can share one GPU binding and then both resolve to whichever is assigned last. Assign these before the first dispatch.`})}var Ob=class{_reportStageFailure(e,t,n){console.error(`[Pipeline] Error in stage '${e}' (${t}):`,n);let r=`${e}:${t}`;this._reportedStageFailures.has(r)||(this._reportedStageFailures.add(r),this._issues?.record(Y.STAGE_RENDER_FAILED,`stage "${e}" threw during ${t} — the frame is incomplete`,{stage:e,phase:t,cause:String(n?.message??n)}))}constructor(e,t,n,{issues:r=null}={}){this.renderer=e,this._issues=r,this._reportedStageFailures=new Set,this.width=t,this.height=n,this.stages=[],this.context=new gb,this.eventBus=new _b,this.context.setState(`width`,t),this.context.setState(`height`,n),this.stats={enabled:!1,logSkipped:!1,timings:new Map,frameCount:0}}addStage(e){this.stages.push(e),e.initialize(this.context,this.eventBus),this.stats.enabled&&console.log(`[Pipeline] Added stage: ${e.name}`)}getStage(e){return this.stages.find(t=>t.name===e)}removeStage(e){let t=this.stages.findIndex(t=>t.name===e);if(t>-1){let e=this.stages[t];return this.stages.splice(t,1),e.dispose&&e.dispose(),this.stats.timings.delete(e.name),!0}return!1}setStageEnabled(e,t){let n=this.getStage(e);n&&(t?n.enable():n.disable())}render(e=null){let t=this.stats.enabled?performance.now():0;for(let t of this.stages){if(!t.shouldExecuteThisFrame(this.context)){this.stats.enabled&&this.stats.logSkipped&&console.log(`[Pipeline] Skipped stage '${t.name}' (executionMode: ${t.executionMode})`);continue}try{let n=this.stats.enabled?performance.now():0;if(Eb(t,this.renderer,()=>t.render(this.context,e)),this.stats.enabled){let e=performance.now()-n;this.stats.timings.has(t.name)||this.stats.timings.set(t.name,[]);let r=this.stats.timings.get(t.name);r.push(e),r.length>60&&r.shift()}}catch(e){this._reportStageFailure(t.name,`render`,e)}}if(this.context.incrementFrame(),this.eventBus.emit(`frame:complete`,{frame:this.context.getState(`frame`),accumulatedFrames:this.context.getState(`accumulatedFrames`)}),this.stats.enabled){let e=performance.now()-t;this.stats.timings.has(`_total`)||this.stats.timings.set(`_total`,[]);let n=this.stats.timings.get(`_total`);n.push(e),n.length>60&&n.shift(),this.stats.frameCount++}}reset(){this.eventBus.emit(`pipeline:reset`);for(let e of this.stages)if(e.reset)try{e.reset()}catch(t){this._reportStageFailure(e.name,`reset`,t)}this.context.reset(),this.stats.enabled&&(this.stats.timings.clear(),this.stats.frameCount=0)}setSize(e,t){this.width=e,this.height=t,this.context.setState(`width`,e),this.context.setState(`height`,t),this.eventBus.emit(`pipeline:resize`,{width:e,height:t});for(let n of this.stages)if(n.setSize)try{n.setSize(e,t)}catch(e){console.error(`[Pipeline] Error resizing stage '${n.name}':`,e)}}dispose(){for(let e of this.stages)if(e.dispose)try{e.dispose()}catch(t){console.error(`[Pipeline] Error disposing stage '${e.name}':`,t)}this.stages=[],this.context.dispose(),this.eventBus.clear(),this.stats.timings.clear()}setStatsEnabled(e){this.stats.enabled=e,e||(this.stats.timings.clear(),this.stats.frameCount=0)}getStats(){if(!this.stats.enabled)return null;let e={frameCount:this.stats.frameCount,stages:{},total:0};for(let[t,n]of this.stats.timings.entries()){if(n.length===0)continue;let r=n.reduce((e,t)=>e+t,0)/n.length,i=Math.min(...n),a=Math.max(...n);t===`_total`?(e.total=r,e.totalMin=i,e.totalMax=a):e.stages[t]={avg:r,min:i,max:a}}return e}logStats(){let e=this.getStats();if(!e){console.log(`[Pipeline] Stats not enabled`);return}console.group(`[Pipeline] Performance Stats`),console.log(`Frames: ${e.frameCount}`),e.totalMin===void 0?console.log(`Total: no frames recorded yet (pipeline.render() has not run since stats were enabled — the path tracer may have converged and stopped its animation loop)`):console.log(`Total: ${e.total.toFixed(2)}ms (min: ${e.totalMin.toFixed(2)}ms, max: ${e.totalMax.toFixed(2)}ms)`);for(let[t,n]of Object.entries(e.stages))console.log(` ${t}: ${n.avg.toFixed(2)}ms (min: ${n.min.toFixed(2)}ms, max: ${n.max.toFixed(2)}ms)`);console.groupEnd()}getInfo(){return{stageCount:this.stages.length,enabledStages:this.stages.filter(e=>e.enabled).length,stages:this.stages.map(e=>({name:e.name,enabled:e.enabled})),contextState:this.context.getAllState(),textures:this.context.getTextureNames(),renderTargets:this.context.getRenderTargetNames(),uniforms:this.context.getUniformNames(),events:this.eventBus.eventNames()}}logInfo(){let e=this.getInfo();console.group(`[Pipeline] Info`),console.log(`Stages:`,e.stages),console.log(`Context Textures:`,e.textures),console.log(`Context Render Targets:`,e.renderTargets),console.log(`Context Uniforms:`,e.uniforms),console.log(`Event Types:`,e.events),console.log(`State:`,e.contextState),console.groupEnd()}};rn();var kb=Wt(`engine`),Ab=class{constructor(){this.timeElapsed=0,this.lastResetTime=performance.now(),this.renderCompleteDispatched=!1,this.budgetOverrun=!1,this._budgetHeldWarned=!1}updateTime(){this.timeElapsed=(performance.now()-this.lastResetTime)/1e3}isTimeLimitReached(e,t,n){return t!==`time`||!(n>0)||this.timeElapsed<n?!1:e?.frameCount>0?(this.budgetOverrun=!0,!0):(this._budgetHeldWarned||(this._budgetHeldWarned=!0,kb.warn(`render time limit (${n}s) expired before the first sample landed — holding the deadline open to avoid capturing an empty frame`)),!1)}isLimitReached(e,t,n){return e?this.isTimeLimitReached(e,t,n)?!0:this.stopCondition(e)!==null:!1}stopCondition(e){return this.budgetOverrun?`timeLimit`:e?e.frameCount>=e.completionThreshold?`samples`:e._isConvergedComplete?.()?`converged`:null:null}markComplete(){return this.renderCompleteDispatched?!1:(this.renderCompleteDispatched=!0,!0)}reset(){this.timeElapsed=0,this.lastResetTime=performance.now(),this.renderCompleteDispatched=!1,this.budgetOverrun=!1,this._budgetHeldWarned=!1}resumeFromPause(){this.renderCompleteDispatched=!1,this.lastResetTime=performance.now()-this.timeElapsed*1e3}},jb=class{constructor(e){this.renderer=e,this.target=null,this.material=new t.NodeMaterial,this.material.name=`rayzee:texture-readback`,this.quad=new t.QuadMesh(this.material),this._node=null,this._source=null}_ensureTarget(e,t){this.target&&this.target.width===e&&this.target.height===t||(this.target?.dispose(),this.target=new r.RenderTarget(e,t,{type:r.FloatType,format:r.RGBAFormat,depthBuffer:!1,minFilter:r.NearestFilter,magFilter:r.NearestFilter}))}async read(e,t,r){this._ensureTarget(t,r),this._source!==e&&(this._node=(0,n.texture)(e).load((0,n.ivec2)(n.screenCoordinate.xy)),this.material.outputNode=this._node,this.material.needsUpdate=!0,this._source=e);let i=this.renderer.getRenderTarget();this.renderer.setRenderTarget(this.target),this.quad.render(this.renderer),this.renderer.setRenderTarget(i);try{return await this.renderer.readRenderTargetPixelsAsync(this.target,0,0,t,r)}finally{this.target.dispose(),this.target=null}}dispose(){this.target?.dispose(),this.material.dispose(),this.target=null,this._source=null,this._node=null}};Ce();var Mb=new r.Vector3,Nb=new r.Vector3;function Pb(e,t){return Nb.subVectors(e,t.position).dot(t.getWorldDirection(Mb))}function Fb(e,t,n=!1){return n?e.distance:Pb(e.point,t)}var Ib=class extends r.EventDispatcher{constructor({scene:e,camera:t,canvas:n,assetLoader:i,pathTracer:a,floorPlane:o}){super(),this.scene=e,this.camera=t,this.canvas=n,this.assetLoader=i,this.pathTracer=a,this.floorPlane=o,this.raycaster=new r.Raycaster,this.focusMode=!1,this.focusPointIndicator=null,this.afPointPlacementMode=!1,this.handleAFPointClick=this.handleAFPointClick.bind(this),this.selectedObject=null,this.selectMode=!1,this.clickTimeout=null,this.mouseDownPosition=null,this.dragThreshold=5,this.handleFocusClick=this.handleFocusClick.bind(this),this.handleSelectClick=this.handleSelectClick.bind(this),this.handleSelectDoubleClick=this.handleSelectDoubleClick.bind(this),this.handleMouseDown=this.handleMouseDown.bind(this),this.handleMouseUp=this.handleMouseUp.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleContextPointerDown=this.handleContextPointerDown.bind(this),this.handleContextPointerUp=this.handleContextPointerUp.bind(this),this.contextPointerDownPosition=null,this.canvas.addEventListener(`pointerdown`,this.handleContextPointerDown),this.canvas.addEventListener(`pointerup`,this.handleContextPointerUp),this.canvas.addEventListener(`contextmenu`,this.handleContextMenu),this._overlayManager=null,this._transformManager=null,this._appDispatch=null,this._orbitControls=null,this._helperScene=null}setDependencies({overlayManager:e,transformManager:t,appDispatch:n,orbitControls:r,helperScene:i}){this._overlayManager=e||null,this._transformManager=t||null,this._appDispatch=n||null,this._orbitControls=r||null,this._helperScene=i||null}select(e){let t=this._overlayManager?.getHelper(`outline`);t&&t.setSelectedObjects(e?[e]:[]),this.selectedObject=e||null,e?this._transformManager?.attach(e):this._transformManager?.detach(),this._appDispatch?.({type:B.OBJECT_SELECTED,object:e||null})}deselect(){this.select(null)}disableMode(){this.disableSelectMode(),this._transformManager?.detach()}on(e,t){return this.addEventListener(e,t),()=>this.removeEventListener(e,t)}toggleFocusMode(){return this.focusMode=!this.focusMode,this.canvas.style.cursor=this.focusMode?`crosshair`:`auto`,this.focusMode?this.canvas.addEventListener(`click`,this.handleFocusClick):this.canvas.removeEventListener(`click`,this.handleFocusClick),this._orbitControls&&(this._orbitControls.enabled=!this.focusMode),this.dispatchEvent({type:`focusModeChanged`,enabled:this.focusMode}),this.focusMode}handleFocusClick(e){let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0);if(n.length>0){let e=n[0],t=this.pathTracer?.cameraProjection?.value===Ke.equirectangular,r=Fb(e,this.camera,t);this.showFocusPoint(e.point),this.toggleFocusMode(),this.dispatchEvent({type:`focusChanged`,distance:r/this.assetLoader.getSceneScale(),worldDistance:r})}}showFocusPoint(e){this.focusPointIndicator&&this.scene.remove(this.focusPointIndicator),this.focusPointIndicator=new r.Mesh(new r.SphereGeometry(this.assetLoader.getSceneScale()*.02,16,16),new r.MeshBasicMaterial({color:65280,transparent:!0,opacity:.8,depthTest:!1})),this.focusPointIndicator.position.copy(e),this.scene.add(this.focusPointIndicator),setTimeout(()=>{this.focusPointIndicator&&=(this.scene.remove(this.focusPointIndicator),null)},2e3)}enterAFPointPlacementMode(){this.afPointPlacementMode=!0,this.canvas.style.cursor=`crosshair`,this.canvas.addEventListener(`click`,this.handleAFPointClick)}exitAFPointPlacementMode(){this.afPointPlacementMode=!1,this.canvas.style.cursor=`auto`,this.canvas.removeEventListener(`click`,this.handleAFPointClick)}handleAFPointClick(e){let t=this.canvas.getBoundingClientRect(),n=(e.clientX-t.left)/t.width,r=(e.clientY-t.top)/t.height;this.exitAFPointPlacementMode(),this.dispatchEvent({type:`afPointPlaced`,point:{x:n,y:r}})}toggleSelectMode(){return this.selectMode=!this.selectMode,this.canvas.style.cursor=this.selectMode?`pointer`:`auto`,this.selectMode?(this.canvas.addEventListener(`mousedown`,this.handleMouseDown),this.canvas.addEventListener(`mouseup`,this.handleMouseUp),this.canvas.addEventListener(`click`,this.handleSelectClick),this.canvas.addEventListener(`dblclick`,this.handleSelectDoubleClick)):(this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null),this.dispatchEvent({type:`selectModeChanged`,enabled:this.selectMode}),this.selectMode}disableSelectMode(){this.selectMode&&(this.selectMode=!1,this.canvas.style.cursor=`auto`,this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null,this.dispatchEvent({type:`selectModeChanged`,enabled:!1}))}handleMouseDown(e){this.mouseDownPosition={x:e.clientX,y:e.clientY,button:e.button}}wasMouseDragged(e){if(!this.mouseDownPosition)return!1;let t=Math.abs(e.clientX-this.mouseDownPosition.x),n=Math.abs(e.clientY-this.mouseDownPosition.y);return Math.sqrt(t*t+n*n)>this.dragThreshold}handleSelectClick(e){if(this.wasMouseDragged(e)){this.mouseDownPosition=null;return}if(this.mouseDownPosition=null,this.clickTimeout){clearTimeout(this.clickTimeout),this.clickTimeout=null;return}this.clickTimeout=setTimeout(()=>{this.clickTimeout=null;let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0),r=this.filterValidIntersects(n),i=this._pickLightHelper(),a=null;if(r.length>0&&i?a=r[0].distance<=i.distance?r[0].object:i.light:r.length>0?a=r[0].object:i&&(a=i.light),a){let e=this.selectedObject;e&&e.uuid===a.uuid?this.dispatchEvent({type:`objectDeselected`,object:a,uuid:a.uuid}):this.dispatchEvent({type:`objectSelected`,object:a,uuid:a.uuid})}else this.dispatchEvent({type:`objectDeselected`})},250)}handleSelectDoubleClick(e){if(this.wasMouseDragged(e)){this.mouseDownPosition=null;return}this.mouseDownPosition=null,this.clickTimeout&&=(clearTimeout(this.clickTimeout),null);let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0),r=this.filterValidIntersects(n);if(r.length>0){let e=r[0].object;this.dispatchEvent({type:`objectDoubleClicked`,object:e,uuid:e.uuid})}}handleMouseUp(){}handleContextPointerDown(e){e.button===2&&(this.contextPointerDownPosition={x:e.clientX,y:e.clientY})}handleContextPointerUp(e){if(e.button!==2)return;if(this.contextPointerDownPosition){let t=Math.abs(e.clientX-this.contextPointerDownPosition.x),n=Math.abs(e.clientY-this.contextPointerDownPosition.y);if(Math.sqrt(t*t+n*n)>this.dragThreshold){this.contextPointerDownPosition=null;return}}else return;this.contextPointerDownPosition=null;let t=this.selectedObject;t&&this.dispatchEvent({type:`contextMenuRequested`,x:e.clientX,y:e.clientY,selectedObject:t})}handleContextMenu(e){e.preventDefault()}getMouseCoordinates(e){let t=this.canvas.getBoundingClientRect();return{x:(e.clientX-t.left)/t.width*2-1,y:-((e.clientY-t.top)/t.height)*2+1}}pickSurface(e,t){return this.raycaster.setFromCamera({x:e,y:t},this.camera),this.filterValidIntersects(this.raycaster.intersectObjects(this.scene.children,!0))[0]??null}filterValidIntersects(e){return e.filter(e=>{let t=e.object;return t!==this.focusPointIndicator&&t!==this.floorPlane&&!t.name.includes(`Helper`)&&t.type===`Mesh`})}_pickLightHelper(){if(!this._helperScene||this._helperScene.children.length===0)return null;let e=this.raycaster.intersectObjects(this._helperScene.children,!0);for(let t of e){let e=t.object;for(;e;){if(e.light)return{distance:t.distance,light:e.light};e=e.parent}}return null}updateDependencies({scene:e,camera:t,floorPlane:n}){e&&(this.scene=e),t&&(this.camera=t),n&&(this.floorPlane=n)}wireAppEvents(e){this.addEventListener(`objectSelected`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_SELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`objectDeselected`,t=>{this.select(null),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_DESELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`selectModeChanged`,t=>{e.dispatchEvent({type:B.SELECT_MODE_CHANGED,enabled:t.enabled})}),this.addEventListener(`objectDoubleClicked`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_DOUBLE_CLICKED,object:t.object,uuid:t.uuid})}),this.addEventListener(`focusChanged`,t=>{e.settings.set(`focusDistance`,t.worldDistance),e.dispatchEvent({type:`focusChanged`,distance:t.distance})}),this.addEventListener(`afPointPlaced`,t=>{e.dispatchEvent({type:B.AF_POINT_PLACED,point:t.point})})}dispose(){this.canvas.removeEventListener(`click`,this.handleAFPointClick),this.canvas.removeEventListener(`click`,this.handleFocusClick),this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.canvas.removeEventListener(`contextmenu`,this.handleContextMenu),this.canvas.removeEventListener(`pointerdown`,this.handleContextPointerDown),this.canvas.removeEventListener(`pointerup`,this.handleContextPointerUp),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null,this.contextPointerDownPosition=null,this.focusPointIndicator&&=(this.scene.remove(this.focusPointIndicator),null),this.canvas.style.cursor=`auto`,this.scene=null,this.camera=null,this.canvas=null,this.assetLoader=null,this.pathTracer=null,this.floorPlane=null,this.raycaster=null}},Lb="var e=class{constructor(e){this._root=e,this._writers=new Map,this._nextId=1}async _dir(e,t){let n=await this._root;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n}async openWriter({path:e,name:t,truncate:n=!0,length:r}){let i=await(await(await this._dir(e,!0)).getFileHandle(t,{create:!0})).createSyncAccessHandle();n?i.truncate(0):r!==void 0&&i.getSize()>r&&i.truncate(r);let a=this._nextId++;return this._writers.set(a,{handle:i,end:i.getSize()}),{id:a}}write({id:e,buffer:t,byteOffset:n=0,byteLength:r,at:i}){let a=this._writers.get(e);if(!a)throw Error(`storage: writer ${e} is not open`);let o=new Uint8Array(t,n,r??t.byteLength-n),s=i??a.end,c=0;for(;c<o.length;){let e=a.handle.write(o.subarray(c),{at:s+c});if(e<=0)throw Error(`storage: write made no progress`);c+=e}return a.end=Math.max(a.end,s+o.length),{bytes:o.length}}closeWriter({id:e,abort:t=!1}){let n=this._writers.get(e);if(!n)return{size:0};this._writers.delete(e);try{return t||n.handle.flush(),{size:n.handle.getSize()}}finally{n.handle.close()}}async writeFile({path:e,name:t,buffer:n,byteOffset:r=0,byteLength:i}){let{id:a}=await this.openWriter({path:e,name:t});try{return this.write({id:a,buffer:n,byteOffset:r,byteLength:i}),this.closeWriter({id:a})}catch(e){throw this.closeWriter({id:a,abort:!0}),e}}async readRange({path:e,name:t,offset:n=0,length:r}){let i=await(await this._dir(e,!1)).getFileHandle(t),a=null;try{a=await i.createSyncAccessHandle()}catch(e){if(e.name!==`NoModificationAllowedError`)throw e}if(!a){let e=await i.getFile(),t=r===void 0?e.size:n+r;return{buffer:await e.slice(n,t).arrayBuffer()}}try{let e=a.getSize(),t=Math.max(0,Math.min(r??e-n,e-n)),i=new ArrayBuffer(t);return a.read(i,{at:n}),{buffer:i}}finally{a.close()}}dispose(){for(let e of[...this._writers.keys()])this.closeWriter({id:e,abort:!0})}};let t=null;async function n(e,t){return t||(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})}self.onmessage=async({data:r})=>{let{id:i,op:a,args:o}=r;try{if(a===`init`){t=new e(n(o.namespace,o.root)),postMessage({id:i,result:{}});return}let r=await t[a](o),s=r?.buffer instanceof ArrayBuffer?[r.buffer]:[];postMessage({id:i,result:r},s)}catch(e){postMessage({id:i,error:{name:e.name,message:e.message}})}};",Rb=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Lb],{type:`text/javascript;charset=utf-8`});function zb(e){let t;try{if(t=Rb&&(self.URL||self.webkitURL).createObjectURL(Rb),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Lb),{type:`module`,name:e?.name})}}function Bb({name:e,message:t}){let n=Error(t);return n.name=e,n}var Vb=class{constructor({namespace:e,root:t=null}){this._worker=new zb,this._pending=new Map,this._nextId=0,this._worker.onmessage=({data:e})=>{let t=this._pending.get(e.id);t&&(this._pending.delete(e.id),e.error?t.reject(Bb(e.error)):t.resolve(e.result))},this._ready=this.call(`init`,{namespace:e,root:t})}call(e,t,n=[]){return this._worker?new Promise((r,i)=>{let a=this._nextId++;this._pending.set(a,{resolve:r,reject:i}),this._worker.postMessage({id:a,op:e,args:t},n)}):Promise.reject(Error(`storage: transport disposed`))}dispose(){this._worker?.terminate(),this._worker=null;for(let{reject:e}of this._pending.values())e(Error(`storage: transport disposed`));this._pending.clear()}};function Hb(){return typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope}async function Ub(e){let t=typeof navigator<`u`?navigator.storage:null;if(!t?.getDirectory)return{root:null,reason:`this browser has no origin private file system`};try{return{root:await(await t.getDirectory()).getDirectoryHandle(e,{create:!0})}}catch(e){return{root:null,reason:`${e.name}: ${e.message}`}}}async function Wb({namespace:e,root:t=null,transport:n=`auto`}={}){let r=t?{root:t}:await Ub(e);if(!r.root)return{storage:null,reason:r.reason};if(n===`inline`||n===`auto`&&(Hb()||typeof Worker>`u`))return{storage:mr({namespace:e,root:r.root})};let i=new Vb({namespace:e,root:t}),a=new pr({root:r.root,transport:i,namespace:e});return a.sweep().catch(()=>{}),{storage:a}}async function Gb(e){let t=Nu.get(e);t||(t={refs:0,opened:Wb({namespace:e})},Nu.set(e,t)),t.refs++;let{storage:n,reason:r}=await t.opened;t.storage=n;let i=!1,a=()=>{i||(i=!0,t.refs--,!(t.refs>0)&&(Nu.get(e)===t&&Nu.delete(e),n?.dispose()))};return n?{storage:n,release:a}:(a(),{storage:null,reason:r,release:()=>{}})}Ce();var Kb={maxBounces:{uniform:`maxBounces`,reset:!0},transmissiveBounces:{uniform:`transmissiveBounces`,reset:!0},maxSubsurfaceSteps:{uniform:`maxSubsurfaceSteps`,reset:!0},maxTransparentBounces:{uniform:`maxTransparentBounces`,reset:!0},environmentIntensity:{uniform:`environmentIntensity`,reset:!0},backgroundIntensity:{uniform:`backgroundIntensity`,reset:!0},backgroundBlurriness:{uniform:`backgroundBlurriness`,reset:!0},backgroundBlurSamples:{uniform:`backgroundBlurSamples`,reset:!0},showBackground:{uniform:`showBackground`,reset:!0},enableEnvironment:{uniform:`enableEnvironment`,reset:!0},groundProjectionEnabled:{uniform:`groundProjectionEnabled`,reset:!0},groundProjectionRadius:{uniform:`groundProjectionRadius`,reset:!0},groundProjectionHeight:{uniform:`groundProjectionHeight`,reset:!0},groundProjectionLevel:{uniform:`groundProjectionLevel`,reset:!0},enableGroundCatcher:{uniform:`enableGroundCatcher`,reset:!0},groundCatcherHeight:{uniform:`groundCatcherHeight`,reset:!0},globalIlluminationIntensity:{uniform:`globalIlluminationIntensity`,reset:!0},panoramaLevelHorizon:{uniform:`panoLevelHorizon`,reset:!0},enableDOF:{uniform:`enableDOF`,reset:!0},focusDistance:{uniform:`focusDistance`,reset:!1},focalLength:{uniform:`focalLength`,reset:!0},aperture:{uniform:`aperture`,reset:!0},apertureScale:{uniform:`apertureScale`,reset:!0},anamorphicRatio:{uniform:`anamorphicRatio`,reset:!0},unitsPerMetre:{uniform:`unitsPerMetre`,reset:!0},dofMode:{handler:`handleDofMode`,reset:!0},dofBlur:{uniform:`dofBlur`,reset:!0},samplingTechnique:{uniform:`samplingTechnique`,reset:!0},fireflyThreshold:{uniform:`fireflyThreshold`,reset:!0},shadowTerminatorOffset:{uniform:`shadowTerminatorOffset`,reset:!0},enableAlphaShadows:{uniform:`enableAlphaShadows`,reset:!0},useAdaptiveSampling:{uniform:`useAdaptiveSampling`,reset:!0},noiseThreshold:{uniform:`noiseThreshold`,reset:!0},adaptiveMinSamples:{uniform:`adaptiveMinSamples`,reset:!0},adaptiveStopFraction:{uniform:`adaptiveStopFraction`,reset:!0},usePixelFreeze:{uniform:`usePixelFreeze`,reset:!0},pixelFreezeThreshold:{uniform:`pixelFreezeThreshold`,reset:!0},pixelFreezeStability:{uniform:`pixelFreezeStability`,reset:!0},convergenceOverlay:{handler:`handleConvergenceOverlay`,reset:!1},enableEmissiveTriangleSampling:{uniform:`enableEmissiveTriangleSampling`,reset:!0},emissiveBoost:{uniform:`emissiveBoost`,reset:!0},visMode:{uniform:`visMode`,reset:!0},debugVisScale:{uniform:`debugVisScale`,reset:!0},cameraProjection:{handler:`handleCameraProjection`,reset:!0},panoramaLonRange:{handler:`handlePanoramaLonRange`,reset:!0},panoramaLatRange:{handler:`handlePanoramaLatRange`,reset:!0},interactionModeEnabled:{handler:`handleInteractionModeEnabled`,reset:!1},interactionRenderScale:{handler:`handleInteractionRenderScale`,reset:!1},maxSamples:{handler:`handleMaxSamples`,reset:!1},transparentBackground:{handler:`handleTransparentBackground`},backgroundColor:{handler:`handleBackgroundColor`,reset:!0},exposure:{handler:`handleExposure`},saturation:{handler:`handleSaturation`},renderLimitMode:{handler:`handleRenderLimitMode`},renderTimeLimit:{handler:`handleRenderTimeLimit`,reset:!1},renderMode:{handler:`handleRenderMode`},environmentRotation:{handler:`handleEnvironmentRotation`}},qb=Object.freeze({DEFAULT:`default`,HOST:`host`,SCENE_METADATA:`scene-metadata`,MODE_PRESET:`mode-preset`}),Jb={bounces:`maxBounces`,debugMode:`visMode`},Yb=class extends r.EventDispatcher{constructor(e=U,{issues:t=null}={}){super(),this._issues=t,this._values=new Map,this._sources=new Map,this._pathTracer=null,this._resetCallback=null,this._handlers={},this._delegates={},this._initDefaults(e)}bind(e){this._pathTracer=e.stages.pathTracer,this._resetCallback=e.resetCallback,this._delegates={},this._handlers=this._buildHandlers(e)}_buildHandlers({stages:e,renderer:t,resetCallback:n,reconcileCompletion:i,denoisingManager:a,onInteractionRenderScale:o,onCameraProjection:s}){let c=new r.Vector2,l=(t,n)=>{c.set(n?.[0]??0,n?.[1]??0).multiplyScalar(r.MathUtils.DEG2RAD),e.pathTracer?.setUniform(t,c)};return{handleCameraProjection:t=>{e.pathTracer?.setUniform(`cameraProjection`,Ke[t]??Ke.perspective),s?.(t),t===`equirectangular`&&a?.requiresMotionVectors&&a.setDenoiserStrategy(`edgeaware`)},handleDofMode:t=>e.pathTracer?.setUniform(`dofMode`,+(t===`look`)),handlePanoramaLonRange:e=>l(`panoLonRange`,e),handlePanoramaLatRange:e=>l(`panoLatRange`,e),handleTransparentBackground:t=>{e.pathTracer?.setUniform(`transparentBackground`,t),e.compositor?.setTransparentBackground(t)},handleBackgroundColor:t=>{let n=t?.isColor?t:new r.Color(t);e.pathTracer?.setUniform(`backgroundColor`,n)},handleExposure:n=>{!e.autoExposure?.enabled&&t&&(t.toneMappingExposure=n)},handleSaturation:t=>{e.compositor?.setSaturation(t)},handleConvergenceOverlay:t=>{e.pathTracer?.setUniform(`convergenceOverlay`,t),e.compositor?.setConvergenceOverlay(t),t&&!this.get(`useAdaptiveSampling`)&&n?.()},handleRenderLimitMode:t=>{e.pathTracer?.setRenderLimitMode?.(t),i?.()},handleMaxSamples:t=>{e.pathTracer?.setUniform(`maxSamples`,t),e.pathTracer?.updateCompletionThreshold(),i?.()},handleRenderTimeLimit:()=>{i?.()},handleRenderMode:t=>{e.pathTracer?.setUniform(`renderMode`,parseInt(t))},handleEnvironmentRotation:t=>{e.pathTracer?.environment.setEnvironmentRotation(t)},handleInteractionModeEnabled:t=>{e.pathTracer?.setInteractionModeEnabled(t)},handleInteractionRenderScale:e=>{o?.(e)}}}set(e,t,{reset:n,silent:r,source:i=qb.HOST}={}){let a=this._applyOne(e,t,i);a?.route&&((n===void 0?a.route.reset??!0:n)&&this._resetCallback?.(),r||this.dispatchEvent({type:B.SETTING_CHANGED,key:e,value:t,prev:a.prev}))}setMany(e,{silent:t,reset:n,source:r=qb.HOST}={}){let i=!1;for(let[n,a]of Object.entries(e)){let e=this._applyOne(n,a,r);e?.route&&((e.route.reset??!0)&&(i=!0),t||this.dispatchEvent({type:B.SETTING_CHANGED,key:n,value:a,prev:e.prev}))}(n===void 0?i:n)&&this._resetCallback?.()}_applyOne(e,t,n){let r=this._values.get(e);if(r===t)return null;this._values.set(e,t),this._sources.set(e,n);let i=Kb[e];return i?(this._applyRoute(i,t,r),{route:i,prev:r}):(this._reportUnknownKey(e),{route:null,prev:r})}_reportUnknownKey(e){this._issues?.record(Y.SETTING_UNKNOWN_KEY,`unknown setting "${e}" — stored but never applied to any stage`,{key:e})}get(e){return this._values.get(e)}getEffective(){let e={};for(let[t,n]of this._values)e[t]={value:n,source:this._sources.get(t)??qb.DEFAULT,routed:Kb[t]!==void 0};return e}getAll(){return Object.fromEntries(this._values)}serialize(){let e={};for(let[t,n]of this._values){if(this._sources.get(t)!==qb.HOST||!Kb[t])continue;let r=Kr(n);r!==void 0&&(e[t]=r)}return e}restore(e){let t={},n=[];for(let[r,i]of Object.entries(e??{}))Kb[r]?t[r]=qr(i):n.push(r);return this.setMany(t),n}applyAll(){for(let[e,t]of this._values){let n=Kb[e];n&&this._applyRoute(n,t,void 0)}}_applyRoute(e,t,n){e.uniform?(this._pathTracer?.setUniform(e.uniform,t),e.after&&this._pathTracer?.[e.after]?.()):e.handler?this._handlers[e.handler]?.(t,n):e.delegate&&this._delegates[e.delegate]?.updateParam?.(e.param,t)}_initDefaults(e){for(let t of Object.keys(Kb))t in e&&(this._values.set(t,e[t]),this._sources.set(t,qb.DEFAULT));for(let[t,n]of Object.entries(Jb))t in e&&(this._values.set(n,e[t]),this._sources.set(n,qb.DEFAULT))}},Xb=512,Zb=4<<20,Qb=15e8,$b=new TextDecoder;function ex(e){return e.length>=2&&e[0]===31&&e[1]===139}function tx(e){return e.length>=4&&e[0]===80&&e[1]===75&&(e[2]===3||e[2]===5||e[2]===7)}function nx(e){return e.length>=263&&String.fromCharCode(...e.subarray(257,262))===`ustar`}function rx(e){return ex(e)?`gzip`:tx(e)?`zip`:nx(e)?`tar`:null}function ix(e,t,n){let r=t,i=t+n;for(;r<i&&e[r]!==0;)r++;return $b.decode(e.subarray(t,r))}function ax(e,t,n){if(e[t]&128){let r=e[t]&127;for(let i=t+1;i<t+n;i++)r=r*256+e[i];return r}let r=ix(e,t,n).trim();if(!r)return 0;let i=parseInt(r,8);return Number.isFinite(i)?i:0}function ox(e){let t=[];for(let n of e.replace(/\\/g,`/`).split(`/`))n===``||n===`.`||(n===`..`?t.pop():t.push(n));return t.join(`/`)}function sx(e){let t=$b.decode(e).match(/^\d+ path=(.*)$/m);return t?t[1]:null}var cx=e=>e+(Xb-e%Xb)%Xb,lx=e=>e===`L`||e===`x`||e===`X`;function ux(e){let t=ix(e,345,155),n=ix(e,0,100);return{type:String.fromCharCode(e[156]||48),size:ax(e,124,12),name:t?`${t}/${n}`:n}}function dx(e,t){return e===`5`||e===`g`||e===`K`||t.endsWith(`/`)||e!==`0`&&e!==` `?null:ox(t)||null}function fx(e){for(let t=0;t<Xb;t++)if(e[t]!==0)return!1;return!0}var px=class{constructor({filter:e=null,retain:t=null,byteBudget:n=Qb,onEntry:r=null}={}){this.filter=e,this.retain=t,this.byteBudget=n,this.onEntry=r,this.entries=Object.create(null),this.listing=[],this.retainedBytes=0,this.truncated=!1,this.finished=!1,this._header=new Uint8Array(Xb),this._headerLen=0,this._state=`header`,this._remaining=0,this._size=0,this._copied=0,this._dst=null,this._special=null,this._pendingName=null,this._abs=0}push(e){let t=this._abs;this._abs+=e.length;let n=0;for(;n<e.length&&!this.finished;)if(this._state===`header`){let r=Math.min(Xb-this._headerLen,e.length-n);this._header.set(e.subarray(n,n+r),this._headerLen),this._headerLen+=r,n+=r,this._headerLen===Xb&&(this._headerLen=0,this._bodyStart=t+n,this._readHeader())}else{let t=Math.min(this._remaining,e.length-n);if(this._dst&&this._copied<this._size){let r=Math.min(t,this._size-this._copied);this._dst.set(e.subarray(n,n+r),this._copied),this._copied+=r}this._remaining-=t,n+=t,this._remaining===0&&this._endBody()}}end(){this.finished=!0}result(){return{entries:this.entries,listing:this.listing,retainedBytes:this.retainedBytes,truncated:this.truncated}}_readHeader(){let e=this._header,t=!0;for(let n=0;n<Xb;n++)if(e[n]!==0){t=!1;break}if(t){this.finished=!0;return}let{type:n,size:r,name:i}=ux(e),a=this._pendingName??i;if(this._pendingName=null,this._size=r,this._copied=0,this._remaining=cx(r),this._dst=null,this._special=null,this._indexed=!1,this._state=this._remaining>0?`body`:`header`,lx(n)){this._special=n===`L`?`longname`:`pax`,this._dst=new Uint8Array(r);return}let o=dx(n,a);o&&(this.listing.push({path:o,size:r}),this._indexed=this.filter?this.filter(o,r):!0,this._indexed&&!(this.retain&&!this.retain(o,r))&&(this.retainedBytes+r>this.byteBudget?this.truncated=!0:(this._dst=new Uint8Array(r),this.retainedBytes+=r)),this._remaining===0&&this._endBody())}_endBody(){if(this._state=`header`,this._special===`longname`){this._pendingName=ix(this._dst,0,this._dst.length),this._dst=null;return}if(this._special===`pax`){let e=sx(this._dst);e&&(this._pendingName=e),this._dst=null;return}let e=this.listing[this.listing.length-1];this._indexed&&e&&(e.offset=this._bodyStart,this._indexed=!1),this._dst&&=(this.entries[e.path]=this._dst,this.onEntry?.(e.path,this._dst),null)}};async function mx(e,t){if(typeof DecompressionStream<`u`&&typeof e?.stream==`function`){let n=e.stream().pipeThrough(new DecompressionStream(`gzip`)).getReader();for(;;){let{done:e,value:r}=await n.read();if(e)break;t(r)}return}let n=null,r=new m.Gunzip((e,r)=>{e instanceof Error?n=e:e&&e.length&&t(e)});await hx(e,(e,t)=>{if(r.push(e,t),n)throw n})}async function hx(e,t){if(e instanceof Uint8Array){for(let n=0;n<e.length;n+=Zb){let r=Math.min(n+Zb,e.length);t(e.subarray(n,r),r===e.length)}e.length===0&&t(e,!0);return}let n=e.size;for(let r=0;r<n;r+=Zb){let i=Math.min(r+Zb,n);t(new Uint8Array(await e.slice(r,i).arrayBuffer()),i===n)}n===0&&t(new Uint8Array,!0)}async function gx(e,t={}){let{onProgress:n,...r}=t,i=new px(r),a=0,o=0;return await mx(e,e=>{i.push(e),a+=e.length,n&&a>=o&&(o=a+(64<<20),n({entries:i.listing.length,bytes:a}))}),i.end(),i.result()}var _x=1<<20;async function vx(e,{onProgress:t=null}={}){let n=e.size,r=[],i=null,a=0,o=null,s=0,c=0,l=async(t,r)=>{if(i&&t>=a&&t+r<=a+i.length)return i.subarray(t-a,t-a+r);let o=Math.min(n,t+Math.max(r,_x));return i=new Uint8Array(await e.slice(t,o).arrayBuffer()),a=t,i.subarray(0,r)};for(;s+Xb<=n;){let e=await l(s,Xb);if(fx(e))break;let{type:n,size:i,name:a}=ux(e),u=o??a;o=null;let d=s+Xb;if(lx(n)){let e=await l(d,i);o=n===`L`?ix(e,0,e.length):sx(e)}else{let e=dx(n,u);e&&r.push({path:e,size:i,offset:d})}s=d+cx(i),t&&s>=c&&(c=s+(256<<20),t({entries:r.length,bytes:s}))}return r}function yx(){let e=new px({retain:()=>!1});return{push:t=>e.push(t),finish:()=>(e.end(),e.listing.filter(e=>e.offset!==void 0))}}async function bx(e,t={}){let{index:n=null,headersOnly:r=!1,onProgress:i=null,...a}=t,o,s,c,l,u=null;if(n||r){u=n?.listing??await vx(e,{onProgress:i});let{filter:t}=a;s=u.map(e=>!t||t(e.path,e.size)?{...e}:{path:e.path,size:e.size}),o=Object.create(null),c=0,l=!1}else{let t=new px({...a});await hx(e,e=>t.push(e)),t.end(),{entries:o,listing:s,retainedBytes:c,truncated:l}=t.result()}let d=new Map;for(let e of s)e.offset!==void 0&&d.set(e.path,e);return{entries:o,listing:s,read:async t=>{if(o[t])return o[t];let n=d.get(t);return n?new Uint8Array(await e.slice(n.offset,n.offset+n.size).arrayBuffer()):null},readHead:async(t,n)=>{if(o[t])return o[t].subarray(0,n);let r=d.get(t);return r?new Uint8Array(await e.slice(r.offset,r.offset+Math.min(r.size,n)).arrayBuffer()):null},retainedBytes:c,truncated:l,indexed:d.size,index:u?{v:1,listing:u}:null}}function xx(e){let t=(Array.isArray(e)?e:[e]).filter(Boolean).map(e=>{let t=ox(e);return{p:t,inside:t+`/`}});return t.length===0?()=>!0:e=>{let n=e.lastIndexOf(`/`),r=n<0?``:e.slice(0,n);if(r===``)return!0;let i=r.lastIndexOf(`/textures`),a=i>=0&&i===r.length-9?r.slice(0,i)+`/`:null;for(let{p:n,inside:i}of t)if(e===n||e.startsWith(i)||i.startsWith(r+`/`)||a!==null&&i.startsWith(a))return!0;return!1}}function Sx(e){let t=e.filter(e=>e.path.toLowerCase().endsWith(`.pbrt`)).sort((e,t)=>e.path.split(`/`).length-t.path.split(`/`).length||e.path.length-t.path.length||(e.path<t.path?-1:1));if(!t.length)return{root:null,elements:[]};let n=t[0].path,r=n.lastIndexOf(`/`),i=r<0?``:n.slice(0,r),a=i?i+`/`:``,o=new Map;for(let t of e){if(!t.path.startsWith(a))continue;let e=t.path.slice(a.length),n=e.indexOf(`/`);if(n<0)continue;let r=e.slice(0,n),i=o.get(r);i||o.set(r,i={name:r,prefix:a+r,files:0,bytes:0,scenes:0}),i.files++,i.bytes+=t.size,t.path.toLowerCase().endsWith(`.pbrt`)&&i.scenes++}return{root:i,elements:[...o.values()].filter(e=>e.scenes>0).sort((e,t)=>e.bytes-t.bytes)}}var Cx=101010256,wx=117853008,Tx=101075792,Ex=33639248,Dx=67324752,Ox=65557,kx=new TextDecoder;async function Ax(e,t,n){return new Uint8Array(await e.slice(t,n).arrayBuffer())}function jx(e,t){return e.getUint32(t+4,!0)*4294967296+e.getUint32(t,!0)}function Mx(e){let t=``;for(let n=0;n<e.length;n+=8192)t+=String.fromCharCode(...e.subarray(n,n+8192));return t}async function Nx(e){let t=e.size,n=await Ax(e,Math.max(0,t-Ox-20),t),r=new DataView(n.buffer),i=-1;for(let e=n.length-22;e>=0;e--)if(r.getUint32(e,!0)===Cx){i=e;break}if(i<0)throw Error(`zip: end of central directory not found`);let a=r.getUint16(i+10,!0),o=r.getUint32(i+12,!0),s=r.getUint32(i+16,!0);if(a===65535||o===4294967295||s===4294967295){let t=i-20;if(t<0||r.getUint32(t,!0)!==wx)throw Error(`zip: ZIP64 locator missing`);let n=jx(r,t+8),c=new DataView((await Ax(e,n,n+56)).buffer);if(c.getUint32(0,!0)!==Tx)throw Error(`zip: ZIP64 end record missing`);a=jx(c,32),o=jx(c,40),s=jx(c,48)}let c=await Ax(e,s,s+o),l=new DataView(c.buffer),u=[],d=0;for(let e=0;e<a&&d+46<=c.length;e++){if(l.getUint32(d,!0)!==Ex)throw Error(`zip: corrupt central directory`);let e=l.getUint16(d+8,!0),t=l.getUint16(d+10,!0),n=l.getUint32(d+20,!0),r=l.getUint32(d+24,!0),i=l.getUint16(d+28,!0),a=l.getUint16(d+30,!0),o=l.getUint16(d+32,!0),s=l.getUint32(d+42,!0),f=c.subarray(d+46,d+46+i),p=e&2048?kx.decode(f):Mx(f);for(let e=d+46+i,t=e+a;e+4<=t;){let t=l.getUint16(e,!0),i=l.getUint16(e+2,!0);if(t===1){let t=e+4;r===4294967295&&(r=jx(l,t),t+=8),n===4294967295&&(n=jx(l,t),t+=8),s===4294967295&&(s=jx(l,t))}e+=4+i}p.endsWith(`/`)||u.push({name:p,size:r,compSize:n,method:t,local:s,encrypted:(e&1)!=0}),d+=46+i+a+o}return u}async function Px(e,t){if(t.encrypted)throw Error(`zip: "${t.name}" is encrypted`);let n=new DataView((await Ax(e,t.local,t.local+30)).buffer);if(n.getUint32(0,!0)!==Dx)throw Error(`zip: bad local header for "${t.name}"`);return t.local+30+n.getUint16(26,!0)+n.getUint16(28,!0)}async function Fx(e,t){let n=await Px(e,t),r=await Ax(e,n,n+t.compSize);if(t.method===0)return r;if(t.method===8)return t.size===0?new Uint8Array:(0,m.inflateSync)(r,{out:new Uint8Array(t.size)});throw Error(`zip: "${t.name}" uses compression method ${t.method}, which is not supported`)}async function Ix(e,{filter:t=null}={}){let n=await Nx(e),r=new Map,i=n.map(e=>t&&!t(e.name,e.size)?{path:e.name,size:e.size}:(r.set(e.name,e),{path:e.name,size:e.size,offset:e.local})),a=async t=>{let n=r.get(t);return n?Fx(e,n):null},o=async t=>{let n=r.get(t);if(!n)return null;if(n.method!==0)return new Blob([await Fx(e,n)]);let i=await Px(e,n);return e.slice(i,i+n.compSize)};return{entries:Object.create(null),listing:i,read:a,readHead:async(e,t)=>{let n=await o(e);return n?new Uint8Array(await n.slice(0,t).arrayBuffer()):null},slice:o,retainedBytes:0,truncated:!1,indexed:r.size}}var Lx=1,Rx=3;async function zx(e,t){return`${e}:${Gn(await Wn(t))}`}async function Bx(e,{storage:t,label:n=e.name,onProgress:r=null}){if(!t||typeof DecompressionStream>`u`)return null;let i=t.area(Zn.ARCHIVES),a=await zx(`gunzip`,e),o=await i.open(a),s=!!o;if(!o){let s=await i.create(a,{label:n,expectedBytes:e.size*Rx});if(!s)return null;let c=yx(),l=new TransformStream({transform(e,t){c.push(e),t.enqueue(e)}});try{let t=e.stream().pipeThrough(new DecompressionStream(`gzip`)).pipeThrough(l),n=await s.writeStream(`data.tar`,t,{onProgress:r});await s.writeJSON(`index.json`,{v:Lx,listing:c.finish()}),await s.commit({compressedBytes:e.size,tarBytes:n})}catch(e){if(await s.abort(),e?.name!==`QuotaExceededError`)throw e;return t._issue(Y.STORAGE_QUOTA_EXCEEDED,`ran out of room unpacking ${n}; reading it in memory instead`,{area:Zn.ARCHIVES}),null}if(o=await i.open(a,{wait:!0}),!o)return null}let c=await o.file(`data.tar`),l=await o.json(`index.json`);return!c||l?.v!==Lx?(o.release(),null):{file:c,index:l,release:()=>o.release(),cached:s}}async function Vx(e,t){if(!t)return null;let n=await t.area(Zn.ARCHIVES).open(await zx(`tarindex`,e));if(!n)return null;try{let e=await n.json(`index.json`);return e?.v===Lx?e:null}finally{n.release()}}async function Hx(e,t,n){if(!t||!n)return!1;let r=await t.area(Zn.ARCHIVES).create(await zx(`tarindex`,e),{label:`${e.name} (index)`});if(!r)return!1;try{return await r.writeJSON(`index.json`,n),await r.commit(),!0}catch{return await r.abort(),!1}}var Ux=`__rayzeeArchivePath`,Wx=`__rayzeeArchiveLoader`,Gx=64,Kx=32<<20,qx=64<<20,Jx={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Uint8ClampedArray},Yx=[`name`,`mapping`,`channel`,`wrapS`,`wrapT`,`magFilter`,`minFilter`,`anisotropy`,`format`,`type`,`flipY`,`generateMipmaps`,`premultiplyAlpha`,`unpackAlignment`,`colorSpace`],Xx=[`name`,`visible`,`castShadow`,`receiveShadow`,`frustumCulled`,`renderOrder`,`matrixAutoUpdate`],Zx=class extends Error{constructor(e){super(e),this.name=`SceneGraphUnsupported`}};function Qx(e){return e.isInstancedMesh?`InstancedMesh`:e.isSkinnedMesh||e.isBatchedMesh?null:e.isMesh?`Mesh`:e.isPerspectiveCamera?`PerspectiveCamera`:e.isOrthographicCamera?`OrthographicCamera`:e.isLight||e.isPoints||e.isLine||e.isSprite||e.isLOD?null:e.isGroup?`Group`:e.constructor===r.Object3D?`Object3D`:null}function $x(e,t){try{let t=JSON.parse(JSON.stringify(e??{}));return delete t[Ux],delete t[Wx],t}catch{throw new Zx(`${t}: userData is not plain JSON`)}}var eS=class{constructor(){this.sections=[],this.length=0}add(e){let t=Math.ceil(this.length/Gx)*Gx;return this.sections.push({offset:t,array:e}),this.length=t+e.byteLength,{offset:t,byteLength:e.byteLength,type:e.constructor.name,length:e.length}}};function tS(e,t,n){if(e.isInterleavedBufferAttribute||!ArrayBuffer.isView(e.array))throw new Zx(`${n}: interleaved or non-typed attribute`);return{section:t.add(e.array),itemSize:e.itemSize,normalized:e.normalized===!0,name:e.name??``}}function nS(e,t){let n=`geometry ${e.name||e.uuid}`;if(Object.keys(e.morphAttributes??{}).length)throw new Zx(`${n}: morph targets`);let r={};for(let[i,a]of Object.entries(e.attributes))r[i]=tS(a,t,n);return{uuid:e.uuid,name:e.name,attributes:r,index:e.index?tS(e.index,t,n):null,groups:e.groups.map(e=>({...e})),drawRange:{...e.drawRange},userData:$x(e.userData,n)}}function rS(e,t){let n={uuid:e.uuid,userData:$x(e.userData,`texture ${e.uuid}`)};for(let t of Yx)n[t]=e[t];for(let t of[`repeat`,`offset`,`center`])n[t]=e[t].toArray();n.rotation=e.rotation;let r=e.userData?.[Ux];if(r)n.path=r,n.loader=e.userData.__rayzeeArchiveLoader??`image`;else if(e.isDataTexture&&ArrayBuffer.isView(e.image?.data))n.data={section:t.add(e.image.data),width:e.image.width,height:e.image.height};else throw new Zx(`texture ${e.name||e.uuid}: no archive path and no pixel data to keep`);return n}function iS(e,t){let n=e.toJSON(t);n.exactColors={};for(let[t,r]of Object.entries(e))r?.isColor&&(n.exactColors[t]=[r.r,r.g,r.b]);return e.ior!==void 0&&(n.exactIor=e.ior),n}function aS(e,t){for(let n of Object.values(e))n?.isTexture&&t.set(n.uuid,n)}function oS(e,{environment:t=null,animations:n=[],stats:i={}}={}){let a=new eS,o=[],s=new Map,c=new Map,l=new Map,u=(e,t)=>{let n=Qx(e);if(!n)throw new Zx(`${e.type} "${e.name}" cannot be cached`);let r={type:n,uuid:e.uuid,parent:t,userData:$x(e.userData,`${n} "${e.name}"`)};for(let t of Xx)r[t]=e[t];if(r.position=e.position.toArray(),r.quaternion=e.quaternion.toArray(),r.scale=e.scale.toArray(),r.layers=e.layers.mask,e.matrixAutoUpdate||(r.matrix=e.matrix.toArray()),e.isMesh){s.set(e.geometry.uuid,e.geometry);let t=Array.isArray(e.material)?e.material:[e.material];for(let e of t)c.set(e.uuid,e),aS(e,l);r.geometry=e.geometry.uuid,r.material=Array.isArray(e.material)?t.map(e=>e.uuid):e.material.uuid}if(e.isInstancedMesh&&(r.count=e.count,r.instanceMatrix=a.add(e.instanceMatrix.array),r.instanceColor=e.instanceColor?a.add(e.instanceColor.array):null),e.isCamera)for(let t of[`fov`,`aspect`,`near`,`far`,`zoom`,`focus`,`filmGauge`,`filmOffset`,`left`,`right`,`top`,`bottom`])e[t]!==void 0&&(r[t]=e[t]);let i=o.push(r)-1;for(let t of e.children)u(t,i)};u(e,-1),t&&l.set(t.uuid,t);let d={textures:{},images:{}};for(let e of l.keys())d.textures[e]={uuid:e};return{manifest:{v:2,nodes:o,geometries:[...s.values()].map(e=>nS(e,a)),textures:[...l.values()].map(e=>rS(e,a)),materials:[...c.values()].map(e=>iS(e,d)),animations:n.map(e=>r.AnimationClip.toJSON(e)),environment:t?t.uuid:null,stats:i},sections:a.sections,byteLength:a.length}}async function sS(e,{manifest:t,sections:n},{release:r=!1}={}){for(let t of n){let{offset:n,array:i}=t,a=new Uint8Array(i.buffer,i.byteOffset,i.byteLength);for(let t=0;t<a.length;t+=Kx)await e.write(`data.bin`,a.subarray(t,Math.min(a.length,t+Kx)),{at:n+t});r&&(t.array=null)}n.length===0&&await e.write(`data.bin`,new Uint8Array),await e.writeJSON(`graph.json`,t)}function cS(e){let t=Jx[e];if(!t)throw Error(`scene graph: unknown array type ${e}`);return t}async function lS(e,t){let n=new Map,r=[...t].sort((e,t)=>e.offset-t.offset),i=null,a=0;for(let t of r){let{offset:r,byteLength:o,type:s}=t,c=cS(s),l=r+o;if(o>qx){n.set(r,new c(await e.slice(r,l).arrayBuffer()));continue}(!i||r<a||l>a+i.byteLength)&&(a=r,i=await e.slice(r,Math.min(e.size,r+qx)).arrayBuffer()),n.set(r,new c(i.slice(r-a,l-a)))}return n}function uS(e){let t=[];for(let n of e.nodes)n.instanceMatrix&&t.push(n.instanceMatrix),n.instanceColor&&t.push(n.instanceColor);for(let n of e.geometries){for(let e of Object.values(n.attributes))t.push(e.section);n.index&&t.push(n.index.section)}for(let n of e.textures)n.data&&t.push(n.data.section);return t}function dS(e,t){let n=new r.BufferAttribute(e.get(t.section.offset),t.itemSize,t.normalized);return n.name=t.name,n}function fS(e,t){for(let n of Yx)t[n]!==void 0&&(e[n]=t[n]);e.repeat.fromArray(t.repeat),e.offset.fromArray(t.offset),e.center.fromArray(t.center),e.rotation=t.rotation,e.uuid=t.uuid,Object.assign(e.userData,t.userData),e.needsUpdate=!0}async function pS(e,t,{loadTexture:n}){if(e?.v!==2)throw Error(`scene graph: unknown format`);let i=await lS(t,uS(e)),a=e=>i.get(e.offset),o={};for(let t of e.textures){let e;if(t.path){if(e=await n(t.path,t.loader),!e)throw Error(`scene graph: "${t.path}" is missing from the archive`);e.userData[Ux]=t.path,e.userData[Wx]=t.loader}else e=new r.DataTexture(a(t.data.section),t.data.width,t.data.height);fS(e,t),o[t.uuid]=e}let s=new r.MaterialLoader().setTextures(o),c={};for(let t of e.materials){let e=s.parse(t);for(let[n,r]of Object.entries(t.exactColors??{}))e[n]?.setRGB(r[0],r[1],r[2]);t.exactIor!==void 0&&(e.ior=t.exactIor),c[t.uuid]=e}let l={};for(let t of e.geometries){let e=new r.BufferGeometry;e.uuid=t.uuid,e.name=t.name;for(let[n,r]of Object.entries(t.attributes))e.setAttribute(n,dS(i,r));t.index&&e.setIndex(dS(i,t.index));for(let n of t.groups)e.addGroup(n.start,n.count,n.materialIndex);e.setDrawRange(t.drawRange.start,t.drawRange.count),e.userData=t.userData,l[t.uuid]=e}let u=[];for(let t of e.nodes){let e=Array.isArray(t.material)?t.material.map(e=>c[e]):c[t.material],n;switch(t.type){case`InstancedMesh`:n=new r.InstancedMesh(l[t.geometry],e,1),n.instanceMatrix=new r.InstancedBufferAttribute(a(t.instanceMatrix),16),n.count=t.count,t.instanceColor&&(n.instanceColor=new r.InstancedBufferAttribute(a(t.instanceColor),3));break;case`Mesh`:n=new r.Mesh(l[t.geometry],e);break;case`PerspectiveCamera`:n=new r.PerspectiveCamera;break;case`OrthographicCamera`:n=new r.OrthographicCamera;break;case`Group`:n=new r.Group;break;default:n=new r.Object3D}n.uuid=t.uuid;for(let e of Xx)n[e]=t[e];if(n.position.fromArray(t.position),n.quaternion.fromArray(t.quaternion),n.scale.fromArray(t.scale),n.layers.mask=t.layers,n.userData=t.userData,t.matrix&&n.matrix.fromArray(t.matrix),n.isCamera){for(let e of[`fov`,`aspect`,`near`,`far`,`zoom`,`focus`,`filmGauge`,`filmOffset`,`left`,`right`,`top`,`bottom`])t[e]!==void 0&&(n[e]=t[e]);n.updateProjectionMatrix()}u.push(n),t.parent>=0&&u[t.parent].add(n)}return{root:u[0],environment:e.environment?o[e.environment]:null,animations:e.animations.map(e=>r.AnimationClip.parse(e)),stats:e.stats}}var mS=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength&&typeof e.buffer.transfer==`function`&&!(typeof SharedArrayBuffer<`u`&&e.buffer instanceof SharedArrayBuffer);function hS(e){e&&mS(e)&&e.buffer.transfer(0)}function gS(e,t){let n=e.constructor;if(mS(e))return new n(e.buffer.transfer(t*n.BYTES_PER_ELEMENT));let r=new n(t);return r.set(t<e.length?e.subarray(0,t):e),r}var _S={STRING:`string`,NUMBER:`number`,WORD:`word`,LBRACKET:`[`,RBRACKET:`]`},vS=9,yS=10,bS=12,xS=13,SS=32,CS=34,wS=35,TS=43,ES=45,DS=46,OS=48,kS=57,AS=91,jS=93,MS=69,NS=101,PS=e=>e===SS||e===vS||e===yS||e===xS||e===bS,FS=e=>e>=OS&&e<=kS,IS=15,LS=22,RS=(()=>{let e=new Float64Array(LS+1);for(let t=0;t<e.length;t++)e[t]=10**t;return e})(),zS=new TextDecoder;function BS(e,t,n){if(n-t===0)return``;let r=!0;for(let i=t;i<n;i++)if(e[i]>127){r=!1;break}if(!r)return zS.decode(e.subarray(t,n));let i=``;for(let r=t;r<n;r++)i+=String.fromCharCode(e[r]);return i}var VS=class{constructor(e){this.bytes=typeof e==`string`?new TextEncoder().encode(e):e,this.i=0,this.n=this.bytes.length,this._ahead=null}peek(){return this._ahead===null&&(this._ahead=this._scan()),this._ahead}next(){let e=this.peek();return this._ahead=null,e}_scan(){let e=this.bytes,t=this.i,n=this.n;for(;;){for(;t<n&&PS(e[t]);)t++;if(t<n&&e[t]===wS){for(;t<n&&e[t]!==yS;)t++;continue}break}if(t>=n)return this.i=t,null;let r=e[t];if(r===AS)return this.i=t+1,{type:_S.LBRACKET};if(r===jS)return this.i=t+1,{type:_S.RBRACKET};if(r===CS){let r=++t;for(;t<n&&e[t]!==CS;)t++;if(t>=n)throw Error(`PBRT tokenizer: unterminated string literal`);return this.i=t+1,{type:_S.STRING,value:BS(e,r,t)}}if(FS(r)||r===DS&&FS(e[t+1])||(r===ES||r===TS)&&(FS(e[t+1])||e[t+1]===DS&&FS(e[t+2])))return this._scanNumber(t);let i=t;for(;t<n;){let n=e[t];if(PS(n)||n===CS||n===AS||n===jS||n===wS)break;t++}return this.i=t,{type:_S.WORD,value:BS(e,i,t)}}_scanNumber(e){let t=this.bytes,n=this.n,r=e,i=!1;t[r]===ES?(i=!0,r++):t[r]===TS&&r++;let a=0,o=0,s=0;for(;r<n&&FS(t[r]);)a=a*10+(t[r]-OS),o++,r++;if(r<n&&t[r]===DS)for(r++;r<n&&FS(t[r]);)a=a*10+(t[r]-OS),o++,s++,r++;let c=0;if(r<n&&(t[r]===NS||t[r]===MS)){let e=r+1,i=!1;if(e<n&&(t[e]===ES||t[e]===TS)&&(i=t[e]===ES,e++),e<n&&FS(t[e])){let a=0;for(;e<n&&FS(t[e]);)a=a*10+(t[e]-OS),e++;c=i?-a:a,r=e}}if(this.i=r,o===0)throw Error(`PBRT tokenizer: invalid number "${BS(t,e,r)}"`);let l=c-s;if(!(o<=IS&&l>=-LS&&l<=LS)){let n=Number(BS(t,e,r));if(Number.isNaN(n))throw Error(`PBRT tokenizer: invalid number "${BS(t,e,r)}"`);return{type:_S.NUMBER,value:n}}let u=l===0?a:l>0?a*RS[l]:a/RS[-l];return i&&(u=-u),{type:_S.NUMBER,value:u}}};function HS(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function US(e){return e[0]*(e[5]*e[10]-e[6]*e[9])-e[4]*(e[1]*e[10]-e[2]*e[9])+e[8]*(e[1]*e[6]-e[2]*e[5])}function WS(e,t,n,r){for(let i=0;i<4;i++){let a=r[i*4],o=r[i*4+1],s=r[i*4+2],c=r[i*4+3];for(let r=0;r<4;r++)e[i*4+r]=t[n+r]*a+t[n+4+r]*o+t[n+8+r]*s+t[n+12+r]*c}return e}function GS(e,t){let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4],s=e[5],c=e[6],l=e[7],u=e[8],d=e[9],f=e[10],p=e[11],m=e[12],h=e[13],g=e[14],_=e[15],v=t[0],y=t[1],b=t[2],x=t[3],S=t[4],C=t[5],w=t[6],T=t[7],E=t[8],D=t[9],O=t[10],k=t[11],A=t[12],j=t[13],M=t[14],N=t[15];return[n*v+o*y+u*b+m*x,r*v+s*y+d*b+h*x,i*v+c*y+f*b+g*x,a*v+l*y+p*b+_*x,n*S+o*C+u*w+m*T,r*S+s*C+d*w+h*T,i*S+c*C+f*w+g*T,a*S+l*C+p*w+_*T,n*E+o*D+u*O+m*k,r*E+s*D+d*O+h*k,i*E+c*D+f*O+g*k,a*E+l*D+p*O+_*k,n*A+o*j+u*M+m*N,r*A+s*j+d*M+h*N,i*A+c*j+f*M+g*N,a*A+l*j+p*M+_*N]}function KS(e,t,n){return[1,0,0,0,0,1,0,0,0,0,1,0,e,t,n,1]}function qS(e,t,n){return[e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1]}function JS(e,t,n,r){let i=Math.hypot(t,n,r)||1;t/=i,n/=i,r/=i;let a=e*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=1-o,l=c*t*t+o,u=c*t*n-s*r,d=c*t*r+s*n,f=c*t*n+s*r,p=c*n*n+o,m=c*n*r-s*t;return[l,f,c*t*r-s*n,0,u,p,c*n*r+s*t,0,d,m,c*r*r+o,0,0,0,0,1]}function YS(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function XS(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function ZS(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function QS(e,t,n){let r=ZS(YS(t,e)),i=ZS(XS(ZS(n),r)),a=XS(r,i);return[i[0],i[1],i[2],0,a[0],a[1],a[2],0,r[0],r[1],r[2],0,e[0],e[1],e[2],1]}function $S(e){let t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=e[9],d=e[10],f=e[11],p=e[12],m=e[13],h=e[14],g=e[15],_=u*h*c-m*d*c+m*s*f-o*h*f-u*s*g+o*d*g,v=p*d*c-l*h*c-p*s*f+a*h*f+l*s*g-a*d*g,y=l*m*c-p*u*c+p*o*f-a*m*f-l*o*g+a*u*g,b=p*u*s-l*m*s-p*o*d+a*m*d+l*o*h-a*u*h,x=t*_+n*v+r*y+i*b;if(x===0)return HS();let S=1/x;return[_*S,(m*d*i-u*h*i-m*r*f+n*h*f+u*r*g-n*d*g)*S,(o*h*i-m*s*i+m*r*c-n*h*c-o*r*g+n*s*g)*S,(u*s*i-o*d*i-u*r*c+n*d*c+o*r*f-n*s*f)*S,v*S,(l*h*i-p*d*i+p*r*f-t*h*f-l*r*g+t*d*g)*S,(p*s*i-a*h*i-p*r*c+t*h*c+a*r*g-t*s*g)*S,(a*d*i-l*s*i+l*r*c-t*d*c-a*r*f+t*s*f)*S,y*S,(p*u*i-l*m*i-p*n*f+t*m*f+l*n*g-t*u*g)*S,(a*m*i-p*o*i+p*n*c-t*m*c-a*n*g+t*o*g)*S,(l*o*i-a*u*i-l*n*c+t*u*c+a*n*f-t*o*f)*S,b*S,(l*m*r-p*u*r+p*n*d-t*m*d-l*n*h+t*u*h)*S,(p*o*r-a*m*r-p*n*s+t*m*s+a*n*h-t*o*h)*S,(a*u*r-l*o*r+l*n*s-t*u*s-a*n*d+t*o*d)*S]}var eC=8,tC=1,nC=2,rC=3,iC=new Set([`Identity`,`Transform`,`CoordinateSystem`,`CoordSysTransform`,`ActiveTransform`,`TransformTimes`,`Camera`,`Film`,`WorldBegin`,`MakeNamedMaterial`,`Texture`,`MakeNamedMedium`,`LightSource`,`AreaLightSource`,`ObjectBegin`,`ObjectEnd`,`ObjectInstance`]);function aC(e,t){if(e===t)return!0;for(let n=0;n<16;n++)if(e[n]!==t[n])return!1;return!0}var oC={integer:Int32Array,point3:Float32Array,point2:Float32Array,vector3:Float32Array,vector2:Float32Array,vector:Float32Array,normal:Float32Array,rgb:Float32Array},sC=class{constructor(e={}){this.releaseInclude=e.releaseInclude||null,this.resolveInclude=e.resolveInclude||(()=>{throw Error(`PBRTParser: Include used but no resolveInclude provided`)}),this.maxPlacements=e.maxPlacements??1/0,this.instanceIncludes=e.instanceIncludes!==!1,this._includes=new Map,this._stateIds=new WeakMap,this._nextStateId=1,this._effects=0,this._movedShapes=!1,this.ir={film:null,camera:null,namedMaterials:new Map,namedTextures:new Map,shapes:[],lights:[],instances:new Map,instanceCount:0,skippedInstances:0,objects:new Map,transformTimes:{start:0,end:1},hasMotion:!1,warnings:[]},this.ctm=HS(),this.ctmEnd=null,this.activeTransform=rC,this._ctmSource=null,this._ctmValue=null,this.state={material:null,areaLight:null,reverseOrientation:!1},this.attributeStack=[],this.transformStack=[],this.coordSystems=new Map,this.currentObject=null,this.objectBeginCTM=null,this.dirStack=[``],this.stream=null,this._warnedUnknown=new Set}async parse(e,t=``){this.dirStack=[t],await this._run(new VS(e)),this._movedShapes&&(this.ir.shapes=this.ir.shapes.filter(Boolean));for(let e of this.ir.instances.values())e.matrices=gS(e.matrices,e.count*16),e.matricesEnd&&=gS(e.matricesEnd,e.count*16);return this.ir}_addInstance(e,t=this.ctm){if(this.ir.instanceCount>=this.maxPlacements){this.ir.skippedInstances++;return}let n=this.ir.instances.get(e);n||this.ir.instances.set(e,n={name:e,count:0,matrices:new Float32Array(512),matricesEnd:null});let r=(n.count+1)*16;if(r>n.matrices.length){let e=Math.max(r,n.matrices.length*2);n.matrices=gS(n.matrices,e),n.matricesEnd&&=gS(n.matricesEnd,e)}let i=n.count*16;for(let e=0;e<16;e++)n.matrices[i+e]=t[e];let a=this._ctmEndSnapshot();if(a&&!n.matricesEnd&&(n.matricesEnd=n.matrices.slice()),n.matricesEnd){let e=a||t;for(let t=0;t<16;t++)n.matricesEnd[i+t]=e[t]}n.count++,this.ir.instanceCount++}_ctmSnapshot(){return this._ctmSource!==this.ctm&&(this._ctmSource=this.ctm,this._ctmValue=this.ctm.slice()),this._ctmValue}_ctmEndSnapshot(){return this.ctmEnd===null||aC(this.ctmEnd,this.ctm)?null:(this.ir.hasMotion=!0,this.ctmEnd.slice())}_concat(e){if(this.activeTransform===rC&&this.ctmEnd===null){this.ctm=GS(this.ctm,e);return}let t=this.ctmEnd??this.ctm;this.ctmEnd=this.activeTransform&nC?GS(t,e):t,this.activeTransform&tC&&(this.ctm=GS(this.ctm,e))}_setCTM(e){if(this.activeTransform===rC){this.ctm=e,this.ctmEnd=null;return}let t=this.ctmEnd??this.ctm;this.ctmEnd=this.activeTransform&nC?e:t,this.activeTransform&tC&&(this.ctm=e)}_pushGraphicsState(){this.attributeStack.push({ctm:this.ctm,ctmEnd:this.ctmEnd,activeTransform:this.activeTransform,material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation})}_popGraphicsState(){let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd,this.activeTransform=e.activeTransform,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation})}_peek(){return this.stream.peek()}_next(){return this.stream.next()}_expectNumber(e){let t=this._next();if(!t||t.type!==_S.NUMBER)throw Error(`PBRT parser: expected number for ${e}, got ${t?t.value:`EOF`}`);return t.value}_expectString(e){let t=this._next();if(!t||t.type!==_S.STRING)throw Error(`PBRT parser: expected string for ${e}, got ${t?t.value:`EOF`}`);return t.value}_readNumbers(e){let t=[];for(let n=0;n<e;n++)t.push(this._expectNumber(`matrix/transform`));return t}_readBracketedOrBareNumbers(e){if(this._peek()&&this._peek().type===_S.LBRACKET){this._next();let e=[];for(;this._peek()&&this._peek().type!==_S.RBRACKET;)e.push(this._expectNumber(`transform element`));return this._next(),e}return this._readNumbers(e)}_parseParams(){let e={};for(;this._peek()&&this._peek().type===_S.STRING;){let t=this._next().value.trim().split(/\s+/),n=t[0],r=t[1]===void 0?t[0]:t[1];e[r]={type:n,value:this._parseParamValue(n)}}return e}_parseParamValue(e){let t=this._peek()&&this._peek().type===_S.LBRACKET;t&&this._next();let n=()=>{let e=this._peek();return t?e&&e.type!==_S.RBRACKET:!1};if(!t)return[this._coerceValueToken(this._next())];if(this._peek()&&this._peek().type===_S.NUMBER){let t=[];for(;n()&&t.length<eC;){let e=this._next();if(e.type!==_S.NUMBER)return this._finishMixedValue(t,t.length,e);t.push(e.value)}if(!n())return this._next(),t;let r=new(oC[e]||Float64Array)(eC*4);r.set(t);let i=t.length;for(;n();){let e=this._next();if(e.type!==_S.NUMBER)return this._finishMixedValue(r,i,e);i===r.length&&(r=gS(r,r.length*2)),r[i++]=e.value}return this._next(),i===r.length?r:gS(r,i)}let r=[];for(;n();)r.push(this._coerceValueToken(this._next()));return this._next(),r}_finishMixedValue(e,t,n){let r=[];for(let n=0;n<t;n++)r.push(e[n]);for(r.push(this._coerceValueToken(n));this._peek()&&this._peek().type!==_S.RBRACKET;)r.push(this._coerceValueToken(this._next()));return this._next(),r}_coerceValueToken(e){if(!e)throw Error(`PBRT parser: unexpected EOF in parameter value`);if(e.type===_S.NUMBER||e.type===_S.STRING)return e.value;if(e.type===_S.WORD)return e.value===`true`?!0:e.value===`false`?!1:e.value;throw Error(`PBRT parser: unexpected token in parameter value: ${e.type}`)}async _run(e){let t=this.stream;this.stream=e;for(let e=this._next();e!==null;e=this._next()){if(e.type!==_S.WORD)throw Error(`PBRT parser: expected directive, got ${e.type} ${e.value??``}`);iC.has(e.value)&&this._effects++;let t=this._directive(e.value);t!==void 0&&await t}this.stream=t}_directive(e){switch(e){case`Identity`:this._setCTM(HS());break;case`Translate`:{let[e,t,n]=this._readNumbers(3);this._concat(KS(e,t,n));break}case`Scale`:{let[e,t,n]=this._readNumbers(3);this._concat(qS(e,t,n));break}case`Rotate`:{let[e,t,n,r]=this._readNumbers(4);this._concat(JS(e,t,n,r));break}case`LookAt`:{let e=this._readNumbers(9),t=QS([e[0],e[1],e[2]],[e[3],e[4],e[5]],[e[6],e[7],e[8]]);this._concat($S(t));break}case`Transform`:this._setCTM(this._readBracketedOrBareNumbers(16));break;case`ConcatTransform`:this._concat(this._readBracketedOrBareNumbers(16));break;case`CoordinateSystem`:this.coordSystems.set(this._expectString(`CoordinateSystem`),{ctm:this.ctm,ctmEnd:this.ctmEnd});break;case`CoordSysTransform`:{let e=this.coordSystems.get(this._expectString(`CoordSysTransform`));e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd);break}case`Camera`:{let e=this._expectString(`Camera type`),t=this._parseParams();this.ir.camera={type:e,params:t,cameraToWorld:$S(this.ctm)};let n=this._ctmEndSnapshot();n&&(this.ir.camera.cameraToWorldEnd=$S(n));break}case`Film`:{this._expectString(`Film type`);let e=this._parseParams();this.ir.film={xresolution:this._num(e.xresolution,1280),yresolution:this._num(e.yresolution,720),filename:this._str(e.filename,null)};break}case`Integrator`:case`Sampler`:case`PixelFilter`:case`Filter`:case`Accelerator`:case`ColorSpace`:case`Option`:this._skipTypeAndParams();break;case`WorldBegin`:this.ctm=HS(),this.ctmEnd=null,this.activeTransform=rC,this.state={material:null,areaLight:null,reverseOrientation:!1};break;case`WorldEnd`:break;case`AttributeBegin`:this._pushGraphicsState();break;case`AttributeEnd`:this._popGraphicsState();break;case`TransformBegin`:this.transformStack.push({ctm:this.ctm,ctmEnd:this.ctmEnd,activeTransform:this.activeTransform});break;case`TransformEnd`:{let e=this.transformStack.pop();e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd,this.activeTransform=e.activeTransform);break}case`ReverseOrientation`:this.state.reverseOrientation=!this.state.reverseOrientation;break;case`Attribute`:this._expectString(`Attribute target`),this._parseParams();break;case`ActiveTransform`:{let e=this._next()?.value;e===`StartTime`?this.activeTransform=tC:e===`EndTime`?this.activeTransform=nC:e===`All`?this.activeTransform=rC:this._warn(`ActiveTransform "${e}" not recognised`);break}case`TransformTimes`:{let[e,t]=this._readNumbers(2);this.ir.transformTimes={start:e,end:t};break}case`MediumInterface`:this._peek()&&this._peek().type===_S.STRING&&this._next(),this._peek()&&this._peek().type===_S.STRING&&this._next();break;case`MakeNamedMedium`:this._skipNamedAndParams();break;case`Material`:{let e=this._expectString(`Material type`),t=this._parseParams();this.state.material={type:e,params:t};break}case`MakeNamedMaterial`:{let e=this._expectString(`MakeNamedMaterial name`),t=this._parseParams(),n=this._str(t.type,`diffuse`);this.ir.namedMaterials.set(e,{type:n,params:t});break}case`NamedMaterial`:{let e=this._expectString(`NamedMaterial name`),t=this.ir.namedMaterials.get(e);this.state.material=t||{type:`diffuse`,params:{},_missingRef:e},t||this._warn(`NamedMaterial "${e}" referenced before definition`);break}case`Texture`:{let e=this._expectString(`Texture name`),t=this._expectString(`Texture data type`),n=this._expectString(`Texture class`),r=this._parseParams();this.ir.namedTextures.set(e,{dataType:t,class:n,params:r});break}case`AreaLightSource`:{let e=this._expectString(`AreaLightSource type`),t=this._parseParams();this.state.areaLight={type:e,params:t};break}case`LightSource`:{let e=this._expectString(`LightSource type`),t=this._parseParams();this.ctmEnd!==null&&!aC(this.ctmEnd,this.ctm)&&this._warnOnce(`animated-light`,`animated LightSource transforms are not supported — using the start transform`),this.ir.lights.push({type:e,params:t,ctm:this._ctmSnapshot()});break}case`Shape`:{let e={type:this._expectString(`Shape type`),params:this._parseParams(),ctm:this._ctmSnapshot(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation},t=this.currentObject===null?this._ctmEndSnapshot():null;t?e.ctmEnd=t:this.currentObject!==null&&this.ctmEnd!==null&&!aC(this.ctmEnd,this.ctm)&&this._warnOnce(`animated-template`,`animated transforms inside ObjectBegin are not supported — using the start transform`),this._emitShape(e);break}case`ObjectBegin`:{let e=this._expectString(`ObjectBegin name`);this._pushGraphicsState(),this.currentObject=e,this.objectBeginCTM=this.ctm.slice(),this.ir.objects.has(e)||this.ir.objects.set(e,[]);break}case`ObjectEnd`:this.currentObject=null,this.objectBeginCTM=null,this._popGraphicsState();break;case`ObjectInstance`:{let e=this._expectString(`ObjectInstance name`);this._addInstance(e);break}case`Include`:case`Import`:{let t=this._expectString(e);return this._include(t)}default:this._warnUnknown(e),this._parseParams();break}}_emitShape(e){this.currentObject===null?this.ir.shapes.push(e):(e.relativeCTM=GS($S(this.objectBeginCTM),e.ctm),this.ir.objects.get(this.currentObject).push(e))}async _include(e){let t=this.dirStack[this.dirStack.length-1],n=this._includeKey(e,t);if(n!==null&&this._placeRepeat(n,e))return;let r=await this.resolveInclude(e,t);if(r==null){this._warn(`Include target not found: ${e}`);return}let i=n===null?null:this._includeState(),a=e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`)):``;this.dirStack.push(a);try{await this._run(new VS(r))}finally{this.dirStack.pop(),this.releaseInclude?.(e,t,r)}i&&this._sameIncludeState(i)&&!this._includes.has(n)&&this._includes.set(n,{start:i.shapes,end:this.ir.shapes.length,ctm:i.ctm.slice(),template:null})}_includeKey(e,t){return!this.instanceIncludes||this.currentObject!==null||this.ctmEnd!==null||this.activeTransform!==rC||this.state.areaLight?null:`${t}\0${e}\0${this._stateId(this.state.material)}\0${this.state.reverseOrientation}`}_stateId(e){if(!e)return 0;let t=this._stateIds.get(e);return t===void 0&&this._stateIds.set(e,t=this._nextStateId++),t}_includeState(){return{shapes:this.ir.shapes.length,effects:this._effects,ctm:this.ctm,attributes:this.attributeStack.length,transforms:this.transformStack.length,material:this.state.material,reverseOrientation:this.state.reverseOrientation}}_sameIncludeState(e){return this._effects===e.effects&&this.ctmEnd===null&&this.activeTransform===rC&&aC(this.ctm,e.ctm)&&this.attributeStack.length===e.attributes&&this.transformStack.length===e.transforms&&this.state.material===e.material&&this.state.areaLight===null&&this.state.reverseOrientation===e.reverseOrientation}_placeRepeat(e,t){let n=this._includes.get(e);if(!n)return!1;if(n.template===null){let{start:r,end:i}=n;if(i===r||this.ir.instanceCount+2>this.maxPlacements)return!1;for(let t=r;t<i;t++)if(!this.ir.shapes[t])return this._includes.delete(e),!1;let a=`${t}#${this.ir.objects.size}`,o=$S(n.ctm),s=[],c=null,l=null;for(let e=r;e<i;e++){let t=this.ir.shapes[e];t.ctm!==c&&(l=GS(o,c=t.ctm)),t.relativeCTM=l,s.push(t),this.ir.shapes[e]=null}this.ir.objects.set(a,s),this._addInstance(a,n.ctm),n.template=a,this._movedShapes=!0}return this._addInstance(n.template),!0}_skipTypeAndParams(){this._peek()&&this._peek().type===_S.STRING&&this._next(),this._parseParams()}_skipNamedAndParams(){this._peek()&&this._peek().type===_S.STRING&&this._next(),this._parseParams()}_num(e,t){return e&&e.value.length?e.value[0]:t}_str(e,t){return e&&e.value.length?e.value[0]:t}_warn(e){this.ir.warnings.push(e)}_warnOnce(e,t){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(t))}_warnUnknown(e){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(`Unsupported directive ignored: ${e}`))}},cC={au:[1,.78,.34],gold:[1,.78,.34],cu:[.95,.64,.54],copper:[.95,.64,.54],ag:[.97,.96,.91],silver:[.97,.96,.91],al:[.91,.92,.92],aluminium:[.91,.92,.92],aluminum:[.91,.92,.92],mgo:[.9,.9,.9],tio2:[.9,.9,.9]},lC=[.92,.92,.92];function uC(e){let t=Math.max(1e3,Math.min(4e4,e))/100,n,r,i;t<=66?(n=255,r=99.47*Math.log(t)-161.12):(n=329.7*(t-60)**-.1332,r=288.12*(t-60)**-.0755),i=t>=66?255:t<=19?0:138.52*Math.log(t-10)-305.04;let a=e=>Math.max(0,Math.min(255,e))/255;return[a(n)**2.2,a(r)**2.2,a(i)**2.2]}function dC(e,t,n){let r=e[t];return r&&typeof r.value[0]==`number`?r.value[0]:n}function fC(e,t,n){let r=e[t];return r&&typeof r.value[0]==`string`?r.value[0]:n}async function pC(e,t,n,r=null){let i=e[t];if(!i)return{rgb:r,texture:null};if(i.type===`texture`){let e=i.value[0],t=await n.resolveNamedTexture(e);return t&&t.texture?{rgb:t.constant??null,texture:t.texture}:t&&t.constant?{rgb:t.constant,texture:null}:(n.warn(`texture "${e}" could not be resolved`),{rgb:r,texture:null})}if(i.type===`rgb`||i.type===`color`)return{rgb:[i.value[0],i.value[1],i.value[2]],texture:null};if(i.type===`float`){let e=i.value[0];return{rgb:[e,e,e],texture:null}}if(i.type===`blackbody`)return{rgb:uC(i.value[0]),texture:null};if(i.type===`spectrum`){if(typeof i.value[0]==`string`){let e=mC(i.value[0]);return e&&cC[e]?{rgb:cC[e].slice(),texture:null}:(n.warn(`named spectrum "${i.value[0]}" approximated to gray`),{rgb:[.5,.5,.5],texture:null})}let e=0,t=0;for(let n=1;n<i.value.length;n+=2)e+=i.value[n],t++;let r=t?e/t:.5;return{rgb:[r,r,r],texture:null}}return{rgb:r,texture:null}}function mC(e){let t=e.toLowerCase().match(/metal-([a-z]+)/);if(t)return t[1];for(let t of Object.keys(cC))if(e.toLowerCase().includes(t))return t;return null}function hC(e,t){if(e.roughness&&typeof e.roughness.value[0]==`number`)return e.roughness.value[0];let n=dC(e,`uroughness`,null),r=dC(e,`vroughness`,null);return n!==null&&r!==null?(n+r)/2:n===null?t:n}async function gC(e,t){let n=e?.type||`diffuse`,i=e?.params||{},a=new r.MeshPhysicalMaterial({side:r.DoubleSide,roughness:1,metalness:0}),o=e=>{e&&a.color.setRGB(e[0],e[1],e[2])},s=e=>{o(e.rgb),e.texture&&(a.map=e.texture,e.rgb||a.color.setRGB(1,1,1))};switch(n){case`diffuse`:s(await pC(i,`reflectance`,t,[.5,.5,.5])),a.roughness=1,a.metalness=0;break;case`conductor`:case`metal`:{let e=await pC(i,`reflectance`,t,null),n=i.eta,r=i.k,c=n&&n.type===`spectrum`&&typeof n.value[0]==`string`;if(e.rgb||e.texture)s(e);else if(n&&r&&!c){let e=(await pC(i,`eta`,t,[.2,.92,1.1])).rgb,n=(await pC(i,`k`,t,[3.9,2.45,2.14])).rgb,r=(e,t)=>((e-1)**2+t**2)/((e+1)**2+t**2);o([r(e[0],n[0]),r(e[1],n[1]),r(e[2],n[2])])}else o(n?(await pC(i,`eta`,t,lC)).rgb||lC:cC.cu);a.metalness=1,a.roughness=hC(i,.1);break}case`dielectric`:case`thindielectric`:a.transmission=1,a.metalness=0,a.color.setRGB(1,1,1),a.ior=dC(i,`eta`,1.5),a.roughness=hC(i,0),a.thickness=n===`thindielectric`?0:dC(i,`thickness`,0);break;case`coateddiffuse`:s(await pC(i,`reflectance`,t,[.5,.5,.5])),a.roughness=.6,a.metalness=0,a.clearcoat=1,a.clearcoatRoughness=hC(i,0);break;case`diffusetransmission`:{let e=await pC(i,`transmittance`,t,[.25,.25,.25]);s(await pC(i,`reflectance`,t,[.25,.25,.25])),a.transmission=e.rgb?(e.rgb[0]+e.rgb[1]+e.rgb[2])/3:.5,a.roughness=1,a.ior=1;break}case`interface`:case`none`:case``:a.transmission=1,a.ior=1,a.roughness=0,a.color.setRGB(1,1,1);break;case`mix`:{let e=i.materials?.value||[],n=Math.max(0,Math.min(1,dC(i,`amount`,.5))),o=e[0]?t.namedMaterials?.get(e[0]):null,s=e[1]?t.namedMaterials?.get(e[1]):null;if(o&&s){let[e,r]=await Promise.all([gC(o,t),gC(s,t)]),i=(e,t)=>e*(1-n)+t*n;a.color.lerpColors(e.color,r.color,n),a.roughness=i(e.roughness,r.roughness),a.metalness=i(e.metalness,r.metalness),a.ior=i(e.ior??1.5,r.ior??1.5),a.transmission=i(e.transmission??0,r.transmission??0),a.thickness=i(e.thickness??0,r.thickness??0),a.clearcoat=i(e.clearcoat??0,r.clearcoat??0),a.clearcoatRoughness=i(e.clearcoatRoughness??0,r.clearcoatRoughness??0),a.emissive.lerpColors(e.emissive,r.emissive,n),a.emissiveIntensity=i(e.emissiveIntensity??0,r.emissiveIntensity??0),a.map=(n<.5?e.map:r.map)||null;break}t.warn(`material "mix" — could not resolve inner materials [${e.join(`, `)}], falling back to diffuse`),a.color.set(new r.Color(.6,.6,.6));break}case`subsurface`:case`hair`:case`measured`:t.warn(`material "${n}" not supported — using diffuse approximation`),o((await pC(i,`reflectance`,t,[.5,.5,.5])).rgb),a.roughness=1;break;default:t.warn(`unknown material "${n}" — using neutral diffuse`),a.color.set(new r.Color(.6,.6,.6));break}return a.roughness=Math.max(0,Math.min(1,a.roughness)),a}function _C(e){return e===3?3/16:3/(8*e)}function vC(e){return 1/(e+3/(8*_C(e)))}function yC(e,t){let n=new Map,r=[],i=[],a=[],o=[],s=[],c=t.length/3;for(let l=0;l<c;l++)for(let c=0;c<3;c++){let u=t[l*3+c],d=t[l*3+(c+1)%3],f=t[l*3+(c+2)%3],p=u<d?u:d,m=u<d?d:u,h=p*e+m,g=n.get(h);g===void 0?(n.set(h,r.length),r.push(p),i.push(m),a.push(f),o.push(-1),s.push(1)):(o[g]<0&&(o[g]=f),s[g]++)}let l=Array.from({length:e},()=>[]),u=Array.from({length:e},()=>[]);for(let e=0;e<r.length;e++){let t=r[e],n=i[e];l[t].push(n),l[n].push(t),s[e]===1&&(u[t].push(n),u[n].push(t))}return{edgeIndex:n,edgeV0:r,edgeV1:i,edgeOpp0:a,edgeOpp1:o,edgeFaces:s,ring:l,boundaryRing:u}}function bC(e,t,n,r,i){let a=new Float64Array(e.length);for(let o=0;o<n;o++){let n=o*3,s=t.boundaryRing[o];if(s.length===2){let t=s[0]*3,r=s[1]*3,o=1-2*i;for(let s=0;s<3;s++)a[n+s]=o*e[n+s]+i*(e[t+s]+e[r+s]);continue}let c=t.ring[o],l=c.length;if(l===0||s.length>0){for(let t=0;t<3;t++)a[n+t]=e[n+t];continue}let u=r(l),d=0,f=0,p=0;for(let t=0;t<l;t++){let n=c[t]*3;d+=e[n],f+=e[n+1],p+=e[n+2]}let m=1-l*u;a[n]=m*e[n]+u*d,a[n+1]=m*e[n+1]+u*f,a[n+2]=m*e[n+2]+u*p}return a}function xC(e,t){let n=e.length/3,r=yC(n,t),i=r.edgeV0.length,a=bC(e,r,n,_C,1/8),o=new Float64Array((n+i)*3);o.set(a);for(let t=0;t<i;t++){let i=r.edgeV0[t]*3,a=r.edgeV1[t]*3,s=(n+t)*3,c=r.edgeOpp1[t];if(c<0)for(let t=0;t<3;t++)o[s+t]=.5*(e[i+t]+e[a+t]);else{let n=r.edgeOpp0[t]*3,l=c*3;for(let t=0;t<3;t++)o[s+t]=.375*(e[i+t]+e[a+t])+.125*(e[n+t]+e[l+t])}}let s=t.length/3,c=new Int32Array(s*12),l=(e,t)=>n+r.edgeIndex.get((e<t?e:t)*n+(e<t?t:e));for(let e=0;e<s;e++){let n=t[e*3],r=t[e*3+1],i=t[e*3+2],a=l(n,r),o=l(r,i),s=l(i,n),u=e*12;c[u]=n,c[u+1]=a,c[u+2]=s,c[u+3]=a,c[u+4]=r,c[u+5]=o,c[u+6]=s,c[u+7]=o,c[u+8]=i,c[u+9]=a,c[u+10]=o,c[u+11]=s}return{positions:o,indices:c}}function SC(e,t,n,r=2e6){let i=Float64Array.from(e),a=Int32Array.from(t),o=0;for(let e=0;e<n&&!(a.length/3*4>r);e++){let e=xC(i,a);i=e.positions,a=e.indices,o++}let s=i.length/3,c=bC(i,yC(s,a),s,vC,1/5);return{positions:Float32Array.from(c),indices:Uint32Array.from(a),levels:o}}function CC(e,t,n){let r=Math.abs(e),i=Math.abs(t),a=Math.sqrt(Math.max(0,1-Math.abs(n))),o=Math.max(r,i),s=o===0?0:Math.min(r,i)/o,c=2/Math.PI*Math.atan(s);r<i&&(c=1-c);let l=c*a,u=a-l;if(n<0){let e=u;u=1-l,l=1-e}return e<0&&(u=-u),t<0&&(l=-l),[.5*(u+1),.5*(l+1)]}var wC=(()=>{let e=new Float32Array(256);for(let t=0;t<256;t++){let n=t/255;e[t]=n<=.04045?n/12.92:((n+.055)/1.055)**2.4}return e})();function TC(e,t,n,r,i,a,o,s){let c=Math.min(Math.max(i*t-.5,0),t-1),l=Math.min(Math.max(a*n-.5,0),n-1),u=Math.floor(c),d=Math.floor(l),f=Math.min(u+1,t-1),p=Math.min(d+1,n-1),m=c-u,h=l-d,g=(d*t+u)*r,_=(d*t+f)*r,v=(p*t+u)*r,y=(p*t+f)*r;for(let t=0;t<3;t++){let n=s?s[e[g+t]]:e[g+t],r=s?s[e[_+t]]:e[_+t],i=s?s[e[v+t]]:e[v+t],a=s?s[e[y+t]]:e[y+t],c=n*(1-m)+r*m,l=i*(1-m)+a*m;o[t]=c*(1-h)+l*h}}function EC(e,t,n=1,r=0){let i=r||Math.min(e.width,4096),a=Math.max(1,i>>1),o=new Float32Array(i*a*4),s=t?$S(t):null,c=e.srgb?wC:null,l=[0,0,0];for(let t=0;t<a;t++){let r=(1-(t+.5)/a)*Math.PI,u=Math.sin(r),d=Math.cos(r);for(let r=0;r<i;r++){let a=((r+.5)/i-.5)*2*Math.PI,f=u*Math.cos(a),p=d,m=u*Math.sin(a);if(s){let e=s,t=e[0]*f+e[4]*p+e[8]*m,n=e[1]*f+e[5]*p+e[9]*m,r=e[2]*f+e[6]*p+e[10]*m,i=Math.hypot(t,n,r)||1;f=t/i,p=n/i,m=r/i}let[h,g]=CC(f,p,m);TC(e.data,e.width,e.height,e.channels,h,e.bottomUp?1-g:g,l,c);let _=(t*i+r)*4;o[_]=l[0]*n,o[_+1]=l[1]*n,o[_+2]=l[2]*n,o[_+3]=1}}return{data:o,width:i,height:a}}var DC=2;function OC(e,t){let n=e*e,r=n*e;t[0]=(1-3*e+3*n-r)/6,t[1]=(4-6*n+3*r)/6,t[2]=(1+3*e+3*n-3*r)/6,t[3]=r/6}function kC(e,t){let n=1-e;t[0]=n*n*n,t[1]=3*n*n*e,t[2]=3*n*e*e,t[3]=e*e*e}function AC(e){let t=Math.hypot(e[0],e[1],e[2]);return t>0&&(e[0]/=t,e[1]/=t,e[2]/=t),e}function jC(e,t,n){return n[0]=e[1]*t[2]-e[2]*t[1],n[1]=e[2]*t[0]-e[0]*t[2],n[2]=e[0]*t[1]-e[1]*t[0],n}function MC(e,t){let n=e.length/3;return t===`bspline`?n-3:Math.max(1,(n-1)/3)}function NC(e,t,n,r,i,a,o){let s=Math.floor(r);s>=n&&(s=n-1);let c=r-s;t===`bspline`?OC(c,i):kC(c,i);let l=t===`bspline`?s:s*3,u=0,d=0,f=0;for(let t=0;t<4;t++){let n=(l+t)*3;u+=i[t]*e[n],d+=i[t]*e[n+1],f+=i[t]*e[n+2]}a[o]=u,a[o+1]=d,a[o+2]=f}function PC(e,t,n){let r=MC(e,t);if(r<1)return null;let i=Math.max(1,Math.round(n*r)),a=new Float64Array((i+1)*3),o=[0,0,0,0];for(let n=0;n<=i;n++)NC(e,t,r,n/i*r,o,a,n*3);return{points:a,count:i+1,spans:r}}function FC(e,t,n,r,i){let a=e[t*3],o=e[t*3+1],s=e[t*3+2],c=n[r*3],l=n[r*3+1],u=n[r*3+2],d=n[i*3]-c,f=n[i*3+1]-l,p=n[i*3+2]-u,m=d*d+f*f+p*p,h=m>0?((a-c)*d+(o-l)*f+(s-u)*p)/m:0;return h=h<0?0:h>1?1:h,Math.hypot(a-c-h*d,o-l-h*f,s-u-h*p)}function IC(e,t,n,r,i,a){let{points:o,count:s,spans:c}=n;if(s<3)return null;let l=new Float64Array((s-1)*3),u=[0,0,0,0],d=s-1;for(let n=0;n<d;n++)NC(e,t,c,(n+.5)/d*c,u,l,n*3);let f=0;for(let e=0;e<d;e++)f=Math.max(f,FC(l,e,o,e,e+1));let p=e=>Math.max(f,r*.5*(i+(a-i)*(e/d))),m=(e,t)=>{for(let n=e+1;n<t;n++)if(FC(o,n,o,e,t)>p(n))return!1;for(let n=e;n<t;n++)if(FC(l,n,o,e,t)>p(n+.5))return!1;return!0},h=new Int32Array(s),g=0;h[g++]=0;for(let e=0;e<d;){let t=e+1;for(;t<d&&m(e,t+1);)t++;h[g++]=t,e=t}return g===s?null:h.subarray(0,g)}function LC(e){let{P:t,basis:n=`bezier`,width0:r=1,width1:i=1,N:a=null}=e,o=Math.max(1,Math.round(e.steps??DC)),s=Math.max(1,Math.round(e.sides??1));if(!t||t.length<12)return null;let c=PC(t,n,o);if(!c)return null;let{points:l,count:u}=c,d=e.tolerance>0?IC(t,n,c,e.tolerance,r,i):null,f=d?d.length:u,p=s>=3?s:s*2,m=new Float32Array(f*p*3),h=[0,0,0],g=[0,0,0],_=[0,0,0],v=[0,0,0],y=!1,b=0;for(let e=0;e<u;e++){let t=Math.max(0,e-1),n=Math.min(u-1,e+1);if(h[0]=l[n*3]-l[t*3],h[1]=l[n*3+1]-l[t*3+1],h[2]=l[n*3+2]-l[t*3+2],AC(h),y){let e=g[0]*h[0]+g[1]*h[1]+g[2]*h[2];g[0]-=e*h[0],g[1]-=e*h[1],g[2]-=e*h[2],Math.hypot(g[0],g[1],g[2])<1e-9&&jC(h,[0,1,0],g),AC(g)}else{if(a&&a.length>=3)g[0]=a[0],g[1]=a[1],g[2]=a[2],jC(h,g,v),g[0]=v[0],g[1]=v[1],g[2]=v[2];else{let e=Math.abs(h[0]),t=Math.abs(h[1]),n=Math.abs(h[2]);jC(h,e<t&&e<n?[1,0,0]:t<n?[0,1,0]:[0,0,1],g)}Math.hypot(g[0],g[1],g[2])<1e-9&&jC(h,[0,1,0],g),AC(g),y=!0}if(d&&d[b]!==e)continue;jC(h,g,_),AC(_);let o=e/(u-1||1),c=(r+(i-r)*o)*.5,f=l[e*3],x=l[e*3+1],S=l[e*3+2];for(let e=0;e<p;e++){let t,n,r;if(s>=3){let i=e/s*Math.PI*2,a=Math.cos(i),o=Math.sin(i);t=g[0]*a+_[0]*o,n=g[1]*a+_[1]*o,r=g[2]*a+_[2]*o}else{let i=e<2?g:_,a=e%2==0?-1:1;t=i[0]*a,n=i[1]*a,r=i[2]*a}let i=(b*p+e)*3;m[i]=f+t*c,m[i+1]=x+n*c,m[i+2]=S+r*c}b++}let x=s,S=new Uint32Array((f-1)*x*6),C=0;for(let e=0;e<f-1;e++)for(let t=0;t<x;t++){let n=s>=3?t:t*2,r=s>=3?(t+1)%s:t*2+1,i=e*p+n,a=e*p+r,o=(e+1)*p+r,c=(e+1)*p+n;S[C++]=i,S[C++]=a,S[C++]=o,S[C++]=i,S[C++]=o,S[C++]=c}return{positions:m,indices:C===S.length?S:gS(S,C)}}var RC=[1,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,1],zC=4096;function BC(e){return e instanceof Uint32Array?new r.Uint32BufferAttribute(e,1):ArrayBuffer.isView(e)&&e.BYTES_PER_ELEMENT===4?new r.Uint32BufferAttribute(new Uint32Array(e.buffer,e.byteOffset,e.length),1):new r.Uint32BufferAttribute(Uint32Array.from(e),1)}function VC(e,t){if(t<=e.length)return e;let n=e.length||1;for(;n<t;)n*=2;return gS(e,n)}function HC(e){return e instanceof Float32Array?e:Float32Array.from(e)}var UC=1e3,WC=45e6,GC=6e6,KC=6e7,qC=8e6,JC=256,YC=4096,XC=5e5,ZC=2,QC={flat:1,ribbon:1,cylinder:2},$C=.05;function ew(e,t){if(e.count!==t.count)return!1;for(let n=0,r=e.count*16;n<r;n++)if(e.matrices[n]!==t.matrices[n])return!1;return!0}function tw(e,t){let n=Math.min(e.width,zC),r=null;if(typeof OffscreenCanvas<`u`)r=new OffscreenCanvas(n,n);else if(typeof document<`u`)r=document.createElement(`canvas`),r.width=r.height=n;else return null;try{let i=r.getContext(`2d`,{willReadFrequently:!0});if(!i)return null;i.drawImage(e,0,0,n,n);let{data:a}=i.getImageData(0,0,n,n);return{data:a,width:n,height:n,channels:4,bottomUp:!1,srgb:t}}catch{return null}}function nw(e){let t=[e],n=e,r=[e=>e.replace(/-renamed-\d+$/,``),e=>e.replace(/\d+$/,``),e=>e.replace(/_Color$/i,``),e=>e.replace(/\d+$/,``)];for(let e of r){let r=e(n);r!==n&&r&&t.push(n=r)}return t}var rw=class{constructor(e={}){this.maxTriangles=e.maxTriangles??WC,this.maxPlacements=e.maxPlacements??GC,this.mergeShapesAbove=e.mergeShapesAbove??JC,this.curveSteps=e.curveSteps??ZC,this.curveSides=e.curveSides??null,this.curveTolerance=e.curveTolerance??$C,this.resolvePLY=e.resolvePLY||(async()=>null),this.resolveImage=e.resolveImage||(async()=>null),this.resolveEnvironment=e.resolveEnvironment||e.resolveImage||(async()=>null),this.convertHandedness=e.convertHandedness===!0,this.warnings=[],this.report=[],this._materialCache=new Map,this._textureCache=new Map,this._geometryCache=new Map,this._materialBySignature=new Map,this._noUVMaterials=new Map,this._plyCache=new Map}warn(e){this.warnings.push(e)}async build(e){this.ir=e,this._keepShapes=new Set;for(let{name:t}of e.animatedInstances??[])for(let n of e.objects.get(t)??[])this._keepShapes.add(n);this._recoveredColors=0,this.reportedMeshes=0,this.triangleCount=0,this.placementCount=0,this.skippedForBudget=0,this._countedGeometries=new WeakSet;let t=new r.Group;t.name=`PBRTScene`,this._batches=e.shapes.length>=this.mergeShapesAbove?new Map:null,this._mergedBatches=0,this.mergedShapes=0,this.droppedNoTemplate=0,this._animated=[];for(let n=0;n<e.shapes.length;n++){if(this._overBudget()){this.skippedForBudget+=e.shapes.length-n;break}let r=e.shapes[n],[i,a]=await Promise.all([this._batches?this._createGeometry(r):this._buildGeometry(r),this._getMaterial(r)]);if(!i)continue;if(this._batches&&!r.motion&&i.getAttribute(`position`).count<=YC){this._mergeShape(r,i,a,t),e.shapes[n]=null;continue}let o=this._meshFromGeometry(r,i,a,r.ctm,`shape_${n}`);o&&(t.add(o),r.motion&&this._animate(o,r.motion))}if(this._batches){for(let e of this._batches.values())this._flushBatch(e[0],t),this._flushBatch(e[1],t);this._batches=null}await this._buildInstances(e,t),await this._buildAnimatedPlacements(e,t),this.skippedForBudget>0&&this.warn(`stopped at ${this.triangleCount.toLocaleString()} stored triangles (budget ${this.maxTriangles.toLocaleString()}) and ${this.placementCount.toLocaleString()} placements (budget ${this.maxPlacements.toLocaleString()}); ${this.skippedForBudget.toLocaleString()} placement(s) skipped`);let n=null;e.camera&&(n=this._buildCamera(e.camera,e.film),n&&t.add(n));let i=e.animation?this._buildClip(e,n):[],a=await this._buildEnvironment(e.lights);return this._reportUnsupportedLights(e.lights),this._recoveredColors>0&&this.warn(`${this._recoveredColors} unreadable texture(s) fell back to the like-named material's colour`),{group:t,camera:n,environment:a,animations:i,report:this.report,meshCount:this.reportedMeshes,triangleCount:this.triangleCount,placementCount:this.placementCount,mergedShapes:this.mergedShapes,droppedNoTemplate:this.droppedNoTemplate,skippedForBudget:this.skippedForBudget,warnings:this.warnings.concat(e.warnings||[])}}_overBudget(){return this.triangleCount>=this.maxTriangles||this.placementCount>=this.maxPlacements}_accountGeometry(e){let t=e.index?e.index.count/3:e.getAttribute(`position`).count/3;return this._countedGeometries.has(e)||(this._countedGeometries.add(e),this.triangleCount+=t),t}async _buildInstances(e,t){let n=0;e.skippedInstances>0&&(this.skippedForBudget+=e.skippedInstances);let i=new Float64Array(16),a=new r.Matrix4,o=(e,o,s,c,l,u,d)=>{let f=Math.max(0,this.maxPlacements-this.placementCount),p=Math.min(e.count,f);if(p<e.count&&(this.skippedForBudget+=e.count-p),p===0)return;let m=new r.InstancedMesh(o,s,p);m.name=`instance_${n++}`,m.frustumCulled=!1;for(let t=0;t<p;t++){if(c)WS(i,e.matrices,t*16,c);else for(let n=0;n<16;n++)i[n]=e.matrices[t*16+n];m.setMatrixAt(t,a.fromArray(this.convertHandedness?GS(RC,i):i))}m.instanceMatrix.needsUpdate=!0,t.add(m),this.placementCount+=p,this.reportedMeshes+=p,this.report.length<UC&&this.report.push({mesh:`${m.name} ×${p}`,shape:l,material:u,color:`#`+s.color.getHexString(),map:s.map?`yes`:`-`,uv:o.getAttribute(`uv`)?`yes`:`NO`,normals:o.getAttribute(`normal`)?`yes`:`NO`,emissive:s.emissiveIntensity>0?`#${s.emissive.getHexString()}×${s.emissiveIntensity}`:`-`,size:`instanced`,tris:d})},s=(e,t)=>{t&&t.triangles>0&&o(e,this._batchGeometry(t),t.material,null,`merged`,`-`,t.triangles)};for(let{name:t,list:n,template:r}of this._samePlacementGroups(e)){if(!r){this.droppedNoTemplate+=n.count,this.warn(`ObjectInstance "${t}" has no template — ${n.count.toLocaleString()} placement(s) dropped`);continue}let e=0;for(let t of r)t.type!==`plymesh`&&e++;let i=e>=2?new Map:null;for(let e of r){if(this._overBudget()){this.skippedForBudget+=n.count;continue}let[r,a]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);if(!r)continue;if(i&&e.type!==`plymesh`&&r.getAttribute(`position`).count<=YC){this._geometryCache.delete(e);let t=this._appendToBatch(i,e,r,a,e.relativeCTM||e.ctm);this._releaseMerged(e,r),s(n,t);continue}let c=this._accountGeometry(r);o(n,r,this._materialForGeometry(e,r,a,`instances_${t}`),e.relativeCTM||e.ctm,e.type,e.material?.type||`diffuse`,c)}if(i)for(let e of i.values())s(n,e[0]),s(n,e[1]);hS(n.matrices),hS(n.matricesEnd)}}_samePlacementGroups(e){let t=[],n=new Map;for(let[r,i]of e.instances){let a=e.objects.get(r);if(!a||i.matricesEnd){t.push({name:r,list:i,template:a});continue}let o=`${i.count}:${Array.prototype.join.call(i.matrices.subarray(0,16),`,`)}`,s=n.get(o);s||n.set(o,s=[]);let c=s.find(e=>ew(e.list,i));if(c){c.template===e.objects.get(c.name)&&(c.template=c.template.slice());for(let e of a)c.template.push(e);hS(i.matrices);continue}let l={name:r,list:i,template:a};s.push(l),t.push(l)}return t}async _buildAnimatedPlacements(e,t){let n=e.animatedInstances??[];for(let i=0;i<n.length;i++){let{name:a,motion:o}=n[i],s=e.objects.get(a);if(!s){this.droppedNoTemplate++;continue}if(this._overBudget()){this.skippedForBudget+=n.length-i;break}let c=new r.Group;c.name=`placement_${i}`;let l=Array.from(o.matrices.subarray(0,16));new r.Matrix4().fromArray(this.convertHandedness?GS(RC,l):l).decompose(c.position,c.quaternion,c.scale);for(let e=0;e<s.length;e++){let t=s[e],[n,r]=await Promise.all([this._buildGeometry(t),this._getMaterial(t)]);if(!n)continue;let i=this._meshFromGeometry(t,n,r,t.relativeCTM||t.ctm,`${c.name}_${e}`,!0);i&&c.add(i)}c.children.length!==0&&(t.add(c),this._animate(c,o))}}_animate(e,t){t.visible&&(e.visible=t.visible[0]===1),this._animated.push({node:e,motion:t})}_buildClip(e,t){let n=[];for(let{node:e,motion:t}of this._animated)if(this._transformTracks(n,e.name,t,(e,t)=>{let n=Array.from(e.subarray(t,t+16));return this.convertHandedness?GS(RC,n):n}),t.visible){let i=t.times,a=i.map((e,t)=>t===0?0:(i[t-1]+e)/2);n.push(new r.BooleanKeyframeTrack(`${e.name}.visible`,a,Array.from(t.visible,e=>e===1)))}let i=e.camera?.motion;if(t&&i){let e=new r.PerspectiveCamera;if(this._transformTracks(n,t.name,i,(t,n)=>(this._poseCamera(e,t.subarray(n,n+16)),e.updateMatrix(),e.matrix.elements)),i.fov&&t.isPerspectiveCamera){let e=Array.from(i.fov,e=>this._verticalFov({fov:{type:`float`,value:[e]}},t.aspect));n.push(new r.NumberKeyframeTrack(`${t.name}.fov`,i.times.slice(),e))}}for(let e of n)e.optimize();return n.length===0?[]:[new r.AnimationClip(e.animation.name,e.animation.duration,n)]}_transformTracks(e,t,n,i){let a=n.times.length,o=new Float32Array(a*3),s=new Float32Array(a*4),c=new Float32Array(a*3),l=new r.Matrix4,u=new r.Vector3,d=new r.Quaternion,f=new r.Vector3;for(let e=0;e<a;e++)l.fromArray(i(n.matrices,e*16)).decompose(u,d,f),e>0&&d.x*s[e*4-4]+d.y*s[e*4-3]+d.z*s[e*4-2]+d.w*s[e*4-1]<0&&d.set(-d.x,-d.y,-d.z,-d.w),u.toArray(o,e*3),d.toArray(s,e*4),f.toArray(c,e*3);let p=(e,t)=>{for(let n=t;n<e.length;n++)if(e[n]!==e[n%t])return!0;return!1};p(o,3)&&e.push(new r.VectorKeyframeTrack(`${t}.position`,n.times.slice(),o)),p(s,4)&&e.push(new r.QuaternionKeyframeTrack(`${t}.quaternion`,n.times.slice(),s)),p(c,3)&&e.push(new r.VectorKeyframeTrack(`${t}.scale`,n.times.slice(),c))}async _buildShapeMesh(e,t,n){let[r,i]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);return r?this._meshFromGeometry(e,r,i,t,n):null}_meshFromGeometry(e,t,n,i,a,o=!1){let s=!!t.getAttribute(`uv`),c=this._materialForGeometry(e,t,n,a),l=new r.Mesh(t,c);l.name=a;let u=this.convertHandedness&&!o?GS(RC,i):i;new r.Matrix4().fromArray(u).decompose(l.position,l.quaternion,l.scale),l.updateMatrix(),t.boundingBox||t.computeBoundingBox();let d=t.boundingBox?t.boundingBox.clone().applyMatrix4(l.matrix).getSize(new r.Vector3):new r.Vector3,f=this._accountGeometry(t);return this.placementCount++,this.reportedMeshes++,this.report.length<UC&&this.report.push({mesh:a,shape:e.type,material:e.material?.type||`diffuse`,color:`#`+c.color.getHexString(),map:c.map?`yes`:`-`,uv:s?`yes`:`NO`,normals:t.getAttribute(`normal`)?`yes`:`NO`,emissive:c.emissiveIntensity>0?`#${c.emissive.getHexString()}×${c.emissiveIntensity}`:`-`,size:`${d.x.toFixed(2)}×${d.y.toFixed(2)}×${d.z.toFixed(2)}`,tris:f}),l}_materialForGeometry(e,t,n,r){if(!n.map||t.getAttribute(`uv`))return n;let i=this._noUVMaterials.get(n);return i||(this.warn(`${r} (${e.type}, "${e.material?.type||`diffuse`}") has a texture map but no UVs — dropping map, using base color`),i=n.clone(),i.map=null,this._noUVMaterials.set(n,i)),i}_mergeShape(e,t,n,r){this.reportedMeshes++;let i=this.convertHandedness?GS(RC,e.ctm):e.ctm,a=this._appendToBatch(this._batches,e,t,n,i);this._releaseMerged(e,t),a&&this._flushBatch(a,r)}_releaseMerged(e,t){if(!this._keepShapes?.has(e)){for(let e in t.attributes)hS(t.attributes[e].array);hS(t.index?.array);for(let t in e.params)ArrayBuffer.isView(e.params[t]?.value)&&hS(e.params[t].value)}}_appendToBatch(e,t,n,r,i){let a=this._materialForGeometry(t,n,r,`merged shape`),o=n.getAttribute(`position`),s=n.getAttribute(`normal`),c=n.getAttribute(`uv`),l=n.index,u=o.count;this.triangleCount+=(l?l.count:u)/3,this.mergedShapes++;let d=e.get(a);d||e.set(a,d=[null,null]);let f=+!!c,p=d[f];p||(d[f]=p={material:a,positions:new Float32Array(3072),normals:new Float32Array(3072),uvs:c?new Float32Array(2048):null,indices:new Uint32Array(3072),vertexCount:0,indexCount:0,triangles:0});let m=i,h=$S(m),g=p.vertexCount;p.positions=VC(p.positions,(g+u)*3),p.normals=VC(p.normals,(g+u)*3),c&&(p.uvs=VC(p.uvs,(g+u)*2));let _=o.array,v=p.positions,y=s?s.array:null,b=p.normals;for(let e=0;e<u;e++){let t=e*3,n=(g+e)*3,r=_[t],i=_[t+1],a=_[t+2];if(v[n]=m[0]*r+m[4]*i+m[8]*a+m[12],v[n+1]=m[1]*r+m[5]*i+m[9]*a+m[13],v[n+2]=m[2]*r+m[6]*i+m[10]*a+m[14],!y)continue;let o=y[t],s=y[t+1],c=y[t+2],l=h[0]*o+h[1]*s+h[2]*c,u=h[4]*o+h[5]*s+h[6]*c,d=h[8]*o+h[9]*s+h[10]*c,f=Math.hypot(l,u,d);f>0&&(l/=f,u/=f,d/=f),b[n]=l,b[n+1]=u,b[n+2]=d}c&&p.uvs.set(c.array.subarray(0,u*2),g*2);let x=l?l.count:u;p.indices=VC(p.indices,p.indexCount+x);let S=p.indices,C=l?l.array:null;for(let e=0;e<x;e++)S[p.indexCount+e]=g+(C?C[e]:e);return p.vertexCount+=u,p.indexCount+=x,p.triangles+=x/3,p.triangles>=XC?(d[f]=null,p):null}_batchGeometry(e){let t=new r.BufferGeometry;return t.setAttribute(`position`,new r.Float32BufferAttribute(gS(e.positions,e.vertexCount*3),3)),t.setAttribute(`normal`,new r.Float32BufferAttribute(gS(e.normals,e.vertexCount*3),3)),e.uvs&&t.setAttribute(`uv`,new r.Float32BufferAttribute(gS(e.uvs,e.vertexCount*2),2)),t.setIndex(new r.Uint32BufferAttribute(gS(e.indices,e.indexCount),1)),e.positions=e.normals=e.uvs=e.indices=null,t}_flushBatch(e,t){if(!e||e.triangles===0)return;let n=new r.Mesh(this._batchGeometry(e),e.material);n.name=`merged_${this._mergedBatches++}`,n.frustumCulled=!1,t.add(n),this.placementCount++,this.report.length<UC&&this.report.push({mesh:n.name,shape:`merged`,material:`-`,color:`#`+e.material.color.getHexString(),map:e.material.map?`yes`:`-`,uv:e.uvs?`yes`:`NO`,normals:`yes`,emissive:e.material.emissiveIntensity>0?`#${e.material.emissive.getHexString()}×${e.material.emissiveIntensity}`:`-`,size:`merged`,tris:e.triangles})}_buildGeometry(e){let t=this._geometryCache.get(e);return t||this._geometryCache.set(e,t=this._createGeometry(e)),t}async _createGeometry(e){switch(e.type){case`trianglemesh`:return this._triangleMesh(e.params);case`bilinearmesh`:return this._bilinearMesh(e.params);case`loopsubdiv`:return this._loopSubdiv(e.params);case`curve`:return this._curve(e.params);case`plymesh`:return this._plyMesh(e.params);case`sphere`:return this._sphere(e.params);case`disk`:return this._disk(e.params);default:return this.warn(`shape "${e.type}" not supported — skipped`),null}}_triangleMesh(e){let t=e.P?.value;if(!t||t.length<9)return this.warn(`trianglemesh missing P`),null;let n=new r.BufferGeometry;n.setAttribute(`position`,new r.Float32BufferAttribute(HC(t),3));let i=e.N?.value;i&&i.length===t.length&&n.setAttribute(`normal`,new r.Float32BufferAttribute(HC(i),3));let a=(e.uv||e.st)?.value;a&&a.length===t.length/3*2&&n.setAttribute(`uv`,new r.Float32BufferAttribute(HC(a),2));let o=e.indices?.value;return o&&o.length&&n.setIndex(BC(o)),i||n.computeVertexNormals(),n}_curve(e){let t=e.P?.value;if(!t||t.length<12)return this.warn(`curve needs at least 4 control points`),null;let n=Math.round(dC(e,`degree`,3));if(n!==3)return this.warn(`curve degree ${n} not supported — only cubic`),null;let i=fC(e,`type`,`flat`),a=dC(e,`width`,1),o=LC({P:t,basis:fC(e,`basis`,`bezier`),width0:dC(e,`width0`,a),width1:dC(e,`width1`,a),N:e.N?.value||null,steps:this.curveSteps,sides:this.curveSides??QC[i]??1,tolerance:this.curveTolerance});if(!o)return this.warn(`curve could not be tessellated`),null;let s=new r.BufferGeometry;return s.setAttribute(`position`,new r.Float32BufferAttribute(o.positions,3)),s.setIndex(new r.Uint32BufferAttribute(o.indices,1)),s.computeVertexNormals(),s}_loopSubdiv(e){let t=e.P?.value,n=e.indices?.value;if(!t||t.length<9||!n||n.length<3)return this.warn(`loopsubdiv missing P/indices`),null;let i=Math.max(0,Math.min(6,Math.round(dC(e,`levels`,3)))),{positions:a,indices:o,levels:s}=SC(t,n,i);s<i&&this.warn(`loopsubdiv refined ${s}/${i} levels — the control mesh is too dense for the triangle budget`);let c=new r.BufferGeometry;return c.setAttribute(`position`,new r.Float32BufferAttribute(a,3)),c.setIndex(new r.Uint32BufferAttribute(o,1)),c.computeVertexNormals(),c}_bilinearMesh(e){let t=e.P?.value,n=e.indices?.value;if(!t||!n)return this.warn(`bilinearmesh missing P/indices`),null;let i=[];for(let e=0;e+3<n.length;e+=4){let[t,r,a,o]=[n[e],n[e+1],n[e+2],n[e+3]];i.push(t,r,a,t,a,o)}let a=new r.BufferGeometry;return a.setAttribute(`position`,new r.Float32BufferAttribute(Float32Array.from(t),3)),a.setIndex(i),a.computeVertexNormals(),a}_plyMesh(e){let t=fC(e,`filename`,null);if(!t)return this.warn(`plymesh missing filename`),null;let n=this._plyCache.get(t);return n||this._plyCache.set(t,n=this._decodePly(t)),n}async _decodePly(e){try{let t=await this.resolvePLY(e);return t?(t.getAttribute(`normal`)||t.computeVertexNormals(),t):(this.warn(`plymesh file not found: ${e}`),null)}catch(t){return this.warn(`failed to load plymesh ${e}: ${t.message}`),null}}_sphere(e){return new r.SphereGeometry(dC(e,`radius`,1),48,32)}_disk(e){let t=dC(e,`radius`,1),n=dC(e,`innerradius`,0),i=dC(e,`height`,0),a=[],o=[];for(let e=0;e<48;e++){let r=e/48*Math.PI*2,s=(e+1)/48*Math.PI*2,c=a.length/3;a.push(Math.cos(r)*n,Math.sin(r)*n,i),a.push(Math.cos(r)*t,Math.sin(r)*t,i),a.push(Math.cos(s)*t,Math.sin(s)*t,i),a.push(Math.cos(s)*n,Math.sin(s)*n,i),o.push(c,c+1,c+2,c,c+2,c+3)}let s=new r.BufferGeometry;return s.setAttribute(`position`,new r.Float32BufferAttribute(Float32Array.from(a),3)),s.setIndex(o),s.computeVertexNormals(),s}async _getMaterial(e){let t=this._materialCache.get(e.material);if(t||(t=new Map,this._materialCache.set(e.material,t)),t.has(e.areaLight))return t.get(e.areaLight);let n={resolveNamedTexture:e=>this._resolveNamedTexture(e),namedMaterials:this.ir.namedMaterials,warn:e=>this.warn(e)},r=await gC(e.material,n);e.areaLight&&await this._applyAreaLight(r,e.areaLight,n);let i=this._dedupeMaterial(r);return t.set(e.areaLight,i),i}_dedupeMaterial(e){let t=e.color,n=e.emissive,r=`${t.r},${t.g},${t.b}|${n.r},${n.g},${n.b}|${e.emissiveIntensity}|${e.map?e.map.uuid:`-`}|${e.roughness}|${e.metalness}|${e.transmission}|${e.ior}|${e.thickness}|${e.clearcoat}|${e.clearcoatRoughness}|${e.opacity}|${e.side}`;return this._materialBySignature.get(r)||(this._materialBySignature.set(r,e),e)}async _applyAreaLight(e,t,n){let r=await pC(t.params,`L`,n,[1,1,1]),i=dC(t.params,`scale`,1),a=r.rgb||[1,1,1];e.emissive.setRGB(a[0],a[1],a[2]),e.emissiveIntensity=i}async _resolveNamedTexture(e){if(this._textureCache.has(e))return this._textureCache.get(e);let t=this.ir.namedTextures.get(e),n=null;if(!t)this.warn(`named texture "${e}" not defined`);else if(t.class===`imagemap`){let r=fC(t.params,`filename`,null);if(r)try{let t=await this.resolveImage(r);t?n={texture:t}:this.warn(`image not found for texture "${e}": ${r}`)}catch(t){this.warn(`failed to load texture "${e}" (${r}): ${t.message}`)}}else if(t.class===`constant`){let e=t.params.value;e&&e.type===`rgb`?n={constant:[e.value[0],e.value[1],e.value[2]]}:e&&(n={constant:[e.value[0],e.value[0],e.value[0]]})}else if(t.class===`scale`)n=await this._resolveScaleTexture(e,t);else{let r=this._colorFromLikeNamedMaterial(e);r?(n={constant:r.rgb},this._recoveredColors++):this.warn(`texture class "${t.class}" not supported (texture "${e}")`)}return this._textureCache.set(e,n),n}_colorFromLikeNamedMaterial(e){for(let t of nw(e)){let e=(this.ir?.namedMaterials?.get(t))?.params?.reflectance;if(e&&(e.type===`rgb`||e.type===`color`))return{name:t,rgb:[e.value[0],e.value[1],e.value[2]]}}return null}async _resolveScaleTexture(e,t){let n=t.params.tex,r=null;if(n?.type===`texture`&&typeof n.value[0]==`string`)r=await this._resolveNamedTexture(n.value[0]);else if(n?.type===`rgb`||n?.type===`color`)r={constant:[n.value[0],n.value[1],n.value[2]]};else if(n?.type===`float`){let e=n.value[0];r={constant:[e,e,e]}}let i=t.params.scale,a=[1,1,1];if(i?.type===`rgb`||i?.type===`color`)a=[i.value[0],i.value[1],i.value[2]];else if(i?.type===`float`){let e=i.value[0];a=[e,e,e]}if(r?.texture){let e=r.constant||[1,1,1];return{texture:r.texture,constant:[e[0]*a[0],e[1]*a[1],e[2]*a[2]]}}let o=r?.constant||[1,1,1];return{constant:[o[0]*a[0],o[1]*a[1],o[2]*a[2]]}}_buildCamera(e,t){let n=t&&t.yresolution?t.xresolution/t.yresolution:16/9,i;if(e.type===`orthographic`){let t=e.params?.screenwindow?.value,a=t?.length===4?(t[3]-t[2])/2:Math.max(1,1/n);i=new r.OrthographicCamera(-a*n,a*n,a,-a,.01,1e4)}else i=new r.PerspectiveCamera(this._verticalFov(e.params,n),n,.01,1e4);return i.name=`PBRT Camera`,this._poseCamera(i,e.cameraToWorld),i.updateMatrixWorld(!0),i}_poseCamera(e,t){let n=t,i=new r.Vector3(n[12],n[13],n[14]),a=new r.Vector3(n[8],n[9],n[10]),o=new r.Vector3(n[4],n[5],n[6]);this.convertHandedness&&(i.z*=-1,a.z*=-1,o.z*=-1),e.up.copy(o.normalize()),e.position.copy(i),e.scale.set(1,1,1),e.lookAt(i.clone().add(a)),US(t)>0!==this.convertHandedness&&(e.scale.x=-1)}_verticalFov(e,t){let n=dC(e,`fov`,90);if(t>=1)return n;let r=n*Math.PI/180;return 2*Math.atan(Math.tan(r/2)/t)*180/Math.PI}_equirectFromInfiniteLight(e,t,n,i){let a=e.image;if(!a?.width||a.width!==a.height)return a?.width!==a?.height&&this.warn(`infinite-light image "${i}" is ${a?.width}x${a?.height}, not square — read as equirectangular, but pbrt would read it as equal-area octahedral`),null;let o=null;if(a.data){let e=a.data.length/(a.width*a.height);if(!Number.isInteger(e)||e<3)return null;o={data:a.data,width:a.width,height:a.height,channels:e,bottomUp:!0}}else if(o=tw(a,e.colorSpace===r.SRGBColorSpace),!o)return this.warn(`infinite-light image "${i}" could not be read back for octahedral conversion`),null;let{data:s,width:c,height:l}=EC(o,t.ctm,n),u=new r.DataTexture(s,c,l,r.RGBAFormat,r.FloatType);return u.mapping=r.EquirectangularReflectionMapping,u.minFilter=r.LinearFilter,u.magFilter=r.LinearFilter,u.needsUpdate=!0,u}async _buildEnvironment(e){let t=e.find(e=>e.type===`infinite`);if(!t)return null;let n=dC(t.params,`scale`,1),i=fC(t.params,`filename`,null);if(i)try{let e=await this.resolveEnvironment(i);if(e){let a=this._equirectFromInfiniteLight(e,t,n,i);return a?{texture:a}:(e.mapping=r.EquirectangularReflectionMapping,{texture:e})}this.warn(`infinite-light image not found: ${i}`)}catch(e){this.warn(`failed to load infinite-light image ${i}: ${e.message}`)}let a=((await pC(t.params,`L`,{resolveNamedTexture:async()=>null,warn:e=>this.warn(e)},[1,1,1])).rgb||[1,1,1]).map(e=>e*n),o=new Float32Array(8);for(let e=0;e<2;e++)o[e*4+0]=a[0],o[e*4+1]=a[1],o[e*4+2]=a[2],o[e*4+3]=1;let s=new r.DataTexture(o,2,1,r.RGBAFormat,r.FloatType);return s.mapping=r.EquirectangularReflectionMapping,s.minFilter=r.LinearFilter,s.magFilter=r.LinearFilter,s.needsUpdate=!0,{texture:s}}_reportUnsupportedLights(e){for(let t of e)t.type!==`infinite`&&this.warn(`light "${t.type}" not supported (only infinite lights and emissive area lights are mapped)`)}},iw=1e3,aw=2048,ow=1e5;function sw(e){let t=e[0],n=e=>{let t=e.lastIndexOf(`/`),n=/^(.*?)(\d+)\.pbrt$/i.exec(e.slice(t+1));return n?{group:e.slice(0,t+1)+`\0`+n[1].toLowerCase(),number:parseInt(n[2],10)}:null},r=t?n(t):null;if(!r)return null;let i=new Map;for(let t of e){let e=n(t);e&&e.group===r.group&&!i.has(e.number)&&i.set(e.number,t)}return i.size<2?null:[...i].sort((e,t)=>e[0]-t[0]).slice(0,iw).map(([e,t])=>({path:t,number:e}))}function cw(e){let t=e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array?new Uint32Array(e.buffer,e.byteOffset,e.length):null;t||=new Uint32Array(Float32Array.from(e).buffer);let n=2166136261;for(let e=0;e<t.length;e++)n=Math.imul(n^t[e],16777619),n^=n>>>15;return(n>>>0).toString(36)+`:`+e.length}function lw(e){let t=``;for(let n of Object.keys(e).sort()){let{type:r,value:i}=e[n],a=ArrayBuffer.isView(i)||i.length>16&&typeof i[0]==`number`;t+=`${r} ${n}=${a?`#`+cw(i):i.join(`,`)};`}return t}var uw=class{constructor(e){this.materialNames=new Map;for(let[t,n]of e.namedMaterials)this.materialNames.set(n,t);this.cache=new Map}of(e){return`${e.type}|${+!!e.reverseOrientation}|${lw(e.params)}|${this._material(e.material)}|${this._light(e.areaLight)}`}_material(e){if(!e)return`-`;let t=this.cache.get(e);if(t===void 0){let n=this.materialNames.get(e)??e._missingRef;t=n===void 0?`I:`+e.type+`:`+lw(e.params):`N:`+n,this.cache.set(e,t)}return t}_light(e){if(!e)return`-`;let t=this.cache.get(e);return t===void 0&&this.cache.set(e,t=`L:`+e.type+`:`+lw(e.params)),t}};function dw(e,t){let n=new Int32Array(t.length).fill(-1),r=0;for(;r<e.length&&r<t.length&&e[r]===t[r];)n[r]=r,r++;let i=e.length,a=t.length;for(;i>r&&a>r&&e[i-1]===t[a-1];)n[--a]=--i;return r<i&&r<a&&!fw(e,r,i,t,r,a,n)&&mw(e,r,i,t,r,a,n),n}function fw(e,t,n,r,i,a,o){let s=n-t,c=a-i,l=Math.min(s+c,aw),u=l+1,d=new Int32Array(2*l+3),f=[];for(let n=0;n<=l;n++){for(let a=-n;a<=n;a+=2){let l=a===-n||a!==n&&d[u+a-1]<d[u+a+1]?d[u+a+1]:d[u+a-1]+1,p=l-a;for(;l<s&&p<c&&e[t+l]===r[i+p];)l++,p++;if(d[u+a]=l,l>=s&&p>=c)return f.push(d.slice(u-n,u+n+1)),pw(f,s,c,t,i,o),!0}f.push(d.slice(u-n,u+n+1))}return!1}function pw(e,t,n,r,i,a){let o=t,s=n;for(let t=e.length-1;t>0;t--){let n=e[t-1],c=e=>n[e+t-1],l=o-s,u=l===-t||l!==t&&c(l-1)<c(l+1)?l+1:l-1,d=c(u),f=d-u;for(;o>d&&s>f;)a[i+--s]=r+--o;o=d,s=f}for(;o>0&&s>0;)a[i+--s]=r+--o}function mw(e,t,n,r,i,a,o){let s=new Map;for(let r=t;r<n;r++){let t=s.get(e[r]);t?t.push(r):s.set(e[r],[r])}let c=new Map;for(let e=i;e<a;e++){let t=s.get(r[e]);if(!t)continue;let n=c.get(r[e])??0;n<t.length&&(o[e]=t[n],c.set(r[e],n+1))}}function hw(e,t,n,r){for(let i=0;i<16;i++)if(e[t+i]!==n[r+i])return!1;return!0}function gw(e,t,n){let r=e.length,i=new Float32Array(16*r),a=null,o=-1;for(let e=0;e<r;e++)if(t(e)){if(i.set(n(e),e*16),o<0)for(let t=0;t<e;t++)i.copyWithin(t*16,e*16,e*16+16);o=e}else a??=new Uint8Array(r).fill(1),a[e]=0,o>=0&&i.copyWithin(e*16,o*16,o*16+16);return{times:e,matrices:i,visible:a}}function _w(e){if(e.visible)return!1;let t=e.matrices;for(let e=16;e<t.length;e+=16)if(!hw(t,0,t,e))return!1;return!0}var vw=class{constructor(e,t){this.times=Float32Array.from(e),this.name=t,this.base=null,this.frame=-1,this.keyIds=new Map,this.tracks=[],this.prev=null,this.placements=new Map,this.templates=new Map,this.cameras=[],this.warnings=new Set}addFrame(e){let t=++this.frame;t===0?this.base=e:this._adoptDefinitions(e);for(let t of e.warnings)this.warnings.add(t);let n=new uw(e),r=new Int32Array(e.shapes.length);for(let t=0;t<r.length;t++){let i=n.of(e.shapes[t]),a=this.keyIds.get(i);a===void 0&&this.keyIds.set(i,a=this.keyIds.size),r[t]=a}let i=this.prev?dw(this.prev.keys,r):null,a=Array(r.length);for(let o=0;o<r.length;o++){let r=e.shapes[o],s=i&&i[o]>=0?this.prev.tracks[i[o]]:null;s?(s.last=t,s.ctms?s.ctms.push(r.ctm):r.ctm!==s.shape.ctm&&!hw(r.ctm,0,s.shape.ctm,0)&&(s.ctms=Array(t-s.first).fill(s.shape.ctm),s.ctms.push(r.ctm))):(s={shape:r,first:t,last:t,ctms:null},t>0&&this._adoptMaterial(r,n.materialNames),this.tracks.push(s)),a[o]=s}this.prev={keys:r,tracks:a},this._addPlacements(e,t,this._resolveTemplates(e,t,n)),this.cameras.push(e.camera?{cameraToWorld:e.camera.cameraToWorld,fov:e.camera.params?.fov?.value?.[0]}:null)}_adoptDefinitions(e){for(let[t,n]of e.namedMaterials)this.base.namedMaterials.has(t)||this.base.namedMaterials.set(t,n);for(let[t,n]of e.namedTextures)this.base.namedTextures.has(t)||this.base.namedTextures.set(t,n)}_resolveTemplates(e,t,n){let r=new Map;for(let[i,a]of e.objects){let e=``;for(let t of a)e+=n.of(t)+`@`+Array.prototype.join.call(t.relativeCTM||t.ctm,`,`)+`;`;let o=i+`\0`+e,s=this.templates.get(o);if(s===void 0&&(s=t===0||!this.base.objects.has(i)?i:`${i} @${t}`,this.templates.set(o,s),t>0)){for(let e of a)this._adoptMaterial(e,n.materialNames);this.base.objects.set(s,a)}r.set(i,s)}return r}_adoptMaterial(e,t){let n=e.material&&t.get(e.material);n!==void 0&&(e.material=this.base.namedMaterials.get(n)??e.material)}_addPlacements(e,t,n){for(let[r,i]of e.instances){let e=n.get(r)??r,a=this.placements.get(e);if(a||this.placements.set(e,a={counts:new Int32Array(this.times.length),diffs:new Map}),a.counts[t]=i.count,t===0)continue;let o=this.base.instances.get(e),s=o?.count??0;for(let e=0;e<i.count;e++){let n=e*16;if(e<s&&hw(i.matrices,n,o.matrices,n))continue;let r=a.diffs.get(e);r||a.diffs.set(e,r=new Map),r.set(t,i.matrices.slice(n,n+16))}}}finish(){let e=this.base,t=this.times,n=this.frame+1;e.shapes=this.tracks.map(e=>{let{shape:r,first:i,last:a,ctms:o}=e;return(i>0||a<n-1||o)&&(r.motion=gw(t,e=>e>=i&&e<=a,e=>o?o[e-i]:r.ctm)),r}),e.warnings=[...this.warnings],e.animatedInstances=this._finishPlacements(e,t,n);let r=this.cameras;if(r[0]&&r.every(Boolean)){let n=gw(t,()=>!0,e=>r[e].cameraToWorld),i=r.map(e=>e.fov??r[0].fov),a=i.some(e=>e!==i[0]);(!_w(n)||a)&&(e.camera.motion={...n,fov:a?Float32Array.from(i):null})}return e.animation={name:this.name,duration:t[n-1],frames:n},e}_finishPlacements(e,t,n){let r=[],i=0;for(let[a,{counts:o,diffs:s}]of this.placements){let c=e.instances.get(a),l=c?.count??0,u=Math.max(...o.subarray(0,n)),d=[];for(let e=0;e<u;e++){let u=s.get(e),f=!!u;for(let t=0;t<n&&!f;t++)f=e>=o[t];if(f&&r.length<ow){let n=gw(t,t=>e<o[t],t=>u?.get(t)??c.matrices.subarray(e*16,e*16+16));r.push({name:a,motion:n})}else f&&i++,e<l&&d.push(e)}if(c&&d.length!==l){let t=new Float32Array(d.length*16);d.forEach((e,n)=>t.set(c.matrices.subarray(e*16,e*16+16),n*16)),e.instanceCount-=l-d.length,c.matrices=t,c.matricesEnd=null,c.count=d.length}}return i>0&&e.warnings.push(`${i.toLocaleString()} moving placement(s) past ${ow.toLocaleString()} left static`),r}};function yw(e){if(!e.hasMotion)return e;let{start:t,end:n}=e.transformTimes,r=n-t;if(!(r>0))return e;let i=Float32Array.of(0,r),a=(e,t,n,r)=>{let a=new Float32Array(32);for(let i=0;i<16;i++)a[i]=e[t+i],a[16+i]=n[r+i];return{times:i,matrices:a,visible:null}};for(let t of e.shapes)t.ctmEnd&&(t.motion=a(t.ctm,0,t.ctmEnd,0));e.animatedInstances=[];for(let t of e.instances.values()){if(!t.matricesEnd)continue;let n=[];for(let r=0;r<t.count;r++){let i=r*16;hw(t.matrices,i,t.matricesEnd,i)||e.animatedInstances.length>=ow?n.push(r):e.animatedInstances.push({name:t.name,motion:a(t.matrices,i,t.matricesEnd,i)})}if(n.length!==t.count){let r=new Float32Array(n.length*16);n.forEach((e,n)=>r.set(t.matrices.subarray(e*16,e*16+16),n*16)),e.instanceCount-=t.count-n.length,t.matrices=r,t.count=n.length}t.matricesEnd=null}return e.camera?.cameraToWorldEnd&&(e.camera.motion={...a(e.camera.cameraToWorld,0,e.camera.cameraToWorldEnd,0),fov:null}),e.animation={name:`Shutter motion`,duration:r,frames:2},e}var bw=2e6,xw=new TextDecoder;function Sw(e){let t=e.replace(/\\/g,`/`).split(`/`),n=[];for(let e of t)e===``||e===`.`||(e===`..`?n.pop():n.push(e));return n.join(`/`)}function Cw(e,t){return!e||t.startsWith(`/`)?Sw(t):Sw(`${e}/${t}`)}var ww=class{constructor(e,t=null){this.entries=e,this.source=t,this.records=[],this.byPath=new Map,this.byBase=new Map;let n=(e,t,n)=>{let r=Sw(e).toLowerCase();if(this.byPath.has(r))return;let i={key:e,norm:r,bytes:t,lazy:n};this.records.push(i),this.byPath.set(r,i);let a=r.split(`/`).pop(),o=this.byBase.get(a);o?o.push(i):this.byBase.set(a,[i])};for(let t in e)n(t,e[t],!1);for(let e of t?.listing??[])e.offset!==void 0&&n(e.path,null,!0)}async read(e){return e?e.bytes?e.bytes:!e.lazy||!this.source?null:this.source.read(e.key):null}async readHead(e,t){return e?e.bytes?e.bytes.subarray(0,t):!e.lazy||!this.source?null:this.source.readHead?this.source.readHead(e.key,t):this.source.read(e.key):null}async readPath(e,t=null){let n=t!==null&&this.findRecord(Cw(t,e))||this.findRecord(e);return this.read(n)}release(e){e.bytes=null,delete this.entries[e.key]}releasePath(e,t=null,n=null){let r=t!==null&&this.findRecord(Cw(t,e))||this.findRecord(e);r?.lazy&&(this.release(r),hS(n))}releaseScenes(){for(let e of this.records)e.norm.endsWith(`.pbrt`)&&this.release(e)}findRecord(e){let t=Sw(e).toLowerCase();if(this.byPath.has(t))return this.byPath.get(t);let n=this.byBase.get(t.split(`/`).pop());return n?n.find(e=>e.norm.endsWith(`/`+t))||(n.length===1?n[0]:null):null}find(e){return this.findRecord(e)?.bytes??null}};function Tw(e,t,n=0){let r=t[0],i=e.length-t.length;outer:for(let a=n;a<=i;a++)if(e[a]===r){for(let n=1;n<t.length;n++)if(e[a+n]!==t[n])continue outer;return a}return-1}var Ew=e=>Uint8Array.from(e,e=>e.charCodeAt(0)),Dw=4*1024*1024,Ow=Ew(`WorldBegin`),kw=[Ew(`Include`),Ew(`Import`)];function Aw(e,t){for(let n=t-1;n>=0;n--){let t=e[n];if(t===10)return!0;if(t!==32&&t!==9)return!1}return!0}function jw(e){for(let t=Tw(e,Ow);t>=0;t=Tw(e,Ow,t+1))if(Aw(e,t))return!0;return!1}function Mw(e,t){for(let n of kw)for(let r=Tw(e,n);r>=0;r=Tw(e,n,r+1)){if(!Aw(e,r))continue;let i=r+n.length;for(;i<e.length&&(e[i]===32||e[i]===9);)i++;if(e[i]!==34)continue;let a=++i;for(;i<e.length&&e[i]!==34&&e[i]!==10;)i++;if(e[i]!==34)continue;let o=xw.decode(e.subarray(a,i));t.add(Sw(o).toLowerCase().split(`/`).pop())}}function Nw(e){let t=Object.keys(e).filter(e=>e.toLowerCase().endsWith(`.pbrt`));if(t.length<=1)return t;let n=new Set,r=new Map;for(let i of t){let t=e[i];r.set(i,jw(t)),Mw(t,n)}return Pw(t,r,n)}function Pw(e,t,n){let r=(e,t)=>{let n=e.filter(t);return n.length?n:e},i=r(e,e=>t.get(e));return i=r(i,e=>!n.has(e.toLowerCase().split(`/`).pop())),i=r(i,e=>/(^|\/)(scene|main)\.pbrt$/i.test(e)),i.sort((e,t)=>{let n=e.split(`/`).length,r=t.split(`/`).length;return n===r?e.length===t.length?e<t?-1:+(e>t):e.length-t.length:n-r})}function Fw(e){return Nw(e)[0]||null}async function Iw(e){let t=e.records.filter(e=>e.norm.endsWith(`.pbrt`));if(t.length===0)return[];if(t.length===1)return[t[0].key];let n=async n=>{let r=new Set,i=new Map,a=!1;for(let o of t){let t=await n(o);t&&(i.set(o.key,jw(t)),Mw(t,r),t.length>=Dw&&(a=!0),o.lazy&&(e.release(o),hS(t)))}return{included:r,worlds:i,cut:a}},r=await n(t=>e.readHead(t,Dw)),{included:i,worlds:a}=[...r.worlds.values()].filter(Boolean).length===1||!r.cut?r:await n(t=>e.read(t));return Pw(t.map(e=>e.key),a,i)}async function Lw(e){let{vfs:t,source:n,plyParser:r,imageFromBytes:i,envFromBytes:a,convertHandedness:o}=e,s=new ww(t,n),c=[],l=await Iw(s);if(l.length===0)throw Error(`PBRT loader: no .pbrt file found in archive`);let u=e.entryPath&&l.includes(e.entryPath)?e.entryPath:null;e.entryPath&&!u&&c.push(`PBRT entry "${e.entryPath}" is not a scene in this archive — auto-detecting instead`);let d=u||l[0],f=async t=>{let n=await s.readPath(t);if(!n)throw Error(`PBRT loader: entry "${t}" not readable`);let r=await new sC({resolveInclude:(e,t)=>s.readPath(e,t),releaseInclude:(e,t,n)=>s.releasePath(e,t,n),maxPlacements:e.maxPlacements,instanceIncludes:e.instanceIncludes}).parse(n,t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)):``);return s.releasePath(t,null,n),r},p=performance.now(),m=!u&&e.animation!==!1?sw(l):null,h;if(m){let e=await f(m[0].path);if(e.shapes.length+e.instanceCount>bw)c.push(`${m.length} animation frames found, but the scene is too large to parse once per frame — loaded "${m[0].path}" only`),m=null,h=yw(e);else{let t=new vw(m.map(e=>(e.number-m[0].number)/30),Rw(m));t.addFrame(e);for(let e=1;e<m.length;e++)t.addFrame(await f(m[e].path));h=t.finish()}}else h=yw(await f(d));let g=performance.now()-p;s.releaseScenes();let _=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),v=new Map,y=async e=>{let t=await s.read(e);return t?(s.release(e),r(_(t))):null},b=new rw({convertHandedness:o,maxTriangles:e.maxTriangles,maxPlacements:e.maxPlacements,mergeShapesAbove:e.mergeShapesAbove,curveSteps:e.curveSteps,curveSides:e.curveSides,curveTolerance:e.curveTolerance,resolvePLY:async e=>{let t=s.findRecord(e);return t?(v.has(t.norm)||v.set(t.norm,await y(t)),v.get(t.norm)):null},resolveImage:async e=>{let t=await s.readPath(e);return t?i(t,e):null},resolveEnvironment:async e=>{let t=await s.readPath(e);return t?(a||i)(t,e):null}}),x=performance.now(),S=await b.build(h);return{...S,entryPath:m?m[0].path:d,frames:m?m.map(e=>e.path):null,candidates:l,warnings:[...c,...S.warnings??[]],parseMs:g,buildMs:performance.now()-x}}function Rw(e){let t=e[0].path.split(`/`);return`${t.length>1?t[t.length-2]:t[0].replace(/\d+\.pbrt$/i,``)||`frames`} · frames ${e[0].number}–${e[e.length-1].number}`}var zw=[`sourceFile`,`url`,`file`];function Bw(e){if(typeof e==`string`)try{let t=JSON.parse(e);return t&&typeof t==`object`?t:null}catch{return null}return e&&typeof e==`object`?e:null}function Vw(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)?t:void 0}function Hw(e){let t=Bw(e);if(!t)return null;let n=Bw(t.rayzee);return n&&n.environment!==void 0?n:t.environment===void 0?null:t}function Uw(e){let t=Bw(e);if(!t)return null;let n=zw.map(e=>t[e]).find(e=>typeof e==`string`&&e.trim());if(!n)return null;let r=Vw(t.rotation),i=Vw(t.intensity),a={sourceFile:n.trim()};return r!==void 0&&(a.rotation=r),i!==void 0&&(a.intensity=Math.max(0,i)),a}function Ww(e){let t=Hw(e);if(!t)return null;let n=Uw(t.environment);return n?{environment:n}:null}function Gw(e){if(!e)return null;let t=[e.userData,e.asset?.extras,e.scene?.userData];Array.isArray(e.scenes)&&t.push(...e.scenes.map(e=>e?.userData));for(let e of t){let t=Ww(e);if(t)return t}return null}Js();var Kw={glb:{type:`model`,name:`GLB (GLTF Binary)`},gltf:{type:`model`,name:`GLTF`},fbx:{type:`model`,name:`FBX`},obj:{type:`model`,name:`OBJ`},stl:{type:`model`,name:`STL`},ply:{type:`model`,name:`PLY (Polygon File Format)`},dae:{type:`model`,name:`Collada`},"3mf":{type:`model`,name:`3D Manufacturing Format`},usd:{type:`model`,name:`USD (Universal Scene Description)`},usda:{type:`model`,name:`USDA (USD ASCII)`},usdc:{type:`model`,name:`USDC (USD Crate)`},usdz:{type:`model`,name:`USDZ (USD Archive)`},hdr:{type:`environment`,name:`HDR (High Dynamic Range)`},exr:{type:`environment`,name:`EXR (OpenEXR)`},png:{type:`image`,name:`PNG`},jpg:{type:`image`,name:`JPEG`},jpeg:{type:`image`,name:`JPEG`},webp:{type:`image`,name:`WebP`},zip:{type:`archive`,name:`ZIP Archive`},gz:{type:`archive`,name:`Gzipped TAR Archive`},tgz:{type:`archive`,name:`Gzipped TAR Archive`},tar:{type:`archive`,name:`TAR Archive`}},qw=/\.(usd|usda|usdc)$/i,Jw=/\.(png|jpg|jpeg|avif)$/i,Yw=3e4,Xw=4e9;function Zw(e){let t=new r.BufferGeometry;for(let n in e.attributes)t.setAttribute(n,e.attributes[n]);e.index&&t.setIndex(e.index);for(let n of e.groups)t.addGroup(n.start,n.count,n.materialIndex);return t}var Qw=683;function $w(e,t,n,i){if(!(i.normalize??!0))return Math.PI;let a=i.shape===`ellipse`||i.shape===`disk`?Math.PI/4:1,o=e.getWorldScale(new r.Vector3),s=Math.PI*a*Math.abs(t*o.x*n*o.y);return Number.isFinite(s)?s:Math.PI}var eT=class e extends r.EventDispatcher{constructor(e,t,n,{issues:i=null,profile:a=null}={}){super(),this.scene=e,this.camera=t,this.controls=n,this.targetModel=null,this.floorPlane=null,this.sceneScale=1,this.sceneSize=new r.Vector3(1,1,1),this.loaderCache={},this.uploadedFileInfo=null,this.animations=[],this.renderer=null,this.sceneMetadata=null,this._loadingManager=new r.LoadingManager,this._loadCancelled=!1,this._urlAbort=null,this.storage=null,this._downloads=null,this._sourceKey=null,this._appended=!1,this._issues=i,this._profile=a??Ge(),this._loadingManager.onError=e=>{this._loadCancelled||this._issues?.record(Y.ASSET_UNREACHABLE,`asset "${e}" could not be fetched — anything depending on it renders without it`,{url:e})}}cancelActiveLoad(){this._loadCancelled=!0,this._loadingManager.abort(),this._urlAbort?.abort()}async _viaCache(t,n,r,{cacheKey:i=t,cachePolicy:a}={}){if(!this.storage||!e._isNetworkUrl(t)||/\.gltf$/i.test(t.split(/[?#]/)[0]))return{url:t,release:()=>{},cached:!1};let o=new AbortController;this._urlAbort=o;try{return await jg(t,{downloads:this.downloads,key:i,policy:a,name:wg(t),signal:o.signal,onProgress:this._downloadProgress(n,r)})}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._urlAbort=null}}get sceneSourceKey(){return this._appended?null:this._sourceKey}_keyed(e,t){return t?`${e}:${this._profile?.name??``}:${t}`:null}get downloads(){return this._downloads?._storage!==this.storage&&(this._downloads=new Og(this.storage)),this._downloads}_isCancellation(e){return this._loadCancelled||e?.name===`AbortError`||e?.code===`LOAD_CANCELLED`}_cancellationError(){let e=Error(`Load cancelled`);return e.code=`LOAD_CANCELLED`,e}_downloadProgress(e,t){return n=>{let r=n?.loaded||0,i=n?.lengthComputable&&n.total||0;H({isLoading:!0,status:e,loadedBytes:r,totalBytes:i,canCancel:!!t,progress:i?Math.min(60,2+Math.round(r/i*58)):2})}}_downloadComplete(e=`Processing Data...`,t=62){H({status:e,progress:t,canCancel:!1,loadedBytes:null,totalBytes:null})}static _isNetworkUrl(e){return typeof e==`string`&&/^https?:/i.test(e)}_adoptExternalObject(e){let t;try{t=(0,f.clone)(e)}catch(t){throw Error(`Cannot render "${e.name||e.type}": its userData must be JSON-serializable.`,{cause:t})}return t.userData.__rayzeeExternal=!0,this.scene?.children.some(t=>t.uuid===e.uuid)||(t.uuid=e.uuid),e.parent&&(e.parent.updateWorldMatrix(!0,!1),t.applyMatrix4(e.parent.matrixWorld)),t}releaseTargetModel(){this.sceneMetadata=null,this._sourceKey=null,this._appended=!1,this._pendingGraph=null,this.targetModel&&(this.removeModelRoot(this.targetModel),this.targetModel=null,this.animations=[])}setRenderer(e){this.renderer=e}getFileFormat(e){return Kw[e.split(`.`).pop().toLowerCase()]||null}readFileAsArrayBuffer(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>t(e.target.result),r.onerror=e=>n(e),r.readAsArrayBuffer(e)})}readFileAsText(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>t(e.target.result),r.onerror=e=>n(e),r.readAsText(e)})}async loadAssetFromFile(e,t={}){let n=e.name,r=this.getFileFormat(n);if(!r)throw Error(`Unsupported file format: ${n}`);H({isLoading:!0,status:`Loading ${r.name}...`,progress:2});try{let i;switch(r.type){case`model`:i=await this.loadModelFromFile(e,n);break;case`environment`:case`image`:i=await this.loadEnvironmentFromFile(e,n);break;case`archive`:i=await this.loadArchiveFromFile(e,n,t);break;default:throw Error(`Unknown asset type: ${r.type}`)}return i}catch(e){throw this.dispatchEvent({type:`error`,message:e.message,filename:n}),e}}async loadAssetFromUrl(t,n={}){let{filename:r=wg(t),cacheKey:i=t,cachePolicy:a,...o}=n;if(!this.getFileFormat(r))throw Error(`Unsupported file format: ${r}`);this._loadCancelled=!1;let s=e._isNetworkUrl(t),c=`Downloading ${r}...`,l=new AbortController;this._urlAbort=l,H({isLoading:!0,status:c,progress:2,canCancel:s,loadedBytes:0,totalBytes:0});let u;try{u=await this.downloads.fetch(t,{key:i,name:r,policy:a,signal:l.signal,onProgress:this._downloadProgress(c,s)})}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._urlAbort=null}this._downloadComplete();try{return await this.loadAssetFromFile(u.file,o)}catch(e){throw e?.code===`ARCHIVE_NEEDS_ELEMENT`&&(e.file=u.file),e}finally{u.release()}}async loadModelFromFile(e,t){let n=this.storage?this._keyed(`file`,Gn(await Wn(e))):null,r=await this._loadModelFileByExtension(e,t);return this._sourceKey=n,r}async _loadModelFileByExtension(e,t){let n=t.split(`.`).pop().toLowerCase(),r=await this.readFileAsArrayBuffer(e);switch(n){case`glb`:case`gltf`:return await this.loadGLBFromArrayBuffer(r,t);case`fbx`:return await this.loadFBXFromArrayBuffer(r,t);case`obj`:return await this.loadOBJFromFile(e,t);case`stl`:return await this.loadSTLFromArrayBuffer(r,t);case`ply`:return await this.loadPLYFromArrayBuffer(r,t);case`dae`:return await this.loadColladaFromFile(e,t);case`3mf`:return await this.load3MFFromArrayBuffer(r,t);case`usd`:case`usda`:case`usdc`:case`usdz`:return await this.loadUSDFromArrayBuffer(r,t);default:throw Error(`Support for ${n} files is not yet implemented`)}}async loadEnvironmentFromFile(e,t){let n=URL.createObjectURL(e);this.uploadedFileInfo={name:t,type:e.type,size:e.size};try{let r=await this.loadEnvironment(n);return Iu(r,Gn(await Wn(e))),this.dispatchEvent({type:`load`,texture:r,filename:t}),r}finally{URL.revokeObjectURL(n)}}async loadEnvironment(t){this._loadCancelled=!1;try{this.dispatchEvent({type:`beforeEnvironmentLoad`,url:t});let n;if(t.startsWith(`blob:`))n=await this.loadEnvironmentFromBlob(t);else{let e=t.split(/[?#]/)[0].split(`.`).pop().toLowerCase();n=await this.loadEnvironmentByExtension(t,e)}return n.generateMipmaps=!0,e._isNetworkUrl(t)&&Iu(n,t),this.applyEnvironmentToScene(n),this.dispatchEvent({type:`load`,texture:n,url:t,filename:t.split(/[?#]/)[0].split(`/`).pop()}),n}catch(e){throw this._isCancellation(e)?this._cancellationError():(console.error(`Error loading environment:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e)}}async loadEnvironmentFromBlob(e){let t=await(await fetch(e)).blob(),n=this.determineEnvironmentExtension(t,e),r=URL.createObjectURL(t);try{return await this.loadEnvironmentByExtension(r,n)}finally{URL.revokeObjectURL(r)}}determineEnvironmentExtension(e,t){let n;if(e.type===`image/x-exr`||e.type.includes(`exr`))n=`exr`;else if(e.type===`image/vnd.radiance`||e.type.includes(`hdr`))n=`hdr`;else{let e=t.split(`/`).pop();if(e){let t=e.match(/\.([^.]+)$/);t&&(n=t[1].toLowerCase())}}return!n&&this.uploadedFileInfo&&(n=this.uploadedFileInfo.name.split(`.`).pop().toLowerCase()),n}async loadEnvironmentByExtension(t,n){let i=e._isNetworkUrl(t),a=`Downloading Environment...`,o=await this._viaCache(t,a,i),c=o.cached?void 0:this._downloadProgress(a,i),l;try{n===`hdr`||n===`exr`?l=await(n===`hdr`?this.loaderCache.hdr||(this.loaderCache.hdr=new s.HDRLoader(this._loadingManager).setDataType(r.FloatType)):this.loaderCache.exr||(this.loaderCache.exr=new u.EXRLoader(this._loadingManager).setDataType(r.FloatType))).loadAsync(o.url,c):(this.loaderCache.texture||(this.loaderCache.texture=new r.TextureLoader(this._loadingManager)),l=await this.loaderCache.texture.loadAsync(o.url,c),l.colorSpace=r.SRGBColorSpace)}finally{o.release()}return this._downloadComplete(`Processing Environment...`,62),l.mapping=r.EquirectangularReflectionMapping,l.minFilter=r.LinearFilter,l.magFilter=r.LinearFilter,l}applyEnvironmentToScene(e){this.scene.background=e,this.scene.environment=e}async _readHead(e,t=512){return e instanceof Uint8Array?e.subarray(0,t):typeof e.slice==`function`&&typeof e.arrayBuffer==`function`?new Uint8Array(await e.slice(0,t).arrayBuffer()):new Uint8Array((await this.readFileAsArrayBuffer(e)).slice(0,t))}async inspectArchive(e){let t=rx(await this._readHead(e)),n=e=>H({isLoading:!0,status:`Scanning archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4}),r;if(t===`gzip`){let t=await this._unpackGzip(e,e.name);t?(r=t.index.listing,t.release()):{listing:r}=await gx(e,{filter:()=>!1,onProgress:n})}else r=t===`tar`?(await Vx(e,this.storage))?.listing??await vx(e,{onProgress:n}):(await Nx(e)).map(e=>({path:e.name,size:e.size}));let{root:i,elements:a}=Sx(r);return{kind:t??`zip`,root:i,elements:a,entryCount:r.length,totalBytes:r.reduce((e,t)=>e+t.size,0)}}async _unpackGzip(e,t){try{return await Bx(e,{storage:this.storage,label:t,onProgress:e=>H({isLoading:!0,status:`Unpacking archive… ${(e/1e9).toFixed(1)} GB`,progress:4})})}catch(e){return console.warn(`Unpacking "${t}" to storage failed, reading it in memory: ${e.message}`),null}}async loadArchiveFromFile(e,t,{pbrtEntry:n=null,element:r=null,byteBudget:i,promptBytes:a,...o}={}){try{let s=rx(await this._readHead(e)),c=this.storage?Gn(await Wn(e)):null,l={element:r,promptBytes:a,pbrtEntry:n,pbrt:o,archiveId:c};if(s===`tar`)return await this._loadSeekable(e,t,l);if(s===`gzip`){let a=await this._unpackGzip(e,t);if(a)try{return await this._loadSeekable(a.file,t,{...l,index:a.index})}finally{a.release()}let u=await this._readStreamedArchive(e,t,s,r,i);if(Fw(u))return await this.loadPBRTFromZip(u,t,n,o);let d=await this._loadNonPBRTArchive(u,t);return this._sourceKey=this._keyed(`archive`,c),d}return await this._loadSeekable(e,t,{...l,zip:!0})}catch(e){throw e?.code!==`ARCHIVE_NEEDS_ELEMENT`&&console.error(`Error loading archive:`,e),e}}async _loadNonPBRTArchive(e,t){return await this.processObjMtlPairsInZip(e,t)||await this.findAndLoadModelFromZip(e,t)}async _loadSeekable(e,t,{element:n,promptBytes:r,pbrtEntry:i,pbrt:a,index:o=null,zip:s=!1,archiveId:c=null}){let l=await this._openSeekableArchive(e,t,n,r,{index:o,zip:s});if(l.archiveId=c,l.elements=(Array.isArray(n)?n:[n]).filter(Boolean),l.listing.some(e=>e.path.toLowerCase().endsWith(`.pbrt`)))return await this.loadPBRTFromZip({},t,i,a,l);for(let e of l.listing)e.offset!==void 0&&(l.entries[e.path]??=await l.read(e.path));let u=await this._loadNonPBRTArchive(l.entries,t);return this._sourceKey=this._keyed(`archive`,c),u}async _loadStoredGraph(e,t,{imageFromBytes:n,envFromBytes:r}){let i=this.storage?.area(Zn.SCENES),a=i?await i.open(e):null;if(!a)return null;let o=performance.now(),s=null;try{H({isLoading:!0,status:`Opening the stored scene...`,progress:6});let e=await a.json(`graph.json`),i=await a.file(`data.bin`),s=new ww({},t),c=await pS(e,i,{loadTexture:async(e,t)=>{let i=await s.readPath(e);return i?t===`environment`?r(i,e):n(i,e):null}});return{...c.stats,group:c.root,environment:c.environment?{texture:c.environment}:null,animations:c.animations,report:null,parseMs:0,buildMs:performance.now()-o,fromStorage:!0}}catch(e){return s=e,null}finally{a.release(),s&&(console.warn(`The stored scene could not be used, parsing the archive instead: ${s.message}`),this._issues?.warn(Y.STORAGE_ENTRY_CORRUPT,`stored scene unusable: ${s.message}`,{key:e}),i.remove(e).catch(()=>{}))}}_storeGraph(e,t,n){let r=this.storage?.area(Zn.SCENES);if(!r)return;let i;try{i=oS(t.group,{environment:t.environment?.texture??null,animations:t.animations??[],stats:{meshCount:t.meshCount,entryPath:t.entryPath,candidates:t.candidates,frames:t.frames,warnings:t.warnings,triangleCount:t.triangleCount,placementCount:t.placementCount,mergedShapes:t.mergedShapes,skippedForBudget:t.skippedForBudget,droppedNoTemplate:t.droppedNoTemplate}})}catch(e){e instanceof Zx?console.info(`Scene not stored for next time: ${e.message}`):console.warn(`Scene not stored for next time:`,e);return}let a={key:e,encoded:i,label:n,parseMs:(t.parseMs??0)+(t.buildMs??0),triangles:t.triangleCount??null};Gh(a.parseMs,i.byteLength)?this._writeGraph(r,a):this._pendingGraph=a}flushPendingGraph(e){let t=this._pendingGraph;this._pendingGraph=null;let n=this.storage?.area(Zn.SCENES);!t||!n||!Gh(t.parseMs+e,t.encoded.byteLength)||this._writeGraph(n,t)}_writeGraph(e,t){(async()=>{let n=await e.create(t.key,{label:`${t.label} (scene)`,expectedBytes:t.encoded.byteLength});if(n)try{await sS(n,t.encoded,{release:!0}),await n.commit({triangles:t.triangles})}catch(e){await n.abort(),console.warn(`Storing the scene failed:`,e)}})().catch(e=>console.warn(`Storing the scene failed:`,e))}async _openSeekableArchive(e,t,n,r,{index:i=null,zip:a=!1}={}){let o=Array.isArray(n)?n.filter(Boolean):n?[n]:[],s=o.length?xx(o):null,c;if(a)c=await Ix(e,{filter:s});else{let t=i??await Vx(e,this.storage);c=await bx(e,{index:t,headersOnly:!0,filter:s,onProgress:e=>H({isLoading:!0,status:`Indexing archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4})}),t||Hx(e,this.storage,c.index).catch(()=>{})}let l=c.listing.reduce((e,t)=>e+t.size,0);return o.length===0&&this._requireElementChoice(t,c.listing,l,r),console.info(`Archive "${t}": indexed ${c.indexed} entries, ${(l/1e9).toFixed(1)} GB, none resident`+(o.length?`, ${o.length} part${o.length>1?`s`:``} selected.`:`.`)),c}_requireElementChoice(e,t,n,r=Xw){if(n<r)return;let{root:i,elements:a}=Sx(t);if(a.length<2)return;let o=Error(`"${e}" holds ${(n/1e9).toFixed(1)} GB across ${a.length} parts. Choose which to load — loading all of them at once may exhaust memory.`);throw o.code=`ARCHIVE_NEEDS_ELEMENT`,o.root=i,o.elements=a,o.totalBytes=n,this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`archive holds ${(n/1e9).toFixed(1)} GB across ${a.length} parts; choose which to load`,{root:i,elements:a.map(e=>e.prefix),totalBytes:n},yn.WARNING),o}async _readStreamedArchive(e,t,n,r,i){let a=Array.isArray(r)?r.filter(Boolean):r?[r]:[],{entries:o,listing:s,retainedBytes:c,truncated:l}=await gx(e,{filter:a.length?xx(a):null,...i===void 0?{}:{byteBudget:i},onProgress:e=>H({isLoading:!0,status:`Reading archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4})});if(l&&a.length===0){let{root:e,elements:n}=Sx(s),r=s.reduce((e,t)=>e+t.size,0),i=Error(`"${t}" unpacks to ${(r/1e9).toFixed(1)} GB, past the load budget. Load one of its ${n.length} parts instead.`);throw i.code=`ARCHIVE_NEEDS_ELEMENT`,i.root=e,i.elements=n,i.totalBytes=r,this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`archive unpacks to ${(r/1e9).toFixed(1)} GB; choose one of ${n.length} parts`,{root:e,elements:n.map(e=>e.prefix),totalBytes:r},yn.WARNING),i}if(l){let e=xx(a),t=s.filter(t=>e(t.path,t.size)&&!o[t.path]).length;this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`${t} files of the chosen parts were left out: they did not fit the ${((i??15e8)/1e9).toFixed(1)} GB in-memory read budget`,{elements:a,missing:t,retainedBytes:c},yn.WARNING)}return a.length&&console.info(`Archive "${t}": loaded ${a.map(e=>`"${e}"`).join(`, `)} — ${Object.keys(o).length} of ${s.length} files, ${(c/1048576).toFixed(1)} MB.`),o}async loadPBRTFromZip(e,t,n=null,r={},i=null){if(H({isLoading:!0,status:`Parsing PBRT scene...`,progress:5}),!this.loaderCache.ply){let{PLYLoader:e}=await import(`three/examples/jsm/loaders/PLYLoader.js`);this.loaderCache.ply=new e}let a=e=>this.loaderCache.ply.parse(e),o=async(e,t)=>{let n=await this._pbrtTextureFromBytes(e,t);return n&&(n.userData[Ux]=t),n},s=async(e,t)=>{let n=t.split(`.`).pop().toLowerCase(),r=new Blob([e]),i=URL.createObjectURL(r);try{let e=await this.loadEnvironmentByExtension(i,n);return Iu(e,`bytes:${await Un(r)}`),e.userData[Ux]=t,e.userData[Wx]=`environment`,e}finally{URL.revokeObjectURL(i)}},c=performance.now(),l={animation:r.animation,maxTriangles:r.maxTriangles,maxPlacements:r.maxPlacements,mergeShapesAbove:r.mergeShapesAbove,curveSteps:r.curveSteps,curveSides:r.curveSides,curveTolerance:r.curveTolerance,instanceIncludes:r.instanceIncludes},u=i?.archiveId?this._keyed(`pbrt:2.4:${Hh}`,`${i.archiveId}|${n??``}|${[...i.elements??[]].sort().join(`,`)}|${JSON.stringify(l)}`):null,d=u?await this._loadStoredGraph(u,i,{imageFromBytes:o,envFromBytes:s}):null,f=d??await Lw({vfs:e,source:i,entryPath:n,plyParser:a,imageFromBytes:o,envFromBytes:s,...l}),{group:p,environment:m,animations:h,report:g,warnings:_,meshCount:v,entryPath:y,candidates:b,frames:x,parseMs:S,buildMs:C,triangleCount:w,placementCount:T,mergedShapes:E,skippedForBudget:D,droppedNoTemplate:O}=f;d&&console.info(`PBRT scene "${y}" opened from storage in ${(C/1e3).toFixed(1)} s, skipping the parse`),this.lastPBRTStats={parseMs:S,buildMs:C,loaderMs:performance.now()-c,triangleCount:w,placementCount:T,mergedShapes:E,skippedForBudget:D,droppedNoTemplate:O,meshCount:v,frames:x?.length??1};let k=new Set(x??[y]),A=b.filter(e=>!k.has(e));if(A.length>0&&(console.warn(`PBRT archive holds ${b.length} scenes; loaded "${y}". Others: ${A.join(`, `)}`),this._issues?.record(Y.ASSET_AMBIGUOUS_ENTRY,`archive holds ${b.length} pbrt scenes; loaded "${y}"`,{loaded:y,alternatives:A},yn.WARNING)),g&&g.length&&typeof console.table==`function`){let e=g.length<v?` (first ${g.length} of ${v})`:``;console.groupCollapsed(`PBRT loader: ${v} mesh(es) from "${y}"${e}`),console.table(g),console.groupEnd()}return _&&_.length&&(console.warn(`PBRT loader: ${_.length} warning(s) parsing "${y}"`),_.forEach(e=>console.warn(` •`,e))),m?.texture&&(m.texture.generateMipmaps=!0,this.applyEnvironmentToScene(m.texture)),p.name=y||t,this.releaseTargetModel(),this._sourceKey=u,u&&!d&&this._storeGraph(u,f,t),this.targetModel=p,this.animations=h??[],m?.texture&&(this.sceneMetadata={environment:{rotation:0,intensity:1}}),H({isLoading:!0,status:`Processing PBRT geometry...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:p,filename:`${y} (from ZIP)`}),p}async _pbrtTextureFromBytes(e,t){let n=t.split(`.`).pop().toLowerCase(),i;if(n===`exr`||n===`hdr`){let t=n===`hdr`?this.loaderCache.hdr||(this.loaderCache.hdr=new s.HDRLoader().setDataType(r.FloatType)):this.loaderCache.exr||(this.loaderCache.exr=new u.EXRLoader().setDataType(r.FloatType));i=await this._loadViaObjectURL(t,e)}else if(n===`tga`){if(!this.loaderCache.tga){let{TGALoader:e}=await import(`three/examples/jsm/loaders/TGALoader.js`);this.loaderCache.tga=new e}i=await this._loadViaObjectURL(this.loaderCache.tga,e),i.colorSpace=r.SRGBColorSpace}else i=new r.Texture(await createImageBitmap(new Blob([e]))),i.colorSpace=r.SRGBColorSpace;return i.wrapS=i.wrapT=r.RepeatWrapping,i.needsUpdate=!0,i}async _loadViaObjectURL(e,t){let n=URL.createObjectURL(new Blob([t]));try{return await e.loadAsync(n)}finally{URL.revokeObjectURL(n)}}async processObjMtlPairsInZip(e,t){let n=[],r=[];for(let t in e){let i=t.toLowerCase();i.endsWith(`.obj`)?n.push({path:t,content:e[t]}):i.endsWith(`.mtl`)&&r.push({path:t,content:e[t]})}if(n.length>0&&r.length>0){console.log(`Found ${n.length} OBJ files and ${r.length} MTL files in ZIP`);let i=this.findMatchingObjMtlPairs(n,r);if(i.length>0)return console.log(`Found ${i.length} matching OBJ+MTL pairs`),await this.loadOBJMTLPairFromZip(i[0].obj,i[0].mtl,e,t);if(i.length===0)return console.log(`No matching pairs by name, using first OBJ and MTL files`),await this.loadOBJMTLPairFromZip(n[0],r[0],e,t)}return null}findMatchingObjMtlPairs(e,t){let n=[];for(let r of e){let e=r.path.split(`/`).pop().replace(/\.obj$/i,``).toLowerCase();for(let i of t){let t=i.path.split(`/`).pop().replace(/\.mtl$/i,``).toLowerCase();if(e===t||e.includes(t)||t.includes(e)){n.push({obj:r,mtl:i});break}}}return n}async findAndLoadModelFromZip(e){for(let t of[`scene.gltf`,`scene.glb`,`model.gltf`,`model.glb`,`main.gltf`,`main.glb`,`asset.gltf`,`asset.glb`])if(e[t]){console.log(`Found main model file: ${t}`);let n=t.split(`.`).pop().toLowerCase();return await this.loadModelFromZipEntry(e[t],t,n,e)}for(let t in e){let n=t.split(`.`).pop().toLowerCase();if(Kw[n]&&Kw[n].type===`model`)return qw.test(t)?await this.loadUSDHierarchyFromZip(e):(console.log(`Loading model file from ZIP: ${t}`),await this.loadModelFromZipEntry(e[t],t,n,e))}throw Error(`No supported model files found in the ZIP archive`)}async loadUSDHierarchyFromZip(t){let n=Object.keys(t).filter(e=>qw.test(e));if(n.length===0)throw Error(`No USD layers found in the ZIP archive`);let r=e._pickUSDRootLayer(n);console.log(`Loading USD scene from ZIP: ${r} (${n.length} layers)`);let i={[r]:[t[r],{level:0}]};for(let e of Object.keys(t))e!==r&&(qw.test(e)||Jw.test(e))&&(i[e]=[t[e],{level:0}]);return await this.loadUSDFromArrayBuffer((0,m.zipSync)(i),r)}static _pickUSDRootLayer(e){let t=e=>e.split(`/`).length,n=Math.min(...e.map(t)),r=e.filter(e=>t(e)===n);return r.find(e=>{let t=e.split(`/`);return t.length>1&&t[t.length-1].replace(qw,``)===t[t.length-2]})||r[0]}async loadModelFromZipEntry(e,t,n,r){try{H({isLoading:!0,status:`Processing ${n.toUpperCase()} from ZIP...`,progress:5});let i=new Blob([e.buffer],{type:`application/octet-stream`}),a=URL.createObjectURL(i),o;switch(n){case`glb`:case`gltf`:o=await this.handleGltfFromZip(n,e,t,r);break;case`fbx`:o=await this.loadFBXFromArrayBuffer(e.buffer,t);break;case`obj`:o=await this.handleObjFromZip(e,t,r);break;case`stl`:o=await this.loadSTLFromArrayBuffer(e.buffer,t);break;case`ply`:o=await this.loadPLYFromArrayBuffer(e.buffer,t);break;case`dae`:{let n=(0,m.strFromU8)(e),r=new File([new Blob([n])],t);o=await this.loadColladaFromFile(r,t)}break;case`3mf`:o=await this.load3MFFromArrayBuffer(e.buffer,t);break;case`usd`:case`usda`:case`usdc`:case`usdz`:o=await this.loadUSDFromArrayBuffer(e,t);break;default:throw Error(`Support for ${n} files is not yet implemented`)}return URL.revokeObjectURL(a),this.dispatchEvent({type:`load`,model:this.targetModel,filename:`${t} (from ZIP)`}),o}catch(e){throw console.error(`Error loading ${n} from ZIP:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async handleGltfFromZip(e,t,n,i){if(e===`gltf`){let e=(0,m.strFromU8)(t),a=new r.LoadingManager,o=n.split(`/`).slice(0,-1).join(`/`);a.setURLModifier(e=>this.resolveZipResource(e,o,i));let s=await this.createGLTFLoader();s.manager=a;try{return await new Promise((t,n)=>{s.parse(e,``,e=>{this.releaseTargetModel(),this.targetModel=e.scene,this.sceneMetadata=Gw(e),this.onModelLoad(this.targetModel).then(()=>t(e))},e=>n(e))})}finally{this._disposeGLTFLoader(s)}}else return await this.loadGLBFromArrayBuffer(t.buffer,n)}async handleObjFromZip(e,t,n){let r=(0,m.strFromU8)(e),i=r.match(/mtllib\s+([^\s]+)/),a=null;i&&i[1]&&(a=await this.loadMtlFromZip(i[1],t,n));let{OBJLoader:o}=await import(`three/examples/jsm/loaders/OBJLoader.js`),s=new o;a&&s.setMaterials(a);let c=s.parse(r);return c.name=t,this.releaseTargetModel(),this.targetModel=c,await this.onModelLoad(this.targetModel),c}async preloadMtlTextures(e){let t=[],n=e.loadTexture.bind(e);if(e.loadTexture=(e,r,i,a,o)=>{let s;return t.push(new Promise(e=>s=e)),n(e,r,e=>{s(),i?.(e)},a,e=>{s(),o?.(e)})},e.preload(),t.length===0)return e;let r,i=await Promise.race([Promise.all(t).then(()=>!0),new Promise(e=>r=setTimeout(()=>e(!1),Yw))]);return clearTimeout(r),i||this._issues?.record(Y.TEXTURE_BUILD_FAILED,`MTL textures did not decode within ${Yw}ms; affected materials render untextured`,{pending:t.length}),e}async loadMtlFromZip(e,t,n){let i=t.split(`/`).slice(0,-1).join(`/`),a=[e,`${i}/${e}`,e.split(`/`).pop()];for(let e of a)if(n[e]){let{MTLLoader:t}=await import(`three/examples/jsm/loaders/MTLLoader.js`),a=(0,m.strFromU8)(n[e]),o=new r.LoadingManager;o.setURLModifier(e=>this.resolveZipResource(e,i,n));let s=new t(o).parse(a,i);return await this.preloadMtlTextures(s),s}return null}resolveZipResource(e,t,n){let r=e.replace(/^\.\/|^\//,``),i=[r,`${t}/${r}`,r.split(`/`).pop()];for(let e of i)if(n[e]){let t=new Blob([n[e].buffer],{type:`application/octet-stream`});return URL.createObjectURL(t)}return console.warn(`Resource not found in ZIP: ${e}`),e}async loadOBJMTLPairFromZip(e,t,n,i){let{MTLLoader:a}=await import(`three/examples/jsm/loaders/MTLLoader.js`),{OBJLoader:o}=await import(`three/examples/jsm/loaders/OBJLoader.js`),s=[],c=new r.LoadingManager,l=e.path.split(`/`).slice(0,-1).join(`/`),u=t.path.split(`/`).slice(0,-1).join(`/`);c.setURLModifier(e=>this.resolveTextureInZip(e,l,u,t,n,s));let d=this.prepareFixedMtlContent(t),f=new a(c).parse(d,u);await this.preloadMtlTextures(f);let p=new o(c);p.setMaterials(f);let h=(0,m.strFromU8)(e.content),g=p.parse(h);return this.releaseTargetModel(),this.targetModel=g,await this.onModelLoad(this.targetModel),s.forEach(e=>URL.revokeObjectURL(e)),this.dispatchEvent({type:`load`,model:g,filename:`${e.path} (from ${i})`}),g}prepareFixedMtlContent(e){return(0,m.strFromU8)(e.content).replace(RegExp(`${e.path.split(`/`).pop()}\\s+`,`g`),` `).replace(/([a-zA-Z_]+)([\\/])/g,`$1 $2`)}resolveTextureInZip(e,t,n,r,i,a){let o=e.split(`?`)[0].split(`#`)[0].replace(/^\.\/|^\//,``),s=r.path.split(`/`).pop();o.startsWith(s)&&(o=o.substring(s.length).replace(/^\.\/|^\/|^\./,``));let c=[o,`${t}/${o}`,`${n}/${o}`,`textures/${o}`,`texture/${o}`,`materials/${o}`,o.split(`/`).pop()];for(let e of c)if(i[e]){let t=new Blob([i[e].buffer],{type:`application/octet-stream`}),n=URL.createObjectURL(t);return a.push(n),n}return this.findTextureWithFuzzyMatch(o,i,a)||e}findTextureWithFuzzyMatch(e,t,n){let r=e.split(`/`).pop();for(let e in t)if(e.endsWith(r)){let r=new Blob([t[e].buffer],{type:`application/octet-stream`}),i=URL.createObjectURL(r);return n.push(i),i}if(r&&r.length>5)for(let e in t){let i=e.split(`/`).pop();if(i.includes(r)||r.includes(i)){let r=new Blob([t[e].buffer],{type:`application/octet-stream`}),i=URL.createObjectURL(r);return n.push(i),i}}return null}async createGLTFLoader(){let{dracoDecoderPath:e,ktx2TranscoderPath:t}=Ks(),n=new c.DRACOLoader;n.setDecoderConfig({type:`js`}),n.setDecoderPath(e);let r=new l.KTX2Loader;r.setTranscoderPath(t),this.renderer&&(r.detectSupport(this.renderer),r.workerConfig={astcSupported:!1,etc1Supported:!1,etc2Supported:!1,dxtSupported:!1,bptcSupported:!1,pvrtcSupported:!1});let i=new o.GLTFLoader(this._loadingManager);return i.setDRACOLoader(n),i.setKTX2Loader(r),i.setMeshoptDecoder(p.MeshoptDecoder),i}_disposeGLTFLoader(e){e&&(e.dracoLoader?.dispose(),e.ktx2Loader?.dispose())}async loadExampleModels(e,t){if(!t||!t[e])throw Error(`No model file at index ${e}`);let n=`${t[e].url}`;return await this.loadModel(n)}async loadModel(t,n={}){this._loadCancelled=!1;let i=await this.createGLTFLoader(),a=e._isNetworkUrl(t),o=null;try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:a,loadedBytes:0,totalBytes:0}),o=await this._viaCache(t,`Downloading Model...`,a,n),o.cached&&i.setResourcePath(r.LoaderUtils.extractUrlBase(t));let e=await i.loadAsync(o.url,o.cached?void 0:this._downloadProgress(`Downloading Model...`,a));return this._downloadComplete(),this.releaseTargetModel(),this._sourceKey=a?this._keyed(`url`,n.cacheKey??t):null,this.targetModel=e.scene,this.animations=e.animations||[],this.sceneMetadata=Gw(e),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:e.scene,filename:t.split(`/`).pop()}),e}catch(e){throw this._isCancellation(e)?this._cancellationError():(console.error(`Error loading model:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e)}finally{o?.release(),this._disposeGLTFLoader(i)}}_processAndParent(e){this.processModelObjects(e),this.scene.add(e),e.updateMatrixWorld(!0)}async appendModel(t,n={}){this._loadCancelled=!1;let i=await this.createGLTFLoader(),a=e._isNetworkUrl(t),o=null;try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:a,loadedBytes:0,totalBytes:0}),o=await this._viaCache(t,`Downloading Model...`,a,n),o.cached&&i.setResourcePath(r.LoaderUtils.extractUrlBase(t));let e=await i.loadAsync(o.url,o.cached?void 0:this._downloadProgress(`Downloading Model...`,a));return this._downloadComplete(),this._appended=!0,this._processAndParent(e.scene),{root:e.scene,animations:e.animations||[]}}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{o?.release(),this._disposeGLTFLoader(i)}}appendObject3D(e,t=`object3d`){this._appended=!0;let n=this._adoptExternalObject(e);return n.name=e.name||t,this._processAndParent(n),{root:n}}removeModelRoot(e){e&&(e.userData.__rayzeeExternal?(Ne(e),e.parent?.remove(e)):Me(e))}async loadGLBFromArrayBuffer(e,t=`model.glb`){let n=await this.createGLTFLoader();try{H({isLoading:!0,status:`Processing GLB Data...`,progress:5}),await new Promise(e=>setTimeout(e,0));let r=await n.parseAsync(e,``);return this.releaseTargetModel(),this.targetModel=r.scene,this.animations=r.animations||[],this.sceneMetadata=Gw(r),H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r.scene,filename:t}),r}catch(e){throw console.error(`Error loading GLB:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}finally{this._disposeGLTFLoader(n)}}async loadFBXFromArrayBuffer(e,t=`model.fbx`){try{if(H({isLoading:!0,status:`Processing FBX Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.fbx){let{FBXLoader:e}=await import(`three/examples/jsm/loaders/FBXLoader.js`);this.loaderCache.fbx=new e}let n=this.loaderCache.fbx.parse(e);return this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading FBX:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadOBJFromFile(e,t=`model.obj`){try{if(H({isLoading:!0,status:`Processing OBJ Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.obj){let{OBJLoader:e}=await import(`three/examples/jsm/loaders/OBJLoader.js`);this.loaderCache.obj=new e}let n=await this.readFileAsText(e),r=this.loaderCache.obj.parse(n);return r.name=t,this.releaseTargetModel(),this.targetModel=r,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r,filename:t}),r}catch(e){throw console.error(`Error loading OBJ:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadSTLFromArrayBuffer(e,t=`model.stl`){try{if(H({isLoading:!0,status:`Processing STL Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.stl){let{STLLoader:e}=await import(`three/examples/jsm/loaders/STLLoader.js`);this.loaderCache.stl=new e}let n=new r.Mesh(this.loaderCache.stl.parse(e),new r.MeshStandardMaterial);return n.name=t,this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading STL:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadPLYFromArrayBuffer(e,t=`model.ply`){try{if(H({isLoading:!0,status:`Processing PLY Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.ply){let{PLYLoader:e}=await import(`three/examples/jsm/loaders/PLYLoader.js`);this.loaderCache.ply=new e}let n=this.loaderCache.ply.parse(e),i;if(n.index!==null)i=new r.Mesh(n,new r.MeshStandardMaterial);else{let e=new r.PointsMaterial({size:.01});e.vertexColors=n.hasAttribute(`color`),i=new r.Points(n,e)}return i.name=t,this.releaseTargetModel(),this.targetModel=i,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:i,filename:t}),i}catch(e){throw console.error(`Error loading PLY:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadColladaFromFile(e,t=`model.dae`){try{if(H({isLoading:!0,status:`Processing Collada Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.collada){let{ColladaLoader:e}=await import(`three/examples/jsm/loaders/ColladaLoader.js`);this.loaderCache.collada=new e}let n=await this.readFileAsText(e),r=this.loaderCache.collada.parse(n);return r.scene.name=t,this.releaseTargetModel(),this.targetModel=r.scene,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r.scene,filename:t}),r}catch(e){throw console.error(`Error loading Collada:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async load3MFFromArrayBuffer(e,t=`model.3mf`){try{if(H({isLoading:!0,status:`Processing 3MF Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.threemf){let{ThreeMFLoader:e}=await import(`three/examples/jsm/loaders/3MFLoader.js`);this.loaderCache.threemf=new e}let n=this.loaderCache.threemf.parse(e);return this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading 3MF:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadUSDFromArrayBuffer(e,t=`model.usd`){try{if(H({isLoading:!0,status:`Processing USD Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.usd){let{USDLoader:e}=await import(`three/examples/jsm/loaders/USDLoader.js`);this.loaderCache.usd=new e}let n=await new Promise((t,n)=>{this.loaderCache.usd.parse(e,``,t,n)});return n.name=t,this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading USD:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadObject3D(e,t=`object3d`){this.releaseTargetModel();let n=this._adoptExternalObject(e);return n.name=e.name||t,this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}async onModelLoad(e){let t=new Sh(`onModelLoad`);t.start(`Camera extraction`);let n=this.extractCamerasFromModel(e);t.end(`Camera extraction`),t.start(`Camera setup`);let i=new r.Box3().setFromObject(e),a=i.getCenter(new r.Vector3),o=i.getSize(new r.Vector3);this.controls.target.copy(a);let s=Math.max(o.x,o.y,o.z),c=this.camera.fov*(Math.PI/180),l=Math.abs(s/Math.sin(c/2)/2),u=Math.PI/6,d=new r.Vector3(Math.cos(u)*l,l/Math.sqrt(2),Math.sin(u)*l);if(this.camera.position.copy(d.add(a)),this.camera.lookAt(a),this.camera.near=s/100,this.camera.far=s*100,this.camera.updateProjectionMatrix(),this.controls.maxDistance=l*10,this.controls.saveState(),this.controls.update(),t.end(`Camera setup`),this.floorPlane){let e=i.min.y;this.floorPlane.position.y=e,this.floorPlane.rotation.x=-Math.PI/2,this.floorPlane.scale.setScalar(s*5)}t.start(`Process model objects`),this.processModelObjects(e),t.end(`Process model objects`),t.start(`Scene add`),this.scene.add(e),t.end(`Scene add`);let f=s;return this.sceneSize.copy(o),t.start(`setupPathTracing`),await this.setupPathTracing(e,f),t.end(`setupPathTracing`),t.print(),this.dispatchEvent({type:`modelProcessed`,model:e,cameras:n,sceneData:{center:a,size:o,maxDim:s,sceneScale:f}}),this.dispatchEvent({type:`SceneRebuild`}),{center:a,size:o,maxDim:s,sceneScale:f}}extractCamerasFromModel(e){let t=[];return e.updateWorldMatrix(!0,!0),e.traverse(e=>{if(e.isCamera){let n=e.clone();n.userData.__rayzeeSourceUuid=e.uuid,e.getWorldPosition(n.position),e.getWorldQuaternion(n.quaternion),e.getWorldScale(n.scale),n.scale.set(Math.sign(n.scale.x)||1,Math.sign(n.scale.y)||1,Math.sign(n.scale.z)||1),(!n.name||n.name===``)&&(n.name=`Model Camera ${t.length+1}`),n.isPerspectiveCamera&&(n.aspect=this.camera.aspect,n.updateProjectionMatrix()),t.push(n)}}),t}processModelObjects(e){let t=[];e.traverse(e=>{let n=e.userData;if(e.isRectAreaLight&&!n.__radianceConverted&&(e.intensity*=$w(e,e.width,e.height,n),n.__radianceConverted=!0),(e.isPointLight||e.isSpotLight)&&!n.__candelaConverted&&(e.intensity*=4*Math.PI/Qw,n.__candelaConverted=!0),e.isDirectionalLight&&!n.__luxConverted&&(e.intensity/=Qw,n.__luxConverted=!0),e.name.startsWith(`RectAreaLightPlaceholder`)&&n.name&&n.type===`RectAreaLight`){let t=n.normalize??!0,i=n.shape??`rectangle`,a=n.intensity*$w(e,n.width,n.height,n),o=new r.RectAreaLight(new r.Color(...n.color),a*this._profile.areaLightIntensityScale,n.width,n.height);o.userData.normalize=t,o.userData.spread=Number.isFinite(n.spread)?n.spread:Math.PI,o.userData.shape=i,o.userData.__radianceConverted=!0,o.name=n.name,e.add(o)}e.isMesh&&Array.isArray(e.material)&&t.push(e)});let n=e.userData.__rayzeeExternal===!0;for(let e of t){if(!e.parent)continue;console.log(`Found multi-material mesh:`,e.name),n&&(e.geometry=Zw(e.geometry));let t=(0,d.createMeshesFromMultiMaterialMesh)(e);for(let e of t.children)e.geometry.userData.__rayzeeOwned=!0;e.parent.add(t),e.parent.remove(e)}}async setupPathTracing(e,t){this.sceneScale=t}createFloorPlane(){this.floorPlane=new r.Mesh(new r.CircleGeometry,new r.MeshPhysicalMaterial({transparent:!1,color:3158064,roughness:1,metalness:0,opacity:0,transmission:0})),this.floorPlane.name=`Ground`,this.floorPlane.visible=!1,this.scene.add(this.floorPlane)}setFloorPlane(e){this.floorPlane=e}getSceneScale(){return this.sceneScale}getSceneSize(){return this.sceneSize.clone()}getTargetModel(){return this.targetModel}getSupportedFormats(e=null){if(e){let t={};for(let[n,r]of Object.entries(Kw))r.type===e&&(t[n]=r);return t}return Kw}dispose(){for(let e in this.loaderCache){let t=this.loaderCache[e];t&&typeof t.dispose==`function`&&t.dispose()}this.loaderCache={},this._listeners=void 0,this._loadingManager.onError=void 0,this._issues=null,this._urlAbort?.abort(),this._urlAbort=null,this.storage=null,this._downloads=null,this._pendingGraph=null,this.releaseTargetModel()}removeAllEventListeners(){this._listeners=void 0}},tT=class extends r.PerspectiveCamera{constructor(e,t,n,r){super(e,t,n,r),this.orthographic=!1,this.orthoHalfHeight=1}get isPerspectiveCamera(){return!this.orthographic}set isPerspectiveCamera(e){}get isOrthographicCamera(){return this.orthographic}get top(){return this.orthoHalfHeight}get bottom(){return-this.orthoHalfHeight}get right(){return this.orthoHalfHeight*this.aspect}get left(){return-this.orthoHalfHeight*this.aspect}updateProjectionMatrix(){this.orthographic?r.OrthographicCamera.prototype.updateProjectionMatrix.call(this):super.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.orthographic=e.orthographic===!0,this.orthoHalfHeight=e.orthoHalfHeight??this.orthoHalfHeight,this}},nT=8,rT=4,iT=.25,aT=r.MathUtils.degToRad(89),oT=.25,sT={KeyD:[1,0,0],ArrowRight:[1,0,0],KeyA:[-1,0,0],ArrowLeft:[-1,0,0],KeyW:[0,1,0],ArrowUp:[0,1,0],KeyS:[0,-1,0],ArrowDown:[0,-1,0],KeyE:[0,0,1],KeyQ:[0,0,-1]},cT=`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role=textbox], [role=combobox], [role=listbox], [role=menu], [role=menuitem]`,lT=e=>e.shiftKey?rT:e.altKey?iT:1,uT={type:`change`},dT={type:`start`},fT=new r.Vector3,pT=new r.Vector3,mT=new r.Vector3,hT=new r.Vector3,gT=new r.Quaternion,_T=class extends r.Controls{constructor(e,t,n){super(e,t),this.orbit=n,this.enabled=!1,this.speed=1/nT,this._held=new Set,this._factor=1,this._lastTime=0,this._drag=null,this._onKeyDown=this._onKeyDown.bind(this),this._onKeyUp=this._onKeyUp.bind(this),this.release=this.release.bind(this),this._onPointerDown=this._onPointerDown.bind(this),this._onPointerMove=this._onPointerMove.bind(this),this._onPointerUp=this._onPointerUp.bind(this),t&&this.connect(t)}get active(){return this.enabled&&this.orbit.enabled}fitSpeed(e){this.speed=(e>0?e:1)/nT}connect(e){super.connect(e);let t=e.ownerDocument;t?.addEventListener(`keydown`,this._onKeyDown),t?.addEventListener(`keyup`,this._onKeyUp),t?.addEventListener(`visibilitychange`,this.release),t?.defaultView?.addEventListener(`blur`,this.release),e.addEventListener(`pointerdown`,this._onPointerDown),e.addEventListener(`pointermove`,this._onPointerMove),e.addEventListener(`pointerup`,this._onPointerUp),e.addEventListener(`pointercancel`,this._onPointerUp)}disconnect(){let e=this.domElement;if(!e)return;let t=e.ownerDocument;t?.removeEventListener(`keydown`,this._onKeyDown),t?.removeEventListener(`keyup`,this._onKeyUp),t?.removeEventListener(`visibilitychange`,this.release),t?.defaultView?.removeEventListener(`blur`,this.release),e.removeEventListener(`pointerdown`,this._onPointerDown),e.removeEventListener(`pointermove`,this._onPointerMove),e.removeEventListener(`pointerup`,this._onPointerUp),e.removeEventListener(`pointercancel`,this._onPointerUp)}dispose(){this.disconnect()}update(e=this._elapsed()){if(!this._held.size||!this.active)return!1;let t=0,n=0,r=0;for(let e of this._held){let[i,a,o]=sT[e];t+=i,n+=a,r+=o}if(!t&&!n&&!r)return!1;let i=this.object;return pT.set(1,0,0).applyQuaternion(i.quaternion),fT.crossVectors(i.up,pT).normalize(),pT.crossVectors(fT,i.up),mT.set(0,0,0).addScaledVector(pT,t).addScaledVector(fT,n).addScaledVector(i.up,r).normalize().multiplyScalar(this.speed*this._factor*e),i.position.add(mT),this.orbit.target.add(mT),i.updateMatrixWorld(),this.dispatchEvent(uT),!0}_elapsed(){let e=performance.now(),t=Math.min((e-this._lastTime)/1e3,oT);return this._lastTime=e,t}_look(e,t){let n=this.object,i=this.orbit.target,a=n.position.distanceTo(i)||1,o=r.MathUtils.degToRad(n.fov)/(this.domElement.clientHeight||1);n.quaternion.premultiply(gT.setFromAxisAngle(n.up,e*o)),n.getWorldDirection(fT);let s=Math.asin(r.MathUtils.clamp(fT.dot(n.up),-1,1)),c=r.MathUtils.clamp(s+t*o,-aT,aT);n.quaternion.multiply(gT.setFromAxisAngle(hT.set(1,0,0),c-s)),n.updateMatrixWorld(),i.copy(n.position).addScaledVector(n.getWorldDirection(fT),a),this.dispatchEvent(uT)}_onKeyDown(e){if(!(!this.active||e.defaultPrevented||e.target?.closest?.(cT))){if(e.metaKey||e.ctrlKey){this.release();return}this._factor=lT(e),sT[e.code]&&(e.preventDefault(),!this._held.has(e.code)&&(this._held.add(e.code),this._held.size===1&&(this._lastTime=performance.now(),this.dispatchEvent(dT))))}}_onKeyUp(e){this._factor=lT(e),this._held.delete(e.code)}release(){this._held.clear(),this._factor=1}_onPointerDown(e){!this.active||e.button!==0||!e.isPrimary||(this._drag={id:e.pointerId,x:e.clientX,y:e.clientY},this.domElement.setPointerCapture?.(e.pointerId))}_onPointerMove(e){let t=this._drag;if(!t||e.pointerId!==t.id)return;let n=e.clientX-t.x,r=e.clientY-t.y;t.x=e.clientX,t.y=e.clientY,this.active&&(n||r)&&this._look(n,r)}_onPointerUp(e){this._drag?.id===e.pointerId&&(this._drag=null,this.domElement.releasePointerCapture?.(e.pointerId))}};Ce();var vT=Object.freeze(new r.Vector3(1,1,1)),yT=e=>e?.isOrthographicCamera?(e.top-e.bottom)/e.zoom:null,bT=class extends r.EventDispatcher{constructor(e){super();let t=e.clientWidth,n=e.clientHeight;this.camera=new tT(60,t/n||1,.01,1e3),this.camera.position.set(0,0,5),this.controls=new h.OrbitControls(this.camera,e),this.controls.screenSpacePanning=!0,this.controls.zoomToCursor=!0,this.controls.saveState(),this._reportedOrthoHeight=null,this._reportOrthoHeight=this._reportOrthoHeight.bind(this),this.controls.addEventListener(`change`,this._reportOrthoHeight),this.walkControls=new _T(this.camera,e,this.controls),this.interactionManager=null,this.cameras=[this.camera],this.currentCameraIndex=0,this._userCameraCounter=0,this.autoFocusMode=ot.SMOOTHING_FACTOR?`auto`:`manual`,this.afScreenPoint={x:.5,y:.5},this.afSmoothingFactor=ot.SMOOTHING_FACTOR,this._lastValidFocusDistance=null,this._smoothedFocusDistance=null,this._afPointDirty=!1,this._afSuspended=!1,this._defaultCameraState=null,this._onResize=null,this._onReset=null,this._getSettings=null,this._applySettings=null}setCameras(e){this.cameras=e,this._userCameraCounter=0,this.resetAutoFocus()}addCameraFromView(e){let t=this.camera,n=t.orthographic?new r.OrthographicCamera(t.left,t.right,t.top,t.bottom,t.near,t.far):new r.PerspectiveCamera(t.fov,t.aspect,t.near,t.far);return n.zoom=t.zoom,n.position.copy(t.position),n.quaternion.copy(t.quaternion),n.scale.copy(t.scale),n.updateMatrixWorld(!0),n.userData.__rayzeeUserCamera=!0,n.userData.__rayzeeEffects=this._captureEffects(),this.controls&&(n.userData.__rayzeeOrbitTarget=this.controls.target.clone()),this._userCameraCounter+=1,n.name=e||`View Camera ${this._userCameraCounter}`,this.cameras.push(n),this.cameras.length-1}removeCamera(e){if(!Number.isInteger(e)||e<=0||e>=this.cameras.length||!this.cameras[e]?.userData?.__rayzeeUserCamera)return!1;let t=this.currentCameraIndex===e;return this.cameras.splice(e,1),t?(this.currentCameraIndex=-1,this.switchCamera(0)):this.currentCameraIndex>e&&--this.currentCameraIndex,!0}getCameraNames(){return!this.cameras||this.cameras.length===0?[`Default Camera`]:this.cameras.map((e,t)=>t===0?`Default Camera`:e.name||`Camera ${t}`)}initCallbacks({onResize:e,onReset:t,getSettings:n,applySettings:r}){this._onResize=e,this._onReset=t,this._getSettings=n,this._applySettings=r}_captureEffects(){let e=this._getSettings;return e?{enableDOF:e(`enableDOF`),focusDistance:e(`focusDistance`),aperture:e(`aperture`),focalLength:e(`focalLength`),apertureScale:e(`apertureScale`),anamorphicRatio:e(`anamorphicRatio`),dofBlur:e(`dofBlur`),autoFocusMode:this.autoFocusMode,afScreenPoint:{...this.afScreenPoint},orthoHeight:this.orthoHeight}:null}_applyEffects(e){e&&(this._applySettings?.({enableDOF:e.enableDOF,focusDistance:e.focusDistance,aperture:e.aperture,focalLength:e.focalLength,apertureScale:e.apertureScale,anamorphicRatio:e.anamorphicRatio,dofBlur:e.dofBlur}),e.autoFocusMode!==void 0&&this.setAutoFocusMode(e.autoFocusMode),e.afScreenPoint&&this.setAFScreenPoint(e.afScreenPoint.x,e.afScreenPoint.y))}switchCamera(e,t,n,i){if(t??=this._getSettings?.(`focusDistance`),n??=this._onResize,i??=this._onReset,!this.cameras||this.cameras.length===0)return;(e<0||e>=this.cameras.length)&&(console.warn(`CameraManager: Invalid camera index ${e}. Using default camera.`),e=0);let a=this.cameras[this.currentCameraIndex];if(a&&(a.userData.__rayzeeEffects=this._captureEffects()),this.currentCameraIndex===0&&e!==0&&(this._defaultCameraState={position:this.camera.position.clone(),quaternion:this.camera.quaternion.clone(),scale:this.camera.scale.clone(),fov:this.camera.fov,near:this.camera.near,far:this.camera.far,target:this.controls?this.controls.target.clone():null}),this.currentCameraIndex=e,e===0&&this._defaultCameraState){let e=this._defaultCameraState;this.camera.position.copy(e.position),this.camera.quaternion.copy(e.quaternion),this.camera.scale.copy(e.scale??vT),this.camera.fov=e.fov,this.camera.near=e.near,this.camera.far=e.far,this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(!0),this.controls&&e.target&&(this.controls.target.copy(e.target),this.controls.update())}else{let n=this.cameras[e];if(this.camera.position.copy(n.position),this.camera.quaternion.copy(n.quaternion),this.camera.scale.copy(n.scale),n.isPerspectiveCamera&&(this.camera.fov=n.fov),this.camera.near=n.near,this.camera.far=n.far,this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(!0),this.controls){let e=n.userData?.__rayzeeOrbitTarget;if(e)this.controls.target.copy(e);else{let e=new r.Vector3(0,0,-1).applyQuaternion(n.quaternion),i=t||5;this.controls.target.copy(this.camera.position).addScaledVector(e,i)}this.controls.update()}}this.resetAutoFocus();let o=this.cameras[e],s=o?.userData?.__rayzeeEffects;this._showOrthographic(s?s.orthoHeight:yT(o)),this._applyEffects(s),n?.(),i?.(),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:e,effects:this._captureEffects(),fov:this.camera.fov,cameraProjection:this._getSettings?.(`cameraProjection`)})}_showOrthographic(e){e>0?this._setView(!0,e/2):this._setView(!1);let t=this._getSettings?.(`cameraProjection`),n=e>0?`orthographic`:t===`orthographic`?`perspective`:t;n!==t&&this._applySettings?.({cameraProjection:n})}applyProjection(e){let t=this.camera,n=e===`orthographic`;if(t.orthographic!==n){if(n)this._setView(!0,this._fittedHalfHeight());else{let e=this.controls.target,n=this.orthoHeight/2/Math.tan(r.MathUtils.degToRad(t.fov)/2);t.position.sub(e).setLength(n).add(e),this._setView(!1)}this.controls.update()}}get orthoHeight(){return yT(this.camera)}setOrthoHeight(e){e>0&&(this._setView(this.camera.orthographic,e/2),this._onReset?.())}fitOrthographic(){this.camera.orthographic&&this.setOrthoHeight(2*this._fittedHalfHeight())}_setView(e,t=this.camera.orthoHalfHeight){let n=this.camera;n.orthographic=e,n.orthoHalfHeight=t,n.zoom=1,n.updateProjectionMatrix(),this._reportOrthoHeight()}_fittedHalfHeight(){return this.camera.position.distanceTo(this.controls.target)*Math.tan(r.MathUtils.degToRad(this.camera.fov)/2)}_reportOrthoHeight(){if(!this.camera.orthographic)return;let e=this.orthoHeight;e!==this._reportedOrthoHeight&&(this._reportedOrthoHeight=e,this.dispatchEvent({type:B.ORTHO_HEIGHT_UPDATED,height:e}))}focusOn(e){!e||!this.controls||(this.controls.target.copy(e),this.controls.update(),this._onReset?.())}setNavigationMode(e){let t=e===`walk`;if(this.walkControls.enabled===t)return;let n=this.controls;if(n.enableRotate=n.enablePan=n.enableZoom=!t,this.walkControls.enabled=t,t)return;this.walkControls.release();let i=this.interactionManager?.pickSurface(0,0);if(!i)return;let a=r.MathUtils.clamp(i.distance,n.minDistance,n.maxDistance);n.target.copy(this.camera.position).addScaledVector(this.camera.getWorldDirection(new r.Vector3),a),n.update()}get navigationMode(){return this.walkControls.enabled?`walk`:`orbit`}updateControls(){this.walkControls.update(),this.controls.update()}captureView(){let e=this.camera,t=this.orthoHeight??2*this._fittedHalfHeight();return{position:e.position.clone(),target:this.controls.target.clone(),fov:e.fov,orthoHeight:t}}applyPose(e){let t=this.camera;t.position.copy(e.position),t.lookAt(e.target),this.controls.target.copy(e.target),t.orthographic?this._setView(!0,e.orthoHeight/2):(t.fov=e.fov,t.updateProjectionMatrix()),t.updateMatrixWorld()}serialize(){let e=this.camera,t=this._defaultCameraState;return{current:this.currentCameraIndex,view:{position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),fov:e.fov,near:e.near,far:e.far,zoom:e.zoom,orthographic:!!e.orthographic,orthoHalfHeight:e.orthoHalfHeight,target:this.controls.target.toArray()},defaultView:t?{position:t.position.toArray(),quaternion:t.quaternion.toArray(),scale:t.scale.toArray(),fov:t.fov,near:t.near,far:t.far,target:t.target?.toArray()??null}:null,navigationMode:this.navigationMode,autoFocus:{mode:this.autoFocusMode,point:{...this.afScreenPoint}},cameras:this.cameras.map((e,t)=>{let n={index:t,name:e.name??``,effects:Kr(e.userData?.__rayzeeEffects)??null};return t===0||!e.userData?.__rayzeeUserCamera?n:{...n,user:!0,orthographic:!!e.isOrthographicCamera,frustum:e.isOrthographicCamera?[e.left,e.right,e.top,e.bottom]:null,fov:e.fov??null,aspect:e.aspect??null,near:e.near,far:e.far,zoom:e.zoom,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),orbitTarget:e.userData.__rayzeeOrbitTarget?.toArray()??null}})}}restore(e){let t=[];if(!e)return{mismatched:t};this.cameras=this.cameras.filter(e=>!e.userData?.__rayzeeUserCamera);let n=new Map;for(let i of e.cameras??[]){if(i.user){let e=i.orthographic?new r.OrthographicCamera(...i.frustum,i.near,i.far):new r.PerspectiveCamera(i.fov,i.aspect,i.near,i.far);e.name=i.name,e.zoom=i.zoom??1,e.position.fromArray(i.position),e.quaternion.fromArray(i.quaternion),e.scale.fromArray(i.scale),e.updateProjectionMatrix(),e.updateMatrixWorld(!0),e.userData.__rayzeeUserCamera=!0,e.userData.__rayzeeEffects=qr(i.effects),i.orbitTarget&&(e.userData.__rayzeeOrbitTarget=new r.Vector3().fromArray(i.orbitTarget)),n.set(i.index,this.cameras.length),this.cameras.push(e);continue}let e=this.cameras[i.index];if(!e||i.index>0&&(e.name??``)!==i.name){t.push(i.name);continue}n.set(i.index,i.index),i.effects&&(e.userData.__rayzeeEffects=qr(i.effects))}this._userCameraCounter=this.cameras.filter(e=>e.userData?.__rayzeeUserCamera).length,this.currentCameraIndex=n.get(e.current)??0;let i=e.defaultView;this._defaultCameraState=i?{position:new r.Vector3().fromArray(i.position),quaternion:new r.Quaternion().fromArray(i.quaternion),scale:new r.Vector3().fromArray(i.scale),fov:i.fov,near:i.near,far:i.far,target:i.target?new r.Vector3().fromArray(i.target):null}:null,e.navigationMode&&this.setNavigationMode(e.navigationMode);let a=e.view;if(a){let e=this.camera;e.position.fromArray(a.position),e.quaternion.fromArray(a.quaternion),e.scale.fromArray(a.scale),e.fov=a.fov,e.near=a.near,e.far=a.far,this._setView(a.orthographic,a.orthoHalfHeight),e.zoom=a.zoom??1,e.updateProjectionMatrix(),e.updateMatrixWorld(!0),this.controls.target.fromArray(a.target),this.controls.update()}return e.autoFocus&&(this.setAutoFocusMode(e.autoFocus.mode),this.setAFScreenPoint(e.autoFocus.point.x,e.autoFocus.point.y)),this.resetAutoFocus(),this._reportOrthoHeight(),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:this.currentCameraIndex,effects:this._captureEffects(),fov:this.camera.fov,cameraProjection:this._getSettings?.(`cameraProjection`)}),{mismatched:t}}get active(){return this.camera}getNames(){return this.getCameraNames()}setAutoFocusMode(e){this.autoFocusMode=e,e!==`manual`&&(this._smoothedFocusDistance=null,this._afPointDirty=!0)}resetAutoFocus(){this._lastValidFocusDistance=null,this._smoothedFocusDistance=null,this._afPointDirty=!0}setAFScreenPoint(e,t){this.afScreenPoint={x:e,y:t},this._afPointDirty=!0}enterAFPointPlacementMode(){this.interactionManager&&(this.interactionManager.enterAFPointPlacementMode(),this.controls&&(this.controls.enabled=!1))}exitAFPointPlacementMode(){this.interactionManager&&(this.interactionManager.exitAFPointPlacementMode(),this.controls&&(this.controls.enabled=!0))}updateAutoFocus(e){let t=e||this._afContext;if(!t||!this.interactionManager)return;let{assetLoader:n,currentFocusDistance:r,pathTracer:i,setFocusDistance:a,softReset:o,hardReset:s}=t;if(this.autoFocusMode===`manual`)return;if(!i?.enableDOF?.value||i.cameraProjection?.value===Ke.equirectangular){this._afSuspended=!0;return}this._afSuspended&&(this._afSuspended=!1,this._smoothedFocusDistance=null);let c=i;if(c?.isReady&&c.renderMode?.value===1&&c.frameCount>0&&!c.isComplete)return;let l=this.interactionManager.pickSurface(this.afScreenPoint.x*2-1,1-this.afScreenPoint.y*2),u;if(l)u=Pb(l.point,this.camera),this._lastValidFocusDistance=u;else if(this._lastValidFocusDistance!==null)u=this._lastValidFocusDistance;else{let e=this.controls?Pb(this.controls.target,this.camera):0;u=e>0?e:ot.FALLBACK_DISTANCE*(n?.getSceneScale()||1),this._lastValidFocusDistance=u}let d=this._afPointDirty;this._afPointDirty=!1,d||this._smoothedFocusDistance===null||this._smoothedFocusDistance===0||Math.abs(u-this._smoothedFocusDistance)/this._smoothedFocusDistance>ot.SNAP_THRESHOLD?this._smoothedFocusDistance=u:this._smoothedFocusDistance+=this.afSmoothingFactor*(u-this._smoothedFocusDistance);let f=r,p=this._smoothedFocusDistance;if(d||f===0||Math.abs(p-f)/Math.max(f,.001)>.001){a(p);let e=n?.getSceneScale()||1;this.dispatchEvent({type:B.AUTO_FOCUS_UPDATED,distance:p/e,worldDistance:p});let t=Math.abs(p-f)/Math.max(f,.001);d?s?.():t>ot.RESET_THRESHOLD&&o?.()}}setInteractionManager(e){this.interactionManager=e}initAutoFocus({assetLoader:e,pathTracer:t,settings:n,softReset:r,hardReset:i}){this._afContext={assetLoader:e,pathTracer:t,setFocusDistance:e=>n.set(`focusDistance`,e,{silent:!0}),softReset:r,hardReset:i},Object.defineProperty(this._afContext,`currentFocusDistance`,{get:()=>n.get(`focusDistance`)})}dispose(){this.walkControls?.dispose(),this.controls?.removeEventListener(`change`,this._reportOrthoHeight),this.controls?.dispose()}},xT=.001,ST=2,CT=(e,t,n,i)=>new e(t,n,i,r.InterpolateSmooth).createInterpolant(),wT=class{constructor(e,t){this._cameraManager=e,this._onChange=t,this.keys=[],this._nextId=1,this._interpolants=null}get animates(){return this.keys.length>1}get duration(){return this.keys.length?this.keys[this.keys.length-1].time:0}addKey(e=this.keys.length?this.duration+ST:0){return this.add(this._cameraManager.captureView(),e)}updateKey(e){this.update(e,this._cameraManager.captureView())}seek(e){let t=this.sample(e);return t&&this._cameraManager.applyPose(t),!!t}add(e,t){let n={id:this._nextId++,time:t,...TT(e)};return this.keys.push(n),this._changed(),n}update(e,t){let n=this.get(e);n&&(Object.assign(n,TT(t)),this._changed())}setTime(e,t){let n=this.get(e);!n||!(t>=0)||(n.time=t,this._changed())}remove(e){let t=this.keys.length;this.keys=this.keys.filter(t=>t.id!==e),this.keys.length!==t&&this._changed()}clear(){this.keys.length&&(this.keys=[],this._changed())}serialize(){return this.keys.map(({time:e,position:t,target:n,fov:r,orthoHeight:i})=>({time:e,position:t.toArray(),target:n.toArray(),fov:r,orthoHeight:i}))}restore(e){this.keys=(e??[]).map(e=>({id:this._nextId++,time:e.time,position:new r.Vector3().fromArray(e.position),target:new r.Vector3().fromArray(e.target),fov:e.fov,orthoHeight:e.orthoHeight})),this._changed()}dispose(){this._cameraManager=this._onChange=null}get(e){return this.keys.find(t=>t.id===e)}sample(e,t={position:new r.Vector3,target:new r.Vector3,fov:0,orthoHeight:0}){if(!this.keys.length)return null;let{position:n,target:i,fov:a,logHeight:o,start:s,end:c}=this._interpolants??=this._build(),l=r.MathUtils.clamp(e,s,c);return t.position.fromArray(n.evaluate(l)),t.target.fromArray(i.evaluate(l)),t.fov=a.evaluate(l)[0],t.orthoHeight=Math.exp(o.evaluate(l)[0]),t}_build(){let e=[];for(let t of this.keys)e.push(e.length?Math.max(t.time,e[e.length-1]+xT):t.time);let t=e[0],n=e[e.length-1],i=this.keys;if(i.length>1){let r=i.length;e.unshift(2*t-e[1]),e.push(2*n-e[r-1]),i=[i[1],...i,i[r-2]]}let a=e=>i.flatMap(t=>e(t).toArray());return{start:t,end:n,position:CT(r.VectorKeyframeTrack,`.position`,e,a(e=>e.position)),target:CT(r.VectorKeyframeTrack,`.target`,e,a(e=>e.target)),fov:CT(r.NumberKeyframeTrack,`.fov`,e,i.map(e=>e.fov)),logHeight:CT(r.NumberKeyframeTrack,`.orthoHeight`,e,i.map(e=>Math.log(e.orthoHeight)))}}_changed(){this.keys.sort((e,t)=>e.time-t.time),this._interpolants=null,this._onChange?.()}};function TT({position:e,target:t,fov:n,orthoHeight:r}){return{position:e.clone(),target:t.clone(),fov:n,orthoHeight:r}}Ce();var ET=class extends r.EventDispatcher{constructor({cameraManager:e,onReset:t}){super(),this._cameraManager=e,this._onReset=t,this.camera=new wT(e,()=>this._changed(`camera`)),this._playback=null,this._timer=new r.Timer,typeof document<`u`&&this._timer.connect(document)}get duration(){return this.camera.duration}get animates(){return this.camera.animates}seek(e){return this.camera.seek(e)}play(){return this.stop(),new Promise(e=>{let t=this._cameraManager.controls;this._playback={elapsed:0,resolve:e,controlsEnabled:t.enabled},t.enabled=!1,this._timer.reset(),this._changed(),this._onReset?.()})}stop(){let e=this._playback;e&&(this._playback=null,this._cameraManager.controls.enabled=e.controlsEnabled,this._changed(),e.resolve())}get isPlaying(){return!!this._playback}update(){let e=this._playback;if(!e)return;this._timer.update(),e.elapsed+=this._timer.getDelta();let t=r.MathUtils.clamp(e.elapsed,0,this.duration);this.seek(t),t>=this.duration&&this.stop()}serialize(){return{camera:this.camera.serialize()}}restore(e){this.stop(),this.camera.restore(e?.camera)}clear(){this.stop(),this.camera.clear()}dispose(){this.stop(),this._timer.dispose(),this.camera.dispose(),this._cameraManager=this._onReset=null}_changed(e){this.dispatchEvent({type:B.TIMELINE_CHANGED,track:e})}},DT=`__rayzeeUserLight`,OT={DirectionalLight:r.DirectionalLight,PointLight:r.PointLight,SpotLight:r.SpotLight,RectAreaLight:r.RectAreaLight},kT=class extends r.EventDispatcher{constructor(e,t,n,r={}){super(),this.scene=e,this.sceneHelpers=t,this.pathTracer=n,this._onReset=r.onReset||null,this._onLightRemoved=r.onLightRemoved||null}addLight(e){let t={DirectionalLight:{position:[1,1,1],intensity:1,color:`#ffffff`},PointLight:{position:[0,2,0],intensity:1e3,color:`#ffffff`},SpotLight:{position:[0,1,0],intensity:1e3,color:`#ffffff`,angle:15},RectAreaLight:{position:[0,2,0],intensity:100,color:`#ffffff`,width:2,height:2}}[e];if(!t)return null;let n;if(e===`DirectionalLight`)n=new r.DirectionalLight(t.color,t.intensity),n.position.fromArray(t.position);else if(e===`PointLight`)n=new r.PointLight(t.color,t.intensity),n.position.fromArray(t.position);else if(e===`SpotLight`){n=new r.SpotLight(t.color,t.intensity),n.position.fromArray(t.position),n.angle=r.MathUtils.degToRad(t.angle);let e=new r.Object3D;this.scene.add(e),n.target=e}else e===`RectAreaLight`&&(n=new r.RectAreaLight(t.color,t.intensity,t.width,t.height),n.position.fromArray(t.position),n.lookAt(0,0,0),n.userData.normalize=!0,n.userData.spread=Math.PI,n.userData.shape=`rectangle`);n.userData[DT]=!0,n.userData.temperature=6500,n.userData.useTemperature=!1,n.userData.exposure=0;let i=this.scene.getObjectsByProperty(`isLight`,!0).length;return n.name=`${e.replace(`Light`,``)} ${i+1}`,this.scene.add(n),this.updateLights(),this._syncHelpers(),this._onReset?.(),this._buildDescriptor(n)}removeLight(e){let t=this.scene.getObjectByProperty(`uuid`,e);return!t||!t.isLight?!1:(this._onLightRemoved?.(t),this.sceneHelpers.remove(t),t.target&&t.target.removeFromParent(),t.removeFromParent(),this.updateLights(),this._onReset?.(),!0)}clearLights(){this.sceneHelpers.clear(),this._removeAllLights(),this.updateLights(),this._onReset?.()}getLights(){return this.scene.getObjectsByProperty(`isLight`,!0).map(e=>this._buildDescriptor(e))}updateLights(){this.pathTracer?.updateLights(),this.sceneHelpers?.visible&&this.sceneHelpers.update()}transferSceneLights(e,{keepUserLights:t=!1}={}){this._removeAllLights(t?e=>!e.userData?.[DT]:void 0);let n=e.getObjectsByProperty(`isLight`,!0);if(!n||n.length===0){this.updateLights();return}for(let e of n){let t=e.clone();if(e.updateWorldMatrix(!0,!1),e.getWorldPosition(t.position),e.getWorldQuaternion(t.quaternion),e.getWorldScale(t.scale),t.isRectAreaLight&&(t.width*=t.scale.x,t.height*=t.scale.y,t.scale.set(1,1,1)),(e.isSpotLight||e.isDirectionalLight)&&e.target){let n=new r.Object3D;e.target.updateWorldMatrix(!0,!1),e.target.getWorldPosition(n.position),this.scene.add(n),t.target=n}this.scene.add(t)}this.updateLights(),this._syncHelpers()}setShowLightHelper(e){this.sceneHelpers.visible=e,e?this._syncHelpers():this.sceneHelpers.clear()}serialize(){return this.scene.getObjectsByProperty(`isLight`,!0).map(e=>{let t={type:e.type,name:e.name,visible:e.visible,color:[e.color.r,e.color.g,e.color.b],intensity:e.intensity,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),userData:Kr(e.userData)??{}};return e.isSpotLight&&Object.assign(t,{angle:e.angle,penumbra:e.penumbra,distance:e.distance,decay:e.decay}),e.isPointLight&&Object.assign(t,{distance:e.distance,decay:e.decay}),e.isRectAreaLight&&Object.assign(t,{width:e.width,height:e.height}),e.target&&(e.isSpotLight||e.isDirectionalLight)&&(t.target=e.target.position.toArray()),t})}restore(e){this.sceneHelpers?.clear(),this._removeAllLights();let t=[];for(let n of e??[]){let e=OT[n.type];if(!e)continue;let i=new e;i.name=n.name??``,i.visible=n.visible!==!1,i.color.setRGB(...n.color),i.intensity=n.intensity,i.position.fromArray(n.position),i.quaternion.fromArray(n.quaternion),i.scale.fromArray(n.scale??[1,1,1]),i.userData=qr(n.userData)??{};for(let e of[`angle`,`penumbra`,`distance`,`decay`,`width`,`height`])typeof n[e]==`number`&&(i[e]=n[e]);if(n.target){let e=new r.Object3D;e.position.fromArray(n.target),this.scene.add(e),i.target=e}this.scene.add(i),t.push(i)}return this.updateLights(),this._syncHelpers(),this._onReset?.(),t}add(e){return this.addLight(e)}remove(e){return this.removeLight(e)}clear(){this.clearLights()}getAll(){return this.getLights()}sync(){this.updateLights()}showHelpers(e){this.setShowLightHelper(e)}dispose(){this._disposed||(this._disposed=!0,this._onLightRemoved=null,this.sceneHelpers?.clear(),this._removeAllLights(),this._onReset=null,this.pathTracer=null,this.sceneHelpers=null,this.scene=null)}_removeAllLights(e){this.scene.getObjectsByProperty(`isLight`,!0).filter(t=>!e||e(t)).forEach(e=>{this._onLightRemoved?.(e),e.target&&this.scene.remove(e.target),this.scene.remove(e)})}_syncHelpers(){if(!this.sceneHelpers.visible)return;let e=this.scene.getObjectsByProperty(`isLight`,!0);this.sceneHelpers.sync(e)}_buildDescriptor(e){let t=0;e.type===`SpotLight`&&e.angle!==void 0?t=r.MathUtils.radToDeg(e.angle):e.type===`DirectionalLight`&&(t=r.MathUtils.radToDeg(e.userData?.angle??0));let n={uuid:e.uuid,name:e.name,type:e.type,visible:e.visible,intensity:e.intensity,color:`#${e.color.getHexString()}`,position:[e.position.x,e.position.y,e.position.z],angle:t,temperature:e.userData?.temperature??6500,useTemperature:e.userData?.useTemperature??!1,exposure:e.userData?.exposure??0};if(e.type===`RectAreaLight`){n.width=e.width,n.height=e.height,n.normalize=e.userData?.normalize??!0,n.spread=r.MathUtils.radToDeg(e.userData?.spread??Math.PI);let t=e.userData?.shape;n.shape=t===`square`||t===`rectangle`||t===`disk`||t===`ellipse`?t:t===1?`ellipse`:`rectangle`;let i=e.getWorldDirection(e.position.clone());n.target=[e.position.x+i.x,e.position.y+i.y,e.position.z+i.z]}else e.type===`SpotLight`&&e.target?(n.target=[e.target.position.x,e.target.position.y,e.target.position.z],n.distance=e.distance??0,n.penumbra=e.penumbra??0,n.decay=e.decay??2):e.type===`PointLight`&&(n.distance=e.distance??0,n.decay=e.decay??2);return(e.type===`SpotLight`||e.type===`DirectionalLight`)&&e.userData?.gobo&&(n.gobo=e.userData.gobo.name,n.goboIntensity=e.userData.gobo.intensity,n.goboInverted=!!e.userData.gobo.inverted,e.type===`DirectionalLight`&&(n.goboScale=e.userData.gobo.scale??5)),e.type===`SpotLight`&&e.userData?.ies&&(n.ies=e.userData.ies.name,n.iesIntensity=e.userData.ies.intensity??1,n.fixtureLumens=e.userData.ies.fixtureLumens??null),n}},AT=class{constructor(e,t={}){this.pathTracer=e,this._onReset=t.onReset||null,this.texture=null,this.entries=[],this._size=256}async loadLibrary(e,{size:t=256}={}){if(!Array.isArray(e)||e.length===0)return[];this._size=t;let n=await Promise.all(e.map(e=>jT(e.url))),i=t,a=t,o=n.length,s=new Uint8Array(i*a*o*4),c=document.createElement(`canvas`);c.width=i,c.height=a;let l=c.getContext(`2d`,{willReadFrequently:!0});for(let e=0;e<o;e++){l.clearRect(0,0,i,a),l.drawImage(n[e],0,0,i,a);let t=l.getImageData(0,0,i,a);s.set(t.data,e*i*a*4)}let u=new r.DataArrayTexture(s,i,a,o);u.minFilter=r.LinearFilter,u.magFilter=r.LinearFilter,u.format=r.RGBAFormat,u.type=r.UnsignedByteType,u.generateMipmaps=!1,u.needsUpdate=!0;let d=this.texture;return this.texture=u,this.entries=e.map((e,t)=>({name:e.name,index:t})),this.pathTracer.goboMaps=u,this.pathTracer.shaderBuilder?.updateGoboMaps?.(u),d?.dispose?.(),this.entries}getEntries(){return this.entries.slice()}setLightGobo(e,t,n={}){let{intensity:r=1,inverted:i=!1,scale:a=5}=n,o=this._findGoboLight(e);if(!o)return!1;if(o.userData=o.userData||{},t==null)delete o.userData.gobo;else{let e=this.entries.find(e=>e.name===t);if(!e)return console.warn(`GoboManager: unknown gobo "${t}"`),!1;o.userData.gobo={name:e.name,index:e.index,intensity:MT(r),inverted:!!i,scale:Math.max(1e-4,a)}}return this.pathTracer.updateLights(),this._onReset?.(),!0}setLightGoboInverted(e,t){let n=this._findGoboLight(e);return n?.userData?.gobo?(n.userData.gobo.inverted=!!t,this.pathTracer.updateLights(),this._onReset?.(),!0):!1}setLightGoboScale(e,t){let n=this._findGoboLight(e);return n?.userData?.gobo?(n.userData.gobo.scale=Math.max(1e-4,t),this.pathTracer.updateLights(),this._onReset?.(),!0):!1}getLightGobo(e){return this._findGoboLight(e)?.userData?.gobo||null}setSpotLightGobo(e,t,n=1,r=!1){return this.setLightGobo(e,t,{intensity:n,inverted:r})}setSpotLightGoboInverted(e,t){return this.setLightGoboInverted(e,t)}getSpotLightGobo(e){return this.getLightGobo(e)}dispose(){this.texture?.dispose?.(),this.texture=null,this.entries=[],this.pathTracer=null,this._onReset=null}_findGoboLight(e){let t=this.pathTracer?.scene?.getObjectByProperty?.(`uuid`,e);return t&&(t.isSpotLight||t.isDirectionalLight)?t:null}_findSpotLight(e){let t=this.pathTracer?.scene?.getObjectByProperty?.(`uuid`,e);return t&&t.isSpotLight?t:null}};async function jT(e){let t=await jg(e);try{return await new Promise((n,r)=>{let i=new Image;i.crossOrigin=`anonymous`,i.onload=()=>n(i),i.onerror=()=>r(Error(`Failed to load gobo image: ${e}`)),i.src=t.url})}finally{t.release()}}function MT(e){return Math.max(0,Math.min(1,e))}function NT(e,t=`ies`){let n=e.search(/TILT\s*=/i);if(n<0)throw Error(`IES (${t}): missing TILT line`);let r=e.indexOf(`
|
|
971
|
+
`),mb=class extends xe{constructor(e,r={}){super(`AutoExposure`,{...r,executionMode:be.ALWAYS}),this.renderer=e,this.REDUCTION_SIZE=64,this.keyValueU=(0,n.uniform)(r.keyValue??.18),this.minExposureU=(0,n.uniform)(r.minExposure??.1),this.maxExposureU=(0,n.uniform)(r.maxExposure??20),this.adaptSpeedBrightU=(0,n.uniform)(r.adaptSpeedBright??3),this.adaptSpeedDarkU=(0,n.uniform)(r.adaptSpeedDark??.5),this.epsilonU=(0,n.uniform)(r.epsilon??1e-4),this.deltaTimeU=(0,n.uniform)(1/60),this.isFirstFrameU=(0,n.uniform)(1),this.previousExposureU=(0,n.uniform)(r.initialExposure??1),this.lowPercentileU=(0,n.uniform)(r.lowPercentile??.1),this.highPercentileU=(0,n.uniform)(r.highPercentile??.9),this.centerWeightU=(0,n.uniform)(r.centerWeight??8),this.inputResW=(0,n.uniform)(1),this.inputResH=(0,n.uniform)(1),this._inputTexNode=new t.TextureNode,this._reductionReadTexNode=new t.TextureNode,this.currentExposure=r.initialExposure??1,this.currentLuminance=.18,this.targetExposure=1,this.lastTime=performance.now(),this.isFirstFrame=!0,this._pendingReadback=!1,this._readbackGeneration=0,this._initRenderTargets(),this._buildCompute()}_initRenderTargets(){let e={type:r.FloatType,format:r.RGBAFormat,minFilter:r.NearestFilter,magFilter:r.NearestFilter,depthBuffer:!1,stencilBuffer:!1};this._downsampleTarget=new t.RenderTarget(this.REDUCTION_SIZE,this.REDUCTION_SIZE,e),this._downsampleStorageTex=new t.StorageTexture(this.REDUCTION_SIZE,this.REDUCTION_SIZE),this._downsampleStorageTex.type=r.FloatType,this._downsampleStorageTex.format=r.RGBAFormat,this._downsampleStorageTex.minFilter=r.NearestFilter,this._downsampleStorageTex.magFilter=r.NearestFilter,this._reductionStorageTex=new t.StorageTexture(1,1),this._reductionStorageTex.type=r.FloatType,this._reductionStorageTex.format=r.RGBAFormat,this._reductionStorageTex.minFilter=r.NearestFilter,this._reductionStorageTex.magFilter=r.NearestFilter,this._reductionReadTarget=new t.RenderTarget(1,1,e),this._adaptationResult=(0,n.attributeArray)(1,`vec4`),this._readbackBuffer=new t.ReadbackBuffer(16),this._readbackBuffer.name=`AutoExposureAdaptation`,this._histogramBuffer=(0,n.attributeArray)(cb,`uint`).toAtomic()}_buildCompute(){this._buildDownsampleCompute(),this._buildHistogramCompute(),this._buildHistogramAnalyzeCompute(),this._buildAdaptationCompute()}_buildDownsampleCompute(){let e=this._inputTexNode,t=this._downsampleStorageTex,r=this.epsilonU,i=this.inputResW,a=this.inputResH;this._downsampleComputeNode=(0,n.Fn)(()=>{let o=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),s=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y)),c=i.div((0,n.float)(64)),l=a.div((0,n.float)(64)),u=(0,n.float)(o).mul(c),d=(0,n.float)(s).mul(l),f=(0,n.float)(0).toVar(),p=(0,n.float)(0).toVar();for(let t=0;t<4;t++)for(let i=0;i<4;i++){let a=Ui((0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(u.add((0,n.float)((i+.5)/4).mul(c))),(0,n.int)(d.add((0,n.float)((t+.5)/4).mul(l))))).xyz);(0,n.If)(a.greaterThan(r),()=>{f.addAssign(a.add(r).log()),p.addAssign(1)})}(0,n.textureStore)(t,(0,n.uvec2)((0,n.uint)(o),(0,n.uint)(s)),(0,n.vec4)(f,p,0,1)).toWriteOnly()})().compute([64/8,64/8,1],[8,8,1])}_buildHistogramCompute(){let e=this._downsampleTarget.texture,t=this._histogramBuffer,r=this.centerWeightU;this._histogramComputeNode=(0,n.Fn)(()=>{let i=n.localId.x;(0,n.atomicStore)(t.element(i),(0,n.uint)(0)),(0,n.workgroupBarrier)();for(let a=0;a<16;a++){let o=i.mul(16).add(a),s=o.mod(64),c=o.div(64),l=(0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(s),(0,n.int)(c))),u=l.x,d=l.y;(0,n.If)(d.greaterThan(0),()=>{let e=(0,n.uint)(u.div(d).sub((0,n.float)(lb)).div((0,n.float)(ub)).mul((0,n.float)(cb)).floor().clamp(0,(0,n.float)(cb-1))),i=(0,n.float)(s).add(.5).div((0,n.float)(64)),a=(0,n.float)(c).add(.5).div((0,n.float)(64)),o=i.sub(.5),l=a.sub(.5),f=(0,n.uint)(o.mul(o).add(l.mul(l)).mul(r).negate().exp().mul((0,n.float)(fb)));(0,n.atomicAdd)(t.element(e),f)})}})().compute([1,1,1],[256,1,1])}_buildHistogramAnalyzeCompute(){let e=this._histogramBuffer,t=this._reductionStorageTex,r=this.lowPercentileU,i=this.highPercentileU;this._histogramAnalyzeNode=(0,n.Fn)(()=>{let a=(0,n.float)(0).toVar();(0,n.Loop)(cb,({i:t})=>{a.addAssign((0,n.float)((0,n.atomicLoad)(e.element(t))))});let o=a.mul(r),s=a.mul(i),c=(0,n.float)(0).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.float)(0).toVar(),d=(0,n.float)(0).toVar();(0,n.Loop)(cb,({i:t})=>{let r=(0,n.float)((0,n.atomicLoad)(e.element(t)));d.assign(c),c.addAssign(r),(0,n.If)(d.lessThan(s).and(c.greaterThan(o)),()=>{let e=(0,n.float)(lb).add((0,n.float)(t).add(.5).mul((0,n.float)(db)));l.addAssign(e.mul(r)),u.addAssign(r)})});let f=(0,n.max)(u,(0,n.float)(1)),p=l.div(f),m=p.exp();(0,n.textureStore)(t,(0,n.uvec2)((0,n.uint)(0),(0,n.uint)(0)),(0,n.vec4)(m,a,p,1)).toWriteOnly()})().compute(1,[1,1,1])}_buildAdaptationCompute(){let e=this._reductionReadTexNode,t=this._adaptationResult,r=this.keyValueU,i=this.minExposureU,a=this.maxExposureU,o=this.adaptSpeedBrightU,s=this.adaptSpeedDarkU,c=this.deltaTimeU,l=this.isFirstFrameU,u=this.previousExposureU;this._adaptationComputeNode=(0,n.Fn)(()=>{let d=(0,n.textureLoad)(e,(0,n.ivec2)((0,n.int)(0),(0,n.int)(0))).x,f=pb(d,u,r,i,a,o,s,c,l);t.element((0,n.uint)(0)).assign(f)})().compute(1,[1,1,1])}setupEventListeners(){this.on(`pipeline:reset`,()=>this.reset()),this.on(`autoexposure:resetHistory`,()=>this.resetHistory()),this.on(`autoexposure:toggle`,e=>{this.enabled=e}),this.on(`autoexposure:updateParameters`,e=>e&&this.updateParameters(e))}render(e){if(!this.enabled)return;let t=e.getTexture(`edgeFiltering:output`)||e.getTexture(`asvgf:output`)||e.getTexture(`pathtracer:color`);if(!t)return;let n=performance.now(),r=Math.min((n-this.lastTime)/1e3,.1);if(this.lastTime=n,this.deltaTimeU.value=this.isFirstFrame?1:r,this.isFirstFrameU.value=+!!this.isFirstFrame,this.previousExposureU.value=this.currentExposure,this.inputResW.value=t.image?.width||1,this.inputResH.value=t.image?.height||1,this._inputTexNode.value=t,this.renderer.compute(this._downsampleComputeNode),this.renderer.copyTextureToTexture(this._downsampleStorageTex,this._downsampleTarget.texture),this.renderer.compute(this._histogramComputeNode),this.renderer.compute(this._histogramAnalyzeNode),this.renderer.copyTextureToTexture(this._reductionStorageTex,this._reductionReadTarget.texture),this._reductionReadTexNode.value=this._reductionReadTarget.texture,this.renderer.compute(this._adaptationComputeNode),!this._pendingReadback){this._pendingReadback=!0;let e=this._readbackGeneration;this.renderer.getArrayBufferAsync(this._adaptationResult.value,this._readbackBuffer).then(t=>{let n=t&&t.buffer?new Float32Array(t.buffer.slice(0)):null;this._readbackBuffer.release(),this._pendingReadback=!1,n&&e===this._readbackGeneration&&this._applyReadback(n)}).catch(()=>{try{this._readbackBuffer.release()}catch{}this._pendingReadback=!1})}e.setState(`autoexposure:value`,this.currentExposure),e.setState(`autoexposure:avgLuminance`,this.currentLuminance),this.emit(`autoexposure:updated`,{exposure:this.currentExposure,luminance:this.currentLuminance,targetExposure:this.targetExposure}),this.isFirstFrame=!1}_applyReadback(e){if(!this.enabled||!e||e.length<3)return;let t=e[0],n=e[1],r=e[2];(!isFinite(t)||t<=0)&&(t=1),(!isFinite(n)||n<=0)&&(n=.18),(!isFinite(r)||r<=0)&&(r=t),this.currentExposure=t,this.currentLuminance=n,this.targetExposure=r,this.renderer.toneMappingExposure=t}reset(){this.lastTime=performance.now(),this._readbackGeneration++,this._pendingReadback=!1}resetHistory(){this.isFirstFrame=!0,this.currentExposure=1,this.currentLuminance=.18,this.targetExposure=1,this.lastTime=performance.now(),this._readbackGeneration++,this._pendingReadback=!1}setSize(){}setExposure(e){this.currentExposure=e,this.previousExposureU.value=e,this.renderer.toneMappingExposure=e}getExposure(){return this.currentExposure}getLuminance(){return this.currentLuminance}updateParameters(e){e.keyValue!==void 0&&(this.keyValueU.value=e.keyValue),e.minExposure!==void 0&&(this.minExposureU.value=e.minExposure),e.maxExposure!==void 0&&(this.maxExposureU.value=e.maxExposure),e.adaptSpeedBright!==void 0&&(this.adaptSpeedBrightU.value=e.adaptSpeedBright),e.adaptSpeedDark!==void 0&&(this.adaptSpeedDarkU.value=e.adaptSpeedDark),e.lowPercentile!==void 0&&(this.lowPercentileU.value=e.lowPercentile),e.highPercentile!==void 0&&(this.highPercentileU.value=e.highPercentile),e.centerWeight!==void 0&&(this.centerWeightU.value=e.centerWeight)}dispose(){this._downsampleComputeNode?.dispose(),this._histogramComputeNode?.dispose(),this._histogramAnalyzeNode?.dispose(),this._adaptationComputeNode?.dispose(),this._downsampleTarget?.dispose(),this._downsampleStorageTex?.dispose(),this._reductionStorageTex?.dispose(),this._reductionReadTarget?.dispose(),this._readbackBuffer?.dispose(),this._inputTexNode?.dispose(),this._reductionReadTexNode?.dispose()}},hb=class extends xe{constructor(e,i={}){super(`Compositor`,{...i,executionMode:be.ALWAYS}),this.renderer=e,this.saturation=(0,n.uniform)(i.saturation??1),this._transparentBackground=(0,n.uniform)(0,`int`),this._pathTracer=i.pathTracer??null,this._convergenceOverlay=!1,this._debugMaterial=null,this._debugQuad=null,this._debugTexNode=null,this._debugM2Attr=null,this._debugMaskAttr=null,this._debugExposureComp=(0,n.uniform)(1),this._sourceTexNode=new t.TextureNode;let a=this._sourceTexNode.sample((0,n.uv)()),o=(0,n.mix)((0,n.vec3)((0,n.dot)(a.xyz,Ii)),a.xyz,this.saturation),s=(0,n.select)(this._transparentBackground,a.w,1);this.compositorMaterial=new t.MeshBasicNodeMaterial,this.compositorMaterial.colorNode=(0,n.vec4)(o,s),this.compositorMaterial.blending=r.NoBlending,this.compositorQuad=new t.QuadMesh(this.compositorMaterial)}_resolveSourceTexture(e){return e.getTexture(`bloom:output`)||this.resolveLightTexture(e)}resolveLightTexture(e){return e.getTexture(`oidn:output`)||e.getTexture(`edgeFiltering:output`)||e.getTexture(`bilateralFiltering:output`)||e.getTexture(`asvgf:output`)||e.getTexture(`nrd:output`)||e.getTexture(`pathtracer:color`)}_ensureDebugMaterial(){let e=this._pathTracer?.getConvergenceDebugSource?.();if(!e)return!1;if(this._debugMaterial&&this._debugM2Attr===e.m2&&this._debugMaskAttr===e.frozenMask)return!0;this._debugMaterial?.dispose(),this._debugTexNode?.dispose(),this._debugM2Attr=e.m2,this._debugMaskAttr=e.frozenMask,this._debugTexNode=new t.TextureNode;let i=(0,n.Fn)(()=>{let t=(0,n.dot)(this._debugTexNode.sample((0,n.uv)()).toVar().xyz,Ii).toVar(),r=e.renderWidth,i=e.renderHeight,a=(0,n.int)((0,n.uv)().x.mul((0,n.float)(r))).min(r.sub((0,n.int)(1))).max((0,n.int)(0)),o=(0,n.uint)((0,n.int)((0,n.uv)().y.mul((0,n.float)(i))).min(i.sub((0,n.int)(1))).max((0,n.int)(0)).mul(r).add(a)).toVar(),s=(0,n.storage)(e.m2,`float`).toReadOnly().element(o).toVar(),c=(0,n.storage)(e.frozenMask,`uint`).toReadOnly().element(o).toVar(),l=s.sub(t.mul(t)).max((0,n.float)(0)).div((0,n.float)(e.frame).add(1)).sqrt().toVar(),u=e.usePixelFreeze.greaterThan((0,n.int)(0)),d=(0,n.select)(t.lessThan((0,n.float)(1)),t.sqrt(),t).toVar(),f=(0,n.select)(u,l.div(t.add((0,n.float)(1e-4))),l.div(d.add((0,n.float)(1e-4)))).toVar(),p=(0,n.select)(u,e.pixelFreezeThreshold,e.noiseThreshold).toVar(),m=f.div(p.max((0,n.float)(1e-6))).toVar(),h=(0,n.vec3)(t.div(t.add((0,n.float)(1))).sqrt().mul(.55)).toVar(),g=h.toVar(),_=(0,n.float)(e.frame).greaterThanEqual((0,n.float)(e.adaptiveMinSamples));return(0,n.If)(m.greaterThanEqual((0,n.float)(1)).or(_.not()),()=>{let e=(0,n.mix)((0,n.vec3)(1,.8,.1),(0,n.vec3)(1,.1,.05),m.sub(1).div(3).clamp(0,1));g.assign((0,n.mix)(h,e,.85))}),(0,n.If)(c.equal((0,n.uint)(1)).and(u),()=>{g.assign((0,n.mix)(h,(0,n.vec3)(.1,.45,1),.55))}),g});return this._debugMaterial=new t.MeshBasicNodeMaterial,this._debugMaterial.colorNode=(0,n.vec4)(i().pow(2.2).mul(this._debugExposureComp),1),this._debugMaterial.blending=r.NoBlending,this._debugQuad=new t.QuadMesh(this._debugMaterial),!0}render(e){if(!this.enabled)return;if(this._convergenceOverlay&&this._ensureDebugMaterial()){let t=e.getTexture(`pathtracer:color`);if(t){this._debugTexNode.value=t;let e=this.renderer.toneMapping!==r.NoToneMapping;this._debugExposureComp.value=e?1/Math.max(this.renderer.toneMappingExposure,1e-4):1,this.renderer.setRenderTarget(null),this._debugQuad.render(this.renderer);return}}let t=this._resolveSourceTexture(e);t&&(this._sourceTexNode.value=t,this.renderer.setRenderTarget(null),this.compositorQuad.render(this.renderer))}setConvergenceOverlay(e){this._convergenceOverlay=!!e}setSaturation(e){this.saturation.value=e}setTransparentBackground(e){this._transparentBackground.value=+!!e}dispose(){this._sourceTexNode?.dispose(),this.compositorMaterial?.dispose(),this._debugTexNode?.dispose(),this._debugMaterial?.dispose(),this.compositorQuad=null,this._debugQuad=null,this._debugMaterial=null,this._debugTexNode=null,this._pathTracer=null}},gb=class{constructor(){this.textures=new Map,this.renderTargets=new Map,this.uniforms=new Map,this.state={frame:0,accumulatedFrames:0,renderMode:0,interactionMode:!1,isComplete:!1,tileInfo:null,currentTile:0,totalTiles:0,cameraChanged:!1,cameraMoving:!1,width:0,height:0,time:0,deltaTime:0,enableASVGF:!1,enableEdgeFiltering:!1},this._stateChangeCallbacks=new Map}setTexture(e,t){this.textures.set(e,t)}getTexture(e){return this.textures.get(e)}hasTexture(e){return this.textures.has(e)}removeTexture(e){this.textures.delete(e)}getTextureNames(){return Array.from(this.textures.keys())}clearTextures(){this.textures.clear()}setRenderTarget(e,t){this.renderTargets.set(e,t)}getRenderTarget(e){return this.renderTargets.get(e)}hasRenderTarget(e){return this.renderTargets.has(e)}removeRenderTarget(e){this.renderTargets.delete(e)}getRenderTargetNames(){return Array.from(this.renderTargets.keys())}clearRenderTargets(){this.renderTargets.clear()}setUniform(e,t){this.uniforms.has(e)?this.uniforms.get(e).value=t:this.uniforms.set(e,{value:t})}getUniform(e){return this.uniforms.get(e)}getUniformValue(e){return this.uniforms.get(e)?.value}hasUniform(e){return this.uniforms.has(e)}removeUniform(e){this.uniforms.delete(e)}getUniformNames(){return Array.from(this.uniforms.keys())}clearUniforms(){this.uniforms.clear()}setState(e,t){let n=this.state[e],r=n!==t;return r&&(this.state[e]=t,this._notifyStateChange(e,t,n)),r}getState(e){return this.state[e]}getAllState(){return this.state}setStates(e){let t=[];for(let[n,r]of Object.entries(e))this.setState(n,r)&&t.push(n);return t}hasState(e){return e in this.state}watchState(e,t){this._stateChangeCallbacks.has(e)||this._stateChangeCallbacks.set(e,[]),this._stateChangeCallbacks.get(e).push(t)}unwatchState(e,t){if(!this._stateChangeCallbacks.has(e))return;let n=this._stateChangeCallbacks.get(e),r=n.indexOf(t);r>-1&&n.splice(r,1)}_notifyStateChange(e,t,n){if(!this._stateChangeCallbacks.has(e))return;let r=this._stateChangeCallbacks.get(e);for(let i of r)try{i(t,n)}catch(t){console.error(`Error in state change callback for '${e}':`,t)}}reset(){this.state.frame=0,this.state.accumulatedFrames=0,this.state.isComplete=!1,this.state.cameraChanged=!0,this.state.currentTile=0}incrementFrame(){return this.state.frame++,this.state.accumulatedFrames++,this.state.frame}dispose(){this.textures.clear(),this.renderTargets.clear(),this.uniforms.clear(),this._stateChangeCallbacks.clear(),this.state={}}},_b=class extends r.EventDispatcher{constructor(){super(),this._onceCallbacks=new Map}on(e,t){this.addEventListener(e,t)}once(e,t){let n=r=>{t(r),this.off(e,n),this._onceCallbacks.delete(t)};this._onceCallbacks.set(t,n),this.on(e,n)}off(e,t){let n=this._onceCallbacks.get(t);n?(this.removeEventListener(e,n),this._onceCallbacks.delete(t)):this.removeEventListener(e,t)}emit(e,t){t&&typeof t==`object`&&t.type?this.dispatchEvent(t):this.dispatchEvent({type:e,...t})}removeAllListeners(e){if(e){for(let[t,n]of this._onceCallbacks.entries())this.hasEventListener(e,n)&&(this.removeEventListener(e,n),this._onceCallbacks.delete(t));this._listeners&&this._listeners[e]&&delete this._listeners[e]}else this._onceCallbacks.clear(),this._listeners&&={}}listenerCount(e){return!this._listeners||!this._listeners[e]?0:this._listeners[e].length}clear(){this.removeAllListeners()}eventNames(){return this._listeners?Object.keys(this._listeners):[]}},vb=!1,yb=[],bb=new WeakMap;function xb(e){vb=!!e}function Sb(){return yb.slice()}function Cb(){yb.length=0}function wb(e){let t=[];for(let n of Object.keys(e))e[n]?.isTextureNode===!0&&t.push(n);return t}var Tb=e=>!e||!e.image||!(e.image.width>0);function Eb(e,t,n){if(!vb){n();return}let r=bb.get(e);if(r||(r={phase:`pending`,unboundAtCompile:[]},bb.set(e,r)),r.phase!==`pending`){n(),r.phase===`watch`&&Db(e,r);return}let i=Object.prototype.hasOwnProperty.call(t,`compute`),a=t.compute;t.compute=function(...t){return r.phase===`pending`&&(r.unboundAtCompile=wb(e).filter(t=>Tb(e[t].value)),r.phase=r.unboundAtCompile.length<2?`done`:`watch`),a.apply(this,t)};try{n()}finally{i?t.compute=a:delete t.compute}}function Db(e,t){let n=[];for(let r of t.unboundAtCompile){let t=e[r]?.value;if(Tb(t))return;t.isStorageTexture!==!0&&n.push(r)}t.phase=`done`,n.length!==0&&yb.push({stage:e.name,nodes:n,unboundAtCompile:t.unboundAtCompile.slice(),message:`${e.name}: ${n.join(`, `)} ${n.length===1?`was`:`were`} still holding EmptyTexture when the stage first dispatched, alongside ${t.unboundAtCompile.length-n.length} other unbound node(s), and later received a non-storage texture. Two nodes unbound at compile time can share one GPU binding and then both resolve to whichever is assigned last. Assign these before the first dispatch.`})}var Ob=class{_reportStageFailure(e,t,n){console.error(`[Pipeline] Error in stage '${e}' (${t}):`,n);let r=`${e}:${t}`;this._reportedStageFailures.has(r)||(this._reportedStageFailures.add(r),this._issues?.record(Y.STAGE_RENDER_FAILED,`stage "${e}" threw during ${t} — the frame is incomplete`,{stage:e,phase:t,cause:String(n?.message??n)}))}constructor(e,t,n,{issues:r=null}={}){this.renderer=e,this._issues=r,this._reportedStageFailures=new Set,this.width=t,this.height=n,this.stages=[],this.context=new gb,this.eventBus=new _b,this.context.setState(`width`,t),this.context.setState(`height`,n),this.stats={enabled:!1,logSkipped:!1,timings:new Map,frameCount:0}}addStage(e){this.stages.push(e),e.initialize(this.context,this.eventBus),this.stats.enabled&&console.log(`[Pipeline] Added stage: ${e.name}`)}getStage(e){return this.stages.find(t=>t.name===e)}removeStage(e){let t=this.stages.findIndex(t=>t.name===e);if(t>-1){let e=this.stages[t];return this.stages.splice(t,1),e.dispose&&e.dispose(),this.stats.timings.delete(e.name),!0}return!1}setStageEnabled(e,t){let n=this.getStage(e);n&&(t?n.enable():n.disable())}render(e=null){let t=this.stats.enabled?performance.now():0;for(let t of this.stages){if(!t.shouldExecuteThisFrame(this.context)){this.stats.enabled&&this.stats.logSkipped&&console.log(`[Pipeline] Skipped stage '${t.name}' (executionMode: ${t.executionMode})`);continue}try{let n=this.stats.enabled?performance.now():0;if(Eb(t,this.renderer,()=>t.render(this.context,e)),this.stats.enabled){let e=performance.now()-n;this.stats.timings.has(t.name)||this.stats.timings.set(t.name,[]);let r=this.stats.timings.get(t.name);r.push(e),r.length>60&&r.shift()}}catch(e){this._reportStageFailure(t.name,`render`,e)}}if(this.context.incrementFrame(),this.eventBus.emit(`frame:complete`,{frame:this.context.getState(`frame`),accumulatedFrames:this.context.getState(`accumulatedFrames`)}),this.stats.enabled){let e=performance.now()-t;this.stats.timings.has(`_total`)||this.stats.timings.set(`_total`,[]);let n=this.stats.timings.get(`_total`);n.push(e),n.length>60&&n.shift(),this.stats.frameCount++}}reset(){this.eventBus.emit(`pipeline:reset`);for(let e of this.stages)if(e.reset)try{e.reset()}catch(t){this._reportStageFailure(e.name,`reset`,t)}this.context.reset(),this.stats.enabled&&(this.stats.timings.clear(),this.stats.frameCount=0)}setSize(e,t){this.width=e,this.height=t,this.context.setState(`width`,e),this.context.setState(`height`,t),this.eventBus.emit(`pipeline:resize`,{width:e,height:t});for(let n of this.stages)if(n.setSize)try{n.setSize(e,t)}catch(e){console.error(`[Pipeline] Error resizing stage '${n.name}':`,e)}}dispose(){for(let e of this.stages)if(e.dispose)try{e.dispose()}catch(t){console.error(`[Pipeline] Error disposing stage '${e.name}':`,t)}this.stages=[],this.context.dispose(),this.eventBus.clear(),this.stats.timings.clear()}setStatsEnabled(e){this.stats.enabled=e,e||(this.stats.timings.clear(),this.stats.frameCount=0)}getStats(){if(!this.stats.enabled)return null;let e={frameCount:this.stats.frameCount,stages:{},total:0};for(let[t,n]of this.stats.timings.entries()){if(n.length===0)continue;let r=n.reduce((e,t)=>e+t,0)/n.length,i=Math.min(...n),a=Math.max(...n);t===`_total`?(e.total=r,e.totalMin=i,e.totalMax=a):e.stages[t]={avg:r,min:i,max:a}}return e}logStats(){let e=this.getStats();if(!e){console.log(`[Pipeline] Stats not enabled`);return}console.group(`[Pipeline] Performance Stats`),console.log(`Frames: ${e.frameCount}`),e.totalMin===void 0?console.log(`Total: no frames recorded yet (pipeline.render() has not run since stats were enabled — the path tracer may have converged and stopped its animation loop)`):console.log(`Total: ${e.total.toFixed(2)}ms (min: ${e.totalMin.toFixed(2)}ms, max: ${e.totalMax.toFixed(2)}ms)`);for(let[t,n]of Object.entries(e.stages))console.log(` ${t}: ${n.avg.toFixed(2)}ms (min: ${n.min.toFixed(2)}ms, max: ${n.max.toFixed(2)}ms)`);console.groupEnd()}getInfo(){return{stageCount:this.stages.length,enabledStages:this.stages.filter(e=>e.enabled).length,stages:this.stages.map(e=>({name:e.name,enabled:e.enabled})),contextState:this.context.getAllState(),textures:this.context.getTextureNames(),renderTargets:this.context.getRenderTargetNames(),uniforms:this.context.getUniformNames(),events:this.eventBus.eventNames()}}logInfo(){let e=this.getInfo();console.group(`[Pipeline] Info`),console.log(`Stages:`,e.stages),console.log(`Context Textures:`,e.textures),console.log(`Context Render Targets:`,e.renderTargets),console.log(`Context Uniforms:`,e.uniforms),console.log(`Event Types:`,e.events),console.log(`State:`,e.contextState),console.groupEnd()}};rn();var kb=Wt(`engine`),Ab=class{constructor(){this.timeElapsed=0,this.lastResetTime=performance.now(),this.renderCompleteDispatched=!1,this.budgetOverrun=!1,this._budgetHeldWarned=!1}updateTime(){this.timeElapsed=(performance.now()-this.lastResetTime)/1e3}isTimeLimitReached(e,t,n){return t!==`time`||!(n>0)||this.timeElapsed<n?!1:e?.frameCount>0?(this.budgetOverrun=!0,!0):(this._budgetHeldWarned||(this._budgetHeldWarned=!0,kb.warn(`render time limit (${n}s) expired before the first sample landed — holding the deadline open to avoid capturing an empty frame`)),!1)}isLimitReached(e,t,n){return e?this.isTimeLimitReached(e,t,n)?!0:this.stopCondition(e)!==null:!1}stopCondition(e){return this.budgetOverrun?`timeLimit`:e?e.frameCount>=e.completionThreshold?`samples`:e._isConvergedComplete?.()?`converged`:null:null}markComplete(){return this.renderCompleteDispatched?!1:(this.renderCompleteDispatched=!0,!0)}reset(){this.timeElapsed=0,this.lastResetTime=performance.now(),this.renderCompleteDispatched=!1,this.budgetOverrun=!1,this._budgetHeldWarned=!1}resumeFromPause(){this.renderCompleteDispatched=!1,this.lastResetTime=performance.now()-this.timeElapsed*1e3}},jb=class{constructor(e){this.renderer=e,this.target=null,this.material=new t.NodeMaterial,this.material.name=`rayzee:texture-readback`,this.quad=new t.QuadMesh(this.material),this._node=null,this._source=null}_ensureTarget(e,t){this.target&&this.target.width===e&&this.target.height===t||(this.target?.dispose(),this.target=new r.RenderTarget(e,t,{type:r.FloatType,format:r.RGBAFormat,depthBuffer:!1,minFilter:r.NearestFilter,magFilter:r.NearestFilter}))}async read(e,t,r){this._ensureTarget(t,r),this._source!==e&&(this._node=(0,n.texture)(e).load((0,n.ivec2)(n.screenCoordinate.xy)),this.material.outputNode=this._node,this.material.needsUpdate=!0,this._source=e);let i=this.renderer.getRenderTarget();this.renderer.setRenderTarget(this.target),this.quad.render(this.renderer),this.renderer.setRenderTarget(i);try{return await this.renderer.readRenderTargetPixelsAsync(this.target,0,0,t,r)}finally{this.target.dispose(),this.target=null}}dispose(){this.target?.dispose(),this.material.dispose(),this.target=null,this._source=null,this._node=null}};V();var Mb=new r.Vector3,Nb=new r.Vector3;function Pb(e,t){return Nb.subVectors(e,t.position).dot(t.getWorldDirection(Mb))}function Fb(e,t,n=!1){return n?e.distance:Pb(e.point,t)}var Ib=class extends r.EventDispatcher{constructor({scene:e,camera:t,canvas:n,assetLoader:i,pathTracer:a,floorPlane:o}){super(),this.scene=e,this.camera=t,this.canvas=n,this.assetLoader=i,this.pathTracer=a,this.floorPlane=o,this.raycaster=new r.Raycaster,this.focusMode=!1,this.focusPointIndicator=null,this.afPointPlacementMode=!1,this.handleAFPointClick=this.handleAFPointClick.bind(this),this.selectedObject=null,this.selectMode=!1,this.clickTimeout=null,this.mouseDownPosition=null,this.dragThreshold=5,this.handleFocusClick=this.handleFocusClick.bind(this),this.handleSelectClick=this.handleSelectClick.bind(this),this.handleSelectDoubleClick=this.handleSelectDoubleClick.bind(this),this.handleMouseDown=this.handleMouseDown.bind(this),this.handleMouseUp=this.handleMouseUp.bind(this),this.handleContextMenu=this.handleContextMenu.bind(this),this.handleContextPointerDown=this.handleContextPointerDown.bind(this),this.handleContextPointerUp=this.handleContextPointerUp.bind(this),this.contextPointerDownPosition=null,this.canvas.addEventListener(`pointerdown`,this.handleContextPointerDown),this.canvas.addEventListener(`pointerup`,this.handleContextPointerUp),this.canvas.addEventListener(`contextmenu`,this.handleContextMenu),this._overlayManager=null,this._transformManager=null,this._appDispatch=null,this._orbitControls=null,this._helperScene=null}setDependencies({overlayManager:e,transformManager:t,appDispatch:n,orbitControls:r,helperScene:i}){this._overlayManager=e||null,this._transformManager=t||null,this._appDispatch=n||null,this._orbitControls=r||null,this._helperScene=i||null}select(e){let t=this._overlayManager?.getHelper(`outline`);t&&t.setSelectedObjects(e?[e]:[]),this.selectedObject=e||null,e?this._transformManager?.attach(e):this._transformManager?.detach(),this._appDispatch?.({type:B.OBJECT_SELECTED,object:e||null})}deselect(){this.select(null)}disableMode(){this.disableSelectMode(),this._transformManager?.detach()}on(e,t){return this.addEventListener(e,t),()=>this.removeEventListener(e,t)}toggleFocusMode(){return this.focusMode=!this.focusMode,this.canvas.style.cursor=this.focusMode?`crosshair`:`auto`,this.focusMode?this.canvas.addEventListener(`click`,this.handleFocusClick):this.canvas.removeEventListener(`click`,this.handleFocusClick),this._orbitControls&&(this._orbitControls.enabled=!this.focusMode),this.dispatchEvent({type:`focusModeChanged`,enabled:this.focusMode}),this.focusMode}handleFocusClick(e){let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0);if(n.length>0){let e=n[0],t=this.pathTracer?.cameraProjection?.value===Ke.equirectangular,r=Fb(e,this.camera,t);this.showFocusPoint(e.point),this.toggleFocusMode(),this.dispatchEvent({type:`focusChanged`,distance:r/this.assetLoader.getSceneScale(),worldDistance:r})}}showFocusPoint(e){this.focusPointIndicator&&this.scene.remove(this.focusPointIndicator),this.focusPointIndicator=new r.Mesh(new r.SphereGeometry(this.assetLoader.getSceneScale()*.02,16,16),new r.MeshBasicMaterial({color:65280,transparent:!0,opacity:.8,depthTest:!1})),this.focusPointIndicator.position.copy(e),this.scene.add(this.focusPointIndicator),setTimeout(()=>{this.focusPointIndicator&&=(this.scene.remove(this.focusPointIndicator),null)},2e3)}enterAFPointPlacementMode(){this.afPointPlacementMode=!0,this.canvas.style.cursor=`crosshair`,this.canvas.addEventListener(`click`,this.handleAFPointClick)}exitAFPointPlacementMode(){this.afPointPlacementMode=!1,this.canvas.style.cursor=`auto`,this.canvas.removeEventListener(`click`,this.handleAFPointClick)}handleAFPointClick(e){let t=this.canvas.getBoundingClientRect(),n=(e.clientX-t.left)/t.width,r=(e.clientY-t.top)/t.height;this.exitAFPointPlacementMode(),this.dispatchEvent({type:`afPointPlaced`,point:{x:n,y:r}})}toggleSelectMode(){return this.selectMode=!this.selectMode,this.canvas.style.cursor=this.selectMode?`pointer`:`auto`,this.selectMode?(this.canvas.addEventListener(`mousedown`,this.handleMouseDown),this.canvas.addEventListener(`mouseup`,this.handleMouseUp),this.canvas.addEventListener(`click`,this.handleSelectClick),this.canvas.addEventListener(`dblclick`,this.handleSelectDoubleClick)):(this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null),this.dispatchEvent({type:`selectModeChanged`,enabled:this.selectMode}),this.selectMode}disableSelectMode(){this.selectMode&&(this.selectMode=!1,this.canvas.style.cursor=`auto`,this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null,this.dispatchEvent({type:`selectModeChanged`,enabled:!1}))}handleMouseDown(e){this.mouseDownPosition={x:e.clientX,y:e.clientY,button:e.button}}wasMouseDragged(e){if(!this.mouseDownPosition)return!1;let t=Math.abs(e.clientX-this.mouseDownPosition.x),n=Math.abs(e.clientY-this.mouseDownPosition.y);return Math.sqrt(t*t+n*n)>this.dragThreshold}handleSelectClick(e){if(this.wasMouseDragged(e)){this.mouseDownPosition=null;return}if(this.mouseDownPosition=null,this.clickTimeout){clearTimeout(this.clickTimeout),this.clickTimeout=null;return}this.clickTimeout=setTimeout(()=>{this.clickTimeout=null;let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0),r=this.filterValidIntersects(n),i=this._pickLightHelper(),a=null;if(r.length>0&&i?a=r[0].distance<=i.distance?r[0].object:i.light:r.length>0?a=r[0].object:i&&(a=i.light),a){let e=this.selectedObject;e&&e.uuid===a.uuid?this.dispatchEvent({type:`objectDeselected`,object:a,uuid:a.uuid}):this.dispatchEvent({type:`objectSelected`,object:a,uuid:a.uuid})}else this.dispatchEvent({type:`objectDeselected`})},250)}handleSelectDoubleClick(e){if(this.wasMouseDragged(e)){this.mouseDownPosition=null;return}this.mouseDownPosition=null,this.clickTimeout&&=(clearTimeout(this.clickTimeout),null);let t=this.getMouseCoordinates(e);this.raycaster.setFromCamera(t,this.camera);let n=this.raycaster.intersectObjects(this.scene.children,!0),r=this.filterValidIntersects(n);if(r.length>0){let e=r[0].object;this.dispatchEvent({type:`objectDoubleClicked`,object:e,uuid:e.uuid})}}handleMouseUp(){}handleContextPointerDown(e){e.button===2&&(this.contextPointerDownPosition={x:e.clientX,y:e.clientY})}handleContextPointerUp(e){if(e.button!==2)return;if(this.contextPointerDownPosition){let t=Math.abs(e.clientX-this.contextPointerDownPosition.x),n=Math.abs(e.clientY-this.contextPointerDownPosition.y);if(Math.sqrt(t*t+n*n)>this.dragThreshold){this.contextPointerDownPosition=null;return}}else return;this.contextPointerDownPosition=null;let t=this.selectedObject;t&&this.dispatchEvent({type:`contextMenuRequested`,x:e.clientX,y:e.clientY,selectedObject:t})}handleContextMenu(e){e.preventDefault()}getMouseCoordinates(e){let t=this.canvas.getBoundingClientRect();return{x:(e.clientX-t.left)/t.width*2-1,y:-((e.clientY-t.top)/t.height)*2+1}}pickSurface(e,t){return this.raycaster.setFromCamera({x:e,y:t},this.camera),this.filterValidIntersects(this.raycaster.intersectObjects(this.scene.children,!0))[0]??null}filterValidIntersects(e){return e.filter(e=>{let t=e.object;return t!==this.focusPointIndicator&&t!==this.floorPlane&&!t.name.includes(`Helper`)&&t.type===`Mesh`})}_pickLightHelper(){if(!this._helperScene||this._helperScene.children.length===0)return null;let e=this.raycaster.intersectObjects(this._helperScene.children,!0);for(let t of e){let e=t.object;for(;e;){if(e.light)return{distance:t.distance,light:e.light};e=e.parent}}return null}updateDependencies({scene:e,camera:t,floorPlane:n}){e&&(this.scene=e),t&&(this.camera=t),n&&(this.floorPlane=n)}wireAppEvents(e){this.addEventListener(`objectSelected`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_SELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`objectDeselected`,t=>{this.select(null),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_DESELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`selectModeChanged`,t=>{e.dispatchEvent({type:B.SELECT_MODE_CHANGED,enabled:t.enabled})}),this.addEventListener(`objectDoubleClicked`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:B.OBJECT_DOUBLE_CLICKED,object:t.object,uuid:t.uuid})}),this.addEventListener(`focusChanged`,t=>{e.settings.set(`focusDistance`,t.worldDistance),e.dispatchEvent({type:`focusChanged`,distance:t.distance})}),this.addEventListener(`afPointPlaced`,t=>{e.dispatchEvent({type:B.AF_POINT_PLACED,point:t.point})})}dispose(){this.canvas.removeEventListener(`click`,this.handleAFPointClick),this.canvas.removeEventListener(`click`,this.handleFocusClick),this.canvas.removeEventListener(`mousedown`,this.handleMouseDown),this.canvas.removeEventListener(`mouseup`,this.handleMouseUp),this.canvas.removeEventListener(`click`,this.handleSelectClick),this.canvas.removeEventListener(`dblclick`,this.handleSelectDoubleClick),this.canvas.removeEventListener(`contextmenu`,this.handleContextMenu),this.canvas.removeEventListener(`pointerdown`,this.handleContextPointerDown),this.canvas.removeEventListener(`pointerup`,this.handleContextPointerUp),this.clickTimeout&&=(clearTimeout(this.clickTimeout),null),this.mouseDownPosition=null,this.contextPointerDownPosition=null,this.focusPointIndicator&&=(this.scene.remove(this.focusPointIndicator),null),this.canvas.style.cursor=`auto`,this.scene=null,this.camera=null,this.canvas=null,this.assetLoader=null,this.pathTracer=null,this.floorPlane=null,this.raycaster=null}},Lb="var e=class{constructor(e){this._root=e,this._writers=new Map,this._nextId=1}async _dir(e,t){let n=await this._root;for(let r of e)n=await n.getDirectoryHandle(r,{create:t});return n}async openWriter({path:e,name:t,truncate:n=!0,length:r}){let i=await(await(await this._dir(e,!0)).getFileHandle(t,{create:!0})).createSyncAccessHandle();n?i.truncate(0):r!==void 0&&i.getSize()>r&&i.truncate(r);let a=this._nextId++;return this._writers.set(a,{handle:i,end:i.getSize()}),{id:a}}write({id:e,buffer:t,byteOffset:n=0,byteLength:r,at:i}){let a=this._writers.get(e);if(!a)throw Error(`storage: writer ${e} is not open`);let o=new Uint8Array(t,n,r??t.byteLength-n),s=i??a.end,c=0;for(;c<o.length;){let e=a.handle.write(o.subarray(c),{at:s+c});if(e<=0)throw Error(`storage: write made no progress`);c+=e}return a.end=Math.max(a.end,s+o.length),{bytes:o.length}}closeWriter({id:e,abort:t=!1}){let n=this._writers.get(e);if(!n)return{size:0};this._writers.delete(e);try{return t||n.handle.flush(),{size:n.handle.getSize()}}finally{n.handle.close()}}async writeFile({path:e,name:t,buffer:n,byteOffset:r=0,byteLength:i}){let{id:a}=await this.openWriter({path:e,name:t});try{return this.write({id:a,buffer:n,byteOffset:r,byteLength:i}),this.closeWriter({id:a})}catch(e){throw this.closeWriter({id:a,abort:!0}),e}}async readRange({path:e,name:t,offset:n=0,length:r}){let i=await(await this._dir(e,!1)).getFileHandle(t),a=null;try{a=await i.createSyncAccessHandle()}catch(e){if(e.name!==`NoModificationAllowedError`)throw e}if(!a){let e=await i.getFile(),t=r===void 0?e.size:n+r;return{buffer:await e.slice(n,t).arrayBuffer()}}try{let e=a.getSize(),t=Math.max(0,Math.min(r??e-n,e-n)),i=new ArrayBuffer(t);return a.read(i,{at:n}),{buffer:i}}finally{a.close()}}dispose(){for(let e of[...this._writers.keys()])this.closeWriter({id:e,abort:!0})}};let t=null;async function n(e,t){return t||(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:!0})}self.onmessage=async({data:r})=>{let{id:i,op:a,args:o}=r;try{if(a===`init`){t=new e(n(o.namespace,o.root)),postMessage({id:i,result:{}});return}let r=await t[a](o),s=r?.buffer instanceof ArrayBuffer?[r.buffer]:[];postMessage({id:i,result:r},s)}catch(e){postMessage({id:i,error:{name:e.name,message:e.message}})}};",Rb=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Lb],{type:`text/javascript;charset=utf-8`});function zb(e){let t;try{if(t=Rb&&(self.URL||self.webkitURL).createObjectURL(Rb),!t)throw``;let n=new Worker(t,{type:`module`,name:e?.name});return n.addEventListener(`error`,()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker(`data:text/javascript;charset=utf-8,`+encodeURIComponent(Lb),{type:`module`,name:e?.name})}}function Bb({name:e,message:t}){let n=Error(t);return n.name=e,n}var Vb=class{constructor({namespace:e,root:t=null}){this._worker=new zb,this._pending=new Map,this._nextId=0,this._worker.onmessage=({data:e})=>{let t=this._pending.get(e.id);t&&(this._pending.delete(e.id),e.error?t.reject(Bb(e.error)):t.resolve(e.result))},this._ready=this.call(`init`,{namespace:e,root:t})}call(e,t,n=[]){return this._worker?new Promise((r,i)=>{let a=this._nextId++;this._pending.set(a,{resolve:r,reject:i}),this._worker.postMessage({id:a,op:e,args:t},n)}):Promise.reject(Error(`storage: transport disposed`))}dispose(){this._worker?.terminate(),this._worker=null;for(let{reject:e}of this._pending.values())e(Error(`storage: transport disposed`));this._pending.clear()}};function Hb(){return typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope}async function Ub(e){let t=typeof navigator<`u`?navigator.storage:null;if(!t?.getDirectory)return{root:null,reason:`this browser has no origin private file system`};try{return{root:await(await t.getDirectory()).getDirectoryHandle(e,{create:!0})}}catch(e){return{root:null,reason:`${e.name}: ${e.message}`}}}async function Wb({namespace:e,root:t=null,transport:n=`auto`}={}){let r=t?{root:t}:await Ub(e);if(!r.root)return{storage:null,reason:r.reason};if(n===`inline`||n===`auto`&&(Hb()||typeof Worker>`u`))return{storage:mr({namespace:e,root:r.root})};let i=new Vb({namespace:e,root:t}),a=new pr({root:r.root,transport:i,namespace:e});return a.sweep().catch(()=>{}),{storage:a}}async function Gb(e){let t=Nu.get(e);t||(t={refs:0,opened:Wb({namespace:e})},Nu.set(e,t)),t.refs++;let{storage:n,reason:r}=await t.opened;t.storage=n;let i=!1,a=()=>{i||(i=!0,t.refs--,!(t.refs>0)&&(Nu.get(e)===t&&Nu.delete(e),n?.dispose()))};return n?{storage:n,release:a}:(a(),{storage:null,reason:r,release:()=>{}})}V();var Kb={maxBounces:{uniform:`maxBounces`,reset:!0},transmissiveBounces:{uniform:`transmissiveBounces`,reset:!0},maxSubsurfaceSteps:{uniform:`maxSubsurfaceSteps`,reset:!0},maxTransparentBounces:{uniform:`maxTransparentBounces`,reset:!0},environmentIntensity:{uniform:`environmentIntensity`,reset:!0},backgroundIntensity:{uniform:`backgroundIntensity`,reset:!0},backgroundBlurriness:{uniform:`backgroundBlurriness`,reset:!0},backgroundBlurSamples:{uniform:`backgroundBlurSamples`,reset:!0},showBackground:{uniform:`showBackground`,reset:!0},enableEnvironment:{uniform:`enableEnvironment`,reset:!0},groundProjectionEnabled:{uniform:`groundProjectionEnabled`,reset:!0},groundProjectionRadius:{uniform:`groundProjectionRadius`,reset:!0},groundProjectionHeight:{uniform:`groundProjectionHeight`,reset:!0},groundProjectionLevel:{uniform:`groundProjectionLevel`,reset:!0},enableGroundCatcher:{uniform:`enableGroundCatcher`,reset:!0},groundCatcherHeight:{uniform:`groundCatcherHeight`,reset:!0},globalIlluminationIntensity:{uniform:`globalIlluminationIntensity`,reset:!0},panoramaLevelHorizon:{uniform:`panoLevelHorizon`,reset:!0},enableDOF:{uniform:`enableDOF`,reset:!0},focusDistance:{uniform:`focusDistance`,reset:!1},focalLength:{uniform:`focalLength`,reset:!0},aperture:{uniform:`aperture`,reset:!0},apertureScale:{uniform:`apertureScale`,reset:!0},anamorphicRatio:{uniform:`anamorphicRatio`,reset:!0},unitsPerMetre:{uniform:`unitsPerMetre`,reset:!0},dofMode:{handler:`handleDofMode`,reset:!0},dofBlur:{uniform:`dofBlur`,reset:!0},samplingTechnique:{uniform:`samplingTechnique`,reset:!0},fireflyThreshold:{uniform:`fireflyThreshold`,reset:!0},shadowTerminatorOffset:{uniform:`shadowTerminatorOffset`,reset:!0},enableAlphaShadows:{uniform:`enableAlphaShadows`,reset:!0},useAdaptiveSampling:{uniform:`useAdaptiveSampling`,reset:!0},noiseThreshold:{uniform:`noiseThreshold`,reset:!0},adaptiveMinSamples:{uniform:`adaptiveMinSamples`,reset:!0},adaptiveStopFraction:{uniform:`adaptiveStopFraction`,reset:!0},usePixelFreeze:{uniform:`usePixelFreeze`,reset:!0},pixelFreezeThreshold:{uniform:`pixelFreezeThreshold`,reset:!0},pixelFreezeStability:{uniform:`pixelFreezeStability`,reset:!0},convergenceOverlay:{handler:`handleConvergenceOverlay`,reset:!1},enableEmissiveTriangleSampling:{uniform:`enableEmissiveTriangleSampling`,reset:!0},emissiveBoost:{uniform:`emissiveBoost`,reset:!0},visMode:{uniform:`visMode`,reset:!0},debugVisScale:{uniform:`debugVisScale`,reset:!0},cameraProjection:{handler:`handleCameraProjection`,reset:!0},panoramaLonRange:{handler:`handlePanoramaLonRange`,reset:!0},panoramaLatRange:{handler:`handlePanoramaLatRange`,reset:!0},interactionModeEnabled:{handler:`handleInteractionModeEnabled`,reset:!1},interactionRenderScale:{handler:`handleInteractionRenderScale`,reset:!1},maxSamples:{handler:`handleMaxSamples`,reset:!1},transparentBackground:{handler:`handleTransparentBackground`},backgroundColor:{handler:`handleBackgroundColor`,reset:!0},exposure:{handler:`handleExposure`},saturation:{handler:`handleSaturation`},renderLimitMode:{handler:`handleRenderLimitMode`},renderTimeLimit:{handler:`handleRenderTimeLimit`,reset:!1},renderMode:{handler:`handleRenderMode`},environmentRotation:{handler:`handleEnvironmentRotation`}},qb=Object.freeze({DEFAULT:`default`,HOST:`host`,SCENE_METADATA:`scene-metadata`,MODE_PRESET:`mode-preset`}),Jb={bounces:`maxBounces`,debugMode:`visMode`},Yb=class extends r.EventDispatcher{constructor(e=U,{issues:t=null}={}){super(),this._issues=t,this._values=new Map,this._sources=new Map,this._pathTracer=null,this._resetCallback=null,this._handlers={},this._delegates={},this._initDefaults(e)}bind(e){this._pathTracer=e.stages.pathTracer,this._resetCallback=e.resetCallback,this._delegates={},this._handlers=this._buildHandlers(e)}_buildHandlers({stages:e,renderer:t,resetCallback:n,reconcileCompletion:i,denoisingManager:a,onInteractionRenderScale:o,onCameraProjection:s}){let c=new r.Vector2,l=(t,n)=>{c.set(n?.[0]??0,n?.[1]??0).multiplyScalar(r.MathUtils.DEG2RAD),e.pathTracer?.setUniform(t,c)};return{handleCameraProjection:t=>{e.pathTracer?.setUniform(`cameraProjection`,Ke[t]??Ke.perspective),s?.(t),t===`equirectangular`&&a?.requiresMotionVectors&&a.setDenoiserStrategy(`edgeaware`)},handleDofMode:t=>e.pathTracer?.setUniform(`dofMode`,+(t===`look`)),handlePanoramaLonRange:e=>l(`panoLonRange`,e),handlePanoramaLatRange:e=>l(`panoLatRange`,e),handleTransparentBackground:t=>{e.pathTracer?.setUniform(`transparentBackground`,t),e.compositor?.setTransparentBackground(t)},handleBackgroundColor:t=>{let n=t?.isColor?t:new r.Color(t);e.pathTracer?.setUniform(`backgroundColor`,n)},handleExposure:n=>{!e.autoExposure?.enabled&&t&&(t.toneMappingExposure=n)},handleSaturation:t=>{e.compositor?.setSaturation(t)},handleConvergenceOverlay:t=>{e.pathTracer?.setUniform(`convergenceOverlay`,t),e.compositor?.setConvergenceOverlay(t),t&&!this.get(`useAdaptiveSampling`)&&n?.()},handleRenderLimitMode:t=>{e.pathTracer?.setRenderLimitMode?.(t),i?.()},handleMaxSamples:t=>{e.pathTracer?.setUniform(`maxSamples`,t),e.pathTracer?.updateCompletionThreshold(),i?.()},handleRenderTimeLimit:()=>{i?.()},handleRenderMode:t=>{e.pathTracer?.setUniform(`renderMode`,parseInt(t))},handleEnvironmentRotation:t=>{e.pathTracer?.environment.setEnvironmentRotation(t)},handleInteractionModeEnabled:t=>{e.pathTracer?.setInteractionModeEnabled(t)},handleInteractionRenderScale:e=>{o?.(e)}}}set(e,t,{reset:n,silent:r,source:i=qb.HOST}={}){let a=this._applyOne(e,t,i);a?.route&&((n===void 0?a.route.reset??!0:n)&&this._resetCallback?.(),r||this.dispatchEvent({type:B.SETTING_CHANGED,key:e,value:t,prev:a.prev}))}setMany(e,{silent:t,reset:n,source:r=qb.HOST}={}){let i=!1;for(let[n,a]of Object.entries(e)){let e=this._applyOne(n,a,r);e?.route&&((e.route.reset??!0)&&(i=!0),t||this.dispatchEvent({type:B.SETTING_CHANGED,key:n,value:a,prev:e.prev}))}(n===void 0?i:n)&&this._resetCallback?.()}_applyOne(e,t,n){let r=this._values.get(e);if(r===t)return null;this._values.set(e,t),this._sources.set(e,n);let i=Kb[e];return i?(this._applyRoute(i,t,r),{route:i,prev:r}):(this._reportUnknownKey(e),{route:null,prev:r})}_reportUnknownKey(e){this._issues?.record(Y.SETTING_UNKNOWN_KEY,`unknown setting "${e}" — stored but never applied to any stage`,{key:e})}get(e){return this._values.get(e)}getEffective(){let e={};for(let[t,n]of this._values)e[t]={value:n,source:this._sources.get(t)??qb.DEFAULT,routed:Kb[t]!==void 0};return e}getAll(){return Object.fromEntries(this._values)}serialize(){let e={};for(let[t,n]of this._values){if(this._sources.get(t)!==qb.HOST||!Kb[t])continue;let r=Kr(n);r!==void 0&&(e[t]=r)}return e}restore(e){let t={},n=[];for(let[r,i]of Object.entries(e??{}))Kb[r]?t[r]=qr(i):n.push(r);return this.setMany(t),n}applyAll(){for(let[e,t]of this._values){let n=Kb[e];n&&this._applyRoute(n,t,void 0)}}_applyRoute(e,t,n){e.uniform?(this._pathTracer?.setUniform(e.uniform,t),e.after&&this._pathTracer?.[e.after]?.()):e.handler?this._handlers[e.handler]?.(t,n):e.delegate&&this._delegates[e.delegate]?.updateParam?.(e.param,t)}_initDefaults(e){for(let t of Object.keys(Kb))t in e&&(this._values.set(t,e[t]),this._sources.set(t,qb.DEFAULT));for(let[t,n]of Object.entries(Jb))t in e&&(this._values.set(n,e[t]),this._sources.set(n,qb.DEFAULT))}},Xb=512,Zb=4<<20,Qb=15e8,$b=new TextDecoder;function ex(e){return e.length>=2&&e[0]===31&&e[1]===139}function tx(e){return e.length>=4&&e[0]===80&&e[1]===75&&(e[2]===3||e[2]===5||e[2]===7)}function nx(e){return e.length>=263&&String.fromCharCode(...e.subarray(257,262))===`ustar`}function rx(e){return ex(e)?`gzip`:tx(e)?`zip`:nx(e)?`tar`:null}function ix(e,t,n){let r=t,i=t+n;for(;r<i&&e[r]!==0;)r++;return $b.decode(e.subarray(t,r))}function ax(e,t,n){if(e[t]&128){let r=e[t]&127;for(let i=t+1;i<t+n;i++)r=r*256+e[i];return r}let r=ix(e,t,n).trim();if(!r)return 0;let i=parseInt(r,8);return Number.isFinite(i)?i:0}function ox(e){let t=[];for(let n of e.replace(/\\/g,`/`).split(`/`))n===``||n===`.`||(n===`..`?t.pop():t.push(n));return t.join(`/`)}function sx(e){let t=$b.decode(e).match(/^\d+ path=(.*)$/m);return t?t[1]:null}var cx=e=>e+(Xb-e%Xb)%Xb,lx=e=>e===`L`||e===`x`||e===`X`;function ux(e){let t=ix(e,345,155),n=ix(e,0,100);return{type:String.fromCharCode(e[156]||48),size:ax(e,124,12),name:t?`${t}/${n}`:n}}function dx(e,t){return e===`5`||e===`g`||e===`K`||t.endsWith(`/`)||e!==`0`&&e!==` `?null:ox(t)||null}function fx(e){for(let t=0;t<Xb;t++)if(e[t]!==0)return!1;return!0}var px=class{constructor({filter:e=null,retain:t=null,byteBudget:n=Qb,onEntry:r=null}={}){this.filter=e,this.retain=t,this.byteBudget=n,this.onEntry=r,this.entries=Object.create(null),this.listing=[],this.retainedBytes=0,this.truncated=!1,this.finished=!1,this._header=new Uint8Array(Xb),this._headerLen=0,this._state=`header`,this._remaining=0,this._size=0,this._copied=0,this._dst=null,this._special=null,this._pendingName=null,this._abs=0}push(e){let t=this._abs;this._abs+=e.length;let n=0;for(;n<e.length&&!this.finished;)if(this._state===`header`){let r=Math.min(Xb-this._headerLen,e.length-n);this._header.set(e.subarray(n,n+r),this._headerLen),this._headerLen+=r,n+=r,this._headerLen===Xb&&(this._headerLen=0,this._bodyStart=t+n,this._readHeader())}else{let t=Math.min(this._remaining,e.length-n);if(this._dst&&this._copied<this._size){let r=Math.min(t,this._size-this._copied);this._dst.set(e.subarray(n,n+r),this._copied),this._copied+=r}this._remaining-=t,n+=t,this._remaining===0&&this._endBody()}}end(){this.finished=!0}result(){return{entries:this.entries,listing:this.listing,retainedBytes:this.retainedBytes,truncated:this.truncated}}_readHeader(){let e=this._header,t=!0;for(let n=0;n<Xb;n++)if(e[n]!==0){t=!1;break}if(t){this.finished=!0;return}let{type:n,size:r,name:i}=ux(e),a=this._pendingName??i;if(this._pendingName=null,this._size=r,this._copied=0,this._remaining=cx(r),this._dst=null,this._special=null,this._indexed=!1,this._state=this._remaining>0?`body`:`header`,lx(n)){this._special=n===`L`?`longname`:`pax`,this._dst=new Uint8Array(r);return}let o=dx(n,a);o&&(this.listing.push({path:o,size:r}),this._indexed=this.filter?this.filter(o,r):!0,this._indexed&&!(this.retain&&!this.retain(o,r))&&(this.retainedBytes+r>this.byteBudget?this.truncated=!0:(this._dst=new Uint8Array(r),this.retainedBytes+=r)),this._remaining===0&&this._endBody())}_endBody(){if(this._state=`header`,this._special===`longname`){this._pendingName=ix(this._dst,0,this._dst.length),this._dst=null;return}if(this._special===`pax`){let e=sx(this._dst);e&&(this._pendingName=e),this._dst=null;return}let e=this.listing[this.listing.length-1];this._indexed&&e&&(e.offset=this._bodyStart,this._indexed=!1),this._dst&&=(this.entries[e.path]=this._dst,this.onEntry?.(e.path,this._dst),null)}};async function mx(e,t){if(typeof DecompressionStream<`u`&&typeof e?.stream==`function`){let n=e.stream().pipeThrough(new DecompressionStream(`gzip`)).getReader();for(;;){let{done:e,value:r}=await n.read();if(e)break;t(r)}return}let n=null,r=new m.Gunzip((e,r)=>{e instanceof Error?n=e:e&&e.length&&t(e)});await hx(e,(e,t)=>{if(r.push(e,t),n)throw n})}async function hx(e,t){if(e instanceof Uint8Array){for(let n=0;n<e.length;n+=Zb){let r=Math.min(n+Zb,e.length);t(e.subarray(n,r),r===e.length)}e.length===0&&t(e,!0);return}let n=e.size;for(let r=0;r<n;r+=Zb){let i=Math.min(r+Zb,n);t(new Uint8Array(await e.slice(r,i).arrayBuffer()),i===n)}n===0&&t(new Uint8Array,!0)}async function gx(e,t={}){let{onProgress:n,...r}=t,i=new px(r),a=0,o=0;return await mx(e,e=>{i.push(e),a+=e.length,n&&a>=o&&(o=a+(64<<20),n({entries:i.listing.length,bytes:a}))}),i.end(),i.result()}var _x=1<<20;async function vx(e,{onProgress:t=null}={}){let n=e.size,r=[],i=null,a=0,o=null,s=0,c=0,l=async(t,r)=>{if(i&&t>=a&&t+r<=a+i.length)return i.subarray(t-a,t-a+r);let o=Math.min(n,t+Math.max(r,_x));return i=new Uint8Array(await e.slice(t,o).arrayBuffer()),a=t,i.subarray(0,r)};for(;s+Xb<=n;){let e=await l(s,Xb);if(fx(e))break;let{type:n,size:i,name:a}=ux(e),u=o??a;o=null;let d=s+Xb;if(lx(n)){let e=await l(d,i);o=n===`L`?ix(e,0,e.length):sx(e)}else{let e=dx(n,u);e&&r.push({path:e,size:i,offset:d})}s=d+cx(i),t&&s>=c&&(c=s+(256<<20),t({entries:r.length,bytes:s}))}return r}function yx(){let e=new px({retain:()=>!1});return{push:t=>e.push(t),finish:()=>(e.end(),e.listing.filter(e=>e.offset!==void 0))}}async function bx(e,t={}){let{index:n=null,headersOnly:r=!1,onProgress:i=null,...a}=t,o,s,c,l,u=null;if(n||r){u=n?.listing??await vx(e,{onProgress:i});let{filter:t}=a;s=u.map(e=>!t||t(e.path,e.size)?{...e}:{path:e.path,size:e.size}),o=Object.create(null),c=0,l=!1}else{let t=new px({...a});await hx(e,e=>t.push(e)),t.end(),{entries:o,listing:s,retainedBytes:c,truncated:l}=t.result()}let d=new Map;for(let e of s)e.offset!==void 0&&d.set(e.path,e);return{entries:o,listing:s,read:async t=>{if(o[t])return o[t];let n=d.get(t);return n?new Uint8Array(await e.slice(n.offset,n.offset+n.size).arrayBuffer()):null},readHead:async(t,n)=>{if(o[t])return o[t].subarray(0,n);let r=d.get(t);return r?new Uint8Array(await e.slice(r.offset,r.offset+Math.min(r.size,n)).arrayBuffer()):null},retainedBytes:c,truncated:l,indexed:d.size,index:u?{v:1,listing:u}:null}}function xx(e){let t=(Array.isArray(e)?e:[e]).filter(Boolean).map(e=>{let t=ox(e);return{p:t,inside:t+`/`}});return t.length===0?()=>!0:e=>{let n=e.lastIndexOf(`/`),r=n<0?``:e.slice(0,n);if(r===``)return!0;let i=r.lastIndexOf(`/textures`),a=i>=0&&i===r.length-9?r.slice(0,i)+`/`:null;for(let{p:n,inside:i}of t)if(e===n||e.startsWith(i)||i.startsWith(r+`/`)||a!==null&&i.startsWith(a))return!0;return!1}}function Sx(e){let t=e.filter(e=>e.path.toLowerCase().endsWith(`.pbrt`)).sort((e,t)=>e.path.split(`/`).length-t.path.split(`/`).length||e.path.length-t.path.length||(e.path<t.path?-1:1));if(!t.length)return{root:null,elements:[]};let n=t[0].path,r=n.lastIndexOf(`/`),i=r<0?``:n.slice(0,r),a=i?i+`/`:``,o=new Map;for(let t of e){if(!t.path.startsWith(a))continue;let e=t.path.slice(a.length),n=e.indexOf(`/`);if(n<0)continue;let r=e.slice(0,n),i=o.get(r);i||o.set(r,i={name:r,prefix:a+r,files:0,bytes:0,scenes:0}),i.files++,i.bytes+=t.size,t.path.toLowerCase().endsWith(`.pbrt`)&&i.scenes++}return{root:i,elements:[...o.values()].filter(e=>e.scenes>0).sort((e,t)=>e.bytes-t.bytes)}}var Cx=101010256,wx=117853008,Tx=101075792,Ex=33639248,Dx=67324752,Ox=65557,kx=new TextDecoder;async function Ax(e,t,n){return new Uint8Array(await e.slice(t,n).arrayBuffer())}function jx(e,t){return e.getUint32(t+4,!0)*4294967296+e.getUint32(t,!0)}function Mx(e){let t=``;for(let n=0;n<e.length;n+=8192)t+=String.fromCharCode(...e.subarray(n,n+8192));return t}async function Nx(e){let t=e.size,n=await Ax(e,Math.max(0,t-Ox-20),t),r=new DataView(n.buffer),i=-1;for(let e=n.length-22;e>=0;e--)if(r.getUint32(e,!0)===Cx){i=e;break}if(i<0)throw Error(`zip: end of central directory not found`);let a=r.getUint16(i+10,!0),o=r.getUint32(i+12,!0),s=r.getUint32(i+16,!0);if(a===65535||o===4294967295||s===4294967295){let t=i-20;if(t<0||r.getUint32(t,!0)!==wx)throw Error(`zip: ZIP64 locator missing`);let n=jx(r,t+8),c=new DataView((await Ax(e,n,n+56)).buffer);if(c.getUint32(0,!0)!==Tx)throw Error(`zip: ZIP64 end record missing`);a=jx(c,32),o=jx(c,40),s=jx(c,48)}let c=await Ax(e,s,s+o),l=new DataView(c.buffer),u=[],d=0;for(let e=0;e<a&&d+46<=c.length;e++){if(l.getUint32(d,!0)!==Ex)throw Error(`zip: corrupt central directory`);let e=l.getUint16(d+8,!0),t=l.getUint16(d+10,!0),n=l.getUint32(d+20,!0),r=l.getUint32(d+24,!0),i=l.getUint16(d+28,!0),a=l.getUint16(d+30,!0),o=l.getUint16(d+32,!0),s=l.getUint32(d+42,!0),f=c.subarray(d+46,d+46+i),p=e&2048?kx.decode(f):Mx(f);for(let e=d+46+i,t=e+a;e+4<=t;){let t=l.getUint16(e,!0),i=l.getUint16(e+2,!0);if(t===1){let t=e+4;r===4294967295&&(r=jx(l,t),t+=8),n===4294967295&&(n=jx(l,t),t+=8),s===4294967295&&(s=jx(l,t))}e+=4+i}p.endsWith(`/`)||u.push({name:p,size:r,compSize:n,method:t,local:s,encrypted:(e&1)!=0}),d+=46+i+a+o}return u}async function Px(e,t){if(t.encrypted)throw Error(`zip: "${t.name}" is encrypted`);let n=new DataView((await Ax(e,t.local,t.local+30)).buffer);if(n.getUint32(0,!0)!==Dx)throw Error(`zip: bad local header for "${t.name}"`);return t.local+30+n.getUint16(26,!0)+n.getUint16(28,!0)}async function Fx(e,t){let n=await Px(e,t),r=await Ax(e,n,n+t.compSize);if(t.method===0)return r;if(t.method===8)return t.size===0?new Uint8Array:(0,m.inflateSync)(r,{out:new Uint8Array(t.size)});throw Error(`zip: "${t.name}" uses compression method ${t.method}, which is not supported`)}async function Ix(e,{filter:t=null}={}){let n=await Nx(e),r=new Map,i=n.map(e=>t&&!t(e.name,e.size)?{path:e.name,size:e.size}:(r.set(e.name,e),{path:e.name,size:e.size,offset:e.local})),a=async t=>{let n=r.get(t);return n?Fx(e,n):null},o=async t=>{let n=r.get(t);if(!n)return null;if(n.method!==0)return new Blob([await Fx(e,n)]);let i=await Px(e,n);return e.slice(i,i+n.compSize)};return{entries:Object.create(null),listing:i,read:a,readHead:async(e,t)=>{let n=await o(e);return n?new Uint8Array(await n.slice(0,t).arrayBuffer()):null},slice:o,retainedBytes:0,truncated:!1,indexed:r.size}}var Lx=1,Rx=3;async function zx(e,t){return`${e}:${Gn(await Wn(t))}`}async function Bx(e,{storage:t,label:n=e.name,onProgress:r=null}){if(!t||typeof DecompressionStream>`u`)return null;let i=t.area(Zn.ARCHIVES),a=await zx(`gunzip`,e),o=await i.open(a),s=!!o;if(!o){let s=await i.create(a,{label:n,expectedBytes:e.size*Rx});if(!s)return null;let c=yx(),l=new TransformStream({transform(e,t){c.push(e),t.enqueue(e)}});try{let t=e.stream().pipeThrough(new DecompressionStream(`gzip`)).pipeThrough(l),n=await s.writeStream(`data.tar`,t,{onProgress:r});await s.writeJSON(`index.json`,{v:Lx,listing:c.finish()}),await s.commit({compressedBytes:e.size,tarBytes:n})}catch(e){if(await s.abort(),e?.name!==`QuotaExceededError`)throw e;return t._issue(Y.STORAGE_QUOTA_EXCEEDED,`ran out of room unpacking ${n}; reading it in memory instead`,{area:Zn.ARCHIVES}),null}if(o=await i.open(a,{wait:!0}),!o)return null}let c=await o.file(`data.tar`),l=await o.json(`index.json`);return!c||l?.v!==Lx?(o.release(),null):{file:c,index:l,release:()=>o.release(),cached:s}}async function Vx(e,t){if(!t)return null;let n=await t.area(Zn.ARCHIVES).open(await zx(`tarindex`,e));if(!n)return null;try{let e=await n.json(`index.json`);return e?.v===Lx?e:null}finally{n.release()}}async function Hx(e,t,n){if(!t||!n)return!1;let r=await t.area(Zn.ARCHIVES).create(await zx(`tarindex`,e),{label:`${e.name} (index)`});if(!r)return!1;try{return await r.writeJSON(`index.json`,n),await r.commit(),!0}catch{return await r.abort(),!1}}var Ux=`__rayzeeArchivePath`,Wx=`__rayzeeArchiveLoader`,Gx=64,Kx=32<<20,qx=64<<20,Jx={Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Uint8ClampedArray},Yx=[`name`,`mapping`,`channel`,`wrapS`,`wrapT`,`magFilter`,`minFilter`,`anisotropy`,`format`,`type`,`flipY`,`generateMipmaps`,`premultiplyAlpha`,`unpackAlignment`,`colorSpace`],Xx=[`name`,`visible`,`castShadow`,`receiveShadow`,`frustumCulled`,`renderOrder`,`matrixAutoUpdate`],Zx=class extends Error{constructor(e){super(e),this.name=`SceneGraphUnsupported`}};function Qx(e){return e.isInstancedMesh?`InstancedMesh`:e.isSkinnedMesh||e.isBatchedMesh?null:e.isMesh?`Mesh`:e.isPerspectiveCamera?`PerspectiveCamera`:e.isOrthographicCamera?`OrthographicCamera`:e.isLight||e.isPoints||e.isLine||e.isSprite||e.isLOD?null:e.isGroup?`Group`:e.constructor===r.Object3D?`Object3D`:null}function $x(e,t){try{let t=JSON.parse(JSON.stringify(e??{}));return delete t[Ux],delete t[Wx],t}catch{throw new Zx(`${t}: userData is not plain JSON`)}}var eS=class{constructor(){this.sections=[],this.length=0}add(e){let t=Math.ceil(this.length/Gx)*Gx;return this.sections.push({offset:t,array:e}),this.length=t+e.byteLength,{offset:t,byteLength:e.byteLength,type:e.constructor.name,length:e.length}}};function tS(e,t,n){if(e.isInterleavedBufferAttribute||!ArrayBuffer.isView(e.array))throw new Zx(`${n}: interleaved or non-typed attribute`);return{section:t.add(e.array),itemSize:e.itemSize,normalized:e.normalized===!0,name:e.name??``}}function nS(e,t){let n=`geometry ${e.name||e.uuid}`;if(Object.keys(e.morphAttributes??{}).length)throw new Zx(`${n}: morph targets`);let r={};for(let[i,a]of Object.entries(e.attributes))r[i]=tS(a,t,n);return{uuid:e.uuid,name:e.name,attributes:r,index:e.index?tS(e.index,t,n):null,groups:e.groups.map(e=>({...e})),drawRange:{...e.drawRange},userData:$x(e.userData,n)}}function rS(e,t){let n={uuid:e.uuid,userData:$x(e.userData,`texture ${e.uuid}`)};for(let t of Yx)n[t]=e[t];for(let t of[`repeat`,`offset`,`center`])n[t]=e[t].toArray();n.rotation=e.rotation;let r=e.userData?.[Ux];if(r)n.path=r,n.loader=e.userData.__rayzeeArchiveLoader??`image`;else if(e.isDataTexture&&ArrayBuffer.isView(e.image?.data))n.data={section:t.add(e.image.data),width:e.image.width,height:e.image.height};else throw new Zx(`texture ${e.name||e.uuid}: no archive path and no pixel data to keep`);return n}function iS(e,t){let n=e.toJSON(t);n.exactColors={};for(let[t,r]of Object.entries(e))r?.isColor&&(n.exactColors[t]=[r.r,r.g,r.b]);return e.ior!==void 0&&(n.exactIor=e.ior),n}function aS(e,t){for(let n of Object.values(e))n?.isTexture&&t.set(n.uuid,n)}function oS(e,{environment:t=null,animations:n=[],stats:i={}}={}){let a=new eS,o=[],s=new Map,c=new Map,l=new Map,u=(e,t)=>{let n=Qx(e);if(!n)throw new Zx(`${e.type} "${e.name}" cannot be cached`);let r={type:n,uuid:e.uuid,parent:t,userData:$x(e.userData,`${n} "${e.name}"`)};for(let t of Xx)r[t]=e[t];if(r.position=e.position.toArray(),r.quaternion=e.quaternion.toArray(),r.scale=e.scale.toArray(),r.layers=e.layers.mask,e.matrixAutoUpdate||(r.matrix=e.matrix.toArray()),e.isMesh){s.set(e.geometry.uuid,e.geometry);let t=Array.isArray(e.material)?e.material:[e.material];for(let e of t)c.set(e.uuid,e),aS(e,l);r.geometry=e.geometry.uuid,r.material=Array.isArray(e.material)?t.map(e=>e.uuid):e.material.uuid}if(e.isInstancedMesh&&(r.count=e.count,r.instanceMatrix=a.add(e.instanceMatrix.array),r.instanceColor=e.instanceColor?a.add(e.instanceColor.array):null),e.isCamera)for(let t of[`fov`,`aspect`,`near`,`far`,`zoom`,`focus`,`filmGauge`,`filmOffset`,`left`,`right`,`top`,`bottom`])e[t]!==void 0&&(r[t]=e[t]);let i=o.push(r)-1;for(let t of e.children)u(t,i)};u(e,-1),t&&l.set(t.uuid,t);let d={textures:{},images:{}};for(let e of l.keys())d.textures[e]={uuid:e};return{manifest:{v:2,nodes:o,geometries:[...s.values()].map(e=>nS(e,a)),textures:[...l.values()].map(e=>rS(e,a)),materials:[...c.values()].map(e=>iS(e,d)),animations:n.map(e=>r.AnimationClip.toJSON(e)),environment:t?t.uuid:null,stats:i},sections:a.sections,byteLength:a.length}}async function sS(e,{manifest:t,sections:n},{release:r=!1}={}){for(let t of n){let{offset:n,array:i}=t,a=new Uint8Array(i.buffer,i.byteOffset,i.byteLength);for(let t=0;t<a.length;t+=Kx)await e.write(`data.bin`,a.subarray(t,Math.min(a.length,t+Kx)),{at:n+t});r&&(t.array=null)}n.length===0&&await e.write(`data.bin`,new Uint8Array),await e.writeJSON(`graph.json`,t)}function cS(e){let t=Jx[e];if(!t)throw Error(`scene graph: unknown array type ${e}`);return t}async function lS(e,t){let n=new Map,r=[...t].sort((e,t)=>e.offset-t.offset),i=null,a=0;for(let t of r){let{offset:r,byteLength:o,type:s}=t,c=cS(s),l=r+o;if(o>qx){n.set(r,new c(await e.slice(r,l).arrayBuffer()));continue}(!i||r<a||l>a+i.byteLength)&&(a=r,i=await e.slice(r,Math.min(e.size,r+qx)).arrayBuffer()),n.set(r,new c(i.slice(r-a,l-a)))}return n}function uS(e){let t=[];for(let n of e.nodes)n.instanceMatrix&&t.push(n.instanceMatrix),n.instanceColor&&t.push(n.instanceColor);for(let n of e.geometries){for(let e of Object.values(n.attributes))t.push(e.section);n.index&&t.push(n.index.section)}for(let n of e.textures)n.data&&t.push(n.data.section);return t}function dS(e,t){let n=new r.BufferAttribute(e.get(t.section.offset),t.itemSize,t.normalized);return n.name=t.name,n}function fS(e,t){for(let n of Yx)t[n]!==void 0&&(e[n]=t[n]);e.repeat.fromArray(t.repeat),e.offset.fromArray(t.offset),e.center.fromArray(t.center),e.rotation=t.rotation,e.uuid=t.uuid,Object.assign(e.userData,t.userData),e.needsUpdate=!0}async function pS(e,t,{loadTexture:n}){if(e?.v!==2)throw Error(`scene graph: unknown format`);let i=await lS(t,uS(e)),a=e=>i.get(e.offset),o={};for(let t of e.textures){let e;if(t.path){if(e=await n(t.path,t.loader),!e)throw Error(`scene graph: "${t.path}" is missing from the archive`);e.userData[Ux]=t.path,e.userData[Wx]=t.loader}else e=new r.DataTexture(a(t.data.section),t.data.width,t.data.height);fS(e,t),o[t.uuid]=e}let s=new r.MaterialLoader().setTextures(o),c={};for(let t of e.materials){let e=s.parse(t);for(let[n,r]of Object.entries(t.exactColors??{}))e[n]?.setRGB(r[0],r[1],r[2]);t.exactIor!==void 0&&(e.ior=t.exactIor),c[t.uuid]=e}let l={};for(let t of e.geometries){let e=new r.BufferGeometry;e.uuid=t.uuid,e.name=t.name;for(let[n,r]of Object.entries(t.attributes))e.setAttribute(n,dS(i,r));t.index&&e.setIndex(dS(i,t.index));for(let n of t.groups)e.addGroup(n.start,n.count,n.materialIndex);e.setDrawRange(t.drawRange.start,t.drawRange.count),e.userData=t.userData,l[t.uuid]=e}let u=[];for(let t of e.nodes){let e=Array.isArray(t.material)?t.material.map(e=>c[e]):c[t.material],n;switch(t.type){case`InstancedMesh`:n=new r.InstancedMesh(l[t.geometry],e,1),n.instanceMatrix=new r.InstancedBufferAttribute(a(t.instanceMatrix),16),n.count=t.count,t.instanceColor&&(n.instanceColor=new r.InstancedBufferAttribute(a(t.instanceColor),3));break;case`Mesh`:n=new r.Mesh(l[t.geometry],e);break;case`PerspectiveCamera`:n=new r.PerspectiveCamera;break;case`OrthographicCamera`:n=new r.OrthographicCamera;break;case`Group`:n=new r.Group;break;default:n=new r.Object3D}n.uuid=t.uuid;for(let e of Xx)n[e]=t[e];if(n.position.fromArray(t.position),n.quaternion.fromArray(t.quaternion),n.scale.fromArray(t.scale),n.layers.mask=t.layers,n.userData=t.userData,t.matrix&&n.matrix.fromArray(t.matrix),n.isCamera){for(let e of[`fov`,`aspect`,`near`,`far`,`zoom`,`focus`,`filmGauge`,`filmOffset`,`left`,`right`,`top`,`bottom`])t[e]!==void 0&&(n[e]=t[e]);n.updateProjectionMatrix()}u.push(n),t.parent>=0&&u[t.parent].add(n)}return{root:u[0],environment:e.environment?o[e.environment]:null,animations:e.animations.map(e=>r.AnimationClip.parse(e)),stats:e.stats}}var mS=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength&&typeof e.buffer.transfer==`function`&&!(typeof SharedArrayBuffer<`u`&&e.buffer instanceof SharedArrayBuffer);function hS(e){e&&mS(e)&&e.buffer.transfer(0)}function gS(e,t){let n=e.constructor;if(mS(e))return new n(e.buffer.transfer(t*n.BYTES_PER_ELEMENT));let r=new n(t);return r.set(t<e.length?e.subarray(0,t):e),r}var _S={STRING:`string`,NUMBER:`number`,WORD:`word`,LBRACKET:`[`,RBRACKET:`]`},vS=9,yS=10,bS=12,xS=13,SS=32,CS=34,wS=35,TS=43,ES=45,DS=46,OS=48,kS=57,AS=91,jS=93,MS=69,NS=101,PS=e=>e===SS||e===vS||e===yS||e===xS||e===bS,FS=e=>e>=OS&&e<=kS,IS=15,LS=22,RS=(()=>{let e=new Float64Array(LS+1);for(let t=0;t<e.length;t++)e[t]=10**t;return e})(),zS=new TextDecoder;function BS(e,t,n){if(n-t===0)return``;let r=!0;for(let i=t;i<n;i++)if(e[i]>127){r=!1;break}if(!r)return zS.decode(e.subarray(t,n));let i=``;for(let r=t;r<n;r++)i+=String.fromCharCode(e[r]);return i}var VS=class{constructor(e){this.bytes=typeof e==`string`?new TextEncoder().encode(e):e,this.i=0,this.n=this.bytes.length,this._ahead=null}peek(){return this._ahead===null&&(this._ahead=this._scan()),this._ahead}next(){let e=this.peek();return this._ahead=null,e}_scan(){let e=this.bytes,t=this.i,n=this.n;for(;;){for(;t<n&&PS(e[t]);)t++;if(t<n&&e[t]===wS){for(;t<n&&e[t]!==yS;)t++;continue}break}if(t>=n)return this.i=t,null;let r=e[t];if(r===AS)return this.i=t+1,{type:_S.LBRACKET};if(r===jS)return this.i=t+1,{type:_S.RBRACKET};if(r===CS){let r=++t;for(;t<n&&e[t]!==CS;)t++;if(t>=n)throw Error(`PBRT tokenizer: unterminated string literal`);return this.i=t+1,{type:_S.STRING,value:BS(e,r,t)}}if(FS(r)||r===DS&&FS(e[t+1])||(r===ES||r===TS)&&(FS(e[t+1])||e[t+1]===DS&&FS(e[t+2])))return this._scanNumber(t);let i=t;for(;t<n;){let n=e[t];if(PS(n)||n===CS||n===AS||n===jS||n===wS)break;t++}return this.i=t,{type:_S.WORD,value:BS(e,i,t)}}_scanNumber(e){let t=this.bytes,n=this.n,r=e,i=!1;t[r]===ES?(i=!0,r++):t[r]===TS&&r++;let a=0,o=0,s=0;for(;r<n&&FS(t[r]);)a=a*10+(t[r]-OS),o++,r++;if(r<n&&t[r]===DS)for(r++;r<n&&FS(t[r]);)a=a*10+(t[r]-OS),o++,s++,r++;let c=0;if(r<n&&(t[r]===NS||t[r]===MS)){let e=r+1,i=!1;if(e<n&&(t[e]===ES||t[e]===TS)&&(i=t[e]===ES,e++),e<n&&FS(t[e])){let a=0;for(;e<n&&FS(t[e]);)a=a*10+(t[e]-OS),e++;c=i?-a:a,r=e}}if(this.i=r,o===0)throw Error(`PBRT tokenizer: invalid number "${BS(t,e,r)}"`);let l=c-s;if(!(o<=IS&&l>=-LS&&l<=LS)){let n=Number(BS(t,e,r));if(Number.isNaN(n))throw Error(`PBRT tokenizer: invalid number "${BS(t,e,r)}"`);return{type:_S.NUMBER,value:n}}let u=l===0?a:l>0?a*RS[l]:a/RS[-l];return i&&(u=-u),{type:_S.NUMBER,value:u}}};function HS(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function US(e){return e[0]*(e[5]*e[10]-e[6]*e[9])-e[4]*(e[1]*e[10]-e[2]*e[9])+e[8]*(e[1]*e[6]-e[2]*e[5])}function WS(e,t,n,r){for(let i=0;i<4;i++){let a=r[i*4],o=r[i*4+1],s=r[i*4+2],c=r[i*4+3];for(let r=0;r<4;r++)e[i*4+r]=t[n+r]*a+t[n+4+r]*o+t[n+8+r]*s+t[n+12+r]*c}return e}function GS(e,t){let n=e[0],r=e[1],i=e[2],a=e[3],o=e[4],s=e[5],c=e[6],l=e[7],u=e[8],d=e[9],f=e[10],p=e[11],m=e[12],h=e[13],g=e[14],_=e[15],v=t[0],y=t[1],b=t[2],x=t[3],S=t[4],C=t[5],w=t[6],T=t[7],E=t[8],D=t[9],O=t[10],k=t[11],A=t[12],j=t[13],M=t[14],N=t[15];return[n*v+o*y+u*b+m*x,r*v+s*y+d*b+h*x,i*v+c*y+f*b+g*x,a*v+l*y+p*b+_*x,n*S+o*C+u*w+m*T,r*S+s*C+d*w+h*T,i*S+c*C+f*w+g*T,a*S+l*C+p*w+_*T,n*E+o*D+u*O+m*k,r*E+s*D+d*O+h*k,i*E+c*D+f*O+g*k,a*E+l*D+p*O+_*k,n*A+o*j+u*M+m*N,r*A+s*j+d*M+h*N,i*A+c*j+f*M+g*N,a*A+l*j+p*M+_*N]}function KS(e,t,n){return[1,0,0,0,0,1,0,0,0,0,1,0,e,t,n,1]}function qS(e,t,n){return[e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1]}function JS(e,t,n,r){let i=Math.hypot(t,n,r)||1;t/=i,n/=i,r/=i;let a=e*Math.PI/180,o=Math.cos(a),s=Math.sin(a),c=1-o,l=c*t*t+o,u=c*t*n-s*r,d=c*t*r+s*n,f=c*t*n+s*r,p=c*n*n+o,m=c*n*r-s*t;return[l,f,c*t*r-s*n,0,u,p,c*n*r+s*t,0,d,m,c*r*r+o,0,0,0,0,1]}function YS(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function XS(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function ZS(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function QS(e,t,n){let r=ZS(YS(t,e)),i=ZS(XS(ZS(n),r)),a=XS(r,i);return[i[0],i[1],i[2],0,a[0],a[1],a[2],0,r[0],r[1],r[2],0,e[0],e[1],e[2],1]}function $S(e){let t=e[0],n=e[1],r=e[2],i=e[3],a=e[4],o=e[5],s=e[6],c=e[7],l=e[8],u=e[9],d=e[10],f=e[11],p=e[12],m=e[13],h=e[14],g=e[15],_=u*h*c-m*d*c+m*s*f-o*h*f-u*s*g+o*d*g,v=p*d*c-l*h*c-p*s*f+a*h*f+l*s*g-a*d*g,y=l*m*c-p*u*c+p*o*f-a*m*f-l*o*g+a*u*g,b=p*u*s-l*m*s-p*o*d+a*m*d+l*o*h-a*u*h,x=t*_+n*v+r*y+i*b;if(x===0)return HS();let S=1/x;return[_*S,(m*d*i-u*h*i-m*r*f+n*h*f+u*r*g-n*d*g)*S,(o*h*i-m*s*i+m*r*c-n*h*c-o*r*g+n*s*g)*S,(u*s*i-o*d*i-u*r*c+n*d*c+o*r*f-n*s*f)*S,v*S,(l*h*i-p*d*i+p*r*f-t*h*f-l*r*g+t*d*g)*S,(p*s*i-a*h*i-p*r*c+t*h*c+a*r*g-t*s*g)*S,(a*d*i-l*s*i+l*r*c-t*d*c-a*r*f+t*s*f)*S,y*S,(p*u*i-l*m*i-p*n*f+t*m*f+l*n*g-t*u*g)*S,(a*m*i-p*o*i+p*n*c-t*m*c-a*n*g+t*o*g)*S,(l*o*i-a*u*i-l*n*c+t*u*c+a*n*f-t*o*f)*S,b*S,(l*m*r-p*u*r+p*n*d-t*m*d-l*n*h+t*u*h)*S,(p*o*r-a*m*r-p*n*s+t*m*s+a*n*h-t*o*h)*S,(a*u*r-l*o*r+l*n*s-t*u*s-a*n*d+t*o*d)*S]}var eC=8,tC=1,nC=2,rC=3,iC=new Set([`Identity`,`Transform`,`CoordinateSystem`,`CoordSysTransform`,`ActiveTransform`,`TransformTimes`,`Camera`,`Film`,`WorldBegin`,`MakeNamedMaterial`,`Texture`,`MakeNamedMedium`,`LightSource`,`AreaLightSource`,`ObjectBegin`,`ObjectEnd`,`ObjectInstance`]);function aC(e,t){if(e===t)return!0;for(let n=0;n<16;n++)if(e[n]!==t[n])return!1;return!0}var oC={integer:Int32Array,point3:Float32Array,point2:Float32Array,vector3:Float32Array,vector2:Float32Array,vector:Float32Array,normal:Float32Array,rgb:Float32Array},sC=class{constructor(e={}){this.releaseInclude=e.releaseInclude||null,this.resolveInclude=e.resolveInclude||(()=>{throw Error(`PBRTParser: Include used but no resolveInclude provided`)}),this.maxPlacements=e.maxPlacements??1/0,this.instanceIncludes=e.instanceIncludes!==!1,this._includes=new Map,this._stateIds=new WeakMap,this._nextStateId=1,this._effects=0,this._movedShapes=!1,this.ir={film:null,camera:null,namedMaterials:new Map,namedTextures:new Map,shapes:[],lights:[],instances:new Map,instanceCount:0,skippedInstances:0,objects:new Map,transformTimes:{start:0,end:1},hasMotion:!1,warnings:[]},this.ctm=HS(),this.ctmEnd=null,this.activeTransform=rC,this._ctmSource=null,this._ctmValue=null,this.state={material:null,areaLight:null,reverseOrientation:!1},this.attributeStack=[],this.transformStack=[],this.coordSystems=new Map,this.currentObject=null,this.objectBeginCTM=null,this.dirStack=[``],this.stream=null,this._warnedUnknown=new Set}async parse(e,t=``){this.dirStack=[t],await this._run(new VS(e)),this._movedShapes&&(this.ir.shapes=this.ir.shapes.filter(Boolean));for(let e of this.ir.instances.values())e.matrices=gS(e.matrices,e.count*16),e.matricesEnd&&=gS(e.matricesEnd,e.count*16);return this.ir}_addInstance(e,t=this.ctm){if(this.ir.instanceCount>=this.maxPlacements){this.ir.skippedInstances++;return}let n=this.ir.instances.get(e);n||this.ir.instances.set(e,n={name:e,count:0,matrices:new Float32Array(512),matricesEnd:null});let r=(n.count+1)*16;if(r>n.matrices.length){let e=Math.max(r,n.matrices.length*2);n.matrices=gS(n.matrices,e),n.matricesEnd&&=gS(n.matricesEnd,e)}let i=n.count*16;for(let e=0;e<16;e++)n.matrices[i+e]=t[e];let a=this._ctmEndSnapshot();if(a&&!n.matricesEnd&&(n.matricesEnd=n.matrices.slice()),n.matricesEnd){let e=a||t;for(let t=0;t<16;t++)n.matricesEnd[i+t]=e[t]}n.count++,this.ir.instanceCount++}_ctmSnapshot(){return this._ctmSource!==this.ctm&&(this._ctmSource=this.ctm,this._ctmValue=this.ctm.slice()),this._ctmValue}_ctmEndSnapshot(){return this.ctmEnd===null||aC(this.ctmEnd,this.ctm)?null:(this.ir.hasMotion=!0,this.ctmEnd.slice())}_concat(e){if(this.activeTransform===rC&&this.ctmEnd===null){this.ctm=GS(this.ctm,e);return}let t=this.ctmEnd??this.ctm;this.ctmEnd=this.activeTransform&nC?GS(t,e):t,this.activeTransform&tC&&(this.ctm=GS(this.ctm,e))}_setCTM(e){if(this.activeTransform===rC){this.ctm=e,this.ctmEnd=null;return}let t=this.ctmEnd??this.ctm;this.ctmEnd=this.activeTransform&nC?e:t,this.activeTransform&tC&&(this.ctm=e)}_pushGraphicsState(){this.attributeStack.push({ctm:this.ctm,ctmEnd:this.ctmEnd,activeTransform:this.activeTransform,material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation})}_popGraphicsState(){let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd,this.activeTransform=e.activeTransform,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation})}_peek(){return this.stream.peek()}_next(){return this.stream.next()}_expectNumber(e){let t=this._next();if(!t||t.type!==_S.NUMBER)throw Error(`PBRT parser: expected number for ${e}, got ${t?t.value:`EOF`}`);return t.value}_expectString(e){let t=this._next();if(!t||t.type!==_S.STRING)throw Error(`PBRT parser: expected string for ${e}, got ${t?t.value:`EOF`}`);return t.value}_readNumbers(e){let t=[];for(let n=0;n<e;n++)t.push(this._expectNumber(`matrix/transform`));return t}_readBracketedOrBareNumbers(e){if(this._peek()&&this._peek().type===_S.LBRACKET){this._next();let e=[];for(;this._peek()&&this._peek().type!==_S.RBRACKET;)e.push(this._expectNumber(`transform element`));return this._next(),e}return this._readNumbers(e)}_parseParams(){let e={};for(;this._peek()&&this._peek().type===_S.STRING;){let t=this._next().value.trim().split(/\s+/),n=t[0],r=t[1]===void 0?t[0]:t[1];e[r]={type:n,value:this._parseParamValue(n)}}return e}_parseParamValue(e){let t=this._peek()&&this._peek().type===_S.LBRACKET;t&&this._next();let n=()=>{let e=this._peek();return t?e&&e.type!==_S.RBRACKET:!1};if(!t)return[this._coerceValueToken(this._next())];if(this._peek()&&this._peek().type===_S.NUMBER){let t=[];for(;n()&&t.length<eC;){let e=this._next();if(e.type!==_S.NUMBER)return this._finishMixedValue(t,t.length,e);t.push(e.value)}if(!n())return this._next(),t;let r=new(oC[e]||Float64Array)(eC*4);r.set(t);let i=t.length;for(;n();){let e=this._next();if(e.type!==_S.NUMBER)return this._finishMixedValue(r,i,e);i===r.length&&(r=gS(r,r.length*2)),r[i++]=e.value}return this._next(),i===r.length?r:gS(r,i)}let r=[];for(;n();)r.push(this._coerceValueToken(this._next()));return this._next(),r}_finishMixedValue(e,t,n){let r=[];for(let n=0;n<t;n++)r.push(e[n]);for(r.push(this._coerceValueToken(n));this._peek()&&this._peek().type!==_S.RBRACKET;)r.push(this._coerceValueToken(this._next()));return this._next(),r}_coerceValueToken(e){if(!e)throw Error(`PBRT parser: unexpected EOF in parameter value`);if(e.type===_S.NUMBER||e.type===_S.STRING)return e.value;if(e.type===_S.WORD)return e.value===`true`?!0:e.value===`false`?!1:e.value;throw Error(`PBRT parser: unexpected token in parameter value: ${e.type}`)}async _run(e){let t=this.stream;this.stream=e;for(let e=this._next();e!==null;e=this._next()){if(e.type!==_S.WORD)throw Error(`PBRT parser: expected directive, got ${e.type} ${e.value??``}`);iC.has(e.value)&&this._effects++;let t=this._directive(e.value);t!==void 0&&await t}this.stream=t}_directive(e){switch(e){case`Identity`:this._setCTM(HS());break;case`Translate`:{let[e,t,n]=this._readNumbers(3);this._concat(KS(e,t,n));break}case`Scale`:{let[e,t,n]=this._readNumbers(3);this._concat(qS(e,t,n));break}case`Rotate`:{let[e,t,n,r]=this._readNumbers(4);this._concat(JS(e,t,n,r));break}case`LookAt`:{let e=this._readNumbers(9),t=QS([e[0],e[1],e[2]],[e[3],e[4],e[5]],[e[6],e[7],e[8]]);this._concat($S(t));break}case`Transform`:this._setCTM(this._readBracketedOrBareNumbers(16));break;case`ConcatTransform`:this._concat(this._readBracketedOrBareNumbers(16));break;case`CoordinateSystem`:this.coordSystems.set(this._expectString(`CoordinateSystem`),{ctm:this.ctm,ctmEnd:this.ctmEnd});break;case`CoordSysTransform`:{let e=this.coordSystems.get(this._expectString(`CoordSysTransform`));e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd);break}case`Camera`:{let e=this._expectString(`Camera type`),t=this._parseParams();this.ir.camera={type:e,params:t,cameraToWorld:$S(this.ctm)};let n=this._ctmEndSnapshot();n&&(this.ir.camera.cameraToWorldEnd=$S(n));break}case`Film`:{this._expectString(`Film type`);let e=this._parseParams();this.ir.film={xresolution:this._num(e.xresolution,1280),yresolution:this._num(e.yresolution,720),filename:this._str(e.filename,null)};break}case`Integrator`:case`Sampler`:case`PixelFilter`:case`Filter`:case`Accelerator`:case`ColorSpace`:case`Option`:this._skipTypeAndParams();break;case`WorldBegin`:this.ctm=HS(),this.ctmEnd=null,this.activeTransform=rC,this.state={material:null,areaLight:null,reverseOrientation:!1};break;case`WorldEnd`:break;case`AttributeBegin`:this._pushGraphicsState();break;case`AttributeEnd`:this._popGraphicsState();break;case`TransformBegin`:this.transformStack.push({ctm:this.ctm,ctmEnd:this.ctmEnd,activeTransform:this.activeTransform});break;case`TransformEnd`:{let e=this.transformStack.pop();e&&(this.ctm=e.ctm,this.ctmEnd=e.ctmEnd,this.activeTransform=e.activeTransform);break}case`ReverseOrientation`:this.state.reverseOrientation=!this.state.reverseOrientation;break;case`Attribute`:this._expectString(`Attribute target`),this._parseParams();break;case`ActiveTransform`:{let e=this._next()?.value;e===`StartTime`?this.activeTransform=tC:e===`EndTime`?this.activeTransform=nC:e===`All`?this.activeTransform=rC:this._warn(`ActiveTransform "${e}" not recognised`);break}case`TransformTimes`:{let[e,t]=this._readNumbers(2);this.ir.transformTimes={start:e,end:t};break}case`MediumInterface`:this._peek()&&this._peek().type===_S.STRING&&this._next(),this._peek()&&this._peek().type===_S.STRING&&this._next();break;case`MakeNamedMedium`:this._skipNamedAndParams();break;case`Material`:{let e=this._expectString(`Material type`),t=this._parseParams();this.state.material={type:e,params:t};break}case`MakeNamedMaterial`:{let e=this._expectString(`MakeNamedMaterial name`),t=this._parseParams(),n=this._str(t.type,`diffuse`);this.ir.namedMaterials.set(e,{type:n,params:t});break}case`NamedMaterial`:{let e=this._expectString(`NamedMaterial name`),t=this.ir.namedMaterials.get(e);this.state.material=t||{type:`diffuse`,params:{},_missingRef:e},t||this._warn(`NamedMaterial "${e}" referenced before definition`);break}case`Texture`:{let e=this._expectString(`Texture name`),t=this._expectString(`Texture data type`),n=this._expectString(`Texture class`),r=this._parseParams();this.ir.namedTextures.set(e,{dataType:t,class:n,params:r});break}case`AreaLightSource`:{let e=this._expectString(`AreaLightSource type`),t=this._parseParams();this.state.areaLight={type:e,params:t};break}case`LightSource`:{let e=this._expectString(`LightSource type`),t=this._parseParams();this.ctmEnd!==null&&!aC(this.ctmEnd,this.ctm)&&this._warnOnce(`animated-light`,`animated LightSource transforms are not supported — using the start transform`),this.ir.lights.push({type:e,params:t,ctm:this._ctmSnapshot()});break}case`Shape`:{let e={type:this._expectString(`Shape type`),params:this._parseParams(),ctm:this._ctmSnapshot(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation},t=this.currentObject===null?this._ctmEndSnapshot():null;t?e.ctmEnd=t:this.currentObject!==null&&this.ctmEnd!==null&&!aC(this.ctmEnd,this.ctm)&&this._warnOnce(`animated-template`,`animated transforms inside ObjectBegin are not supported — using the start transform`),this._emitShape(e);break}case`ObjectBegin`:{let e=this._expectString(`ObjectBegin name`);this._pushGraphicsState(),this.currentObject=e,this.objectBeginCTM=this.ctm.slice(),this.ir.objects.has(e)||this.ir.objects.set(e,[]);break}case`ObjectEnd`:this.currentObject=null,this.objectBeginCTM=null,this._popGraphicsState();break;case`ObjectInstance`:{let e=this._expectString(`ObjectInstance name`);this._addInstance(e);break}case`Include`:case`Import`:{let t=this._expectString(e);return this._include(t)}default:this._warnUnknown(e),this._parseParams();break}}_emitShape(e){this.currentObject===null?this.ir.shapes.push(e):(e.relativeCTM=GS($S(this.objectBeginCTM),e.ctm),this.ir.objects.get(this.currentObject).push(e))}async _include(e){let t=this.dirStack[this.dirStack.length-1],n=this._includeKey(e,t);if(n!==null&&this._placeRepeat(n,e))return;let r=await this.resolveInclude(e,t);if(r==null){this._warn(`Include target not found: ${e}`);return}let i=n===null?null:this._includeState(),a=e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`)):``;this.dirStack.push(a);try{await this._run(new VS(r))}finally{this.dirStack.pop(),this.releaseInclude?.(e,t,r)}i&&this._sameIncludeState(i)&&!this._includes.has(n)&&this._includes.set(n,{start:i.shapes,end:this.ir.shapes.length,ctm:i.ctm.slice(),template:null})}_includeKey(e,t){return!this.instanceIncludes||this.currentObject!==null||this.ctmEnd!==null||this.activeTransform!==rC||this.state.areaLight?null:`${t}\0${e}\0${this._stateId(this.state.material)}\0${this.state.reverseOrientation}`}_stateId(e){if(!e)return 0;let t=this._stateIds.get(e);return t===void 0&&this._stateIds.set(e,t=this._nextStateId++),t}_includeState(){return{shapes:this.ir.shapes.length,effects:this._effects,ctm:this.ctm,attributes:this.attributeStack.length,transforms:this.transformStack.length,material:this.state.material,reverseOrientation:this.state.reverseOrientation}}_sameIncludeState(e){return this._effects===e.effects&&this.ctmEnd===null&&this.activeTransform===rC&&aC(this.ctm,e.ctm)&&this.attributeStack.length===e.attributes&&this.transformStack.length===e.transforms&&this.state.material===e.material&&this.state.areaLight===null&&this.state.reverseOrientation===e.reverseOrientation}_placeRepeat(e,t){let n=this._includes.get(e);if(!n)return!1;if(n.template===null){let{start:r,end:i}=n;if(i===r||this.ir.instanceCount+2>this.maxPlacements)return!1;for(let t=r;t<i;t++)if(!this.ir.shapes[t])return this._includes.delete(e),!1;let a=`${t}#${this.ir.objects.size}`,o=$S(n.ctm),s=[],c=null,l=null;for(let e=r;e<i;e++){let t=this.ir.shapes[e];t.ctm!==c&&(l=GS(o,c=t.ctm)),t.relativeCTM=l,s.push(t),this.ir.shapes[e]=null}this.ir.objects.set(a,s),this._addInstance(a,n.ctm),n.template=a,this._movedShapes=!0}return this._addInstance(n.template),!0}_skipTypeAndParams(){this._peek()&&this._peek().type===_S.STRING&&this._next(),this._parseParams()}_skipNamedAndParams(){this._peek()&&this._peek().type===_S.STRING&&this._next(),this._parseParams()}_num(e,t){return e&&e.value.length?e.value[0]:t}_str(e,t){return e&&e.value.length?e.value[0]:t}_warn(e){this.ir.warnings.push(e)}_warnOnce(e,t){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(t))}_warnUnknown(e){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(`Unsupported directive ignored: ${e}`))}},cC={au:[1,.78,.34],gold:[1,.78,.34],cu:[.95,.64,.54],copper:[.95,.64,.54],ag:[.97,.96,.91],silver:[.97,.96,.91],al:[.91,.92,.92],aluminium:[.91,.92,.92],aluminum:[.91,.92,.92],mgo:[.9,.9,.9],tio2:[.9,.9,.9]},lC=[.92,.92,.92];function uC(e){let t=Math.max(1e3,Math.min(4e4,e))/100,n,r,i;t<=66?(n=255,r=99.47*Math.log(t)-161.12):(n=329.7*(t-60)**-.1332,r=288.12*(t-60)**-.0755),i=t>=66?255:t<=19?0:138.52*Math.log(t-10)-305.04;let a=e=>Math.max(0,Math.min(255,e))/255;return[a(n)**2.2,a(r)**2.2,a(i)**2.2]}function dC(e,t,n){let r=e[t];return r&&typeof r.value[0]==`number`?r.value[0]:n}function fC(e,t,n){let r=e[t];return r&&typeof r.value[0]==`string`?r.value[0]:n}async function pC(e,t,n,r=null){let i=e[t];if(!i)return{rgb:r,texture:null};if(i.type===`texture`){let e=i.value[0],t=await n.resolveNamedTexture(e);return t&&t.texture?{rgb:t.constant??null,texture:t.texture}:t&&t.constant?{rgb:t.constant,texture:null}:(n.warn(`texture "${e}" could not be resolved`),{rgb:r,texture:null})}if(i.type===`rgb`||i.type===`color`)return{rgb:[i.value[0],i.value[1],i.value[2]],texture:null};if(i.type===`float`){let e=i.value[0];return{rgb:[e,e,e],texture:null}}if(i.type===`blackbody`)return{rgb:uC(i.value[0]),texture:null};if(i.type===`spectrum`){if(typeof i.value[0]==`string`){let e=mC(i.value[0]);return e&&cC[e]?{rgb:cC[e].slice(),texture:null}:(n.warn(`named spectrum "${i.value[0]}" approximated to gray`),{rgb:[.5,.5,.5],texture:null})}let e=0,t=0;for(let n=1;n<i.value.length;n+=2)e+=i.value[n],t++;let r=t?e/t:.5;return{rgb:[r,r,r],texture:null}}return{rgb:r,texture:null}}function mC(e){let t=e.toLowerCase().match(/metal-([a-z]+)/);if(t)return t[1];for(let t of Object.keys(cC))if(e.toLowerCase().includes(t))return t;return null}function hC(e,t){if(e.roughness&&typeof e.roughness.value[0]==`number`)return e.roughness.value[0];let n=dC(e,`uroughness`,null),r=dC(e,`vroughness`,null);return n!==null&&r!==null?(n+r)/2:n===null?t:n}async function gC(e,t){let n=e?.type||`diffuse`,i=e?.params||{},a=new r.MeshPhysicalMaterial({side:r.DoubleSide,roughness:1,metalness:0}),o=e=>{e&&a.color.setRGB(e[0],e[1],e[2])},s=e=>{o(e.rgb),e.texture&&(a.map=e.texture,e.rgb||a.color.setRGB(1,1,1))};switch(n){case`diffuse`:s(await pC(i,`reflectance`,t,[.5,.5,.5])),a.roughness=1,a.metalness=0;break;case`conductor`:case`metal`:{let e=await pC(i,`reflectance`,t,null),n=i.eta,r=i.k,c=n&&n.type===`spectrum`&&typeof n.value[0]==`string`;if(e.rgb||e.texture)s(e);else if(n&&r&&!c){let e=(await pC(i,`eta`,t,[.2,.92,1.1])).rgb,n=(await pC(i,`k`,t,[3.9,2.45,2.14])).rgb,r=(e,t)=>((e-1)**2+t**2)/((e+1)**2+t**2);o([r(e[0],n[0]),r(e[1],n[1]),r(e[2],n[2])])}else o(n?(await pC(i,`eta`,t,lC)).rgb||lC:cC.cu);a.metalness=1,a.roughness=hC(i,.1);break}case`dielectric`:case`thindielectric`:a.transmission=1,a.metalness=0,a.color.setRGB(1,1,1),a.ior=dC(i,`eta`,1.5),a.roughness=hC(i,0),a.thickness=n===`thindielectric`?0:dC(i,`thickness`,0);break;case`coateddiffuse`:s(await pC(i,`reflectance`,t,[.5,.5,.5])),a.roughness=.6,a.metalness=0,a.clearcoat=1,a.clearcoatRoughness=hC(i,0);break;case`diffusetransmission`:{let e=await pC(i,`transmittance`,t,[.25,.25,.25]);s(await pC(i,`reflectance`,t,[.25,.25,.25])),a.transmission=e.rgb?(e.rgb[0]+e.rgb[1]+e.rgb[2])/3:.5,a.roughness=1,a.ior=1;break}case`interface`:case`none`:case``:a.transmission=1,a.ior=1,a.roughness=0,a.color.setRGB(1,1,1);break;case`mix`:{let e=i.materials?.value||[],n=Math.max(0,Math.min(1,dC(i,`amount`,.5))),o=e[0]?t.namedMaterials?.get(e[0]):null,s=e[1]?t.namedMaterials?.get(e[1]):null;if(o&&s){let[e,r]=await Promise.all([gC(o,t),gC(s,t)]),i=(e,t)=>e*(1-n)+t*n;a.color.lerpColors(e.color,r.color,n),a.roughness=i(e.roughness,r.roughness),a.metalness=i(e.metalness,r.metalness),a.ior=i(e.ior??1.5,r.ior??1.5),a.transmission=i(e.transmission??0,r.transmission??0),a.thickness=i(e.thickness??0,r.thickness??0),a.clearcoat=i(e.clearcoat??0,r.clearcoat??0),a.clearcoatRoughness=i(e.clearcoatRoughness??0,r.clearcoatRoughness??0),a.emissive.lerpColors(e.emissive,r.emissive,n),a.emissiveIntensity=i(e.emissiveIntensity??0,r.emissiveIntensity??0),a.map=(n<.5?e.map:r.map)||null;break}t.warn(`material "mix" — could not resolve inner materials [${e.join(`, `)}], falling back to diffuse`),a.color.set(new r.Color(.6,.6,.6));break}case`subsurface`:case`hair`:case`measured`:t.warn(`material "${n}" not supported — using diffuse approximation`),o((await pC(i,`reflectance`,t,[.5,.5,.5])).rgb),a.roughness=1;break;default:t.warn(`unknown material "${n}" — using neutral diffuse`),a.color.set(new r.Color(.6,.6,.6));break}return a.roughness=Math.max(0,Math.min(1,a.roughness)),a}function _C(e){return e===3?3/16:3/(8*e)}function vC(e){return 1/(e+3/(8*_C(e)))}function yC(e,t){let n=new Map,r=[],i=[],a=[],o=[],s=[],c=t.length/3;for(let l=0;l<c;l++)for(let c=0;c<3;c++){let u=t[l*3+c],d=t[l*3+(c+1)%3],f=t[l*3+(c+2)%3],p=u<d?u:d,m=u<d?d:u,h=p*e+m,g=n.get(h);g===void 0?(n.set(h,r.length),r.push(p),i.push(m),a.push(f),o.push(-1),s.push(1)):(o[g]<0&&(o[g]=f),s[g]++)}let l=Array.from({length:e},()=>[]),u=Array.from({length:e},()=>[]);for(let e=0;e<r.length;e++){let t=r[e],n=i[e];l[t].push(n),l[n].push(t),s[e]===1&&(u[t].push(n),u[n].push(t))}return{edgeIndex:n,edgeV0:r,edgeV1:i,edgeOpp0:a,edgeOpp1:o,edgeFaces:s,ring:l,boundaryRing:u}}function bC(e,t,n,r,i){let a=new Float64Array(e.length);for(let o=0;o<n;o++){let n=o*3,s=t.boundaryRing[o];if(s.length===2){let t=s[0]*3,r=s[1]*3,o=1-2*i;for(let s=0;s<3;s++)a[n+s]=o*e[n+s]+i*(e[t+s]+e[r+s]);continue}let c=t.ring[o],l=c.length;if(l===0||s.length>0){for(let t=0;t<3;t++)a[n+t]=e[n+t];continue}let u=r(l),d=0,f=0,p=0;for(let t=0;t<l;t++){let n=c[t]*3;d+=e[n],f+=e[n+1],p+=e[n+2]}let m=1-l*u;a[n]=m*e[n]+u*d,a[n+1]=m*e[n+1]+u*f,a[n+2]=m*e[n+2]+u*p}return a}function xC(e,t){let n=e.length/3,r=yC(n,t),i=r.edgeV0.length,a=bC(e,r,n,_C,1/8),o=new Float64Array((n+i)*3);o.set(a);for(let t=0;t<i;t++){let i=r.edgeV0[t]*3,a=r.edgeV1[t]*3,s=(n+t)*3,c=r.edgeOpp1[t];if(c<0)for(let t=0;t<3;t++)o[s+t]=.5*(e[i+t]+e[a+t]);else{let n=r.edgeOpp0[t]*3,l=c*3;for(let t=0;t<3;t++)o[s+t]=.375*(e[i+t]+e[a+t])+.125*(e[n+t]+e[l+t])}}let s=t.length/3,c=new Int32Array(s*12),l=(e,t)=>n+r.edgeIndex.get((e<t?e:t)*n+(e<t?t:e));for(let e=0;e<s;e++){let n=t[e*3],r=t[e*3+1],i=t[e*3+2],a=l(n,r),o=l(r,i),s=l(i,n),u=e*12;c[u]=n,c[u+1]=a,c[u+2]=s,c[u+3]=a,c[u+4]=r,c[u+5]=o,c[u+6]=s,c[u+7]=o,c[u+8]=i,c[u+9]=a,c[u+10]=o,c[u+11]=s}return{positions:o,indices:c}}function SC(e,t,n,r=2e6){let i=Float64Array.from(e),a=Int32Array.from(t),o=0;for(let e=0;e<n&&!(a.length/3*4>r);e++){let e=xC(i,a);i=e.positions,a=e.indices,o++}let s=i.length/3,c=bC(i,yC(s,a),s,vC,1/5);return{positions:Float32Array.from(c),indices:Uint32Array.from(a),levels:o}}function CC(e,t,n){let r=Math.abs(e),i=Math.abs(t),a=Math.sqrt(Math.max(0,1-Math.abs(n))),o=Math.max(r,i),s=o===0?0:Math.min(r,i)/o,c=2/Math.PI*Math.atan(s);r<i&&(c=1-c);let l=c*a,u=a-l;if(n<0){let e=u;u=1-l,l=1-e}return e<0&&(u=-u),t<0&&(l=-l),[.5*(u+1),.5*(l+1)]}var wC=(()=>{let e=new Float32Array(256);for(let t=0;t<256;t++){let n=t/255;e[t]=n<=.04045?n/12.92:((n+.055)/1.055)**2.4}return e})();function TC(e,t,n,r,i,a,o,s){let c=Math.min(Math.max(i*t-.5,0),t-1),l=Math.min(Math.max(a*n-.5,0),n-1),u=Math.floor(c),d=Math.floor(l),f=Math.min(u+1,t-1),p=Math.min(d+1,n-1),m=c-u,h=l-d,g=(d*t+u)*r,_=(d*t+f)*r,v=(p*t+u)*r,y=(p*t+f)*r;for(let t=0;t<3;t++){let n=s?s[e[g+t]]:e[g+t],r=s?s[e[_+t]]:e[_+t],i=s?s[e[v+t]]:e[v+t],a=s?s[e[y+t]]:e[y+t],c=n*(1-m)+r*m,l=i*(1-m)+a*m;o[t]=c*(1-h)+l*h}}function EC(e,t,n=1,r=0){let i=r||Math.min(e.width,4096),a=Math.max(1,i>>1),o=new Float32Array(i*a*4),s=t?$S(t):null,c=e.srgb?wC:null,l=[0,0,0];for(let t=0;t<a;t++){let r=(1-(t+.5)/a)*Math.PI,u=Math.sin(r),d=Math.cos(r);for(let r=0;r<i;r++){let a=((r+.5)/i-.5)*2*Math.PI,f=u*Math.cos(a),p=d,m=u*Math.sin(a);if(s){let e=s,t=e[0]*f+e[4]*p+e[8]*m,n=e[1]*f+e[5]*p+e[9]*m,r=e[2]*f+e[6]*p+e[10]*m,i=Math.hypot(t,n,r)||1;f=t/i,p=n/i,m=r/i}let[h,g]=CC(f,p,m);TC(e.data,e.width,e.height,e.channels,h,e.bottomUp?1-g:g,l,c);let _=(t*i+r)*4;o[_]=l[0]*n,o[_+1]=l[1]*n,o[_+2]=l[2]*n,o[_+3]=1}}return{data:o,width:i,height:a}}var DC=2;function OC(e,t){let n=e*e,r=n*e;t[0]=(1-3*e+3*n-r)/6,t[1]=(4-6*n+3*r)/6,t[2]=(1+3*e+3*n-3*r)/6,t[3]=r/6}function kC(e,t){let n=1-e;t[0]=n*n*n,t[1]=3*n*n*e,t[2]=3*n*e*e,t[3]=e*e*e}function AC(e){let t=Math.hypot(e[0],e[1],e[2]);return t>0&&(e[0]/=t,e[1]/=t,e[2]/=t),e}function jC(e,t,n){return n[0]=e[1]*t[2]-e[2]*t[1],n[1]=e[2]*t[0]-e[0]*t[2],n[2]=e[0]*t[1]-e[1]*t[0],n}function MC(e,t){let n=e.length/3;return t===`bspline`?n-3:Math.max(1,(n-1)/3)}function NC(e,t,n,r,i,a,o){let s=Math.floor(r);s>=n&&(s=n-1);let c=r-s;t===`bspline`?OC(c,i):kC(c,i);let l=t===`bspline`?s:s*3,u=0,d=0,f=0;for(let t=0;t<4;t++){let n=(l+t)*3;u+=i[t]*e[n],d+=i[t]*e[n+1],f+=i[t]*e[n+2]}a[o]=u,a[o+1]=d,a[o+2]=f}function PC(e,t,n){let r=MC(e,t);if(r<1)return null;let i=Math.max(1,Math.round(n*r)),a=new Float64Array((i+1)*3),o=[0,0,0,0];for(let n=0;n<=i;n++)NC(e,t,r,n/i*r,o,a,n*3);return{points:a,count:i+1,spans:r}}function FC(e,t,n,r,i){let a=e[t*3],o=e[t*3+1],s=e[t*3+2],c=n[r*3],l=n[r*3+1],u=n[r*3+2],d=n[i*3]-c,f=n[i*3+1]-l,p=n[i*3+2]-u,m=d*d+f*f+p*p,h=m>0?((a-c)*d+(o-l)*f+(s-u)*p)/m:0;return h=h<0?0:h>1?1:h,Math.hypot(a-c-h*d,o-l-h*f,s-u-h*p)}function IC(e,t,n,r,i,a){let{points:o,count:s,spans:c}=n;if(s<3)return null;let l=new Float64Array((s-1)*3),u=[0,0,0,0],d=s-1;for(let n=0;n<d;n++)NC(e,t,c,(n+.5)/d*c,u,l,n*3);let f=0;for(let e=0;e<d;e++)f=Math.max(f,FC(l,e,o,e,e+1));let p=e=>Math.max(f,r*.5*(i+(a-i)*(e/d))),m=(e,t)=>{for(let n=e+1;n<t;n++)if(FC(o,n,o,e,t)>p(n))return!1;for(let n=e;n<t;n++)if(FC(l,n,o,e,t)>p(n+.5))return!1;return!0},h=new Int32Array(s),g=0;h[g++]=0;for(let e=0;e<d;){let t=e+1;for(;t<d&&m(e,t+1);)t++;h[g++]=t,e=t}return g===s?null:h.subarray(0,g)}function LC(e){let{P:t,basis:n=`bezier`,width0:r=1,width1:i=1,N:a=null}=e,o=Math.max(1,Math.round(e.steps??DC)),s=Math.max(1,Math.round(e.sides??1));if(!t||t.length<12)return null;let c=PC(t,n,o);if(!c)return null;let{points:l,count:u}=c,d=e.tolerance>0?IC(t,n,c,e.tolerance,r,i):null,f=d?d.length:u,p=s>=3?s:s*2,m=new Float32Array(f*p*3),h=[0,0,0],g=[0,0,0],_=[0,0,0],v=[0,0,0],y=!1,b=0;for(let e=0;e<u;e++){let t=Math.max(0,e-1),n=Math.min(u-1,e+1);if(h[0]=l[n*3]-l[t*3],h[1]=l[n*3+1]-l[t*3+1],h[2]=l[n*3+2]-l[t*3+2],AC(h),y){let e=g[0]*h[0]+g[1]*h[1]+g[2]*h[2];g[0]-=e*h[0],g[1]-=e*h[1],g[2]-=e*h[2],Math.hypot(g[0],g[1],g[2])<1e-9&&jC(h,[0,1,0],g),AC(g)}else{if(a&&a.length>=3)g[0]=a[0],g[1]=a[1],g[2]=a[2],jC(h,g,v),g[0]=v[0],g[1]=v[1],g[2]=v[2];else{let e=Math.abs(h[0]),t=Math.abs(h[1]),n=Math.abs(h[2]);jC(h,e<t&&e<n?[1,0,0]:t<n?[0,1,0]:[0,0,1],g)}Math.hypot(g[0],g[1],g[2])<1e-9&&jC(h,[0,1,0],g),AC(g),y=!0}if(d&&d[b]!==e)continue;jC(h,g,_),AC(_);let o=e/(u-1||1),c=(r+(i-r)*o)*.5,f=l[e*3],x=l[e*3+1],S=l[e*3+2];for(let e=0;e<p;e++){let t,n,r;if(s>=3){let i=e/s*Math.PI*2,a=Math.cos(i),o=Math.sin(i);t=g[0]*a+_[0]*o,n=g[1]*a+_[1]*o,r=g[2]*a+_[2]*o}else{let i=e<2?g:_,a=e%2==0?-1:1;t=i[0]*a,n=i[1]*a,r=i[2]*a}let i=(b*p+e)*3;m[i]=f+t*c,m[i+1]=x+n*c,m[i+2]=S+r*c}b++}let x=s,S=new Uint32Array((f-1)*x*6),C=0;for(let e=0;e<f-1;e++)for(let t=0;t<x;t++){let n=s>=3?t:t*2,r=s>=3?(t+1)%s:t*2+1,i=e*p+n,a=e*p+r,o=(e+1)*p+r,c=(e+1)*p+n;S[C++]=i,S[C++]=a,S[C++]=o,S[C++]=i,S[C++]=o,S[C++]=c}return{positions:m,indices:C===S.length?S:gS(S,C)}}var RC=[1,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,1],zC=4096;function BC(e){return e instanceof Uint32Array?new r.Uint32BufferAttribute(e,1):ArrayBuffer.isView(e)&&e.BYTES_PER_ELEMENT===4?new r.Uint32BufferAttribute(new Uint32Array(e.buffer,e.byteOffset,e.length),1):new r.Uint32BufferAttribute(Uint32Array.from(e),1)}function VC(e,t){if(t<=e.length)return e;let n=e.length||1;for(;n<t;)n*=2;return gS(e,n)}function HC(e){return e instanceof Float32Array?e:Float32Array.from(e)}var UC=1e3,WC=45e6,GC=6e6,KC=6e7,qC=8e6,JC=256,YC=4096,XC=5e5,ZC=2,QC={flat:1,ribbon:1,cylinder:2},$C=.05;function ew(e,t){if(e.count!==t.count)return!1;for(let n=0,r=e.count*16;n<r;n++)if(e.matrices[n]!==t.matrices[n])return!1;return!0}function tw(e,t){let n=Math.min(e.width,zC),r=null;if(typeof OffscreenCanvas<`u`)r=new OffscreenCanvas(n,n);else if(typeof document<`u`)r=document.createElement(`canvas`),r.width=r.height=n;else return null;try{let i=r.getContext(`2d`,{willReadFrequently:!0});if(!i)return null;i.drawImage(e,0,0,n,n);let{data:a}=i.getImageData(0,0,n,n);return{data:a,width:n,height:n,channels:4,bottomUp:!1,srgb:t}}catch{return null}}function nw(e){let t=[e],n=e,r=[e=>e.replace(/-renamed-\d+$/,``),e=>e.replace(/\d+$/,``),e=>e.replace(/_Color$/i,``),e=>e.replace(/\d+$/,``)];for(let e of r){let r=e(n);r!==n&&r&&t.push(n=r)}return t}var rw=class{constructor(e={}){this.maxTriangles=e.maxTriangles??WC,this.maxPlacements=e.maxPlacements??GC,this.mergeShapesAbove=e.mergeShapesAbove??JC,this.curveSteps=e.curveSteps??ZC,this.curveSides=e.curveSides??null,this.curveTolerance=e.curveTolerance??$C,this.resolvePLY=e.resolvePLY||(async()=>null),this.resolveImage=e.resolveImage||(async()=>null),this.resolveEnvironment=e.resolveEnvironment||e.resolveImage||(async()=>null),this.convertHandedness=e.convertHandedness===!0,this.warnings=[],this.report=[],this._materialCache=new Map,this._textureCache=new Map,this._geometryCache=new Map,this._materialBySignature=new Map,this._noUVMaterials=new Map,this._plyCache=new Map}warn(e){this.warnings.push(e)}async build(e){this.ir=e,this._keepShapes=new Set;for(let{name:t}of e.animatedInstances??[])for(let n of e.objects.get(t)??[])this._keepShapes.add(n);this._recoveredColors=0,this.reportedMeshes=0,this.triangleCount=0,this.placementCount=0,this.skippedForBudget=0,this._countedGeometries=new WeakSet;let t=new r.Group;t.name=`PBRTScene`,this._batches=e.shapes.length>=this.mergeShapesAbove?new Map:null,this._mergedBatches=0,this.mergedShapes=0,this.droppedNoTemplate=0,this._animated=[];for(let n=0;n<e.shapes.length;n++){if(this._overBudget()){this.skippedForBudget+=e.shapes.length-n;break}let r=e.shapes[n],[i,a]=await Promise.all([this._batches?this._createGeometry(r):this._buildGeometry(r),this._getMaterial(r)]);if(!i)continue;if(this._batches&&!r.motion&&i.getAttribute(`position`).count<=YC){this._mergeShape(r,i,a,t),e.shapes[n]=null;continue}let o=this._meshFromGeometry(r,i,a,r.ctm,`shape_${n}`);o&&(t.add(o),r.motion&&this._animate(o,r.motion))}if(this._batches){for(let e of this._batches.values())this._flushBatch(e[0],t),this._flushBatch(e[1],t);this._batches=null}await this._buildInstances(e,t),await this._buildAnimatedPlacements(e,t),this.skippedForBudget>0&&this.warn(`stopped at ${this.triangleCount.toLocaleString()} stored triangles (budget ${this.maxTriangles.toLocaleString()}) and ${this.placementCount.toLocaleString()} placements (budget ${this.maxPlacements.toLocaleString()}); ${this.skippedForBudget.toLocaleString()} placement(s) skipped`);let n=null;e.camera&&(n=this._buildCamera(e.camera,e.film),n&&t.add(n));let i=e.animation?this._buildClip(e,n):[],a=await this._buildEnvironment(e.lights);return this._reportUnsupportedLights(e.lights),this._recoveredColors>0&&this.warn(`${this._recoveredColors} unreadable texture(s) fell back to the like-named material's colour`),{group:t,camera:n,environment:a,animations:i,report:this.report,meshCount:this.reportedMeshes,triangleCount:this.triangleCount,placementCount:this.placementCount,mergedShapes:this.mergedShapes,droppedNoTemplate:this.droppedNoTemplate,skippedForBudget:this.skippedForBudget,warnings:this.warnings.concat(e.warnings||[])}}_overBudget(){return this.triangleCount>=this.maxTriangles||this.placementCount>=this.maxPlacements}_accountGeometry(e){let t=e.index?e.index.count/3:e.getAttribute(`position`).count/3;return this._countedGeometries.has(e)||(this._countedGeometries.add(e),this.triangleCount+=t),t}async _buildInstances(e,t){let n=0;e.skippedInstances>0&&(this.skippedForBudget+=e.skippedInstances);let i=new Float64Array(16),a=new r.Matrix4,o=(e,o,s,c,l,u,d)=>{let f=Math.max(0,this.maxPlacements-this.placementCount),p=Math.min(e.count,f);if(p<e.count&&(this.skippedForBudget+=e.count-p),p===0)return;let m=new r.InstancedMesh(o,s,p);m.name=`instance_${n++}`,m.frustumCulled=!1;for(let t=0;t<p;t++){if(c)WS(i,e.matrices,t*16,c);else for(let n=0;n<16;n++)i[n]=e.matrices[t*16+n];m.setMatrixAt(t,a.fromArray(this.convertHandedness?GS(RC,i):i))}m.instanceMatrix.needsUpdate=!0,t.add(m),this.placementCount+=p,this.reportedMeshes+=p,this.report.length<UC&&this.report.push({mesh:`${m.name} ×${p}`,shape:l,material:u,color:`#`+s.color.getHexString(),map:s.map?`yes`:`-`,uv:o.getAttribute(`uv`)?`yes`:`NO`,normals:o.getAttribute(`normal`)?`yes`:`NO`,emissive:s.emissiveIntensity>0?`#${s.emissive.getHexString()}×${s.emissiveIntensity}`:`-`,size:`instanced`,tris:d})},s=(e,t)=>{t&&t.triangles>0&&o(e,this._batchGeometry(t),t.material,null,`merged`,`-`,t.triangles)};for(let{name:t,list:n,template:r}of this._samePlacementGroups(e)){if(!r){this.droppedNoTemplate+=n.count,this.warn(`ObjectInstance "${t}" has no template — ${n.count.toLocaleString()} placement(s) dropped`);continue}let e=0;for(let t of r)t.type!==`plymesh`&&e++;let i=e>=2?new Map:null;for(let e of r){if(this._overBudget()){this.skippedForBudget+=n.count;continue}let[r,a]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);if(!r)continue;if(i&&e.type!==`plymesh`&&r.getAttribute(`position`).count<=YC){this._geometryCache.delete(e);let t=this._appendToBatch(i,e,r,a,e.relativeCTM||e.ctm);this._releaseMerged(e,r),s(n,t);continue}let c=this._accountGeometry(r);o(n,r,this._materialForGeometry(e,r,a,`instances_${t}`),e.relativeCTM||e.ctm,e.type,e.material?.type||`diffuse`,c)}if(i)for(let e of i.values())s(n,e[0]),s(n,e[1]);hS(n.matrices),hS(n.matricesEnd)}}_samePlacementGroups(e){let t=[],n=new Map;for(let[r,i]of e.instances){let a=e.objects.get(r);if(!a||i.matricesEnd){t.push({name:r,list:i,template:a});continue}let o=`${i.count}:${Array.prototype.join.call(i.matrices.subarray(0,16),`,`)}`,s=n.get(o);s||n.set(o,s=[]);let c=s.find(e=>ew(e.list,i));if(c){c.template===e.objects.get(c.name)&&(c.template=c.template.slice());for(let e of a)c.template.push(e);hS(i.matrices);continue}let l={name:r,list:i,template:a};s.push(l),t.push(l)}return t}async _buildAnimatedPlacements(e,t){let n=e.animatedInstances??[];for(let i=0;i<n.length;i++){let{name:a,motion:o}=n[i],s=e.objects.get(a);if(!s){this.droppedNoTemplate++;continue}if(this._overBudget()){this.skippedForBudget+=n.length-i;break}let c=new r.Group;c.name=`placement_${i}`;let l=Array.from(o.matrices.subarray(0,16));new r.Matrix4().fromArray(this.convertHandedness?GS(RC,l):l).decompose(c.position,c.quaternion,c.scale);for(let e=0;e<s.length;e++){let t=s[e],[n,r]=await Promise.all([this._buildGeometry(t),this._getMaterial(t)]);if(!n)continue;let i=this._meshFromGeometry(t,n,r,t.relativeCTM||t.ctm,`${c.name}_${e}`,!0);i&&c.add(i)}c.children.length!==0&&(t.add(c),this._animate(c,o))}}_animate(e,t){t.visible&&(e.visible=t.visible[0]===1),this._animated.push({node:e,motion:t})}_buildClip(e,t){let n=[];for(let{node:e,motion:t}of this._animated)if(this._transformTracks(n,e.name,t,(e,t)=>{let n=Array.from(e.subarray(t,t+16));return this.convertHandedness?GS(RC,n):n}),t.visible){let i=t.times,a=i.map((e,t)=>t===0?0:(i[t-1]+e)/2);n.push(new r.BooleanKeyframeTrack(`${e.name}.visible`,a,Array.from(t.visible,e=>e===1)))}let i=e.camera?.motion;if(t&&i){let e=new r.PerspectiveCamera;if(this._transformTracks(n,t.name,i,(t,n)=>(this._poseCamera(e,t.subarray(n,n+16)),e.updateMatrix(),e.matrix.elements)),i.fov&&t.isPerspectiveCamera){let e=Array.from(i.fov,e=>this._verticalFov({fov:{type:`float`,value:[e]}},t.aspect));n.push(new r.NumberKeyframeTrack(`${t.name}.fov`,i.times.slice(),e))}}for(let e of n)e.optimize();return n.length===0?[]:[new r.AnimationClip(e.animation.name,e.animation.duration,n)]}_transformTracks(e,t,n,i){let a=n.times.length,o=new Float32Array(a*3),s=new Float32Array(a*4),c=new Float32Array(a*3),l=new r.Matrix4,u=new r.Vector3,d=new r.Quaternion,f=new r.Vector3;for(let e=0;e<a;e++)l.fromArray(i(n.matrices,e*16)).decompose(u,d,f),e>0&&d.x*s[e*4-4]+d.y*s[e*4-3]+d.z*s[e*4-2]+d.w*s[e*4-1]<0&&d.set(-d.x,-d.y,-d.z,-d.w),u.toArray(o,e*3),d.toArray(s,e*4),f.toArray(c,e*3);let p=(e,t)=>{for(let n=t;n<e.length;n++)if(e[n]!==e[n%t])return!0;return!1};p(o,3)&&e.push(new r.VectorKeyframeTrack(`${t}.position`,n.times.slice(),o)),p(s,4)&&e.push(new r.QuaternionKeyframeTrack(`${t}.quaternion`,n.times.slice(),s)),p(c,3)&&e.push(new r.VectorKeyframeTrack(`${t}.scale`,n.times.slice(),c))}async _buildShapeMesh(e,t,n){let[r,i]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);return r?this._meshFromGeometry(e,r,i,t,n):null}_meshFromGeometry(e,t,n,i,a,o=!1){let s=!!t.getAttribute(`uv`),c=this._materialForGeometry(e,t,n,a),l=new r.Mesh(t,c);l.name=a;let u=this.convertHandedness&&!o?GS(RC,i):i;new r.Matrix4().fromArray(u).decompose(l.position,l.quaternion,l.scale),l.updateMatrix(),t.boundingBox||t.computeBoundingBox();let d=t.boundingBox?t.boundingBox.clone().applyMatrix4(l.matrix).getSize(new r.Vector3):new r.Vector3,f=this._accountGeometry(t);return this.placementCount++,this.reportedMeshes++,this.report.length<UC&&this.report.push({mesh:a,shape:e.type,material:e.material?.type||`diffuse`,color:`#`+c.color.getHexString(),map:c.map?`yes`:`-`,uv:s?`yes`:`NO`,normals:t.getAttribute(`normal`)?`yes`:`NO`,emissive:c.emissiveIntensity>0?`#${c.emissive.getHexString()}×${c.emissiveIntensity}`:`-`,size:`${d.x.toFixed(2)}×${d.y.toFixed(2)}×${d.z.toFixed(2)}`,tris:f}),l}_materialForGeometry(e,t,n,r){if(!n.map||t.getAttribute(`uv`))return n;let i=this._noUVMaterials.get(n);return i||(this.warn(`${r} (${e.type}, "${e.material?.type||`diffuse`}") has a texture map but no UVs — dropping map, using base color`),i=n.clone(),i.map=null,this._noUVMaterials.set(n,i)),i}_mergeShape(e,t,n,r){this.reportedMeshes++;let i=this.convertHandedness?GS(RC,e.ctm):e.ctm,a=this._appendToBatch(this._batches,e,t,n,i);this._releaseMerged(e,t),a&&this._flushBatch(a,r)}_releaseMerged(e,t){if(!this._keepShapes?.has(e)){for(let e in t.attributes)hS(t.attributes[e].array);hS(t.index?.array);for(let t in e.params)ArrayBuffer.isView(e.params[t]?.value)&&hS(e.params[t].value)}}_appendToBatch(e,t,n,r,i){let a=this._materialForGeometry(t,n,r,`merged shape`),o=n.getAttribute(`position`),s=n.getAttribute(`normal`),c=n.getAttribute(`uv`),l=n.index,u=o.count;this.triangleCount+=(l?l.count:u)/3,this.mergedShapes++;let d=e.get(a);d||e.set(a,d=[null,null]);let f=+!!c,p=d[f];p||(d[f]=p={material:a,positions:new Float32Array(3072),normals:new Float32Array(3072),uvs:c?new Float32Array(2048):null,indices:new Uint32Array(3072),vertexCount:0,indexCount:0,triangles:0});let m=i,h=$S(m),g=p.vertexCount;p.positions=VC(p.positions,(g+u)*3),p.normals=VC(p.normals,(g+u)*3),c&&(p.uvs=VC(p.uvs,(g+u)*2));let _=o.array,v=p.positions,y=s?s.array:null,b=p.normals;for(let e=0;e<u;e++){let t=e*3,n=(g+e)*3,r=_[t],i=_[t+1],a=_[t+2];if(v[n]=m[0]*r+m[4]*i+m[8]*a+m[12],v[n+1]=m[1]*r+m[5]*i+m[9]*a+m[13],v[n+2]=m[2]*r+m[6]*i+m[10]*a+m[14],!y)continue;let o=y[t],s=y[t+1],c=y[t+2],l=h[0]*o+h[1]*s+h[2]*c,u=h[4]*o+h[5]*s+h[6]*c,d=h[8]*o+h[9]*s+h[10]*c,f=Math.hypot(l,u,d);f>0&&(l/=f,u/=f,d/=f),b[n]=l,b[n+1]=u,b[n+2]=d}c&&p.uvs.set(c.array.subarray(0,u*2),g*2);let x=l?l.count:u;p.indices=VC(p.indices,p.indexCount+x);let S=p.indices,C=l?l.array:null;for(let e=0;e<x;e++)S[p.indexCount+e]=g+(C?C[e]:e);return p.vertexCount+=u,p.indexCount+=x,p.triangles+=x/3,p.triangles>=XC?(d[f]=null,p):null}_batchGeometry(e){let t=new r.BufferGeometry;return t.setAttribute(`position`,new r.Float32BufferAttribute(gS(e.positions,e.vertexCount*3),3)),t.setAttribute(`normal`,new r.Float32BufferAttribute(gS(e.normals,e.vertexCount*3),3)),e.uvs&&t.setAttribute(`uv`,new r.Float32BufferAttribute(gS(e.uvs,e.vertexCount*2),2)),t.setIndex(new r.Uint32BufferAttribute(gS(e.indices,e.indexCount),1)),e.positions=e.normals=e.uvs=e.indices=null,t}_flushBatch(e,t){if(!e||e.triangles===0)return;let n=new r.Mesh(this._batchGeometry(e),e.material);n.name=`merged_${this._mergedBatches++}`,n.frustumCulled=!1,t.add(n),this.placementCount++,this.report.length<UC&&this.report.push({mesh:n.name,shape:`merged`,material:`-`,color:`#`+e.material.color.getHexString(),map:e.material.map?`yes`:`-`,uv:e.uvs?`yes`:`NO`,normals:`yes`,emissive:e.material.emissiveIntensity>0?`#${e.material.emissive.getHexString()}×${e.material.emissiveIntensity}`:`-`,size:`merged`,tris:e.triangles})}_buildGeometry(e){let t=this._geometryCache.get(e);return t||this._geometryCache.set(e,t=this._createGeometry(e)),t}async _createGeometry(e){switch(e.type){case`trianglemesh`:return this._triangleMesh(e.params);case`bilinearmesh`:return this._bilinearMesh(e.params);case`loopsubdiv`:return this._loopSubdiv(e.params);case`curve`:return this._curve(e.params);case`plymesh`:return this._plyMesh(e.params);case`sphere`:return this._sphere(e.params);case`disk`:return this._disk(e.params);default:return this.warn(`shape "${e.type}" not supported — skipped`),null}}_triangleMesh(e){let t=e.P?.value;if(!t||t.length<9)return this.warn(`trianglemesh missing P`),null;let n=new r.BufferGeometry;n.setAttribute(`position`,new r.Float32BufferAttribute(HC(t),3));let i=e.N?.value;i&&i.length===t.length&&n.setAttribute(`normal`,new r.Float32BufferAttribute(HC(i),3));let a=(e.uv||e.st)?.value;a&&a.length===t.length/3*2&&n.setAttribute(`uv`,new r.Float32BufferAttribute(HC(a),2));let o=e.indices?.value;return o&&o.length&&n.setIndex(BC(o)),i||n.computeVertexNormals(),n}_curve(e){let t=e.P?.value;if(!t||t.length<12)return this.warn(`curve needs at least 4 control points`),null;let n=Math.round(dC(e,`degree`,3));if(n!==3)return this.warn(`curve degree ${n} not supported — only cubic`),null;let i=fC(e,`type`,`flat`),a=dC(e,`width`,1),o=LC({P:t,basis:fC(e,`basis`,`bezier`),width0:dC(e,`width0`,a),width1:dC(e,`width1`,a),N:e.N?.value||null,steps:this.curveSteps,sides:this.curveSides??QC[i]??1,tolerance:this.curveTolerance});if(!o)return this.warn(`curve could not be tessellated`),null;let s=new r.BufferGeometry;return s.setAttribute(`position`,new r.Float32BufferAttribute(o.positions,3)),s.setIndex(new r.Uint32BufferAttribute(o.indices,1)),s.computeVertexNormals(),s}_loopSubdiv(e){let t=e.P?.value,n=e.indices?.value;if(!t||t.length<9||!n||n.length<3)return this.warn(`loopsubdiv missing P/indices`),null;let i=Math.max(0,Math.min(6,Math.round(dC(e,`levels`,3)))),{positions:a,indices:o,levels:s}=SC(t,n,i);s<i&&this.warn(`loopsubdiv refined ${s}/${i} levels — the control mesh is too dense for the triangle budget`);let c=new r.BufferGeometry;return c.setAttribute(`position`,new r.Float32BufferAttribute(a,3)),c.setIndex(new r.Uint32BufferAttribute(o,1)),c.computeVertexNormals(),c}_bilinearMesh(e){let t=e.P?.value,n=e.indices?.value;if(!t||!n)return this.warn(`bilinearmesh missing P/indices`),null;let i=[];for(let e=0;e+3<n.length;e+=4){let[t,r,a,o]=[n[e],n[e+1],n[e+2],n[e+3]];i.push(t,r,a,t,a,o)}let a=new r.BufferGeometry;return a.setAttribute(`position`,new r.Float32BufferAttribute(Float32Array.from(t),3)),a.setIndex(i),a.computeVertexNormals(),a}_plyMesh(e){let t=fC(e,`filename`,null);if(!t)return this.warn(`plymesh missing filename`),null;let n=this._plyCache.get(t);return n||this._plyCache.set(t,n=this._decodePly(t)),n}async _decodePly(e){try{let t=await this.resolvePLY(e);return t?(t.getAttribute(`normal`)||t.computeVertexNormals(),t):(this.warn(`plymesh file not found: ${e}`),null)}catch(t){return this.warn(`failed to load plymesh ${e}: ${t.message}`),null}}_sphere(e){return new r.SphereGeometry(dC(e,`radius`,1),48,32)}_disk(e){let t=dC(e,`radius`,1),n=dC(e,`innerradius`,0),i=dC(e,`height`,0),a=[],o=[];for(let e=0;e<48;e++){let r=e/48*Math.PI*2,s=(e+1)/48*Math.PI*2,c=a.length/3;a.push(Math.cos(r)*n,Math.sin(r)*n,i),a.push(Math.cos(r)*t,Math.sin(r)*t,i),a.push(Math.cos(s)*t,Math.sin(s)*t,i),a.push(Math.cos(s)*n,Math.sin(s)*n,i),o.push(c,c+1,c+2,c,c+2,c+3)}let s=new r.BufferGeometry;return s.setAttribute(`position`,new r.Float32BufferAttribute(Float32Array.from(a),3)),s.setIndex(o),s.computeVertexNormals(),s}async _getMaterial(e){let t=this._materialCache.get(e.material);if(t||(t=new Map,this._materialCache.set(e.material,t)),t.has(e.areaLight))return t.get(e.areaLight);let n={resolveNamedTexture:e=>this._resolveNamedTexture(e),namedMaterials:this.ir.namedMaterials,warn:e=>this.warn(e)},r=await gC(e.material,n);e.areaLight&&await this._applyAreaLight(r,e.areaLight,n);let i=this._dedupeMaterial(r);return t.set(e.areaLight,i),i}_dedupeMaterial(e){let t=e.color,n=e.emissive,r=`${t.r},${t.g},${t.b}|${n.r},${n.g},${n.b}|${e.emissiveIntensity}|${e.map?e.map.uuid:`-`}|${e.roughness}|${e.metalness}|${e.transmission}|${e.ior}|${e.thickness}|${e.clearcoat}|${e.clearcoatRoughness}|${e.opacity}|${e.side}`;return this._materialBySignature.get(r)||(this._materialBySignature.set(r,e),e)}async _applyAreaLight(e,t,n){let r=await pC(t.params,`L`,n,[1,1,1]),i=dC(t.params,`scale`,1),a=r.rgb||[1,1,1];e.emissive.setRGB(a[0],a[1],a[2]),e.emissiveIntensity=i}async _resolveNamedTexture(e){if(this._textureCache.has(e))return this._textureCache.get(e);let t=this.ir.namedTextures.get(e),n=null;if(!t)this.warn(`named texture "${e}" not defined`);else if(t.class===`imagemap`){let r=fC(t.params,`filename`,null);if(r)try{let t=await this.resolveImage(r);t?n={texture:t}:this.warn(`image not found for texture "${e}": ${r}`)}catch(t){this.warn(`failed to load texture "${e}" (${r}): ${t.message}`)}}else if(t.class===`constant`){let e=t.params.value;e&&e.type===`rgb`?n={constant:[e.value[0],e.value[1],e.value[2]]}:e&&(n={constant:[e.value[0],e.value[0],e.value[0]]})}else if(t.class===`scale`)n=await this._resolveScaleTexture(e,t);else{let r=this._colorFromLikeNamedMaterial(e);r?(n={constant:r.rgb},this._recoveredColors++):this.warn(`texture class "${t.class}" not supported (texture "${e}")`)}return this._textureCache.set(e,n),n}_colorFromLikeNamedMaterial(e){for(let t of nw(e)){let e=(this.ir?.namedMaterials?.get(t))?.params?.reflectance;if(e&&(e.type===`rgb`||e.type===`color`))return{name:t,rgb:[e.value[0],e.value[1],e.value[2]]}}return null}async _resolveScaleTexture(e,t){let n=t.params.tex,r=null;if(n?.type===`texture`&&typeof n.value[0]==`string`)r=await this._resolveNamedTexture(n.value[0]);else if(n?.type===`rgb`||n?.type===`color`)r={constant:[n.value[0],n.value[1],n.value[2]]};else if(n?.type===`float`){let e=n.value[0];r={constant:[e,e,e]}}let i=t.params.scale,a=[1,1,1];if(i?.type===`rgb`||i?.type===`color`)a=[i.value[0],i.value[1],i.value[2]];else if(i?.type===`float`){let e=i.value[0];a=[e,e,e]}if(r?.texture){let e=r.constant||[1,1,1];return{texture:r.texture,constant:[e[0]*a[0],e[1]*a[1],e[2]*a[2]]}}let o=r?.constant||[1,1,1];return{constant:[o[0]*a[0],o[1]*a[1],o[2]*a[2]]}}_buildCamera(e,t){let n=t&&t.yresolution?t.xresolution/t.yresolution:16/9,i;if(e.type===`orthographic`){let t=e.params?.screenwindow?.value,a=t?.length===4?(t[3]-t[2])/2:Math.max(1,1/n);i=new r.OrthographicCamera(-a*n,a*n,a,-a,.01,1e4)}else i=new r.PerspectiveCamera(this._verticalFov(e.params,n),n,.01,1e4);return i.name=`PBRT Camera`,this._poseCamera(i,e.cameraToWorld),i.updateMatrixWorld(!0),i}_poseCamera(e,t){let n=t,i=new r.Vector3(n[12],n[13],n[14]),a=new r.Vector3(n[8],n[9],n[10]),o=new r.Vector3(n[4],n[5],n[6]);this.convertHandedness&&(i.z*=-1,a.z*=-1,o.z*=-1),e.up.copy(o.normalize()),e.position.copy(i),e.scale.set(1,1,1),e.lookAt(i.clone().add(a)),US(t)>0!==this.convertHandedness&&(e.scale.x=-1)}_verticalFov(e,t){let n=dC(e,`fov`,90);if(t>=1)return n;let r=n*Math.PI/180;return 2*Math.atan(Math.tan(r/2)/t)*180/Math.PI}_equirectFromInfiniteLight(e,t,n,i){let a=e.image;if(!a?.width||a.width!==a.height)return a?.width!==a?.height&&this.warn(`infinite-light image "${i}" is ${a?.width}x${a?.height}, not square — read as equirectangular, but pbrt would read it as equal-area octahedral`),null;let o=null;if(a.data){let e=a.data.length/(a.width*a.height);if(!Number.isInteger(e)||e<3)return null;o={data:a.data,width:a.width,height:a.height,channels:e,bottomUp:!0}}else if(o=tw(a,e.colorSpace===r.SRGBColorSpace),!o)return this.warn(`infinite-light image "${i}" could not be read back for octahedral conversion`),null;let{data:s,width:c,height:l}=EC(o,t.ctm,n),u=new r.DataTexture(s,c,l,r.RGBAFormat,r.FloatType);return u.mapping=r.EquirectangularReflectionMapping,u.minFilter=r.LinearFilter,u.magFilter=r.LinearFilter,u.needsUpdate=!0,u}async _buildEnvironment(e){let t=e.find(e=>e.type===`infinite`);if(!t)return null;let n=dC(t.params,`scale`,1),i=fC(t.params,`filename`,null);if(i)try{let e=await this.resolveEnvironment(i);if(e){let a=this._equirectFromInfiniteLight(e,t,n,i);return a?{texture:a}:(e.mapping=r.EquirectangularReflectionMapping,{texture:e})}this.warn(`infinite-light image not found: ${i}`)}catch(e){this.warn(`failed to load infinite-light image ${i}: ${e.message}`)}let a=((await pC(t.params,`L`,{resolveNamedTexture:async()=>null,warn:e=>this.warn(e)},[1,1,1])).rgb||[1,1,1]).map(e=>e*n),o=new Float32Array(8);for(let e=0;e<2;e++)o[e*4+0]=a[0],o[e*4+1]=a[1],o[e*4+2]=a[2],o[e*4+3]=1;let s=new r.DataTexture(o,2,1,r.RGBAFormat,r.FloatType);return s.mapping=r.EquirectangularReflectionMapping,s.minFilter=r.LinearFilter,s.magFilter=r.LinearFilter,s.needsUpdate=!0,{texture:s}}_reportUnsupportedLights(e){for(let t of e)t.type!==`infinite`&&this.warn(`light "${t.type}" not supported (only infinite lights and emissive area lights are mapped)`)}},iw=1e3,aw=2048,ow=1e5;function sw(e){let t=e[0],n=e=>{let t=e.lastIndexOf(`/`),n=/^(.*?)(\d+)\.pbrt$/i.exec(e.slice(t+1));return n?{group:e.slice(0,t+1)+`\0`+n[1].toLowerCase(),number:parseInt(n[2],10)}:null},r=t?n(t):null;if(!r)return null;let i=new Map;for(let t of e){let e=n(t);e&&e.group===r.group&&!i.has(e.number)&&i.set(e.number,t)}return i.size<2?null:[...i].sort((e,t)=>e[0]-t[0]).slice(0,iw).map(([e,t])=>({path:t,number:e}))}function cw(e){let t=e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint32Array?new Uint32Array(e.buffer,e.byteOffset,e.length):null;t||=new Uint32Array(Float32Array.from(e).buffer);let n=2166136261;for(let e=0;e<t.length;e++)n=Math.imul(n^t[e],16777619),n^=n>>>15;return(n>>>0).toString(36)+`:`+e.length}function lw(e){let t=``;for(let n of Object.keys(e).sort()){let{type:r,value:i}=e[n],a=ArrayBuffer.isView(i)||i.length>16&&typeof i[0]==`number`;t+=`${r} ${n}=${a?`#`+cw(i):i.join(`,`)};`}return t}var uw=class{constructor(e){this.materialNames=new Map;for(let[t,n]of e.namedMaterials)this.materialNames.set(n,t);this.cache=new Map}of(e){return`${e.type}|${+!!e.reverseOrientation}|${lw(e.params)}|${this._material(e.material)}|${this._light(e.areaLight)}`}_material(e){if(!e)return`-`;let t=this.cache.get(e);if(t===void 0){let n=this.materialNames.get(e)??e._missingRef;t=n===void 0?`I:`+e.type+`:`+lw(e.params):`N:`+n,this.cache.set(e,t)}return t}_light(e){if(!e)return`-`;let t=this.cache.get(e);return t===void 0&&this.cache.set(e,t=`L:`+e.type+`:`+lw(e.params)),t}};function dw(e,t){let n=new Int32Array(t.length).fill(-1),r=0;for(;r<e.length&&r<t.length&&e[r]===t[r];)n[r]=r,r++;let i=e.length,a=t.length;for(;i>r&&a>r&&e[i-1]===t[a-1];)n[--a]=--i;return r<i&&r<a&&!fw(e,r,i,t,r,a,n)&&mw(e,r,i,t,r,a,n),n}function fw(e,t,n,r,i,a,o){let s=n-t,c=a-i,l=Math.min(s+c,aw),u=l+1,d=new Int32Array(2*l+3),f=[];for(let n=0;n<=l;n++){for(let a=-n;a<=n;a+=2){let l=a===-n||a!==n&&d[u+a-1]<d[u+a+1]?d[u+a+1]:d[u+a-1]+1,p=l-a;for(;l<s&&p<c&&e[t+l]===r[i+p];)l++,p++;if(d[u+a]=l,l>=s&&p>=c)return f.push(d.slice(u-n,u+n+1)),pw(f,s,c,t,i,o),!0}f.push(d.slice(u-n,u+n+1))}return!1}function pw(e,t,n,r,i,a){let o=t,s=n;for(let t=e.length-1;t>0;t--){let n=e[t-1],c=e=>n[e+t-1],l=o-s,u=l===-t||l!==t&&c(l-1)<c(l+1)?l+1:l-1,d=c(u),f=d-u;for(;o>d&&s>f;)a[i+--s]=r+--o;o=d,s=f}for(;o>0&&s>0;)a[i+--s]=r+--o}function mw(e,t,n,r,i,a,o){let s=new Map;for(let r=t;r<n;r++){let t=s.get(e[r]);t?t.push(r):s.set(e[r],[r])}let c=new Map;for(let e=i;e<a;e++){let t=s.get(r[e]);if(!t)continue;let n=c.get(r[e])??0;n<t.length&&(o[e]=t[n],c.set(r[e],n+1))}}function hw(e,t,n,r){for(let i=0;i<16;i++)if(e[t+i]!==n[r+i])return!1;return!0}function gw(e,t,n){let r=e.length,i=new Float32Array(16*r),a=null,o=-1;for(let e=0;e<r;e++)if(t(e)){if(i.set(n(e),e*16),o<0)for(let t=0;t<e;t++)i.copyWithin(t*16,e*16,e*16+16);o=e}else a??=new Uint8Array(r).fill(1),a[e]=0,o>=0&&i.copyWithin(e*16,o*16,o*16+16);return{times:e,matrices:i,visible:a}}function _w(e){if(e.visible)return!1;let t=e.matrices;for(let e=16;e<t.length;e+=16)if(!hw(t,0,t,e))return!1;return!0}var vw=class{constructor(e,t){this.times=Float32Array.from(e),this.name=t,this.base=null,this.frame=-1,this.keyIds=new Map,this.tracks=[],this.prev=null,this.placements=new Map,this.templates=new Map,this.cameras=[],this.warnings=new Set}addFrame(e){let t=++this.frame;t===0?this.base=e:this._adoptDefinitions(e);for(let t of e.warnings)this.warnings.add(t);let n=new uw(e),r=new Int32Array(e.shapes.length);for(let t=0;t<r.length;t++){let i=n.of(e.shapes[t]),a=this.keyIds.get(i);a===void 0&&this.keyIds.set(i,a=this.keyIds.size),r[t]=a}let i=this.prev?dw(this.prev.keys,r):null,a=Array(r.length);for(let o=0;o<r.length;o++){let r=e.shapes[o],s=i&&i[o]>=0?this.prev.tracks[i[o]]:null;s?(s.last=t,s.ctms?s.ctms.push(r.ctm):r.ctm!==s.shape.ctm&&!hw(r.ctm,0,s.shape.ctm,0)&&(s.ctms=Array(t-s.first).fill(s.shape.ctm),s.ctms.push(r.ctm))):(s={shape:r,first:t,last:t,ctms:null},t>0&&this._adoptMaterial(r,n.materialNames),this.tracks.push(s)),a[o]=s}this.prev={keys:r,tracks:a},this._addPlacements(e,t,this._resolveTemplates(e,t,n)),this.cameras.push(e.camera?{cameraToWorld:e.camera.cameraToWorld,fov:e.camera.params?.fov?.value?.[0]}:null)}_adoptDefinitions(e){for(let[t,n]of e.namedMaterials)this.base.namedMaterials.has(t)||this.base.namedMaterials.set(t,n);for(let[t,n]of e.namedTextures)this.base.namedTextures.has(t)||this.base.namedTextures.set(t,n)}_resolveTemplates(e,t,n){let r=new Map;for(let[i,a]of e.objects){let e=``;for(let t of a)e+=n.of(t)+`@`+Array.prototype.join.call(t.relativeCTM||t.ctm,`,`)+`;`;let o=i+`\0`+e,s=this.templates.get(o);if(s===void 0&&(s=t===0||!this.base.objects.has(i)?i:`${i} @${t}`,this.templates.set(o,s),t>0)){for(let e of a)this._adoptMaterial(e,n.materialNames);this.base.objects.set(s,a)}r.set(i,s)}return r}_adoptMaterial(e,t){let n=e.material&&t.get(e.material);n!==void 0&&(e.material=this.base.namedMaterials.get(n)??e.material)}_addPlacements(e,t,n){for(let[r,i]of e.instances){let e=n.get(r)??r,a=this.placements.get(e);if(a||this.placements.set(e,a={counts:new Int32Array(this.times.length),diffs:new Map}),a.counts[t]=i.count,t===0)continue;let o=this.base.instances.get(e),s=o?.count??0;for(let e=0;e<i.count;e++){let n=e*16;if(e<s&&hw(i.matrices,n,o.matrices,n))continue;let r=a.diffs.get(e);r||a.diffs.set(e,r=new Map),r.set(t,i.matrices.slice(n,n+16))}}}finish(){let e=this.base,t=this.times,n=this.frame+1;e.shapes=this.tracks.map(e=>{let{shape:r,first:i,last:a,ctms:o}=e;return(i>0||a<n-1||o)&&(r.motion=gw(t,e=>e>=i&&e<=a,e=>o?o[e-i]:r.ctm)),r}),e.warnings=[...this.warnings],e.animatedInstances=this._finishPlacements(e,t,n);let r=this.cameras;if(r[0]&&r.every(Boolean)){let n=gw(t,()=>!0,e=>r[e].cameraToWorld),i=r.map(e=>e.fov??r[0].fov),a=i.some(e=>e!==i[0]);(!_w(n)||a)&&(e.camera.motion={...n,fov:a?Float32Array.from(i):null})}return e.animation={name:this.name,duration:t[n-1],frames:n},e}_finishPlacements(e,t,n){let r=[],i=0;for(let[a,{counts:o,diffs:s}]of this.placements){let c=e.instances.get(a),l=c?.count??0,u=Math.max(...o.subarray(0,n)),d=[];for(let e=0;e<u;e++){let u=s.get(e),f=!!u;for(let t=0;t<n&&!f;t++)f=e>=o[t];if(f&&r.length<ow){let n=gw(t,t=>e<o[t],t=>u?.get(t)??c.matrices.subarray(e*16,e*16+16));r.push({name:a,motion:n})}else f&&i++,e<l&&d.push(e)}if(c&&d.length!==l){let t=new Float32Array(d.length*16);d.forEach((e,n)=>t.set(c.matrices.subarray(e*16,e*16+16),n*16)),e.instanceCount-=l-d.length,c.matrices=t,c.matricesEnd=null,c.count=d.length}}return i>0&&e.warnings.push(`${i.toLocaleString()} moving placement(s) past ${ow.toLocaleString()} left static`),r}};function yw(e){if(!e.hasMotion)return e;let{start:t,end:n}=e.transformTimes,r=n-t;if(!(r>0))return e;let i=Float32Array.of(0,r),a=(e,t,n,r)=>{let a=new Float32Array(32);for(let i=0;i<16;i++)a[i]=e[t+i],a[16+i]=n[r+i];return{times:i,matrices:a,visible:null}};for(let t of e.shapes)t.ctmEnd&&(t.motion=a(t.ctm,0,t.ctmEnd,0));e.animatedInstances=[];for(let t of e.instances.values()){if(!t.matricesEnd)continue;let n=[];for(let r=0;r<t.count;r++){let i=r*16;hw(t.matrices,i,t.matricesEnd,i)||e.animatedInstances.length>=ow?n.push(r):e.animatedInstances.push({name:t.name,motion:a(t.matrices,i,t.matricesEnd,i)})}if(n.length!==t.count){let r=new Float32Array(n.length*16);n.forEach((e,n)=>r.set(t.matrices.subarray(e*16,e*16+16),n*16)),e.instanceCount-=t.count-n.length,t.matrices=r,t.count=n.length}t.matricesEnd=null}return e.camera?.cameraToWorldEnd&&(e.camera.motion={...a(e.camera.cameraToWorld,0,e.camera.cameraToWorldEnd,0),fov:null}),e.animation={name:`Shutter motion`,duration:r,frames:2},e}var bw=2e6,xw=new TextDecoder;function Sw(e){let t=e.replace(/\\/g,`/`).split(`/`),n=[];for(let e of t)e===``||e===`.`||(e===`..`?n.pop():n.push(e));return n.join(`/`)}function Cw(e,t){return!e||t.startsWith(`/`)?Sw(t):Sw(`${e}/${t}`)}var ww=class{constructor(e,t=null){this.entries=e,this.source=t,this.records=[],this.byPath=new Map,this.byBase=new Map;let n=(e,t,n)=>{let r=Sw(e).toLowerCase();if(this.byPath.has(r))return;let i={key:e,norm:r,bytes:t,lazy:n};this.records.push(i),this.byPath.set(r,i);let a=r.split(`/`).pop(),o=this.byBase.get(a);o?o.push(i):this.byBase.set(a,[i])};for(let t in e)n(t,e[t],!1);for(let e of t?.listing??[])e.offset!==void 0&&n(e.path,null,!0)}async read(e){return e?e.bytes?e.bytes:!e.lazy||!this.source?null:this.source.read(e.key):null}async readHead(e,t){return e?e.bytes?e.bytes.subarray(0,t):!e.lazy||!this.source?null:this.source.readHead?this.source.readHead(e.key,t):this.source.read(e.key):null}async readPath(e,t=null){let n=t!==null&&this.findRecord(Cw(t,e))||this.findRecord(e);return this.read(n)}release(e){e.bytes=null,delete this.entries[e.key]}releasePath(e,t=null,n=null){let r=t!==null&&this.findRecord(Cw(t,e))||this.findRecord(e);r?.lazy&&(this.release(r),hS(n))}releaseScenes(){for(let e of this.records)e.norm.endsWith(`.pbrt`)&&this.release(e)}findRecord(e){let t=Sw(e).toLowerCase();if(this.byPath.has(t))return this.byPath.get(t);let n=this.byBase.get(t.split(`/`).pop());return n?n.find(e=>e.norm.endsWith(`/`+t))||(n.length===1?n[0]:null):null}find(e){return this.findRecord(e)?.bytes??null}};function Tw(e,t,n=0){let r=t[0],i=e.length-t.length;outer:for(let a=n;a<=i;a++)if(e[a]===r){for(let n=1;n<t.length;n++)if(e[a+n]!==t[n])continue outer;return a}return-1}var Ew=e=>Uint8Array.from(e,e=>e.charCodeAt(0)),Dw=4*1024*1024,Ow=Ew(`WorldBegin`),kw=[Ew(`Include`),Ew(`Import`)];function Aw(e,t){for(let n=t-1;n>=0;n--){let t=e[n];if(t===10)return!0;if(t!==32&&t!==9)return!1}return!0}function jw(e){for(let t=Tw(e,Ow);t>=0;t=Tw(e,Ow,t+1))if(Aw(e,t))return!0;return!1}function Mw(e,t){for(let n of kw)for(let r=Tw(e,n);r>=0;r=Tw(e,n,r+1)){if(!Aw(e,r))continue;let i=r+n.length;for(;i<e.length&&(e[i]===32||e[i]===9);)i++;if(e[i]!==34)continue;let a=++i;for(;i<e.length&&e[i]!==34&&e[i]!==10;)i++;if(e[i]!==34)continue;let o=xw.decode(e.subarray(a,i));t.add(Sw(o).toLowerCase().split(`/`).pop())}}function Nw(e){let t=Object.keys(e).filter(e=>e.toLowerCase().endsWith(`.pbrt`));if(t.length<=1)return t;let n=new Set,r=new Map;for(let i of t){let t=e[i];r.set(i,jw(t)),Mw(t,n)}return Pw(t,r,n)}function Pw(e,t,n){let r=(e,t)=>{let n=e.filter(t);return n.length?n:e},i=r(e,e=>t.get(e));return i=r(i,e=>!n.has(e.toLowerCase().split(`/`).pop())),i=r(i,e=>/(^|\/)(scene|main)\.pbrt$/i.test(e)),i.sort((e,t)=>{let n=e.split(`/`).length,r=t.split(`/`).length;return n===r?e.length===t.length?e<t?-1:+(e>t):e.length-t.length:n-r})}function Fw(e){return Nw(e)[0]||null}async function Iw(e){let t=e.records.filter(e=>e.norm.endsWith(`.pbrt`));if(t.length===0)return[];if(t.length===1)return[t[0].key];let n=async n=>{let r=new Set,i=new Map,a=!1;for(let o of t){let t=await n(o);t&&(i.set(o.key,jw(t)),Mw(t,r),t.length>=Dw&&(a=!0),o.lazy&&(e.release(o),hS(t)))}return{included:r,worlds:i,cut:a}},r=await n(t=>e.readHead(t,Dw)),{included:i,worlds:a}=[...r.worlds.values()].filter(Boolean).length===1||!r.cut?r:await n(t=>e.read(t));return Pw(t.map(e=>e.key),a,i)}async function Lw(e){let{vfs:t,source:n,plyParser:r,imageFromBytes:i,envFromBytes:a,convertHandedness:o}=e,s=new ww(t,n),c=[],l=await Iw(s);if(l.length===0)throw Error(`PBRT loader: no .pbrt file found in archive`);let u=e.entryPath&&l.includes(e.entryPath)?e.entryPath:null;e.entryPath&&!u&&c.push(`PBRT entry "${e.entryPath}" is not a scene in this archive — auto-detecting instead`);let d=u||l[0],f=async t=>{let n=await s.readPath(t);if(!n)throw Error(`PBRT loader: entry "${t}" not readable`);let r=await new sC({resolveInclude:(e,t)=>s.readPath(e,t),releaseInclude:(e,t,n)=>s.releasePath(e,t,n),maxPlacements:e.maxPlacements,instanceIncludes:e.instanceIncludes}).parse(n,t.includes(`/`)?t.slice(0,t.lastIndexOf(`/`)):``);return s.releasePath(t,null,n),r},p=performance.now(),m=!u&&e.animation!==!1?sw(l):null,h;if(m){let e=await f(m[0].path);if(e.shapes.length+e.instanceCount>bw)c.push(`${m.length} animation frames found, but the scene is too large to parse once per frame — loaded "${m[0].path}" only`),m=null,h=yw(e);else{let t=new vw(m.map(e=>(e.number-m[0].number)/30),Rw(m));t.addFrame(e);for(let e=1;e<m.length;e++)t.addFrame(await f(m[e].path));h=t.finish()}}else h=yw(await f(d));let g=performance.now()-p;s.releaseScenes();let _=e=>e.byteOffset===0&&e.byteLength===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength),v=new Map,y=async e=>{let t=await s.read(e);return t?(s.release(e),r(_(t))):null},b=new rw({convertHandedness:o,maxTriangles:e.maxTriangles,maxPlacements:e.maxPlacements,mergeShapesAbove:e.mergeShapesAbove,curveSteps:e.curveSteps,curveSides:e.curveSides,curveTolerance:e.curveTolerance,resolvePLY:async e=>{let t=s.findRecord(e);return t?(v.has(t.norm)||v.set(t.norm,await y(t)),v.get(t.norm)):null},resolveImage:async e=>{let t=await s.readPath(e);return t?i(t,e):null},resolveEnvironment:async e=>{let t=await s.readPath(e);return t?(a||i)(t,e):null}}),x=performance.now(),S=await b.build(h);return{...S,entryPath:m?m[0].path:d,frames:m?m.map(e=>e.path):null,candidates:l,warnings:[...c,...S.warnings??[]],parseMs:g,buildMs:performance.now()-x}}function Rw(e){let t=e[0].path.split(`/`);return`${t.length>1?t[t.length-2]:t[0].replace(/\d+\.pbrt$/i,``)||`frames`} · frames ${e[0].number}–${e[e.length-1].number}`}var zw=[`sourceFile`,`url`,`file`];function Bw(e){if(typeof e==`string`)try{let t=JSON.parse(e);return t&&typeof t==`object`?t:null}catch{return null}return e&&typeof e==`object`?e:null}function Vw(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)?t:void 0}function Hw(e){let t=Bw(e);if(!t)return null;let n=Bw(t.rayzee);return n&&n.environment!==void 0?n:t.environment===void 0?null:t}function Uw(e){let t=Bw(e);if(!t)return null;let n=zw.map(e=>t[e]).find(e=>typeof e==`string`&&e.trim());if(!n)return null;let r=Vw(t.rotation),i=Vw(t.intensity),a={sourceFile:n.trim()};return r!==void 0&&(a.rotation=r),i!==void 0&&(a.intensity=Math.max(0,i)),a}function Ww(e){let t=Hw(e);if(!t)return null;let n=Uw(t.environment);return n?{environment:n}:null}function Gw(e){if(!e)return null;let t=[e.userData,e.asset?.extras,e.scene?.userData];Array.isArray(e.scenes)&&t.push(...e.scenes.map(e=>e?.userData));for(let e of t){let t=Ww(e);if(t)return t}return null}Js();var Kw={glb:{type:`model`,name:`GLB (GLTF Binary)`},gltf:{type:`model`,name:`GLTF`},fbx:{type:`model`,name:`FBX`},obj:{type:`model`,name:`OBJ`},stl:{type:`model`,name:`STL`},ply:{type:`model`,name:`PLY (Polygon File Format)`},dae:{type:`model`,name:`Collada`},"3mf":{type:`model`,name:`3D Manufacturing Format`},usd:{type:`model`,name:`USD (Universal Scene Description)`},usda:{type:`model`,name:`USDA (USD ASCII)`},usdc:{type:`model`,name:`USDC (USD Crate)`},usdz:{type:`model`,name:`USDZ (USD Archive)`},hdr:{type:`environment`,name:`HDR (High Dynamic Range)`},exr:{type:`environment`,name:`EXR (OpenEXR)`},png:{type:`image`,name:`PNG`},jpg:{type:`image`,name:`JPEG`},jpeg:{type:`image`,name:`JPEG`},webp:{type:`image`,name:`WebP`},zip:{type:`archive`,name:`ZIP Archive`},gz:{type:`archive`,name:`Gzipped TAR Archive`},tgz:{type:`archive`,name:`Gzipped TAR Archive`},tar:{type:`archive`,name:`TAR Archive`}},qw=/\.(usd|usda|usdc)$/i,Jw=/\.(png|jpg|jpeg|avif)$/i,Yw=3e4,Xw=4e9;function Zw(e){let t=new r.BufferGeometry;for(let n in e.attributes)t.setAttribute(n,e.attributes[n]);e.index&&t.setIndex(e.index);for(let n of e.groups)t.addGroup(n.start,n.count,n.materialIndex);return t}var Qw=683;function $w(e,t,n,i){if(!(i.normalize??!0))return Math.PI;let a=i.shape===`ellipse`||i.shape===`disk`?Math.PI/4:1,o=e.getWorldScale(new r.Vector3),s=Math.PI*a*Math.abs(t*o.x*n*o.y);return Number.isFinite(s)?s:Math.PI}var eT=class e extends r.EventDispatcher{constructor(e,t,n,{issues:i=null,profile:a=null}={}){super(),this.scene=e,this.camera=t,this.controls=n,this.targetModel=null,this.floorPlane=null,this.sceneScale=1,this.sceneSize=new r.Vector3(1,1,1),this.loaderCache={},this.uploadedFileInfo=null,this.animations=[],this.renderer=null,this.sceneMetadata=null,this._loadingManager=new r.LoadingManager,this._loadCancelled=!1,this._urlAbort=null,this.storage=null,this._downloads=null,this._sourceKey=null,this._appended=!1,this._issues=i,this._profile=a??Ge(),this._loadingManager.onError=e=>{this._loadCancelled||this._issues?.record(Y.ASSET_UNREACHABLE,`asset "${e}" could not be fetched — anything depending on it renders without it`,{url:e})}}cancelActiveLoad(){this._loadCancelled=!0,this._loadingManager.abort(),this._urlAbort?.abort()}async _viaCache(t,n,r,{cacheKey:i=t,cachePolicy:a}={}){if(!this.storage||!e._isNetworkUrl(t)||/\.gltf$/i.test(t.split(/[?#]/)[0]))return{url:t,release:()=>{},cached:!1};let o=new AbortController;this._urlAbort=o;try{return await jg(t,{downloads:this.downloads,key:i,policy:a,name:wg(t),signal:o.signal,onProgress:this._downloadProgress(n,r)})}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._urlAbort=null}}get sceneSourceKey(){return this._appended?null:this._sourceKey}_keyed(e,t){return t?`${e}:${this._profile?.name??``}:${t}`:null}get downloads(){return this._downloads?._storage!==this.storage&&(this._downloads=new Og(this.storage)),this._downloads}_isCancellation(e){return this._loadCancelled||e?.name===`AbortError`||e?.code===`LOAD_CANCELLED`}_cancellationError(){let e=Error(`Load cancelled`);return e.code=`LOAD_CANCELLED`,e}_downloadProgress(e,t){return n=>{let r=n?.loaded||0,i=n?.lengthComputable&&n.total||0;H({isLoading:!0,status:e,loadedBytes:r,totalBytes:i,canCancel:!!t,progress:i?Math.min(60,2+Math.round(r/i*58)):2})}}_downloadComplete(e=`Processing Data...`,t=62){H({status:e,progress:t,canCancel:!1,loadedBytes:null,totalBytes:null})}static _isNetworkUrl(e){return typeof e==`string`&&/^https?:/i.test(e)}_adoptExternalObject(e){let t;try{t=(0,f.clone)(e)}catch(t){throw Error(`Cannot render "${e.name||e.type}": its userData must be JSON-serializable.`,{cause:t})}return t.userData.__rayzeeExternal=!0,this.scene?.children.some(t=>t.uuid===e.uuid)||(t.uuid=e.uuid),e.parent&&(e.parent.updateWorldMatrix(!0,!1),t.applyMatrix4(e.parent.matrixWorld)),t}releaseTargetModel(){this.sceneMetadata=null,this._sourceKey=null,this._appended=!1,this._pendingGraph=null,this.targetModel&&(this.removeModelRoot(this.targetModel),this.targetModel=null,this.animations=[])}setRenderer(e){this.renderer=e}getFileFormat(e){return Kw[e.split(`.`).pop().toLowerCase()]||null}readFileAsArrayBuffer(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>t(e.target.result),r.onerror=e=>n(e),r.readAsArrayBuffer(e)})}readFileAsText(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=e=>t(e.target.result),r.onerror=e=>n(e),r.readAsText(e)})}async loadAssetFromFile(e,t={}){let n=e.name,r=this.getFileFormat(n);if(!r)throw Error(`Unsupported file format: ${n}`);H({isLoading:!0,status:`Loading ${r.name}...`,progress:2});try{let i;switch(r.type){case`model`:i=await this.loadModelFromFile(e,n);break;case`environment`:case`image`:i=await this.loadEnvironmentFromFile(e,n);break;case`archive`:i=await this.loadArchiveFromFile(e,n,t);break;default:throw Error(`Unknown asset type: ${r.type}`)}return i}catch(e){throw this.dispatchEvent({type:`error`,message:e.message,filename:n}),e}}async loadAssetFromUrl(t,n={}){let{filename:r=wg(t),cacheKey:i=t,cachePolicy:a,...o}=n;if(!this.getFileFormat(r))throw Error(`Unsupported file format: ${r}`);this._loadCancelled=!1;let s=e._isNetworkUrl(t),c=`Downloading ${r}...`,l=new AbortController;this._urlAbort=l,H({isLoading:!0,status:c,progress:2,canCancel:s,loadedBytes:0,totalBytes:0});let u;try{u=await this.downloads.fetch(t,{key:i,name:r,policy:a,signal:l.signal,onProgress:this._downloadProgress(c,s)})}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._urlAbort=null}this._downloadComplete();try{return await this.loadAssetFromFile(u.file,o)}catch(e){throw e?.code===`ARCHIVE_NEEDS_ELEMENT`&&(e.file=u.file),e}finally{u.release()}}async loadModelFromFile(e,t){let n=this.storage?this._keyed(`file`,Gn(await Wn(e))):null,r=await this._loadModelFileByExtension(e,t);return this._sourceKey=n,r}async _loadModelFileByExtension(e,t){let n=t.split(`.`).pop().toLowerCase(),r=await this.readFileAsArrayBuffer(e);switch(n){case`glb`:case`gltf`:return await this.loadGLBFromArrayBuffer(r,t);case`fbx`:return await this.loadFBXFromArrayBuffer(r,t);case`obj`:return await this.loadOBJFromFile(e,t);case`stl`:return await this.loadSTLFromArrayBuffer(r,t);case`ply`:return await this.loadPLYFromArrayBuffer(r,t);case`dae`:return await this.loadColladaFromFile(e,t);case`3mf`:return await this.load3MFFromArrayBuffer(r,t);case`usd`:case`usda`:case`usdc`:case`usdz`:return await this.loadUSDFromArrayBuffer(r,t);default:throw Error(`Support for ${n} files is not yet implemented`)}}async loadEnvironmentFromFile(e,t){let n=URL.createObjectURL(e);this.uploadedFileInfo={name:t,type:e.type,size:e.size};try{let r=await this.loadEnvironment(n);return Iu(r,Gn(await Wn(e))),this.dispatchEvent({type:`load`,texture:r,filename:t}),r}finally{URL.revokeObjectURL(n)}}async loadEnvironment(t){this._loadCancelled=!1;try{this.dispatchEvent({type:`beforeEnvironmentLoad`,url:t});let n;if(t.startsWith(`blob:`))n=await this.loadEnvironmentFromBlob(t);else{let e=t.split(/[?#]/)[0].split(`.`).pop().toLowerCase();n=await this.loadEnvironmentByExtension(t,e)}return n.generateMipmaps=!0,e._isNetworkUrl(t)&&Iu(n,t),this.applyEnvironmentToScene(n),this.dispatchEvent({type:`load`,texture:n,url:t,filename:t.split(/[?#]/)[0].split(`/`).pop()}),n}catch(e){throw this._isCancellation(e)?this._cancellationError():(console.error(`Error loading environment:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e)}}async loadEnvironmentFromBlob(e){let t=await(await fetch(e)).blob(),n=this.determineEnvironmentExtension(t,e),r=URL.createObjectURL(t);try{return await this.loadEnvironmentByExtension(r,n)}finally{URL.revokeObjectURL(r)}}determineEnvironmentExtension(e,t){let n;if(e.type===`image/x-exr`||e.type.includes(`exr`))n=`exr`;else if(e.type===`image/vnd.radiance`||e.type.includes(`hdr`))n=`hdr`;else{let e=t.split(`/`).pop();if(e){let t=e.match(/\.([^.]+)$/);t&&(n=t[1].toLowerCase())}}return!n&&this.uploadedFileInfo&&(n=this.uploadedFileInfo.name.split(`.`).pop().toLowerCase()),n}async loadEnvironmentByExtension(t,n){let i=e._isNetworkUrl(t),a=`Downloading Environment...`,o=await this._viaCache(t,a,i),c=o.cached?void 0:this._downloadProgress(a,i),l;try{n===`hdr`||n===`exr`?l=await(n===`hdr`?this.loaderCache.hdr||(this.loaderCache.hdr=new s.HDRLoader(this._loadingManager).setDataType(r.FloatType)):this.loaderCache.exr||(this.loaderCache.exr=new u.EXRLoader(this._loadingManager).setDataType(r.FloatType))).loadAsync(o.url,c):(this.loaderCache.texture||(this.loaderCache.texture=new r.TextureLoader(this._loadingManager)),l=await this.loaderCache.texture.loadAsync(o.url,c),l.colorSpace=r.SRGBColorSpace)}finally{o.release()}return this._downloadComplete(`Processing Environment...`,62),l.mapping=r.EquirectangularReflectionMapping,l.minFilter=r.LinearFilter,l.magFilter=r.LinearFilter,l}applyEnvironmentToScene(e){this.scene.background=e,this.scene.environment=e}async _readHead(e,t=512){return e instanceof Uint8Array?e.subarray(0,t):typeof e.slice==`function`&&typeof e.arrayBuffer==`function`?new Uint8Array(await e.slice(0,t).arrayBuffer()):new Uint8Array((await this.readFileAsArrayBuffer(e)).slice(0,t))}async inspectArchive(e){let t=rx(await this._readHead(e)),n=e=>H({isLoading:!0,status:`Scanning archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4}),r;if(t===`gzip`){let t=await this._unpackGzip(e,e.name);t?(r=t.index.listing,t.release()):{listing:r}=await gx(e,{filter:()=>!1,onProgress:n})}else r=t===`tar`?(await Vx(e,this.storage))?.listing??await vx(e,{onProgress:n}):(await Nx(e)).map(e=>({path:e.name,size:e.size}));let{root:i,elements:a}=Sx(r);return{kind:t??`zip`,root:i,elements:a,entryCount:r.length,totalBytes:r.reduce((e,t)=>e+t.size,0)}}async _unpackGzip(e,t){try{return await Bx(e,{storage:this.storage,label:t,onProgress:e=>H({isLoading:!0,status:`Unpacking archive… ${(e/1e9).toFixed(1)} GB`,progress:4})})}catch(e){return console.warn(`Unpacking "${t}" to storage failed, reading it in memory: ${e.message}`),null}}async loadArchiveFromFile(e,t,{pbrtEntry:n=null,element:r=null,byteBudget:i,promptBytes:a,...o}={}){try{let s=rx(await this._readHead(e)),c=this.storage?Gn(await Wn(e)):null,l={element:r,promptBytes:a,pbrtEntry:n,pbrt:o,archiveId:c};if(s===`tar`)return await this._loadSeekable(e,t,l);if(s===`gzip`){let a=await this._unpackGzip(e,t);if(a)try{return await this._loadSeekable(a.file,t,{...l,index:a.index})}finally{a.release()}let u=await this._readStreamedArchive(e,t,s,r,i);if(Fw(u))return await this.loadPBRTFromZip(u,t,n,o);let d=await this._loadNonPBRTArchive(u,t);return this._sourceKey=this._keyed(`archive`,c),d}return await this._loadSeekable(e,t,{...l,zip:!0})}catch(e){throw e?.code!==`ARCHIVE_NEEDS_ELEMENT`&&console.error(`Error loading archive:`,e),e}}async _loadNonPBRTArchive(e,t){return await this.processObjMtlPairsInZip(e,t)||await this.findAndLoadModelFromZip(e,t)}async _loadSeekable(e,t,{element:n,promptBytes:r,pbrtEntry:i,pbrt:a,index:o=null,zip:s=!1,archiveId:c=null}){let l=await this._openSeekableArchive(e,t,n,r,{index:o,zip:s});if(l.archiveId=c,l.elements=(Array.isArray(n)?n:[n]).filter(Boolean),l.listing.some(e=>e.path.toLowerCase().endsWith(`.pbrt`)))return await this.loadPBRTFromZip({},t,i,a,l);for(let e of l.listing)e.offset!==void 0&&(l.entries[e.path]??=await l.read(e.path));let u=await this._loadNonPBRTArchive(l.entries,t);return this._sourceKey=this._keyed(`archive`,c),u}async _loadStoredGraph(e,t,{imageFromBytes:n,envFromBytes:r}){let i=this.storage?.area(Zn.SCENES),a=i?await i.open(e):null;if(!a)return null;let o=performance.now(),s=null;try{H({isLoading:!0,status:`Opening the stored scene...`,progress:6});let e=await a.json(`graph.json`),i=await a.file(`data.bin`),s=new ww({},t),c=await pS(e,i,{loadTexture:async(e,t)=>{let i=await s.readPath(e);return i?t===`environment`?r(i,e):n(i,e):null}});return{...c.stats,group:c.root,environment:c.environment?{texture:c.environment}:null,animations:c.animations,report:null,parseMs:0,buildMs:performance.now()-o,fromStorage:!0}}catch(e){return s=e,null}finally{a.release(),s&&(console.warn(`The stored scene could not be used, parsing the archive instead: ${s.message}`),this._issues?.warn(Y.STORAGE_ENTRY_CORRUPT,`stored scene unusable: ${s.message}`,{key:e}),i.remove(e).catch(()=>{}))}}_storeGraph(e,t,n){let r=this.storage?.area(Zn.SCENES);if(!r)return;let i;try{i=oS(t.group,{environment:t.environment?.texture??null,animations:t.animations??[],stats:{meshCount:t.meshCount,entryPath:t.entryPath,candidates:t.candidates,frames:t.frames,warnings:t.warnings,triangleCount:t.triangleCount,placementCount:t.placementCount,mergedShapes:t.mergedShapes,skippedForBudget:t.skippedForBudget,droppedNoTemplate:t.droppedNoTemplate}})}catch(e){e instanceof Zx?console.info(`Scene not stored for next time: ${e.message}`):console.warn(`Scene not stored for next time:`,e);return}let a={key:e,encoded:i,label:n,parseMs:(t.parseMs??0)+(t.buildMs??0),triangles:t.triangleCount??null};Gh(a.parseMs,i.byteLength)?this._writeGraph(r,a):this._pendingGraph=a}flushPendingGraph(e){let t=this._pendingGraph;this._pendingGraph=null;let n=this.storage?.area(Zn.SCENES);!t||!n||!Gh(t.parseMs+e,t.encoded.byteLength)||this._writeGraph(n,t)}_writeGraph(e,t){(async()=>{let n=await e.create(t.key,{label:`${t.label} (scene)`,expectedBytes:t.encoded.byteLength});if(n)try{await sS(n,t.encoded,{release:!0}),await n.commit({triangles:t.triangles})}catch(e){await n.abort(),console.warn(`Storing the scene failed:`,e)}})().catch(e=>console.warn(`Storing the scene failed:`,e))}async _openSeekableArchive(e,t,n,r,{index:i=null,zip:a=!1}={}){let o=Array.isArray(n)?n.filter(Boolean):n?[n]:[],s=o.length?xx(o):null,c;if(a)c=await Ix(e,{filter:s});else{let t=i??await Vx(e,this.storage);c=await bx(e,{index:t,headersOnly:!0,filter:s,onProgress:e=>H({isLoading:!0,status:`Indexing archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4})}),t||Hx(e,this.storage,c.index).catch(()=>{})}let l=c.listing.reduce((e,t)=>e+t.size,0);return o.length===0&&this._requireElementChoice(t,c.listing,l,r),console.info(`Archive "${t}": indexed ${c.indexed} entries, ${(l/1e9).toFixed(1)} GB, none resident`+(o.length?`, ${o.length} part${o.length>1?`s`:``} selected.`:`.`)),c}_requireElementChoice(e,t,n,r=Xw){if(n<r)return;let{root:i,elements:a}=Sx(t);if(a.length<2)return;let o=Error(`"${e}" holds ${(n/1e9).toFixed(1)} GB across ${a.length} parts. Choose which to load — loading all of them at once may exhaust memory.`);throw o.code=`ARCHIVE_NEEDS_ELEMENT`,o.root=i,o.elements=a,o.totalBytes=n,this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`archive holds ${(n/1e9).toFixed(1)} GB across ${a.length} parts; choose which to load`,{root:i,elements:a.map(e=>e.prefix),totalBytes:n},yn.WARNING),o}async _readStreamedArchive(e,t,n,r,i){let a=Array.isArray(r)?r.filter(Boolean):r?[r]:[],{entries:o,listing:s,retainedBytes:c,truncated:l}=await gx(e,{filter:a.length?xx(a):null,...i===void 0?{}:{byteBudget:i},onProgress:e=>H({isLoading:!0,status:`Reading archive… ${(e.bytes/1e9).toFixed(1)} GB`,progress:4})});if(l&&a.length===0){let{root:e,elements:n}=Sx(s),r=s.reduce((e,t)=>e+t.size,0),i=Error(`"${t}" unpacks to ${(r/1e9).toFixed(1)} GB, past the load budget. Load one of its ${n.length} parts instead.`);throw i.code=`ARCHIVE_NEEDS_ELEMENT`,i.root=e,i.elements=n,i.totalBytes=r,this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`archive unpacks to ${(r/1e9).toFixed(1)} GB; choose one of ${n.length} parts`,{root:e,elements:n.map(e=>e.prefix),totalBytes:r},yn.WARNING),i}if(l){let e=xx(a),t=s.filter(t=>e(t.path,t.size)&&!o[t.path]).length;this._issues?.record(Y.ASSET_ARCHIVE_TOO_LARGE,`${t} files of the chosen parts were left out: they did not fit the ${((i??15e8)/1e9).toFixed(1)} GB in-memory read budget`,{elements:a,missing:t,retainedBytes:c},yn.WARNING)}return a.length&&console.info(`Archive "${t}": loaded ${a.map(e=>`"${e}"`).join(`, `)} — ${Object.keys(o).length} of ${s.length} files, ${(c/1048576).toFixed(1)} MB.`),o}async loadPBRTFromZip(e,t,n=null,r={},i=null){if(H({isLoading:!0,status:`Parsing PBRT scene...`,progress:5}),!this.loaderCache.ply){let{PLYLoader:e}=await import(`three/examples/jsm/loaders/PLYLoader.js`);this.loaderCache.ply=new e}let a=e=>this.loaderCache.ply.parse(e),o=async(e,t)=>{let n=await this._pbrtTextureFromBytes(e,t);return n&&(n.userData[Ux]=t),n},s=async(e,t)=>{let n=t.split(`.`).pop().toLowerCase(),r=new Blob([e]),i=URL.createObjectURL(r);try{let e=await this.loadEnvironmentByExtension(i,n);return Iu(e,`bytes:${await Un(r)}`),e.userData[Ux]=t,e.userData[Wx]=`environment`,e}finally{URL.revokeObjectURL(i)}},c=performance.now(),l={animation:r.animation,maxTriangles:r.maxTriangles,maxPlacements:r.maxPlacements,mergeShapesAbove:r.mergeShapesAbove,curveSteps:r.curveSteps,curveSides:r.curveSides,curveTolerance:r.curveTolerance,instanceIncludes:r.instanceIncludes},u=i?.archiveId?this._keyed(`pbrt:2.4:${Hh}`,`${i.archiveId}|${n??``}|${[...i.elements??[]].sort().join(`,`)}|${JSON.stringify(l)}`):null,d=u?await this._loadStoredGraph(u,i,{imageFromBytes:o,envFromBytes:s}):null,f=d??await Lw({vfs:e,source:i,entryPath:n,plyParser:a,imageFromBytes:o,envFromBytes:s,...l}),{group:p,environment:m,animations:h,report:g,warnings:_,meshCount:v,entryPath:y,candidates:b,frames:x,parseMs:S,buildMs:C,triangleCount:w,placementCount:T,mergedShapes:E,skippedForBudget:D,droppedNoTemplate:O}=f;d&&console.info(`PBRT scene "${y}" opened from storage in ${(C/1e3).toFixed(1)} s, skipping the parse`),this.lastPBRTStats={parseMs:S,buildMs:C,loaderMs:performance.now()-c,triangleCount:w,placementCount:T,mergedShapes:E,skippedForBudget:D,droppedNoTemplate:O,meshCount:v,frames:x?.length??1};let k=new Set(x??[y]),A=b.filter(e=>!k.has(e));if(A.length>0&&(console.warn(`PBRT archive holds ${b.length} scenes; loaded "${y}". Others: ${A.join(`, `)}`),this._issues?.record(Y.ASSET_AMBIGUOUS_ENTRY,`archive holds ${b.length} pbrt scenes; loaded "${y}"`,{loaded:y,alternatives:A},yn.WARNING)),g&&g.length&&typeof console.table==`function`){let e=g.length<v?` (first ${g.length} of ${v})`:``;console.groupCollapsed(`PBRT loader: ${v} mesh(es) from "${y}"${e}`),console.table(g),console.groupEnd()}return _&&_.length&&(console.warn(`PBRT loader: ${_.length} warning(s) parsing "${y}"`),_.forEach(e=>console.warn(` •`,e))),m?.texture&&(m.texture.generateMipmaps=!0,this.applyEnvironmentToScene(m.texture)),p.name=y||t,this.releaseTargetModel(),this._sourceKey=u,u&&!d&&this._storeGraph(u,f,t),this.targetModel=p,this.animations=h??[],m?.texture&&(this.sceneMetadata={environment:{rotation:0,intensity:1}}),H({isLoading:!0,status:`Processing PBRT geometry...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:p,filename:`${y} (from ZIP)`}),p}async _pbrtTextureFromBytes(e,t){let n=t.split(`.`).pop().toLowerCase(),i;if(n===`exr`||n===`hdr`){let t=n===`hdr`?this.loaderCache.hdr||(this.loaderCache.hdr=new s.HDRLoader().setDataType(r.FloatType)):this.loaderCache.exr||(this.loaderCache.exr=new u.EXRLoader().setDataType(r.FloatType));i=await this._loadViaObjectURL(t,e)}else if(n===`tga`){if(!this.loaderCache.tga){let{TGALoader:e}=await import(`three/examples/jsm/loaders/TGALoader.js`);this.loaderCache.tga=new e}i=await this._loadViaObjectURL(this.loaderCache.tga,e),i.colorSpace=r.SRGBColorSpace}else i=new r.Texture(await createImageBitmap(new Blob([e]))),i.colorSpace=r.SRGBColorSpace;return i.wrapS=i.wrapT=r.RepeatWrapping,i.needsUpdate=!0,i}async _loadViaObjectURL(e,t){let n=URL.createObjectURL(new Blob([t]));try{return await e.loadAsync(n)}finally{URL.revokeObjectURL(n)}}async processObjMtlPairsInZip(e,t){let n=[],r=[];for(let t in e){let i=t.toLowerCase();i.endsWith(`.obj`)?n.push({path:t,content:e[t]}):i.endsWith(`.mtl`)&&r.push({path:t,content:e[t]})}if(n.length>0&&r.length>0){console.log(`Found ${n.length} OBJ files and ${r.length} MTL files in ZIP`);let i=this.findMatchingObjMtlPairs(n,r);if(i.length>0)return console.log(`Found ${i.length} matching OBJ+MTL pairs`),await this.loadOBJMTLPairFromZip(i[0].obj,i[0].mtl,e,t);if(i.length===0)return console.log(`No matching pairs by name, using first OBJ and MTL files`),await this.loadOBJMTLPairFromZip(n[0],r[0],e,t)}return null}findMatchingObjMtlPairs(e,t){let n=[];for(let r of e){let e=r.path.split(`/`).pop().replace(/\.obj$/i,``).toLowerCase();for(let i of t){let t=i.path.split(`/`).pop().replace(/\.mtl$/i,``).toLowerCase();if(e===t||e.includes(t)||t.includes(e)){n.push({obj:r,mtl:i});break}}}return n}async findAndLoadModelFromZip(e){for(let t of[`scene.gltf`,`scene.glb`,`model.gltf`,`model.glb`,`main.gltf`,`main.glb`,`asset.gltf`,`asset.glb`])if(e[t]){console.log(`Found main model file: ${t}`);let n=t.split(`.`).pop().toLowerCase();return await this.loadModelFromZipEntry(e[t],t,n,e)}for(let t in e){let n=t.split(`.`).pop().toLowerCase();if(Kw[n]&&Kw[n].type===`model`)return qw.test(t)?await this.loadUSDHierarchyFromZip(e):(console.log(`Loading model file from ZIP: ${t}`),await this.loadModelFromZipEntry(e[t],t,n,e))}throw Error(`No supported model files found in the ZIP archive`)}async loadUSDHierarchyFromZip(t){let n=Object.keys(t).filter(e=>qw.test(e));if(n.length===0)throw Error(`No USD layers found in the ZIP archive`);let r=e._pickUSDRootLayer(n);console.log(`Loading USD scene from ZIP: ${r} (${n.length} layers)`);let i={[r]:[t[r],{level:0}]};for(let e of Object.keys(t))e!==r&&(qw.test(e)||Jw.test(e))&&(i[e]=[t[e],{level:0}]);return await this.loadUSDFromArrayBuffer((0,m.zipSync)(i),r)}static _pickUSDRootLayer(e){let t=e=>e.split(`/`).length,n=Math.min(...e.map(t)),r=e.filter(e=>t(e)===n);return r.find(e=>{let t=e.split(`/`);return t.length>1&&t[t.length-1].replace(qw,``)===t[t.length-2]})||r[0]}async loadModelFromZipEntry(e,t,n,r){try{H({isLoading:!0,status:`Processing ${n.toUpperCase()} from ZIP...`,progress:5});let i=new Blob([e.buffer],{type:`application/octet-stream`}),a=URL.createObjectURL(i),o;switch(n){case`glb`:case`gltf`:o=await this.handleGltfFromZip(n,e,t,r);break;case`fbx`:o=await this.loadFBXFromArrayBuffer(e.buffer,t);break;case`obj`:o=await this.handleObjFromZip(e,t,r);break;case`stl`:o=await this.loadSTLFromArrayBuffer(e.buffer,t);break;case`ply`:o=await this.loadPLYFromArrayBuffer(e.buffer,t);break;case`dae`:{let n=(0,m.strFromU8)(e),r=new File([new Blob([n])],t);o=await this.loadColladaFromFile(r,t)}break;case`3mf`:o=await this.load3MFFromArrayBuffer(e.buffer,t);break;case`usd`:case`usda`:case`usdc`:case`usdz`:o=await this.loadUSDFromArrayBuffer(e,t);break;default:throw Error(`Support for ${n} files is not yet implemented`)}return URL.revokeObjectURL(a),this.dispatchEvent({type:`load`,model:this.targetModel,filename:`${t} (from ZIP)`}),o}catch(e){throw console.error(`Error loading ${n} from ZIP:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async handleGltfFromZip(e,t,n,i){if(e===`gltf`){let e=(0,m.strFromU8)(t),a=new r.LoadingManager,o=n.split(`/`).slice(0,-1).join(`/`);a.setURLModifier(e=>this.resolveZipResource(e,o,i));let s=await this.createGLTFLoader();s.manager=a;try{return await new Promise((t,n)=>{s.parse(e,``,e=>{this.releaseTargetModel(),this.targetModel=e.scene,this.sceneMetadata=Gw(e),this.onModelLoad(this.targetModel).then(()=>t(e))},e=>n(e))})}finally{this._disposeGLTFLoader(s)}}else return await this.loadGLBFromArrayBuffer(t.buffer,n)}async handleObjFromZip(e,t,n){let r=(0,m.strFromU8)(e),i=r.match(/mtllib\s+([^\s]+)/),a=null;i&&i[1]&&(a=await this.loadMtlFromZip(i[1],t,n));let{OBJLoader:o}=await import(`three/examples/jsm/loaders/OBJLoader.js`),s=new o;a&&s.setMaterials(a);let c=s.parse(r);return c.name=t,this.releaseTargetModel(),this.targetModel=c,await this.onModelLoad(this.targetModel),c}async preloadMtlTextures(e){let t=[],n=e.loadTexture.bind(e);if(e.loadTexture=(e,r,i,a,o)=>{let s;return t.push(new Promise(e=>s=e)),n(e,r,e=>{s(),i?.(e)},a,e=>{s(),o?.(e)})},e.preload(),t.length===0)return e;let r,i=await Promise.race([Promise.all(t).then(()=>!0),new Promise(e=>r=setTimeout(()=>e(!1),Yw))]);return clearTimeout(r),i||this._issues?.record(Y.TEXTURE_BUILD_FAILED,`MTL textures did not decode within ${Yw}ms; affected materials render untextured`,{pending:t.length}),e}async loadMtlFromZip(e,t,n){let i=t.split(`/`).slice(0,-1).join(`/`),a=[e,`${i}/${e}`,e.split(`/`).pop()];for(let e of a)if(n[e]){let{MTLLoader:t}=await import(`three/examples/jsm/loaders/MTLLoader.js`),a=(0,m.strFromU8)(n[e]),o=new r.LoadingManager;o.setURLModifier(e=>this.resolveZipResource(e,i,n));let s=new t(o).parse(a,i);return await this.preloadMtlTextures(s),s}return null}resolveZipResource(e,t,n){let r=e.replace(/^\.\/|^\//,``),i=[r,`${t}/${r}`,r.split(`/`).pop()];for(let e of i)if(n[e]){let t=new Blob([n[e].buffer],{type:`application/octet-stream`});return URL.createObjectURL(t)}return console.warn(`Resource not found in ZIP: ${e}`),e}async loadOBJMTLPairFromZip(e,t,n,i){let{MTLLoader:a}=await import(`three/examples/jsm/loaders/MTLLoader.js`),{OBJLoader:o}=await import(`three/examples/jsm/loaders/OBJLoader.js`),s=[],c=new r.LoadingManager,l=e.path.split(`/`).slice(0,-1).join(`/`),u=t.path.split(`/`).slice(0,-1).join(`/`);c.setURLModifier(e=>this.resolveTextureInZip(e,l,u,t,n,s));let d=this.prepareFixedMtlContent(t),f=new a(c).parse(d,u);await this.preloadMtlTextures(f);let p=new o(c);p.setMaterials(f);let h=(0,m.strFromU8)(e.content),g=p.parse(h);return this.releaseTargetModel(),this.targetModel=g,await this.onModelLoad(this.targetModel),s.forEach(e=>URL.revokeObjectURL(e)),this.dispatchEvent({type:`load`,model:g,filename:`${e.path} (from ${i})`}),g}prepareFixedMtlContent(e){return(0,m.strFromU8)(e.content).replace(RegExp(`${e.path.split(`/`).pop()}\\s+`,`g`),` `).replace(/([a-zA-Z_]+)([\\/])/g,`$1 $2`)}resolveTextureInZip(e,t,n,r,i,a){let o=e.split(`?`)[0].split(`#`)[0].replace(/^\.\/|^\//,``),s=r.path.split(`/`).pop();o.startsWith(s)&&(o=o.substring(s.length).replace(/^\.\/|^\/|^\./,``));let c=[o,`${t}/${o}`,`${n}/${o}`,`textures/${o}`,`texture/${o}`,`materials/${o}`,o.split(`/`).pop()];for(let e of c)if(i[e]){let t=new Blob([i[e].buffer],{type:`application/octet-stream`}),n=URL.createObjectURL(t);return a.push(n),n}return this.findTextureWithFuzzyMatch(o,i,a)||e}findTextureWithFuzzyMatch(e,t,n){let r=e.split(`/`).pop();for(let e in t)if(e.endsWith(r)){let r=new Blob([t[e].buffer],{type:`application/octet-stream`}),i=URL.createObjectURL(r);return n.push(i),i}if(r&&r.length>5)for(let e in t){let i=e.split(`/`).pop();if(i.includes(r)||r.includes(i)){let r=new Blob([t[e].buffer],{type:`application/octet-stream`}),i=URL.createObjectURL(r);return n.push(i),i}}return null}async createGLTFLoader(){let{dracoDecoderPath:e,ktx2TranscoderPath:t}=Ks(),n=new c.DRACOLoader;n.setDecoderConfig({type:`js`}),n.setDecoderPath(e);let r=new l.KTX2Loader;r.setTranscoderPath(t),this.renderer&&(r.detectSupport(this.renderer),r.workerConfig={astcSupported:!1,etc1Supported:!1,etc2Supported:!1,dxtSupported:!1,bptcSupported:!1,pvrtcSupported:!1});let i=new o.GLTFLoader(this._loadingManager);return i.setDRACOLoader(n),i.setKTX2Loader(r),i.setMeshoptDecoder(p.MeshoptDecoder),i}_disposeGLTFLoader(e){e&&(e.dracoLoader?.dispose(),e.ktx2Loader?.dispose())}async loadExampleModels(e,t){if(!t||!t[e])throw Error(`No model file at index ${e}`);let n=`${t[e].url}`;return await this.loadModel(n)}async loadModel(t,n={}){this._loadCancelled=!1;let i=await this.createGLTFLoader(),a=e._isNetworkUrl(t),o=null;try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:a,loadedBytes:0,totalBytes:0}),o=await this._viaCache(t,`Downloading Model...`,a,n),o.cached&&i.setResourcePath(r.LoaderUtils.extractUrlBase(t));let e=await i.loadAsync(o.url,o.cached?void 0:this._downloadProgress(`Downloading Model...`,a));return this._downloadComplete(),this.releaseTargetModel(),this._sourceKey=a?this._keyed(`url`,n.cacheKey??t):null,this.targetModel=e.scene,this.animations=e.animations||[],this.sceneMetadata=Gw(e),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:e.scene,filename:t.split(`/`).pop()}),e}catch(e){throw this._isCancellation(e)?this._cancellationError():(console.error(`Error loading model:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e)}finally{o?.release(),this._disposeGLTFLoader(i)}}_processAndParent(e){this.processModelObjects(e),this.scene.add(e),e.updateMatrixWorld(!0)}async appendModel(t,n={}){this._loadCancelled=!1;let i=await this.createGLTFLoader(),a=e._isNetworkUrl(t),o=null;try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:a,loadedBytes:0,totalBytes:0}),o=await this._viaCache(t,`Downloading Model...`,a,n),o.cached&&i.setResourcePath(r.LoaderUtils.extractUrlBase(t));let e=await i.loadAsync(o.url,o.cached?void 0:this._downloadProgress(`Downloading Model...`,a));return this._downloadComplete(),this._appended=!0,this._processAndParent(e.scene),{root:e.scene,animations:e.animations||[]}}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{o?.release(),this._disposeGLTFLoader(i)}}appendObject3D(e,t=`object3d`){this._appended=!0;let n=this._adoptExternalObject(e);return n.name=e.name||t,this._processAndParent(n),{root:n}}removeModelRoot(e){e&&(e.userData.__rayzeeExternal?(Ne(e),e.parent?.remove(e)):Me(e))}async loadGLBFromArrayBuffer(e,t=`model.glb`){let n=await this.createGLTFLoader();try{H({isLoading:!0,status:`Processing GLB Data...`,progress:5}),await new Promise(e=>setTimeout(e,0));let r=await n.parseAsync(e,``);return this.releaseTargetModel(),this.targetModel=r.scene,this.animations=r.animations||[],this.sceneMetadata=Gw(r),H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r.scene,filename:t}),r}catch(e){throw console.error(`Error loading GLB:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}finally{this._disposeGLTFLoader(n)}}async loadFBXFromArrayBuffer(e,t=`model.fbx`){try{if(H({isLoading:!0,status:`Processing FBX Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.fbx){let{FBXLoader:e}=await import(`three/examples/jsm/loaders/FBXLoader.js`);this.loaderCache.fbx=new e}let n=this.loaderCache.fbx.parse(e);return this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading FBX:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadOBJFromFile(e,t=`model.obj`){try{if(H({isLoading:!0,status:`Processing OBJ Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.obj){let{OBJLoader:e}=await import(`three/examples/jsm/loaders/OBJLoader.js`);this.loaderCache.obj=new e}let n=await this.readFileAsText(e),r=this.loaderCache.obj.parse(n);return r.name=t,this.releaseTargetModel(),this.targetModel=r,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r,filename:t}),r}catch(e){throw console.error(`Error loading OBJ:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadSTLFromArrayBuffer(e,t=`model.stl`){try{if(H({isLoading:!0,status:`Processing STL Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.stl){let{STLLoader:e}=await import(`three/examples/jsm/loaders/STLLoader.js`);this.loaderCache.stl=new e}let n=new r.Mesh(this.loaderCache.stl.parse(e),new r.MeshStandardMaterial);return n.name=t,this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading STL:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadPLYFromArrayBuffer(e,t=`model.ply`){try{if(H({isLoading:!0,status:`Processing PLY Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.ply){let{PLYLoader:e}=await import(`three/examples/jsm/loaders/PLYLoader.js`);this.loaderCache.ply=new e}let n=this.loaderCache.ply.parse(e),i;if(n.index!==null)i=new r.Mesh(n,new r.MeshStandardMaterial);else{let e=new r.PointsMaterial({size:.01});e.vertexColors=n.hasAttribute(`color`),i=new r.Points(n,e)}return i.name=t,this.releaseTargetModel(),this.targetModel=i,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:i,filename:t}),i}catch(e){throw console.error(`Error loading PLY:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadColladaFromFile(e,t=`model.dae`){try{if(H({isLoading:!0,status:`Processing Collada Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.collada){let{ColladaLoader:e}=await import(`three/examples/jsm/loaders/ColladaLoader.js`);this.loaderCache.collada=new e}let n=await this.readFileAsText(e),r=this.loaderCache.collada.parse(n);return r.scene.name=t,this.releaseTargetModel(),this.targetModel=r.scene,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:r.scene,filename:t}),r}catch(e){throw console.error(`Error loading Collada:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async load3MFFromArrayBuffer(e,t=`model.3mf`){try{if(H({isLoading:!0,status:`Processing 3MF Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.threemf){let{ThreeMFLoader:e}=await import(`three/examples/jsm/loaders/3MFLoader.js`);this.loaderCache.threemf=new e}let n=this.loaderCache.threemf.parse(e);return this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading 3MF:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadUSDFromArrayBuffer(e,t=`model.usd`){try{if(H({isLoading:!0,status:`Processing USD Data...`,progress:5}),await new Promise(e=>setTimeout(e,0)),!this.loaderCache.usd){let{USDLoader:e}=await import(`three/examples/jsm/loaders/USDLoader.js`);this.loaderCache.usd=new e}let n=await new Promise((t,n)=>{this.loaderCache.usd.parse(e,``,t,n)});return n.name=t,this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}catch(e){throw console.error(`Error loading USD:`,e),this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadObject3D(e,t=`object3d`){this.releaseTargetModel();let n=this._adoptExternalObject(e);return n.name=e.name||t,this.targetModel=n,H({isLoading:!0,status:`Processing Data...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:t}),n}async onModelLoad(e){let t=new Sh(`onModelLoad`);t.start(`Camera extraction`);let n=this.extractCamerasFromModel(e);t.end(`Camera extraction`),t.start(`Camera setup`);let i=new r.Box3().setFromObject(e),a=i.getCenter(new r.Vector3),o=i.getSize(new r.Vector3);this.controls.target.copy(a);let s=Math.max(o.x,o.y,o.z),c=this.camera.fov*(Math.PI/180),l=Math.abs(s/Math.sin(c/2)/2),u=Math.PI/6,d=new r.Vector3(Math.cos(u)*l,l/Math.sqrt(2),Math.sin(u)*l);if(this.camera.position.copy(d.add(a)),this.camera.lookAt(a),this.camera.near=s/100,this.camera.far=s*100,this.camera.updateProjectionMatrix(),this.controls.maxDistance=l*10,this.controls.saveState(),this.controls.update(),t.end(`Camera setup`),this.floorPlane){let e=i.min.y;this.floorPlane.position.y=e,this.floorPlane.rotation.x=-Math.PI/2,this.floorPlane.scale.setScalar(s*5)}t.start(`Process model objects`),this.processModelObjects(e),t.end(`Process model objects`),t.start(`Scene add`),this.scene.add(e),t.end(`Scene add`);let f=s;return this.sceneSize.copy(o),t.start(`setupPathTracing`),await this.setupPathTracing(e,f),t.end(`setupPathTracing`),t.print(),this.dispatchEvent({type:`modelProcessed`,model:e,cameras:n,sceneData:{center:a,size:o,maxDim:s,sceneScale:f}}),this.dispatchEvent({type:`SceneRebuild`}),{center:a,size:o,maxDim:s,sceneScale:f}}extractCamerasFromModel(e){let t=[];return e.updateWorldMatrix(!0,!0),e.traverse(e=>{if(e.isCamera){let n=e.clone();n.userData.__rayzeeSourceUuid=e.uuid,e.getWorldPosition(n.position),e.getWorldQuaternion(n.quaternion),e.getWorldScale(n.scale),n.scale.set(Math.sign(n.scale.x)||1,Math.sign(n.scale.y)||1,Math.sign(n.scale.z)||1),(!n.name||n.name===``)&&(n.name=`Model Camera ${t.length+1}`),n.isPerspectiveCamera&&(n.aspect=this.camera.aspect,n.updateProjectionMatrix()),t.push(n)}}),t}processModelObjects(e){let t=[];e.traverse(e=>{let n=e.userData;if(e.isRectAreaLight&&!n.__radianceConverted&&(e.intensity*=$w(e,e.width,e.height,n),n.__radianceConverted=!0),(e.isPointLight||e.isSpotLight)&&!n.__candelaConverted&&(e.intensity*=4*Math.PI/Qw,n.__candelaConverted=!0),e.isDirectionalLight&&!n.__luxConverted&&(e.intensity/=Qw,n.__luxConverted=!0),e.name.startsWith(`RectAreaLightPlaceholder`)&&n.name&&n.type===`RectAreaLight`){let t=n.normalize??!0,i=n.shape??`rectangle`,a=n.intensity*$w(e,n.width,n.height,n),o=new r.RectAreaLight(new r.Color(...n.color),a*this._profile.areaLightIntensityScale,n.width,n.height);o.userData.normalize=t,o.userData.spread=Number.isFinite(n.spread)?n.spread:Math.PI,o.userData.shape=i,o.userData.__radianceConverted=!0,o.name=n.name,e.add(o)}e.isMesh&&Array.isArray(e.material)&&t.push(e)});let n=e.userData.__rayzeeExternal===!0;for(let e of t){if(!e.parent)continue;console.log(`Found multi-material mesh:`,e.name),n&&(e.geometry=Zw(e.geometry));let t=(0,d.createMeshesFromMultiMaterialMesh)(e);for(let e of t.children)e.geometry.userData.__rayzeeOwned=!0;e.parent.add(t),e.parent.remove(e)}}async setupPathTracing(e,t){this.sceneScale=t}createFloorPlane(){this.floorPlane=new r.Mesh(new r.CircleGeometry,new r.MeshPhysicalMaterial({transparent:!1,color:3158064,roughness:1,metalness:0,opacity:0,transmission:0})),this.floorPlane.name=`Ground`,this.floorPlane.visible=!1,this.scene.add(this.floorPlane)}setFloorPlane(e){this.floorPlane=e}getSceneScale(){return this.sceneScale}getSceneSize(){return this.sceneSize.clone()}getTargetModel(){return this.targetModel}getSupportedFormats(e=null){if(e){let t={};for(let[n,r]of Object.entries(Kw))r.type===e&&(t[n]=r);return t}return Kw}dispose(){for(let e in this.loaderCache){let t=this.loaderCache[e];t&&typeof t.dispose==`function`&&t.dispose()}this.loaderCache={},this._listeners=void 0,this._loadingManager.onError=void 0,this._issues=null,this._urlAbort?.abort(),this._urlAbort=null,this.storage=null,this._downloads=null,this._pendingGraph=null,this.releaseTargetModel()}removeAllEventListeners(){this._listeners=void 0}},tT=class extends r.PerspectiveCamera{constructor(e,t,n,r){super(e,t,n,r),this.orthographic=!1,this.orthoHalfHeight=1}get isPerspectiveCamera(){return!this.orthographic}set isPerspectiveCamera(e){}get isOrthographicCamera(){return this.orthographic}get top(){return this.orthoHalfHeight}get bottom(){return-this.orthoHalfHeight}get right(){return this.orthoHalfHeight*this.aspect}get left(){return-this.orthoHalfHeight*this.aspect}updateProjectionMatrix(){this.orthographic?r.OrthographicCamera.prototype.updateProjectionMatrix.call(this):super.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.orthographic=e.orthographic===!0,this.orthoHalfHeight=e.orthoHalfHeight??this.orthoHalfHeight,this}},nT=8,rT=4,iT=.25,aT=r.MathUtils.degToRad(89),oT=.25,sT={KeyD:[1,0,0],ArrowRight:[1,0,0],KeyA:[-1,0,0],ArrowLeft:[-1,0,0],KeyW:[0,1,0],ArrowUp:[0,1,0],KeyS:[0,-1,0],ArrowDown:[0,-1,0],KeyE:[0,0,1],KeyQ:[0,0,-1]},cT=`input, textarea, select, [contenteditable]:not([contenteditable="false"]), [role=textbox], [role=combobox], [role=listbox], [role=menu], [role=menuitem]`,lT=e=>e.shiftKey?rT:e.altKey?iT:1,uT={type:`change`},dT={type:`start`},fT=new r.Vector3,pT=new r.Vector3,mT=new r.Vector3,hT=new r.Vector3,gT=new r.Quaternion,_T=class extends r.Controls{constructor(e,t,n){super(e,t),this.orbit=n,this.enabled=!1,this.speed=1/nT,this._held=new Set,this._factor=1,this._lastTime=0,this._drag=null,this._onKeyDown=this._onKeyDown.bind(this),this._onKeyUp=this._onKeyUp.bind(this),this.release=this.release.bind(this),this._onPointerDown=this._onPointerDown.bind(this),this._onPointerMove=this._onPointerMove.bind(this),this._onPointerUp=this._onPointerUp.bind(this),t&&this.connect(t)}get active(){return this.enabled&&this.orbit.enabled}fitSpeed(e){this.speed=(e>0?e:1)/nT}connect(e){super.connect(e);let t=e.ownerDocument;t?.addEventListener(`keydown`,this._onKeyDown),t?.addEventListener(`keyup`,this._onKeyUp),t?.addEventListener(`visibilitychange`,this.release),t?.defaultView?.addEventListener(`blur`,this.release),e.addEventListener(`pointerdown`,this._onPointerDown),e.addEventListener(`pointermove`,this._onPointerMove),e.addEventListener(`pointerup`,this._onPointerUp),e.addEventListener(`pointercancel`,this._onPointerUp)}disconnect(){let e=this.domElement;if(!e)return;let t=e.ownerDocument;t?.removeEventListener(`keydown`,this._onKeyDown),t?.removeEventListener(`keyup`,this._onKeyUp),t?.removeEventListener(`visibilitychange`,this.release),t?.defaultView?.removeEventListener(`blur`,this.release),e.removeEventListener(`pointerdown`,this._onPointerDown),e.removeEventListener(`pointermove`,this._onPointerMove),e.removeEventListener(`pointerup`,this._onPointerUp),e.removeEventListener(`pointercancel`,this._onPointerUp)}dispose(){this.disconnect()}update(e=this._elapsed()){if(!this._held.size||!this.active)return!1;let t=0,n=0,r=0;for(let e of this._held){let[i,a,o]=sT[e];t+=i,n+=a,r+=o}if(!t&&!n&&!r)return!1;let i=this.object;return pT.set(1,0,0).applyQuaternion(i.quaternion),fT.crossVectors(i.up,pT).normalize(),pT.crossVectors(fT,i.up),mT.set(0,0,0).addScaledVector(pT,t).addScaledVector(fT,n).addScaledVector(i.up,r).normalize().multiplyScalar(this.speed*this._factor*e),i.position.add(mT),this.orbit.target.add(mT),i.updateMatrixWorld(),this.dispatchEvent(uT),!0}_elapsed(){let e=performance.now(),t=Math.min((e-this._lastTime)/1e3,oT);return this._lastTime=e,t}_look(e,t){let n=this.object,i=this.orbit.target,a=n.position.distanceTo(i)||1,o=r.MathUtils.degToRad(n.fov)/(this.domElement.clientHeight||1);n.quaternion.premultiply(gT.setFromAxisAngle(n.up,e*o)),n.getWorldDirection(fT);let s=Math.asin(r.MathUtils.clamp(fT.dot(n.up),-1,1)),c=r.MathUtils.clamp(s+t*o,-aT,aT);n.quaternion.multiply(gT.setFromAxisAngle(hT.set(1,0,0),c-s)),n.updateMatrixWorld(),i.copy(n.position).addScaledVector(n.getWorldDirection(fT),a),this.dispatchEvent(uT)}_onKeyDown(e){if(!(!this.active||e.defaultPrevented||e.target?.closest?.(cT))){if(e.metaKey||e.ctrlKey){this.release();return}this._factor=lT(e),sT[e.code]&&(e.preventDefault(),!this._held.has(e.code)&&(this._held.add(e.code),this._held.size===1&&(this._lastTime=performance.now(),this.dispatchEvent(dT))))}}_onKeyUp(e){this._factor=lT(e),this._held.delete(e.code)}release(){this._held.clear(),this._factor=1}_onPointerDown(e){!this.active||e.button!==0||!e.isPrimary||(this._drag={id:e.pointerId,x:e.clientX,y:e.clientY},this.domElement.setPointerCapture?.(e.pointerId))}_onPointerMove(e){let t=this._drag;if(!t||e.pointerId!==t.id)return;let n=e.clientX-t.x,r=e.clientY-t.y;t.x=e.clientX,t.y=e.clientY,this.active&&(n||r)&&this._look(n,r)}_onPointerUp(e){this._drag?.id===e.pointerId&&(this._drag=null,this.domElement.releasePointerCapture?.(e.pointerId))}};V();var vT=Object.freeze(new r.Vector3(1,1,1)),yT=e=>e?.isOrthographicCamera?(e.top-e.bottom)/e.zoom:null,bT=class extends r.EventDispatcher{constructor(e){super();let t=e.clientWidth,n=e.clientHeight;this.camera=new tT(60,t/n||1,.01,1e3),this.camera.position.set(0,0,5),this.controls=new h.OrbitControls(this.camera,e),this.controls.screenSpacePanning=!0,this.controls.zoomToCursor=!0,this.controls.saveState(),this._reportedOrthoHeight=null,this._reportOrthoHeight=this._reportOrthoHeight.bind(this),this.controls.addEventListener(`change`,this._reportOrthoHeight),this.walkControls=new _T(this.camera,e,this.controls),this.interactionManager=null,this.cameras=[this.camera],this.currentCameraIndex=0,this._userCameraCounter=0,this.autoFocusMode=ot.SMOOTHING_FACTOR?`auto`:`manual`,this.afScreenPoint={x:.5,y:.5},this.afSmoothingFactor=ot.SMOOTHING_FACTOR,this._lastValidFocusDistance=null,this._smoothedFocusDistance=null,this._afPointDirty=!1,this._afSuspended=!1,this._defaultCameraState=null,this._onResize=null,this._onReset=null,this._getSettings=null,this._applySettings=null}setCameras(e){this.cameras=e,this._userCameraCounter=0,this.resetAutoFocus()}addCameraFromView(e){let t=this.camera,n=t.orthographic?new r.OrthographicCamera(t.left,t.right,t.top,t.bottom,t.near,t.far):new r.PerspectiveCamera(t.fov,t.aspect,t.near,t.far);return n.zoom=t.zoom,n.position.copy(t.position),n.quaternion.copy(t.quaternion),n.scale.copy(t.scale),n.updateMatrixWorld(!0),n.userData.__rayzeeUserCamera=!0,n.userData.__rayzeeEffects=this._captureEffects(),this.controls&&(n.userData.__rayzeeOrbitTarget=this.controls.target.clone()),this._userCameraCounter+=1,n.name=e||`View Camera ${this._userCameraCounter}`,this.cameras.push(n),this.cameras.length-1}removeCamera(e){if(!Number.isInteger(e)||e<=0||e>=this.cameras.length||!this.cameras[e]?.userData?.__rayzeeUserCamera)return!1;let t=this.currentCameraIndex===e;return this.cameras.splice(e,1),t?(this.currentCameraIndex=-1,this.switchCamera(0)):this.currentCameraIndex>e&&--this.currentCameraIndex,!0}getCameraNames(){return!this.cameras||this.cameras.length===0?[`Default Camera`]:this.cameras.map((e,t)=>t===0?`Default Camera`:e.name||`Camera ${t}`)}initCallbacks({onResize:e,onReset:t,getSettings:n,applySettings:r}){this._onResize=e,this._onReset=t,this._getSettings=n,this._applySettings=r}_captureEffects(){let e=this._getSettings;return e?{enableDOF:e(`enableDOF`),focusDistance:e(`focusDistance`),aperture:e(`aperture`),focalLength:e(`focalLength`),apertureScale:e(`apertureScale`),anamorphicRatio:e(`anamorphicRatio`),dofBlur:e(`dofBlur`),autoFocusMode:this.autoFocusMode,afScreenPoint:{...this.afScreenPoint},orthoHeight:this.orthoHeight}:null}_applyEffects(e){e&&(this._applySettings?.({enableDOF:e.enableDOF,focusDistance:e.focusDistance,aperture:e.aperture,focalLength:e.focalLength,apertureScale:e.apertureScale,anamorphicRatio:e.anamorphicRatio,dofBlur:e.dofBlur}),e.autoFocusMode!==void 0&&this.setAutoFocusMode(e.autoFocusMode),e.afScreenPoint&&this.setAFScreenPoint(e.afScreenPoint.x,e.afScreenPoint.y))}switchCamera(e,t,n,i){if(t??=this._getSettings?.(`focusDistance`),n??=this._onResize,i??=this._onReset,!this.cameras||this.cameras.length===0)return;(e<0||e>=this.cameras.length)&&(console.warn(`CameraManager: Invalid camera index ${e}. Using default camera.`),e=0);let a=this.cameras[this.currentCameraIndex];if(a&&(a.userData.__rayzeeEffects=this._captureEffects()),this.currentCameraIndex===0&&e!==0&&(this._defaultCameraState={position:this.camera.position.clone(),quaternion:this.camera.quaternion.clone(),scale:this.camera.scale.clone(),fov:this.camera.fov,near:this.camera.near,far:this.camera.far,target:this.controls?this.controls.target.clone():null}),this.currentCameraIndex=e,e===0&&this._defaultCameraState){let e=this._defaultCameraState;this.camera.position.copy(e.position),this.camera.quaternion.copy(e.quaternion),this.camera.scale.copy(e.scale??vT),this.camera.fov=e.fov,this.camera.near=e.near,this.camera.far=e.far,this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(!0),this.controls&&e.target&&(this.controls.target.copy(e.target),this.controls.update())}else{let n=this.cameras[e];if(this.camera.position.copy(n.position),this.camera.quaternion.copy(n.quaternion),this.camera.scale.copy(n.scale),n.isPerspectiveCamera&&(this.camera.fov=n.fov),this.camera.near=n.near,this.camera.far=n.far,this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(!0),this.controls){let e=n.userData?.__rayzeeOrbitTarget;if(e)this.controls.target.copy(e);else{let e=new r.Vector3(0,0,-1).applyQuaternion(n.quaternion),i=t||5;this.controls.target.copy(this.camera.position).addScaledVector(e,i)}this.controls.update()}}this.resetAutoFocus();let o=this.cameras[e],s=o?.userData?.__rayzeeEffects;this._showOrthographic(s?s.orthoHeight:yT(o)),this._applyEffects(s),n?.(),i?.(),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:e,effects:this._captureEffects(),fov:this.camera.fov,cameraProjection:this._getSettings?.(`cameraProjection`)})}_showOrthographic(e){e>0?this._setView(!0,e/2):this._setView(!1);let t=this._getSettings?.(`cameraProjection`),n=e>0?`orthographic`:t===`orthographic`?`perspective`:t;n!==t&&this._applySettings?.({cameraProjection:n})}applyProjection(e){let t=this.camera,n=e===`orthographic`;if(t.orthographic!==n){if(n)this._setView(!0,this._fittedHalfHeight());else{let e=this.controls.target,n=this.orthoHeight/2/Math.tan(r.MathUtils.degToRad(t.fov)/2);t.position.sub(e).setLength(n).add(e),this._setView(!1)}this.controls.update()}}get orthoHeight(){return yT(this.camera)}setOrthoHeight(e){e>0&&(this._setView(this.camera.orthographic,e/2),this._onReset?.())}fitOrthographic(){this.camera.orthographic&&this.setOrthoHeight(2*this._fittedHalfHeight())}_setView(e,t=this.camera.orthoHalfHeight){let n=this.camera;n.orthographic=e,n.orthoHalfHeight=t,n.zoom=1,n.updateProjectionMatrix(),this._reportOrthoHeight()}_fittedHalfHeight(){return this.camera.position.distanceTo(this.controls.target)*Math.tan(r.MathUtils.degToRad(this.camera.fov)/2)}_reportOrthoHeight(){if(!this.camera.orthographic)return;let e=this.orthoHeight;e!==this._reportedOrthoHeight&&(this._reportedOrthoHeight=e,this.dispatchEvent({type:B.ORTHO_HEIGHT_UPDATED,height:e}))}focusOn(e){!e||!this.controls||(this.controls.target.copy(e),this.controls.update(),this._onReset?.())}setNavigationMode(e){let t=e===`walk`;if(this.walkControls.enabled===t)return;let n=this.controls;if(n.enableRotate=n.enablePan=n.enableZoom=!t,this.walkControls.enabled=t,t)return;this.walkControls.release();let i=this.interactionManager?.pickSurface(0,0);if(!i)return;let a=r.MathUtils.clamp(i.distance,n.minDistance,n.maxDistance);n.target.copy(this.camera.position).addScaledVector(this.camera.getWorldDirection(new r.Vector3),a),n.update()}get navigationMode(){return this.walkControls.enabled?`walk`:`orbit`}updateControls(){this.walkControls.update(),this.controls.update()}captureView(){let e=this.camera,t=this.orthoHeight??2*this._fittedHalfHeight();return{position:e.position.clone(),target:this.controls.target.clone(),fov:e.fov,orthoHeight:t}}applyPose(e){let t=this.camera;t.position.copy(e.position),t.lookAt(e.target),this.controls.target.copy(e.target),t.orthographic?this._setView(!0,e.orthoHeight/2):(t.fov=e.fov,t.updateProjectionMatrix()),t.updateMatrixWorld()}serialize(){let e=this.camera,t=this._defaultCameraState;return{current:this.currentCameraIndex,view:{position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),fov:e.fov,near:e.near,far:e.far,zoom:e.zoom,orthographic:!!e.orthographic,orthoHalfHeight:e.orthoHalfHeight,target:this.controls.target.toArray()},defaultView:t?{position:t.position.toArray(),quaternion:t.quaternion.toArray(),scale:t.scale.toArray(),fov:t.fov,near:t.near,far:t.far,target:t.target?.toArray()??null}:null,navigationMode:this.navigationMode,autoFocus:{mode:this.autoFocusMode,point:{...this.afScreenPoint}},cameras:this.cameras.map((e,t)=>{let n={index:t,name:e.name??``,effects:Kr(e.userData?.__rayzeeEffects)??null};return t===0||!e.userData?.__rayzeeUserCamera?n:{...n,user:!0,orthographic:!!e.isOrthographicCamera,frustum:e.isOrthographicCamera?[e.left,e.right,e.top,e.bottom]:null,fov:e.fov??null,aspect:e.aspect??null,near:e.near,far:e.far,zoom:e.zoom,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),orbitTarget:e.userData.__rayzeeOrbitTarget?.toArray()??null}})}}restore(e){let t=[];if(!e)return{mismatched:t};this.cameras=this.cameras.filter(e=>!e.userData?.__rayzeeUserCamera);let n=new Map;for(let i of e.cameras??[]){if(i.user){let e=i.orthographic?new r.OrthographicCamera(...i.frustum,i.near,i.far):new r.PerspectiveCamera(i.fov,i.aspect,i.near,i.far);e.name=i.name,e.zoom=i.zoom??1,e.position.fromArray(i.position),e.quaternion.fromArray(i.quaternion),e.scale.fromArray(i.scale),e.updateProjectionMatrix(),e.updateMatrixWorld(!0),e.userData.__rayzeeUserCamera=!0,e.userData.__rayzeeEffects=qr(i.effects),i.orbitTarget&&(e.userData.__rayzeeOrbitTarget=new r.Vector3().fromArray(i.orbitTarget)),n.set(i.index,this.cameras.length),this.cameras.push(e);continue}let e=this.cameras[i.index];if(!e||i.index>0&&(e.name??``)!==i.name){t.push(i.name);continue}n.set(i.index,i.index),i.effects&&(e.userData.__rayzeeEffects=qr(i.effects))}this._userCameraCounter=this.cameras.filter(e=>e.userData?.__rayzeeUserCamera).length,this.currentCameraIndex=n.get(e.current)??0;let i=e.defaultView;this._defaultCameraState=i?{position:new r.Vector3().fromArray(i.position),quaternion:new r.Quaternion().fromArray(i.quaternion),scale:new r.Vector3().fromArray(i.scale),fov:i.fov,near:i.near,far:i.far,target:i.target?new r.Vector3().fromArray(i.target):null}:null,e.navigationMode&&this.setNavigationMode(e.navigationMode);let a=e.view;if(a){let e=this.camera;e.position.fromArray(a.position),e.quaternion.fromArray(a.quaternion),e.scale.fromArray(a.scale),e.fov=a.fov,e.near=a.near,e.far=a.far,this._setView(a.orthographic,a.orthoHalfHeight),e.zoom=a.zoom??1,e.updateProjectionMatrix(),e.updateMatrixWorld(!0),this.controls.target.fromArray(a.target),this.controls.update()}return e.autoFocus&&(this.setAutoFocusMode(e.autoFocus.mode),this.setAFScreenPoint(e.autoFocus.point.x,e.autoFocus.point.y)),this.resetAutoFocus(),this._reportOrthoHeight(),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:this.currentCameraIndex,effects:this._captureEffects(),fov:this.camera.fov,cameraProjection:this._getSettings?.(`cameraProjection`)}),{mismatched:t}}get active(){return this.camera}getNames(){return this.getCameraNames()}setAutoFocusMode(e){this.autoFocusMode=e,e!==`manual`&&(this._smoothedFocusDistance=null,this._afPointDirty=!0)}resetAutoFocus(){this._lastValidFocusDistance=null,this._smoothedFocusDistance=null,this._afPointDirty=!0}setAFScreenPoint(e,t){this.afScreenPoint={x:e,y:t},this._afPointDirty=!0}enterAFPointPlacementMode(){this.interactionManager&&(this.interactionManager.enterAFPointPlacementMode(),this.controls&&(this.controls.enabled=!1))}exitAFPointPlacementMode(){this.interactionManager&&(this.interactionManager.exitAFPointPlacementMode(),this.controls&&(this.controls.enabled=!0))}updateAutoFocus(e){let t=e||this._afContext;if(!t||!this.interactionManager)return;let{assetLoader:n,currentFocusDistance:r,pathTracer:i,setFocusDistance:a,softReset:o,hardReset:s}=t;if(this.autoFocusMode===`manual`)return;if(!i?.enableDOF?.value||i.cameraProjection?.value===Ke.equirectangular){this._afSuspended=!0;return}this._afSuspended&&(this._afSuspended=!1,this._smoothedFocusDistance=null);let c=i;if(c?.isReady&&c.renderMode?.value===1&&c.frameCount>0&&!c.isComplete)return;let l=this.interactionManager.pickSurface(this.afScreenPoint.x*2-1,1-this.afScreenPoint.y*2),u;if(l)u=Pb(l.point,this.camera),this._lastValidFocusDistance=u;else if(this._lastValidFocusDistance!==null)u=this._lastValidFocusDistance;else{let e=this.controls?Pb(this.controls.target,this.camera):0;u=e>0?e:ot.FALLBACK_DISTANCE*(n?.getSceneScale()||1),this._lastValidFocusDistance=u}let d=this._afPointDirty;this._afPointDirty=!1,d||this._smoothedFocusDistance===null||this._smoothedFocusDistance===0||Math.abs(u-this._smoothedFocusDistance)/this._smoothedFocusDistance>ot.SNAP_THRESHOLD?this._smoothedFocusDistance=u:this._smoothedFocusDistance+=this.afSmoothingFactor*(u-this._smoothedFocusDistance);let f=r,p=this._smoothedFocusDistance;if(d||f===0||Math.abs(p-f)/Math.max(f,.001)>.001){a(p);let e=n?.getSceneScale()||1;this.dispatchEvent({type:B.AUTO_FOCUS_UPDATED,distance:p/e,worldDistance:p});let t=Math.abs(p-f)/Math.max(f,.001);d?s?.():t>ot.RESET_THRESHOLD&&o?.()}}setInteractionManager(e){this.interactionManager=e}initAutoFocus({assetLoader:e,pathTracer:t,settings:n,softReset:r,hardReset:i}){this._afContext={assetLoader:e,pathTracer:t,setFocusDistance:e=>n.set(`focusDistance`,e,{silent:!0}),softReset:r,hardReset:i},Object.defineProperty(this._afContext,`currentFocusDistance`,{get:()=>n.get(`focusDistance`)})}dispose(){this.walkControls?.dispose(),this.controls?.removeEventListener(`change`,this._reportOrthoHeight),this.controls?.dispose()}},xT=.001,ST=2,CT=(e,t,n,i)=>new e(t,n,i,r.InterpolateSmooth).createInterpolant(),wT=class{constructor(e,t){this._cameraManager=e,this._onChange=t,this.keys=[],this._nextId=1,this._interpolants=null}get animates(){return this.keys.length>1}get duration(){return this.keys.length?this.keys[this.keys.length-1].time:0}addKey(e=this.keys.length?this.duration+ST:0){return this.add(this._cameraManager.captureView(),e)}updateKey(e){this.update(e,this._cameraManager.captureView())}seek(e){let t=this.sample(e);return t&&this._cameraManager.applyPose(t),!!t}add(e,t){let n={id:this._nextId++,time:t,...TT(e)};return this.keys.push(n),this._changed(),n}update(e,t){let n=this.get(e);n&&(Object.assign(n,TT(t)),this._changed())}setTime(e,t){let n=this.get(e);!n||!(t>=0)||(n.time=t,this._changed())}remove(e){let t=this.keys.length;this.keys=this.keys.filter(t=>t.id!==e),this.keys.length!==t&&this._changed()}clear(){this.keys.length&&(this.keys=[],this._changed())}serialize(){return this.keys.map(({time:e,position:t,target:n,fov:r,orthoHeight:i})=>({time:e,position:t.toArray(),target:n.toArray(),fov:r,orthoHeight:i}))}restore(e){this.keys=(e??[]).map(e=>({id:this._nextId++,time:e.time,position:new r.Vector3().fromArray(e.position),target:new r.Vector3().fromArray(e.target),fov:e.fov,orthoHeight:e.orthoHeight})),this._changed()}dispose(){this._cameraManager=this._onChange=null}get(e){return this.keys.find(t=>t.id===e)}sample(e,t={position:new r.Vector3,target:new r.Vector3,fov:0,orthoHeight:0}){if(!this.keys.length)return null;let{position:n,target:i,fov:a,logHeight:o,start:s,end:c}=this._interpolants??=this._build(),l=r.MathUtils.clamp(e,s,c);return t.position.fromArray(n.evaluate(l)),t.target.fromArray(i.evaluate(l)),t.fov=a.evaluate(l)[0],t.orthoHeight=Math.exp(o.evaluate(l)[0]),t}_build(){let e=[];for(let t of this.keys)e.push(e.length?Math.max(t.time,e[e.length-1]+xT):t.time);let t=e[0],n=e[e.length-1],i=this.keys;if(i.length>1){let r=i.length;e.unshift(2*t-e[1]),e.push(2*n-e[r-1]),i=[i[1],...i,i[r-2]]}let a=e=>i.flatMap(t=>e(t).toArray());return{start:t,end:n,position:CT(r.VectorKeyframeTrack,`.position`,e,a(e=>e.position)),target:CT(r.VectorKeyframeTrack,`.target`,e,a(e=>e.target)),fov:CT(r.NumberKeyframeTrack,`.fov`,e,i.map(e=>e.fov)),logHeight:CT(r.NumberKeyframeTrack,`.orthoHeight`,e,i.map(e=>Math.log(e.orthoHeight)))}}_changed(){this.keys.sort((e,t)=>e.time-t.time),this._interpolants=null,this._onChange?.()}};function TT({position:e,target:t,fov:n,orthoHeight:r}){return{position:e.clone(),target:t.clone(),fov:n,orthoHeight:r}}V();var ET=class extends r.EventDispatcher{constructor({cameraManager:e,onReset:t}){super(),this._cameraManager=e,this._onReset=t,this.camera=new wT(e,()=>this._changed(`camera`)),this._playback=null,this._timer=new r.Timer,typeof document<`u`&&this._timer.connect(document)}get duration(){return this.camera.duration}get animates(){return this.camera.animates}seek(e){return this.camera.seek(e)}play(){return this.stop(),new Promise(e=>{let t=this._cameraManager.controls;this._playback={elapsed:0,resolve:e,controlsEnabled:t.enabled},t.enabled=!1,this._timer.reset(),this._changed(),this._onReset?.()})}stop(){let e=this._playback;e&&(this._playback=null,this._cameraManager.controls.enabled=e.controlsEnabled,this._changed(),e.resolve())}get isPlaying(){return!!this._playback}update(){let e=this._playback;if(!e)return;this._timer.update(),e.elapsed+=this._timer.getDelta();let t=r.MathUtils.clamp(e.elapsed,0,this.duration);this.seek(t),t>=this.duration&&this.stop()}serialize(){return{camera:this.camera.serialize()}}restore(e){this.stop(),this.camera.restore(e?.camera)}clear(){this.stop(),this.camera.clear()}dispose(){this.stop(),this._timer.dispose(),this.camera.dispose(),this._cameraManager=this._onReset=null}_changed(e){this.dispatchEvent({type:B.TIMELINE_CHANGED,track:e})}},DT=`__rayzeeUserLight`,OT={DirectionalLight:r.DirectionalLight,PointLight:r.PointLight,SpotLight:r.SpotLight,RectAreaLight:r.RectAreaLight},kT=class extends r.EventDispatcher{constructor(e,t,n,r={}){super(),this.scene=e,this.sceneHelpers=t,this.pathTracer=n,this._onReset=r.onReset||null,this._onLightRemoved=r.onLightRemoved||null}addLight(e){let t={DirectionalLight:{position:[1,1,1],intensity:1,color:`#ffffff`},PointLight:{position:[0,2,0],intensity:1e3,color:`#ffffff`},SpotLight:{position:[0,1,0],intensity:1e3,color:`#ffffff`,angle:15},RectAreaLight:{position:[0,2,0],intensity:100,color:`#ffffff`,width:2,height:2}}[e];if(!t)return null;let n;if(e===`DirectionalLight`)n=new r.DirectionalLight(t.color,t.intensity),n.position.fromArray(t.position);else if(e===`PointLight`)n=new r.PointLight(t.color,t.intensity),n.position.fromArray(t.position);else if(e===`SpotLight`){n=new r.SpotLight(t.color,t.intensity),n.position.fromArray(t.position),n.angle=r.MathUtils.degToRad(t.angle);let e=new r.Object3D;this.scene.add(e),n.target=e}else e===`RectAreaLight`&&(n=new r.RectAreaLight(t.color,t.intensity,t.width,t.height),n.position.fromArray(t.position),n.lookAt(0,0,0),n.userData.normalize=!0,n.userData.spread=Math.PI,n.userData.shape=`rectangle`);n.userData[DT]=!0,n.userData.temperature=6500,n.userData.useTemperature=!1,n.userData.exposure=0;let i=this.scene.getObjectsByProperty(`isLight`,!0).length;return n.name=`${e.replace(`Light`,``)} ${i+1}`,this.scene.add(n),this.updateLights(),this._syncHelpers(),this._onReset?.(),this._buildDescriptor(n)}removeLight(e){let t=this.scene.getObjectByProperty(`uuid`,e);return!t||!t.isLight?!1:(this._onLightRemoved?.(t),this.sceneHelpers.remove(t),t.target&&t.target.removeFromParent(),t.removeFromParent(),this.updateLights(),this._onReset?.(),!0)}clearLights(){this.sceneHelpers.clear(),this._removeAllLights(),this.updateLights(),this._onReset?.()}getLights(){return this.scene.getObjectsByProperty(`isLight`,!0).map(e=>this._buildDescriptor(e))}updateLights(){this.pathTracer?.updateLights(),this.sceneHelpers?.visible&&this.sceneHelpers.update()}transferSceneLights(e,{keepUserLights:t=!1}={}){this._removeAllLights(t?e=>!e.userData?.[DT]:void 0);let n=e.getObjectsByProperty(`isLight`,!0);if(!n||n.length===0){this.updateLights();return}for(let e of n){let t=e.clone();if(e.updateWorldMatrix(!0,!1),e.getWorldPosition(t.position),e.getWorldQuaternion(t.quaternion),e.getWorldScale(t.scale),t.isRectAreaLight&&(t.width*=t.scale.x,t.height*=t.scale.y,t.scale.set(1,1,1)),(e.isSpotLight||e.isDirectionalLight)&&e.target){let n=new r.Object3D;e.target.updateWorldMatrix(!0,!1),e.target.getWorldPosition(n.position),this.scene.add(n),t.target=n}this.scene.add(t)}this.updateLights(),this._syncHelpers()}setShowLightHelper(e){this.sceneHelpers.visible=e,e?this._syncHelpers():this.sceneHelpers.clear()}serialize(){return this.scene.getObjectsByProperty(`isLight`,!0).map(e=>{let t={type:e.type,name:e.name,visible:e.visible,color:[e.color.r,e.color.g,e.color.b],intensity:e.intensity,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray(),userData:Kr(e.userData)??{}};return e.isSpotLight&&Object.assign(t,{angle:e.angle,penumbra:e.penumbra,distance:e.distance,decay:e.decay}),e.isPointLight&&Object.assign(t,{distance:e.distance,decay:e.decay}),e.isRectAreaLight&&Object.assign(t,{width:e.width,height:e.height}),e.target&&(e.isSpotLight||e.isDirectionalLight)&&(t.target=e.target.position.toArray()),t})}restore(e){this.sceneHelpers?.clear(),this._removeAllLights();let t=[];for(let n of e??[]){let e=OT[n.type];if(!e)continue;let i=new e;i.name=n.name??``,i.visible=n.visible!==!1,i.color.setRGB(...n.color),i.intensity=n.intensity,i.position.fromArray(n.position),i.quaternion.fromArray(n.quaternion),i.scale.fromArray(n.scale??[1,1,1]),i.userData=qr(n.userData)??{};for(let e of[`angle`,`penumbra`,`distance`,`decay`,`width`,`height`])typeof n[e]==`number`&&(i[e]=n[e]);if(n.target){let e=new r.Object3D;e.position.fromArray(n.target),this.scene.add(e),i.target=e}this.scene.add(i),t.push(i)}return this.updateLights(),this._syncHelpers(),this._onReset?.(),t}add(e){return this.addLight(e)}remove(e){return this.removeLight(e)}clear(){this.clearLights()}getAll(){return this.getLights()}sync(){this.updateLights()}showHelpers(e){this.setShowLightHelper(e)}dispose(){this._disposed||(this._disposed=!0,this._onLightRemoved=null,this.sceneHelpers?.clear(),this._removeAllLights(),this._onReset=null,this.pathTracer=null,this.sceneHelpers=null,this.scene=null)}_removeAllLights(e){this.scene.getObjectsByProperty(`isLight`,!0).filter(t=>!e||e(t)).forEach(e=>{this._onLightRemoved?.(e),e.target&&this.scene.remove(e.target),this.scene.remove(e)})}_syncHelpers(){if(!this.sceneHelpers.visible)return;let e=this.scene.getObjectsByProperty(`isLight`,!0);this.sceneHelpers.sync(e)}_buildDescriptor(e){let t=0;e.type===`SpotLight`&&e.angle!==void 0?t=r.MathUtils.radToDeg(e.angle):e.type===`DirectionalLight`&&(t=r.MathUtils.radToDeg(e.userData?.angle??0));let n={uuid:e.uuid,name:e.name,type:e.type,visible:e.visible,intensity:e.intensity,color:`#${e.color.getHexString()}`,position:[e.position.x,e.position.y,e.position.z],angle:t,temperature:e.userData?.temperature??6500,useTemperature:e.userData?.useTemperature??!1,exposure:e.userData?.exposure??0};if(e.type===`RectAreaLight`){n.width=e.width,n.height=e.height,n.normalize=e.userData?.normalize??!0,n.spread=r.MathUtils.radToDeg(e.userData?.spread??Math.PI);let t=e.userData?.shape;n.shape=t===`square`||t===`rectangle`||t===`disk`||t===`ellipse`?t:t===1?`ellipse`:`rectangle`;let i=e.getWorldDirection(e.position.clone());n.target=[e.position.x+i.x,e.position.y+i.y,e.position.z+i.z]}else e.type===`SpotLight`&&e.target?(n.target=[e.target.position.x,e.target.position.y,e.target.position.z],n.distance=e.distance??0,n.penumbra=e.penumbra??0,n.decay=e.decay??2):e.type===`PointLight`&&(n.distance=e.distance??0,n.decay=e.decay??2);return(e.type===`SpotLight`||e.type===`DirectionalLight`)&&e.userData?.gobo&&(n.gobo=e.userData.gobo.name,n.goboIntensity=e.userData.gobo.intensity,n.goboInverted=!!e.userData.gobo.inverted,e.type===`DirectionalLight`&&(n.goboScale=e.userData.gobo.scale??5)),e.type===`SpotLight`&&e.userData?.ies&&(n.ies=e.userData.ies.name,n.iesIntensity=e.userData.ies.intensity??1,n.fixtureLumens=e.userData.ies.fixtureLumens??null),n}},AT=class{constructor(e,t={}){this.pathTracer=e,this._onReset=t.onReset||null,this.texture=null,this.entries=[],this._size=256}async loadLibrary(e,{size:t=256}={}){if(!Array.isArray(e)||e.length===0)return[];this._size=t;let n=await Promise.all(e.map(e=>jT(e.url))),i=t,a=t,o=n.length,s=new Uint8Array(i*a*o*4),c=document.createElement(`canvas`);c.width=i,c.height=a;let l=c.getContext(`2d`,{willReadFrequently:!0});for(let e=0;e<o;e++){l.clearRect(0,0,i,a),l.drawImage(n[e],0,0,i,a);let t=l.getImageData(0,0,i,a);s.set(t.data,e*i*a*4)}let u=new r.DataArrayTexture(s,i,a,o);u.minFilter=r.LinearFilter,u.magFilter=r.LinearFilter,u.format=r.RGBAFormat,u.type=r.UnsignedByteType,u.generateMipmaps=!1,u.needsUpdate=!0;let d=this.texture;return this.texture=u,this.entries=e.map((e,t)=>({name:e.name,index:t})),this.pathTracer.goboMaps=u,this.pathTracer.shaderBuilder?.updateGoboMaps?.(u),d?.dispose?.(),this.entries}getEntries(){return this.entries.slice()}setLightGobo(e,t,n={}){let{intensity:r=1,inverted:i=!1,scale:a=5}=n,o=this._findGoboLight(e);if(!o)return!1;if(o.userData=o.userData||{},t==null)delete o.userData.gobo;else{let e=this.entries.find(e=>e.name===t);if(!e)return console.warn(`GoboManager: unknown gobo "${t}"`),!1;o.userData.gobo={name:e.name,index:e.index,intensity:MT(r),inverted:!!i,scale:Math.max(1e-4,a)}}return this.pathTracer.updateLights(),this._onReset?.(),!0}setLightGoboInverted(e,t){let n=this._findGoboLight(e);return n?.userData?.gobo?(n.userData.gobo.inverted=!!t,this.pathTracer.updateLights(),this._onReset?.(),!0):!1}setLightGoboScale(e,t){let n=this._findGoboLight(e);return n?.userData?.gobo?(n.userData.gobo.scale=Math.max(1e-4,t),this.pathTracer.updateLights(),this._onReset?.(),!0):!1}getLightGobo(e){return this._findGoboLight(e)?.userData?.gobo||null}setSpotLightGobo(e,t,n=1,r=!1){return this.setLightGobo(e,t,{intensity:n,inverted:r})}setSpotLightGoboInverted(e,t){return this.setLightGoboInverted(e,t)}getSpotLightGobo(e){return this.getLightGobo(e)}dispose(){this.texture?.dispose?.(),this.texture=null,this.entries=[],this.pathTracer=null,this._onReset=null}_findGoboLight(e){let t=this.pathTracer?.scene?.getObjectByProperty?.(`uuid`,e);return t&&(t.isSpotLight||t.isDirectionalLight)?t:null}_findSpotLight(e){let t=this.pathTracer?.scene?.getObjectByProperty?.(`uuid`,e);return t&&t.isSpotLight?t:null}};async function jT(e){let t=await jg(e);try{return await new Promise((n,r)=>{let i=new Image;i.crossOrigin=`anonymous`,i.onload=()=>n(i),i.onerror=()=>r(Error(`Failed to load gobo image: ${e}`)),i.src=t.url})}finally{t.release()}}function MT(e){return Math.max(0,Math.min(1,e))}function NT(e,t=`ies`){let n=e.search(/TILT\s*=/i);if(n<0)throw Error(`IES (${t}): missing TILT line`);let r=e.indexOf(`
|
|
972
972
|
`,n);if(r<0)throw Error(`IES (${t}): truncated TILT line`);let i=e.slice(n,r).match(/TILT\s*=\s*(\w+)/i),a=i?i[1].toUpperCase():`NONE`,o=e.slice(r);if(a===`INCLUDE`){let e=LT(o),t=2+2*Number(e[1]);o=RT(o,t)}let s=LT(o),c=0,l=()=>Number(s[c++]),u=l(),d=l(),f=l(),p=l(),m=l(),h=l();l(),l(),l(),l();let g=l();if(l(),l(),!Number.isFinite(p)||p<=0)throw Error(`IES (${t}): invalid vertical angle count ${p}`);if(!Number.isFinite(m)||m<=0)throw Error(`IES (${t}): invalid horizontal angle count ${m}`);let _=Array(p);for(let e=0;e<p;e++)_[e]=l();let v=Array(m);for(let e=0;e<m;e++)v[e]=l();let y=Array(p);for(let e=0;e<p;e++)y[e]=new Float32Array(m);let b=f*g,x=0;for(let e=0;e<m;e++)for(let t=0;t<p;t++){let n=l()*b;y[t][e]=n,n>x&&(x=n)}return{verticalAngles:_,horizontalAngles:v,candela:y,maxCandela:x,lumens:d*u,photometricType:h,name:t}}function PT(e,t,n){let r=new Uint8Array(t*n),{verticalAngles:i,horizontalAngles:a,candela:o,maxCandela:s}=e;if(s<=0)return r;let c=i[i.length-1],l=a[a.length-1],u=a[0],d=a.length===1||l===u;for(let e=0;e<n;e++){let f=(e+.5)/n*c,p=zT(i,f),m=Math.min(p+1,i.length-1),h=i[m]-i[p],g=h>0?(f-i[p])/h:0;for(let n=0;n<t;n++){let i;if(d)i=BT(o[p][0],o[m][0],g);else{let e=u+(n+.5)/t*(l-u),r=zT(a,e),s=Math.min(r+1,a.length-1),c=a[s]-a[r],d=c>0?(e-a[r])/c:0,f=o[p][r],h=o[p][s],_=o[m][r],v=o[m][s];i=BT(BT(f,h,d),BT(_,v,d),g)}let c=Math.min(1,Math.max(0,i/s));r[e*t+n]=Math.round(c*255)}}return r}function FT(e,t=.1){let{verticalAngles:n,horizontalAngles:r,candela:i,maxCandela:a}=e,o=Math.PI/4;if(a<=0||!n?.length)return o;let s=a*t,c=r.length,l=n[n.length-1],u=!1;for(let e=0;e<n.length;e++){let t=0;for(let n=0;n<c;n++)t+=i[e][n];if(t/=c,t>=s&&(u=!0),u&&t<s){l=n[e];break}}let d=l*Math.PI/180;return Math.min(Math.max(d,5*Math.PI/180),89*Math.PI/180)}function IT(e,t,n=.7){let{verticalAngles:r,horizontalAngles:i,candela:a,maxCandela:o}=e;if(o<=0||!r?.length||t<=0)return 0;let s=o*n,c=i.length,l=0;for(let e=0;e<r.length;e++){let t=0;for(let n=0;n<c;n++)t+=a[e][n];if(t/=c,t>=s)l=r[e];else break}let u=t*180/Math.PI,d=u>0?1-l/u:0;return Math.min(Math.max(d,0),1)}function LT(e){return e.split(/\s+/).filter(e=>e.length>0)}function RT(e,t){let n=/\S+/g,r=0;for(;n.exec(e)!==null;)if(r++,r===t)return e.slice(n.lastIndex);return``}function zT(e,t){if(t<=e[0])return 0;if(t>=e[e.length-1])return e.length-1;let n=0,r=e.length-1;for(;r-n>1;){let i=n+r>>1;e[i]<=t?n=i:r=i}return n}function BT(e,t,n){return e+(t-e)*n}var VT=class{constructor(e,t={}){this.pathTracer=e,this._onReset=t.onReset||null,this.texture=null,this.entries=[],this._gridWidth=128,this._gridHeight=128}async loadLibrary(e,{gridWidth:t=128,gridHeight:n=128}={}){if(!Array.isArray(e)||e.length===0)return[];this._gridWidth=t,this._gridHeight=n;let i=(await Promise.all(e.map(async e=>{try{let{file:r,release:i}=await Ag().fetch(e.url),a=NT(await r.text().finally(i),e.name);return{it:e,profile:a,grid:PT(a,t,n)}}catch(t){return console.warn(`IESManager: failed to load "${e.name}": ${t.message}`),null}}))).filter(e=>e!==null);if(i.length===0)return[];let a=i.length,o=t*n,s=new Uint8Array(o*4*a),c=[];for(let e=0;e<a;e++){let t=i[e].grid,n=e*o*4;for(let e=0;e<o;e++){let r=t[e];s[n+e*4+0]=r,s[n+e*4+1]=r,s[n+e*4+2]=r,s[n+e*4+3]=255}let r=i[e].profile,a=FT(r);c.push({name:i[e].it.name,index:e,maxCandela:r.maxCandela,photometricType:r.photometricType,suggestedAngle:a,suggestedPenumbra:IT(r,a),lumens:r.lumens})}let l=new r.DataArrayTexture(s,t,n,a);l.format=r.RGBAFormat,l.type=r.UnsignedByteType,l.minFilter=r.LinearFilter,l.magFilter=r.LinearFilter,l.generateMipmaps=!1,l.needsUpdate=!0;let u=this.texture;return this.texture=l,this.entries=c,this.pathTracer.iesProfiles=l,this.pathTracer.shaderBuilder?.updateIESProfiles?.(l),u?.dispose?.(),this.entries.map(({name:e,index:t})=>({name:e,index:t}))}getEntries(){return this.entries.slice()}setSpotLightProfile(e,t,n=1,{applyAutoCone:r=!0}={}){let i=this._findSpotLight(e),a={applied:!1,suggestedAngle:null,suggestedPenumbra:null,suggestedDecay:null,fixtureLumens:null};if(!i)return a;i.userData=i.userData||{};let o=null,s=null,c=null,l=null;if(t==null)delete i.userData.ies;else{let e=this.entries.find(e=>e.name===t);if(!e)return console.warn(`IESManager: unknown profile "${t}"`),a;l=Number.isFinite(e.lumens)?e.lumens:null,i.userData.ies={name:e.name,index:e.index,intensity:HT(n),fixtureLumens:l},r&&(Number.isFinite(e.suggestedAngle)&&(i.angle=e.suggestedAngle,o=e.suggestedAngle),Number.isFinite(e.suggestedPenumbra)&&(i.penumbra=e.suggestedPenumbra,s=e.suggestedPenumbra),i.decay=2,c=2)}return this.pathTracer.updateLights(),this._onReset?.(),{applied:!0,suggestedAngle:o,suggestedPenumbra:s,suggestedDecay:c,fixtureLumens:l}}getSpotLightProfile(e){return this._findSpotLight(e)?.userData?.ies||null}dispose(){this.texture?.dispose?.(),this.texture=null,this.entries=[],this.pathTracer=null,this._onReset=null}_findSpotLight(e){let t=this.pathTracer?.scene?.getObjectByProperty?.(`uuid`,e);return t&&t.isSpotLight?t:null}};function HT(e){return Math.max(0,Math.min(1,e))}rn(),Js();var UT=Wt(`oidn`),WT=16,GT=null;async function KT(){return GT||=(await import(`oidn-web`)).initUNetFromBuffer,GT}var qT={QUALITY_MODELS:{fast:{model:`rt_hdr_alb_nrm_small`,cleanAux:!1},"fast-clean":{model:`rt_hdr_calb_cnrm_small`,cleanAux:!0},balance:{model:`rt_hdr_calb_cnrm`,cleanAux:!0},high:{model:`rt_hdr_calb_cnrm_large`,cleanAux:!0}},DEFAULT_OPTIONS:{enableOIDN:!0,oidnQuality:`fast`,tileSize:1024}},JT=.18,YT=256,XT=256,ZT=`
|
|
973
973
|
const WG: u32 = ${YT}u;
|
|
974
974
|
const GROUPS: u32 = ${XT}u;
|
|
@@ -1352,7 +1352,7 @@ fn main( @builtin(global_invocation_id) gid: vec3<u32> ) {
|
|
|
1352
1352
|
let b8 = rayzee_to_u8( rayzee_encode( mapped, params.mode ) );
|
|
1353
1353
|
dst[ gid.y * params.width + gid.x ] = b8.x | ( b8.y << 8u ) | ( b8.z << 16u ) | ( 255u << 24u );
|
|
1354
1354
|
}
|
|
1355
|
-
`,NE=32,PE=class{constructor(e,t=`rayzee:tonemap`){this.device=e,this.label=t,this.width=0,this.height=0,this._pipeline=null,this._storage=null,this._map=null,this._params=null,this._paramData=new ArrayBuffer(NE),this._paramU32=new Uint32Array(this._paramData),this._paramF32=new Float32Array(this._paramData),this._shaderVersion=-1,this._bindings=[],this._tables=new Map,this.disposed=!1}_ensurePipeline(){let{wgsl:e,bindings:t,version:n}=kE();this._pipeline&&this._shaderVersion===n||(this._bindings=t,this._shaderVersion=n,this._pipeline=this.device.createComputePipeline({label:this.label,layout:`auto`,compute:{module:this.device.createShaderModule({label:this.label,code:ME(e)}),entryPoint:`main`}}))}_ensureTables(){let e=new Set;for(let{index:t,transform:n}of this._bindings){let{data:r,size:i}=n.table;e.add(t);let a=this._tables.get(t);if(a&&a.data===r)continue;a?.texture.destroy();let o=this.device.createTexture({label:`${this.label}-${n.wgslConst}`,size:[i,i,i],dimension:`3d`,format:`rgba16float`,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});this.device.queue.writeTexture({texture:o},r,{bytesPerRow:i*8,rowsPerImage:i},[i,i,i]),this._tables.set(t,{texture:o,data:r,view:o.createView()})}for(let[t,n]of this._tables)e.has(t)||(n.texture.destroy(),this._tables.delete(t))}ensureSize(e,t){if(this._ensurePipeline(),this._ensureTables(),this.width===e&&this.height===t&&this._storage)return;this._releaseBuffers();let n=e*t*4;this._storage=this.device.createBuffer({label:`${this.label}-out`,size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._map=this.device.createBuffer({label:`${this.label}-map`,size:n,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._params=this.device.createBuffer({label:`${this.label}-params`,size:NE,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.width=e,this.height=t}async toRGBA8(e,{exposure:t=1,toneMapping:n=0,saturation:r=1,flipY:i=!1}={}){if(this.disposed)throw Error(`PackedToneMapper: disposed`);if(!this._storage)throw Error(`PackedToneMapper: call ensureSize() first`);this._ensurePipeline(),this._ensureTables();let{width:a,height:o}=this;this._paramU32[0]=a,this._paramU32[1]=o,this._paramU32[2]=n>>>0,this._paramU32[3]=+!!i,this._paramF32[4]=t,this._paramF32[5]=r,this.device.queue.writeBuffer(this._params,0,this._paramData);let s=[...this._tables.entries()].map(([e,t])=>({binding:e,resource:t.view})),c=this.device.createBindGroup({layout:this._pipeline.getBindGroupLayout(0),entries:[...s,{binding:0,resource:{buffer:e,size:a*o*8}},{binding:1,resource:{buffer:this._storage}},{binding:2,resource:{buffer:this._params}}]}),l=this.device.createCommandEncoder({label:this.label}),u=l.beginComputePass();u.setPipeline(this._pipeline),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(a/8),Math.ceil(o/8)),u.end(),l.copyBufferToBuffer(this._storage,0,this._map,0,a*o*4),this.device.queue.submit([l.finish()]),await this._map.mapAsync(GPUMapMode.READ);let d=new Uint8ClampedArray(this._map.getMappedRange().slice(0));return this._map.unmap(),d}_releaseBuffers(){this._storage?.destroy(),this._map?.destroy(),this._params?.destroy(),this._storage=null,this._map=null,this._params=null}dispose(){if(!this.disposed){this.disposed=!0,this._releaseBuffers();for(let e of this._tables.values())e.texture.destroy();this._tables.clear(),this._pipeline=null}}}})),IE=b({NeuralSuperRes:()=>ZE,SR_MAX_INPUT:()=>qE,SR_SCALE:()=>2,presentRGBA8:()=>WE,readDenoisedHalf:()=>BE,releaseDenoisedReader:()=>zE,renderUpscaled:()=>HE});function LE(){if(JE)return JE;let{neuralRuntimeUrl:e,neuralAssetBaseUrl:t}=Ks();return t?(globalThis.__NEURAL_ASSET_BASE__=t,JE=new Promise((t,n)=>{if(globalThis.NeuralRuntime?.getNativeSR)return t(globalThis.NeuralRuntime.getNativeSR());let r=document.createElement(`script`);r.src=e,r.onload=()=>{let e=globalThis.NeuralRuntime?.getNativeSR;if(!e)return n(Error(`Neural runtime loaded but exposed no super-resolution entry`));t(e())},r.onerror=()=>n(Error(`Failed to load the neural runtime from ${e}`)),document.head.appendChild(r)}),JE):Promise.reject(Error(`No neural model location: set neuralAssetBaseUrl with configureAssets()`))}function RE(e,t,n){if(XE&&(XE.device!==e||XE.width!==t||XE.height!==n)&&zE(),XE)return XE;let r=t*n*8;return XE={device:e,width:t,height:n,storage:e.createBuffer({label:`rayzee:neural-sr-pack`,size:r,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),map:e.createBuffer({label:`rayzee:neural-sr-pack-map`,size:r,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),pipeline:e.createComputePipeline({label:`rayzee:neural-sr-pack`,layout:`auto`,compute:{module:e.createShaderModule({label:`rayzee:neural-sr-pack`,code:YE}),entryPoint:`main`}})},XE}function zE(){XE?.storage.destroy(),XE?.map.destroy(),XE=null}async function BE(e){let t=e?._outGPUTexture;if(!t)throw Error(`NeuralSuperRes: no denoised frame — enable OIDN and finish a render first`);let n=e.gpuDevice,{width:r,height:i}=e._outTexSize,a=RE(n,r,i),o=n.createBindGroup({layout:a.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:t.createView()},{binding:1,resource:{buffer:a.storage}}]}),s=n.createCommandEncoder({label:`rayzee:neural-sr-pack`}),c=s.beginComputePass();c.setPipeline(a.pipeline),c.setBindGroup(0,o),c.dispatchWorkgroups(Math.ceil(r/8),Math.ceil(i/8)),c.end(),s.copyBufferToBuffer(a.storage,0,a.map,0,r*i*8),n.queue.submit([s.finish()]),await a.map.mapAsync(GPUMapMode.READ);let l=new Uint16Array(a.map.getMappedRange().slice(0));return a.map.unmap(),{half:l,width:r,height:i}}function VE(e,t,n){return new Promise((r,i)=>{let a=!1,o=(t,n)=>{a||(a=!0,e.removeEventListener(B.DENOISING_END,c),clearInterval(l),clearTimeout(u),t?r():i(n))},s=!1,c=()=>{(e.stages?.pathTracer?.frameCount??0)>=t&&(s=!0)};e.addEventListener(B.DENOISING_END,c);let l=setInterval(()=>{s&&o(!0)},200),u=setTimeout(()=>o(!1,Error(`NeuralSuperRes: timed out waiting for the render to finish`)),n)})}async function HE(e,{outputWidth:t,outputHeight:n,samples:r=64,upscaler:i=null,timeoutMs:a=6e5,present:o=!0,onProgress:s=()=>{}}={}){if(t%2||n%2)throw Error(`renderUpscaled: output must be divisible by 2, got ${t}x${n}`);let c=t/2,l=n/2,u=e.stages?.pathTracer,d={width:u?.width,height:u?.height,maxSamples:e.settings?.get?.(`maxSamples`),finalDenoise:e.denoisingManager?.finalDenoise,paused:e.pauseRendering},f=!i,p=i,m={};try{if(!p){let e=performance.now();s(`Loading the super-resolution model`),p=await ZE.create({width:c,height:l,onProgress:s}),m.load=performance.now()-e}else if(p.inputWidth!==c||p.inputHeight!==l)throw Error(`renderUpscaled: upscaler is ${p.inputWidth}x${p.inputHeight}, need ${c}x${l}`);let i=performance.now();s(`Tracing ${c}x${l} at ${r} spp`),e.pauseRendering=!1,e.setCanvasSize(c,l),await new Promise(e=>setTimeout(e,300)),e.denoisingManager.applyOIDNEnabled(!0),e.settings.set(`maxSamples`,r);let u=VE(e,r,a);e.reset(),await u,e.pauseRendering=!0,m.render=performance.now()-i,s(`Reading the denoised frame`);let d=performance.now(),f=await BE(e.denoisingManager?.denoiser);m.read=performance.now()-d,s(`Upscaling to ${t}x${n}`);let h={exposure:e.renderer.toneMappingExposure,toneMapping:e.renderer.toneMapping,saturation:e.settings.get(`saturation`)??1},{rgba8:g,width:_,height:v,ms:y,toneMs:b}=await p.upscaleToRGBA8(f,h);return m.upscale=y,m.tonemap=b,o&&UE(e.denoisingManager?.upscalerCanvas,g,_,v),{rgba8:g,width:_,height:v,timings:m,upscaler:p}}catch(e){throw f&&p?.dispose(),e}finally{d.width&&d.height&&e.setCanvasSize(d.width,d.height),d.maxSamples!==void 0&&e.settings?.set?.(`maxSamples`,d.maxSamples),d.finalDenoise!==void 0&&e.denoisingManager?.applyOIDNEnabled(d.finalDenoise),e.pauseRendering=d.paused}}function UE(e,t,n,r){return e?(e.width=n,e.height=r,e.getContext(`2d`).putImageData(new ImageData(new Uint8ClampedArray(t.buffer??t),n,r),0,0),e.style.display=`block`,!0):!1}function WE(e,t,n,r){return UE(e,t,n,r)}var GE,KE,qE,JE,YE,XE,ZE,QE=y((()=>{
|
|
1355
|
+
`,NE=32,PE=class{constructor(e,t=`rayzee:tonemap`){this.device=e,this.label=t,this.width=0,this.height=0,this._pipeline=null,this._storage=null,this._map=null,this._params=null,this._paramData=new ArrayBuffer(NE),this._paramU32=new Uint32Array(this._paramData),this._paramF32=new Float32Array(this._paramData),this._shaderVersion=-1,this._bindings=[],this._tables=new Map,this.disposed=!1}_ensurePipeline(){let{wgsl:e,bindings:t,version:n}=kE();this._pipeline&&this._shaderVersion===n||(this._bindings=t,this._shaderVersion=n,this._pipeline=this.device.createComputePipeline({label:this.label,layout:`auto`,compute:{module:this.device.createShaderModule({label:this.label,code:ME(e)}),entryPoint:`main`}}))}_ensureTables(){let e=new Set;for(let{index:t,transform:n}of this._bindings){let{data:r,size:i}=n.table;e.add(t);let a=this._tables.get(t);if(a&&a.data===r)continue;a?.texture.destroy();let o=this.device.createTexture({label:`${this.label}-${n.wgslConst}`,size:[i,i,i],dimension:`3d`,format:`rgba16float`,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST});this.device.queue.writeTexture({texture:o},r,{bytesPerRow:i*8,rowsPerImage:i},[i,i,i]),this._tables.set(t,{texture:o,data:r,view:o.createView()})}for(let[t,n]of this._tables)e.has(t)||(n.texture.destroy(),this._tables.delete(t))}ensureSize(e,t){if(this._ensurePipeline(),this._ensureTables(),this.width===e&&this.height===t&&this._storage)return;this._releaseBuffers();let n=e*t*4;this._storage=this.device.createBuffer({label:`${this.label}-out`,size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._map=this.device.createBuffer({label:`${this.label}-map`,size:n,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._params=this.device.createBuffer({label:`${this.label}-params`,size:NE,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.width=e,this.height=t}async toRGBA8(e,{exposure:t=1,toneMapping:n=0,saturation:r=1,flipY:i=!1}={}){if(this.disposed)throw Error(`PackedToneMapper: disposed`);if(!this._storage)throw Error(`PackedToneMapper: call ensureSize() first`);this._ensurePipeline(),this._ensureTables();let{width:a,height:o}=this;this._paramU32[0]=a,this._paramU32[1]=o,this._paramU32[2]=n>>>0,this._paramU32[3]=+!!i,this._paramF32[4]=t,this._paramF32[5]=r,this.device.queue.writeBuffer(this._params,0,this._paramData);let s=[...this._tables.entries()].map(([e,t])=>({binding:e,resource:t.view})),c=this.device.createBindGroup({layout:this._pipeline.getBindGroupLayout(0),entries:[...s,{binding:0,resource:{buffer:e,size:a*o*8}},{binding:1,resource:{buffer:this._storage}},{binding:2,resource:{buffer:this._params}}]}),l=this.device.createCommandEncoder({label:this.label}),u=l.beginComputePass();u.setPipeline(this._pipeline),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(a/8),Math.ceil(o/8)),u.end(),l.copyBufferToBuffer(this._storage,0,this._map,0,a*o*4),this.device.queue.submit([l.finish()]),await this._map.mapAsync(GPUMapMode.READ);let d=new Uint8ClampedArray(this._map.getMappedRange().slice(0));return this._map.unmap(),d}_releaseBuffers(){this._storage?.destroy(),this._map?.destroy(),this._params?.destroy(),this._storage=null,this._map=null,this._params=null}dispose(){if(!this.disposed){this.disposed=!0,this._releaseBuffers();for(let e of this._tables.values())e.texture.destroy();this._tables.clear(),this._pipeline=null}}}})),IE=b({NeuralSuperRes:()=>ZE,SR_MAX_INPUT:()=>qE,SR_SCALE:()=>2,presentRGBA8:()=>WE,readDenoisedHalf:()=>BE,releaseDenoisedReader:()=>zE,renderUpscaled:()=>HE});function LE(){if(JE)return JE;let{neuralRuntimeUrl:e,neuralAssetBaseUrl:t}=Ks();return t?(globalThis.__NEURAL_ASSET_BASE__=t,JE=new Promise((t,n)=>{if(globalThis.NeuralRuntime?.getNativeSR)return t(globalThis.NeuralRuntime.getNativeSR());let r=document.createElement(`script`);r.src=e,r.onload=()=>{let e=globalThis.NeuralRuntime?.getNativeSR;if(!e)return n(Error(`Neural runtime loaded but exposed no super-resolution entry`));t(e())},r.onerror=()=>n(Error(`Failed to load the neural runtime from ${e}`)),document.head.appendChild(r)}),JE):Promise.reject(Error(`No neural model location: set neuralAssetBaseUrl with configureAssets()`))}function RE(e,t,n){if(XE&&(XE.device!==e||XE.width!==t||XE.height!==n)&&zE(),XE)return XE;let r=t*n*8;return XE={device:e,width:t,height:n,storage:e.createBuffer({label:`rayzee:neural-sr-pack`,size:r,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),map:e.createBuffer({label:`rayzee:neural-sr-pack-map`,size:r,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),pipeline:e.createComputePipeline({label:`rayzee:neural-sr-pack`,layout:`auto`,compute:{module:e.createShaderModule({label:`rayzee:neural-sr-pack`,code:YE}),entryPoint:`main`}})},XE}function zE(){XE?.storage.destroy(),XE?.map.destroy(),XE=null}async function BE(e){let t=e?._outGPUTexture;if(!t)throw Error(`NeuralSuperRes: no denoised frame — enable OIDN and finish a render first`);let n=e.gpuDevice,{width:r,height:i}=e._outTexSize,a=RE(n,r,i),o=n.createBindGroup({layout:a.pipeline.getBindGroupLayout(0),entries:[{binding:0,resource:t.createView()},{binding:1,resource:{buffer:a.storage}}]}),s=n.createCommandEncoder({label:`rayzee:neural-sr-pack`}),c=s.beginComputePass();c.setPipeline(a.pipeline),c.setBindGroup(0,o),c.dispatchWorkgroups(Math.ceil(r/8),Math.ceil(i/8)),c.end(),s.copyBufferToBuffer(a.storage,0,a.map,0,r*i*8),n.queue.submit([s.finish()]),await a.map.mapAsync(GPUMapMode.READ);let l=new Uint16Array(a.map.getMappedRange().slice(0));return a.map.unmap(),{half:l,width:r,height:i}}function VE(e,t,n){return new Promise((r,i)=>{let a=!1,o=(t,n)=>{a||(a=!0,e.removeEventListener(B.DENOISING_END,c),clearInterval(l),clearTimeout(u),t?r():i(n))},s=!1,c=()=>{(e.stages?.pathTracer?.frameCount??0)>=t&&(s=!0)};e.addEventListener(B.DENOISING_END,c);let l=setInterval(()=>{s&&o(!0)},200),u=setTimeout(()=>o(!1,Error(`NeuralSuperRes: timed out waiting for the render to finish`)),n)})}async function HE(e,{outputWidth:t,outputHeight:n,samples:r=64,upscaler:i=null,timeoutMs:a=6e5,present:o=!0,onProgress:s=()=>{}}={}){if(t%2||n%2)throw Error(`renderUpscaled: output must be divisible by 2, got ${t}x${n}`);let c=t/2,l=n/2,u=e.stages?.pathTracer,d={width:u?.width,height:u?.height,maxSamples:e.settings?.get?.(`maxSamples`),finalDenoise:e.denoisingManager?.finalDenoise,paused:e.pauseRendering},f=!i,p=i,m={};try{if(!p){let e=performance.now();s(`Loading the super-resolution model`),p=await ZE.create({width:c,height:l,onProgress:s}),m.load=performance.now()-e}else if(p.inputWidth!==c||p.inputHeight!==l)throw Error(`renderUpscaled: upscaler is ${p.inputWidth}x${p.inputHeight}, need ${c}x${l}`);let i=performance.now();s(`Tracing ${c}x${l} at ${r} spp`),e.pauseRendering=!1,e.setCanvasSize(c,l),await new Promise(e=>setTimeout(e,300)),e.denoisingManager.applyOIDNEnabled(!0),e.settings.set(`maxSamples`,r);let u=VE(e,r,a);e.reset(),await u,e.pauseRendering=!0,m.render=performance.now()-i,s(`Reading the denoised frame`);let d=performance.now(),f=await BE(e.denoisingManager?.denoiser);m.read=performance.now()-d,s(`Upscaling to ${t}x${n}`);let h={exposure:e.renderer.toneMappingExposure,toneMapping:e.renderer.toneMapping,saturation:e.settings.get(`saturation`)??1},{rgba8:g,width:_,height:v,ms:y,toneMs:b}=await p.upscaleToRGBA8(f,h);return m.upscale=y,m.tonemap=b,o&&UE(e.denoisingManager?.upscalerCanvas,g,_,v),{rgba8:g,width:_,height:v,timings:m,upscaler:p}}catch(e){throw f&&p?.dispose(),e}finally{d.width&&d.height&&e.setCanvasSize(d.width,d.height),d.maxSamples!==void 0&&e.settings?.set?.(`maxSamples`,d.maxSamples),d.finalDenoise!==void 0&&e.denoisingManager?.applyOIDNEnabled(d.finalDenoise),e.pauseRendering=d.paused}}function UE(e,t,n,r){return e?(e.width=n,e.height=r,e.getContext(`2d`).putImageData(new ImageData(new Uint8ClampedArray(t.buffer??t),n,r),0,0),e.style.display=`block`,!0):!1}function WE(e,t,n,r){return UE(e,t,n,r)}var GE,KE,qE,JE,YE,XE,ZE,QE=y((()=>{V(),rn(),FE(),Js(),GE=2,KE=Wt(`neural`),qE=2048,JE=null,YE=`
|
|
1356
1356
|
@group(0) @binding(0) var src: texture_2d<f32>;
|
|
1357
1357
|
@group(0) @binding(1) var<storage, read_write> dst: array<u32>;
|
|
1358
1358
|
|
|
@@ -1392,4 +1392,4 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
1392
1392
|
dst[a] = pack2x16float(c.rg);
|
|
1393
1393
|
dst[a + 1u] = pack2x16float(vec2<f32>(c.b, 1.0));
|
|
1394
1394
|
}
|
|
1395
|
-
`,uD=class e{constructor(e,t){this.chain=e,this.canvas=t,this.slot=0,this.source=null,this.staging=null,this._readbackPipeline=null,this._readbackStorage=null,this._readbackMap=null,this._hdrPipeline=null,this._hdrStorage=null,this._hdrMap=null,this._toneMapper=null,this.disposed=!1}get device(){return this.chain.device}get width(){return this.chain.pipeline.geometry.validWidth}get height(){return this.chain.pipeline.geometry.validHeight}static async create({width:t,height:n,canvas:r=null,settings:i={},onProgress:a=()=>{}}){if(!Number.isInteger(t)||!Number.isInteger(n)||t<1||n<1)throw Error(`NeuralRetouch.create: width and height must be positive integers`);if(t*n>4194304)throw Error(`NeuralRetouch.create: ${t}x${n} is ${(t*n/1e6).toFixed(1)} MP, above the ${(aD/1e6).toFixed(1)} MP this pass survives. Past it the run takes minutes and then loses every GPU device in the page.`);let o=r??document.createElement(`canvas`);r||(o.style.cssText=`position:fixed;left:-10000px;top:0;pointer-events:none`);let s=new e(await(await tD()).create(o,t,n,a,eD(i).runtime),o);return s._allocate(),s}_allocate(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry;this.source=this.device.createBuffer({label:`rayzee:retouch-source`,size:e*t*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.staging=new Uint16Array(e*t*4);let n=e*t*4;this._readbackStorage=this.device.createBuffer({label:`rayzee:retouch-readback`,size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._readbackMap=this.device.createBuffer({label:`rayzee:retouch-readback-map`,size:n,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._readbackPipeline=this.device.createComputePipeline({label:`rayzee:retouch-readback`,layout:`auto`,compute:{module:this.device.createShaderModule({code:cD}),entryPoint:`main`}});let r=e*t*8;this._hdrStorage=this.device.createBuffer({label:`rayzee:retouch-hdr`,size:r,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._hdrMap=this.device.createBuffer({label:`rayzee:retouch-hdr-map`,size:r,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._hdrPipeline=this.device.createComputePipeline({label:`rayzee:retouch-hdr`,layout:`auto`,compute:{module:this.device.createShaderModule({code:lD}),entryPoint:`main`}})}async _packHDR(e,t,n=!1){let r=this.chain.pipeline.slots[this.slot]?.hdrOutput;if(!r)throw Error("NeuralRetouch: the runtime has no scene-referred output. Either no frame has been produced yet, or neural-runtime.js was re-vendored without its `rayzee-patch` edits.");let i=this.device.createBindGroup({layout:this._hdrPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:r.createView()},{binding:1,resource:{buffer:this._hdrStorage}}]}),a=this.device.createCommandEncoder({label:`rayzee:retouch-hdr`}),o=a.beginComputePass();o.setPipeline(this._hdrPipeline),o.setBindGroup(0,i),o.dispatchWorkgroups(Math.ceil(e/8),Math.ceil(t/8)),o.end(),n&&a.copyBufferToBuffer(this._hdrStorage,0,this._hdrMap,0,e*t*8),this.device.queue.submit([a.finish()])}async readOutputHDR(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry;await this._packHDR(e,t,!0),await this._hdrMap.mapAsync(GPUMapMode.READ);let n=new Uint16Array(this._hdrMap.getMappedRange().slice(0));return this._hdrMap.unmap(),{half:n,width:e,height:t}}async readOutputToned(e){let{validWidth:t,validHeight:n}=this.chain.pipeline.geometry;return await this._packHDR(t,n),this._toneMapper??=new PE(this.device,`rayzee:retouch-tonemap`),this._toneMapper.ensureSize(t,n),{rgba8:await this._toneMapper.toRGBA8(this._hdrStorage,{exposure:e.exposure??1,toneMapping:e.toneMapping??0,saturation:e.saturation??1}),width:t,height:n}}async readOutput(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry,n=this.chain.pipeline.slots[this.slot]?.output;if(!n)throw Error(`NeuralRetouch.readOutput: the pass has not produced a frame yet`);let r=this.device.createBindGroup({layout:this._readbackPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:n.createView()},{binding:1,resource:{buffer:this._readbackStorage}}]}),i=this.device.createCommandEncoder({label:`rayzee:retouch-readback`}),a=i.beginComputePass();a.setPipeline(this._readbackPipeline),a.setBindGroup(0,r),a.dispatchWorkgroups(Math.ceil(e/8),Math.ceil(t/8)),a.end(),i.copyBufferToBuffer(this._readbackStorage,0,this._readbackMap,0,e*t*4),this.device.queue.submit([i.finish()]),await this._readbackMap.mapAsync(GPUMapMode.READ);let o=new Uint8ClampedArray(this._readbackMap.getMappedRange().slice(0));return this._readbackMap.unmap(),o}dispose(){if(!this.disposed){this.disposed=!0,this.source?.destroy(),this._readbackStorage?.destroy(),this._readbackMap?.destroy(),this._hdrStorage?.destroy(),this._hdrMap?.destroy(),this._toneMapper?.dispose();try{this.chain.destroy()}catch(e){iD.warn(`retouch teardown:`,e)}}}},dD=20}));Ce(),rn();var pD=Wt(`neural`),mD=120,hD=2,gD=1,_D=0,vD=300,yD=5,bD=3,xD=3,SD=16,CD=e=>Math.max(0,1-e/SD),wD=class extends r.EventDispatcher{constructor({renderer:e,mainCanvas:t,stages:n,pipeline:i,getExposure:a,getSaturation:o}){super(),this.renderer=e,this.mainCanvas=t,this.upscalerCanvas=this._createUpscalerCanvas(t),this.pipeline=i,this._stages=n,this._getExposure=a,this._getSaturation=o,this.denoiser=null,this.upscaler=null,this.upscalerBackend=`esrgan`,this._neuralUpscaler=null,this.neuralRendering=!1,this.neuralRenderingSettings={},this._retouch=null,this._superResModule=null,this._neuralPostBusy=!1,this._finalQuality=U.oidnQuality,this.finalDenoise=U.enableOIDN,this.continuousDenoise=U.continuousDenoise,this.continuousDenoiseInterval=U.continuousDenoiseInterval,this._lastCadenceAt=-1/0,this._lastCadenceSamples=0,this._failedRefreshes=0,this._cadenceSuspended=!1,this._movingDenoiseMs=[],this._movingHopeless=!1,this._holdWhileMoving=null,this._onReset=null,this._onPostProcessRefresh=null,this._onDisplayRefresh=null,this.temporalHistory=U.oidnTemporalHistory,this._history=null,this._historyDirty=!0,this._knownResetCount=0,this._seenTracedFrames=0,this._viewProj=new r.Matrix4,this._historyCamera={world:null,projInv:null,viewProj:null,orthographic:!1},this._movedPlacements=new Map,this._movedUpload={count:0,leaves:new Uint32Array,toPrev:new Float32Array},this._matA=new r.Matrix4,this._matB=new r.Matrix4,this._lastRenderWidth=0,this._lastRenderHeight=0,this._pendingStartUpscaler=null,this._pendingCloseDenoise=null,this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._denoiserTileHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null}_createUpscalerCanvas(e){let t=e.parentNode;if(!t)return null;let n=document.createElement(`canvas`);return n.width=e.width,n.height=e.height,n.style.position=`absolute`,n.style.inset=`0`,n.style.width=`100%`,n.style.height=`100%`,n.style.display=`none`,t.insertBefore(n,e),n}setRenderSize(e,t){this._lastRenderWidth=e,this._lastRenderHeight=t,this._cadenceDowngraded=!1,this._holdWhileMoving=null,this._movingDenoiseMs.length=0,this._movingHopeless=!1,this._historyDirty=!0,this.denoiser?.abort(),this._unpublishOutput(),this.denoiser?.setSize(e,t),this.upscalerCanvas&&(this.upscalerCanvas.width!==e||this.upscalerCanvas.height!==t)&&(this.upscalerCanvas.width=e,this.upscalerCanvas.height=t),this.upscaler?.setBaseSize(e,t),this._syncGBufferStages()}restoreBaseResolution(){return!this.upscalerCanvas||!this._lastRenderWidth||!this._lastRenderHeight||!(this.upscalerCanvas.width!==this._lastRenderWidth||this.upscalerCanvas.height!==this._lastRenderHeight)?!1:(this.upscalerCanvas.width=this._lastRenderWidth,this.upscalerCanvas.height=this._lastRenderHeight,!0)}setupDenoiser(){if(!this.upscalerCanvas)return;let e=this._stages.pathTracer;this.denoiser=new iE(this.renderer,{...U,backendParams:()=>({device:this.renderer.backend.device,adapterInfo:null}),getGPUTextures:({continuous:t=!1}={})=>{if(!e?.storageTextures?.readTarget)return null;let n=t?this._historyTextures():null;if(n)return n;let r=e.storageTextures.getReadTextures(),{backend:i}=this.renderer;return{color:i.get(r.color).texture,normal:i.get(r.normalDepth).texture,albedo:i.get(r.albedo).texture}}}),this._syncOIDNInUse(),this._denoiserStartHandler=e=>this.dispatchEvent({type:B.DENOISING_START,continuous:!!e.continuous}),this._denoiserEndHandler=e=>{this.denoiser?.hasOutput&&this._publishOutput(),this.dispatchEvent({type:B.DENOISING_END,continuous:!!e.continuous})},this._denoiserTileHandler=e=>{if(e.continuous)return;this._publishOutput();let t=this.pipeline?.context;this._stages.compositor&&t&&this._stages.compositor.render(t)},this.denoiser.addEventListener(`start`,this._denoiserStartHandler),this.denoiser.addEventListener(`end`,this._denoiserEndHandler),this.denoiser.addEventListener(`tileProgress`,this._denoiserTileHandler)}setupUpscaler(){if(!this.upscalerCanvas)return;let e=this._stages.pathTracer;this.upscaler=new OE(this.upscalerCanvas,this.renderer,{scaleFactor:U.upscalerScale||2,quality:U.upscalerQuality||`fast`,getSourceCanvas:()=>this.renderer.domElement,refreshInput:()=>{let e=this.pipeline?.context;this._stages.compositor&&e&&this._stages.compositor.render(e)},getGPUTextures:()=>{if(!e?.storageTextures?.readTarget)return null;let t=e.storageTextures.getReadTextures();return{color:this.renderer.backend.get(t.color).texture}},getExposure:()=>this._getEffectiveExposure(),getToneMapping:()=>this._getToneMapping(),getSaturation:()=>this._getSaturation()}),this.upscaler.enabled=U.enableUpscaler||!1,this._upscalerResChangedHandler=e=>this.dispatchEvent({type:`resolution_changed`,width:e.width,height:e.height}),this._upscalerStartHandler=()=>this.dispatchEvent({type:B.UPSCALING_START}),this._upscalerProgressHandler=e=>this.dispatchEvent({type:B.UPSCALING_PROGRESS,progress:e.progress}),this._upscalerEndHandler=()=>this.dispatchEvent({type:B.UPSCALING_END}),this.upscaler.addEventListener(`resolution_changed`,this._upscalerResChangedHandler),this.upscaler.addEventListener(`start`,this._upscalerStartHandler),this.upscaler.addEventListener(`progress`,this._upscalerProgressHandler),this.upscaler.addEventListener(`end`,this._upscalerEndHandler)}get denoiserStrategy(){return this.continuousDenoise?`oidn`:this._stages.asvgf?.enabled?`asvgf`:this._stages.nrd?.enabled?`nrd`:this._stages.edgeFilter?.enabled?`edgeaware`:`none`}setDenoiserStrategy(e,t){let n=this._stages;switch(n.asvgf&&(n.asvgf.enabled=!1),n.nrd&&(n.nrd.enabled=!1),n.variance&&(n.variance.enabled=!1),n.bilateralFilter&&(n.bilateralFilter.enabled=!1),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!1),this._clearDenoiserTextures(),this.setContinuousDenoise(e===`oidn`),e){case`asvgf`:n.asvgf.enabled=!0,n.variance&&(n.variance.enabled=!0),n.bilateralFilter&&(n.bilateralFilter.enabled=!0),n.asvgf.setTemporalEnabled?.(!0),this._applyASVGFPreset(t||`medium`);break;case`nrd`:n.nrd&&(n.nrd.enabled=!0,n.nrd.resetHistory?.(),this._applyNRDPreset(t||`medium`));break;case`edgeaware`:n.variance&&(n.variance.enabled=!0),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!0);break}this._syncGBufferStages()}setASVGFEnabled(e,t){let n=this._stages;n.asvgf&&(n.asvgf.enabled=e),n.variance&&(n.variance.enabled=e),n.bilateralFilter&&(n.bilateralFilter.enabled=e),e&&(n.nrd&&(n.nrd.enabled=!1),n.asvgf?.setTemporalEnabled?.(!0),this._applyASVGFPreset(t||`medium`)),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!e),this._syncGBufferStages()}applyASVGFPreset(e){this._applyASVGFPreset(e)}setAutoExposureEnabled(e,t){let n=this._stages;n.autoExposure&&(n.autoExposure.enabled=e,!e&&this.renderer&&(this.renderer.toneMappingExposure=t))}get requiresMotionVectors(){return!!(this._stages.asvgf?.enabled||this._stages.nrd?.enabled)}_syncGBufferStages(){let e=this._stages,t=e.normalDepth,n=e.motionVector,r=this.requiresMotionVectors,i=r||this.historyWanted||!!(e.edgeFilter?.enabled||e.bilateralFilter?.enabled);this.historyWanted||this._releaseHistory(),t&&(i&&!t.enabled&&t.reset(),t.enabled=i,t.setInstanceLeafOutput?.(this.historyWanted)),n&&(r&&!n.enabled&&(n.matricesInitialized=!1,n.isFirstFrame=!0,n.frameCount=0),n.enabled=r),e.pathTracer?.setAuxGBufferEnabled?.(i||!!this.denoiser?.enabled),e.pathTracer?.setCleanAuxNormal?.(!!this.denoiser?.enabled&&!!this.denoiser?.expectsCleanAux(this._finalQuality));for(let r of[e.asvgf,e.nrd,e.variance,e.bilateralFilter,e.edgeFilter,t,n])r&&!r.enabled&&r.releaseGPUMemory?.()}_cleanupCompletionListener(){this.denoiser&&(this._pendingStartUpscaler&&this.denoiser.removeEventListener(`end`,this._pendingStartUpscaler),this._pendingCloseDenoise&&this.denoiser.removeEventListener(`end`,this._pendingCloseDenoise)),this._pendingStartUpscaler=null,this._pendingCloseDenoise=null}get holdsWhileMoving(){if(!this._stages.pathTracer?.viewIsChanging||!this.continuousDenoise||this._cadenceSuspended||!this.denoiser?.enabled||this._movingHopeless)return!1;let e=this.movingCostMs,t=this._movingDenoiseMs.length;e>vD*bD&&(this._movingHopeless=!0,this._syncGBufferStages());let n=!this._movingHopeless&&(t<2||e<=vD);return this._holdWhileMoving=(this._holdWhileMoving===null||this._holdWhileMoving)&&n,this._holdWhileMoving}skipsTrace(){return this.holdsWhileMoving&&!!this.denoiser?.state.isDenoising}get movingCostMs(){return this._movingDenoiseMs.length?Math.min(...this._movingDenoiseMs):0}_publishOutput(){let e=this.pipeline?.context,t=this.denoiser?.outputTexture;e&&t&&e.setTexture(`oidn:output`,t)}_unpublishOutput(){this.pipeline?.context?.removeTexture(`oidn:output`),this.denoiser?.invalidateOutput()}_checkHeldFrameHealthy(){!this.denoiser?.hasOutput||this._failedRefreshes<xD||this._unpublishOutput()}tickContinuousDenoise(e){let t=this.denoiser;if(!this.continuousDenoise||this._cadenceSuspended||!t)return!1;this._checkHeldFrameHealthy();let n=!!this._stages.pathTracer?.viewIsChanging;if(!n)this._holdWhileMoving=null,this._movingDenoiseMs.length=0;else if(!this.holdsWhileMoving)return!1;if(t.state.isDenoising||t.state.isLoading||!n&&e<=this._lastCadenceSamples)return!1;let r=performance.now(),i=n?_D:this._lastCadenceSamples===0?gD:hD,a=Math.max(this.continuousDenoiseInterval,t.lastDenoiseMs*i);if(r-this._lastCadenceAt<a)return!1;this._lastCadenceAt=r,this._lastCadenceSamples=e,t.lastDenoiseMs>mD&&(this._cadenceDowngraded=!0);let o=this._cadenceDowngraded?this.previewQuality():this._finalQuality;return t.quality!==o&&t.updateQuality(o),t.start({continuous:!0}).then(e=>{this._failedRefreshes=e?0:this._failedRefreshes+1,!(!e||!n)&&(this._movingDenoiseMs.push(t.lastDenoiseMs),this._movingDenoiseMs.length>yD&&this._movingDenoiseMs.shift())}),!0}previewQuality(){return this.denoiser?.expectsCleanAux(this._finalQuality)?`fast-clean`:`fast`}setCadenceSuspended(e){this._cadenceSuspended=!!e,this._historyDirty=!0,this._cadenceSuspended&&(this.denoiser?.abort(),this._unpublishOutput())}setContinuousDenoise(e){this.continuousDenoise=!!e,this._syncOIDNInUse(),this._lastCadenceAt=-1/0,this._resetCadence()}_useFinalQuality(){let e=this.denoiser;e&&e.quality!==this._finalQuality&&e.updateQuality(this._finalQuality)}_resetCadence(){this._lastCadenceSamples=0}setTemporalHistory(e){this.temporalHistory=!!e,this._syncGBufferStages()}get historyWanted(){return this.temporalHistory&&this.continuousDenoise&&!!this.denoiser?.enabled&&!this._movingHopeless}get historyActive(){let e=this._stages.pathTracer;return this.historyWanted&&!this._cadenceSuspended&&!!this._stages.normalDepth?.enabled&&e?.uniforms?.get(`cameraProjection`)?.value!==Ke.equirectangular&&!(e?.visMode?.value>0)}beforeReset({keepHistory:e=!1}={}){let t=this._stages.pathTracer;if(!t||!this.historyActive)return;let n=t.resetCount!==this._knownResetCount;if(!e||n&&t.frameCount<2){this._historyDirty=!0;return}if(t.frameCount<2)return;let r=this._historyInputs();r&&(this._ensureHistory().merge(r,t.frameCount,this._historyCameraNow(),{commit:!0,keepHistory:!this._historyDirty&&!n,historyScale:CD(t.frameCount)}),this._historyDirty=!1)}afterReset(){this._knownResetCount=this._stages.pathTracer?.resetCount??0}afterTrace(){let e=this._stages.pathTracer;if(!e||e.tracedFrames===this._seenTracedFrames)return;if(this._seenTracedFrames=e.tracedFrames,e.resetCount!==this._knownResetCount&&(this._historyDirty=!0,this._knownResetCount=e.resetCount),!this.historyActive||e.frame.value!==0){this._movedPlacements.clear();return}let t=this._historyInputs();if(!t){this._movedPlacements.clear(),this._historyDirty=!0;return}let n=this._ensureHistory();this._historyDirty&&n.invalidate(),n.accumulate(t,this._historyCameraNow(),this._takeMovedPlacements()),this._historyDirty=!1}notePlacementMoving(e,t,n){e<0||!this.historyActive||this._movedPlacements.has(e)||this._movedPlacements.set(e,{world:t,offset:n,prev:t.slice(n,n+16)})}_takeMovedPlacements(){let e=this._movedPlacements,t=this._movedUpload;if(t.count=e.size,!e.size)return t;t.leaves.length<e.size&&(t.leaves=new Uint32Array(e.size*2),t.toPrev=new Float32Array(e.size*32));let n=[...e.keys()].sort((e,t)=>e-t);for(let r=0;r<n.length;r++){let{world:i,offset:a,prev:o}=e.get(n[r]);this._matB.fromArray(i,a).invert(),this._matA.fromArray(o).multiply(this._matB).toArray(t.toPrev,r*16),t.leaves[r]=n[r]}return e.clear(),t}_historyTextures(){let e=this._stages.pathTracer,t=this._history;if(!t?.valid||this._historyDirty||!this.historyActive||e.isComplete||e.resetCount!==this._knownResetCount||t.width!==this._lastRenderWidth||t.height!==this._lastRenderHeight)return null;if(e.frameCount<=1)return t.textures;if(e.frameCount>=SD)return null;let n=this._historyInputs();return n?t.merge(n,e.frameCount,this._historyCameraNow(),{historyScale:CD(e.frameCount)}):null}_historyInputs(){let e=this._stages.pathTracer,t=this.pipeline?.context,n=this.renderer?.backend;if(!e?.storageTextures?.readTarget||!t||!n)return null;let r=e.storageTextures.getReadTextures(),i=e=>e?n.get(e)?.texture:null,a={color:i(r.color),albedo:i(r.albedo),normal:i(r.normalDepth),geo:i(t.getTexture(`pathtracer:normalDepth`)),geoPrev:i(t.getTexture(`pathtracer:prevNormalDepth`)),shading:i(t.getTexture(`pathtracer:shadingNormal`)),leaf:i(t.getTexture(`pathtracer:instanceLeaf`)),width:e.width,height:e.height};return a.color&&a.albedo&&a.normal&&a.geo&&a.geoPrev&&a.shading&&a.leaf?a:null}_historyCameraNow(){let e=this._stages.pathTracer;this._viewProj.multiplyMatrices(e.cameraProjectionMatrix.value,e.cameraViewMatrix.value);let t=this._historyCamera;return t.world=e.cameraWorldMatrix.value.elements,t.projInv=e.cameraProjectionMatrixInverse.value.elements,t.viewProj=this._viewProj.elements,t.orthographic=e.uniforms?.get(`cameraProjection`)?.value===Ke.orthographic,t}_ensureHistory(){return this._history??=new bE(this.renderer.backend.device),this._history.settings.cleanAux=!!this.denoiser?.expectsCleanAux(this._finalQuality),this._history}_releaseHistory(){this._history?.dispose(),this._history=null,this._historyDirty=!0,this._movedPlacements.clear()}setUpscalerBackend(e){let t=e===`neural`?`neural`:`esrgan`;t!==this.upscalerBackend&&(this.upscalerBackend=t,this._restoreRenderDisplay(),t!==`neural`&&this._releaseNeuralUpscaler())}_restoreRenderDisplay(){let e=this.upscalerCanvas&&this.upscalerCanvas.style.display!==`none`;return this.upscalerCanvas&&(this.upscalerCanvas.style.display=`none`),this.mainCanvas&&(this.mainCanvas.style.opacity=`1`),e&&this._lastRenderWidth&&this._lastRenderHeight&&this.dispatchEvent({type:`resolution_changed`,width:this._lastRenderWidth,height:this._lastRenderHeight}),!!e}_releaseNeuralUpscaler(){this._neuralUpscaler?.dispose(),this._neuralUpscaler=null,this._superResModule?.releaseDenoisedReader()}setNeuralRendering(e,t=null){this.neuralRendering=!!e,t&&(this.neuralRenderingSettings={...this.neuralRenderingSettings,...t}),this.neuralRendering||(this._releaseNeuralRetouch(),this._restoreRenderDisplay())}_releaseNeuralRetouch(){this._retouch?.dispose(),this._retouch=null}async _runNeuralPost(e){let t=this.upscaler?.enabled&&this.upscalerBackend===`neural`,n=this.neuralRendering;if(!(!t&&!n)&&!this._neuralPostBusy){if(!this.upscalerCanvas){pD.warn(`neural pass skipped: the engine has no overlay canvas to present on`);return}if(!this.pipeline?.context?.getTexture(`oidn:output`)){pD.warn(`neural pass skipped: no denoised picture — it needs OIDN`);return}this._neuralPostBusy=!0,this.dispatchEvent({type:B.UPSCALING_START});try{let r=await Promise.resolve().then(()=>(QE(),IE));this._superResModule=r;let i=n?await Promise.resolve().then(()=>(fD(),$E)):null,a=this.denoiser?._outTexSize,o=(a?.width??0)*(a?.height??0),s=n&&o<=i.RETOUCH_MAX_PIXELS;if(n&&!s&&(pD.warn(`Neural rendering skipped: the render is ${(o/1e6).toFixed(1)} MP, above the ${(i.RETOUCH_MAX_PIXELS/1e6).toFixed(1)} MP the pass survives.`+(t?` The upscale still ran.`:``)),this._releaseNeuralRetouch()),!t&&!s)return;let c={exposure:this._getEffectiveExposure(),toneMapping:this._getToneMapping(),saturation:this._getSaturation?.()??1},l=await r.readDenoisedHalf(this.denoiser);t&&(this._neuralUpscaler&&(this._neuralUpscaler.inputWidth!==l.width||this._neuralUpscaler.inputHeight!==l.height)&&this._releaseNeuralUpscaler(),this._neuralUpscaler||=await r.NeuralSuperRes.create({width:l.width,height:l.height}));let u=l;if(s){let e=await i.enhanceFrame({source:u,settings:this.neuralRenderingSettings,instance:this._retouch,exposure:c.exposure,tone:t?null:c});this._retouch=e.instance,u=e}if(t&&(u=await this._neuralUpscaler.upscaleToRGBA8(u,c)),!e()){this.dropDisplay();return}if(r.presentRGBA8(this.upscalerCanvas,u.rgba8,u.width,u.height),!e()){this.dropDisplay();return}this.mainCanvas&&(this.mainCanvas.style.opacity=`0`),this.dispatchEvent({type:`resolution_changed`,width:u.width,height:u.height})}catch(e){pD.warn(`neural pass failed`,e)}finally{this._neuralPostBusy=!1,this.dispatchEvent({type:B.UPSCALING_END})}}}onRenderComplete({isStillComplete:e,context:t}){this._cleanupCompletionListener();let n=this.finalDenoise?`final`:this.continuousDenoise?`refresh`:null,r=()=>{if(this.denoiser?.removeEventListener(`end`,r),this._pendingStartUpscaler=null,e()){if(n&&this._onDisplayRefresh?.(),this.neuralRendering||this.upscaler?.enabled&&this.upscalerBackend===`neural`){this._runNeuralPost(e);return}this.upscaler?.enabled&&this.upscaler.start()}};if(!n){r();return}let i=()=>{e()&&(this._pendingStartUpscaler=r,this.denoiser.addEventListener(`end`,r),n===`final`?(this._useFinalQuality(),this.denoiser.start()):this.denoiser.start({continuous:!0}))};if(this._resetCadence(),this.denoiser.state.isDenoising){let e=()=>{this.denoiser?.removeEventListener(`end`,e),this._pendingCloseDenoise===e&&(this._pendingCloseDenoise=null),i()};this._pendingCloseDenoise=e,this.denoiser.addEventListener(`end`,e)}else i()}abort(e,{keepDisplay:t=!1}={}){this._cleanupCompletionListener(),this._restoreRenderDisplay(),e&&e!==this.mainCanvas&&(e.style.opacity=`1`),this.upscaler&&this.upscaler.abort();let n=!!this._stages.pathTracer?.viewIsChanging,r=t&&this.continuousDenoise&&!this._cadenceSuspended&&!!this.denoiser?.hasOutput&&(!n||this.holdsWhileMoving);this.denoiser&&!r&&(this.denoiser.enabled&&this.denoiser.abort(),this._unpublishOutput()),this._resetCadence()}dropDisplay(){this._unpublishOutput(),this._restoreRenderDisplay(),this._historyDirty=!0}dispose(){this._cleanupCompletionListener(),this._releaseNeuralUpscaler(),this._releaseNeuralRetouch(),this._unpublishOutput(),this._releaseHistory(),this.denoiser&&=(this._denoiserStartHandler&&this.denoiser.removeEventListener(`start`,this._denoiserStartHandler),this._denoiserEndHandler&&this.denoiser.removeEventListener(`end`,this._denoiserEndHandler),this._denoiserTileHandler&&this.denoiser.removeEventListener(`tileProgress`,this._denoiserTileHandler),this.denoiser.dispose(),null),this.upscaler&&(this._upscalerResChangedHandler&&this.upscaler.removeEventListener(`resolution_changed`,this._upscalerResChangedHandler),this._upscalerStartHandler&&this.upscaler.removeEventListener(`start`,this._upscalerStartHandler),this._upscalerProgressHandler&&this.upscaler.removeEventListener(`progress`,this._upscalerProgressHandler),this._upscalerEndHandler&&this.upscaler.removeEventListener(`end`,this._upscalerEndHandler),this.upscaler.dispose(),this.upscaler=null,this.upscalerBackend=`esrgan`,this._neuralUpscaler=null),this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._denoiserTileHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null,this._onReset=null,this._onPostProcessRefresh=null,this._onDisplayRefresh=null,this.upscalerCanvas?.parentNode&&(this.upscalerCanvas.parentNode.removeChild(this.upscalerCanvas),this.upscalerCanvas=null)}setOverlayManager(e){this._overlayManager=e}setResetCallback(e){this._onReset=e}setPostProcessRefreshCallback(e){this._onPostProcessRefresh=e}setDisplayRefreshCallback(e){this._onDisplayRefresh=e}setSettings(e){this._settings=e}setASVGFParams(e){this._stages.asvgf?.updateParameters(e)}toggleASVGFHeatmap(e){this._stages.asvgf?.setHeatmapEnabled?.(e)}configureASVGFForMode(e){this._stages.asvgf&&(this._stages.asvgf.enabled=e.enabled,this._stages.variance&&(this._stages.variance.enabled=e.enabled),this._stages.bilateralFilter&&(this._stages.bilateralFilter.enabled=e.enabled),e.enabled&&this._stages.asvgf.updateParameters(e),this._syncGBufferStages())}setEdgeAwareParams(e){this._stages.edgeFilter?.updateUniforms(e)}setAutoExposureParams(e){this._stages.autoExposure?.updateParameters(e)}applyOIDNEnabled(e){this.finalDenoise=!!e,this._syncOIDNInUse()}get oidnQuality(){return this._finalQuality}setOIDNEnabled(e){this.applyOIDNEnabled(e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}_syncOIDNInUse(){this.denoiser&&(this.denoiser.enabled=this.finalDenoise||this.continuousDenoise)}applyOIDNQuality(e){this._finalQuality=e,this._cadenceDowngraded=!1,this.denoiser?.updateQuality(e)}setOIDNQuality(e){this.applyOIDNQuality(e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}setTileHelperEnabled(e){this._setTileHelper(e)}setUpscalerEnabled(e){this.upscaler&&(this.upscaler.enabled=e),e||this._restoreRenderDisplay()}setUpscalerScaleFactor(e){this.upscaler?.setScaleFactor(e)}setUpscalerQuality(e){this.upscaler?.setQuality(e)}setAutoExposure(e){this.setAutoExposureEnabled(e,this._getExposure()),this._onReset?.()}setStrategy(e,t){this.setDenoiserStrategy(e,t),this._onReset?.()}setNRDParams(e){this._stages.nrd?.updateParameters(e)}applyNRDPreset(e){this._applyNRDPreset(e)}setNRDDebugMode(e){this._stages.nrd?.updateParameters({debugMode:e})}_setTileHelper(e){let t=this._overlayManager?.getHelper(`tiles`);t&&(t.enabled=e,e||t.hide())}_getEffectiveExposure(){return this._stages.autoExposure?.enabled?this.renderer.toneMappingExposure:this._getExposure()}_getToneMapping(){return this.renderer.toneMapping}_clearDenoiserTextures(){let e=this.pipeline?.context;e&&[`asvgf:output`,`asvgf:demodulated`,`asvgf:gradient`,`variance:output`,`bilateralFiltering:output`,`edgeFiltering:output`,`nrd:output`,`oidn:output`].forEach(t=>e.removeTexture(t))}_applyNRDPreset(e){let t=nt[e];if(!t)return;let n={};for(let e of tt)n[e]=et[e];this._stages.nrd?.updateParameters({...n,...t})}_applyASVGFPreset(e){let t=$e[e];t&&(this._stages.asvgf?.updateParameters(t),this._stages.bilateralFilter?.updateParameters(t),this._stages.variance&&t.varianceBoost!==void 0&&(this._stages.variance.varianceBoost.value=t.varianceBoost))}},TD=class{constructor(){this.layer=`hud`,this.visible=!1,this._tileBounds=null,this._imageWidth=1,this._imageHeight=1,this.enabled=!0,this._borderColor=`rgba(255, 0, 0, 0.6)`,this._borderWidthRatio=1/540,this._borderWidthMin=1.5,this._borderWidthMax=4}setActiveTile(e){this._tileBounds=e}setRenderSize(e,t){this._imageWidth=e,this._imageHeight=t}render(e,t,n){if(!this._tileBounds)return;let r=this._tileBounds,i=t/this._imageWidth,a=n/this._imageHeight,o=r.x*i,s=r.y*a,c=r.width*i,l=r.height*a,u=Math.min(this._borderWidthMax,Math.max(this._borderWidthMin,Math.min(t,n)*this._borderWidthRatio));e.strokeStyle=this._borderColor,e.lineWidth=u,e.strokeRect(o,s,c,l)}show(){this.enabled&&(this.visible=!0)}hide(){this.visible=!1,this._tileBounds=null}dispose(){this.visible=!1}},ED=class{constructor(e,t){this.layer=`scene`,this._enabled=!0,this._scene=e,this._camera=t,this._build([])}_build(e){this._orthographic=this._camera.isOrthographicCamera===!0,this._outlineNode=(0,g.outline)(this._scene,this._camera,{selectedObjects:e,edgeThickness:(0,n.uniform)(1),edgeGlow:(0,n.uniform)(0)});let i=(0,n.uniform)(3),a=(0,n.uniform)(new r.Color(16777215)),o=(0,n.uniform)(new r.Color(1640965)),{visibleEdge:s,hiddenEdge:c}=this._outlineNode,l=s.mul(a).add(c.mul(o)).mul(i),u=l.r.max(l.g).max(l.b).clamp(0,1);this._material=new t.MeshBasicNodeMaterial,this._material.colorNode=(0,n.vec4)(l,u),this._material.transparent=!0,this._material.blending=r.CustomBlending,this._material.blendEquation=r.AddEquation,this._material.blendSrc=r.OneFactor,this._material.blendDst=r.OneFactor,this._material.blendEquationAlpha=r.AddEquation,this._material.blendSrcAlpha=r.OneFactor,this._material.blendDstAlpha=r.OneFactor,this._material.toneMapped=!1,this._material.depthTest=!1,this._material.depthWrite=!1,this._quad=new t.QuadMesh(this._material)}setSelectedObjects(e){this._outlineNode.selectedObjects=e}get visible(){return this._enabled&&this._outlineNode.selectedObjects.length>0}render(e){if(!this.visible)return;if(this._camera.isOrthographicCamera!==this._orthographic){let e=[...this._outlineNode.selectedObjects];this._outlineNode.dispose(),this._material.dispose(),this._build(e)}let t=e.autoClear;e.autoClear=!1,e.setRenderTarget(null),this._quad.render(e),e.autoClear=t}show(){this._enabled=!0}hide(){this._enabled=!1}dispose(){this._enabled=!1,this._outlineNode?.dispose(),this._material?.dispose(),this._quad=null}};function DD(e=!1){let t=document.createElement(`canvas`);return t.style.cssText=`position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;`+(e?`display:none;`:``),t}function OD(e,t=1/0){let n=e?.getBoundingClientRect();if(!n||n.width===0||n.height===0)return null;let r=Math.min(window.devicePixelRatio||1,2),i=Math.round(n.width*r),a=Math.round(n.height*r),o=t/Math.max(i,a);return o<1&&(i=Math.max(1,Math.round(i*o)),a=Math.max(1,Math.round(a*o))),{width:i,height:a}}var kD=4096,AD=class{constructor(){this.canvas=DD(!0),this._visible=!1,this.renderer=null,this._sizeSource=null}async init({device:e,sizeSource:n}){this._sizeSource=n;let i=e.onuncapturederror,a=new t.WebGPURenderer({canvas:this.canvas,device:e,alpha:!0,antialias:(window.devicePixelRatio||1)<2});return await a.init(),e.onuncapturederror=i,a.outputColorSpace=r.SRGBColorSpace,a.setPixelRatio(1),a.setClearColor(0,0),a.autoClear=!1,this.renderer=a,this.syncSize(),this}get isVisible(){return this._visible}syncSize(){if(!this.renderer)return;let e=OD(this._sizeSource,kD);!e||e.width===this.canvas.width&&e.height===this.canvas.height||this.renderer.setSize(e.width,e.height,!1)}begin(){this.renderer&&(this.renderer.setRenderTarget(null),this.renderer.clear())}setVisible(e){this._visible!==e&&(this._visible=e,this.canvas.style.display=e?``:`none`)}dispose(){je(this.renderer),this.renderer=null,this.canvas.parentElement?.removeChild(this.canvas)}};rn();var jD=Wt(`overlay`),MD=(e,t)=>e.visible&&e.layer===t&&e.render,ND=class{constructor(e){this.camera=e,this._helpers=new Map,this._hudCanvas=DD(),this._hudCtx=this._hudCanvas.getContext(`2d`),this._helperScene=null,this._viewOverlay=null}async initViewRenderer({device:e,sizeSource:t}){if(!(!e||!t))try{this._viewOverlay=await new AD().init({device:e,sizeSource:t})}catch(e){jD.error(`overlay surface unavailable — light gizmos, transform gizmo and outlines are disabled`,e),this._viewOverlay=null}}setHelperScene(e){this._helperScene=e}getHUDCanvas(){return this._hudCanvas}mount(e){if(!e)return;let t=this._viewOverlay?.canvas;t&&t.parentElement!==e&&e.appendChild(t),this._hudCanvas.parentElement!==e&&e.appendChild(this._hudCanvas)}setupDefaultHelpers({helperScene:e,meshScene:t,pipeline:n,denoisingManager:r,app:i,renderWidth:a,renderHeight:o}){this.setHelperScene(e);let s=new TD;this.register(`tiles`,s),s.setRenderSize(a||1,o||1),i.addEventListener(`resolution_changed`,e=>{s.setRenderSize(e.width,e.height)}),n.eventBus.on(`pipeline:reset`,()=>s.hide()),this._wireDenoiserTileEvents(s,r);let c=new ED(t,this.camera);this.register(`outline`,c)}_wireDenoiserTileEvents(e,t){let n=[t?.denoiser,t?.upscaler];for(let t of n)t&&(t.addEventListener(`tileProgress`,t=>{t.continuous||t.tile&&(e.setRenderSize(t.imageWidth,t.imageHeight),e.setActiveTile(t.tile),e.show(),this.refreshHUD())}),t.addEventListener(`end`,()=>{e.hide(),this.refreshHUD()}))}register(e,t){this._helpers.has(e)&&(jD.warn(`helper "${e}" already registered — replacing.`),this._helpers.get(e).dispose?.()),this._helpers.set(e,t)}unregister(e){let t=this._helpers.get(e);t&&(t.dispose?.(),this._helpers.delete(e))}show(e){this._helpers.get(e)?.show()}hide(e){this._helpers.get(e)?.hide()}toggle(e){let t=this._helpers.get(e);t&&(t.visible?t.hide():t.show())}getHelper(e){return this._helpers.get(e)??null}isVisible(e){return this._helpers.get(e)?.visible??!1}showAll(){for(let e of this._helpers.values())e.show()}hideAll(){for(let e of this._helpers.values())e.hide()}render(){let e=this._viewOverlay;if(e){let t=this._hasVisibleSceneOverlay();(t||e.isVisible)&&(e.syncSize(),e.begin(),t&&this._renderSceneLayer(e.renderer),e.setVisible(t))}this.refreshHUD()}_renderSceneLayer(e){this._helperScene?.render(e,this.camera);for(let t of this._helpers.values())MD(t,`scene`)&&t.render(e,this.camera)}_hasVisibleSceneOverlay(){if(this._helperScene?.isDrawing)return!0;for(let e of this._helpers.values())if(MD(e,`scene`))return!0;return!1}refreshHUD(){let e=this._hudCanvas,t=this._hudCtx,n=!1;for(let e of this._helpers.values())if(MD(e,`hud`)){n=!0;break}if(!n){e.style.display!==`none`&&(e.style.display=`none`);return}e.style.display!==``&&(e.style.display=``);let r=e.clientWidth,i=e.clientHeight,a=r>0&&i>0?OD(e):null;if(a){(e.width!==a.width||e.height!==a.height)&&(e.width=a.width,e.height=a.height),t.clearRect(0,0,a.width,a.height),t.save(),t.scale(a.width/r,a.height/i);for(let e of this._helpers.values())MD(e,`hud`)&&e.render(t,r,i);t.restore(),e.style.display!==``&&(e.style.display=``)}}dispose(){for(let e of this._helpers.values())e.dispose?.();this._helpers.clear(),this._viewOverlay?.dispose(),this._viewOverlay=null,this._hudCanvas.parentElement&&this._hudCanvas.parentElement.removeChild(this._hudCanvas)}};Ce();var PD=class extends r.EventDispatcher{constructor(){super(),this.mixer=null,this.timer=new r.Timer,this.actions=[],this.isPlaying=!1,this._scene=null,this._mixerRoot=null,this._meshes=null,this._meshTriRanges=null,this._meshPositions=null,this._tempVec=new r.Vector3,this._skinnedCache=null,this._clipsCache=null,this._savedTimeScale=1,this.onFinished=null,this._rigid=!1,this._plans=null,this._allPlan=null,this._activeClip=0,this._slotOf=null,this._lastWorld=null,this._lastVisible=null,this.wakeCallback=null,this.applyPoseCallback=null}init(e,t,n,i){if(this.dispose(),!i||i.length===0)return;this._scene=e,this._mixerRoot=t,this._meshes=n,this.mixer=new r.AnimationMixer(t);let a=i.map(e=>this.mixer.clipAction(e)),o=(e,t)=>e.name===t||e.getObjectByName(t)!==void 0;!a.some(e=>e.getClip().tracks.some(e=>{let n=e.name.split(`.`)[0];return o(t,n)}))&&t!==e&&(console.log(`[AnimationManager] Tracks did not resolve from model root, retrying with scene root`),this.mixer=new r.AnimationMixer(e),this._mixerRoot=e,a=i.map(e=>this.mixer.clipAction(e))),this.actions=a,this._rigid=!n.some(e=>e?.isSkinnedMesh)&&!i.some(e=>e.tracks.some(e=>e.name.includes(`morphTargetInfluences`))),this._planClips(i),this.mixer.addEventListener(`finished`,()=>{this.isPlaying=!1,this.timer.reset(),this.onFinished&&this.onFinished()}),this._meshTriRanges=[],this._skinnedCache=[];let s=0;for(let e of n){let t=e.geometry,n=t.attributes.position,r=t.index?t.index.array:null,i=r?r.length/3:n.count/3,a=n.count;this._meshTriRanges.push({start:s,count:i,uniqueVerts:a,indices:r}),s+=i}this._skinnedCache=[],this._meshPositions=[];let c=n.filter(e=>e.isSkinnedMesh).length;console.debug(`[AnimationManager] Init: ${i.length} clips, ${n.length} meshes (${c} skinned), ${s} triangles, ${this._rigid?`rigid`:`deforming`}`)}_planClips(e){let t=this._mixerRoot,n=new Map;if(t.traverse?.(e=>{n.has(e.name)||n.set(e.name,e),n.set(e.uuid,e)}),this._plans=e.map(e=>{let t=new Set,i=!1;for(let a of e.tracks){let{nodeName:e,propertyName:o}=r.PropertyBinding.parseTrackName(a.name),s=n.get(e);s&&(t.add(s),o===`visible`&&(i=!0))}let a=[];for(let e=0;e<this._meshes.length;e++)for(let n=this._meshes[e];n;n=n.parent)if(t.has(n)){a.push(e);break}let o=new Set;for(let e of t)e.traverse(e=>e.isCamera&&o.add(e));return{meshes:Int32Array.from(a),visibility:i,cameras:[...o]}}),this._allPlan=null,!this._rigid)return;this._slotOf=new Int32Array(this._meshes.length).fill(-1);let i=0;for(let e of this._plans)for(let t of e.meshes)this._slotOf[t]<0&&(this._slotOf[t]=i++);this._lastWorld=new Float64Array(i*16).fill(NaN),this._lastVisible=new Uint8Array(i).fill(2)}_planFor(e){if(!this._plans)return null;if(e>=0)return this._plans[e]??null;if(!this._allPlan){let e=new Set,t=new Set,n=!1;for(let r of this._plans)r.meshes.forEach(t=>e.add(t)),r.cameras.forEach(e=>t.add(e)),n||=r.visibility;this._allPlan={meshes:Int32Array.from(e),visibility:n,cameras:[...t]}}return this._allPlan}_applyRigidPose(e){let t=this._planFor(e);if(!t)return;let n=[],r=!1,i=this._lastWorld,a=this._lastVisible;for(let e of t.meshes){let o=this._meshes[e],s=this._slotOf[e],c=o.matrixWorld.elements,l=s*16;for(let t=0;t<16;t++)if(i[l+t]!==c[t]){for(let e=0;e<16;e++)i[l+e]=c[e];n.push(e);break}if(t.visibility||a[s]===2){let e=1;for(let t=o;t;t=t.parent)if(!t.visible){e=0;break}a[s]!==e&&(a[s]=e,r=!0)}}(n.length||r||t.cameras.length)&&this.applyPoseCallback?.({meshIndices:n,visibilityChanged:r,cameras:t.cameras})}play(e=0){if(!(!this.mixer||this.actions.length===0)){if(this.mixer.stopAllAction(),e===-1)for(let e of this.actions)e.play();else e>=0&&e<this.actions.length&&this.actions[e].play();this._activeClip=e,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:B.ANIMATION_STARTED})}}pause(){this.mixer&&(this.mixer.timeScale=0,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:B.ANIMATION_PAUSED}))}resume(){this.mixer&&(this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:B.ANIMATION_STARTED}))}stop(){this.mixer&&(this.mixer.stopAllAction(),this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!1,this._rigid&&(this._mixerRoot.updateMatrixWorld(!0),this._applyRigidPose(-1)),this.dispatchEvent({type:B.ANIMATION_STOPPED}))}setSpeed(e){this._savedTimeScale=e,this.mixer&&this.isPlaying&&(this.mixer.timeScale=e)}setLoop(e){let t=e?r.LoopRepeat:r.LoopOnce;for(let n of this.actions)n.setLoop(t),n.clampWhenFinished=!e}seekTo(e,t=0){if(!this.mixer||this.actions.length===0)return null;if(this._activeClip=t,this.mixer.stopAllAction(),t===-1)for(let e of this.actions)e.play();else t>=0&&t<this.actions.length&&this.actions[t].play();this.mixer.setTime(e);for(let e of this.actions)e.isRunning()&&(e.paused=!0);return this._poseReader()}get currentTime(){return this.mixer?.time||0}update(){if(!this.isPlaying||!this.mixer)return null;this.timer.update();let e=this.timer.getDelta();return this.mixer.update(e),this._poseReader()}_scratch(e,t,n){let r=e[t];return r&&r.length===n?r:e[t]=new Float32Array(n)}_poseReader(){if(this._mixerRoot.updateMatrixWorld(!0),this._rigid)return this._applyRigidPose(this._activeClip),null;let e=this._planFor(this._activeClip)?.cameras;return e?.length&&this.applyPoseCallback?.({meshIndices:[],visibilityChanged:!1,cameras:e}),e=>this._computeMeshPositions(e)}_computeMeshPositions(e){let t=this._tempVec,n=this._meshes[e],{count:r,uniqueVerts:i,indices:a}=this._meshTriRanges[e],o=this._scratch(this._skinnedCache,e,i*3),s=this._scratch(this._meshPositions,e,r*9),c=n.matrixWorld;for(let e=0;e<i;e++)n.getVertexPosition(e,t),t.applyMatrix4(c),o[e*3]=t.x,o[e*3+1]=t.y,o[e*3+2]=t.z;if(a)for(let e=0;e<r;e++){let t=e*3,n=a[t]*3,r=a[t+1]*3,i=a[t+2]*3,c=e*9;s[c]=o[n],s[c+1]=o[n+1],s[c+2]=o[n+2],s[c+3]=o[r],s[c+4]=o[r+1],s[c+5]=o[r+2],s[c+6]=o[i],s[c+7]=o[i+1],s[c+8]=o[i+2]}else for(let e=0;e<r;e++){let t=e*3*3,n=(e*3+1)*3,r=(e*3+2)*3,i=e*9;s[i]=o[t],s[i+1]=o[t+1],s[i+2]=o[t+2],s[i+3]=o[n],s[i+4]=o[n+1],s[i+5]=o[n+2],s[i+6]=o[r],s[i+7]=o[r+1],s[i+8]=o[r+2]}return s}get hasAnimations(){return this.actions.length>0}get clips(){return this._clipsCache||=this.actions.map((e,t)=>{let n=e.getClip();return{index:t,name:n.name||`Clip ${t}`,duration:n.duration}}),this._clipsCache}dispose(){this.mixer&&=(this.mixer.stopAllAction(),this.mixer.uncacheRoot(this._mixerRoot),null),this.actions=[],this.isPlaying=!1,this.timer.reset(),this._scene=null,this._mixerRoot=null,this._meshes=null,this._meshTriRanges=null,this._meshPositions=null,this._skinnedCache=null,this._clipsCache=null,this._rigid=!1,this._plans=null,this._allPlan=null,this._activeClip=0,this._slotOf=null,this._lastWorld=null,this._lastVisible=null}};Ce();var FD=new r.Vector3(0,0,-1),ID=e=>{for(;e.parent;)e=e.parent;return e.isScene?e:null},LD=class{constructor({camera:e,canvas:t,orbitControls:n,app:i}){this._app=i,this._orbitControls=n,this._camera=e,this._controls=new _.TransformControls(e,t),this._gizmoScene=new r.Scene,this._gizmoScene.add(this._controls.getHelper()),this._attached=null,this._isDragging=!1,this._meshes=null,this._refitInFlight=!1,this._baselineComputed=!1,this._moved=new Set,this._tempForward=new r.Vector3,this._lightTargetDistance=null,this._lastLightPosition=null,this._onDraggingChanged=this._onDraggingChanged.bind(this),this._onObjectChange=this._onObjectChange.bind(this),this._controls.addEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.addEventListener(`objectChange`,this._onObjectChange)}setMeshData(e){this._meshes=e;for(let e of this._moved)ID(e)||this._moved.delete(e)}get movedObjects(){return[...this._moved].filter(e=>ID(e))}noteMoved(e){e&&!e.isLight&&this._moved.add(e)}attach(e){this._attached!==e&&(this._controls.attach(e),this._attached=e,this._lightTargetDistance=null,this._lastLightPosition=null,e.isLight&&e.target&&(this._syncLightAim(e),this._lastLightPosition=e.position.clone()))}detach(){this._attached&&(this._controls.detach(),this._attached=null,this._lightTargetDistance=null,this._lastLightPosition=null)}setMode(e){this._controls.setMode(e),this._app?.dispatchEvent({type:B.TRANSFORM_MODE_CHANGED,mode:e}),this._app?.refreshFrame()}setSpace(e){this._controls.setSpace(e),this._app?.refreshFrame()}get isDragging(){return this._isDragging}get attachedObject(){return this._attached}get controls(){return this._controls}render(e){if(!this._attached)return;let t=e.autoClear;e.autoClear=!1,e.clearDepth(),e.setRenderTarget(null),e.render(this._gizmoScene,this._camera),e.autoClear=t}_onDraggingChanged(e){this._isDragging=e.value,this._orbitControls&&(this._orbitControls.enabled=!e.value),e.value?this._app.dispatchEvent({type:B.OBJECT_TRANSFORM_START}):(this._attached?.isLight?this._finalizeLightTransform():this._recomputeAndRefit(),this._app.dispatchEvent({type:B.OBJECT_TRANSFORM_END}))}_onObjectChange(){this._app.needsReset=!0,this._app.wake(),this._attached?.isLight&&this._syncLightDuringDrag()}_syncLightDuringDrag(){let e=this._attached;if(e.target){let t=this._controls.mode;if(t===`translate`&&this._lastLightPosition&&!e.isDirectionalLight){let t=this._tempForward.copy(e.position).sub(this._lastLightPosition);e.target.position.add(t),e.target.updateMatrixWorld(!0)}else if(t===`rotate`&&this._lightTargetDistance!=null){let t=this._tempForward.set(0,0,-1).applyQuaternion(e.quaternion);e.target.position.copy(e.position).addScaledVector(t,this._lightTargetDistance),e.target.updateMatrixWorld(!0)}this._lastLightPosition.copy(e.position)}this._app.lightManager?.updateLights()}_finalizeLightTransform(){let e=this._attached;e.isDirectionalLight&&e.target&&this._controls.mode===`translate`&&this._syncLightAim(e),e.isRectAreaLight&&(e.scale.x!==1||e.scale.y!==1)&&(e.width*=e.scale.x,e.height*=e.scale.y,e.scale.set(1,1,1)),this._app.lightManager?.updateLights()}_syncLightAim(e){let t=this._tempForward.copy(e.target.position).sub(e.position),n=t.length();n>1e-4?(e.quaternion.setFromUnitVectors(FD,t.normalize()),this._lightTargetDistance=n):this._lightTargetDistance=1}_recomputeAndRefit(){if(!this._meshes||this._refitInFlight||!this._attached)return;this._attached.updateMatrixWorld(!0);let e=this._findAffectedMeshIndices(this._attached);if(e.length!==0){this._refitInFlight=!0;try{this._app.updateMeshTransforms(e),this._moved.add(this._attached)}catch(e){console.error(`Transform refit error:`,e)}finally{this._refitInFlight=!1}}}_findAffectedMeshIndices(e){let t=[];for(let n=0;n<this._meshes.length;n++){let r=this._meshes[n];(r===e||this._isDescendantOf(r,e))&&t.push(n)}return t}_isDescendantOf(e,t){let n=e.parent;for(;n;){if(n===t)return!0;n=n.parent}return!1}dispose(){this._controls.removeEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.removeEventListener(`objectChange`,this._onObjectChange),this.detach(),this._gizmoScene.remove(this._controls.getHelper()),this._controls.dispose(),this._meshes=null,this._moved.clear(),this._baselineComputed=!1,this._tempForward=null,this._lightTargetDistance=null,this._lastLightPosition=null,this._app=null,this._orbitControls=null,this._camera=null,this._controls=null,this._gizmoScene=null}},RD=class{constructor(e){this.layer=`scene`,this._transformManager=e,this._enabled=!0}get visible(){return this._enabled&&this._transformManager.attachedObject!==null}render(e){this._transformManager.render(e)}show(){this._enabled=!0}hide(){this._enabled=!1}dispose(){this._enabled=!1}},zD=1,BD=e=>typeof e==`string`&&/^https?:\/\//.test(e);function VD(e,t){let n=[];for(;e&&e!==t;){let t=e.parent;if(!t)return null;n.unshift(t.children.indexOf(e)),e=t}return e===t?n:null}function HD(e,t){let n=e;for(let e of t)if(n=n?.children[e],!n)return null;return n}function UD(e){return{key:e.assetLoader?.sceneSourceKey??null,name:e.sceneModel?.name??null,meshes:e.sceneMeshes.length,materials:e.stages.pathTracer?.materialData.materialCount??0}}function WD(e){let t=new Map;for(let n of e.sceneMeshes){let e=n.userData?.materialIndex;e!==void 0&&!t.has(e)&&t.set(e,Array.isArray(n.material)?n.material[0]:n.material)}return t}function GD(e){if(!e)return null;let t=e.status(),n=t.activeView,r=t.config?.id??n?.configId??null;return{config:r?{id:r}:null,view:n?{display:n.display,view:n.view,look:n.look??null}:null,transform:n?null:t.activeTransform?.id??null,workingSpace:t.workingSpaceAdopted?t.workingSpace:null,context:t.context??null}}function KD(e){let t=e.meshScene,n=WD(e),r=[];return t.traverse(e=>{e!==t&&e.visible===!1&&r.push(VD(e,t))}),{v:1,engine:Hh,savedAt:Date.now(),scene:UD(e),appended:t.children.filter(t=>t!==e.sceneModel&&t.userData?.__rayzeeSceneObject).map(e=>({name:e.userData.__rayzeeName??e.name,url:e.userData.__rayzeeSourceUrl??null,cacheKey:e.userData.__rayzeeCacheKey??null})),settings:e.settings.serialize(),environment:e.environmentManager?.serialize()??null,color:GD(e.color),lights:e.lightManager.serialize(),cameras:e.cameraManager.serialize(),timeline:e.timeline?.serialize()??null,materials:(e.stages.pathTracer?.materialData.serializeHostEdits()??[]).map(e=>({...e,name:n.get(e.index)?.name??``})),hidden:r,moved:(e.transformManager?.movedObjects??[]).map(e=>({path:VD(e,t),name:e.name,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray()})).filter(e=>e.path)}}function qD(e,t,n){let r=e[t];r?.copy&&(n?.isColor||n?.isVector2||n?.isVector3)?r.copy(n):e[t]=n,e.needsUpdate=!0}async function JD(e,t,n,r){if(!t)return;let i=e.environmentManager;if(t.hdri&&t.hdri!==i.hdriSource){let i=BD(t.hdri)?t.hdri:await n({kind:`environment`,source:t.hdri});try{typeof i==`string`?await e.loadEnvironment(i):i?await e.loadFile(i):r(`environment`,`source unavailable`,{source:t.hdri})}catch(e){r(`environment`,e.message,{source:t.hdri})}}await i.restore(t)}async function YD(e,t,n,r){let i=e.color;if(!t||!i)return;let a=i.status(),o=a.activeView,s=!!t.view&&!!o&&o.display===t.view.display&&o.view===t.view.view&&(o.look??null)===t.view.look,c=a.config?.id??null,l=c??o?.configId??null;if(!((t.config?.id??null)===l&&!t.workingSpace&&!t.context&&(t.view?s:!o&&(!t.transform||t.transform===a.activeTransform?.id))))try{if(t.config&&t.config.id!==c){if(!await n({kind:`colorConfig`,config:t.config})){if(!(await i.constructor.listBuiltinConfigs().catch(()=>[])).some(e=>(e.name??e)===t.config.id||`ocio://${e.name??e}`===t.config.id)){r(`color`,`config unavailable`,{config:t.config.id});return}await e.loadColorConfig({builtin:t.config.id,registerViews:!1})}}else !t.config&&c&&await e.unloadColorConfig();t.context&&i.setContext(t.context),t.view?i.setView(t.view):t.transform&&i.setActiveView(t.transform),(t.workingSpace??null)!==(i.workingSpaceAdopted?i.workingSpace:null)&&(i.setWorkingSpace(t.workingSpace),await e.applyColorWorkingSpace())}catch(e){r(`color`,e.message,{config:t.config?.id??null})}}async function XD(e,t,{resolve:n=async()=>null}={}){if(t?.v!==1)throw Error(`scene state version ${t?.v} is not 1`);let r=[],i=(e,t,n={})=>r.push({section:e,reason:t,...n});for(let n of t.appended??[]){if(!n.url){i(`appended`,`added from memory, not a file`,{name:n.name});continue}try{await e.addModel(n.url,{name:n.name,cacheKey:n.cacheKey??void 0})}catch(e){i(`appended`,e.message,{name:n.name})}}let a=UD(e),o=t.scene??{},s=o.meshes===a.meshes&&o.materials===a.materials;s||i(`scene`,`the loaded scene is not the one saved: objects and materials left as loaded`,{saved:o,now:a}),await JD(e,t.environment,n,i),await YD(e,t.color,n,i);let c=e.settings.restore(t.settings);c.length&&i(`settings`,`not settings in this engine`,{keys:c});let l=e.lightManager.restore(t.lights);for(let t of l){let{gobo:n,ies:r}=t.userData;n&&e.goboManager?.entries?.length&&e.goboManager.setLightGobo(t.uuid,n.name,n),r&&e.iesManager?.entries?.length&&e.iesManager.setSpotLightProfile(t.uuid,r.name,r.intensity,{applyAutoCone:!1})}if(s){let n=WD(e);for(let r of t.materials??[]){let t=n.get(r.index);if(!t||(t.name??``)!==r.name){i(`materials`,`no such material`,{index:r.index,name:r.name});continue}for(let[n,i]of Object.entries(r.props)){let a=qr(i);qD(t,n,a),e.setMaterialProperty(r.index,n,a)}}let r=e.meshScene,a=new Set((t.hidden??[]).map(e=>HD(r,e)).filter(Boolean));r.traverse(e=>{e!==r&&!e.isLight&&(e.visible=!a.has(e))}),e.updateAllMeshVisibility();let o=[];for(let n of t.moved??[]){let t=HD(r,n.path);if(!t||t.name!==n.name){i(`moved`,`no such object`,{name:n.name});continue}t.position.fromArray(n.position),t.quaternion.fromArray(n.quaternion),t.scale.fromArray(n.scale),t.updateMatrixWorld(!0),e.transformManager?.noteMoved(t),o.push(t)}if(o.length){let t=[];e.sceneMeshes.forEach((e,n)=>{for(let r=e;r;r=r.parent)if(o.includes(r)){t.push(n);break}}),t.length&&e.updateMeshTransforms(t)}}let{mismatched:u}=e.cameraManager.restore(t.cameras);return u.length&&i(`cameras`,`model cameras changed`,{names:u}),e._dispatchCamerasUpdated(),e.timeline?.restore(t.timeline),e.reset(),{skipped:r}}rn(),Ce(),Js(),El();var ZD=({element:e,pbrtEntry:t}={})=>({...e===void 0?{}:{element:e},...t===void 0?{}:{pbrtEntry:t}}),QD=new WeakMap,$D=Wt(`engine`);function eO(e,t){e.lost.then(e=>{t.app&&t.app._handleDeviceLost(e)})}var tO=/swiftshader|llvmpipe|lavapipe|basic render|microsoft basic|warp/i;function nO(e){let t=e.info??{},n=`${t.vendor??``} ${t.architecture??``} ${t.device??``} ${t.description??``}`;return{vendor:t.vendor??``,architecture:t.architecture??``,device:t.device??``,description:t.description??``,isSoftware:t.isFallbackAdapter===!0||e.isFallbackAdapter===!0||tO.test(n)}}var rO=class extends r.EventDispatcher{constructor(e,t={}){super();try{QD.get(e)?.dispose()}catch(e){$D.warn(`prior canvas owner dispose failed`,e)}QD.set(e,this),this.canvas=e,this._autoResize=t.autoResize!==!1,this._maxSceneBytes=t.maxSceneBytes,this._storageOption=t.storage,this._memorySpill=t.memorySpill===!0,this.storage=null,this._storageRelease=null,this._container=t.container||null,this._applySceneMetadataEnabled=t.applySceneMetadata!==!1,this._applyingSceneMetadata=!1,this._profile=Ge(t.profile),this._issues=new xn({strict:t.strict===!0,onIssue:e=>this.dispatchEvent({type:B.ISSUE,issue:e})}),this.color=new ju({issues:this._issues}),Eu(this.color),this.settings=new Yb({...U,environmentRotation:this._profile.environmentRotation,saturation:this._profile.saturation,dofMode:this._profile.dofMode},{issues:this._issues}),this.renderer=null,this.scene=null,this.meshScene=null,this._sceneHelpers=null,this.assetLoader=null,this._sdf=null,this._animRefitInFlight=!1,this._emittersMoved=!1,this._maxTextureSize=U.maxTextureSize,this.pipeline=null,this._pendingReservedRenderSize=null,this.stages={},this.cameraManager=null,this.timeline=null,this.lightManager=null,this.goboManager=null,this.iesManager=null,this.denoisingManager=null,this.overlayManager=null,this.interactionManager=null,this.transformManager=null,this.animationManager=new PD,this.environmentManager=null,this.isInitialized=!1,this.pauseRendering=!1,this._pathTracerEnabled=!0,this._rasterPrecompile=null,this.animationManagerId=null,this.needsReset=!1,this._loadingInProgress=!1,this._needsDisplayRefresh=!1,this._paused=!1,this._emissiveSamplingUserSet=!1,this.completion=new Ab,this._resizeDebounceTimer=null,this._displayWidth=0,this._displayHeight=0,this._renderScale=1,this._pendingRenderScale=null,this._trackedListeners=[],this._disposed=!1,this._deviceLost=!1,this._gpuDevice=null,this._deviceLostHolder=null,this._deterministic=!1,this._dispatchPinned=!1,this._deterministicRestore=null,this.adapterInfo=null}_addTrackedListener(e,t,n){e&&(e.addEventListener(t,n),this._trackedListeners.push({target:e,type:t,handler:n}))}_removeTrackedListeners(){for(let{target:e,type:t,handler:n}of this._trackedListeners)try{e.removeEventListener(t,n)}catch(e){$D.warn(`failed to remove listener`,t,e)}this._trackedListeners.length=0}async init(){let e=this._initStorage();return await this._initRenderer(),this._applyPendingReservedRenderSize(),this._initCameraManager(),this._initScenes(),this._initAssetPipeline(),this._initPipeline(),await this._initManagers(),this._wireEvents(),await e,this._attachStorage(),this.stages.pathTracer.setTriangleData(new Uint32Array(st.FLOATS_PER_TRIANGLE),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setupMaterial(),this.isInitialized=!0,$D.debug(`WebGPU path tracer app initialized`),this}async _initStorage(){let e=this._storageOption??Ks().storage;if(e!==!1){if(e instanceof pr)this.storage=e;else{let{storage:e,reason:t,release:n}=await Gb(Ks().cacheNamespace);if(this._disposed){n();return}if(!e){this._issues.warn(Y.STORAGE_UNAVAILABLE,`on-disk storage is off: ${t}`,{reason:t});return}this.storage=e,this._storageRelease=n}this._addTrackedListener(this.storage,`change`,e=>this.dispatchEvent({type:B.STORAGE_CHANGED,area:e.area})),this._addTrackedListener(this.storage,`issue`,e=>this._issues.warn(e.code,e.message,e.detail))}}_attachStorage(){this.assetLoader&&(this.assetLoader.storage=this.storage)}animate(){if(this._deviceLost)return;if(this.animationManagerId=requestAnimationFrame(()=>this.animate()),this._loadingInProgress||this._sdf?.isProcessing){this.dispatchEvent({type:B.FRAME});return}if(this.timeline.update(),this.cameraManager.updateControls(),this._applyPendingRenderScale(),this.animationManager?.isPlaying&&!this._animRefitInFlight){let e=this.animationManager.update();e&&(this._animRefitInFlight=!0,this.refitBVH(e).catch(e=>$D.error(`animation refit error:`,e)).finally(()=>{this._animRefitInFlight=!1}))}let e=this.needsReset;if(this.needsReset&&=(this.stages.pathTracer?.noteViewChanged(),this.reset(!0),!1),this.cameraManager.camera.updateMatrixWorld(),!this.pathTracerEnabled){this.renderer.render(this.meshScene,this.cameraManager.camera),this._renderHelperOverlay();return}if(!this.pauseRendering){if(this.cameraManager.updateAutoFocus(),this.stages.pathTracer?.isReady){if(this.stages.pathTracer.isComplete&&this.completion.renderCompleteDispatched){this._needsDisplayRefresh&&(this._needsDisplayRefresh=!1,this.stages.compositor.render(this.pipeline.context),this._renderHelperOverlay()),this.stopAnimation();return}if(this.denoisingManager?.skipsTrace()){e&&this.stages.pathTracer.enterInteractionMode(),this._renderHelperOverlay(),this.dispatchEvent({type:B.FRAME});return}this.pipeline.render(),this.denoisingManager?.afterTrace(),this.stages.pathTracer.isComplete||(this.completion.updateTime(),this.denoisingManager?.tickContinuousDenoise(this.stages.pathTracer.frameCount)),this._ensureVRAMWiring();let t=this.stages.pathTracer?.vramTracker,n=this.stages.pathTracer?.frameCount??0;if(t&&(n<=1||n%30==0)&&t.measure(),Ee({timeElapsed:this.completion.timeElapsed,samples:De(this.stages.pathTracer),memoryUsed:t?.current??0,memoryPeak:t?.peak??0}),this.completion.isTimeLimitReached(this.stages.pathTracer,this.settings.get(`renderLimitMode`),this.settings.get(`renderTimeLimit`))&&(this.stages.pathTracer.isComplete=!0),this.stages.pathTracer.isComplete&&this.completion.markComplete()){this.denoisingManager.onRenderComplete({isStillComplete:()=>this.completion.renderCompleteDispatched,context:this.pipeline?.context});let e={samples:this.stages.pathTracer.frameCount,timeElapsed:this.completion.timeElapsed,budgetOverrun:this.completion.budgetOverrun,reason:this.completion.stopCondition(this.stages.pathTracer)??`samples`};this.dispatchEvent({type:`RenderComplete`,...e}),this.dispatchEvent({type:B.RENDER_COMPLETE,...e})}}this._renderHelperOverlay(),this.dispatchEvent({type:B.FRAME})}}stopAnimation(){this.animationManagerId&&=(cancelAnimationFrame(this.animationManagerId),null)}_handleDeviceLost(e){this._deviceLost||(this._deviceLost=!0,$D.error(`WebGPU device lost (${e?.reason||`unknown`}): ${e?.message||``}`),this.stopAnimation(),this.dispatchEvent({type:B.DEVICE_LOST,reason:e?.reason,message:e?.message}))}wake(){this._deviceLost||!this.animationManagerId&&this.isInitialized&&!this._paused&&this.animate()}pause(){this._paused=!0,this.stopAnimation()}resume(){this._paused=!1,this.animationManagerId||this.animate()}reset(e=!1,{motion:t=!1}={}){t&&this.stages.pathTracer?.noteViewChanged(),this.denoisingManager?.beforeReset({keepHistory:e||t}),this.pipeline&&(this.pipeline.reset(),e||(this.pipeline.eventBus.emit(`asvgf:reset`),this.pipeline.eventBus.emit(`denoiser:reset`))),this.denoisingManager?.afterReset(),this._abortPostProcess({keepDisplay:!0}),this.completion.reset(),this.wake(),this.dispatchEvent({type:`RenderReset`}),this.dispatchEvent({type:B.RENDER_RESET})}dispose(){if(!this._disposed){if(this._disposed=!0,this.dispatchEvent({type:B.DISPOSE}),this.stopAnimation(),clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=null,this._removeTrackedListeners(),we(null),this._storageRelease?.(),this._storageRelease=null,this.storage=null,this._sceneSource=this._sceneSourceFile=null,this._issues.detach(),this.color?.dispose(),this.color=null,this._textureReadback?.dispose(),this._textureReadback=null,this.interactionManager?.deselect?.(),this.transformManager?.detach?.(),this.animationManager?.dispose(),this.transformManager?.dispose(),this.overlayManager?.dispose(),this.lightManager?.dispose(),this.goboManager?.dispose(),this.iesManager?.dispose(),this.denoisingManager?.dispose(),this.interactionManager?.dispose(),this.timeline?.dispose(),this.cameraManager?.dispose(),this.pipeline?.dispose(),this._sdf?.dispose(),this._sdf=null,this.assetLoader?.dispose(),this.assetLoader=null,this.meshScene){this.meshScene.environment?.dispose(),this.meshScene.environment=null;for(let e of[...this.meshScene.children])Me(e);this.meshScene.clear(),this.meshScene=null}this._sceneHelpers?.clear(),this._sceneHelpers=null,this.scene?.clear(),this.scene=null;try{let e=(0,n.texture)().value,t=(0,n.cubeTexture)().value;e?._listeners?.dispose&&(e._listeners.dispose.length=0),t?._listeners?.dispose&&(t._listeners.dispose.length=0)}catch(e){$D.warn(`failed to clear TSL texture singleton listeners`,e)}this.canvas&&QD.get(this.canvas)===this&&QD.delete(this.canvas),this._gpuDevice&&=(this._gpuDevice.onuncapturederror=null,null),this._deviceLostHolder&&=(this._deviceLostHolder.app=null,null),je(this.renderer),this.renderer=null,this.stages={},this.isInitialized=!1}}unloadScene(){if(this.isInitialized){if(this._loadingInProgress)throw Error(`PathTracerApp.unloadScene: cannot unload while a load is in progress`);this._disposed||(this.animationManager?.dispose(),this._animRefitInFlight=!1,this.interactionManager?.deselect(),this.transformManager?.detach?.(),this.assetLoader?.releaseTargetModel(),this._sceneSource=this._sceneSourceFile=null,this.lightManager?.clearLights?.(),this.stages.pathTracer&&(this.stages.pathTracer.setTriangleData(new Uint32Array(st.FLOATS_PER_TRIANGLE),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setEmissiveTriangleData?.(new Float32Array,0,0),this.stages.pathTracer.setupMaterial()),this.denoisingManager?.dropDisplay(),this.reset(),this.dispatchEvent({type:`SceneUnloaded`}))}}async loadModel(e,t={}){await this._loadWithSceneRebuild(()=>this.assetLoader.loadModel(e,t),{type:`ModelLoaded`,url:e},{kind:`url`,url:e,cacheKey:t.cacheKey??null})}async loadObject3D(e,t=`object3d`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadObject3D(e,t),{type:`Object3DLoaded`,name:t},{kind:`object3d`,name:t})}_busyError(e){let t=Error(`${e}: another load is already in progress`);return t.code=`LOAD_IN_PROGRESS`,t}async loadEnvironment(e){if(this._loadingInProgress)throw this._busyError(`PathTracerApp.loadEnvironment`);this._loadingInProgress=!0;try{await this.assetLoader.loadEnvironment(e);let t=this.meshScene.environment;t&&this.stages.pathTracer&&await this.stages.pathTracer.environment.setEnvironmentMap(t),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.dispatchEvent({type:`EnvironmentLoaded`,url:e})}finally{this._loadingInProgress=!1}}async inspectArchive(e){return await this.assetLoader.inspectArchive(e)}async loadFile(e,t={}){if(t=this._sceneBudgets(t),typeof e==`string`){let n=t.filename??wg(e),r=this.assetLoader?.getFileFormat(n);if(!r)throw Error(`Unsupported file format: ${n}`);if(r.type===`environment`||r.type===`image`)return this.loadEnvironment(e);await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromUrl(e,{...t,filename:n}),{type:`ModelLoaded`,filename:n},{kind:`url`,url:e,filename:n,cacheKey:t.cacheKey??null,...ZD(t)});return}let n=this.assetLoader?.getFileFormat(e?.name||``);if(!n)throw Error(`Unsupported file format: ${e?.name}`);if(n.type!==`environment`&&n.type!==`image`){let n=Wn(e).catch(()=>({name:e.name,size:e.size,lastModified:e.lastModified??0,sample:null}));await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromFile(e,t),{type:`ModelLoaded`,filename:e.name},async()=>{let e=await n;return{kind:`local-file`,file:e,key:e.sample?Gn(e):null,...ZD(t)}}),this._sceneSourceFile=e;return}if(this._loadingInProgress)throw this._busyError(`PathTracerApp.loadFile`);this._loadingInProgress=!0;try{await this.assetLoader.loadAssetFromFile(e);let t=this.meshScene.environment;t&&this.stages.pathTracer&&await this.stages.pathTracer.environment.applyHDRI(t),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.dispatchEvent({type:`EnvironmentLoaded`,filename:e.name})}finally{this._loadingInProgress=!1}}async loadExampleModels(e,t){await this._loadWithSceneRebuild(()=>this.assetLoader.loadExampleModels(e,t),{type:`ModelLoaded`,index:e},{kind:`url`,url:t[e]?.url??null,cacheKey:null})}cancelLoad(){this._loadingInProgress&&this.assetLoader?.cancelActiveLoad()}async setMaxTextureSize(e,{reprocess:t=!0}={}){let n=this._maxTextureSize;if(this._maxTextureSize=this._sdf?.setMaxTextureSize(e)??e,typeof this.stages?.pathTracer?.sdfs?.setMaxTextureSize==`function`&&this.stages.pathTracer.sdfs.setMaxTextureSize(this._maxTextureSize),t&&this._maxTextureSize!==n&&this._sdf?.triangles&&!this._loadingInProgress){this._loadingInProgress=!0;try{await this.loadSceneData(),this.reset(),this.dispatchEvent({type:`TexturesReprocessed`,maxTextureSize:this._maxTextureSize})}finally{this._loadingInProgress=!1}}}get sceneSource(){return this._sceneSource??null}get sceneSourceFile(){return this._sceneSourceFile??null}async _loadWithSceneRebuild(e,t,n=null){if(this._loadingInProgress)throw this._busyError(`PathTracerApp`);this._loadingInProgress=!0;try{await e(),this._sceneSource=typeof n==`function`?await n():n,this._sceneSourceFile=null,this._emissiveSamplingUserSet=!1,this._clearAppendedModels(),this._syncControlsAfterLoad(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()}),this._maybeSpill(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.denoisingManager?.dropDisplay(),this.reset(),this.cameraManager.currentCameraIndex=0,this.dispatchEvent(t),this._dispatchCamerasUpdated()}catch(e){throw(!e||e.code!==`LOAD_IN_PROGRESS`)&&this._discardFailedLoad(),e}finally{this._loadingInProgress=!1}}_discardFailedLoad(){this._sceneSource=this._sceneSourceFile=null;try{this._clearAppendedModels(),this.assetLoader?.releaseTargetModel(),this.denoisingManager?.dropDisplay(),this.reset()}catch(e){console.warn(`PathTracerApp: could not clear the scene after a failed load`,e)}}get sceneMetadata(){return this.assetLoader?.sceneMetadata??null}_beginSceneMetadataEnvironment(){let e=this.sceneMetadata?.environment;return!this._applySceneMetadataEnabled||!e?.sourceFile||!this.stages.pathTracer?null:(this.stages.pathTracer.environment.beginHDRI(),this._applyingSceneMetadata=!0,this.assetLoader.loadEnvironment(e.sourceFile).catch(t=>(this._issues.record(Y.ENVIRONMENT_LOAD_FAILED,`authored environment "${e.sourceFile}" failed to load — lighting falls back to the previous environment`,{sourceFile:e.sourceFile,cause:String(t?.message??t)}),null)).finally(()=>{this._applyingSceneMetadata=!1}))}_applySceneMetadataSettings(e){let t=this.sceneMetadata,n=t?.environment;if(!n)return;let r={enableEnvironment:!0,showBackground:!0,transparentBackground:!1};n.intensity!==void 0&&(r.environmentIntensity=n.intensity,r.backgroundIntensity=n.intensity),n.rotation!==void 0&&(r.environmentRotation=n.rotation),this.settings.setMany(r,{reset:!1,source:qb.SCENE_METADATA}),this.scene&&(this.scene.background=e),this.dispatchEvent({type:B.SCENE_METADATA_APPLIED,metadata:t,environment:{...n}})}async loadSceneData({pendingEnvironment:e=null,keepUserLights:t=!1}={}){this._preserveSelectionOnRebuild||this.interactionManager?.deselect(),this.animationManager.dispose(),this._animRefitInFlight=!1,this._emittersMoved=!1,this._tagPrimarySceneObject();let n=new Sh(``,{namespace:`scene`,level:`info`}),r=()=>this.stages.pathTracer.environment.envParams.mode===`hdri`?this.meshScene.environment:null,i=r(),a=null;if(e?(n.start(`Environment fetch + CDF (concurrent)`),a=e.then(async e=>{e&&(await this.stages.pathTracer.environment.applyHDRI(e),this._applySceneMetadataSettings(e))}).catch(e=>this._issues.record(Y.ENVIRONMENT_LOAD_FAILED,`authored environment failed to install — the scene is lit by whatever was already loaded`,{cause:String(e?.message??e)})).finally(()=>n.end(`Environment fetch + CDF (concurrent)`))):i?.image?.data&&(n.start(`Environment CDF build (worker)`),this.stages.pathTracer.scene.environment=i,a=this.stages.pathTracer.environment.buildEnvironmentCDF().then(()=>{n.end(`Environment CDF build (worker)`),this._applySceneMetadataEnabled&&this._applySceneMetadataSettings(i)})),n.start(`BVH build (SceneProcessor)`),this._sdf.setMaxTextureSize(this._maxTextureSize),await this._sdf.buildBVH(this.meshScene,{sceneKey:this.assetLoader?.sceneSourceKey??null,progressive:this._progressiveSpill()}),this.assetLoader?.flushPendingGraph(this._sdf.performanceMetrics.totalProcessingTime),n.end(`BVH build (SceneProcessor)`),H({status:`Transferring data to GPU...`,progress:86}),await new Promise(e=>setTimeout(e,0)),n.start(`GPU data transfer`),!this._sdf.uploadToPathTracer(this.stages.pathTracer,this.lightManager,this.meshScene,r(),{keepUserLights:t}))return!1;this.stages.pathTracer._meshRefs=this.stages.pathTracer._collectMeshRefs(this.meshScene),this.stages.pathTracer.setMeshVisibilityData(this.stages.pathTracer._meshRefs),this._refreshEmissiveForVisibility(),n.end(`GPU data transfer`),H({status:`Compiling shaders...`,progress:90}),await new Promise(e=>setTimeout(e,0)),n.start(`Material setup (TSL compile)`),this.stages.pathTracer.setupMaterial(),n.end(`Material setup (TSL compile)`),this._rasterPrecompile=null,this._pathTracerEnabled||(n.start(`Pipeline precompile`),await this.precompileRaster(),n.end(`Pipeline precompile`)),a&&(H({status:`Finalizing environment map...`,progress:95}),await a,this.stages.pathTracer.environment.applyCDFResults());let o=this.getSceneMinY();if(this.settings.set(`groundProjectionLevel`,o,{reset:!1}),this.settings.set(`groundCatcherHeight`,o,{reset:!1}),!this._emissiveSamplingUserSet){let e=(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0;this.settings.set(`enableEmissiveTriangleSampling`,e,{reset:!1})}return n.start(`Apply settings`),this.settings.applyAll(),this.stages.compositor.setTransparentBackground(this.settings.get(`transparentBackground`)),n.end(`Apply settings`),n.print(this._sceneSummaryParts()),Te(),this._initAnimationAndTransforms(),this.dispatchEvent({type:`SceneRebuild`}),!0}_sceneSummaryParts(){let e=this.stages.pathTracer,t=this._sdf?.instanceTable?.setCount??0,n=this._sdf?.geometryExtractor?.maps?.length??0;return[J.count(e.triangleCount,`tri`),t?J.count(t,`mesh`,`meshes`):null,J.count(e.materialData.materialCount,`material`),n?J.count(n,`map`):null,J.count(e.bvhNodeCount,`BVH node`)]}_tagPrimarySceneObject(){let e=this.sceneModel;e&&(e.userData.__rayzeeSceneObject=!0)}_clearAppendedModels(){let e=this.meshScene;if(!e)return;let t=this.assetLoader?.floorPlane,n=this.sceneModel;for(let r of[...e.children])r===t||r===n||r.userData?.__rayzeeSceneObject&&this.assetLoader.removeModelRoot(r)}async _finishRebuildNoReframe(e){await this.loadSceneData({keepUserLights:!0}),this._maybeSpill(),this._recalibrateControlLimits(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),e&&this.dispatchEvent(e)}async addModel(e,{name:t,cacheKey:n}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModel: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:r}=await this.assetLoader.appendModel(e,{cacheKey:n});return r.userData.__rayzeeSceneObject=!0,r.userData.__rayzeeSourceUrl=e,n&&(r.userData.__rayzeeCacheKey=n),t&&(r.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,url:e,id:r.uuid}),r.uuid}finally{this._preserveSelectionOnRebuild=!1,this._loadingInProgress=!1}}async addModelFromObject3D(e,{name:t}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModelFromObject3D: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:n}=this.assetLoader.appendObject3D(e,t||`object3d`);return n.userData.__rayzeeSceneObject=!0,t&&(n.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,id:n.uuid}),n.uuid}finally{this._preserveSelectionOnRebuild=!1,this._loadingInProgress=!1}}async removeSceneObject(e){if(!this.meshScene)return!1;let t=this.assetLoader?.floorPlane;if(t&&t.uuid===e)return!1;let n=this.getSceneObject(e);if(!n)return!1;if(this._loadingInProgress)throw Error(`PathTracerApp.removeSceneObject: another load is already in progress`);this._loadingInProgress=!0;try{return this.interactionManager?.deselect(),this.transformManager?.detach?.(),n===this.sceneModel?this.assetLoader.releaseTargetModel():this.assetLoader.removeModelRoot(n),await this._finishRebuildNoReframe({type:`SceneObjectRemoved`,id:e}),!0}finally{this._loadingInProgress=!1}}setSceneObjectVisibility(e,t){return this.setMeshVisibilityByUuid(e,t)}get currentCameraIndex(){return this.cameraManager?.currentCameraIndex??0}addCamera({name:e}={}){let t=this.cameraManager.addCameraFromView(e);return this.cameraManager.switchCamera(t),this._dispatchCamerasUpdated(),t}removeCamera(e){let t=this.cameraManager.removeCamera(e);return t&&this._dispatchCamerasUpdated(),t}exportSceneState(){return KD(this)}async importSceneState(e,t){return await XD(this,e,t)}_sceneBudgets(e){return!this._memorySpill||!this.storage?e:{maxTriangles:KC,maxPlacements:qC,...e}}_progressiveSpill(){if(!this._memorySpill||!this.storage||(this.assetLoader?.animations?.length??0)>0)return null;let e=this.stages.pathTracer;return{storage:this.storage,uploader:(t,n)=>n===`triangles`?e.createTriangleChunkUploader(t):e.createChunkUploader(t)}}_maybeSpill(){!this._memorySpill||!this.storage||this.animationManager?.hasAnimations||this._sdf?.spillToDisk(this.storage).then(e=>e&&this.dispatchEvent({type:`SceneSpilled`,...e})).catch(e=>this._issues.warn(Y.STORAGE_WRITE_FAILED,`memory spill failed: ${e.message}`))}async ensureSceneResident(){this._sdf?.spilled&&await this._sdf.ensureResident()}_dispatchCamerasUpdated(){this.dispatchEvent({type:`CamerasUpdated`,cameras:this.cameraManager.cameras,cameraNames:this.cameraManager.getCameraNames()})}get sceneMeshes(){return this._sdf?.meshes??[]}get sceneModel(){return this.assetLoader?.targetModel??null}getSceneObject(e){let t=this.meshScene?.children.find(t=>t.uuid===e);return t?.userData?.__rayzeeSceneObject?t:null}async refitBVH(e,t){await this.ensureSceneResident();let n=await this._sdf.refitBVH(e,t);return this.stages.pathTracer.updateTriangleData(this._sdf.triangles),this.stages.pathTracer.updateBVHData(this._sdf.bvh),this.reset(!1,{motion:!0}),n}refitBLASes(e,t,n){if(this._sdf?.spilled)throw Error(`refitBLASes: the scene is spilled to disk — await app.ensureSceneResident() first`);let r=this._sdf.refitBLASes(e,t,n),{triRanges:i,bvhRanges:a}=this._sdf.computeBLASDirtyRanges(e);return this.stages.pathTracer.updateBufferRanges(i,a),this.reset(!1,{motion:!0}),this._sdf.scheduleBackgroundRebuild(e,e=>{let t=this._sdf.computeBLASDirtyRanges([e]);this.stages.pathTracer.updateBufferRanges(t.triRanges,t.bvhRanges),this.reset(!1,{motion:!0})}),r}_applyAnimationPose({meshIndices:e,visibilityChanged:t,cameras:n}){if(!this._sdf?.instanceTable)return;let r=!1;e.length>0&&(this._notePlacementsMoving(e),this._sdf.updateMeshTransforms(e),this.stages.pathTracer?.updateBufferRanges([],[this._sdf.computeTLASDirtyRange()]),this._sdf.movesEmitters(e)&&(this._emittersMoved=!0,this.animationManager.isPlaying||this._refreshMovedEmitters()),r=!0),t&&(this.stages.pathTracer?.updateAllMeshVisibility(),this._refreshEmissiveForVisibility(),r=!0),n.length>0&&this._followAnimatedCamera(n)&&(r=!0),r&&this.reset(!1,{motion:!0})}_notePlacementsMoving(e){let t=this.denoisingManager,n=this._sdf?.instanceTable;if(!(!t?.historyActive||!n))for(let r of e){let e=n.placementRunOf(r);if(e)for(let r=e.start;r<e.start+e.count;r++)t.notePlacementMoving(n.tlasLeafIndex[r],n.world,r*16)}}_refreshMovedEmitters(){if(this._emittersMoved){if(this._sdf?.spilled){this.ensureSceneResident().then(()=>this._refreshMovedEmitters());return}this._emittersMoved=!1,this._uploadEmissivePayload(this._sdf?.refreshEmissiveTransforms()??null)}}_followAnimatedCamera(e){let t=this.cameraManager,n=t.currentCameraIndex>0?t.cameras[t.currentCameraIndex]:null,i=n?.userData?.__rayzeeSourceUuid,a=i&&e.find(e=>e.uuid===i);if(!a)return!1;a.updateWorldMatrix(!0,!1);let o=new r.Vector3;a.matrixWorld.decompose(n.position,n.quaternion,o),n.scale.set(Math.sign(o.x)||1,Math.sign(o.y)||1,Math.sign(o.z)||1),a.isPerspectiveCamera&&(n.fov=a.fov);let s=t.camera,c=t.controls,l=c?c.target.distanceTo(s.position):0;if(s.position.copy(n.position),s.quaternion.copy(n.quaternion),s.scale.copy(n.scale),s.isPerspectiveCamera&&n.isPerspectiveCamera&&(s.fov=n.fov),s.updateProjectionMatrix(),s.updateMatrixWorld(!0),c){let e=new r.Vector3(0,0,-1).applyQuaternion(s.quaternion);c.target.copy(s.position).addScaledVector(e,l||1)}return!0}updateMeshTransforms(e){this._notePlacementsMoving(e);let t=this._sdf.updateMeshTransforms(e);return this.stages.pathTracer.updateBufferRanges([],[this._sdf.computeTLASDirtyRange()]),this.reset(!1,{motion:!0}),t}setReservedRenderResolution(e,{allowLower:t=!1}={}){let n=t?e:Math.max(e,W);if(!this.renderer)return this._pendingReservedRenderSize={requestedPx:e,allowLower:t},Math.max(256,Math.min(Ze,Math.floor(n)||256));let r=this.renderer.backend?.device?.limits?.maxStorageBufferBindingSize||128*1024*1024,i=(typeof navigator<`u`&&navigator.deviceMemory||4)>=8&&r>=1024*1024*1024?Ze:2048,a=Qe(Math.min(n,i));if((this.stages?.pathTracer?.storageTextures?.writeColor?.image?.width??a)!==a){let e=this.pauseRendering;this.pauseRendering=!0;try{let e=this.renderer.domElement;(e.width>a||e.height>a)&&this.renderer.setSize(Math.min(e.width,a),Math.min(e.height,a),!1);for(let e of Object.values(this.stages))e?.reallocateReservedStorage?.()}finally{this.pauseRendering=e}this.reset(),this.dispatchEvent({type:`reserved_render_size_changed`,size:a})}return a}_applyPendingReservedRenderSize(){let e=this._pendingReservedRenderSize;if(!e)return;this._pendingReservedRenderSize=null;let t=this.setReservedRenderResolution(e.requestedPx,{allowLower:e.allowLower});t<e.requestedPx&&this._issues.warn(Y.RENDER_RESERVE_CAPPED,`reserved render size ${J.n(e.requestedPx)}px was capped to ${J.n(t)}px by this device's limits — renders above ${J.n(t)}px will be declined`,{requested:e.requestedPx,applied:t}),this.dispatchEvent({type:`reserved_render_size_changed`,size:t})}getReservedRenderResolution(){return W}_isRenderSizeSupported(e,t){return e>W||t>W?(this._issues.record(Y.RENDER_SIZE_DECLINED,`render resolution ${e}×${t} exceeds the ${W}px storage reserve — resize ignored, so output stays at the previous size. Raise it with setReservedRenderResolution( ${Math.max(e,t)} ) before init().`,{width:e,height:t,reserve:W}),!1):!0}onResize(){let e=this.canvas.clientWidth,t=this.canvas.clientHeight;if(e===0||t===0||!this._isRenderSizeSupported(e,t))return;this.renderer.setPixelRatio(1),this._setDisplaySize(e,t);let n=this.denoisingManager?._lastRenderWidth??0,r=this.denoisingManager?._lastRenderHeight??0;e===n&&t===r||(clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=setTimeout(()=>{this._applyRenderResize(e,t)},300))}_applyRenderResize(e,t){this._isRenderSizeSupported(e,t)&&(this.pipeline?.setSize(this._scaled(e),this._scaled(t)),this.denoisingManager?.setRenderSize(e,t),this.needsReset=!0,this.dispatchEvent({type:`resolution_changed`,width:e,height:t}))}setCanvasSize(e,t){return e===0||t===0||!this._isRenderSizeSupported(e,t)?null:(this.renderer.setPixelRatio(1),this._setDisplaySize(e,t),clearTimeout(this._resizeDebounceTimer),this._applyRenderResize(e,t),{width:e,height:t})}_scaled(e){return Math.max(1,Math.round(e*this._renderScale))}_setDisplaySize(e,t){this._displayWidth=e,this._displayHeight=t,this.renderer.setSize(this._scaled(e),this._scaled(t),!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix()}_interactionRenderScale(){if(this.denoisingManager?.continuousDenoise)return 1;let e=Number(this.settings.get(`interactionRenderScale`));return e>0?Math.min(1,Math.max(.125,e)):1}_requestRenderScale(e){this._pendingRenderScale=e}_applyPendingRenderScale(){this._pendingRenderScale!==null&&this._applyRenderScale(this._pendingRenderScale)}_applyRenderScale(e){this._pendingRenderScale=null,!(this._disposed||e===this._renderScale)&&(this._renderScale=e,!(!this._displayWidth||!this._displayHeight)&&(this._setDisplaySize(this._displayWidth,this._displayHeight),this.pipeline?.setSize(this._scaled(this._displayWidth),this._scaled(this._displayHeight)),this.pipeline?.eventBus.emit(`asvgf:reset`),this.pipeline?.eventBus.emit(`denoiser:reset`),this.needsReset=!0))}configureForMode(e,t={}){let n=e===`production`,r=n?Pt:Ft;this.denoisingManager?.setCadenceSuspended(n),this.timeline.stop(),this.cameraManager.controls.enabled=!n,this.settings.setMany(It(r),{silent:!0,source:qb.MODE_PRESET}),this.stages.pathTracer?.setUniform(`renderMode`,parseInt(r.renderMode)),n&&this._applyRenderScale(1),this.stages.pathTracer?.updateCompletionThreshold?.();let i=this.denoisingManager?.denoiser;if(i&&(i.abort(),this.denoisingManager.applyOIDNEnabled(r.enableOIDN),this.denoisingManager.applyOIDNQuality(r.oidnQuality)),this.denoisingManager?._syncGBufferStages?.(),this.denoisingManager?.upscaler?.abort(),t.canvasWidth&&t.canvasHeight&&(this.setReservedRenderResolution(Math.max(t.canvasWidth,t.canvasHeight)),this.setCanvasSize(t.canvasWidth,t.canvasHeight)),this.needsReset=!1,this.pauseRendering=!1,n){let e=this.stages.pathTracer?.vramTracker;e&&(e.measure(),e.resetPeak())}this.reset()}refreshFrame(){this._needsDisplayRefresh=!0,this.wake()}_abortPostProcess({keepDisplay:e=!1}={}){if(this.denoisingManager?.abort(this.canvas,{keepDisplay:e}),this.denoisingManager?.restoreBaseResolution()){let e=this.denoisingManager._lastRenderWidth,t=this.denoisingManager._lastRenderHeight;this.dispatchEvent({type:`resolution_changed`,width:e,height:t})}}requestPostProcessRefresh(){!this.stages.pathTracer?.isReady||this._deviceLost||(this._abortPostProcess(),this.completion.renderCompleteDispatched=!1,this.wake())}setDeterministicMode(e=!0,{pinDispatch:t=!0}={}){let n=this.stages.pathTracer;if(!n)return!1;if(e)this._deterministicRestore||={settings:{useAdaptiveSampling:this.settings.get(`useAdaptiveSampling`),usePixelFreeze:this.settings.get(`usePixelFreeze`),interactionModeEnabled:this.settings.get(`interactionModeEnabled`),renderLimitMode:this.settings.get(`renderLimitMode`),renderTimeLimit:this.settings.get(`renderTimeLimit`)},bounceEarlyExit:n._bounceEarlyExitThreshold,dynamicDispatch:n._useDynamicDispatch,autoFocusMode:this.cameraManager?.autoFocusMode,autoExposure:this.stages.autoExposure?.enabled,continuousDenoise:this.denoisingManager?.continuousDenoise},this.settings.setMany({useAdaptiveSampling:!1,usePixelFreeze:!1,interactionModeEnabled:!1,renderLimitMode:`frames`,renderTimeLimit:0},{silent:!0}),t?(n._bounceEarlyExitThreshold=-1,n._useDynamicDispatch=!1):(n._bounceEarlyExitThreshold=this._deterministicRestore.bounceEarlyExit,n._useDynamicDispatch=this._deterministicRestore.dynamicDispatch),this.cameraManager?.setAutoFocusMode(`manual`),this.stages.autoExposure&&(this.stages.autoExposure.enabled=!1),this.denoisingManager?.setContinuousDenoise(!1),n._pinSeedToFrame=!0,this._deterministic=!0,this._dispatchPinned=t;else if(this._deterministicRestore){let e=this._deterministicRestore;this.settings.setMany(e.settings,{silent:!0}),n._bounceEarlyExitThreshold=e.bounceEarlyExit,n._useDynamicDispatch=e.dynamicDispatch,e.autoFocusMode!==void 0&&this.cameraManager?.setAutoFocusMode(e.autoFocusMode),this.stages.autoExposure&&e.autoExposure!==void 0&&(this.stages.autoExposure.enabled=e.autoExposure),e.continuousDenoise!==void 0&&this.denoisingManager?.setContinuousDenoise(e.continuousDenoise),n._pinSeedToFrame=!1,this._deterministicRestore=null,this._deterministic=!1,this._dispatchPinned=!1}return this.reset(),this.stopAnimation(),this._deterministic}get issues(){return this._issues.list}get issueErrors(){return this._issues.errors}clearIssues(){this._issues.clear()}get isDeterministic(){return this._deterministic&&this._dispatchPinned}async renderFrames(e,{reset:t=!0,yieldEvery:n=8,onProgress:r,allowEarlyRetire:i=!1}={}){let a=this.stages.pathTracer;if(!a)throw Error(`renderFrames: app is not initialized`);if(!(e>0))throw Error(`renderFrames: count must be positive, got ${e}`);await a.blueNoiseReady;let o=(t?0:a.frameCount)+e;this.settings.get(`maxSamples`)<o&&this.settings.set(`maxSamples`,o,{silent:!0,reset:!1}),t&&this.reset(),this.stopAnimation();let s=e+64,c=0,l=!1;for(;a.frameCount<o&&c<s;){if(this._deviceLost)throw Error(`renderFrames: WebGPU device lost`);if(!a.isReady)throw Error(`renderFrames: path tracer stage is not ready`);if(this.pipeline.render(),c++,a.isComplete&&a.frameCount<o){l=!0;break}r?.(a.frameCount),n>0&&c%n===0&&await new Promise(e=>setTimeout(e,0))}if(a.frameCount<o&&!(l&&i)){let e=l?"adaptive sampling retired the frame at the convergence threshold — pass `allowEarlyRetire: true`, or disable it with setDeterministicMode()":`something retired the render (maxSamples, a stray reset, or a canvas resize)`;throw Error(`renderFrames: stopped at ${a.frameCount}/${o} samples after ${c} passes — ${e}`)}return a.frameCount}async captureRenderCheckpoint(){let e=this.stages.pathTracer;if(!e)return null;let t=await e.captureAccumulation();return{v:1,engine:Hh,savedAt:Date.now(),samples:t.state.frameCount,...t}}restoreRenderCheckpoint(e){if(e?.v!==1)throw Error(`render checkpoint version ${e?.v} is not 1`);let t=this.stages.pathTracer;if(!t)throw Error(`restoreRenderCheckpoint: app is not initialized`);t.restoreAccumulation(e),this.needsReset=!1,this.dispatchEvent({type:B.RENDER_RESET,restored:e.samples})}async renderToBuffer({colorSpace:e=`srgb`,preserveAlpha:t=!1,source:n=`accumulation`}={}){let r=e!==`linear`&&e!==`srgb`;if(r&&!this.color?.hasConfig)throw Error(`renderToBuffer: colorSpace must be 'linear' or 'srgb' without a colour config loaded, got "${e}"`);let i=this.stages?.pathTracer,a=i?.storageTextures?.readTarget;if(!a)throw Error(`renderToBuffer: no render target — call init() and render at least one sample`);let{width:o,height:s}=i,c=n===`display`?await this._readDisplaySource(a,o,s):await this.renderer.readRenderTargetPixelsAsync(a,0,0,o,s,0);if(e===`linear`)return{data:c,width:o,height:s,colorSpace:e,workingSpace:this.color?.workingSpace??null};if(r){let{rgba:t,colorSpace:n}=this.color.exportPixels(c,e);return{data:t,width:o,height:s,colorSpace:n}}return{data:oh(c,{exposure:this.renderer.toneMappingExposure,toneMapping:this.renderer.toneMapping,saturation:this.settings.get(`saturation`)??1,preserveAlpha:t}),width:o,height:s,colorSpace:e}}enableGPUTiming(e=!0){let t=this.renderer?.backend;return!t||e&&t.hasFeature?.(`timestamp-query`)!==!0?!1:(t.trackTimestamp=e,t.trackTimestamp===e)}profileNextDenoise(){return this.denoisingManager?.denoiser?.profileNextDenoise()??!1}async getDenoiseProfile(){let e=this.denoisingManager?.denoiser;return e?{profile:await e.getLastDenoiseProfile(),runtime:e.getRuntimeInfo()}:null}async getGPUTimings(){let e=this.renderer;if(!e?.backend?.trackTimestamp)return null;await e.resolveTimestampsAsync(`compute`),await e.resolveTimestampsAsync(`render`);let t=e.info.compute.timestamp||0,n=e.info.render.timestamp||0;return{compute:t,render:n,total:t+n}}async getKernelGPUTimings(){let e=this.renderer;if(!e?.backend?.trackTimestamp)return null;await e.resolveTimestampsAsync(`compute`);let t=e.backend.timestampQueryPool?.compute?.timestamps;if(!t||t.size===0)return null;let n=new Map,r=this.stages?.pathTracer?._kernelManager?.kernels;if(r)for(let[e,t]of r)n.set(t.id,e);let i=[],a=-1;for(let[e,n]of t){let t=e.split(`:`);if(t.length!==4)continue;let r=Number(t[3].slice(1));Number.isFinite(r)&&(i.push({nodeId:Number(t[2]),f:r,ms:n}),r>a&&(a=r))}let o={},s=0,c=0;for(let e of i){if(e.f!==a)continue;s+=e.ms;let t=n.get(e.nodeId);t===void 0?c+=e.ms:o[t]=(o[t]??0)+e.ms}return{kernels:o,total:s,unattributed:c,frame:a}}getCanvas(){if(!this.renderer?.domElement)return null;let e=this.denoisingManager?.upscalerCanvas;return e&&e.style.display!==`none`?e:(this.stages.compositor&&this.pipeline?.context&&this.stages.compositor.render(this.pipeline.context),this.renderer.domElement)}screenshot({type:e=`image/png`,quality:t}={}){let n=this.getCanvas();return n?new Promise(r=>n.toBlob(r,e,t)):Promise.resolve(null)}getStatistics(){try{return this._sdf?.getStatistics?.()??null}catch{return null}}get pathTracerEnabled(){return this._pathTracerEnabled}set pathTracerEnabled(e){this._pathTracerEnabled=e,e||this.precompileRaster()}precompileRaster(){return!this.renderer||!this.meshScene?Promise.resolve():(this._rasterPrecompile??=this.renderer.compileAsync(this.meshScene,this.cameraManager.camera).catch(e=>$D.warn(`raster fallback precompile failed`,e)),this._rasterPrecompile)}get isLoading(){return this._loadingInProgress}isComplete(){return this.stages.pathTracer?.isComplete??!1}getFrameCount(){return this.stages.pathTracer?.frameCount||0}getConvergenceStats(){return this.stages.pathTracer?.getConvergenceStats?.()??null}get vram(){return this.stages.pathTracer?.vramTracker??null}getMemoryInfo(){return this.stages.pathTracer?.vramTracker?.measure()??{current:0,peak:0,byCategory:{}}}getHostMemoryInfo(){let e=this._sdf;return e?.memory?{preflight:e.memoryPreflight,...e.memory.report}:null}_ensureVRAMWiring(){if(this._vramWired)return;let e=this.stages.pathTracer?.vramTracker;if(!e)return;e.register(`stages`,()=>this._collectStageTextures());let t=()=>e.measure();this._addTrackedListener(this,`SceneRebuild`,t),this._addTrackedListener(this,`EnvironmentLoaded`,t),this._addTrackedListener(this,`resolution_changed`,t),this._vramWired=!0}_collectStageTextures(){let e=[],t=this.stages||{},n=t.pathTracer;for(let r in t){let i=t[r];if(!(!i||i===n||typeof i!=`object`))for(let t in i){let n=i[t];n&&(n.isTexture||n.isRenderTarget)&&e.push(n)}}return e}getSceneMinY(){if(!this.meshScene)return 0;let e=new r.Box3().setFromObject(this.meshScene);return Number.isFinite(e.min.y)?e.min.y:0}getMaterialProperty(e,t){return this.stages.pathTracer?.materialData.getMaterialProperty(e,t)}getMaterialPropertySource(e,t){return this.stages.pathTracer?.materialData.getMaterialPropertySource(e,t)}setMaterialProperty(e,t,n){if(this._sdf?.spilled&&$r.has(t)){this.ensureSceneResident().then(()=>this.setMaterialProperty(e,t,n));return}this.stages.pathTracer?.materialData.updateMaterialProperty(e,t,n),[`emissive`,`emissiveIntensity`].includes(t)&&this._sdf&&this._uploadEmissivePayload(this._sdf.updateMaterialEmissive(e,t,n)),this.reset()}_uploadEmissivePayload(e){!e||!this.stages.pathTracer||(this.stages.pathTracer.setEmissiveTriangleData(e.rawData,e.emissiveCount,e.totalPower,e.bitTrailMap),e.lightBVHNodeData&&this.stages.pathTracer.setLightBVHData(e.lightBVHNodeData,e.lightBVHNodeCount))}_refreshEmissiveForVisibility(){let e=this._sdf?.instanceTable;if(!e)return;let t=new Set;for(let n=0;n<e.count;n++)e.isSet[n]&&!e.visible[n]&&t.add(e.sourceMesh[n]);this._uploadEmissivePayload(this._sdf.rebuildEmissiveForVisibility(t))}setEmissiveTriangleSampling(e){this._emissiveSamplingUserSet=!0,this.settings.set(`enableEmissiveTriangleSampling`,e)}hasEmissiveGeometry(){return(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0}setMeshVisibility(e,t){this.stages.pathTracer?.updateMeshVisibility(e,t),this._refreshEmissiveForVisibility(),this.reset()}updateAllMeshVisibility(){this.stages.pathTracer?.updateAllMeshVisibility(),this._refreshEmissiveForVisibility(),this.reset()}getScene(){return this.meshScene||this.scene}setMeshVisibilityByUuid(e,t){let n=this.getScene()?.getObjectByProperty(`uuid`,e);if(!n)return null;let r=typeof t==`function`?!!t(n.visible):!!t;return n.visible=r,this.updateAllMeshVisibility(),r}setTextureTransform(e,t,n){this.stages.pathTracer?.materialData.updateTextureTransform(e,t,n),this.reset()}async _readDisplaySource(e,t,n){let r=this.pipeline?.context,i=r&&this.stages.compositor?.resolveLightTexture(r);return!i||i===e.texture?await this.renderer.readRenderTargetPixelsAsync(e,0,0,t,n,0):(this._textureReadback??=new jb(this.renderer),await this._textureReadback.read(i,t,n))}async setTextureColorSpace(e,n){if(!e?.isTexture)throw Error(`setTextureColorSpace wants a three.js texture`);let r=e.userData??={};r.__rayzeeOriginalColorSpace===void 0&&(r.__rayzeeOriginalColorSpace=e.colorSpace);let i=r.__rayzeeOriginalColorSpace;if(delete r.ocioColorSpace,delete r.__rayzeeColorSpaceChoice,n==null)e.colorSpace=i,delete r.__rayzeeOriginalColorSpace;else if(n===`srgb`||n===`linear`)e.colorSpace=n===`srgb`?t.SRGBColorSpace:t.LinearSRGBColorSpace,r.__rayzeeColorSpaceChoice=n;else{if(!this.color?.hasConfig)throw Error(`"${n}" needs a colour config loaded`);r.ocioColorSpace=n,e.colorSpace=t.SRGBColorSpace}e.needsUpdate=!0,this.stages.pathTracer?.sdfs&&await this.rebuildMaterials()}async loadColorConfig(e={}){await this._leaveColorWorkingSpace();let t=cl(this.renderer?.toneMapping),n=await this.color.loadConfig(e);return this.color.workingSpaceAdopted&&await this.applyColorWorkingSpace(),(!(t?.source===`ocio`&&cl(this.renderer?.toneMapping)===t)||this.color.workingSpaceAdopted)&&this.reset(),n}async unloadColorConfig(){await this._leaveColorWorkingSpace(),this.color.unloadConfig(),this.reset()}async _leaveColorWorkingSpace(){this.color?.workingSpaceAdopted&&(this.color.setWorkingSpace(null),await this.applyColorWorkingSpace())}async applyColorWorkingSpace(){let e=this.environmentManager?.getEnvironmentTexture?.(),t=!1;if(e&&this.color?.hasConfig)try{t=this.color.convertTexturePixels(e)}catch(e){$D.warn(`environment colour conversion failed: ${e.message}`)}this.stages.pathTracer?.sdfs&&(await this.rebuildMaterials(),this._uploadEmissivePayload(this._sdf?.rebuildEmissiveColors?.()??null)),t&&await this.environmentManager?.buildEnvironmentCDF?.(),e?._isPhysicalSky&&await this.environmentManager.generateProceduralSkyTexture(),this.environmentManager?.refreshSun?.(),this.reset()}async rebuildMaterials(e){await this.ensureSceneResident(),await this.stages.pathTracer?.rebuildMaterials(e||this.meshScene),this.reset()}async _initRenderer(){if(we(e=>this.dispatchEvent(e)),!navigator.gpu)throw Error(`WebGPU is not supported in this browser`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`Failed to get WebGPU adapter`);this.adapterInfo=nO(e),this.adapterInfo.isSoftware&&(this._issues.warn(Y.ADAPTER_SOFTWARE,`software GPU adapter "${this.adapterInfo.description||this.adapterInfo.vendor}" — renders are correct but orders of magnitude slower than hardware`,{...this.adapterInfo}),$D.warn(`software GPU adapter — check app.adapterInfo.isSoftware. ${this.adapterInfo.description}`));let n=e.limits,r={maxColorAttachmentBytesPerSample:128};for(let e of[`maxBufferSize`,`maxStorageBufferBindingSize`,`maxSampledTexturesPerShaderStage`,`maxStorageTexturesPerShaderStage`,`maxTextureArrayLayers`,`maxTextureDimension2D`,`maxComputeInvocationsPerWorkgroup`,`maxComputeWorkgroupStorageSize`,`maxComputeWorkgroupSizeX`,`maxComputeWorkgroupSizeY`,`maxComputeWorkgroupSizeZ`]){let t=n[e];t!==void 0&&(r[e]=t)}if(r.maxStorageBuffersPerShaderStage=Math.min(n.maxStorageBuffersPerShaderStage,10),this.renderer=new t.WebGPURenderer({canvas:this.canvas,alpha:!0,powerPreference:`high-performance`,requiredLimits:r}),await this.renderer.init(),!this.renderer.backend?.isWebGPUBackend)throw Error(`WebGPU backend unavailable — three.js fell back to WebGL2, which cannot run the path tracer's compute kernels. Check GPU process flags and driver support.`);let a=this.renderer.backend?.device;a?.lost&&(this._gpuDevice=a,this._deviceLostHolder={app:this},eO(a,this._deviceLostHolder),a.onuncapturederror=e=>$D.error(`WebGPU uncaptured error:`,e.error)),t.RectAreaLightNode.setLTC(i.RectAreaLightTexturesLib.init()),this.renderer.outputColorSpace=t.SRGBColorSpace,this.renderer.toneMapping=this._profile.toneMapping,this.renderer.toneMappingExposure=1,this.renderer.setPixelRatio(1),this.color.attachRenderer(this.renderer)}_initCameraManager(){this.cameraManager=new bT(this.canvas),this.timeline=new ET({cameraManager:this.cameraManager,onReset:()=>this.reset()})}_initScenes(){this.scene=new r.Scene,this.meshScene=new r.Scene,this._sceneHelpers=new M}_initAssetPipeline(){this._sdf=new dg({issues:this._issues,...this._maxSceneBytes===void 0?{}:{maxSceneBytes:this._maxSceneBytes}}),this.assetLoader=new eT(this.meshScene,this.cameraManager.camera,this.cameraManager.controls,{issues:this._issues,profile:this._profile}),this.assetLoader.setRenderer(this.renderer),this.assetLoader.createFloorPlane();let e=()=>{this.needsReset=!0,this.stages.pathTracer?.enterInteractionMode(),this.wake()};this._addTrackedListener(this.cameraManager.controls,`change`,e),this._addTrackedListener(this.cameraManager.walkControls,`change`,e),this._addTrackedListener(this.cameraManager.walkControls,`start`,()=>this.wake())}_initPipeline(){this._createStages();let{clientWidth:e,clientHeight:t}=this.canvas;this.pipeline=new Ob(this.renderer,e||1,t||1,{issues:this._issues}),this.pipeline.addStage(this.stages.pathTracer),this.pipeline.addStage(this.stages.normalDepth),this.pipeline.addStage(this.stages.motionVector),this.pipeline.addStage(this.stages.nrd),this.pipeline.addStage(this.stages.asvgf),this.pipeline.addStage(this.stages.variance),this.pipeline.addStage(this.stages.bilateralFilter),this.pipeline.addStage(this.stages.edgeFilter),this.pipeline.addStage(this.stages.autoExposure),this.pipeline.addStage(this.stages.compositor);let n=this.canvas.clientWidth||1,r=this.canvas.clientHeight||1;this._displayWidth=n,this._displayHeight=r,this.pipeline.setSize(n,r),this.pipeline.eventBus.on(`pathtracer:interactionStart`,()=>this._requestRenderScale(this._interactionRenderScale())),this.pipeline.eventBus.on(`pathtracer:interactionEnd`,()=>this._applyRenderScale(1))}async _initManagers(){this.interactionManager=new Ib({scene:this.meshScene,camera:this.cameraManager.camera,canvas:this.canvas,assetLoader:this.assetLoader,pathTracer:null,floorPlane:this.assetLoader.floorPlane}),this.interactionManager.wireAppEvents(this),this.cameraManager.setInteractionManager(this.interactionManager),this.lightManager=new kT(this.scene,this._sceneHelpers,this.stages.pathTracer,{onReset:()=>this.reset(),onLightRemoved:e=>{this.interactionManager?.selectedObject===e&&this.interactionManager.deselect()}}),this.goboManager=new AT(this.stages.pathTracer,{onReset:()=>this.reset()}),this.iesManager=new VT(this.stages.pathTracer,{onReset:()=>this.reset()}),this._setupDenoisingManager(),await this._setupOverlayManager(),this.transformManager=new LD({camera:this.cameraManager.camera,canvas:this.canvas,orbitControls:this.cameraManager.controls,app:this}),this.overlayManager.register(`transform`,new RD(this.transformManager)),this.interactionManager.setDependencies({overlayManager:this.overlayManager,transformManager:this.transformManager,appDispatch:e=>this.dispatchEvent(e),orbitControls:this.cameraManager.controls,helperScene:this._sceneHelpers.scene}),this.denoisingManager.setOverlayManager(this.overlayManager),this.denoisingManager.setResetCallback(()=>this.reset()),this.denoisingManager.setPostProcessRefreshCallback(()=>this.requestPostProcessRefresh()),this.denoisingManager.setDisplayRefreshCallback(()=>this.refreshFrame()),this.denoisingManager.setSettings(this.settings),this.environmentManager=this.stages.pathTracer.environment,this.environmentManager.callbacks.onAutoExposureReset=()=>this.pipeline.eventBus.emit(`autoexposure:resetHistory`),this.environmentManager.callbacks.onReset=()=>this.reset()}_wireEvents(){this._addTrackedListener(this.cameraManager,`CameraSwitched`,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,B.AUTO_FOCUS_UPDATED,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,B.ORTHO_HEIGHT_UPDATED,e=>this.dispatchEvent(e)),this._addTrackedListener(this.timeline,B.TIMELINE_CHANGED,e=>this.dispatchEvent(e)),this._forwardEvents(this.denoisingManager,[B.DENOISING_START,B.DENOISING_END,B.UPSCALING_START,B.UPSCALING_PROGRESS,B.UPSCALING_END,`resolution_changed`]),this._setupAutoExposureListener(),this.animationManager.wakeCallback=()=>this.wake(),this.animationManager.applyPoseCallback=e=>this._applyAnimationPose(e),this._forwardEvents(this.animationManager,[B.ANIMATION_STARTED,B.ANIMATION_PAUSED,B.ANIMATION_STOPPED]),this._addTrackedListener(this.animationManager,B.ANIMATION_PAUSED,()=>{this._animRefitInFlight=!1,this._refreshMovedEmitters()}),this._addTrackedListener(this.animationManager,B.ANIMATION_STOPPED,()=>{this._animRefitInFlight=!1}),this.cameraManager.initCallbacks({onResize:()=>this.onResize(),onReset:()=>this.reset(),getSettings:e=>this.settings.get(e),applySettings:e=>this.settings.setMany(e,{silent:!0,reset:!1})}),this.cameraManager.initAutoFocus({assetLoader:this.assetLoader,pathTracer:this.stages.pathTracer,settings:this.settings,softReset:()=>this.reset(!0),hardReset:()=>this.reset()}),this.settings.bind({stages:this.stages,renderer:this.renderer,resetCallback:()=>this.reset(),reconcileCompletion:()=>this._reconcileCompletion(),denoisingManager:this.denoisingManager,onInteractionRenderScale:()=>{this.stages.pathTracer?.interactionMode&&this._requestRenderScale(this._interactionRenderScale())},onCameraProjection:e=>this.cameraManager.applyProjection(e)}),this.renderer.toneMappingExposure=this.settings.get(`exposure`)??1,this.onResize(),this.resizeHandler=()=>this.onResize(),this._autoResize&&this._addTrackedListener(window,`resize`,this.resizeHandler),this._onAssetLoaded=async e=>{if(!this._loadingInProgress&&!(this._applyingSceneMetadata&&e.texture)){if(e.model)this._clearAppendedModels(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()});else if(e.texture){let e=this.meshScene.environment;e&&this.stages.pathTracer&&await this.stages.pathTracer.environment.setEnvironmentMap(e),Te()}this.pauseRendering=!1,this.reset()}},this._addTrackedListener(this.assetLoader,`load`,this._onAssetLoaded),this._addTrackedListener(this.assetLoader,`modelProcessed`,e=>{let t=[this.cameraManager.camera,...e.cameras||[]];this.cameraManager.setCameras(t),this.timeline.clear(),this.interactionManager&&(this.interactionManager.floorPlane=this.assetLoader.floorPlane)})}_initAnimationAndTransforms(){let e=this.assetLoader?.animations||[];if(e.length>0){let t=this.sceneModel||this.meshScene;this.animationManager.init(this.meshScene,t,this._sdf.meshes,e),this.animationManager.onFinished=()=>{this._animRefitInFlight=!1,this._refreshMovedEmitters(),this.dispatchEvent({type:B.ANIMATION_FINISHED})}}this.transformManager?.setMeshData(this._sdf.meshes)}_createStages(){this.stages.pathTracer=new sy(this.renderer,this.scene,this.cameraManager.camera),this.stages.normalDepth=new cy(this.renderer,{pathTracer:this.stages.pathTracer}),this.stages.motionVector=new ly(this.renderer,this.cameraManager.camera,{pathTracer:this.stages.pathTracer}),this.stages.asvgf=new fy(this.renderer,{enabled:!1}),this.stages.nrd=new Xy(this.renderer,{enabled:!1,pathTracer:this.stages.pathTracer}),this.stages.variance=new $y(this.renderer,{enabled:!1}),this.stages.bilateralFilter=new tb(this.renderer,{enabled:!1}),this.stages.edgeFilter=new sb(this.renderer,{enabled:!1}),this.stages.autoExposure=new mb(this.renderer,{enabled:U.autoExposure??!1}),this.stages.compositor=new hb(this.renderer,{saturation:this.settings.get(`saturation`)??U.saturation,pathTracer:this.stages.pathTracer})}_setupDenoisingManager(){this.denoisingManager=new wD({renderer:this.renderer,mainCanvas:this.canvas,stages:{pathTracer:this.stages.pathTracer,normalDepth:this.stages.normalDepth,motionVector:this.stages.motionVector,asvgf:this.stages.asvgf,nrd:this.stages.nrd,variance:this.stages.variance,bilateralFilter:this.stages.bilateralFilter,edgeFilter:this.stages.edgeFilter,autoExposure:this.stages.autoExposure,compositor:this.stages.compositor},pipeline:this.pipeline,getExposure:()=>this.settings.get(`exposure`)??1,getSaturation:()=>this.settings.get(`saturation`)??1}),this.denoisingManager.setupDenoiser(),this.denoisingManager.setupUpscaler(),this.denoisingManager._syncGBufferStages();let e=this.canvas.clientWidth||1,t=this.canvas.clientHeight||1;this.denoisingManager.setRenderSize(e,t)}_reconcileCompletion(){let e=this.stages.pathTracer;if(!e)return;let t=this.completion.isLimitReached(e,this.settings.get(`renderLimitMode`),this.settings.get(`renderTimeLimit`));t&&!e.isComplete?e.isComplete=!0:!t&&e.isComplete&&(e.isComplete=!1,this.completion.resumeFromPause(),this.denoisingManager?.abort(this.canvas),this.dispatchEvent({type:B.RENDER_RESET}),this.wake())}_setupAutoExposureListener(){this.stages.autoExposure&&this.stages.autoExposure.on(`autoexposure:updated`,e=>{this.dispatchEvent({type:B.AUTO_EXPOSURE_UPDATED,exposure:e.exposure,luminance:e.luminance})})}_renderHelperOverlay(){this.scene.updateMatrixWorld(),this.overlayManager?.render()}async _setupOverlayManager(){this.overlayManager=new ND(this.cameraManager.camera),this.overlayManager.setupDefaultHelpers({helperScene:this._sceneHelpers,meshScene:this.meshScene,pipeline:this.pipeline,denoisingManager:this.denoisingManager,app:this,renderWidth:this.denoisingManager?._lastRenderWidth||this.canvas.clientWidth||1,renderHeight:this.denoisingManager?._lastRenderHeight||this.canvas.clientHeight||1}),await this.overlayManager.initViewRenderer({device:this.renderer.backend?.device,sizeSource:this.canvas}),this._container=this._container||this.canvas.parentNode||null,this.overlayManager.mount(this._container)}_syncControlsAfterLoad(){this.cameraManager.fitOrthographic(),this.cameraManager.controls.saveState(),this.cameraManager.controls.update(),this.cameraManager.walkControls.fitSpeed(this.assetLoader.getSceneScale())}_recalibrateControlLimits(){if(!this.meshScene||!this.cameraManager)return;let e=new r.Box3,t=new r.Box3;for(let n of this.meshScene.children)n.userData?.__rayzeeSceneObject&&(t.setFromObject(n),t.isEmpty()||e.union(t));if(e.isEmpty())return;let n=Math.max(e.max.x-e.min.x,e.max.y-e.min.y,e.max.z-e.min.z);if(!Number.isFinite(n)||n<=0)return;let{camera:i,controls:a}=this.cameraManager,o=i.fov*(Math.PI/180),s=Math.abs(n/Math.sin(o/2)/2);this.cameraManager.currentCameraIndex===0&&(i.near=n/100,i.far=n*100,i.updateProjectionMatrix());let c=i.position.distanceTo(a.target);a.minDistance=Math.min(n/1e3,c),a.maxDistance=Math.max(s*10,c*1.1),a.update()}_forwardEvents(e,t){if(e)for(let n of t)this._addTrackedListener(e,n,e=>this.dispatchEvent(e))}};async function iO(e){let t=await oO(e);try{return await aO(t,e)}finally{t.dispose()}}async function aO(e,{samples:t=64,colorSpace:n=`srgb`,allowEarlyRetire:r=!1,onProgress:i=void 0}={}){let a=await e.renderFrames(t,{onProgress:i,allowEarlyRetire:r});return{...await e.renderToBuffer({colorSpace:n}),samples:a,retiredBy:a<t?`converged`:`count`,issues:e.issues,adapter:e.adapterInfo}}async function oO({canvas:e,model:t=null,width:n=1920,height:r=1080,strict:i=!0,profile:a=`physical`,deterministic:o=!0,settings:s=null,storage:c=!1}={}){if(!e)throw Error(`openHeadless: a canvas is required`);let l=new rO(e,{autoResize:!1,strict:i,profile:a,storage:c});try{return l.setReservedRenderResolution(Math.max(n,r)),await l.init(),l.setCanvasSize(n,r),t&&await l.loadModel(t),s&&l.settings.setMany(s,{silent:!0}),o&&l.setDeterministicMode(!0),l}catch(e){throw l.dispose(),e}}Ce();var sO=class{constructor(e){this._app=e,this._cancelled=!1,this._rendering=!1}async renderAnimation(e={}){let{clipIndex:t=0,fps:n=30,speed:r=1,samplesPerFrame:i=Pt.maxSamples,enableOIDN:a=!0,timeline:o=null,startFrame:s=0,onFrame:c,onProgress:l,onComplete:u}=e,d=this._app,f=d.animationManager?.hasAnimations?d.animationManager.clips[t]:null;if(!f&&!o?.animates){console.warn(d.animationManager?.hasAnimations?`VideoRenderManager: Invalid clip index ${t}`:`VideoRenderManager: No animation clips or keyframes`),u?.(!1);return}let p=f?f.duration/(r||1):o.duration,m=e.totalFrames||Math.ceil(p*n),h=1/n;if(!(m>0)){console.warn(`VideoRenderManager: No frames to render`),u?.(!1);return}this._cancelled=!1,this._rendering=!0;let g=this._saveState({view:!!o});d.stopAnimation(),d.configureForMode(`production`),d.settings.setMany({maxSamples:i},{silent:!0}),d.stages.pathTracer?.updateCompletionThreshold?.(),d.cameraManager.controls&&(d.cameraManager.controls.enabled=!1);try{for(let e=Math.max(0,s);e<m&&!this._cancelled;e++){let n=e*h*r,i=f?d.animationManager.seekTo(n,t):null;if(o?.seek(e*h)&&(d.cameraManager.resetAutoFocus(),d.cameraManager.updateAutoFocus()),i?await d.refitBVH(i):d.reset(),d.stopAnimation(),await this._accumulateFrame(d),this._cancelled||(a&&d.denoisingManager?.finalDenoise&&await this._waitForDenoise(d),this._cancelled))break;let s=d.getCanvas();if(s&&c){let t=await createImageBitmap(s);await c(t,e,m),t.close()}let u={frame:e+1,totalFrames:m,percent:(e+1)/m*100};l?.(u),d.dispatchEvent({type:B.VIDEO_RENDER_PROGRESS,...u})}}catch(e){console.error(`VideoRenderManager: Render error:`,e),this._cancelled=!0}finally{this._restoreState(g),this._rendering=!1;let e=!this._cancelled;u?.(e),d.dispatchEvent({type:B.VIDEO_RENDER_COMPLETE,success:e})}}cancel(){this._cancelled=!0}get isRendering(){return this._rendering}async _accumulateFrame(e){let t=e.stages.pathTracer;if(t?.isReady)for(;!t.isComplete&&!this._cancelled;)e.cameraManager.camera.updateMatrixWorld(),e.pipeline.render(),t.frameCount%4==0&&(Ee({samples:De(t)}),await new Promise(e=>setTimeout(e,0)))}_waitForDenoise(e){return new Promise(t=>{let n,r=()=>{e.removeEventListener(B.DENOISING_END,i),clearTimeout(n)},i=()=>{r(),t()};n=setTimeout(()=>{console.warn(`VideoRenderManager: Denoise timed out, skipping`),r(),t()},3e4),e.addEventListener(B.DENOISING_END,i),e.denoisingManager.onRenderComplete({isStillComplete:()=>!this._cancelled,context:e.pipeline?.context})})}_saveState({view:e}){let t=this._app,n=t.settings.getEffective(),r=Object.keys(It(Pt));return e&&r.push(`focusDistance`),{view:e?t.cameraManager.captureView():null,settings:r.map(e=>[e,n[e]]),renderMode:t.stages.pathTracer?.renderMode?.value,controlsEnabled:t.cameraManager.controls?.enabled,oidnEnabled:t.denoisingManager?.finalDenoise,oidnQuality:t.denoisingManager?.oidnQuality,wasPlaying:t.animationManager?.isPlaying,pauseRendering:t.pauseRendering}}_restoreState(e){let t=this._app;for(let[n,r]of e.settings)r&&t.settings.set(n,r.value,{silent:!0,reset:!1,source:r.source});t.stages.pathTracer&&e.renderMode!==void 0&&t.stages.pathTracer?.setUniform(`renderMode`,parseInt(e.renderMode)),t.stages.pathTracer?.updateCompletionThreshold?.(),t.cameraManager.controls&&(t.cameraManager.controls.enabled=e.controlsEnabled??!0),t.denoisingManager?.denoiser&&(t.denoisingManager.applyOIDNEnabled(e.oidnEnabled??!1),e.oidnQuality&&t.denoisingManager.applyOIDNQuality(e.oidnQuality)),t.pauseRendering=e.pauseRendering??!1,e.view&&t.cameraManager.applyPose(e.view),t.denoisingManager?.setCadenceSuspended(!1),t.animationManager?.stop(),t.reset(),t.wake()}};Ce(),Js(),rn(),QE(),fD(),El(),e.AF_DEFAULTS=ot,e.ASVGF_QUALITY_PRESETS=$e,e.AUTO_FOCUS_MODES=G,e.AnimationManager=PD,e.BVH_LEAF_MARKERS=_t,e.CAMERA_PRESETS=at,e.CAMERA_RANGES=rt,e.CameraManager=bT,e.CameraTrack=wT,e.ColorManagement=ju,e.DEFAULT_LUT_SIZE=Vl,e.DEFAULT_MAX_EV=Bl,e.DEFAULT_MIN_EV=zl,e.DEFAULT_SUN_PATH=He,e.DEFAULT_TEXTURE_MATRIX=Nt,e.DEFAULT_WORKING_SPACE=Cu,e.DOWNLOAD_POLICY=bg,e.DenoisingManager=wD,e.DownloadCache=Og,e.ENGINE_AREAS=Zn,e.ENGINE_DEFAULTS=U,e.EngineEvents=B,e.EngineIssueError=bn,e.GoboManager=AT,e.IESManager=VT,e.INTERACTIVE_RENDER_CONFIG=Ft,e.ISSUE_CODES=Y,e.ISSUE_SEVERITY=yn,e.InteractionManager=Ib,e.IssueLog=xn,e.LOG_LEVELS=qt,e.LightManager=kT,e.Logger=tn,e.MATERIAL_DEFAULTS=q,e.MATERIAL_VALUE_SOURCE=Dr,e.MAX_RESERVABLE_RENDER_SIZE=Ze,e.MAX_SCENE_BYTES=Bm,e.MAX_TABLE_TRANSFORMS=yl,e.MEMORY_CONSTANTS=Lt,e.MemoryLedger=Gm,e.NRD_DEFAULTS=et,e.NRD_HIT_DIST_A=Je,e.NRD_HIT_DIST_B=Ye,e.NRD_PRESET_KEYS=tt,e.NRD_QUALITY_PRESETS=nt,e.OCIO_VIEW_BASE=vl,e.OverlayManager=ND,e.PRODUCTION_RENDER_CONFIG=Pt,e.PathTracerApp=rO,e.PipelineContext=gb,e.RENDER_PROFILES=We,e.RETOUCH_DEFAULTS=rD,e.RETOUCH_MAX_PIXELS=aD,e.RETOUCH_RANGES=oD,e.RenderPipeline=Ob,e.RenderSettings=Yb,e.RenderStage=xe,e.SAFE_SCENE_BYTES=zm,e.SCENE_STATE_VERSION=zD,e.SETTING_SOURCE=qb,e.SKY_PRESETS=it,e.SR_MAX_INPUT=qE,e.SR_SCALE=GE,e.STORAGE_KIND=Xn,e.StageExecutionMode=z,e.StorageManager=pr,e.TEXTURE_CONSTANTS=xt,e.TRIANGLE_DATA_LAYOUT=st,e.TimelineManager=ET,e.TransformManager=LD,e.VERSION=Hh,e.VIEW_TRANSFORMS=wl,e.VRAMTracker=Kg,e.VideoRenderManager=sO,e.acquireLock=Nn,e.addAllOcioViews=Ql,e.addOcioView=Zl,e.addViewTransform=fl,e.applyMatrixRGBA8=Bc,e.bakeLut=Al,e.bufferBytes=Wg,e.buildOcioView=Jl,e.buildToneMapWGSL=gl,e.cachedObjectURL=jg,e.canvasColorSpaceFor=Du,e.captureHeadless=aO,e.clearBindingAuditFindings=Cb,e.clearInputOverrides=pu,e.configureAssets=Gs,e.convertColor=Dc,e.convertEncodedRGBA8=Fc,e.convertPixelsF32=Oc,e.createLogger=Wt,e.dayOfYearForMonth=Ve,e.deriveAlphaMode=jr,e.describeAdapter=nO,e.displayCanvasFit=Ws,e.estimateSceneBytes=Um,e.extractMatrix=Vc,e.extractSceneMetadata=Gw,e.fetchFile=kg,e.fileIdentity=Wn,e.findNativeLinearSpace=Au,e.fmt=J,e.fromPortable=qr,e.getActiveColorManagement=Tu,e.getAssetConfig=Ks,e.getBindingAuditFindings=Sb,e.getRegistryVersion=ol,e.getRenderProfile=Ge,e.getViewTransform=cl,e.hasColorSpace=Uc,e.heldLockNames=Pn,e.identityKey=Gn,e.isColorManaged=Mu,e.isDataSpace=Hc,e.isDataTexture=yu,e.linearToSrgb=jc,e.listFileRules=gu,e.listInputOverrides=mu,e.listViewTransforms=ll,e.makeCpuSampler=Il,e.measureBakeError=Rl,e.nameFromUrl=wg,e.onRegistryChange=sl,e.openHeadless=oO,e.openStorage=Wb,e.openZip=Ix,e.parseSceneMetadata=Ww,e.probeAddressSpace=Wm,e.readZipDirectory=Nx,e.removeViewTransform=pl,e.renderHeadless=iO,e.renderUpscaled=HE,e.resolveInputSpace=vu,e.sameIdentity=Kn,e.setActiveColorManagement=Eu,e.setBindingAudit=xb,e.setInputOverride=fu,e.srgbToLinear=Ac,e.sunPosition=ze,e.textureBytes=Gg,e.textureInputSpace=Su,e.timeForSunElevation=Be,e.toPortable=Kr});
|
|
1395
|
+
`,uD=class e{constructor(e,t){this.chain=e,this.canvas=t,this.slot=0,this.source=null,this.staging=null,this._readbackPipeline=null,this._readbackStorage=null,this._readbackMap=null,this._hdrPipeline=null,this._hdrStorage=null,this._hdrMap=null,this._toneMapper=null,this.disposed=!1}get device(){return this.chain.device}get width(){return this.chain.pipeline.geometry.validWidth}get height(){return this.chain.pipeline.geometry.validHeight}static async create({width:t,height:n,canvas:r=null,settings:i={},onProgress:a=()=>{}}){if(!Number.isInteger(t)||!Number.isInteger(n)||t<1||n<1)throw Error(`NeuralRetouch.create: width and height must be positive integers`);if(t*n>4194304)throw Error(`NeuralRetouch.create: ${t}x${n} is ${(t*n/1e6).toFixed(1)} MP, above the ${(aD/1e6).toFixed(1)} MP this pass survives. Past it the run takes minutes and then loses every GPU device in the page.`);let o=r??document.createElement(`canvas`);r||(o.style.cssText=`position:fixed;left:-10000px;top:0;pointer-events:none`);let s=new e(await(await tD()).create(o,t,n,a,eD(i).runtime),o);return s._allocate(),s}_allocate(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry;this.source=this.device.createBuffer({label:`rayzee:retouch-source`,size:e*t*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.staging=new Uint16Array(e*t*4);let n=e*t*4;this._readbackStorage=this.device.createBuffer({label:`rayzee:retouch-readback`,size:n,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._readbackMap=this.device.createBuffer({label:`rayzee:retouch-readback-map`,size:n,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._readbackPipeline=this.device.createComputePipeline({label:`rayzee:retouch-readback`,layout:`auto`,compute:{module:this.device.createShaderModule({code:cD}),entryPoint:`main`}});let r=e*t*8;this._hdrStorage=this.device.createBuffer({label:`rayzee:retouch-hdr`,size:r,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),this._hdrMap=this.device.createBuffer({label:`rayzee:retouch-hdr-map`,size:r,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),this._hdrPipeline=this.device.createComputePipeline({label:`rayzee:retouch-hdr`,layout:`auto`,compute:{module:this.device.createShaderModule({code:lD}),entryPoint:`main`}})}async _packHDR(e,t,n=!1){let r=this.chain.pipeline.slots[this.slot]?.hdrOutput;if(!r)throw Error("NeuralRetouch: the runtime has no scene-referred output. Either no frame has been produced yet, or neural-runtime.js was re-vendored without its `rayzee-patch` edits.");let i=this.device.createBindGroup({layout:this._hdrPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:r.createView()},{binding:1,resource:{buffer:this._hdrStorage}}]}),a=this.device.createCommandEncoder({label:`rayzee:retouch-hdr`}),o=a.beginComputePass();o.setPipeline(this._hdrPipeline),o.setBindGroup(0,i),o.dispatchWorkgroups(Math.ceil(e/8),Math.ceil(t/8)),o.end(),n&&a.copyBufferToBuffer(this._hdrStorage,0,this._hdrMap,0,e*t*8),this.device.queue.submit([a.finish()])}async readOutputHDR(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry;await this._packHDR(e,t,!0),await this._hdrMap.mapAsync(GPUMapMode.READ);let n=new Uint16Array(this._hdrMap.getMappedRange().slice(0));return this._hdrMap.unmap(),{half:n,width:e,height:t}}async readOutputToned(e){let{validWidth:t,validHeight:n}=this.chain.pipeline.geometry;return await this._packHDR(t,n),this._toneMapper??=new PE(this.device,`rayzee:retouch-tonemap`),this._toneMapper.ensureSize(t,n),{rgba8:await this._toneMapper.toRGBA8(this._hdrStorage,{exposure:e.exposure??1,toneMapping:e.toneMapping??0,saturation:e.saturation??1}),width:t,height:n}}async readOutput(){let{validWidth:e,validHeight:t}=this.chain.pipeline.geometry,n=this.chain.pipeline.slots[this.slot]?.output;if(!n)throw Error(`NeuralRetouch.readOutput: the pass has not produced a frame yet`);let r=this.device.createBindGroup({layout:this._readbackPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:n.createView()},{binding:1,resource:{buffer:this._readbackStorage}}]}),i=this.device.createCommandEncoder({label:`rayzee:retouch-readback`}),a=i.beginComputePass();a.setPipeline(this._readbackPipeline),a.setBindGroup(0,r),a.dispatchWorkgroups(Math.ceil(e/8),Math.ceil(t/8)),a.end(),i.copyBufferToBuffer(this._readbackStorage,0,this._readbackMap,0,e*t*4),this.device.queue.submit([i.finish()]),await this._readbackMap.mapAsync(GPUMapMode.READ);let o=new Uint8ClampedArray(this._readbackMap.getMappedRange().slice(0));return this._readbackMap.unmap(),o}dispose(){if(!this.disposed){this.disposed=!0,this.source?.destroy(),this._readbackStorage?.destroy(),this._readbackMap?.destroy(),this._hdrStorage?.destroy(),this._hdrMap?.destroy(),this._toneMapper?.dispose();try{this.chain.destroy()}catch(e){iD.warn(`retouch teardown:`,e)}}}},dD=20}));V(),rn();var pD=Wt(`neural`),mD=120,hD=2,gD=1,_D=0,vD=300,yD=5,bD=3,xD=3,SD=16,CD=e=>Math.max(0,1-e/SD),wD=class extends r.EventDispatcher{constructor({renderer:e,mainCanvas:t,stages:n,pipeline:i,getExposure:a,getSaturation:o}){super(),this.renderer=e,this.mainCanvas=t,this.upscalerCanvas=this._createUpscalerCanvas(t),this.pipeline=i,this._stages=n,this._getExposure=a,this._getSaturation=o,this.denoiser=null,this.upscaler=null,this.upscalerBackend=`esrgan`,this._neuralUpscaler=null,this.neuralRendering=!1,this.neuralRenderingSettings={},this._retouch=null,this._superResModule=null,this._neuralPostBusy=!1,this._finalQuality=U.oidnQuality,this.finalDenoise=U.enableOIDN,this.continuousDenoise=U.continuousDenoise,this.continuousDenoiseInterval=U.continuousDenoiseInterval,this._lastCadenceAt=-1/0,this._lastCadenceSamples=0,this._failedRefreshes=0,this._cadenceSuspended=!1,this._movingDenoiseMs=[],this._movingHopeless=!1,this._holdWhileMoving=null,this._onReset=null,this._onPostProcessRefresh=null,this._onDisplayRefresh=null,this.temporalHistory=U.oidnTemporalHistory,this._history=null,this._historyDirty=!0,this._knownResetCount=0,this._seenTracedFrames=0,this._viewProj=new r.Matrix4,this._historyCamera={world:null,projInv:null,viewProj:null,orthographic:!1},this._movedPlacements=new Map,this._movedUpload={count:0,leaves:new Uint32Array,toPrev:new Float32Array},this._matA=new r.Matrix4,this._matB=new r.Matrix4,this._lastRenderWidth=0,this._lastRenderHeight=0,this._pendingStartUpscaler=null,this._pendingCloseDenoise=null,this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._denoiserTileHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null}_createUpscalerCanvas(e){let t=e.parentNode;if(!t)return null;let n=document.createElement(`canvas`);return n.width=e.width,n.height=e.height,n.style.position=`absolute`,n.style.inset=`0`,n.style.width=`100%`,n.style.height=`100%`,n.style.display=`none`,t.insertBefore(n,e),n}setRenderSize(e,t){this._lastRenderWidth=e,this._lastRenderHeight=t,this._cadenceDowngraded=!1,this._holdWhileMoving=null,this._movingDenoiseMs.length=0,this._movingHopeless=!1,this._historyDirty=!0,this.denoiser?.abort(),this._unpublishOutput(),this.denoiser?.setSize(e,t),this.upscalerCanvas&&(this.upscalerCanvas.width!==e||this.upscalerCanvas.height!==t)&&(this.upscalerCanvas.width=e,this.upscalerCanvas.height=t),this.upscaler?.setBaseSize(e,t),this._syncGBufferStages()}restoreBaseResolution(){return!this.upscalerCanvas||!this._lastRenderWidth||!this._lastRenderHeight||!(this.upscalerCanvas.width!==this._lastRenderWidth||this.upscalerCanvas.height!==this._lastRenderHeight)?!1:(this.upscalerCanvas.width=this._lastRenderWidth,this.upscalerCanvas.height=this._lastRenderHeight,!0)}setupDenoiser(){if(!this.upscalerCanvas)return;let e=this._stages.pathTracer;this.denoiser=new iE(this.renderer,{...U,backendParams:()=>({device:this.renderer.backend.device,adapterInfo:null}),getGPUTextures:({continuous:t=!1}={})=>{if(!e?.storageTextures?.readTarget)return null;let n=t?this._historyTextures():null;if(n)return n;let r=e.storageTextures.getReadTextures(),{backend:i}=this.renderer;return{color:i.get(r.color).texture,normal:i.get(r.normalDepth).texture,albedo:i.get(r.albedo).texture}}}),this._syncOIDNInUse(),this._denoiserStartHandler=e=>this.dispatchEvent({type:B.DENOISING_START,continuous:!!e.continuous}),this._denoiserEndHandler=e=>{this.denoiser?.hasOutput&&this._publishOutput(),this.dispatchEvent({type:B.DENOISING_END,continuous:!!e.continuous})},this._denoiserTileHandler=e=>{if(e.continuous)return;this._publishOutput();let t=this.pipeline?.context;this._stages.compositor&&t&&this._stages.compositor.render(t)},this.denoiser.addEventListener(`start`,this._denoiserStartHandler),this.denoiser.addEventListener(`end`,this._denoiserEndHandler),this.denoiser.addEventListener(`tileProgress`,this._denoiserTileHandler)}setupUpscaler(){if(!this.upscalerCanvas)return;let e=this._stages.pathTracer;this.upscaler=new OE(this.upscalerCanvas,this.renderer,{scaleFactor:U.upscalerScale||2,quality:U.upscalerQuality||`fast`,getSourceCanvas:()=>this.renderer.domElement,refreshInput:()=>{let e=this.pipeline?.context;this._stages.compositor&&e&&this._stages.compositor.render(e)},getGPUTextures:()=>{if(!e?.storageTextures?.readTarget)return null;let t=e.storageTextures.getReadTextures();return{color:this.renderer.backend.get(t.color).texture}},getExposure:()=>this._getEffectiveExposure(),getToneMapping:()=>this._getToneMapping(),getSaturation:()=>this._getSaturation()}),this.upscaler.enabled=U.enableUpscaler||!1,this._upscalerResChangedHandler=e=>this.dispatchEvent({type:`resolution_changed`,width:e.width,height:e.height}),this._upscalerStartHandler=()=>this.dispatchEvent({type:B.UPSCALING_START}),this._upscalerProgressHandler=e=>this.dispatchEvent({type:B.UPSCALING_PROGRESS,progress:e.progress}),this._upscalerEndHandler=()=>this.dispatchEvent({type:B.UPSCALING_END}),this.upscaler.addEventListener(`resolution_changed`,this._upscalerResChangedHandler),this.upscaler.addEventListener(`start`,this._upscalerStartHandler),this.upscaler.addEventListener(`progress`,this._upscalerProgressHandler),this.upscaler.addEventListener(`end`,this._upscalerEndHandler)}get denoiserStrategy(){return this.continuousDenoise?`oidn`:this._stages.asvgf?.enabled?`asvgf`:this._stages.nrd?.enabled?`nrd`:this._stages.edgeFilter?.enabled?`edgeaware`:`none`}setDenoiserStrategy(e,t){let n=this._stages;switch(n.asvgf&&(n.asvgf.enabled=!1),n.nrd&&(n.nrd.enabled=!1),n.variance&&(n.variance.enabled=!1),n.bilateralFilter&&(n.bilateralFilter.enabled=!1),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!1),this._clearDenoiserTextures(),this.setContinuousDenoise(e===`oidn`),e){case`asvgf`:n.asvgf.enabled=!0,n.variance&&(n.variance.enabled=!0),n.bilateralFilter&&(n.bilateralFilter.enabled=!0),n.asvgf.setTemporalEnabled?.(!0),this._applyASVGFPreset(t||`medium`);break;case`nrd`:n.nrd&&(n.nrd.enabled=!0,n.nrd.resetHistory?.(),this._applyNRDPreset(t||`medium`));break;case`edgeaware`:n.variance&&(n.variance.enabled=!0),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!0);break}this._syncGBufferStages()}setASVGFEnabled(e,t){let n=this._stages;n.asvgf&&(n.asvgf.enabled=e),n.variance&&(n.variance.enabled=e),n.bilateralFilter&&(n.bilateralFilter.enabled=e),e&&(n.nrd&&(n.nrd.enabled=!1),n.asvgf?.setTemporalEnabled?.(!0),this._applyASVGFPreset(t||`medium`)),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!e),this._syncGBufferStages()}applyASVGFPreset(e){this._applyASVGFPreset(e)}setAutoExposureEnabled(e,t){let n=this._stages;n.autoExposure&&(n.autoExposure.enabled=e,!e&&this.renderer&&(this.renderer.toneMappingExposure=t))}get requiresMotionVectors(){return!!(this._stages.asvgf?.enabled||this._stages.nrd?.enabled)}_syncGBufferStages(){let e=this._stages,t=e.normalDepth,n=e.motionVector,r=this.requiresMotionVectors,i=r||this.historyWanted||!!(e.edgeFilter?.enabled||e.bilateralFilter?.enabled);this.historyWanted||this._releaseHistory(),t&&(i&&!t.enabled&&t.reset(),t.enabled=i,t.setInstanceLeafOutput?.(this.historyWanted)),n&&(r&&!n.enabled&&(n.matricesInitialized=!1,n.isFirstFrame=!0,n.frameCount=0),n.enabled=r),e.pathTracer?.setAuxGBufferEnabled?.(i||!!this.denoiser?.enabled),e.pathTracer?.setCleanAuxNormal?.(!!this.denoiser?.enabled&&!!this.denoiser?.expectsCleanAux(this._finalQuality));for(let r of[e.asvgf,e.nrd,e.variance,e.bilateralFilter,e.edgeFilter,t,n])r&&!r.enabled&&r.releaseGPUMemory?.()}_cleanupCompletionListener(){this.denoiser&&(this._pendingStartUpscaler&&this.denoiser.removeEventListener(`end`,this._pendingStartUpscaler),this._pendingCloseDenoise&&this.denoiser.removeEventListener(`end`,this._pendingCloseDenoise)),this._pendingStartUpscaler=null,this._pendingCloseDenoise=null}get holdsWhileMoving(){if(!this._stages.pathTracer?.viewIsChanging||!this.continuousDenoise||this._cadenceSuspended||!this.denoiser?.enabled||this._movingHopeless)return!1;let e=this.movingCostMs,t=this._movingDenoiseMs.length;e>vD*bD&&(this._movingHopeless=!0,this._syncGBufferStages());let n=!this._movingHopeless&&(t<2||e<=vD);return this._holdWhileMoving=(this._holdWhileMoving===null||this._holdWhileMoving)&&n,this._holdWhileMoving}skipsTrace(){return this.holdsWhileMoving&&!!this.denoiser?.state.isDenoising}get movingCostMs(){return this._movingDenoiseMs.length?Math.min(...this._movingDenoiseMs):0}_publishOutput(){let e=this.pipeline?.context,t=this.denoiser?.outputTexture;e&&t&&e.setTexture(`oidn:output`,t)}_unpublishOutput(){this.pipeline?.context?.removeTexture(`oidn:output`),this.denoiser?.invalidateOutput()}_checkHeldFrameHealthy(){!this.denoiser?.hasOutput||this._failedRefreshes<xD||this._unpublishOutput()}tickContinuousDenoise(e){let t=this.denoiser;if(!this.continuousDenoise||this._cadenceSuspended||!t)return!1;this._checkHeldFrameHealthy();let n=!!this._stages.pathTracer?.viewIsChanging;if(!n)this._holdWhileMoving=null,this._movingDenoiseMs.length=0;else if(!this.holdsWhileMoving)return!1;if(t.state.isDenoising||t.state.isLoading||!n&&e<=this._lastCadenceSamples)return!1;let r=performance.now(),i=n?_D:this._lastCadenceSamples===0?gD:hD,a=Math.max(this.continuousDenoiseInterval,t.lastDenoiseMs*i);if(r-this._lastCadenceAt<a)return!1;this._lastCadenceAt=r,this._lastCadenceSamples=e,t.lastDenoiseMs>mD&&(this._cadenceDowngraded=!0);let o=this._cadenceDowngraded?this.previewQuality():this._finalQuality;return t.quality!==o&&t.updateQuality(o),t.start({continuous:!0}).then(e=>{this._failedRefreshes=e?0:this._failedRefreshes+1,!(!e||!n)&&(this._movingDenoiseMs.push(t.lastDenoiseMs),this._movingDenoiseMs.length>yD&&this._movingDenoiseMs.shift())}),!0}previewQuality(){return this.denoiser?.expectsCleanAux(this._finalQuality)?`fast-clean`:`fast`}setCadenceSuspended(e){this._cadenceSuspended=!!e,this._historyDirty=!0,this._cadenceSuspended&&(this.denoiser?.abort(),this._unpublishOutput())}setContinuousDenoise(e){this.continuousDenoise=!!e,this._syncOIDNInUse(),this._lastCadenceAt=-1/0,this._resetCadence()}_useFinalQuality(){let e=this.denoiser;e&&e.quality!==this._finalQuality&&e.updateQuality(this._finalQuality)}_resetCadence(){this._lastCadenceSamples=0}setTemporalHistory(e){this.temporalHistory=!!e,this._syncGBufferStages()}get historyWanted(){return this.temporalHistory&&this.continuousDenoise&&!!this.denoiser?.enabled&&!this._movingHopeless}get historyActive(){let e=this._stages.pathTracer;return this.historyWanted&&!this._cadenceSuspended&&!!this._stages.normalDepth?.enabled&&e?.uniforms?.get(`cameraProjection`)?.value!==Ke.equirectangular&&!(e?.visMode?.value>0)}beforeReset({keepHistory:e=!1}={}){let t=this._stages.pathTracer;if(!t||!this.historyActive)return;let n=t.resetCount!==this._knownResetCount;if(!e||n&&t.frameCount<2){this._historyDirty=!0;return}if(t.frameCount<2)return;let r=this._historyInputs();r&&(this._ensureHistory().merge(r,t.frameCount,this._historyCameraNow(),{commit:!0,keepHistory:!this._historyDirty&&!n,historyScale:CD(t.frameCount)}),this._historyDirty=!1)}afterReset(){this._knownResetCount=this._stages.pathTracer?.resetCount??0}afterTrace(){let e=this._stages.pathTracer;if(!e||e.tracedFrames===this._seenTracedFrames)return;if(this._seenTracedFrames=e.tracedFrames,e.resetCount!==this._knownResetCount&&(this._historyDirty=!0,this._knownResetCount=e.resetCount),!this.historyActive||e.frame.value!==0){this._movedPlacements.clear();return}let t=this._historyInputs();if(!t){this._movedPlacements.clear(),this._historyDirty=!0;return}let n=this._ensureHistory();this._historyDirty&&n.invalidate(),n.accumulate(t,this._historyCameraNow(),this._takeMovedPlacements()),this._historyDirty=!1}notePlacementMoving(e,t,n){e<0||!this.historyActive||this._movedPlacements.has(e)||this._movedPlacements.set(e,{world:t,offset:n,prev:t.slice(n,n+16)})}_takeMovedPlacements(){let e=this._movedPlacements,t=this._movedUpload;if(t.count=e.size,!e.size)return t;t.leaves.length<e.size&&(t.leaves=new Uint32Array(e.size*2),t.toPrev=new Float32Array(e.size*32));let n=[...e.keys()].sort((e,t)=>e-t);for(let r=0;r<n.length;r++){let{world:i,offset:a,prev:o}=e.get(n[r]);this._matB.fromArray(i,a).invert(),this._matA.fromArray(o).multiply(this._matB).toArray(t.toPrev,r*16),t.leaves[r]=n[r]}return e.clear(),t}_historyTextures(){let e=this._stages.pathTracer,t=this._history;if(!t?.valid||this._historyDirty||!this.historyActive||e.isComplete||e.resetCount!==this._knownResetCount||t.width!==this._lastRenderWidth||t.height!==this._lastRenderHeight)return null;if(e.frameCount<=1)return t.textures;if(e.frameCount>=SD)return null;let n=this._historyInputs();return n?t.merge(n,e.frameCount,this._historyCameraNow(),{historyScale:CD(e.frameCount)}):null}_historyInputs(){let e=this._stages.pathTracer,t=this.pipeline?.context,n=this.renderer?.backend;if(!e?.storageTextures?.readTarget||!t||!n)return null;let r=e.storageTextures.getReadTextures(),i=e=>e?n.get(e)?.texture:null,a={color:i(r.color),albedo:i(r.albedo),normal:i(r.normalDepth),geo:i(t.getTexture(`pathtracer:normalDepth`)),geoPrev:i(t.getTexture(`pathtracer:prevNormalDepth`)),shading:i(t.getTexture(`pathtracer:shadingNormal`)),leaf:i(t.getTexture(`pathtracer:instanceLeaf`)),width:e.width,height:e.height};return a.color&&a.albedo&&a.normal&&a.geo&&a.geoPrev&&a.shading&&a.leaf?a:null}_historyCameraNow(){let e=this._stages.pathTracer;this._viewProj.multiplyMatrices(e.cameraProjectionMatrix.value,e.cameraViewMatrix.value);let t=this._historyCamera;return t.world=e.cameraWorldMatrix.value.elements,t.projInv=e.cameraProjectionMatrixInverse.value.elements,t.viewProj=this._viewProj.elements,t.orthographic=e.uniforms?.get(`cameraProjection`)?.value===Ke.orthographic,t}_ensureHistory(){return this._history??=new bE(this.renderer.backend.device),this._history.settings.cleanAux=!!this.denoiser?.expectsCleanAux(this._finalQuality),this._history}_releaseHistory(){this._history?.dispose(),this._history=null,this._historyDirty=!0,this._movedPlacements.clear()}setUpscalerBackend(e){let t=e===`neural`?`neural`:`esrgan`;t!==this.upscalerBackend&&(this.upscalerBackend=t,this._restoreRenderDisplay(),t!==`neural`&&this._releaseNeuralUpscaler())}_restoreRenderDisplay(){let e=this.upscalerCanvas&&this.upscalerCanvas.style.display!==`none`;return this.upscalerCanvas&&(this.upscalerCanvas.style.display=`none`),this.mainCanvas&&(this.mainCanvas.style.opacity=`1`),e&&this._lastRenderWidth&&this._lastRenderHeight&&this.dispatchEvent({type:`resolution_changed`,width:this._lastRenderWidth,height:this._lastRenderHeight}),!!e}_releaseNeuralUpscaler(){this._neuralUpscaler?.dispose(),this._neuralUpscaler=null,this._superResModule?.releaseDenoisedReader()}setNeuralRendering(e,t=null){this.neuralRendering=!!e,t&&(this.neuralRenderingSettings={...this.neuralRenderingSettings,...t}),this.neuralRendering||(this._releaseNeuralRetouch(),this._restoreRenderDisplay())}_releaseNeuralRetouch(){this._retouch?.dispose(),this._retouch=null}async _runNeuralPost(e){let t=this.upscaler?.enabled&&this.upscalerBackend===`neural`,n=this.neuralRendering;if(!(!t&&!n)&&!this._neuralPostBusy){if(!this.upscalerCanvas){pD.warn(`neural pass skipped: the engine has no overlay canvas to present on`);return}if(!this.pipeline?.context?.getTexture(`oidn:output`)){pD.warn(`neural pass skipped: no denoised picture — it needs OIDN`);return}this._neuralPostBusy=!0,this.dispatchEvent({type:B.UPSCALING_START});try{let r=await Promise.resolve().then(()=>(QE(),IE));this._superResModule=r;let i=n?await Promise.resolve().then(()=>(fD(),$E)):null,a=this.denoiser?._outTexSize,o=(a?.width??0)*(a?.height??0),s=n&&o<=i.RETOUCH_MAX_PIXELS;if(n&&!s&&(pD.warn(`Neural rendering skipped: the render is ${(o/1e6).toFixed(1)} MP, above the ${(i.RETOUCH_MAX_PIXELS/1e6).toFixed(1)} MP the pass survives.`+(t?` The upscale still ran.`:``)),this._releaseNeuralRetouch()),!t&&!s)return;let c={exposure:this._getEffectiveExposure(),toneMapping:this._getToneMapping(),saturation:this._getSaturation?.()??1},l=await r.readDenoisedHalf(this.denoiser);t&&(this._neuralUpscaler&&(this._neuralUpscaler.inputWidth!==l.width||this._neuralUpscaler.inputHeight!==l.height)&&this._releaseNeuralUpscaler(),this._neuralUpscaler||=await r.NeuralSuperRes.create({width:l.width,height:l.height}));let u=l;if(s){let e=await i.enhanceFrame({source:u,settings:this.neuralRenderingSettings,instance:this._retouch,exposure:c.exposure,tone:t?null:c});this._retouch=e.instance,u=e}if(t&&(u=await this._neuralUpscaler.upscaleToRGBA8(u,c)),!e()){this.dropDisplay();return}if(r.presentRGBA8(this.upscalerCanvas,u.rgba8,u.width,u.height),!e()){this.dropDisplay();return}this.mainCanvas&&(this.mainCanvas.style.opacity=`0`),this.dispatchEvent({type:`resolution_changed`,width:u.width,height:u.height})}catch(e){pD.warn(`neural pass failed`,e)}finally{this._neuralPostBusy=!1,this.dispatchEvent({type:B.UPSCALING_END})}}}onRenderComplete({isStillComplete:e}){this._cleanupCompletionListener();let t=this.finalDenoise?`final`:this.continuousDenoise?`refresh`:null,n=()=>{if(this.denoiser?.removeEventListener(`end`,n),this._pendingStartUpscaler=null,e()){if(t&&this._onDisplayRefresh?.(),this.neuralRendering||this.upscaler?.enabled&&this.upscalerBackend===`neural`){this._runNeuralPost(e);return}this.upscaler?.enabled&&this.upscaler.start()}};if(!t){n();return}let r=()=>{e()&&(this._pendingStartUpscaler=n,this.denoiser.addEventListener(`end`,n),t===`final`?(this._useFinalQuality(),this.denoiser.start()):this.denoiser.start({continuous:!0}))};if(this._resetCadence(),this.denoiser.state.isDenoising){let e=()=>{this.denoiser?.removeEventListener(`end`,e),this._pendingCloseDenoise===e&&(this._pendingCloseDenoise=null),r()};this._pendingCloseDenoise=e,this.denoiser.addEventListener(`end`,e)}else r()}abort(e,{keepDisplay:t=!1}={}){this._cleanupCompletionListener(),this._restoreRenderDisplay(),e&&e!==this.mainCanvas&&(e.style.opacity=`1`),this.upscaler&&this.upscaler.abort();let n=!!this._stages.pathTracer?.viewIsChanging,r=t&&this.continuousDenoise&&!this._cadenceSuspended&&!!this.denoiser?.hasOutput&&(!n||this.holdsWhileMoving);this.denoiser&&!r&&(this.denoiser.enabled&&this.denoiser.abort(),this._unpublishOutput()),this._resetCadence()}dropDisplay(){this._unpublishOutput(),this._restoreRenderDisplay(),this._historyDirty=!0}dispose(){this._cleanupCompletionListener(),this._releaseNeuralUpscaler(),this._releaseNeuralRetouch(),this._unpublishOutput(),this._releaseHistory(),this.denoiser&&=(this._denoiserStartHandler&&this.denoiser.removeEventListener(`start`,this._denoiserStartHandler),this._denoiserEndHandler&&this.denoiser.removeEventListener(`end`,this._denoiserEndHandler),this._denoiserTileHandler&&this.denoiser.removeEventListener(`tileProgress`,this._denoiserTileHandler),this.denoiser.dispose(),null),this.upscaler&&(this._upscalerResChangedHandler&&this.upscaler.removeEventListener(`resolution_changed`,this._upscalerResChangedHandler),this._upscalerStartHandler&&this.upscaler.removeEventListener(`start`,this._upscalerStartHandler),this._upscalerProgressHandler&&this.upscaler.removeEventListener(`progress`,this._upscalerProgressHandler),this._upscalerEndHandler&&this.upscaler.removeEventListener(`end`,this._upscalerEndHandler),this.upscaler.dispose(),this.upscaler=null,this.upscalerBackend=`esrgan`,this._neuralUpscaler=null),this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._denoiserTileHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null,this._onReset=null,this._onPostProcessRefresh=null,this._onDisplayRefresh=null,this.upscalerCanvas?.parentNode&&(this.upscalerCanvas.parentNode.removeChild(this.upscalerCanvas),this.upscalerCanvas=null)}setOverlayManager(e){this._overlayManager=e}setResetCallback(e){this._onReset=e}setPostProcessRefreshCallback(e){this._onPostProcessRefresh=e}setDisplayRefreshCallback(e){this._onDisplayRefresh=e}setSettings(e){this._settings=e}setASVGFParams(e){this._stages.asvgf?.updateParameters(e)}toggleASVGFHeatmap(e){this._stages.asvgf?.setHeatmapEnabled?.(e)}configureASVGFForMode(e){this._stages.asvgf&&(this._stages.asvgf.enabled=e.enabled,this._stages.variance&&(this._stages.variance.enabled=e.enabled),this._stages.bilateralFilter&&(this._stages.bilateralFilter.enabled=e.enabled),e.enabled&&this._stages.asvgf.updateParameters(e),this._syncGBufferStages())}setEdgeAwareParams(e){this._stages.edgeFilter?.updateUniforms(e)}setAutoExposureParams(e){this._stages.autoExposure?.updateParameters(e)}applyOIDNEnabled(e){this.finalDenoise=!!e,this._syncOIDNInUse()}get oidnQuality(){return this._finalQuality}setOIDNEnabled(e){this.applyOIDNEnabled(e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}_syncOIDNInUse(){this.denoiser&&(this.denoiser.enabled=this.finalDenoise||this.continuousDenoise)}applyOIDNQuality(e){this._finalQuality=e,this._cadenceDowngraded=!1,this.denoiser?.updateQuality(e)}setOIDNQuality(e){this.applyOIDNQuality(e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}setTileHelperEnabled(e){this._setTileHelper(e)}setUpscalerEnabled(e){this.upscaler&&(this.upscaler.enabled=e),e||this._restoreRenderDisplay()}setUpscalerScaleFactor(e){this.upscaler?.setScaleFactor(e)}setUpscalerQuality(e){this.upscaler?.setQuality(e)}setAutoExposure(e){this.setAutoExposureEnabled(e,this._getExposure()),this._onReset?.()}setStrategy(e,t){this.setDenoiserStrategy(e,t),this._onReset?.()}setNRDParams(e){this._stages.nrd?.updateParameters(e)}applyNRDPreset(e){this._applyNRDPreset(e)}setNRDDebugMode(e){this._stages.nrd?.updateParameters({debugMode:e})}_setTileHelper(e){let t=this._overlayManager?.getHelper(`tiles`);t&&(t.enabled=e,e||t.hide())}_getEffectiveExposure(){return this._stages.autoExposure?.enabled?this.renderer.toneMappingExposure:this._getExposure()}_getToneMapping(){return this.renderer.toneMapping}_clearDenoiserTextures(){let e=this.pipeline?.context;e&&[`asvgf:output`,`asvgf:demodulated`,`asvgf:gradient`,`variance:output`,`bilateralFiltering:output`,`edgeFiltering:output`,`nrd:output`,`oidn:output`].forEach(t=>e.removeTexture(t))}_applyNRDPreset(e){let t=nt[e];if(!t)return;let n={};for(let e of tt)n[e]=et[e];this._stages.nrd?.updateParameters({...n,...t})}_applyASVGFPreset(e){let t=$e[e];t&&(this._stages.asvgf?.updateParameters(t),this._stages.bilateralFilter?.updateParameters(t),this._stages.variance&&t.varianceBoost!==void 0&&(this._stages.variance.varianceBoost.value=t.varianceBoost))}},TD=class{constructor(){this.layer=`hud`,this.visible=!1,this._tileBounds=null,this._imageWidth=1,this._imageHeight=1,this.enabled=!0,this._borderColor=`rgba(255, 0, 0, 0.6)`,this._borderWidthRatio=1/540,this._borderWidthMin=1.5,this._borderWidthMax=4}setActiveTile(e){this._tileBounds=e}setRenderSize(e,t){this._imageWidth=e,this._imageHeight=t}render(e,t,n){if(!this._tileBounds)return;let r=this._tileBounds,i=t/this._imageWidth,a=n/this._imageHeight,o=r.x*i,s=r.y*a,c=r.width*i,l=r.height*a,u=Math.min(this._borderWidthMax,Math.max(this._borderWidthMin,Math.min(t,n)*this._borderWidthRatio));e.strokeStyle=this._borderColor,e.lineWidth=u,e.strokeRect(o,s,c,l)}show(){this.enabled&&(this.visible=!0)}hide(){this.visible=!1,this._tileBounds=null}dispose(){this.visible=!1}},ED=class{constructor(e,t){this.layer=`scene`,this._enabled=!0,this._scene=e,this._camera=t,this._build([])}_build(e){this._orthographic=this._camera.isOrthographicCamera===!0,this._outlineNode=(0,g.outline)(this._scene,this._camera,{selectedObjects:e,edgeThickness:(0,n.uniform)(1),edgeGlow:(0,n.uniform)(0)});let i=(0,n.uniform)(3),a=(0,n.uniform)(new r.Color(16777215)),o=(0,n.uniform)(new r.Color(1640965)),{visibleEdge:s,hiddenEdge:c}=this._outlineNode,l=s.mul(a).add(c.mul(o)).mul(i),u=l.r.max(l.g).max(l.b).clamp(0,1);this._material=new t.MeshBasicNodeMaterial,this._material.colorNode=(0,n.vec4)(l,u),this._material.transparent=!0,this._material.blending=r.CustomBlending,this._material.blendEquation=r.AddEquation,this._material.blendSrc=r.OneFactor,this._material.blendDst=r.OneFactor,this._material.blendEquationAlpha=r.AddEquation,this._material.blendSrcAlpha=r.OneFactor,this._material.blendDstAlpha=r.OneFactor,this._material.toneMapped=!1,this._material.depthTest=!1,this._material.depthWrite=!1,this._quad=new t.QuadMesh(this._material)}setSelectedObjects(e){this._outlineNode.selectedObjects=e}get visible(){return this._enabled&&this._outlineNode.selectedObjects.length>0}render(e){if(!this.visible)return;if(this._camera.isOrthographicCamera!==this._orthographic){let e=[...this._outlineNode.selectedObjects];this._outlineNode.dispose(),this._material.dispose(),this._build(e)}let t=e.autoClear;e.autoClear=!1,e.setRenderTarget(null),this._quad.render(e),e.autoClear=t}show(){this._enabled=!0}hide(){this._enabled=!1}dispose(){this._enabled=!1,this._outlineNode?.dispose(),this._material?.dispose(),this._quad=null}};function DD(e=!1){let t=document.createElement(`canvas`);return t.style.cssText=`position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;`+(e?`display:none;`:``),t}function OD(e,t=1/0){let n=e?.getBoundingClientRect();if(!n||n.width===0||n.height===0)return null;let r=Math.min(window.devicePixelRatio||1,2),i=Math.round(n.width*r),a=Math.round(n.height*r),o=t/Math.max(i,a);return o<1&&(i=Math.max(1,Math.round(i*o)),a=Math.max(1,Math.round(a*o))),{width:i,height:a}}var kD=4096,AD=class{constructor(){this.canvas=DD(!0),this._visible=!1,this.renderer=null,this._sizeSource=null}async init({device:e,sizeSource:n}){this._sizeSource=n;let i=e.onuncapturederror,a=new t.WebGPURenderer({canvas:this.canvas,device:e,alpha:!0,antialias:(window.devicePixelRatio||1)<2});return await a.init(),e.onuncapturederror=i,a.outputColorSpace=r.SRGBColorSpace,a.setPixelRatio(1),a.setClearColor(0,0),a.autoClear=!1,this.renderer=a,this.syncSize(),this}get isVisible(){return this._visible}syncSize(){if(!this.renderer)return;let e=OD(this._sizeSource,kD);!e||e.width===this.canvas.width&&e.height===this.canvas.height||this.renderer.setSize(e.width,e.height,!1)}begin(){this.renderer&&(this.renderer.setRenderTarget(null),this.renderer.clear())}setVisible(e){this._visible!==e&&(this._visible=e,this.canvas.style.display=e?``:`none`)}dispose(){je(this.renderer),this.renderer=null,this.canvas.parentElement?.removeChild(this.canvas)}};rn();var jD=Wt(`overlay`),MD=(e,t)=>e.visible&&e.layer===t&&e.render,ND=class{constructor(e){this.camera=e,this._helpers=new Map,this._hudCanvas=DD(),this._hudCtx=this._hudCanvas.getContext(`2d`),this._helperScene=null,this._viewOverlay=null}async initViewRenderer({device:e,sizeSource:t}){if(!(!e||!t))try{this._viewOverlay=await new AD().init({device:e,sizeSource:t})}catch(e){jD.error(`overlay surface unavailable — light gizmos, transform gizmo and outlines are disabled`,e),this._viewOverlay=null}}setHelperScene(e){this._helperScene=e}getHUDCanvas(){return this._hudCanvas}mount(e){if(!e)return;let t=this._viewOverlay?.canvas;t&&t.parentElement!==e&&e.appendChild(t),this._hudCanvas.parentElement!==e&&e.appendChild(this._hudCanvas)}setupDefaultHelpers({helperScene:e,meshScene:t,pipeline:n,denoisingManager:r,app:i,renderWidth:a,renderHeight:o}){this.setHelperScene(e);let s=new TD;this.register(`tiles`,s),s.setRenderSize(a||1,o||1),i.addEventListener(`resolution_changed`,e=>{s.setRenderSize(e.width,e.height)}),n.eventBus.on(`pipeline:reset`,()=>s.hide()),this._wireDenoiserTileEvents(s,r);let c=new ED(t,this.camera);this.register(`outline`,c)}_wireDenoiserTileEvents(e,t){let n=[t?.denoiser,t?.upscaler];for(let t of n)t&&(t.addEventListener(`tileProgress`,t=>{t.continuous||t.tile&&(e.setRenderSize(t.imageWidth,t.imageHeight),e.setActiveTile(t.tile),e.show(),this.refreshHUD())}),t.addEventListener(`end`,()=>{e.hide(),this.refreshHUD()}))}register(e,t){this._helpers.has(e)&&(jD.warn(`helper "${e}" already registered — replacing.`),this._helpers.get(e).dispose?.()),this._helpers.set(e,t)}unregister(e){let t=this._helpers.get(e);t&&(t.dispose?.(),this._helpers.delete(e))}show(e){this._helpers.get(e)?.show()}hide(e){this._helpers.get(e)?.hide()}toggle(e){let t=this._helpers.get(e);t&&(t.visible?t.hide():t.show())}getHelper(e){return this._helpers.get(e)??null}isVisible(e){return this._helpers.get(e)?.visible??!1}showAll(){for(let e of this._helpers.values())e.show()}hideAll(){for(let e of this._helpers.values())e.hide()}render(){let e=this._viewOverlay;if(e){let t=this._hasVisibleSceneOverlay();(t||e.isVisible)&&(e.syncSize(),e.begin(),t&&this._renderSceneLayer(e.renderer),e.setVisible(t))}this.refreshHUD()}_renderSceneLayer(e){this._helperScene?.render(e,this.camera);for(let t of this._helpers.values())MD(t,`scene`)&&t.render(e,this.camera)}_hasVisibleSceneOverlay(){if(this._helperScene?.isDrawing)return!0;for(let e of this._helpers.values())if(MD(e,`scene`))return!0;return!1}refreshHUD(){let e=this._hudCanvas,t=this._hudCtx,n=!1;for(let e of this._helpers.values())if(MD(e,`hud`)){n=!0;break}if(!n){e.style.display!==`none`&&(e.style.display=`none`);return}e.style.display!==``&&(e.style.display=``);let r=e.clientWidth,i=e.clientHeight,a=r>0&&i>0?OD(e):null;if(a){(e.width!==a.width||e.height!==a.height)&&(e.width=a.width,e.height=a.height),t.clearRect(0,0,a.width,a.height),t.save(),t.scale(a.width/r,a.height/i);for(let e of this._helpers.values())MD(e,`hud`)&&e.render(t,r,i);t.restore(),e.style.display!==``&&(e.style.display=``)}}dispose(){for(let e of this._helpers.values())e.dispose?.();this._helpers.clear(),this._viewOverlay?.dispose(),this._viewOverlay=null,this._hudCanvas.parentElement&&this._hudCanvas.parentElement.removeChild(this._hudCanvas)}};V();var PD=class extends r.EventDispatcher{constructor(){super(),this.mixer=null,this.timer=new r.Timer,this.actions=[],this.isPlaying=!1,this._scene=null,this._mixerRoot=null,this._meshes=null,this._meshTriRanges=null,this._meshPositions=null,this._tempVec=new r.Vector3,this._skinnedCache=null,this._clipsCache=null,this._savedTimeScale=1,this.onFinished=null,this._rigid=!1,this._plans=null,this._allPlan=null,this._activeClip=0,this._slotOf=null,this._lastWorld=null,this._lastVisible=null,this.wakeCallback=null,this.applyPoseCallback=null}init(e,t,n,i){if(this.dispose(),!i||i.length===0)return;this._scene=e,this._mixerRoot=t,this._meshes=n,this.mixer=new r.AnimationMixer(t);let a=i.map(e=>this.mixer.clipAction(e)),o=(e,t)=>e.name===t||e.getObjectByName(t)!==void 0;!a.some(e=>e.getClip().tracks.some(e=>{let n=e.name.split(`.`)[0];return o(t,n)}))&&t!==e&&(console.log(`[AnimationManager] Tracks did not resolve from model root, retrying with scene root`),this.mixer=new r.AnimationMixer(e),this._mixerRoot=e,a=i.map(e=>this.mixer.clipAction(e))),this.actions=a,this._rigid=!n.some(e=>e?.isSkinnedMesh)&&!i.some(e=>e.tracks.some(e=>e.name.includes(`morphTargetInfluences`))),this._planClips(i),this.mixer.addEventListener(`finished`,()=>{this.isPlaying=!1,this.timer.reset(),this.onFinished&&this.onFinished()}),this._meshTriRanges=[],this._skinnedCache=[];let s=0;for(let e of n){let t=e.geometry,n=t.attributes.position,r=t.index?t.index.array:null,i=r?r.length/3:n.count/3,a=n.count;this._meshTriRanges.push({start:s,count:i,uniqueVerts:a,indices:r}),s+=i}this._skinnedCache=[],this._meshPositions=[];let c=n.filter(e=>e.isSkinnedMesh).length;console.debug(`[AnimationManager] Init: ${i.length} clips, ${n.length} meshes (${c} skinned), ${s} triangles, ${this._rigid?`rigid`:`deforming`}`)}_planClips(e){let t=this._mixerRoot,n=new Map;if(t.traverse?.(e=>{n.has(e.name)||n.set(e.name,e),n.set(e.uuid,e)}),this._plans=e.map(e=>{let t=new Set,i=!1;for(let a of e.tracks){let{nodeName:e,propertyName:o}=r.PropertyBinding.parseTrackName(a.name),s=n.get(e);s&&(t.add(s),o===`visible`&&(i=!0))}let a=[];for(let e=0;e<this._meshes.length;e++)for(let n=this._meshes[e];n;n=n.parent)if(t.has(n)){a.push(e);break}let o=new Set;for(let e of t)e.traverse(e=>e.isCamera&&o.add(e));return{meshes:Int32Array.from(a),visibility:i,cameras:[...o]}}),this._allPlan=null,!this._rigid)return;this._slotOf=new Int32Array(this._meshes.length).fill(-1);let i=0;for(let e of this._plans)for(let t of e.meshes)this._slotOf[t]<0&&(this._slotOf[t]=i++);this._lastWorld=new Float64Array(i*16).fill(NaN),this._lastVisible=new Uint8Array(i).fill(2)}_planFor(e){if(!this._plans)return null;if(e>=0)return this._plans[e]??null;if(!this._allPlan){let e=new Set,t=new Set,n=!1;for(let r of this._plans)r.meshes.forEach(t=>e.add(t)),r.cameras.forEach(e=>t.add(e)),n||=r.visibility;this._allPlan={meshes:Int32Array.from(e),visibility:n,cameras:[...t]}}return this._allPlan}_applyRigidPose(e){let t=this._planFor(e);if(!t)return;let n=[],r=!1,i=this._lastWorld,a=this._lastVisible;for(let e of t.meshes){let o=this._meshes[e],s=this._slotOf[e],c=o.matrixWorld.elements,l=s*16;for(let t=0;t<16;t++)if(i[l+t]!==c[t]){for(let e=0;e<16;e++)i[l+e]=c[e];n.push(e);break}if(t.visibility||a[s]===2){let e=1;for(let t=o;t;t=t.parent)if(!t.visible){e=0;break}a[s]!==e&&(a[s]=e,r=!0)}}(n.length||r||t.cameras.length)&&this.applyPoseCallback?.({meshIndices:n,visibilityChanged:r,cameras:t.cameras})}play(e=0){if(!(!this.mixer||this.actions.length===0)){if(this.mixer.stopAllAction(),e===-1)for(let e of this.actions)e.play();else e>=0&&e<this.actions.length&&this.actions[e].play();this._activeClip=e,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:B.ANIMATION_STARTED})}}pause(){this.mixer&&(this.mixer.timeScale=0,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:B.ANIMATION_PAUSED}))}resume(){this.mixer&&(this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:B.ANIMATION_STARTED}))}stop(){this.mixer&&(this.mixer.stopAllAction(),this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!1,this._rigid&&(this._mixerRoot.updateMatrixWorld(!0),this._applyRigidPose(-1)),this.dispatchEvent({type:B.ANIMATION_STOPPED}))}setSpeed(e){this._savedTimeScale=e,this.mixer&&this.isPlaying&&(this.mixer.timeScale=e)}setLoop(e){let t=e?r.LoopRepeat:r.LoopOnce;for(let n of this.actions)n.setLoop(t),n.clampWhenFinished=!e}seekTo(e,t=0){if(!this.mixer||this.actions.length===0)return null;if(this._activeClip=t,this.mixer.stopAllAction(),t===-1)for(let e of this.actions)e.play();else t>=0&&t<this.actions.length&&this.actions[t].play();this.mixer.setTime(e);for(let e of this.actions)e.isRunning()&&(e.paused=!0);return this._poseReader()}get currentTime(){return this.mixer?.time||0}update(){if(!this.isPlaying||!this.mixer)return null;this.timer.update();let e=this.timer.getDelta();return this.mixer.update(e),this._poseReader()}_scratch(e,t,n){let r=e[t];return r&&r.length===n?r:e[t]=new Float32Array(n)}_poseReader(){if(this._mixerRoot.updateMatrixWorld(!0),this._rigid)return this._applyRigidPose(this._activeClip),null;let e=this._planFor(this._activeClip)?.cameras;return e?.length&&this.applyPoseCallback?.({meshIndices:[],visibilityChanged:!1,cameras:e}),e=>this._computeMeshPositions(e)}_computeMeshPositions(e){let t=this._tempVec,n=this._meshes[e],{count:r,uniqueVerts:i,indices:a}=this._meshTriRanges[e],o=this._scratch(this._skinnedCache,e,i*3),s=this._scratch(this._meshPositions,e,r*9),c=n.matrixWorld;for(let e=0;e<i;e++)n.getVertexPosition(e,t),t.applyMatrix4(c),o[e*3]=t.x,o[e*3+1]=t.y,o[e*3+2]=t.z;if(a)for(let e=0;e<r;e++){let t=e*3,n=a[t]*3,r=a[t+1]*3,i=a[t+2]*3,c=e*9;s[c]=o[n],s[c+1]=o[n+1],s[c+2]=o[n+2],s[c+3]=o[r],s[c+4]=o[r+1],s[c+5]=o[r+2],s[c+6]=o[i],s[c+7]=o[i+1],s[c+8]=o[i+2]}else for(let e=0;e<r;e++){let t=e*3*3,n=(e*3+1)*3,r=(e*3+2)*3,i=e*9;s[i]=o[t],s[i+1]=o[t+1],s[i+2]=o[t+2],s[i+3]=o[n],s[i+4]=o[n+1],s[i+5]=o[n+2],s[i+6]=o[r],s[i+7]=o[r+1],s[i+8]=o[r+2]}return s}get hasAnimations(){return this.actions.length>0}get clips(){return this._clipsCache||=this.actions.map((e,t)=>{let n=e.getClip();return{index:t,name:n.name||`Clip ${t}`,duration:n.duration}}),this._clipsCache}dispose(){this.mixer&&=(this.mixer.stopAllAction(),this.mixer.uncacheRoot(this._mixerRoot),null),this.actions=[],this.isPlaying=!1,this.timer.reset(),this._scene=null,this._mixerRoot=null,this._meshes=null,this._meshTriRanges=null,this._meshPositions=null,this._skinnedCache=null,this._clipsCache=null,this._rigid=!1,this._plans=null,this._allPlan=null,this._activeClip=0,this._slotOf=null,this._lastWorld=null,this._lastVisible=null}};V();var FD=new r.Vector3(0,0,-1),ID=e=>{for(;e.parent;)e=e.parent;return e.isScene?e:null},LD=class{constructor({camera:e,canvas:t,orbitControls:n,app:i}){this._app=i,this._orbitControls=n,this._camera=e,this._controls=new _.TransformControls(e,t),this._gizmoScene=new r.Scene,this._gizmoScene.add(this._controls.getHelper()),this._attached=null,this._isDragging=!1,this._meshes=null,this._refitInFlight=!1,this._baselineComputed=!1,this._moved=new Set,this._tempForward=new r.Vector3,this._lightTargetDistance=null,this._lastLightPosition=null,this._onDraggingChanged=this._onDraggingChanged.bind(this),this._onObjectChange=this._onObjectChange.bind(this),this._controls.addEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.addEventListener(`objectChange`,this._onObjectChange)}setMeshData(e){this._meshes=e;for(let e of this._moved)ID(e)||this._moved.delete(e)}get movedObjects(){return[...this._moved].filter(e=>ID(e))}noteMoved(e){e&&!e.isLight&&this._moved.add(e)}attach(e){this._attached!==e&&(this._controls.attach(e),this._attached=e,this._lightTargetDistance=null,this._lastLightPosition=null,e.isLight&&e.target&&(this._syncLightAim(e),this._lastLightPosition=e.position.clone()))}detach(){this._attached&&(this._controls.detach(),this._attached=null,this._lightTargetDistance=null,this._lastLightPosition=null)}setMode(e){this._controls.setMode(e),this._app?.dispatchEvent({type:B.TRANSFORM_MODE_CHANGED,mode:e}),this._app?.refreshFrame()}setSpace(e){this._controls.setSpace(e),this._app?.refreshFrame()}get isDragging(){return this._isDragging}get attachedObject(){return this._attached}get controls(){return this._controls}render(e){if(!this._attached)return;let t=e.autoClear;e.autoClear=!1,e.clearDepth(),e.setRenderTarget(null),e.render(this._gizmoScene,this._camera),e.autoClear=t}_onDraggingChanged(e){this._isDragging=e.value,this._orbitControls&&(this._orbitControls.enabled=!e.value),e.value?this._app.dispatchEvent({type:B.OBJECT_TRANSFORM_START}):(this._attached?.isLight?this._finalizeLightTransform():this._recomputeAndRefit(),this._app.dispatchEvent({type:B.OBJECT_TRANSFORM_END}))}_onObjectChange(){this._app.needsReset=!0,this._app.wake(),this._attached?.isLight&&this._syncLightDuringDrag()}_syncLightDuringDrag(){let e=this._attached;if(e.target){let t=this._controls.mode;if(t===`translate`&&this._lastLightPosition&&!e.isDirectionalLight){let t=this._tempForward.copy(e.position).sub(this._lastLightPosition);e.target.position.add(t),e.target.updateMatrixWorld(!0)}else if(t===`rotate`&&this._lightTargetDistance!=null){let t=this._tempForward.set(0,0,-1).applyQuaternion(e.quaternion);e.target.position.copy(e.position).addScaledVector(t,this._lightTargetDistance),e.target.updateMatrixWorld(!0)}this._lastLightPosition.copy(e.position)}this._app.lightManager?.updateLights()}_finalizeLightTransform(){let e=this._attached;e.isDirectionalLight&&e.target&&this._controls.mode===`translate`&&this._syncLightAim(e),e.isRectAreaLight&&(e.scale.x!==1||e.scale.y!==1)&&(e.width*=e.scale.x,e.height*=e.scale.y,e.scale.set(1,1,1)),this._app.lightManager?.updateLights()}_syncLightAim(e){let t=this._tempForward.copy(e.target.position).sub(e.position),n=t.length();n>1e-4?(e.quaternion.setFromUnitVectors(FD,t.normalize()),this._lightTargetDistance=n):this._lightTargetDistance=1}_recomputeAndRefit(){if(!this._meshes||this._refitInFlight||!this._attached)return;this._attached.updateMatrixWorld(!0);let e=this._findAffectedMeshIndices(this._attached);if(e.length!==0){this._refitInFlight=!0;try{this._app.updateMeshTransforms(e),this._moved.add(this._attached)}catch(e){console.error(`Transform refit error:`,e)}finally{this._refitInFlight=!1}}}_findAffectedMeshIndices(e){let t=[];for(let n=0;n<this._meshes.length;n++){let r=this._meshes[n];(r===e||this._isDescendantOf(r,e))&&t.push(n)}return t}_isDescendantOf(e,t){let n=e.parent;for(;n;){if(n===t)return!0;n=n.parent}return!1}dispose(){this._controls.removeEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.removeEventListener(`objectChange`,this._onObjectChange),this.detach(),this._gizmoScene.remove(this._controls.getHelper()),this._controls.dispose(),this._meshes=null,this._moved.clear(),this._baselineComputed=!1,this._tempForward=null,this._lightTargetDistance=null,this._lastLightPosition=null,this._app=null,this._orbitControls=null,this._camera=null,this._controls=null,this._gizmoScene=null}},RD=class{constructor(e){this.layer=`scene`,this._transformManager=e,this._enabled=!0}get visible(){return this._enabled&&this._transformManager.attachedObject!==null}render(e){this._transformManager.render(e)}show(){this._enabled=!0}hide(){this._enabled=!1}dispose(){this._enabled=!1}},zD=1,BD=e=>typeof e==`string`&&/^https?:\/\//.test(e);function VD(e,t){let n=[];for(;e&&e!==t;){let t=e.parent;if(!t)return null;n.unshift(t.children.indexOf(e)),e=t}return e===t?n:null}function HD(e,t){let n=e;for(let e of t)if(n=n?.children[e],!n)return null;return n}function UD(e){return{key:e.assetLoader?.sceneSourceKey??null,name:e.sceneModel?.name??null,meshes:e.sceneMeshes.length,materials:e.stages.pathTracer?.materialData.materialCount??0}}function WD(e){let t=new Map;for(let n of e.sceneMeshes){let e=n.userData?.materialIndex;e!==void 0&&!t.has(e)&&t.set(e,Array.isArray(n.material)?n.material[0]:n.material)}return t}function GD(e){if(!e)return null;let t=e.status(),n=t.activeView,r=t.config?.id??n?.configId??null;return{config:r?{id:r}:null,view:n?{display:n.display,view:n.view,look:n.look??null}:null,transform:n?null:t.activeTransform?.id??null,workingSpace:t.workingSpaceAdopted?t.workingSpace:null,context:t.context??null}}function KD(e){let t=e.meshScene,n=WD(e),r=[];return t.traverse(e=>{e!==t&&e.visible===!1&&r.push(VD(e,t))}),{v:1,engine:Hh,savedAt:Date.now(),scene:UD(e),appended:t.children.filter(t=>t!==e.sceneModel&&t.userData?.__rayzeeSceneObject).map(e=>({name:e.userData.__rayzeeName??e.name,url:e.userData.__rayzeeSourceUrl??null,cacheKey:e.userData.__rayzeeCacheKey??null})),settings:e.settings.serialize(),environment:e.environmentManager?.serialize()??null,color:GD(e.color),lights:e.lightManager.serialize(),cameras:e.cameraManager.serialize(),timeline:e.timeline?.serialize()??null,materials:(e.stages.pathTracer?.materialData.serializeHostEdits()??[]).map(e=>({...e,name:n.get(e.index)?.name??``})),hidden:r,moved:(e.transformManager?.movedObjects??[]).map(e=>({path:VD(e,t),name:e.name,position:e.position.toArray(),quaternion:e.quaternion.toArray(),scale:e.scale.toArray()})).filter(e=>e.path)}}function qD(e,t,n){let r=e[t];r?.copy&&(n?.isColor||n?.isVector2||n?.isVector3)?r.copy(n):e[t]=n,e.needsUpdate=!0}async function JD(e,t,n,r){if(!t)return;let i=e.environmentManager;if(t.hdri&&t.hdri!==i.hdriSource){let i=BD(t.hdri)?t.hdri:await n({kind:`environment`,source:t.hdri});try{typeof i==`string`?await e.loadEnvironment(i):i?await e.loadFile(i):r(`environment`,`source unavailable`,{source:t.hdri})}catch(e){r(`environment`,e.message,{source:t.hdri})}}await i.restore(t)}async function YD(e,t,n,r){let i=e.color;if(!t||!i)return;let a=i.status(),o=a.activeView,s=!!t.view&&!!o&&o.display===t.view.display&&o.view===t.view.view&&(o.look??null)===t.view.look,c=a.config?.id??null,l=c??o?.configId??null;if(!((t.config?.id??null)===l&&!t.workingSpace&&!t.context&&(t.view?s:!o&&(!t.transform||t.transform===a.activeTransform?.id))))try{if(t.config&&t.config.id!==c){if(!await n({kind:`colorConfig`,config:t.config})){if(!(await i.constructor.listBuiltinConfigs().catch(()=>[])).some(e=>(e.name??e)===t.config.id||`ocio://${e.name??e}`===t.config.id)){r(`color`,`config unavailable`,{config:t.config.id});return}await e.loadColorConfig({builtin:t.config.id,registerViews:!1})}}else !t.config&&c&&await e.unloadColorConfig();t.context&&i.setContext(t.context),t.view?i.setView(t.view):t.transform&&i.setActiveView(t.transform),(t.workingSpace??null)!==(i.workingSpaceAdopted?i.workingSpace:null)&&(i.setWorkingSpace(t.workingSpace),await e.applyColorWorkingSpace())}catch(e){r(`color`,e.message,{config:t.config?.id??null})}}async function XD(e,t,{resolve:n=async()=>null}={}){if(t?.v!==1)throw Error(`scene state version ${t?.v} is not 1`);let r=[],i=(e,t,n={})=>r.push({section:e,reason:t,...n});for(let n of t.appended??[]){if(!n.url){i(`appended`,`added from memory, not a file`,{name:n.name});continue}try{await e.addModel(n.url,{name:n.name,cacheKey:n.cacheKey??void 0})}catch(e){i(`appended`,e.message,{name:n.name})}}let a=UD(e),o=t.scene??{},s=o.meshes===a.meshes&&o.materials===a.materials;s||i(`scene`,`the loaded scene is not the one saved: objects and materials left as loaded`,{saved:o,now:a}),await JD(e,t.environment,n,i),await YD(e,t.color,n,i);let c=e.settings.restore(t.settings);c.length&&i(`settings`,`not settings in this engine`,{keys:c});let l=e.lightManager.restore(t.lights);for(let t of l){let{gobo:n,ies:r}=t.userData;n&&e.goboManager?.entries?.length&&e.goboManager.setLightGobo(t.uuid,n.name,n),r&&e.iesManager?.entries?.length&&e.iesManager.setSpotLightProfile(t.uuid,r.name,r.intensity,{applyAutoCone:!1})}if(s){let n=WD(e);for(let r of t.materials??[]){let t=n.get(r.index);if(!t||(t.name??``)!==r.name){i(`materials`,`no such material`,{index:r.index,name:r.name});continue}for(let[n,i]of Object.entries(r.props)){let a=qr(i);qD(t,n,a),e.setMaterialProperty(r.index,n,a)}}let r=e.meshScene,a=new Set((t.hidden??[]).map(e=>HD(r,e)).filter(Boolean));r.traverse(e=>{e!==r&&!e.isLight&&(e.visible=!a.has(e))}),e.updateAllMeshVisibility();let o=[];for(let n of t.moved??[]){let t=HD(r,n.path);if(!t||t.name!==n.name){i(`moved`,`no such object`,{name:n.name});continue}t.position.fromArray(n.position),t.quaternion.fromArray(n.quaternion),t.scale.fromArray(n.scale),t.updateMatrixWorld(!0),e.transformManager?.noteMoved(t),o.push(t)}if(o.length){let t=[];e.sceneMeshes.forEach((e,n)=>{for(let r=e;r;r=r.parent)if(o.includes(r)){t.push(n);break}}),t.length&&e.updateMeshTransforms(t)}}let{mismatched:u}=e.cameraManager.restore(t.cameras);return u.length&&i(`cameras`,`model cameras changed`,{names:u}),e._dispatchCamerasUpdated(),e.timeline?.restore(t.timeline),e.reset(),{skipped:r}}rn(),V(),Js(),El();var ZD=({element:e,pbrtEntry:t}={})=>({...e===void 0?{}:{element:e},...t===void 0?{}:{pbrtEntry:t}}),QD=new WeakMap,$D=Wt(`engine`);function eO(e,t){e.lost.then(e=>{t.app&&t.app._handleDeviceLost(e)})}var tO=/swiftshader|llvmpipe|lavapipe|basic render|microsoft basic|warp/i;function nO(e){let t=e.info??{},n=`${t.vendor??``} ${t.architecture??``} ${t.device??``} ${t.description??``}`;return{vendor:t.vendor??``,architecture:t.architecture??``,device:t.device??``,description:t.description??``,isSoftware:t.isFallbackAdapter===!0||e.isFallbackAdapter===!0||tO.test(n)}}var rO=class extends r.EventDispatcher{constructor(e,t={}){super();try{QD.get(e)?.dispose()}catch(e){$D.warn(`prior canvas owner dispose failed`,e)}QD.set(e,this),this.canvas=e,this._autoResize=t.autoResize!==!1,this._maxSceneBytes=t.maxSceneBytes,this._storageOption=t.storage,this._memorySpill=t.memorySpill===!0,this.storage=null,this._storageRelease=null,this._container=t.container||null,this._applySceneMetadataEnabled=t.applySceneMetadata!==!1,this._applyingSceneMetadata=!1,this._profile=Ge(t.profile),this._issues=new xn({strict:t.strict===!0,onIssue:e=>this.dispatchEvent({type:B.ISSUE,issue:e})}),this.color=new ju({issues:this._issues}),Eu(this.color),this.settings=new Yb({...U,environmentRotation:this._profile.environmentRotation,saturation:this._profile.saturation,dofMode:this._profile.dofMode},{issues:this._issues}),this.renderer=null,this.scene=null,this.meshScene=null,this._sceneHelpers=null,this.assetLoader=null,this._sdf=null,this._animRefitInFlight=!1,this._emittersMoved=!1,this._maxTextureSize=U.maxTextureSize,this.pipeline=null,this._pendingReservedRenderSize=null,this.stages={},this.cameraManager=null,this.timeline=null,this.lightManager=null,this.goboManager=null,this.iesManager=null,this.denoisingManager=null,this.overlayManager=null,this.interactionManager=null,this.transformManager=null,this.animationManager=new PD,this.environmentManager=null,this.isInitialized=!1,this.pauseRendering=!1,this._pathTracerEnabled=!0,this._rasterPrecompile=null,this.animationManagerId=null,this.needsReset=!1,this._loadingInProgress=!1,this._needsDisplayRefresh=!1,this._paused=!1,this._emissiveSamplingUserSet=!1,this.completion=new Ab,this._resizeDebounceTimer=null,this._displayWidth=0,this._displayHeight=0,this._renderScale=1,this._pendingRenderScale=null,this._trackedListeners=[],this._disposed=!1,this._deviceLost=!1,this._gpuDevice=null,this._deviceLostHolder=null,this._deterministic=!1,this._dispatchPinned=!1,this._deterministicRestore=null,this.adapterInfo=null}_addTrackedListener(e,t,n){e&&(e.addEventListener(t,n),this._trackedListeners.push({target:e,type:t,handler:n}))}_removeTrackedListeners(){for(let{target:e,type:t,handler:n}of this._trackedListeners)try{e.removeEventListener(t,n)}catch(e){$D.warn(`failed to remove listener`,t,e)}this._trackedListeners.length=0}async init(){let e=this._initStorage();return await this._initRenderer(),this._applyPendingReservedRenderSize(),this._initCameraManager(),this._initScenes(),this._initAssetPipeline(),this._initPipeline(),await this._initManagers(),this._wireEvents(),await e,this._attachStorage(),this.stages.pathTracer.setTriangleData(new Uint32Array(st.FLOATS_PER_TRIANGLE),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setupMaterial(),this.isInitialized=!0,$D.debug(`WebGPU path tracer app initialized`),this}async _initStorage(){let e=this._storageOption??Ks().storage;if(e!==!1){if(e instanceof pr)this.storage=e;else{let{storage:e,reason:t,release:n}=await Gb(Ks().cacheNamespace);if(this._disposed){n();return}if(!e){this._issues.warn(Y.STORAGE_UNAVAILABLE,`on-disk storage is off: ${t}`,{reason:t});return}this.storage=e,this._storageRelease=n}this._addTrackedListener(this.storage,`change`,e=>this.dispatchEvent({type:B.STORAGE_CHANGED,area:e.area})),this._addTrackedListener(this.storage,`issue`,e=>this._issues.warn(e.code,e.message,e.detail))}}_attachStorage(){this.assetLoader&&(this.assetLoader.storage=this.storage)}animate(){if(this._deviceLost)return;if(this.animationManagerId=requestAnimationFrame(()=>this.animate()),this._loadingInProgress||this._sdf?.isProcessing){this.dispatchEvent({type:B.FRAME});return}if(this.timeline.update(),this.cameraManager.updateControls(),this._applyPendingRenderScale(),this.animationManager?.isPlaying&&!this._animRefitInFlight){let e=this.animationManager.update();e&&(this._animRefitInFlight=!0,this.refitBVH(e).catch(e=>$D.error(`animation refit error:`,e)).finally(()=>{this._animRefitInFlight=!1}))}let e=this.needsReset;if(this.needsReset&&=(this.stages.pathTracer?.noteViewChanged(),this.reset(!0),!1),this.cameraManager.camera.updateMatrixWorld(),!this.pathTracerEnabled){this.renderer.render(this.meshScene,this.cameraManager.camera),this._renderHelperOverlay();return}if(!this.pauseRendering){if(this.cameraManager.updateAutoFocus(),this.stages.pathTracer?.isReady){if(this.stages.pathTracer.isComplete&&this.completion.renderCompleteDispatched){this._needsDisplayRefresh&&(this._needsDisplayRefresh=!1,this.stages.compositor.render(this.pipeline.context),this._renderHelperOverlay()),this.stopAnimation();return}if(this.denoisingManager?.skipsTrace()){e&&this.stages.pathTracer.enterInteractionMode(),this._renderHelperOverlay(),this.dispatchEvent({type:B.FRAME});return}this.pipeline.render(),this.denoisingManager?.afterTrace(),this.stages.pathTracer.isComplete||(this.completion.updateTime(),this.denoisingManager?.tickContinuousDenoise(this.stages.pathTracer.frameCount)),this._ensureVRAMWiring();let t=this.stages.pathTracer?.vramTracker,n=this.stages.pathTracer?.frameCount??0;if(t&&(n<=1||n%30==0)&&t.measure(),Ee({timeElapsed:this.completion.timeElapsed,samples:De(this.stages.pathTracer),memoryUsed:t?.current??0,memoryPeak:t?.peak??0}),this.completion.isTimeLimitReached(this.stages.pathTracer,this.settings.get(`renderLimitMode`),this.settings.get(`renderTimeLimit`))&&(this.stages.pathTracer.isComplete=!0),this.stages.pathTracer.isComplete&&this.completion.markComplete()){this.denoisingManager.onRenderComplete({isStillComplete:()=>this.completion.renderCompleteDispatched,context:this.pipeline?.context});let e={samples:this.stages.pathTracer.frameCount,timeElapsed:this.completion.timeElapsed,budgetOverrun:this.completion.budgetOverrun,reason:this.completion.stopCondition(this.stages.pathTracer)??`samples`};this.dispatchEvent({type:`RenderComplete`,...e}),this.dispatchEvent({type:B.RENDER_COMPLETE,...e})}}this._renderHelperOverlay(),this.dispatchEvent({type:B.FRAME})}}stopAnimation(){this.animationManagerId&&=(cancelAnimationFrame(this.animationManagerId),null)}_handleDeviceLost(e){this._deviceLost||(this._deviceLost=!0,$D.error(`WebGPU device lost (${e?.reason||`unknown`}): ${e?.message||``}`),this.stopAnimation(),this.dispatchEvent({type:B.DEVICE_LOST,reason:e?.reason,message:e?.message}))}wake(){this._deviceLost||!this.animationManagerId&&this.isInitialized&&!this._paused&&this.animate()}pause(){this._paused=!0,this.stopAnimation()}resume(){this._paused=!1,this.animationManagerId||this.animate()}reset(e=!1,{motion:t=!1}={}){t&&this.stages.pathTracer?.noteViewChanged(),this.denoisingManager?.beforeReset({keepHistory:e||t}),this.pipeline&&(this.pipeline.reset(),e||(this.pipeline.eventBus.emit(`asvgf:reset`),this.pipeline.eventBus.emit(`denoiser:reset`))),this.denoisingManager?.afterReset(),this._abortPostProcess({keepDisplay:!0}),this.completion.reset(),this.wake(),this.dispatchEvent({type:`RenderReset`}),this.dispatchEvent({type:B.RENDER_RESET})}dispose(){if(!this._disposed){if(this._disposed=!0,this.dispatchEvent({type:B.DISPOSE}),this.stopAnimation(),clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=null,this._removeTrackedListeners(),we(null),this._storageRelease?.(),this._storageRelease=null,this.storage=null,this._sceneSource=this._sceneSourceFile=null,this._issues.detach(),this.color?.dispose(),this.color=null,this._textureReadback?.dispose(),this._textureReadback=null,this.interactionManager?.deselect?.(),this.transformManager?.detach?.(),this.animationManager?.dispose(),this.transformManager?.dispose(),this.overlayManager?.dispose(),this.lightManager?.dispose(),this.goboManager?.dispose(),this.iesManager?.dispose(),this.denoisingManager?.dispose(),this.interactionManager?.dispose(),this.timeline?.dispose(),this.cameraManager?.dispose(),this.pipeline?.dispose(),this._sdf?.dispose(),this._sdf=null,this.assetLoader?.dispose(),this.assetLoader=null,this.meshScene){this.meshScene.environment?.dispose(),this.meshScene.environment=null;for(let e of[...this.meshScene.children])Me(e);this.meshScene.clear(),this.meshScene=null}this._sceneHelpers?.clear(),this._sceneHelpers=null,this.scene?.clear(),this.scene=null;try{let e=(0,n.texture)().value,t=(0,n.cubeTexture)().value;e?._listeners?.dispose&&(e._listeners.dispose.length=0),t?._listeners?.dispose&&(t._listeners.dispose.length=0)}catch(e){$D.warn(`failed to clear TSL texture singleton listeners`,e)}this.canvas&&QD.get(this.canvas)===this&&QD.delete(this.canvas),this._gpuDevice&&=(this._gpuDevice.onuncapturederror=null,null),this._deviceLostHolder&&=(this._deviceLostHolder.app=null,null),je(this.renderer),this.renderer=null,this.stages={},this.isInitialized=!1}}unloadScene(){if(this.isInitialized){if(this._loadingInProgress)throw Error(`PathTracerApp.unloadScene: cannot unload while a load is in progress`);this._disposed||(this.animationManager?.dispose(),this._animRefitInFlight=!1,this.interactionManager?.deselect(),this.transformManager?.detach?.(),this.assetLoader?.releaseTargetModel(),this._sceneSource=this._sceneSourceFile=null,this.lightManager?.clearLights?.(),this.stages.pathTracer&&(this.stages.pathTracer.setTriangleData(new Uint32Array(st.FLOATS_PER_TRIANGLE),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setEmissiveTriangleData?.(new Float32Array,0,0),this.stages.pathTracer.setupMaterial()),this.denoisingManager?.dropDisplay(),this.reset(),this.dispatchEvent({type:`SceneUnloaded`}))}}async loadModel(e,t={}){await this._loadWithSceneRebuild(()=>this.assetLoader.loadModel(e,t),{type:`ModelLoaded`,url:e},{kind:`url`,url:e,cacheKey:t.cacheKey??null})}async loadObject3D(e,t=`object3d`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadObject3D(e,t),{type:`Object3DLoaded`,name:t},{kind:`object3d`,name:t})}_busyError(e){let t=Error(`${e}: another load is already in progress`);return t.code=`LOAD_IN_PROGRESS`,t}async loadEnvironment(e){if(this._loadingInProgress)throw this._busyError(`PathTracerApp.loadEnvironment`);this._loadingInProgress=!0;try{await this.assetLoader.loadEnvironment(e);let t=this.meshScene.environment;t&&this.stages.pathTracer&&await this.stages.pathTracer.environment.setEnvironmentMap(t),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.dispatchEvent({type:`EnvironmentLoaded`,url:e})}finally{this._loadingInProgress=!1}}async inspectArchive(e){return await this.assetLoader.inspectArchive(e)}async loadFile(e,t={}){if(t=this._sceneBudgets(t),typeof e==`string`){let n=t.filename??wg(e),r=this.assetLoader?.getFileFormat(n);if(!r)throw Error(`Unsupported file format: ${n}`);if(r.type===`environment`||r.type===`image`)return this.loadEnvironment(e);await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromUrl(e,{...t,filename:n}),{type:`ModelLoaded`,filename:n},{kind:`url`,url:e,filename:n,cacheKey:t.cacheKey??null,...ZD(t)});return}let n=this.assetLoader?.getFileFormat(e?.name||``);if(!n)throw Error(`Unsupported file format: ${e?.name}`);if(n.type!==`environment`&&n.type!==`image`){let n=Wn(e).catch(()=>({name:e.name,size:e.size,lastModified:e.lastModified??0,sample:null}));await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromFile(e,t),{type:`ModelLoaded`,filename:e.name},async()=>{let e=await n;return{kind:`local-file`,file:e,key:e.sample?Gn(e):null,...ZD(t)}}),this._sceneSourceFile=e;return}if(this._loadingInProgress)throw this._busyError(`PathTracerApp.loadFile`);this._loadingInProgress=!0;try{await this.assetLoader.loadAssetFromFile(e);let t=this.meshScene.environment;t&&this.stages.pathTracer&&await this.stages.pathTracer.environment.applyHDRI(t),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.dispatchEvent({type:`EnvironmentLoaded`,filename:e.name})}finally{this._loadingInProgress=!1}}async loadExampleModels(e,t){await this._loadWithSceneRebuild(()=>this.assetLoader.loadExampleModels(e,t),{type:`ModelLoaded`,index:e},{kind:`url`,url:t[e]?.url??null,cacheKey:null})}cancelLoad(){this._loadingInProgress&&this.assetLoader?.cancelActiveLoad()}async setMaxTextureSize(e,{reprocess:t=!0}={}){let n=this._maxTextureSize;if(this._maxTextureSize=this._sdf?.setMaxTextureSize(e)??e,typeof this.stages?.pathTracer?.sdfs?.setMaxTextureSize==`function`&&this.stages.pathTracer.sdfs.setMaxTextureSize(this._maxTextureSize),t&&this._maxTextureSize!==n&&this._sdf?.triangles&&!this._loadingInProgress){this._loadingInProgress=!0;try{await this.loadSceneData(),this.reset(),this.dispatchEvent({type:`TexturesReprocessed`,maxTextureSize:this._maxTextureSize})}finally{this._loadingInProgress=!1}}}get sceneSource(){return this._sceneSource??null}get sceneSourceFile(){return this._sceneSourceFile??null}async _loadWithSceneRebuild(e,t,n=null){if(this._loadingInProgress)throw this._busyError(`PathTracerApp`);this._loadingInProgress=!0;try{await e(),this._sceneSource=typeof n==`function`?await n():n,this._sceneSourceFile=null,this._emissiveSamplingUserSet=!1,this._clearAppendedModels(),this._syncControlsAfterLoad(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()}),this._maybeSpill(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.denoisingManager?.dropDisplay(),this.reset(),this.cameraManager.currentCameraIndex=0,this.dispatchEvent(t),this._dispatchCamerasUpdated()}catch(e){throw(!e||e.code!==`LOAD_IN_PROGRESS`)&&this._discardFailedLoad(),e}finally{this._loadingInProgress=!1}}_discardFailedLoad(){this._sceneSource=this._sceneSourceFile=null;try{this._clearAppendedModels(),this.assetLoader?.releaseTargetModel(),this.denoisingManager?.dropDisplay(),this.reset()}catch(e){console.warn(`PathTracerApp: could not clear the scene after a failed load`,e)}}get sceneMetadata(){return this.assetLoader?.sceneMetadata??null}_beginSceneMetadataEnvironment(){let e=this.sceneMetadata?.environment;return!this._applySceneMetadataEnabled||!e?.sourceFile||!this.stages.pathTracer?null:(this.stages.pathTracer.environment.beginHDRI(),this._applyingSceneMetadata=!0,this.assetLoader.loadEnvironment(e.sourceFile).catch(t=>(this._issues.record(Y.ENVIRONMENT_LOAD_FAILED,`authored environment "${e.sourceFile}" failed to load — lighting falls back to the previous environment`,{sourceFile:e.sourceFile,cause:String(t?.message??t)}),null)).finally(()=>{this._applyingSceneMetadata=!1}))}_applySceneMetadataSettings(e){let t=this.sceneMetadata,n=t?.environment;if(!n)return;let r={enableEnvironment:!0,showBackground:!0,transparentBackground:!1};n.intensity!==void 0&&(r.environmentIntensity=n.intensity,r.backgroundIntensity=n.intensity),n.rotation!==void 0&&(r.environmentRotation=n.rotation),this.settings.setMany(r,{reset:!1,source:qb.SCENE_METADATA}),this.scene&&(this.scene.background=e),this.dispatchEvent({type:B.SCENE_METADATA_APPLIED,metadata:t,environment:{...n}})}async loadSceneData({pendingEnvironment:e=null,keepUserLights:t=!1}={}){this._preserveSelectionOnRebuild||this.interactionManager?.deselect(),this.animationManager.dispose(),this._animRefitInFlight=!1,this._emittersMoved=!1,this._tagPrimarySceneObject();let n=new Sh(``,{namespace:`scene`,level:`info`}),r=()=>this.stages.pathTracer.environment.envParams.mode===`hdri`?this.meshScene.environment:null,i=r(),a=null;if(e?(n.start(`Environment fetch + CDF (concurrent)`),a=e.then(async e=>{e&&(await this.stages.pathTracer.environment.applyHDRI(e),this._applySceneMetadataSettings(e))}).catch(e=>this._issues.record(Y.ENVIRONMENT_LOAD_FAILED,`authored environment failed to install — the scene is lit by whatever was already loaded`,{cause:String(e?.message??e)})).finally(()=>n.end(`Environment fetch + CDF (concurrent)`))):i?.image?.data&&(n.start(`Environment CDF build (worker)`),this.stages.pathTracer.scene.environment=i,a=this.stages.pathTracer.environment.buildEnvironmentCDF().then(()=>{n.end(`Environment CDF build (worker)`),this._applySceneMetadataEnabled&&this._applySceneMetadataSettings(i)})),n.start(`BVH build (SceneProcessor)`),this._sdf.setMaxTextureSize(this._maxTextureSize),await this._sdf.buildBVH(this.meshScene,{sceneKey:this.assetLoader?.sceneSourceKey??null,progressive:this._progressiveSpill()}),this.assetLoader?.flushPendingGraph(this._sdf.performanceMetrics.totalProcessingTime),n.end(`BVH build (SceneProcessor)`),H({status:`Transferring data to GPU...`,progress:86}),await new Promise(e=>setTimeout(e,0)),n.start(`GPU data transfer`),!this._sdf.uploadToPathTracer(this.stages.pathTracer,this.lightManager,this.meshScene,r(),{keepUserLights:t}))return!1;this.stages.pathTracer._meshRefs=this.stages.pathTracer._collectMeshRefs(this.meshScene),this.stages.pathTracer.setMeshVisibilityData(this.stages.pathTracer._meshRefs),this._refreshEmissiveForVisibility(),n.end(`GPU data transfer`),H({status:`Compiling shaders...`,progress:90}),await new Promise(e=>setTimeout(e,0)),n.start(`Material setup (TSL compile)`),this.stages.pathTracer.setupMaterial(),n.end(`Material setup (TSL compile)`),this._rasterPrecompile=null,this._pathTracerEnabled||(n.start(`Pipeline precompile`),await this.precompileRaster(),n.end(`Pipeline precompile`)),a&&(H({status:`Finalizing environment map...`,progress:95}),await a,this.stages.pathTracer.environment.applyCDFResults());let o=this.getSceneMinY();if(this.settings.set(`groundProjectionLevel`,o,{reset:!1}),this.settings.set(`groundCatcherHeight`,o,{reset:!1}),!this._emissiveSamplingUserSet){let e=(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0;this.settings.set(`enableEmissiveTriangleSampling`,e,{reset:!1})}return n.start(`Apply settings`),this.settings.applyAll(),this.stages.compositor.setTransparentBackground(this.settings.get(`transparentBackground`)),n.end(`Apply settings`),n.print(this._sceneSummaryParts()),Te(),this._initAnimationAndTransforms(),this.dispatchEvent({type:`SceneRebuild`}),!0}_sceneSummaryParts(){let e=this.stages.pathTracer,t=this._sdf?.instanceTable?.setCount??0,n=this._sdf?.geometryExtractor?.maps?.length??0;return[J.count(e.triangleCount,`tri`),t?J.count(t,`mesh`,`meshes`):null,J.count(e.materialData.materialCount,`material`),n?J.count(n,`map`):null,J.count(e.bvhNodeCount,`BVH node`)]}_tagPrimarySceneObject(){let e=this.sceneModel;e&&(e.userData.__rayzeeSceneObject=!0)}_clearAppendedModels(){let e=this.meshScene;if(!e)return;let t=this.assetLoader?.floorPlane,n=this.sceneModel;for(let r of[...e.children])r===t||r===n||r.userData?.__rayzeeSceneObject&&this.assetLoader.removeModelRoot(r)}async _finishRebuildNoReframe(e){await this.loadSceneData({keepUserLights:!0}),this._maybeSpill(),this._recalibrateControlLimits(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),e&&this.dispatchEvent(e)}async addModel(e,{name:t,cacheKey:n}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModel: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:r}=await this.assetLoader.appendModel(e,{cacheKey:n});return r.userData.__rayzeeSceneObject=!0,r.userData.__rayzeeSourceUrl=e,n&&(r.userData.__rayzeeCacheKey=n),t&&(r.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,url:e,id:r.uuid}),r.uuid}finally{this._preserveSelectionOnRebuild=!1,this._loadingInProgress=!1}}async addModelFromObject3D(e,{name:t}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModelFromObject3D: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:n}=this.assetLoader.appendObject3D(e,t||`object3d`);return n.userData.__rayzeeSceneObject=!0,t&&(n.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,id:n.uuid}),n.uuid}finally{this._preserveSelectionOnRebuild=!1,this._loadingInProgress=!1}}async removeSceneObject(e){if(!this.meshScene)return!1;let t=this.assetLoader?.floorPlane;if(t&&t.uuid===e)return!1;let n=this.getSceneObject(e);if(!n)return!1;if(this._loadingInProgress)throw Error(`PathTracerApp.removeSceneObject: another load is already in progress`);this._loadingInProgress=!0;try{return this.interactionManager?.deselect(),this.transformManager?.detach?.(),n===this.sceneModel?this.assetLoader.releaseTargetModel():this.assetLoader.removeModelRoot(n),await this._finishRebuildNoReframe({type:`SceneObjectRemoved`,id:e}),!0}finally{this._loadingInProgress=!1}}setSceneObjectVisibility(e,t){return this.setMeshVisibilityByUuid(e,t)}get currentCameraIndex(){return this.cameraManager?.currentCameraIndex??0}addCamera({name:e}={}){let t=this.cameraManager.addCameraFromView(e);return this.cameraManager.switchCamera(t),this._dispatchCamerasUpdated(),t}removeCamera(e){let t=this.cameraManager.removeCamera(e);return t&&this._dispatchCamerasUpdated(),t}exportSceneState(){return KD(this)}async importSceneState(e,t){return await XD(this,e,t)}_sceneBudgets(e){return!this._memorySpill||!this.storage?e:{maxTriangles:KC,maxPlacements:qC,...e}}_progressiveSpill(){if(!this._memorySpill||!this.storage||(this.assetLoader?.animations?.length??0)>0)return null;let e=this.stages.pathTracer;return{storage:this.storage,uploader:(t,n)=>n===`triangles`?e.createTriangleChunkUploader(t):e.createChunkUploader(t)}}_maybeSpill(){!this._memorySpill||!this.storage||this.animationManager?.hasAnimations||this._sdf?.spillToDisk(this.storage).then(e=>e&&this.dispatchEvent({type:`SceneSpilled`,...e})).catch(e=>this._issues.warn(Y.STORAGE_WRITE_FAILED,`memory spill failed: ${e.message}`))}async ensureSceneResident(){this._sdf?.spilled&&await this._sdf.ensureResident()}_dispatchCamerasUpdated(){this.dispatchEvent({type:`CamerasUpdated`,cameras:this.cameraManager.cameras,cameraNames:this.cameraManager.getCameraNames()})}get sceneMeshes(){return this._sdf?.meshes??[]}get sceneModel(){return this.assetLoader?.targetModel??null}getSceneObject(e){let t=this.meshScene?.children.find(t=>t.uuid===e);return t?.userData?.__rayzeeSceneObject?t:null}async refitBVH(e,t){await this.ensureSceneResident();let n=await this._sdf.refitBVH(e,t);return this.stages.pathTracer.updateTriangleData(this._sdf.triangles),this.stages.pathTracer.updateBVHData(this._sdf.bvh),this.reset(!1,{motion:!0}),n}refitBLASes(e,t,n){if(this._sdf?.spilled)throw Error(`refitBLASes: the scene is spilled to disk — await app.ensureSceneResident() first`);let r=this._sdf.refitBLASes(e,t,n),{triRanges:i,bvhRanges:a}=this._sdf.computeBLASDirtyRanges(e);return this.stages.pathTracer.updateBufferRanges(i,a),this.reset(!1,{motion:!0}),this._sdf.scheduleBackgroundRebuild(e,e=>{let t=this._sdf.computeBLASDirtyRanges([e]);this.stages.pathTracer.updateBufferRanges(t.triRanges,t.bvhRanges),this.reset(!1,{motion:!0})}),r}_applyAnimationPose({meshIndices:e,visibilityChanged:t,cameras:n}){if(!this._sdf?.instanceTable)return;let r=!1;e.length>0&&(this._notePlacementsMoving(e),this._sdf.updateMeshTransforms(e),this.stages.pathTracer?.updateBufferRanges([],[this._sdf.computeTLASDirtyRange()]),this._sdf.movesEmitters(e)&&(this._emittersMoved=!0,this.animationManager.isPlaying||this._refreshMovedEmitters()),r=!0),t&&(this.stages.pathTracer?.updateAllMeshVisibility(),this._refreshEmissiveForVisibility(),r=!0),n.length>0&&this._followAnimatedCamera(n)&&(r=!0),r&&this.reset(!1,{motion:!0})}_notePlacementsMoving(e){let t=this.denoisingManager,n=this._sdf?.instanceTable;if(!(!t?.historyActive||!n))for(let r of e){let e=n.placementRunOf(r);if(e)for(let r=e.start;r<e.start+e.count;r++)t.notePlacementMoving(n.tlasLeafIndex[r],n.world,r*16)}}_refreshMovedEmitters(){if(this._emittersMoved){if(this._sdf?.spilled){this.ensureSceneResident().then(()=>this._refreshMovedEmitters());return}this._emittersMoved=!1,this._uploadEmissivePayload(this._sdf?.refreshEmissiveTransforms()??null)}}_followAnimatedCamera(e){let t=this.cameraManager,n=t.currentCameraIndex>0?t.cameras[t.currentCameraIndex]:null,i=n?.userData?.__rayzeeSourceUuid,a=i&&e.find(e=>e.uuid===i);if(!a)return!1;a.updateWorldMatrix(!0,!1);let o=new r.Vector3;a.matrixWorld.decompose(n.position,n.quaternion,o),n.scale.set(Math.sign(o.x)||1,Math.sign(o.y)||1,Math.sign(o.z)||1),a.isPerspectiveCamera&&(n.fov=a.fov);let s=t.camera,c=t.controls,l=c?c.target.distanceTo(s.position):0;if(s.position.copy(n.position),s.quaternion.copy(n.quaternion),s.scale.copy(n.scale),s.isPerspectiveCamera&&n.isPerspectiveCamera&&(s.fov=n.fov),s.updateProjectionMatrix(),s.updateMatrixWorld(!0),c){let e=new r.Vector3(0,0,-1).applyQuaternion(s.quaternion);c.target.copy(s.position).addScaledVector(e,l||1)}return!0}updateMeshTransforms(e){this._notePlacementsMoving(e);let t=this._sdf.updateMeshTransforms(e);return this.stages.pathTracer.updateBufferRanges([],[this._sdf.computeTLASDirtyRange()]),this.reset(!1,{motion:!0}),t}setReservedRenderResolution(e,{allowLower:t=!1}={}){let n=t?e:Math.max(e,W);if(!this.renderer)return this._pendingReservedRenderSize={requestedPx:e,allowLower:t},Math.max(256,Math.min(Ze,Math.floor(n)||256));let r=this.renderer.backend?.device?.limits?.maxStorageBufferBindingSize||128*1024*1024,i=(typeof navigator<`u`&&navigator.deviceMemory||4)>=8&&r>=1024*1024*1024?Ze:2048,a=Qe(Math.min(n,i));if((this.stages?.pathTracer?.storageTextures?.writeColor?.image?.width??a)!==a){let e=this.pauseRendering;this.pauseRendering=!0;try{let e=this.renderer.domElement;(e.width>a||e.height>a)&&this.renderer.setSize(Math.min(e.width,a),Math.min(e.height,a),!1);for(let e of Object.values(this.stages))e?.reallocateReservedStorage?.()}finally{this.pauseRendering=e}this.reset(),this.dispatchEvent({type:`reserved_render_size_changed`,size:a})}return a}_applyPendingReservedRenderSize(){let e=this._pendingReservedRenderSize;if(!e)return;this._pendingReservedRenderSize=null;let t=this.setReservedRenderResolution(e.requestedPx,{allowLower:e.allowLower});t<e.requestedPx&&this._issues.warn(Y.RENDER_RESERVE_CAPPED,`reserved render size ${J.n(e.requestedPx)}px was capped to ${J.n(t)}px by this device's limits — renders above ${J.n(t)}px will be declined`,{requested:e.requestedPx,applied:t}),this.dispatchEvent({type:`reserved_render_size_changed`,size:t})}getReservedRenderResolution(){return W}_isRenderSizeSupported(e,t){return e>W||t>W?(this._issues.record(Y.RENDER_SIZE_DECLINED,`render resolution ${e}×${t} exceeds the ${W}px storage reserve — resize ignored, so output stays at the previous size. Raise it with setReservedRenderResolution( ${Math.max(e,t)} ) before init().`,{width:e,height:t,reserve:W}),!1):!0}onResize(){let e=this.canvas.clientWidth,t=this.canvas.clientHeight;if(e===0||t===0||!this._isRenderSizeSupported(e,t))return;this.renderer.setPixelRatio(1),this._setDisplaySize(e,t);let n=this.denoisingManager?._lastRenderWidth??0,r=this.denoisingManager?._lastRenderHeight??0;e===n&&t===r||(clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=setTimeout(()=>{this._applyRenderResize(e,t)},300))}_applyRenderResize(e,t){this._isRenderSizeSupported(e,t)&&(this.pipeline?.setSize(this._scaled(e),this._scaled(t)),this.denoisingManager?.setRenderSize(e,t),this.needsReset=!0,this.dispatchEvent({type:`resolution_changed`,width:e,height:t}))}setCanvasSize(e,t){return e===0||t===0||!this._isRenderSizeSupported(e,t)?null:(this.renderer.setPixelRatio(1),this._setDisplaySize(e,t),clearTimeout(this._resizeDebounceTimer),this._applyRenderResize(e,t),{width:e,height:t})}_scaled(e){return Math.max(1,Math.round(e*this._renderScale))}_setDisplaySize(e,t){this._displayWidth=e,this._displayHeight=t,this.renderer.setSize(this._scaled(e),this._scaled(t),!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix()}_interactionRenderScale(){if(this.denoisingManager?.continuousDenoise)return 1;let e=Number(this.settings.get(`interactionRenderScale`));return e>0?Math.min(1,Math.max(.125,e)):1}_requestRenderScale(e){this._pendingRenderScale=e}_applyPendingRenderScale(){this._pendingRenderScale!==null&&this._applyRenderScale(this._pendingRenderScale)}_applyRenderScale(e){this._pendingRenderScale=null,!(this._disposed||e===this._renderScale)&&(this._renderScale=e,!(!this._displayWidth||!this._displayHeight)&&(this._setDisplaySize(this._displayWidth,this._displayHeight),this.pipeline?.setSize(this._scaled(this._displayWidth),this._scaled(this._displayHeight)),this.pipeline?.eventBus.emit(`asvgf:reset`),this.pipeline?.eventBus.emit(`denoiser:reset`),this.needsReset=!0))}configureForMode(e,t={}){let n=e===`production`,r=n?Pt:Ft;this.denoisingManager?.setCadenceSuspended(n),this.timeline.stop(),this.cameraManager.controls.enabled=!n,this.settings.setMany(It(r),{silent:!0,source:qb.MODE_PRESET}),this.stages.pathTracer?.setUniform(`renderMode`,parseInt(r.renderMode)),n&&this._applyRenderScale(1),this.stages.pathTracer?.updateCompletionThreshold?.();let i=this.denoisingManager?.denoiser;if(i&&(i.abort(),this.denoisingManager.applyOIDNEnabled(r.enableOIDN),this.denoisingManager.applyOIDNQuality(r.oidnQuality)),this.denoisingManager?._syncGBufferStages?.(),this.denoisingManager?.upscaler?.abort(),t.canvasWidth&&t.canvasHeight&&(this.setReservedRenderResolution(Math.max(t.canvasWidth,t.canvasHeight)),this.setCanvasSize(t.canvasWidth,t.canvasHeight)),this.needsReset=!1,this.pauseRendering=!1,n){let e=this.stages.pathTracer?.vramTracker;e&&(e.measure(),e.resetPeak())}this.reset()}refreshFrame(){this._needsDisplayRefresh=!0,this.wake()}_abortPostProcess({keepDisplay:e=!1}={}){if(this.denoisingManager?.abort(this.canvas,{keepDisplay:e}),this.denoisingManager?.restoreBaseResolution()){let e=this.denoisingManager._lastRenderWidth,t=this.denoisingManager._lastRenderHeight;this.dispatchEvent({type:`resolution_changed`,width:e,height:t})}}requestPostProcessRefresh(){!this.stages.pathTracer?.isReady||this._deviceLost||(this._abortPostProcess(),this.completion.renderCompleteDispatched=!1,this.wake())}setDeterministicMode(e=!0,{pinDispatch:t=!0}={}){let n=this.stages.pathTracer;if(!n)return!1;if(e)this._deterministicRestore||={settings:{useAdaptiveSampling:this.settings.get(`useAdaptiveSampling`),usePixelFreeze:this.settings.get(`usePixelFreeze`),interactionModeEnabled:this.settings.get(`interactionModeEnabled`),renderLimitMode:this.settings.get(`renderLimitMode`),renderTimeLimit:this.settings.get(`renderTimeLimit`)},bounceEarlyExit:n._bounceEarlyExitThreshold,dynamicDispatch:n._useDynamicDispatch,autoFocusMode:this.cameraManager?.autoFocusMode,autoExposure:this.stages.autoExposure?.enabled,continuousDenoise:this.denoisingManager?.continuousDenoise},this.settings.setMany({useAdaptiveSampling:!1,usePixelFreeze:!1,interactionModeEnabled:!1,renderLimitMode:`frames`,renderTimeLimit:0},{silent:!0}),t?(n._bounceEarlyExitThreshold=-1,n._useDynamicDispatch=!1):(n._bounceEarlyExitThreshold=this._deterministicRestore.bounceEarlyExit,n._useDynamicDispatch=this._deterministicRestore.dynamicDispatch),this.cameraManager?.setAutoFocusMode(`manual`),this.stages.autoExposure&&(this.stages.autoExposure.enabled=!1),this.denoisingManager?.setContinuousDenoise(!1),n._pinSeedToFrame=!0,this._deterministic=!0,this._dispatchPinned=t;else if(this._deterministicRestore){let e=this._deterministicRestore;this.settings.setMany(e.settings,{silent:!0}),n._bounceEarlyExitThreshold=e.bounceEarlyExit,n._useDynamicDispatch=e.dynamicDispatch,e.autoFocusMode!==void 0&&this.cameraManager?.setAutoFocusMode(e.autoFocusMode),this.stages.autoExposure&&e.autoExposure!==void 0&&(this.stages.autoExposure.enabled=e.autoExposure),e.continuousDenoise!==void 0&&this.denoisingManager?.setContinuousDenoise(e.continuousDenoise),n._pinSeedToFrame=!1,this._deterministicRestore=null,this._deterministic=!1,this._dispatchPinned=!1}return this.reset(),this.stopAnimation(),this._deterministic}get issues(){return this._issues.list}get issueErrors(){return this._issues.errors}clearIssues(){this._issues.clear()}get isDeterministic(){return this._deterministic&&this._dispatchPinned}async renderFrames(e,{reset:t=!0,yieldEvery:n=8,onProgress:r,allowEarlyRetire:i=!1}={}){let a=this.stages.pathTracer;if(!a)throw Error(`renderFrames: app is not initialized`);if(!(e>0))throw Error(`renderFrames: count must be positive, got ${e}`);await a.blueNoiseReady;let o=(t?0:a.frameCount)+e;this.settings.get(`maxSamples`)<o&&this.settings.set(`maxSamples`,o,{silent:!0,reset:!1}),t&&this.reset(),this.stopAnimation();let s=e+64,c=0,l=!1;for(;a.frameCount<o&&c<s;){if(this._deviceLost)throw Error(`renderFrames: WebGPU device lost`);if(!a.isReady)throw Error(`renderFrames: path tracer stage is not ready`);if(this.pipeline.render(),c++,a.isComplete&&a.frameCount<o){l=!0;break}r?.(a.frameCount),n>0&&c%n===0&&await new Promise(e=>setTimeout(e,0))}if(a.frameCount<o&&!(l&&i)){let e=l?"adaptive sampling retired the frame at the convergence threshold — pass `allowEarlyRetire: true`, or disable it with setDeterministicMode()":`something retired the render (maxSamples, a stray reset, or a canvas resize)`;throw Error(`renderFrames: stopped at ${a.frameCount}/${o} samples after ${c} passes — ${e}`)}return a.frameCount}async captureRenderCheckpoint(){let e=this.stages.pathTracer;if(!e)return null;let t=await e.captureAccumulation();return{v:1,engine:Hh,savedAt:Date.now(),samples:t.state.frameCount,...t}}restoreRenderCheckpoint(e){if(e?.v!==1)throw Error(`render checkpoint version ${e?.v} is not 1`);let t=this.stages.pathTracer;if(!t)throw Error(`restoreRenderCheckpoint: app is not initialized`);t.restoreAccumulation(e),this.needsReset=!1,this.dispatchEvent({type:B.RENDER_RESET,restored:e.samples})}async renderToBuffer({colorSpace:e=`srgb`,preserveAlpha:t=!1,source:n=`accumulation`}={}){let r=e!==`linear`&&e!==`srgb`;if(r&&!this.color?.hasConfig)throw Error(`renderToBuffer: colorSpace must be 'linear' or 'srgb' without a colour config loaded, got "${e}"`);let i=this.stages?.pathTracer,a=i?.storageTextures?.readTarget;if(!a)throw Error(`renderToBuffer: no render target — call init() and render at least one sample`);let{width:o,height:s}=i,c=n===`display`?await this._readDisplaySource(a,o,s):await this.renderer.readRenderTargetPixelsAsync(a,0,0,o,s,0);if(e===`linear`)return{data:c,width:o,height:s,colorSpace:e,workingSpace:this.color?.workingSpace??null};if(r){let{rgba:t,colorSpace:n}=this.color.exportPixels(c,e);return{data:t,width:o,height:s,colorSpace:n}}return{data:oh(c,{exposure:this.renderer.toneMappingExposure,toneMapping:this.renderer.toneMapping,saturation:this.settings.get(`saturation`)??1,preserveAlpha:t}),width:o,height:s,colorSpace:e}}enableGPUTiming(e=!0){let t=this.renderer?.backend;return!t||e&&t.hasFeature?.(`timestamp-query`)!==!0?!1:(t.trackTimestamp=e,t.trackTimestamp===e)}profileNextDenoise(){return this.denoisingManager?.denoiser?.profileNextDenoise()??!1}async getDenoiseProfile(){let e=this.denoisingManager?.denoiser;return e?{profile:await e.getLastDenoiseProfile(),runtime:e.getRuntimeInfo()}:null}async getGPUTimings(){let e=this.renderer;if(!e?.backend?.trackTimestamp)return null;await e.resolveTimestampsAsync(`compute`),await e.resolveTimestampsAsync(`render`);let t=e.info.compute.timestamp||0,n=e.info.render.timestamp||0;return{compute:t,render:n,total:t+n}}async getKernelGPUTimings(){let e=this.renderer;if(!e?.backend?.trackTimestamp)return null;await e.resolveTimestampsAsync(`compute`);let t=e.backend.timestampQueryPool?.compute?.timestamps;if(!t||t.size===0)return null;let n=new Map,r=this.stages?.pathTracer?._kernelManager?.kernels;if(r)for(let[e,t]of r)n.set(t.id,e);let i=[],a=-1;for(let[e,n]of t){let t=e.split(`:`);if(t.length!==4)continue;let r=Number(t[3].slice(1));Number.isFinite(r)&&(i.push({nodeId:Number(t[2]),f:r,ms:n}),r>a&&(a=r))}let o={},s=0,c=0;for(let e of i){if(e.f!==a)continue;s+=e.ms;let t=n.get(e.nodeId);t===void 0?c+=e.ms:o[t]=(o[t]??0)+e.ms}return{kernels:o,total:s,unattributed:c,frame:a}}getCanvas(){if(!this.renderer?.domElement)return null;let e=this.denoisingManager?.upscalerCanvas;return e&&e.style.display!==`none`?e:(this.stages.compositor&&this.pipeline?.context&&this.stages.compositor.render(this.pipeline.context),this.renderer.domElement)}screenshot({type:e=`image/png`,quality:t}={}){let n=this.getCanvas();return n?new Promise(r=>n.toBlob(r,e,t)):Promise.resolve(null)}getStatistics(){try{return this._sdf?.getStatistics?.()??null}catch{return null}}get pathTracerEnabled(){return this._pathTracerEnabled}set pathTracerEnabled(e){this._pathTracerEnabled=e,e||this.precompileRaster()}precompileRaster(){return!this.renderer||!this.meshScene?Promise.resolve():(this._rasterPrecompile??=this.renderer.compileAsync(this.meshScene,this.cameraManager.camera).catch(e=>$D.warn(`raster fallback precompile failed`,e)),this._rasterPrecompile)}get isLoading(){return this._loadingInProgress}isComplete(){return this.stages.pathTracer?.isComplete??!1}getFrameCount(){return this.stages.pathTracer?.frameCount||0}getConvergenceStats(){return this.stages.pathTracer?.getConvergenceStats?.()??null}get vram(){return this.stages.pathTracer?.vramTracker??null}getMemoryInfo(){return this.stages.pathTracer?.vramTracker?.measure()??{current:0,peak:0,byCategory:{}}}getHostMemoryInfo(){let e=this._sdf;return e?.memory?{preflight:e.memoryPreflight,...e.memory.report}:null}_ensureVRAMWiring(){if(this._vramWired)return;let e=this.stages.pathTracer?.vramTracker;if(!e)return;e.register(`stages`,()=>this._collectStageTextures());let t=()=>e.measure();this._addTrackedListener(this,`SceneRebuild`,t),this._addTrackedListener(this,`EnvironmentLoaded`,t),this._addTrackedListener(this,`resolution_changed`,t),this._vramWired=!0}_collectStageTextures(){let e=[],t=this.stages||{},n=t.pathTracer;for(let r in t){let i=t[r];if(!(!i||i===n||typeof i!=`object`))for(let t in i){let n=i[t];n&&(n.isTexture||n.isRenderTarget)&&e.push(n)}}return e}getSceneMinY(){if(!this.meshScene)return 0;let e=new r.Box3().setFromObject(this.meshScene);return Number.isFinite(e.min.y)?e.min.y:0}getMaterialProperty(e,t){return this.stages.pathTracer?.materialData.getMaterialProperty(e,t)}getMaterialPropertySource(e,t){return this.stages.pathTracer?.materialData.getMaterialPropertySource(e,t)}setMaterialProperty(e,t,n){if(this._sdf?.spilled&&$r.has(t)){this.ensureSceneResident().then(()=>this.setMaterialProperty(e,t,n));return}this.stages.pathTracer?.materialData.updateMaterialProperty(e,t,n),[`emissive`,`emissiveIntensity`].includes(t)&&this._sdf&&this._uploadEmissivePayload(this._sdf.updateMaterialEmissive(e,t,n)),this.reset()}_uploadEmissivePayload(e){!e||!this.stages.pathTracer||(this.stages.pathTracer.setEmissiveTriangleData(e.rawData,e.emissiveCount,e.totalPower,e.bitTrailMap),e.lightBVHNodeData&&this.stages.pathTracer.setLightBVHData(e.lightBVHNodeData,e.lightBVHNodeCount))}_refreshEmissiveForVisibility(){let e=this._sdf?.instanceTable;if(!e)return;let t=new Set;for(let n=0;n<e.count;n++)e.isSet[n]&&!e.visible[n]&&t.add(e.sourceMesh[n]);this._uploadEmissivePayload(this._sdf.rebuildEmissiveForVisibility(t))}setEmissiveTriangleSampling(e){this._emissiveSamplingUserSet=!0,this.settings.set(`enableEmissiveTriangleSampling`,e)}hasEmissiveGeometry(){return(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0}setMeshVisibility(e,t){this.stages.pathTracer?.updateMeshVisibility(e,t),this._refreshEmissiveForVisibility(),this.reset()}updateAllMeshVisibility(){this.stages.pathTracer?.updateAllMeshVisibility(),this._refreshEmissiveForVisibility(),this.reset()}getScene(){return this.meshScene||this.scene}setMeshVisibilityByUuid(e,t){let n=this.getScene()?.getObjectByProperty(`uuid`,e);if(!n)return null;let r=typeof t==`function`?!!t(n.visible):!!t;return n.visible=r,this.updateAllMeshVisibility(),r}setTextureTransform(e,t,n){this.stages.pathTracer?.materialData.updateTextureTransform(e,t,n),this.reset()}async _readDisplaySource(e,t,n){let r=this.pipeline?.context,i=r&&this.stages.compositor?.resolveLightTexture(r);return!i||i===e.texture?await this.renderer.readRenderTargetPixelsAsync(e,0,0,t,n,0):(this._textureReadback??=new jb(this.renderer),await this._textureReadback.read(i,t,n))}async setTextureColorSpace(e,n){if(!e?.isTexture)throw Error(`setTextureColorSpace wants a three.js texture`);let r=e.userData??={};r.__rayzeeOriginalColorSpace===void 0&&(r.__rayzeeOriginalColorSpace=e.colorSpace);let i=r.__rayzeeOriginalColorSpace;if(delete r.ocioColorSpace,delete r.__rayzeeColorSpaceChoice,n==null)e.colorSpace=i,delete r.__rayzeeOriginalColorSpace;else if(n===`srgb`||n===`linear`)e.colorSpace=n===`srgb`?t.SRGBColorSpace:t.LinearSRGBColorSpace,r.__rayzeeColorSpaceChoice=n;else{if(!this.color?.hasConfig)throw Error(`"${n}" needs a colour config loaded`);r.ocioColorSpace=n,e.colorSpace=t.SRGBColorSpace}e.needsUpdate=!0,this.stages.pathTracer?.sdfs&&await this.rebuildMaterials()}async loadColorConfig(e={}){await this._leaveColorWorkingSpace();let t=cl(this.renderer?.toneMapping),n=await this.color.loadConfig(e);return this.color.workingSpaceAdopted&&await this.applyColorWorkingSpace(),(!(t?.source===`ocio`&&cl(this.renderer?.toneMapping)===t)||this.color.workingSpaceAdopted)&&this.reset(),n}async unloadColorConfig(){await this._leaveColorWorkingSpace(),this.color.unloadConfig(),this.reset()}async _leaveColorWorkingSpace(){this.color?.workingSpaceAdopted&&(this.color.setWorkingSpace(null),await this.applyColorWorkingSpace())}async applyColorWorkingSpace(){let e=this.environmentManager?.getEnvironmentTexture?.(),t=!1;if(e&&this.color?.hasConfig)try{t=this.color.convertTexturePixels(e)}catch(e){$D.warn(`environment colour conversion failed: ${e.message}`)}this.stages.pathTracer?.sdfs&&(await this.rebuildMaterials(),this._uploadEmissivePayload(this._sdf?.rebuildEmissiveColors?.()??null)),t&&await this.environmentManager?.buildEnvironmentCDF?.(),e?._isPhysicalSky&&await this.environmentManager.generateProceduralSkyTexture(),this.environmentManager?.refreshSun?.(),this.reset()}async rebuildMaterials(e){await this.ensureSceneResident(),await this.stages.pathTracer?.rebuildMaterials(e||this.meshScene),this.reset()}async _initRenderer(){if(we(e=>this.dispatchEvent(e)),!navigator.gpu)throw Error(`WebGPU is not supported in this browser`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`Failed to get WebGPU adapter`);this.adapterInfo=nO(e),this.adapterInfo.isSoftware&&(this._issues.warn(Y.ADAPTER_SOFTWARE,`software GPU adapter "${this.adapterInfo.description||this.adapterInfo.vendor}" — renders are correct but orders of magnitude slower than hardware`,{...this.adapterInfo}),$D.warn(`software GPU adapter — check app.adapterInfo.isSoftware. ${this.adapterInfo.description}`));let n=e.limits,r={maxColorAttachmentBytesPerSample:128};for(let e of[`maxBufferSize`,`maxStorageBufferBindingSize`,`maxSampledTexturesPerShaderStage`,`maxStorageTexturesPerShaderStage`,`maxTextureArrayLayers`,`maxTextureDimension2D`,`maxComputeInvocationsPerWorkgroup`,`maxComputeWorkgroupStorageSize`,`maxComputeWorkgroupSizeX`,`maxComputeWorkgroupSizeY`,`maxComputeWorkgroupSizeZ`]){let t=n[e];t!==void 0&&(r[e]=t)}if(r.maxStorageBuffersPerShaderStage=Math.min(n.maxStorageBuffersPerShaderStage,10),this.renderer=new t.WebGPURenderer({canvas:this.canvas,alpha:!0,powerPreference:`high-performance`,requiredLimits:r}),await this.renderer.init(),!this.renderer.backend?.isWebGPUBackend)throw Error(`WebGPU backend unavailable — three.js fell back to WebGL2, which cannot run the path tracer's compute kernels. Check GPU process flags and driver support.`);let a=this.renderer.backend?.device;a?.lost&&(this._gpuDevice=a,this._deviceLostHolder={app:this},eO(a,this._deviceLostHolder),a.onuncapturederror=e=>$D.error(`WebGPU uncaptured error:`,e.error)),t.RectAreaLightNode.setLTC(i.RectAreaLightTexturesLib.init()),this.renderer.outputColorSpace=t.SRGBColorSpace,this.renderer.toneMapping=this._profile.toneMapping,this.renderer.toneMappingExposure=1,this.renderer.setPixelRatio(1),this.color.attachRenderer(this.renderer)}_initCameraManager(){this.cameraManager=new bT(this.canvas),this.timeline=new ET({cameraManager:this.cameraManager,onReset:()=>this.reset()})}_initScenes(){this.scene=new r.Scene,this.meshScene=new r.Scene,this._sceneHelpers=new M}_initAssetPipeline(){this._sdf=new dg({issues:this._issues,...this._maxSceneBytes===void 0?{}:{maxSceneBytes:this._maxSceneBytes}}),this.assetLoader=new eT(this.meshScene,this.cameraManager.camera,this.cameraManager.controls,{issues:this._issues,profile:this._profile}),this.assetLoader.setRenderer(this.renderer),this.assetLoader.createFloorPlane();let e=()=>{this.needsReset=!0,this.stages.pathTracer?.enterInteractionMode(),this.wake()};this._addTrackedListener(this.cameraManager.controls,`change`,e),this._addTrackedListener(this.cameraManager.walkControls,`change`,e),this._addTrackedListener(this.cameraManager.walkControls,`start`,()=>this.wake())}_initPipeline(){this._createStages();let{clientWidth:e,clientHeight:t}=this.canvas;this.pipeline=new Ob(this.renderer,e||1,t||1,{issues:this._issues}),this.pipeline.addStage(this.stages.pathTracer),this.pipeline.addStage(this.stages.normalDepth),this.pipeline.addStage(this.stages.motionVector),this.pipeline.addStage(this.stages.nrd),this.pipeline.addStage(this.stages.asvgf),this.pipeline.addStage(this.stages.variance),this.pipeline.addStage(this.stages.bilateralFilter),this.pipeline.addStage(this.stages.edgeFilter),this.pipeline.addStage(this.stages.autoExposure),this.pipeline.addStage(this.stages.compositor);let n=this.canvas.clientWidth||1,r=this.canvas.clientHeight||1;this._displayWidth=n,this._displayHeight=r,this.pipeline.setSize(n,r),this.pipeline.eventBus.on(`pathtracer:interactionStart`,()=>this._requestRenderScale(this._interactionRenderScale())),this.pipeline.eventBus.on(`pathtracer:interactionEnd`,()=>this._applyRenderScale(1))}async _initManagers(){this.interactionManager=new Ib({scene:this.meshScene,camera:this.cameraManager.camera,canvas:this.canvas,assetLoader:this.assetLoader,pathTracer:null,floorPlane:this.assetLoader.floorPlane}),this.interactionManager.wireAppEvents(this),this.cameraManager.setInteractionManager(this.interactionManager),this.lightManager=new kT(this.scene,this._sceneHelpers,this.stages.pathTracer,{onReset:()=>this.reset(),onLightRemoved:e=>{this.interactionManager?.selectedObject===e&&this.interactionManager.deselect()}}),this.goboManager=new AT(this.stages.pathTracer,{onReset:()=>this.reset()}),this.iesManager=new VT(this.stages.pathTracer,{onReset:()=>this.reset()}),this._setupDenoisingManager(),await this._setupOverlayManager(),this.transformManager=new LD({camera:this.cameraManager.camera,canvas:this.canvas,orbitControls:this.cameraManager.controls,app:this}),this.overlayManager.register(`transform`,new RD(this.transformManager)),this.interactionManager.setDependencies({overlayManager:this.overlayManager,transformManager:this.transformManager,appDispatch:e=>this.dispatchEvent(e),orbitControls:this.cameraManager.controls,helperScene:this._sceneHelpers.scene}),this.denoisingManager.setOverlayManager(this.overlayManager),this.denoisingManager.setResetCallback(()=>this.reset()),this.denoisingManager.setPostProcessRefreshCallback(()=>this.requestPostProcessRefresh()),this.denoisingManager.setDisplayRefreshCallback(()=>this.refreshFrame()),this.denoisingManager.setSettings(this.settings),this.environmentManager=this.stages.pathTracer.environment,this.environmentManager.callbacks.onAutoExposureReset=()=>this.pipeline.eventBus.emit(`autoexposure:resetHistory`),this.environmentManager.callbacks.onReset=()=>this.reset()}_wireEvents(){this._addTrackedListener(this.cameraManager,`CameraSwitched`,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,B.AUTO_FOCUS_UPDATED,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,B.ORTHO_HEIGHT_UPDATED,e=>this.dispatchEvent(e)),this._addTrackedListener(this.timeline,B.TIMELINE_CHANGED,e=>this.dispatchEvent(e)),this._forwardEvents(this.denoisingManager,[B.DENOISING_START,B.DENOISING_END,B.UPSCALING_START,B.UPSCALING_PROGRESS,B.UPSCALING_END,`resolution_changed`]),this._setupAutoExposureListener(),this.animationManager.wakeCallback=()=>this.wake(),this.animationManager.applyPoseCallback=e=>this._applyAnimationPose(e),this._forwardEvents(this.animationManager,[B.ANIMATION_STARTED,B.ANIMATION_PAUSED,B.ANIMATION_STOPPED]),this._addTrackedListener(this.animationManager,B.ANIMATION_PAUSED,()=>{this._animRefitInFlight=!1,this._refreshMovedEmitters()}),this._addTrackedListener(this.animationManager,B.ANIMATION_STOPPED,()=>{this._animRefitInFlight=!1}),this.cameraManager.initCallbacks({onResize:()=>this.onResize(),onReset:()=>this.reset(),getSettings:e=>this.settings.get(e),applySettings:e=>this.settings.setMany(e,{silent:!0,reset:!1})}),this.cameraManager.initAutoFocus({assetLoader:this.assetLoader,pathTracer:this.stages.pathTracer,settings:this.settings,softReset:()=>this.reset(!0),hardReset:()=>this.reset()}),this.settings.bind({stages:this.stages,renderer:this.renderer,resetCallback:()=>this.reset(),reconcileCompletion:()=>this._reconcileCompletion(),denoisingManager:this.denoisingManager,onInteractionRenderScale:()=>{this.stages.pathTracer?.interactionMode&&this._requestRenderScale(this._interactionRenderScale())},onCameraProjection:e=>this.cameraManager.applyProjection(e)}),this.renderer.toneMappingExposure=this.settings.get(`exposure`)??1,this.onResize(),this.resizeHandler=()=>this.onResize(),this._autoResize&&this._addTrackedListener(window,`resize`,this.resizeHandler),this._onAssetLoaded=async e=>{if(!this._loadingInProgress&&!(this._applyingSceneMetadata&&e.texture)){if(e.model)this._clearAppendedModels(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()});else if(e.texture){let e=this.meshScene.environment;e&&this.stages.pathTracer&&await this.stages.pathTracer.environment.setEnvironmentMap(e),Te()}this.pauseRendering=!1,this.reset()}},this._addTrackedListener(this.assetLoader,`load`,this._onAssetLoaded),this._addTrackedListener(this.assetLoader,`modelProcessed`,e=>{let t=[this.cameraManager.camera,...e.cameras||[]];this.cameraManager.setCameras(t),this.timeline.clear(),this.interactionManager&&(this.interactionManager.floorPlane=this.assetLoader.floorPlane)})}_initAnimationAndTransforms(){let e=this.assetLoader?.animations||[];if(e.length>0){let t=this.sceneModel||this.meshScene;this.animationManager.init(this.meshScene,t,this._sdf.meshes,e),this.animationManager.onFinished=()=>{this._animRefitInFlight=!1,this._refreshMovedEmitters(),this.dispatchEvent({type:B.ANIMATION_FINISHED})}}this.transformManager?.setMeshData(this._sdf.meshes)}_createStages(){this.stages.pathTracer=new sy(this.renderer,this.scene,this.cameraManager.camera),this.stages.normalDepth=new cy(this.renderer,{pathTracer:this.stages.pathTracer}),this.stages.motionVector=new ly(this.renderer,this.cameraManager.camera,{pathTracer:this.stages.pathTracer}),this.stages.asvgf=new fy(this.renderer,{enabled:!1}),this.stages.nrd=new Xy(this.renderer,{enabled:!1,pathTracer:this.stages.pathTracer}),this.stages.variance=new $y(this.renderer,{enabled:!1}),this.stages.bilateralFilter=new tb(this.renderer,{enabled:!1}),this.stages.edgeFilter=new sb(this.renderer,{enabled:!1}),this.stages.autoExposure=new mb(this.renderer,{enabled:U.autoExposure??!1}),this.stages.compositor=new hb(this.renderer,{saturation:this.settings.get(`saturation`)??U.saturation,pathTracer:this.stages.pathTracer})}_setupDenoisingManager(){this.denoisingManager=new wD({renderer:this.renderer,mainCanvas:this.canvas,stages:{pathTracer:this.stages.pathTracer,normalDepth:this.stages.normalDepth,motionVector:this.stages.motionVector,asvgf:this.stages.asvgf,nrd:this.stages.nrd,variance:this.stages.variance,bilateralFilter:this.stages.bilateralFilter,edgeFilter:this.stages.edgeFilter,autoExposure:this.stages.autoExposure,compositor:this.stages.compositor},pipeline:this.pipeline,getExposure:()=>this.settings.get(`exposure`)??1,getSaturation:()=>this.settings.get(`saturation`)??1}),this.denoisingManager.setupDenoiser(),this.denoisingManager.setupUpscaler(),this.denoisingManager._syncGBufferStages();let e=this.canvas.clientWidth||1,t=this.canvas.clientHeight||1;this.denoisingManager.setRenderSize(e,t)}_reconcileCompletion(){let e=this.stages.pathTracer;if(!e)return;let t=this.completion.isLimitReached(e,this.settings.get(`renderLimitMode`),this.settings.get(`renderTimeLimit`));t&&!e.isComplete?e.isComplete=!0:!t&&e.isComplete&&(e.isComplete=!1,this.completion.resumeFromPause(),this.denoisingManager?.abort(this.canvas),this.dispatchEvent({type:B.RENDER_RESET}),this.wake())}_setupAutoExposureListener(){this.stages.autoExposure&&this.stages.autoExposure.on(`autoexposure:updated`,e=>{this.dispatchEvent({type:B.AUTO_EXPOSURE_UPDATED,exposure:e.exposure,luminance:e.luminance})})}_renderHelperOverlay(){this.scene.updateMatrixWorld(),this.overlayManager?.render()}async _setupOverlayManager(){this.overlayManager=new ND(this.cameraManager.camera),this.overlayManager.setupDefaultHelpers({helperScene:this._sceneHelpers,meshScene:this.meshScene,pipeline:this.pipeline,denoisingManager:this.denoisingManager,app:this,renderWidth:this.denoisingManager?._lastRenderWidth||this.canvas.clientWidth||1,renderHeight:this.denoisingManager?._lastRenderHeight||this.canvas.clientHeight||1}),await this.overlayManager.initViewRenderer({device:this.renderer.backend?.device,sizeSource:this.canvas}),this._container=this._container||this.canvas.parentNode||null,this.overlayManager.mount(this._container)}_syncControlsAfterLoad(){this.cameraManager.fitOrthographic(),this.cameraManager.controls.saveState(),this.cameraManager.controls.update(),this.cameraManager.walkControls.fitSpeed(this.assetLoader.getSceneScale())}_recalibrateControlLimits(){if(!this.meshScene||!this.cameraManager)return;let e=new r.Box3,t=new r.Box3;for(let n of this.meshScene.children)n.userData?.__rayzeeSceneObject&&(t.setFromObject(n),t.isEmpty()||e.union(t));if(e.isEmpty())return;let n=Math.max(e.max.x-e.min.x,e.max.y-e.min.y,e.max.z-e.min.z);if(!Number.isFinite(n)||n<=0)return;let{camera:i,controls:a}=this.cameraManager,o=i.fov*(Math.PI/180),s=Math.abs(n/Math.sin(o/2)/2);this.cameraManager.currentCameraIndex===0&&(i.near=n/100,i.far=n*100,i.updateProjectionMatrix());let c=i.position.distanceTo(a.target);a.minDistance=Math.min(n/1e3,c),a.maxDistance=Math.max(s*10,c*1.1),a.update()}_forwardEvents(e,t){if(e)for(let n of t)this._addTrackedListener(e,n,e=>this.dispatchEvent(e))}};async function iO(e){let t=await oO(e);try{return await aO(t,e)}finally{t.dispose()}}async function aO(e,{samples:t=64,colorSpace:n=`srgb`,allowEarlyRetire:r=!1,onProgress:i=void 0}={}){let a=await e.renderFrames(t,{onProgress:i,allowEarlyRetire:r});return{...await e.renderToBuffer({colorSpace:n}),samples:a,retiredBy:a<t?`converged`:`count`,issues:e.issues,adapter:e.adapterInfo}}async function oO({canvas:e,model:t=null,width:n=1920,height:r=1080,strict:i=!0,profile:a=`physical`,deterministic:o=!0,settings:s=null,storage:c=!1}={}){if(!e)throw Error(`openHeadless: a canvas is required`);let l=new rO(e,{autoResize:!1,strict:i,profile:a,storage:c});try{return l.setReservedRenderResolution(Math.max(n,r)),await l.init(),l.setCanvasSize(n,r),t&&await l.loadModel(t),s&&l.settings.setMany(s,{silent:!0}),o&&l.setDeterministicMode(!0),l}catch(e){throw l.dispose(),e}}V();var sO=class{constructor(e){this._app=e,this._cancelled=!1,this._rendering=!1}async renderAnimation(e={}){let{clipIndex:t=0,fps:n=30,speed:r=1,samplesPerFrame:i=Pt.maxSamples,enableOIDN:a=!0,timeline:o=null,startFrame:s=0,onFrame:c,onProgress:l,onComplete:u}=e,d=this._app,f=d.animationManager?.hasAnimations?d.animationManager.clips[t]:null;if(!f&&!o?.animates){console.warn(d.animationManager?.hasAnimations?`VideoRenderManager: Invalid clip index ${t}`:`VideoRenderManager: No animation clips or keyframes`),u?.(!1);return}let p=f?f.duration/(r||1):o.duration,m=e.totalFrames||Math.ceil(p*n),h=1/n;if(!(m>0)){console.warn(`VideoRenderManager: No frames to render`),u?.(!1);return}this._cancelled=!1,this._rendering=!0;let g=this._saveState({view:!!o});d.stopAnimation(),d.configureForMode(`production`),d.settings.setMany({maxSamples:i},{silent:!0}),d.stages.pathTracer?.updateCompletionThreshold?.(),d.cameraManager.controls&&(d.cameraManager.controls.enabled=!1);try{for(let e=Math.max(0,s);e<m&&!this._cancelled;e++){let n=e*h*r,i=f?d.animationManager.seekTo(n,t):null;if(o?.seek(e*h)&&(d.cameraManager.resetAutoFocus(),d.cameraManager.updateAutoFocus()),i?await d.refitBVH(i):d.reset(),d.stopAnimation(),await this._accumulateFrame(d),this._cancelled||(a&&d.denoisingManager?.finalDenoise&&await this._waitForDenoise(d),this._cancelled))break;let s=d.getCanvas();if(s&&c){let t=await createImageBitmap(s);await c(t,e,m),t.close()}let u={frame:e+1,totalFrames:m,percent:(e+1)/m*100};l?.(u),d.dispatchEvent({type:B.VIDEO_RENDER_PROGRESS,...u})}}catch(e){console.error(`VideoRenderManager: Render error:`,e),this._cancelled=!0}finally{this._restoreState(g),this._rendering=!1;let e=!this._cancelled;u?.(e),d.dispatchEvent({type:B.VIDEO_RENDER_COMPLETE,success:e})}}cancel(){this._cancelled=!0}get isRendering(){return this._rendering}async _accumulateFrame(e){let t=e.stages.pathTracer;if(t?.isReady)for(;!t.isComplete&&!this._cancelled;)e.cameraManager.camera.updateMatrixWorld(),e.pipeline.render(),t.frameCount%4==0&&(Ee({samples:De(t)}),await new Promise(e=>setTimeout(e,0)))}_waitForDenoise(e){return new Promise(t=>{let n,r=()=>{e.removeEventListener(B.DENOISING_END,i),clearTimeout(n)},i=()=>{r(),t()};n=setTimeout(()=>{console.warn(`VideoRenderManager: Denoise timed out, skipping`),r(),t()},3e4),e.addEventListener(B.DENOISING_END,i),e.denoisingManager.onRenderComplete({isStillComplete:()=>!this._cancelled,context:e.pipeline?.context})})}_saveState({view:e}){let t=this._app,n=t.settings.getEffective(),r=Object.keys(It(Pt));return e&&r.push(`focusDistance`),{view:e?t.cameraManager.captureView():null,settings:r.map(e=>[e,n[e]]),renderMode:t.stages.pathTracer?.renderMode?.value,controlsEnabled:t.cameraManager.controls?.enabled,oidnEnabled:t.denoisingManager?.finalDenoise,oidnQuality:t.denoisingManager?.oidnQuality,wasPlaying:t.animationManager?.isPlaying,pauseRendering:t.pauseRendering}}_restoreState(e){let t=this._app;for(let[n,r]of e.settings)r&&t.settings.set(n,r.value,{silent:!0,reset:!1,source:r.source});t.stages.pathTracer&&e.renderMode!==void 0&&t.stages.pathTracer?.setUniform(`renderMode`,parseInt(e.renderMode)),t.stages.pathTracer?.updateCompletionThreshold?.(),t.cameraManager.controls&&(t.cameraManager.controls.enabled=e.controlsEnabled??!0),t.denoisingManager?.denoiser&&(t.denoisingManager.applyOIDNEnabled(e.oidnEnabled??!1),e.oidnQuality&&t.denoisingManager.applyOIDNQuality(e.oidnQuality)),t.pauseRendering=e.pauseRendering??!1,e.view&&t.cameraManager.applyPose(e.view),t.denoisingManager?.setCadenceSuspended(!1),t.animationManager?.stop(),t.reset(),t.wake()}};V(),Js(),rn(),QE(),fD(),El(),e.AF_DEFAULTS=ot,e.ASVGF_QUALITY_PRESETS=$e,e.AUTO_FOCUS_MODES=G,e.AnimationManager=PD,e.BVH_LEAF_MARKERS=_t,e.CAMERA_PRESETS=at,e.CAMERA_RANGES=rt,e.CameraManager=bT,e.CameraTrack=wT,e.ColorManagement=ju,e.DEFAULT_LUT_SIZE=Vl,e.DEFAULT_MAX_EV=Bl,e.DEFAULT_MIN_EV=zl,e.DEFAULT_SUN_PATH=He,e.DEFAULT_TEXTURE_MATRIX=Nt,e.DEFAULT_WORKING_SPACE=Cu,e.DOWNLOAD_POLICY=bg,e.DenoisingManager=wD,e.DownloadCache=Og,e.ENGINE_AREAS=Zn,e.ENGINE_DEFAULTS=U,e.EngineEvents=B,e.EngineIssueError=bn,e.GoboManager=AT,e.IESManager=VT,e.INTERACTIVE_RENDER_CONFIG=Ft,e.ISSUE_CODES=Y,e.ISSUE_SEVERITY=yn,e.InteractionManager=Ib,e.IssueLog=xn,e.LOG_LEVELS=qt,e.LightManager=kT,e.Logger=tn,e.MATERIAL_DEFAULTS=q,e.MATERIAL_VALUE_SOURCE=Dr,e.MAX_RESERVABLE_RENDER_SIZE=Ze,e.MAX_SCENE_BYTES=Bm,e.MAX_TABLE_TRANSFORMS=yl,e.MEMORY_CONSTANTS=Lt,e.MemoryLedger=Gm,e.NRD_DEFAULTS=et,e.NRD_HIT_DIST_A=Je,e.NRD_HIT_DIST_B=Ye,e.NRD_PRESET_KEYS=tt,e.NRD_QUALITY_PRESETS=nt,e.OCIO_VIEW_BASE=vl,e.OverlayManager=ND,e.PRODUCTION_RENDER_CONFIG=Pt,e.PathTracerApp=rO,e.PipelineContext=gb,e.RENDER_PROFILES=We,e.RETOUCH_DEFAULTS=rD,e.RETOUCH_MAX_PIXELS=aD,e.RETOUCH_RANGES=oD,e.RenderPipeline=Ob,e.RenderSettings=Yb,e.RenderStage=xe,e.SAFE_SCENE_BYTES=zm,e.SCENE_STATE_VERSION=zD,e.SETTING_SOURCE=qb,e.SKY_PRESETS=it,e.SR_MAX_INPUT=qE,e.SR_SCALE=GE,e.STORAGE_KIND=Xn,e.StageExecutionMode=be,e.StorageManager=pr,e.TEXTURE_CONSTANTS=xt,e.TRIANGLE_DATA_LAYOUT=st,e.TimelineManager=ET,e.TransformManager=LD,e.VERSION=Hh,e.VIEW_TRANSFORMS=wl,e.VRAMTracker=Kg,e.VideoRenderManager=sO,e.acquireLock=Nn,e.addAllOcioViews=Ql,e.addOcioView=Zl,e.addViewTransform=fl,e.applyMatrixRGBA8=Bc,e.bakeLut=Al,e.bufferBytes=Wg,e.buildOcioView=Jl,e.buildToneMapWGSL=gl,e.cachedObjectURL=jg,e.canvasColorSpaceFor=Du,e.captureHeadless=aO,e.clearBindingAuditFindings=Cb,e.clearInputOverrides=pu,e.configureAssets=Gs,e.convertColor=Dc,e.convertEncodedRGBA8=Fc,e.convertPixelsF32=Oc,e.createLogger=Wt,e.dayOfYearForMonth=Ve,e.deriveAlphaMode=jr,e.describeAdapter=nO,e.displayCanvasFit=Ws,e.estimateSceneBytes=Um,e.extractMatrix=Vc,e.extractSceneMetadata=Gw,e.fetchFile=kg,e.fileIdentity=Wn,e.findNativeLinearSpace=Au,e.fmt=J,e.fromPortable=qr,e.getActiveColorManagement=Tu,e.getAssetConfig=Ks,e.getBindingAuditFindings=Sb,e.getRegistryVersion=ol,e.getRenderProfile=Ge,e.getViewTransform=cl,e.hasColorSpace=Uc,e.heldLockNames=Pn,e.identityKey=Gn,e.isColorManaged=Mu,e.isDataSpace=Hc,e.isDataTexture=yu,e.linearToSrgb=jc,e.listFileRules=gu,e.listInputOverrides=mu,e.listViewTransforms=ll,e.makeCpuSampler=Il,e.measureBakeError=Rl,e.nameFromUrl=wg,e.onRegistryChange=sl,e.openHeadless=oO,e.openStorage=Wb,e.openZip=Ix,e.parseSceneMetadata=Ww,e.probeAddressSpace=Wm,e.readZipDirectory=Nx,e.removeViewTransform=pl,e.renderHeadless=iO,e.renderUpscaled=HE,e.resolveInputSpace=vu,e.sameIdentity=Kn,e.setActiveColorManagement=Eu,e.setBindingAudit=xb,e.setInputOverride=fu,e.srgbToLinear=Ac,e.sunPosition=ze,e.textureBytes=Gg,e.textureInputSpace=Su,e.timeForSunElevation=Be,e.toPortable=Kr});
|