rayzee 7.28.2 → 7.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rayzee.es.js +3641 -3021
- package/dist/rayzee.umd.js +56 -56
- package/package.json +1 -1
- package/src/EngineDefaults.js +75 -0
- package/src/PathTracerApp.js +10 -1
- package/src/Processor/PackedRayBuffer.js +26 -5
- package/src/Processor/SceneProcessor.js +1 -1
- package/src/Processor/StorageTexturePool.js +8 -4
- package/src/Processor/TextureCreator.js +102 -5
- package/src/RenderSettings.js +4 -4
- package/src/Stages/Compositor.js +1 -0
- package/src/Stages/NRD.js +1395 -0
- package/src/Stages/NormalDepth.js +8 -4
- package/src/Stages/PathTracerStage.js +4 -0
- package/src/TSL/Common.js +8 -1
- package/src/TSL/FinalWriteKernel.js +9 -4
- package/src/TSL/GenerateKernel.js +1 -1
- package/src/TSL/ShadeKernel.js +14 -2
- package/src/index.js +5 -0
- package/src/managers/DenoisingManager.js +80 -21
package/dist/rayzee.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
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=t.WebGPUBackend.prototype.createNodeBuilder;t.WebGPUBackend.prototype.createNodeBuilder=function(e,t){let n=v.call(this,e,t);return Object.defineProperty(n,`allowGlobalVariables`,{get(){return this.material!==null},set(){},configurable:!0}),O(n),n};var y=4096;function b(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 x=t.WebGPUBackend.prototype.initTimestampQuery;t.WebGPUBackend.prototype.initTimestampQuery=function(e,t,n){let r=this.trackTimestamp&&!this.timestampQueryPool[e];if(x.call(this,e,t,n),r){let r=this.timestampQueryPool[e];if(r&&r.maxQueries<y&&n.timestampWrites){let i=r.constructor,a=new i(this.device,e,y);a.allocateQueriesForContext=b,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 S(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)=>S(i.apply(e,n),t):i}})}function C(e,t=null){let r=(0,n.struct)(e,t),i=new Set(Object.keys(e)),a=(...e)=>S(r(...e),i);return a.layout=r.layout,a.isStruct=!0,a.wrap=e=>S(e,i),a}var w=(0,n.workgroupArray)(`uint`,1).constructor,T=w.prototype.generate;w.prototype.generate=function(e){let t=T.call(this,e);if(this.isAtomicArray===!0){let n=e.scopedArrays&&e.scopedArrays.get(t);n&&(n.isAtomic=!0)}return t};function E(e,t){let r=(0,n.workgroupArray)(e,t);return r.isAtomicArray=!0,r}var D=!1;function O(e){if(D)return;let t=Object.getPrototypeOf(e);!t||typeof t.getScopedArrays!=`function`||(t.getScopedArrays=function(e){if(e!==`compute`)return;let t=[];for(let{name:e,scope:n,bufferType:r,bufferCount:i,isAtomic:a}of this.scopedArrays.values()){let o=this.getType(r),s=a===!0?`atomic< ${o} >`:o;t.push(`var<${n}> ${e}: array< ${s}, ${i} >;`)}return t.join(`
|
|
2
|
-
`)},D=!0)}var k=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}},A=(0,n.uniform)(0,`int`),j=A,M=new r.DataTexture(new Float32Array([.5,.5,.5,1]),1,1);M.type=r.FloatType,M.needsUpdate=!0;var N=new r.DataTexture(new Float32Array([.5,.5,0,1]),1,1);N.type=r.FloatType,N.needsUpdate=!0;var P=(0,n.texture)(M);P.setUpdateMatrix(!1);var F=(0,n.texture)(N);F.setUpdateMatrix(!1);var I=(0,n.float)(.7548776662466927),
|
|
2
|
+
`)},D=!0)}var k=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}},A=(0,n.uniform)(0,`int`),j=A,M=new r.DataTexture(new Float32Array([.5,.5,.5,1]),1,1);M.type=r.FloatType,M.needsUpdate=!0;var N=new r.DataTexture(new Float32Array([.5,.5,0,1]),1,1);N.type=r.FloatType,N.needsUpdate=!0;var P=(0,n.texture)(M);P.setUpdateMatrix(!1);var F=(0,n.texture)(N);F.setUpdateMatrix(!1);var I=(0,n.float)(.7548776662466927),ee=(0,n.float)(.5698402909980532),L=(0,n.wgslFn)(`
|
|
3
3
|
fn pcgHash( state: u32 ) -> u32 {
|
|
4
4
|
|
|
5
5
|
var s = state;
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
return s;
|
|
22
22
|
|
|
23
23
|
}
|
|
24
|
-
`),
|
|
24
|
+
`),R=e=>(e.assign(e.mul(1664525).add(1013904223)),(0,n.float)(e.shiftRight(8)).mul(1/16777216)),ne=e=>(e.assign(L({state:e})),(0,n.float)(e.shiftRight(8)).mul(1/16777216)),re=e=>{let t=R(e).mul(n.TWO_PI).toVar();return(0,n.vec2)((0,n.cos)(t),(0,n.sin)(t)).mul((0,n.sqrt)(R(e)))},z=4096,ie=(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(I).add(.5)).mul(128)),c=(0,n.int)((0,n.fract)(o.mul(ee).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))},ae=(e,t,r,i)=>{let a=ie(e,t,r,i),o=F.load(a).xy,s=(0,n.float)((0,n.uint)(i).shiftRight((0,n.uint)(6))),c=(0,n.fract)((0,n.vec2)(I,ee).mul(s));return(0,n.fract)(o.add(c))},oe=(0,n.wgslFn)(`
|
|
25
25
|
fn haltonScrambled( index: i32, base: i32, scramble: u32 ) -> f32 {
|
|
26
26
|
|
|
27
27
|
var result = 0.0f;
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
return result;
|
|
51
51
|
|
|
52
52
|
}
|
|
53
|
-
`),
|
|
53
|
+
`),se=(0,n.wgslFn)(`
|
|
54
54
|
fn owen_scramble( x: u32, seed: u32 ) -> u32 {
|
|
55
55
|
|
|
56
56
|
var v = reverseBits( x );
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
return reverseBits( v );
|
|
63
63
|
|
|
64
64
|
}
|
|
65
|
-
`),
|
|
65
|
+
`),ce=(0,n.wgslFn)(`
|
|
66
66
|
fn sobol2D( index: u32 ) -> vec2u {
|
|
67
67
|
|
|
68
68
|
let r0 = reverseBits( index );
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
return vec2u( r0, x );
|
|
78
78
|
|
|
79
79
|
}
|
|
80
|
-
`),
|
|
80
|
+
`),le=(0,n.wgslFn)(`
|
|
81
81
|
fn owen_scrambled_sobol( index: u32, dimension: u32, seed: u32 ) -> f32 {
|
|
82
82
|
|
|
83
83
|
let dimSeed = seed ^ ( dimension * 0x9e3779b9u + 0x6a09e667u );
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
return f32( owen_scramble( raw, dimSeed ) ) / 4294967296.0f;
|
|
88
88
|
|
|
89
89
|
}
|
|
90
|
-
`,[
|
|
90
|
+
`,[ce,se]),ue=(0,n.wgslFn)(`
|
|
91
91
|
fn owen_scrambled_sobol2D( index: u32, seed: u32 ) -> vec2f {
|
|
92
92
|
|
|
93
93
|
let shuffled = owen_scramble( index, seed ^ 0xa511e9b3u );
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
);
|
|
99
99
|
|
|
100
100
|
}
|
|
101
|
-
`,[
|
|
101
|
+
`,[ce,se]),de=(e,t,r,i,a,o,s,c)=>{let l=(0,n.select)(o.notEqual((0,n.int)(-1)),o,j),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(R(i)),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(R(i))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(R(i))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(R(i))})}).Else(()=>{u.x.assign(ne(i)),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(ne(i))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(ne(i))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(ne(i))})})}).ElseIf(l.equal((0,n.int)(1)),()=>{let i=L({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(oe({index:(0,n.int)(c),base:(0,n.int)(2),scramble:i})),(0,n.If)(a.greaterThan((0,n.int)(1)),()=>{u.y.assign(oe({index:(0,n.int)(c),base:(0,n.int)(3),scramble:i}))}),(0,n.If)(a.greaterThan((0,n.int)(2)),()=>{u.z.assign(oe({index:(0,n.int)(c),base:(0,n.int)(5),scramble:i}))}),(0,n.If)(a.greaterThan((0,n.int)(3)),()=>{u.w.assign(oe({index:(0,n.int)(c),base:(0,n.int)(7),scramble:i}))})}).Else(()=>{let i=L({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=ue({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=ue({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},fe=(e,t,r,i,a,o,s)=>de(e,t,r,i,(0,n.int)(2),a,o,s).xy,pe=(e,t,r,i,a,o)=>{let s=(0,n.vec2)(0).toVar();return(0,n.If)(j.equal((0,n.int)(0)),()=>{let e=ne(i).toVar(),t=ne(i).toVar();s.assign((0,n.vec2)(e,t))}).ElseIf(j.equal((0,n.int)(1)),()=>{let i=L({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)(oe({index:(0,n.int)(o),base:(0,n.int)(2),scramble:i}),oe({index:(0,n.int)(o),base:(0,n.int)(3),scramble:i})))}).Else(()=>{let i=L({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(ue({index:(0,n.uint)(o),seed:i}))}),s},B=(e,t,r,i,a,o)=>{let s=(0,n.float)(0).toVar();return(0,n.If)(j.equal((0,n.int)(0)),()=>{s.assign(ne(i))}).ElseIf(j.equal((0,n.int)(1)),()=>{let i=L({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(oe({index:(0,n.int)(o),base:(0,n.int)(2),scramble:i}))}).Else(()=>{let i=L({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.uint)(o),dimension:(0,n.uint)(0),seed:i}))}),s},me=(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(fe(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)(R(i).toVar(),R(i).toVar()).toVar();(0,n.If)(r.greaterThan((0,n.int)(4)),()=>{let r=ae(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},he=(0,n.wgslFn)(`
|
|
102
102
|
fn getDecorrelatedSeed( pixelCoord: vec2f, rayIndex: i32, frame: u32 ) -> u32 {
|
|
103
103
|
|
|
104
104
|
// Use multiple primes for better decorrelation
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
return seed;
|
|
114
114
|
|
|
115
115
|
}
|
|
116
|
-
`,[te,ee]),ye={ALWAYS:`always`,PER_CYCLE:`per_cycle`,PER_TILE:`per_tile`,CONDITIONAL:`conditional`},be=class{constructor(e,t={}){this.name=e,this.enabled=t.enabled!==!1,this.executionMode=t.executionMode||ye.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 ye.ALWAYS:return!0;case ye.PER_CYCLE:return t===0?!0:n===!0;case ye.PER_TILE:return!0;case ye.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)}},xe=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.wasAccumulationEnabled=!0,this.interactionQualitySettings={maxBounceCount:1,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.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.interactionQualitySettings[e])}),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=>{e===`dpr`?this.renderer.setPixelRatio(this.originalValues.dpr):this.material.uniforms[e]&&(this.material.uniforms[e].value=this.originalValues[e])}),this.interactionMode=!1,this.originalValues={},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=e[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}},R={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`,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`,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`},Se=new t.QuadMesh(null).geometry,Ce=null;function we(e){Ce=e}var Te=()=>Ce?.({type:R.LOADING_RESET}),z=e=>{Ce?.({type:R.LOADING_UPDATE,...e})},Ee=e=>{Ce?.({type:R.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),e.dispose(),e._canvasTarget=null;let t=Se._listeners?.dispose;t&&(t.length=0)}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=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:270,toneMapping:4,saturation:1.2}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1})});function Re(e=`viewer`){let t=Le[e];if(!t)throw Error(`unknown render profile "${e}" — expected one of ${Object.keys(Le).join(`, `)}`);return t}var B={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:Le.viewer.toneMapping,exposure:1,saturation:Le.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:Le.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:90,skySunElevation:20,skySunIntensity:15,skyRayleighDensity:.9,skyTurbidity:.8,skyMieAnisotropy:.76,skyPreset:`clearMorning`,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,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,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`,debugGbufferMaps:!1,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,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,autoExposure:!1,autoExposureKeyValue:.18,autoExposureMinExposure:.1,autoExposureMaxExposure:20,autoExposureAdaptSpeedBright:3,autoExposureAdaptSpeedDark:.5},ze=.01,Be=4096,V=2048;function Ve(e){return V=Math.max(256,Math.min(Be,Math.floor(e)||256)),V}var He={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}},Ue={fov:{min:10,max:90,default:B.fov},focusDistance:{min:.3,max:100,default:B.focusDistance},aperture:{options:[1.4,2,2.8,4,5.6,8,11,16],default:B.aperture},focalLength:{min:0,max:200,default:B.focalLength}},We={clearMorning:{name:`Clear Morning`,sunAzimuth:90,sunElevation:20,sunIntensity:15,rayleighDensity:.9,turbidity:.8},clearNoon:{name:`Clear Noon`,sunAzimuth:0,sunElevation:75,sunIntensity:20,rayleighDensity:1,turbidity:.3},overcast:{name:`Overcast`,sunAzimuth:0,sunElevation:45,sunIntensity:6,rayleighDensity:.6,turbidity:4},goldenHour:{name:`Golden Hour`,sunAzimuth:270,sunElevation:10,sunIntensity:19,rayleighDensity:.8,turbidity:1.2},sunset:{name:`Sunset`,sunAzimuth:270,sunElevation:2,sunIntensity:18,rayleighDensity:.7,turbidity:2},dusk:{name:`Dusk`,sunAzimuth:270,sunElevation:-8,sunIntensity:8,rayleighDensity:.5,turbidity:1.5}},Ge={portrait:{name:`Portrait`,description:`Shallow depth of field, background blur`,fov:45,focusDistance:1.5,aperture:1.4,focalLength:135,apertureScale:1.5},landscape:{name:`Landscape`,description:`Maximum depth of field, everything in focus`,fov:65,focusDistance:10,aperture:16,focalLength:24,apertureScale:.5},macro:{name:`Macro`,description:`Extreme close-up with thin focus plane`,fov:40,focusDistance:.3,aperture:2,focalLength:100,apertureScale:2},product:{name:`Product`,description:`Sharp detail with subtle background separation`,fov:50,focusDistance:.8,aperture:2.8,focalLength:85,apertureScale:1},architectural:{name:`Architectural`,description:`Wide view with deep focus`,fov:75,focusDistance:5,aperture:11,focalLength:16,apertureScale:.5},cinematic:{name:`Cinematic`,description:`Dramatic depth separation with anamorphic bokeh`,fov:35,focusDistance:3,aperture:1.4,focalLength:200,apertureScale:1.8,anamorphicRatio:1.5}},Ke={MANUAL:`manual`,AUTO:`auto`},qe={SMOOTHING_FACTOR:.15,RESET_THRESHOLD:.05,FALLBACK_DISTANCE:10,SNAP_THRESHOLD:.5},H={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},U={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}},Je=e=>Number.isFinite(e)&&e>0?e:0,Ye={TRIANGLE_LEAF:-1,BLAS_POINTER_LEAF:-2},Xe={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:128,MATERIAL_BUCKET_COUNT:4,BUCKET_LAYER_STRIDE:256};function Ze(e,t=Xe.MATERIAL_BUCKET_COUNT){let n=[];for(let r=t-1;r>=0;r--)n.push(Math.max(Xe.MIN_TEXTURE_WIDTH,Math.round(e/2**r)));return n}function Qe(e,t,n,r=Xe.MATERIAL_BUCKET_COUNT){let i=2**Math.ceil(Math.log2(Math.max(e||1,t||1))),a=Ze(n,r);for(let e=0;e<a.length;e++)if(i<=a[e])return e;return a.length-1}function $e(e,t){return e*Xe.BUCKET_LAYER_STRIDE+t}var et=[0,0,1,1,0,0,0,1],W={maxSamples:150,bounces:20,transmissiveBounces:8,maxSubsurfaceSteps:64,renderMode:1,enableAlphaShadows:!0,enableOIDN:!0,oidnQuality:`high`,interactionModeEnabled:!1,useAdaptiveSampling:!0,noiseThreshold:.02,adaptiveStopFraction:.94,usePixelFreeze:!0},tt={maxSamples:B.maxSamples,bounces:B.bounces,renderMode:B.renderMode,enableAlphaShadows:B.enableAlphaShadows,transmissiveBounces:B.transmissiveBounces,maxSubsurfaceSteps:B.maxSubsurfaceSteps,enableOIDN:!1,oidnQuality:`fast`,interactionModeEnabled:!0,useAdaptiveSampling:!0,noiseThreshold:.1,usePixelFreeze:!0},nt={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},rt={silent:0,error:1,warn:2,info:3,debug:4},it=`info`,at=`rayzeeLogLevel`,ot=`rayzeeLogNamespaces`,st=`color:#7c8494`,ct=`color:inherit`,lt=null,ut=null;function dt(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function ft(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function pt(){if(lt!==null)return lt;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in rt?(lt=rt[e],lt):(lt=rt[dt(at)]??rt[it],lt)}function mt(){if(ut!==null)return ut;let e=globalThis.__RAYZEE_LOG_NS__??dt(ot);return ut=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],ut}function ht(e,t){if(t<rt.debug)return!0;let n=mt();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function gt(e,t,n){if(e>pt()||!ht(t,e))return;let r=e===rt.error?console.error:e===rt.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,st,ct,...n.slice(1)):r(`%c${i}`,st,...n)}var G={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`)=>`${G.n(e)} ${Number(e)===1?t:n}`,list:e=>e.filter(Boolean).join(` · `)},_t={levels:rt,setLevel(e){return e in rt?(globalThis.__RAYZEE_LOG_LEVEL__=e,lt=rt[e],ft(at,e===it?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(rt).join(`, `)}`),this.getLevel())},getLevel(){let e=pt();return Object.keys(rt).find(t=>rt[t]===e)},isEnabled(e){return(rt[e]??rt.debug)<=pt()},only(...e){let t=e.flat().filter(Boolean);return ut=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),ft(ot,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return lt=null,ut=null,this.getLevel()}};function K(e){return{namespace:e,error:(...t)=>gt(rt.error,e,t),warn:(...t)=>gt(rt.warn,e,t),info:(...t)=>gt(rt.info,e,t),debug:(...t)=>gt(rt.debug,e,t),isEnabled:e=>_t.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){gt(rt.info,e,[t]),r.forEach(t=>gt(rt.debug,e,[t]));return}rt.info>pt()||((pt()>=rt.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,st,ct),r.forEach(e=>console.log(e)),console.groupEnd())}}}var vt=new Set;function yt(e,t,...n){vt.has(t)||(vt.add(t),e.warn(...n))}function bt(){return _t.getLevel()}var xt=K(`gpu`);function St(){let e=new t.StorageTexture(V,V);return e.type=r.FloatType,e.format=r.RGBAFormat,e.minFilter=r.LinearFilter,e.magFilter=r.LinearFilter,e}var Ct=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=St(),this.writeNormalDepth=St(),this.writeAlbedo=St(),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`,xt.debug(`storage texture pool ${G.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}},wt={cameraViewMatrix:`ptCameraViewMatrix`,cameraProjectionMatrix:`ptCameraProjectionMatrix`},Tt=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`,B.bounces,`int`),i(`maxSamples`,B.maxSamples,`int`),i(`transmissiveBounces`,B.transmissiveBounces,`int`),i(`maxSubsurfaceSteps`,B.maxSubsurfaceSteps,`int`),i(`maxTransparentBounces`,B.maxTransparentBounces,`int`),i(`visMode`,B.debugMode,`int`),i(`debugVisScale`,B.debugVisScale,`float`),a(`useAdaptiveSampling`,B.useAdaptiveSampling),i(`noiseThreshold`,B.noiseThreshold,`float`),i(`adaptiveMinSamples`,B.adaptiveMinSamples,`int`),i(`adaptiveStopFraction`,B.adaptiveStopFraction,`float`),a(`usePixelFreeze`,B.usePixelFreeze),i(`pixelFreezeThreshold`,B.pixelFreezeThreshold,`float`),i(`pixelFreezeStability`,B.pixelFreezeStability,`int`),a(`convergenceOverlay`,B.convergenceOverlay),a(`enableAccumulation`,!0),i(`accumulationAlpha`,0,`float`),a(`cameraIsMoving`,!1),a(`hasPreviousAccumulated`,!1),i(`auxAccumulationAlpha`,1,`float`),a(`hasPreviousAux`,!1),i(`environmentIntensity`,B.environmentIntensity,`float`),i(`backgroundIntensity`,B.backgroundIntensity,`float`),i(`backgroundColor`,new r.Color(0,0,0),`color`),i(`backgroundBlurriness`,B.backgroundBlurriness,`float`),i(`backgroundBlurSamples`,B.backgroundBlurSamples,`int`),a(`showBackground`,B.showBackground),a(`transparentBackground`,B.transparentBackground),a(`enableEnvironment`,B.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`,B.groundProjectionEnabled),i(`groundProjectionRadius`,B.groundProjectionRadius,`float`),i(`groundProjectionHeight`,B.groundProjectionHeight,`float`),i(`groundProjectionLevel`,B.groundProjectionLevel,`float`),a(`enableGroundCatcher`,B.enableGroundCatcher),i(`groundCatcherHeight`,B.groundCatcherHeight,`float`),i(`sunDirection`,new r.Vector3(0,1,0),`vec3`),i(`sunAngularSize`,.0087,`float`),a(`hasSun`,!1),i(`globalIlluminationIntensity`,B.globalIlluminationIntensity,`float`),i(`exposure`,B.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`,+(B.cameraProjection===`equirectangular`),`int`),i(`panoLonRange`,o(B.panoramaLonRange),`vec2`),i(`panoLatRange`,o(B.panoramaLatRange),`vec2`),a(`panoLevelHorizon`,B.panoramaLevelHorizon),a(`enableDOF`,B.enableDOF),i(`focusDistance`,B.focusDistance,`float`),i(`focalLength`,B.focalLength,`float`),i(`aperture`,B.aperture,`float`),i(`apertureScale`,1,`float`),i(`anamorphicRatio`,B.anamorphicRatio??1,`float`),i(`sceneScale`,1,`float`),this._uniforms.set(`samplingTechnique`,A),A.value=B.samplingTechnique,i(`fireflyThreshold`,B.fireflyThreshold,`float`),a(`enableEmissiveTriangleSampling`,B.enableEmissiveTriangleSampling),i(`emissiveBoost`,B.emissiveBoost,`float`),i(`emissiveTriangleCount`,0,`int`),i(`emissiveTotalPower`,0,`float`),i(`lightBVHNodeCount`,0,`int`),i(`emissiveVec4Offset`,0,`int`),i(`reverseMapVec4Offset`,0,`int`),i(`renderMode`,B.renderMode,`int`),a(`enableAlphaShadows`,B.enableAlphaShadows),i(`resolution`,new r.Vector2(e,t),`vec2`)}_nameAll(){for(let[e,t]of this._uniforms)t.name=wt[e]||e}dispose(){this._disposed||(this._disposed=!0,this._uniforms.clear(),this._booleans.clear(),this._arrayWarned.clear(),this._lightBuffers={})}},Et=K(`material`),Dt=U.SLOTS_PER_MATERIAL,Ot=H.UV_C_MAT_OFFSET+2,kt=H.NORMAL_C_OFFSET+3,At=H.NORMAL_A_OFFSET+3,jt=new Set([`transmission`,`transparent`,`opacity`,`alphaMode`]),Mt={ior:U.IOR,transmission:U.TRANSMISSION,thickness:U.THICKNESS,emissiveIntensity:U.EMISSIVE_INTENSITY,attenuationDistance:U.ATTENUATION_DISTANCE,opacity:U.OPACITY,alphaTest:U.ALPHA_TEST,metalness:U.METALNESS,roughness:U.ROUGHNESS,clearcoat:U.CLEARCOAT,clearcoatRoughness:U.CLEARCOAT_ROUGHNESS,dispersion:U.DISPERSION,sheen:U.SHEEN,sheenRoughness:U.SHEEN_ROUGHNESS,specularIntensity:U.SPECULAR_INTENSITY,iridescence:U.IRIDESCENCE,iridescenceIOR:U.IRIDESCENCE_IOR,subsurface:U.SUBSURFACE,subsurfaceRadiusScale:U.SUBSURFACE_RADIUS_SCALE,subsurfaceAnisotropy:U.SUBSURFACE_ANISOTROPY,anisotropy:U.ANISOTROPY,anisotropyRotation:U.ANISOTROPY_ROTATION},Nt=class{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={}}setMaterialData(e){if(!e)return;let r=e.length/4;this.materialStorageNode?(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode.value=this.materialStorageAttr,this.materialStorageNode.bufferCount=r):(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode=(0,n.storage)(this.materialStorageAttr,`vec4`,r).toReadOnly()),this.materialCount=Math.floor(r/Dt),Et.debug(`${G.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=Mt[t];if(r===void 0)return;let i=e*U.FLOATS_PER_MATERIAL+r;return i<n.length?n[i]:void 0}updateMaterialProperty(e,t,n){if(!this.materialStorageAttr){Et.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*U.FLOATS_PER_MATERIAL;switch(t){case`color`:n.r===void 0?Array.isArray(n)&&(r[i+U.COLOR]=n[0],r[i+U.COLOR+1]=n[1],r[i+U.COLOR+2]=n[2]):(r[i+U.COLOR]=n.r,r[i+U.COLOR+1]=n.g,r[i+U.COLOR+2]=n.b);break;case`metalness`:r[i+U.METALNESS]=n;break;case`emissive`:n.r===void 0?Array.isArray(n)&&(r[i+U.EMISSIVE]=n[0],r[i+U.EMISSIVE+1]=n[1],r[i+U.EMISSIVE+2]=n[2]):(r[i+U.EMISSIVE]=n.r,r[i+U.EMISSIVE+1]=n.g,r[i+U.EMISSIVE+2]=n.b);break;case`roughness`:r[i+U.ROUGHNESS]=n;break;case`ior`:r[i+U.IOR]=n;break;case`transmission`:r[i+U.TRANSMISSION]=n;break;case`thickness`:r[i+U.THICKNESS]=n;break;case`emissiveIntensity`:r[i+U.EMISSIVE_INTENSITY]=n;break;case`attenuationColor`:n.r===void 0?Array.isArray(n)&&(r[i+U.ATTENUATION_COLOR]=n[0],r[i+U.ATTENUATION_COLOR+1]=n[1],r[i+U.ATTENUATION_COLOR+2]=n[2]):(r[i+U.ATTENUATION_COLOR]=n.r,r[i+U.ATTENUATION_COLOR+1]=n.g,r[i+U.ATTENUATION_COLOR+2]=n.b);break;case`attenuationDistance`:r[i+U.ATTENUATION_DISTANCE]=Je(n);break;case`dispersion`:r[i+U.DISPERSION]=n;break;case`sheen`:r[i+U.SHEEN]=n;break;case`sheenRoughness`:r[i+U.SHEEN_ROUGHNESS]=n;break;case`sheenColor`:n.r===void 0?Array.isArray(n)&&(r[i+U.SHEEN_COLOR]=n[0],r[i+U.SHEEN_COLOR+1]=n[1],r[i+U.SHEEN_COLOR+2]=n[2]):(r[i+U.SHEEN_COLOR]=n.r,r[i+U.SHEEN_COLOR+1]=n.g,r[i+U.SHEEN_COLOR+2]=n.b);break;case`specularIntensity`:r[i+U.SPECULAR_INTENSITY]=n;break;case`specularColor`:n.r===void 0?Array.isArray(n)&&(r[i+U.SPECULAR_COLOR]=n[0],r[i+U.SPECULAR_COLOR+1]=n[1],r[i+U.SPECULAR_COLOR+2]=n[2]):(r[i+U.SPECULAR_COLOR]=n.r,r[i+U.SPECULAR_COLOR+1]=n.g,r[i+U.SPECULAR_COLOR+2]=n.b);break;case`iridescence`:r[i+U.IRIDESCENCE]=n;break;case`iridescenceIOR`:r[i+U.IRIDESCENCE_IOR]=n;break;case`iridescenceThicknessRange`:Array.isArray(n)&&(r[i+U.IRIDESCENCE_THICKNESS_RANGE]=n[0],r[i+U.IRIDESCENCE_THICKNESS_RANGE+1]=n[1]);break;case`clearcoat`:r[i+U.CLEARCOAT]=n;break;case`clearcoatRoughness`:r[i+U.CLEARCOAT_ROUGHNESS]=n;break;case`opacity`:r[i+U.OPACITY]=n;break;case`side`:r[i+U.SIDE]=n,this._patchTriangleSideForMaterial(e,n);break;case`transparent`:r[i+U.TRANSPARENT]=n;break;case`alphaTest`:r[i+U.ALPHA_TEST]=n;break;case`alphaMode`:r[i+U.ALPHA_MODE]=n;break;case`depthWrite`:r[i+U.DEPTH_WRITE]=n;break;case`normalScale`:n.x===void 0?typeof n==`number`&&(r[i+U.NORMAL_SCALE]=n,r[i+U.NORMAL_SCALE+1]=n):(r[i+U.NORMAL_SCALE]=n.x,r[i+U.NORMAL_SCALE+1]=n.y);break;case`bumpScale`:r[i+U.BUMP_SCALE]=n;break;case`displacementScale`:r[i+U.DISPLACEMENT_SCALE]=n;break;case`subsurface`:r[i+U.SUBSURFACE]=n;break;case`subsurfaceRadiusScale`:r[i+U.SUBSURFACE_RADIUS_SCALE]=n;break;case`subsurfaceAnisotropy`:r[i+U.SUBSURFACE_ANISOTROPY]=n;break;case`anisotropy`:r[i+U.ANISOTROPY]=n;break;case`anisotropyRotation`:r[i+U.ANISOTROPY_ROTATION]=n;break;case`subsurfaceColor`:n.r===void 0?Array.isArray(n)&&(r[i+U.SUBSURFACE_COLOR]=n[0],r[i+U.SUBSURFACE_COLOR+1]=n[1],r[i+U.SUBSURFACE_COLOR+2]=n[2]):(r[i+U.SUBSURFACE_COLOR]=n.r,r[i+U.SUBSURFACE_COLOR+1]=n.g,r[i+U.SUBSURFACE_COLOR+2]=n.b);break;case`subsurfaceRadius`:Array.isArray(n)?(r[i+U.SUBSURFACE_RADIUS]=n[0],r[i+U.SUBSURFACE_RADIUS+1]=n[1],r[i+U.SUBSURFACE_RADIUS+2]=n[2]):n.x!==void 0&&(r[i+U.SUBSURFACE_RADIUS]=n.x,r[i+U.SUBSURFACE_RADIUS+1]=n.y,r[i+U.SUBSURFACE_RADIUS+2]=n.z);break;default:Et.warn(`unknown material property: ${t}`);return}this.materialStorageAttr.needsUpdate=!0,jt.has(t)&&this._recomputeOpaqueBlockerForMaterial(e),this._notifyReset()}updateMaterialDataFromObject(e,t){if(!this.materialStorageAttr){Et.warn(`material storage buffer not available`);return}let n=this.materialStorageAttr.array,r=e*U.FLOATS_PER_MATERIAL;t.color&&(n[r+U.COLOR]=t.color.r??t.color[0]??1,n[r+U.COLOR+1]=t.color.g??t.color[1]??1,n[r+U.COLOR+2]=t.color.b??t.color[2]??1),n[r+U.METALNESS]=t.metalness??0,t.emissive&&(n[r+U.EMISSIVE]=t.emissive.r??t.emissive[0]??0,n[r+U.EMISSIVE+1]=t.emissive.g??t.emissive[1]??0,n[r+U.EMISSIVE+2]=t.emissive.b??t.emissive[2]??0),n[r+U.ROUGHNESS]=t.roughness??1,n[r+U.IOR]=t.ior??1.5,n[r+U.TRANSMISSION]=t.transmission??0,n[r+U.THICKNESS]=t.thickness??.1,n[r+U.EMISSIVE_INTENSITY]=t.emissiveIntensity??1,t.attenuationColor&&(n[r+U.ATTENUATION_COLOR]=t.attenuationColor.r??t.attenuationColor[0]??1,n[r+U.ATTENUATION_COLOR+1]=t.attenuationColor.g??t.attenuationColor[1]??1,n[r+U.ATTENUATION_COLOR+2]=t.attenuationColor.b??t.attenuationColor[2]??1),n[r+U.ATTENUATION_DISTANCE]=Je(t.attenuationDistance),n[r+U.DISPERSION]=t.dispersion??0,n[r+U.VISIBLE]=1,n[r+U.SHEEN]=t.sheen??0,n[r+U.SHEEN_ROUGHNESS]=t.sheenRoughness??1,t.sheenColor&&(n[r+U.SHEEN_COLOR]=t.sheenColor.r??t.sheenColor[0]??0,n[r+U.SHEEN_COLOR+1]=t.sheenColor.g??t.sheenColor[1]??0,n[r+U.SHEEN_COLOR+2]=t.sheenColor.b??t.sheenColor[2]??0),n[r+U.SPECULAR_INTENSITY]=t.specularIntensity??1,t.specularColor&&(n[r+U.SPECULAR_COLOR]=t.specularColor.r??t.specularColor[0]??1,n[r+U.SPECULAR_COLOR+1]=t.specularColor.g??t.specularColor[1]??1,n[r+U.SPECULAR_COLOR+2]=t.specularColor.b??t.specularColor[2]??1),n[r+U.IRIDESCENCE]=t.iridescence??0,n[r+U.IRIDESCENCE_IOR]=t.iridescenceIOR??1.3,t.iridescenceThicknessRange&&(n[r+U.IRIDESCENCE_THICKNESS_RANGE]=t.iridescenceThicknessRange[0]??100,n[r+U.IRIDESCENCE_THICKNESS_RANGE+1]=t.iridescenceThicknessRange[1]??400),n[r+U.ALBEDO_MAP_INDEX]=t.map??-1,n[r+U.NORMAL_MAP_INDEX]=t.normalMap??-1,n[r+U.ROUGHNESS_MAP_INDEX]=t.roughnessMap??-1,n[r+U.METALNESS_MAP_INDEX]=t.metalnessMap??-1,n[r+U.EMISSIVE_MAP_INDEX]=t.emissiveMap??-1,n[r+U.BUMP_MAP_INDEX]=t.bumpMap??-1,n[r+U.CLEARCOAT]=t.clearcoat??0,n[r+U.CLEARCOAT_ROUGHNESS]=t.clearcoatRoughness??0,n[r+U.OPACITY]=t.opacity??1,n[r+U.SIDE]=t.side??0,this._patchTriangleSideForMaterial(e,t.side??0),this._recomputeOpaqueBlockerForMaterial(e),n[r+U.TRANSPARENT]=t.transparent??0,n[r+U.ALPHA_TEST]=t.alphaTest??0,n[r+U.ALPHA_MODE]=t.alphaMode??0,n[r+U.DEPTH_WRITE]=t.depthWrite??1,n[r+U.NORMAL_SCALE]=t.normalScale?.x??(typeof t.normalScale==`number`?t.normalScale:1),n[r+U.NORMAL_SCALE+1]=t.normalScale?.y??(typeof t.normalScale==`number`?t.normalScale:1),n[r+U.BUMP_SCALE]=t.bumpScale??1,n[r+U.DISPLACEMENT_SCALE]=t.displacementScale??1,n[r+U.DISPLACEMENT_MAP_INDEX]=t.displacementMap??-1,n[r+U.SUBSURFACE]=t.subsurface??0,t.subsurfaceColor&&(n[r+U.SUBSURFACE_COLOR]=t.subsurfaceColor.r??t.subsurfaceColor[0]??1,n[r+U.SUBSURFACE_COLOR+1]=t.subsurfaceColor.g??t.subsurfaceColor[1]??1,n[r+U.SUBSURFACE_COLOR+2]=t.subsurfaceColor.b??t.subsurfaceColor[2]??1),t.subsurfaceRadius&&(n[r+U.SUBSURFACE_RADIUS]=t.subsurfaceRadius[0]??1,n[r+U.SUBSURFACE_RADIUS+1]=t.subsurfaceRadius[1]??.2,n[r+U.SUBSURFACE_RADIUS+2]=t.subsurfaceRadius[2]??.1),n[r+U.SUBSURFACE_RADIUS_SCALE]=t.subsurfaceRadiusScale??1,n[r+U.SUBSURFACE_ANISOTROPY]=t.subsurfaceAnisotropy??0,n[r+U.ANISOTROPY]=t.anisotropy??0,n[r+U.ANISOTROPY_ROTATION]=t.anisotropyRotation??0,n[r+U.ANISOTROPY_MAP_INDEX]=t.anisotropyMap??-1,n[r+U.TRANSMISSION_MAP_INDEX]=t.transmissionMap??-1,n[r+U.CLEARCOAT_MAP_INDEX]=t.clearcoatMap??-1,n[r+U.CLEARCOAT_ROUGHNESS_MAP_INDEX]=t.clearcoatRoughnessMap??-1,n[r+U.SHEEN_COLOR_MAP_INDEX]=t.sheenColorMap??-1,n[r+U.SHEEN_ROUGHNESS_MAP_INDEX]=t.sheenRoughnessMap??-1,n[r+U.IRIDESCENCE_MAP_INDEX]=t.iridescenceMap??-1,n[r+U.IRIDESCENCE_THICKNESS_MAP_INDEX]=t.iridescenceThicknessMap??-1,n[r+U.SPECULAR_INTENSITY_MAP_INDEX]=t.specularIntensityMap??-1,n[r+U.SPECULAR_COLOR_MAP_INDEX]=t.specularColorMap??-1;let i=[1,0,0,0,1,0,0,0,1],a=[{key:`mapMatrix`,offset:U.ALBEDO_TRANSFORM},{key:`normalMapMatrices`,offset:U.NORMAL_TRANSFORM},{key:`roughnessMapMatrices`,offset:U.ROUGHNESS_TRANSFORM},{key:`metalnessMapMatrices`,offset:U.METALNESS_TRANSFORM},{key:`emissiveMapMatrices`,offset:U.EMISSIVE_TRANSFORM},{key:`bumpMapMatrices`,offset:U.BUMP_TRANSFORM},{key:`displacementMapMatrices`,offset:U.DISPLACEMENT_TRANSFORM}];for(let{key:e,offset:o}of a){let a=t[e]??i;for(let e=0;e<8;e++)r+o+e<n.length&&(n[r+o+e]=a[e])}this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}updateMaterial(e,t){let n=this.sdfs.geometryExtractor.createMaterialObject(t);(this._srgbTexPacked||this._linearTexPacked)&&(n.map=this.getPackedTextureIndex(t.map,!0),n.emissiveMap=this.getPackedTextureIndex(t.emissiveMap,!0),n.normalMap=this.getPackedTextureIndex(t.normalMap,!1),n.bumpMap=this.getPackedTextureIndex(t.bumpMap,!1),n.roughnessMap=this.getPackedTextureIndex(t.roughnessMap,!1),n.metalnessMap=this.getPackedTextureIndex(t.metalnessMap,!1),n.displacementMap=this.getPackedTextureIndex(t.displacementMap,!1),n.anisotropyMap=this.getPackedTextureIndex(t.anisotropyMap,!1),n.transmissionMap=this.getPackedTextureIndex(t.transmissionMap,!1),n.clearcoatMap=this.getPackedTextureIndex(t.clearcoatMap,!1),n.clearcoatRoughnessMap=this.getPackedTextureIndex(t.clearcoatRoughnessMap,!1),n.sheenColorMap=this.getPackedTextureIndex(t.sheenColorMap,!0),n.sheenRoughnessMap=this.getPackedTextureIndex(t.sheenRoughnessMap,!1),n.iridescenceMap=this.getPackedTextureIndex(t.iridescenceMap,!1),n.iridescenceThicknessMap=this.getPackedTextureIndex(t.iridescenceThicknessMap,!1),n.specularIntensityMap=this.getPackedTextureIndex(t.specularIntensityMap,!1),n.specularColorMap=this.getPackedTextureIndex(t.specularColorMap,!0)),this.updateMaterialDataFromObject(e,n)}updateTextureTransform(e,t,n){if(!this.materialStorageAttr){Et.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*U.FLOATS_PER_MATERIAL,a={map:U.ALBEDO_TRANSFORM,normalMap:U.NORMAL_TRANSFORM,roughnessMap:U.ROUGHNESS_TRANSFORM,metalnessMap:U.METALNESS_TRANSFORM,emissiveMap:U.EMISSIVE_TRANSFORM,bumpMap:U.BUMP_TRANSFORM,displacementMap:U.DISPLACEMENT_TRANSFORM}[t];if(a===void 0){Et.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*U.FLOATS_PER_MATERIAL,r=t[n+U.ALPHA_MODE]|0,i=t[n+U.TRANSPARENT]|0,a=t[n+U.TRANSMISSION]||0,o=t[n+U.OPACITY]??1,s=+(r===0&&i===0&&a===0&&o>=1);this._patchTriangleFlagForMaterial(e,At,s)}_patchTriangleFlagForMaterial(e,t,n){let r=this.callbacks.getTriangleData?.(),i=r?.array,a=r?.count|0;if(!i||a===0)return;let o=H.FLOATS_PER_TRIANGLE,s=0;for(let r=0;r<a;r++){let a=r*o;i[a+Ot]===e&&(i[a+t]=n,s++)}s>0&&this.callbacks.onTriangleDataChanged&&this.callbacks.onTriangleDataChanged()}_patchTriangleSideForMaterial(e,t){this._patchTriangleFlagForMaterial(e,kt,t)}dispose(){this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null}},Pt=`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})}};`,Ft=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Pt],{type:`text/javascript;charset=utf-8`});function It(e){let t;try{if(t=Ft&&(self.URL||self.webkitURL).createObjectURL(Ft),!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(Pt),{type:`module`,name:e?.name})}}function Lt(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 Rt(e,t,n){return .2126*e+.7152*t+.0722*n}function zt(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function Bt(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]=zt(o[e]),o[e+1]=zt(o[e+1]),o[e+2]=zt(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 Vt=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}=Bt(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}=Bt(e);this._worker=new It;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=Rt(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]=Rt(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]=(Lt(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]=(Lt(d,(n+1)/t,e*t,t)+.5)/t}return{marginalData:m,conditionalData:h,totalSum:l,compensationDelta:u}}},Ht=Math.PI,Ut=Math.PI*2,Wt=Math.E,Gt=[5804542996261093e-21,13562911419845635e-21,30265902468824876e-21],Kt=[183999185144339.78,277980239196605.28,407904795438610.94],qt=1.6110731556870734,Jt=1.5,Yt=1e3,Xt=8400,Zt=1250,Qt=.9999566769464484,$t=.05968310365946075,en=.07957747154594767;function tn(e){return Yt*Math.max(0,1-Wt**+(-(qt-Math.acos(Math.max(-1,Math.min(1,e))))/Jt))}function nn(e){let t=.2*e*1e-17;return[.434*t*Kt[0],.434*t*Kt[1],.434*t*Kt[2]]}function rn(e){return $t*(1+e**2)}function an(e,t){let n=t*t;return en*((1-n)/(1-2*t*e+n)**1.5)}function on(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function sn(e){let t=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);return t===0?[0,0,0]:[e[0]/t,e[1]/t,e[2]/t]}function cn(e,t,n,r,i,a,o,s){let c=(1-t)*Ht,l=(e-.5)*Ut,u=Math.sin(c),d=sn([u*Math.sin(l),Math.cos(c),u*Math.cos(l)]),f=sn(n),p=tn(f[1])*r,m=i-1*(1-(1-Math.max(0,Math.min(1,1-Math.exp(f[1]/45e4))))),h=[Gt[0]*m,Gt[1]*m,Gt[2]*m],g=nn(s),_=[g[0]*a,g[1]*a,g[2]*a],v=Math.acos(Math.max(0,d[1])),y=Math.cos(v)+.15*(93.885-180/Ht*v)**-1.253,b=Xt/y,x=Zt/y,S=[Math.exp(-(h[0]*b+_[0]*x)),Math.exp(-(h[1]*b+_[1]*x)),Math.exp(-(h[2]*b+_[2]*x))],C=on(d,f),w=rn(C*.5+.5),T=[h[0]*w,h[1]*w,h[2]*w],E=an(C,o),D=[_[0]*E,_[1]*E,_[2]*E],O=[T[0]+D[0],T[1]+D[1],T[2]+D[2]],k=[h[0]+_[0],h[1]+_[1],h[2]+_[2]],A=[(p*(O[0]/k[0])*(1-S[0]))**1.5,(p*(O[1]/k[1])*(1-S[1]))**1.5,(p*(O[2]/k[2])*(1-S[2]))**1.5],j=Math.max(0,Math.min(1,1-(1-f[1])**5)),M=[Math.sqrt(p*(O[0]/k[0])*S[0]),Math.sqrt(p*(O[1]/k[1])*S[1]),Math.sqrt(p*(O[2]/k[2])*S[2])],N=1-j;for(let e=0;e<3;e++){let t=1*(1-N)+M[e]*N;A[e]*=t}let P=[.1*S[0],.1*S[1],.1*S[2]],F=ln(Qt,Qt+2e-5,C);for(let e=0;e<3;e++)P[e]+=p*19e3*S[e]*F;let I=65504;return[Math.min((A[0]+P[0])*.04,I),Math.min((A[1]+P[1])*.04+3e-4,I),Math.min((A[2]+P[2])*.04+75e-5,I),1]}function ln(e,t,n){let r=Math.max(0,Math.min(1,(n-e)/(t-e)));return r*r*(3-2*r)}var un=class{constructor(e=512,t=256){this.width=e,this.height=t,this.lastRenderTime=0,this._pixels=new Float32Array(e*t*4),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1}render(e){let t=performance.now(),n=[e.sunDirection.x,e.sunDirection.y,e.sunDirection.z],r=e.sunIntensity||1,i=e.rayleighDensity||2,a=e.mieDensity||.005,o=e.mieAnisotropy||.8,s=e.turbidity||2,{width:c,height:l}=this,u=this._pixels;for(let e=0;e<l;e++){let t=(e+.5)/l;for(let l=0;l<c;l++){let d=cn((l+.5)/c,t,n,r,i,a,o,s),f=(e*c+l)*4;u[f]=d[0],u[f+1]=d[1],u[f+2]=d[2],u[f+3]=d[3]}}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}setResolution(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this._pixels=new Float32Array(e*t*4),this._texture.dispose(),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1)}getLastRenderTime(){return this.lastRenderTime}dispose(){this._texture.dispose()}},dn=class{constructor(e=512,t=256){this.width=e,this.height=t,this.lastRenderTime=0,this._pixels=new Float32Array(e*t*4),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1}renderGradient(e){let t=performance.now(),{width:n,height:r}=this,i=this._pixels,a=e.zenithColor.r,o=e.zenithColor.g,s=e.zenithColor.b,c=e.horizonColor.r,l=e.horizonColor.g,u=e.horizonColor.b,d=e.groundColor.r,f=e.groundColor.g,p=e.groundColor.b;for(let e=0;e<r;e++){let t=(e+.5)/r,m,h,g;if(t>.5){let e=(t-.5)*2;m=c+(a-c)*e,h=l+(o-l)*e,g=u+(s-u)*e}else{let e=t*2;m=d+(c-d)*e,h=f+(l-f)*e,g=p+(u-p)*e}for(let t=0;t<n;t++){let r=(e*n+t)*4;i[r]=m,i[r+1]=h,i[r+2]=g,i[r+3]=1}}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}renderSolid(e){let t=performance.now(),{width:n,height:r}=this,i=this._pixels,a=e.color.r,o=e.color.g,s=e.color.b;for(let e=0;e<r;e++)for(let t=0;t<n;t++){let r=(e*n+t)*4;i[r]=a,i[r+1]=o,i[r+2]=s,i[r+3]=1}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}setResolution(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this._pixels=new Float32Array(e*t*4),this._texture.dispose(),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1)}getLastRenderTime(){return this.lastRenderTime}dispose(){this._texture.dispose()}},fn=K(`env`),pn=class{constructor(e,t){this.scene=e,this.uniforms=t,this.equirectHdrInfo=new Vt,this.proceduralSkyRenderer=null,this.simpleSkyRenderer=null,this._envPlaceholder=new r.DataTexture(new Float32Array([0,0,0,1]),1,1,r.RGBAFormat,r.FloatType,void 0,void 0,void 0,r.LinearFilter,r.LinearFilter),this._envPlaceholder.needsUpdate=!0,this.environmentTexture=this._envPlaceholder,this.envTexSize=new r.Vector2,this.envCDFTexture=null,this._initCDFTexture(),this.environmentRotationMatrix=new r.Matrix4,this.cdfBuildTime=0,this.envParams={mode:`hdri`,gradientZenithColor:new r.Color(B.gradientZenithColor),gradientHorizonColor:new r.Color(B.gradientHorizonColor),gradientGroundColor:new r.Color(B.gradientGroundColor),solidSkyColor:new r.Color(B.solidSkyColor),skySunDirection:this._calculateInitialSunDirection(),skySunIntensity:B.skySunIntensity,skyRayleighDensity:B.skyRayleighDensity,skyTurbidity:B.skyTurbidity,skyMieAnisotropy:B.skyMieAnisotropy},this.callbacks={},this._previousHDRI=null}async setMode(e){let t=this.envParams.mode;this.envParams.mode=e,e!==`hdri`&&t===`hdri`&&(this._previousHDRI=this.environmentTexture),e===`gradient`?await this.generateGradientTexture():e===`color`?await this.generateSolidColorTexture():e===`procedural`?await this.generateProceduralSkyTexture():e===`hdri`&&this._previousHDRI&&(await this.setEnvironmentMap(this._previousHDRI),this._previousHDRI=null),this.markDirty(),this.callbacks.onAutoExposureReset?.(),this._notifyReset()}markDirty(){this.environmentTexture&&(this.environmentTexture.needsUpdate=!0)}get params(){return this.envParams}get texture(){return this.environmentTexture}generateGradient(){return this.generateGradientTexture()}generateSolid(){return this.generateSolidColorTexture()}generateProcedural(){return this.generateProceduralSkyTexture()}_initCDFTexture(){this.envCDFTexture=new r.DataTexture(new Float32Array([0]),1,1,r.RedFormat,r.FloatType),this.envCDFTexture.needsUpdate=!0}_updateCDFTexture(){let e=this.equirectHdrInfo.marginalData,t=this.equirectHdrInfo.conditionalData;if(!e||!t)return;let n=this.equirectHdrInfo.width,i=this.equirectHdrInfo.height,a=n+1,o=new Float32Array(a*i);for(let r=0;r<i;r++){let i=r*a;o.set(t.subarray(r*n,r*n+n),i),o[i+n]=e[r]}this.envCDFTexture?.dispose?.(),this.envCDFTexture=new r.DataTexture(o,a,i,r.RedFormat,r.FloatType),this.envCDFTexture.needsUpdate=!0}setEnvironmentTexture(e){e&&(this.environmentTexture=e,this.envTexSize.set(e.image.width,e.image.height))}getEnvironmentTexture(){return this.environmentTexture}setEnvironmentRotation(e){let t=Math.PI/180*e;this.environmentRotationMatrix.makeRotationY(t),this.uniforms.get(`environmentMatrix`).value.copy(this.environmentRotationMatrix)}async buildEnvironmentCDF({useWorker:e=!0}={}){if(!this.scene.environment){this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0);return}try{let t=performance.now(),n=this.scene.environment;if(!n.image){this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0);return}e?await this.equirectHdrInfo.updateFromAsync(n):this.equirectHdrInfo.updateFrom(n),this.cdfBuildTime=performance.now()-t,this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,this.equirectHdrInfo.totalSum),this.uniforms.set(`envCompensationDelta`,this.equirectHdrInfo.compensationDelta);let{width:r,height:i}=this.equirectHdrInfo;r&&i&&this.uniforms.get(`envResolution`).value.set(r,i),fn.info(G.list([G.px(this.envTexSize.x,this.envTexSize.y),`CDF ${G.ms(this.cdfBuildTime)}${e?``:` (main thread)`}`]))}catch(e){fn.error(`CDF build failed:`,e),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0)}}applyCDFResults(){let e=this.scene.environment,t=this.callbacks.getSceneTextureNodes?.();t&&e&&t.envTex&&(t.envTex.value=e),e&&!e._isGeneratedProcedural&&this.uniforms.set(`hasSun`,0)}async setEnvironmentMap(e,{buildCDF:t=!0}={}){let n=this.environmentTexture;e&&n&&n!==e&&n!==this._envPlaceholder&&n!==this._previousHDRI&&n.dispose?.(),this.scene.environment=e,this.setEnvironmentTexture(e),e?t&&await this.buildEnvironmentCDF():(this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0));let r=this.callbacks.getSceneTextureNodes?.();r&&e&&r.envTex&&(r.envTex.value=e),e&&!e._isGeneratedProcedural&&this.uniforms.set(`hasSun`,0),this._notifyReset()}beginHDRI(e=null){this._previousHDRI&&this._previousHDRI!==e&&this._previousHDRI.dispose?.(),this._previousHDRI=null,this.envParams.mode=`hdri`}async applyHDRI(e,{buildCDF:t=!0}={}){this.beginHDRI(e),await this.setEnvironmentMap(e,{buildCDF:t})}async generateGradientTexture(){this.simpleSkyRenderer||=new dn(512,256);let e={zenithColor:this.envParams.gradientZenithColor,horizonColor:this.envParams.gradientHorizonColor,groundColor:this.envParams.gradientGroundColor};try{let t=this.simpleSkyRenderer.renderGradient(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.set(`hasSun`,0)}catch(e){fn.error(`gradient sky generation failed:`,e)}}async generateSolidColorTexture(){this.simpleSkyRenderer||=new dn(512,256);let e={color:this.envParams.solidSkyColor};try{let t=this.simpleSkyRenderer.renderSolid(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.set(`hasSun`,0)}catch(e){fn.error(`solid color sky generation failed:`,e)}}async generateProceduralSkyTexture(){this.proceduralSkyRenderer||=new un(512,256);let e={sunDirection:this.envParams.skySunDirection.clone(),sunIntensity:this.envParams.skySunIntensity*.05,rayleighDensity:this.envParams.skyRayleighDensity*2,mieDensity:this.envParams.skyTurbidity*.005,mieAnisotropy:this.envParams.skyMieAnisotropy,turbidity:this.envParams.skyTurbidity*2};try{let t=this.proceduralSkyRenderer.render(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.get(`sunDirection`).value.copy(this.envParams.skySunDirection),this.uniforms.set(`sunAngularSize`,.0087),this.uniforms.set(`hasSun`,1),fn.debug(`sun synced · dir ${this.envParams.skySunDirection.toArray().map(e=>e.toFixed(2)).join(`,`)}`)}catch(e){fn.error(`procedural sky generation failed:`,e)}}_calculateInitialSunDirection(){let e=B.skySunAzimuth*(Math.PI/180),t=B.skySunElevation*(Math.PI/180);return new r.Vector3(Math.cos(t)*Math.sin(e),Math.sin(t),Math.cos(t)*Math.cos(e)).normalize()}_notifyReset(){this.callbacks.onReset&&this.callbacks.onReset()}dispose(){this.proceduralSkyRenderer=null,this.simpleSkyRenderer=null,this.envCDFTexture?.dispose?.(),this.envCDFTexture=null,this.environmentTexture&&this.environmentTexture!==this._envPlaceholder&&this.environmentTexture.dispose?.(),this._envPlaceholder?.dispose(),this._envPlaceholder=null,this.environmentTexture=null,this._previousHDRI=null}},mn=C({origin:`vec3`,direction:`vec3`}),hn=C({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`}),gn=C({transmission:`float`,clearcoat:`float`,clearcoatRoughness:`float`,sheenColor:`vec3`,sheenRoughness:`float`,iridescence:`float`,iridescenceThickness:`float`,specularIntensity:`float`,specularColor:`vec3`}),_n=C({color:`vec4`,ior:`float`,transmission:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,albedoMapIndex:`int`,opacity:`float`,transparent:`bool`,alphaTest:`float`,alphaMode:`int`,albedoTransform:`mat3`}),vn=C({shadowed:`vec3`,unoccluded:`vec3`});C({position:`vec3`,radius:`float`,material:hn});var yn=C({didHit:`bool`,dst:`float`,hitPoint:`vec3`,normal:`vec3`,uv:`vec2`,materialIndex:`int`,meshIndex:`int`,triangleIndex:`int`,boxTests:`int`,triTests:`int`});C({posA:`vec3`,posB:`vec3`,posC:`vec3`,uvA:`vec2`,uvB:`vec2`,uvC:`vec2`,normalA:`vec3`,normalB:`vec3`,normalC:`vec3`,material:hn,materialIndex:`int`,meshIndex:`int`}),C({color:`vec4`,samples:`int`});var bn=C({direction:`vec3`,value:`vec3`,pdf:`float`,isTransmission:`bool`,colorWeight:`vec3`}),xn=C({specular:`float`,diffuse:`float`,sheen:`float`,clearcoat:`float`,transmission:`float`,iridescence:`float`}),Sn=C({Ta:`vec3`,Ba:`vec3`}),Cn=C({NoL:`float`,NoV:`float`,NoH:`float`,VoH:`float`,LoH:`float`,ToH:`float`,BoH:`float`,ToV:`float`,BoV:`float`,ToL:`float`,BoL:`float`}),wn=C({compensation:`vec3`,E_total:`vec3`}),Tn=C({albedo:`vec4`,emissive:`vec3`,metalness:`float`,roughness:`float`,normal:`vec3`,hasTextures:`bool`}),En=C({isMetallic:`bool`,isRough:`bool`,isSmooth:`bool`,isTransmissive:`bool`,hasClearcoat:`bool`,isEmissive:`bool`,complexityScore:`float`}),Dn=C({albedoUV:`vec2`,normalUV:`vec2`,metalnessUV:`vec2`,emissiveUV:`vec2`,bumpUV:`vec2`,roughnessUV:`vec2`,normalBumpSameUV:`bool`,metalRoughSameUV:`bool`,albedoEmissiveSameUV:`bool`,allSameUV:`bool`}),On=C({invRoughness:`float`,metalFactor:`float`,iorFactor:`float`,maxSheenColor:`float`});C({traversals:`int`,transmissiveTraversals:`int`,rayType:`int`,isPrimaryRay:`bool`,actualBounceDepth:`int`});var kn=3.14159,An=1/kn,jn=2*kn,Mn=1e-6,Nn=.05,Pn=.089,Fn=.001,In=(0,n.vec3)(.2126,.7152,.0722),q=U.SLOTS_PER_MATERIAL,Ln=U.SLOT,J=Ln,Rn=(0,n.mat3)(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252);(0,n.wgslFn)(`
|
|
116
|
+
`,[te,L]),ge={ALWAYS:`always`,PER_CYCLE:`per_cycle`,PER_TILE:`per_tile`,CONDITIONAL:`conditional`},_e=class{constructor(e,t={}){this.name=e,this.enabled=t.enabled!==!1,this.executionMode=t.executionMode||ge.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 ge.ALWAYS:return!0;case ge.PER_CYCLE:return t===0?!0:n===!0;case ge.PER_TILE:return!0;case ge.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)}},ve=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.wasAccumulationEnabled=!0,this.interactionQualitySettings={maxBounceCount:1,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.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.interactionQualitySettings[e])}),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=>{e===`dpr`?this.renderer.setPixelRatio(this.originalValues.dpr):this.material.uniforms[e]&&(this.material.uniforms[e].value=this.originalValues[e])}),this.interactionMode=!1,this.originalValues={},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=e[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}},V={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`,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`,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`},ye=new t.QuadMesh(null).geometry,be=null;function xe(e){be=e}var Se=()=>be?.({type:V.LOADING_RESET}),H=e=>{be?.({type:V.LOADING_UPDATE,...e})},Ce=e=>{be?.({type:V.STATS_UPDATE,...e})};function we(e){return e.frameCount||0}function Te(e){if(Array.isArray(e))e.forEach(e=>{e.userData&&e.userData.isFallback||(Ee(e),e.dispose())});else{if(e.userData&&e.userData.isFallback)return;Ee(e),e.dispose()}}function Ee(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 De({material:e,geometry:t,children:n}){if(e&&Te(e),t&&t.dispose(),n.length>0)for(let e of n)De(e)}function Oe(e){if(!e)return;e._canvasTarget&&e._onCanvasTargetResize&&e._canvasTarget.removeEventListener(`resize`,e._onCanvasTargetResize),e.dispose(),e._canvasTarget=null;let t=ye._listeners?.dispose;t&&(t.length=0)}function ke(e,t=[]){if(e&&!(t.includes(e.name)||e.isScene)){if(e.isMaterial){Te(e);return}for(;e.children.length>0;)for(let t of e.children)ke(t);De(e),e.removeFromParent(),e.clear()}}function Ae(e){e?.traverse(e=>{e.geometry?.userData?.__rayzeeOwned&&e.geometry.dispose()})}function je(e,t){return t}function Me(e,t=!1){return t?1:1/(e+1)}function Ne(){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 Pe=Object.freeze({viewer:Object.freeze({areaLightIntensityScale:.1,environmentRotation:270,toneMapping:4,saturation:1.2}),physical:Object.freeze({areaLightIntensityScale:1,environmentRotation:0,toneMapping:6,saturation:1})});function Fe(e=`viewer`){let t=Pe[e];if(!t)throw Error(`unknown render profile "${e}" — expected one of ${Object.keys(Pe).join(`, `)}`);return t}var U={resolution:512,canvasWidth:512,canvasHeight:512,maxTextureSize:4096,toneMapping:Pe.viewer.toneMapping,exposure:1,saturation:Pe.viewer.saturation,enableEnvironment:!0,showBackground:!0,transparentBackground:!1,environmentIntensity:1,backgroundIntensity:1,backgroundColor:`#000000`,backgroundBlurriness:0,backgroundBlurSamples:8,environmentRotation:Pe.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:90,skySunElevation:20,skySunIntensity:15,skyRayleighDensity:.9,skyTurbidity:.8,skyMieAnisotropy:.76,skyPreset:`clearMorning`,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,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,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`,debugGbufferMaps:!1,enableUpscaler:!1,upscalerScale:2,upscalerQuality:`fast`,upscalerHdr:!0,debugMode:0,debugThreshold:100,debugModel:0,enableBloom:!1,bloomStrength:.2,bloomRadius:.15,bloomThreshold:.85,interactionModeEnabled:!0,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},Ie=6e4,Le=3,Re=.1,ze=.01,Be=4096,W=2048;function Ve(e){return W=Math.max(256,Math.min(Be,Math.floor(e)||256)),W}var He={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}},Ue={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},We=[`maxAccumulatedFrameNum`,`maxFastAccumulatedFrameNum`,`maxStabilizedFrameNum`,`historyFixFrameNum`,`prepassBlurRadius`,`maxBlurRadius`,`enableAntiFirefly`],Ge={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}},Ke={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}},qe={clearMorning:{name:`Clear Morning`,sunAzimuth:90,sunElevation:20,sunIntensity:15,rayleighDensity:.9,turbidity:.8},clearNoon:{name:`Clear Noon`,sunAzimuth:0,sunElevation:75,sunIntensity:20,rayleighDensity:1,turbidity:.3},overcast:{name:`Overcast`,sunAzimuth:0,sunElevation:45,sunIntensity:6,rayleighDensity:.6,turbidity:4},goldenHour:{name:`Golden Hour`,sunAzimuth:270,sunElevation:10,sunIntensity:19,rayleighDensity:.8,turbidity:1.2},sunset:{name:`Sunset`,sunAzimuth:270,sunElevation:2,sunIntensity:18,rayleighDensity:.7,turbidity:2},dusk:{name:`Dusk`,sunAzimuth:270,sunElevation:-8,sunIntensity:8,rayleighDensity:.5,turbidity:1.5}},Je={portrait:{name:`Portrait`,description:`Shallow depth of field, background blur`,fov:45,focusDistance:1.5,aperture:1.4,focalLength:135,apertureScale:1.5},landscape:{name:`Landscape`,description:`Maximum depth of field, everything in focus`,fov:65,focusDistance:10,aperture:16,focalLength:24,apertureScale:.5},macro:{name:`Macro`,description:`Extreme close-up with thin focus plane`,fov:40,focusDistance:.3,aperture:2,focalLength:100,apertureScale:2},product:{name:`Product`,description:`Sharp detail with subtle background separation`,fov:50,focusDistance:.8,aperture:2.8,focalLength:85,apertureScale:1},architectural:{name:`Architectural`,description:`Wide view with deep focus`,fov:75,focusDistance:5,aperture:11,focalLength:16,apertureScale:.5},cinematic:{name:`Cinematic`,description:`Dramatic depth separation with anamorphic bokeh`,fov:35,focusDistance:3,aperture:1.4,focalLength:200,apertureScale:1.8,anamorphicRatio:1.5}},Ye={MANUAL:`manual`,AUTO:`auto`},Xe={SMOOTHING_FACTOR:.15,RESET_THRESHOLD:.05,FALLBACK_DISTANCE:10,SNAP_THRESHOLD:.5},G={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},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}},Ze=e=>Number.isFinite(e)&&e>0?e:0,Qe={TRIANGLE_LEAF:-1,BLAS_POINTER_LEAF:-2},q={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:128,MATERIAL_BUCKET_COUNT:4,BUCKET_LAYER_STRIDE:256};function $e(e,t=q.MATERIAL_BUCKET_COUNT){let n=[];for(let r=t-1;r>=0;r--)n.push(Math.max(q.MIN_TEXTURE_WIDTH,Math.round(e/2**r)));return n}function et(e,t,n,r=q.MATERIAL_BUCKET_COUNT){let i=2**Math.ceil(Math.log2(Math.max(e||1,t||1))),a=$e(n,r);for(let e=0;e<a.length;e++)if(i<=a[e])return e;return a.length-1}function tt(e,t){return e*q.BUCKET_LAYER_STRIDE+t}var nt=[0,0,1,1,0,0,0,1],rt={maxSamples:150,bounces:20,transmissiveBounces:8,maxSubsurfaceSteps:64,renderMode:1,enableAlphaShadows:!0,enableOIDN:!0,oidnQuality:`high`,interactionModeEnabled:!1,useAdaptiveSampling:!0,noiseThreshold:.02,adaptiveStopFraction:.94,usePixelFreeze:!0},it={maxSamples:U.maxSamples,bounces:U.bounces,renderMode:U.renderMode,enableAlphaShadows:U.enableAlphaShadows,transmissiveBounces:U.transmissiveBounces,maxSubsurfaceSteps:U.maxSubsurfaceSteps,enableOIDN:!1,oidnQuality:`fast`,interactionModeEnabled:!0,useAdaptiveSampling:!0,noiseThreshold:.1,usePixelFreeze:!0},at={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},ot={silent:0,error:1,warn:2,info:3,debug:4},st=`info`,ct=`rayzeeLogLevel`,lt=`rayzeeLogNamespaces`,ut=`color:#7c8494`,dt=`color:inherit`,ft=null,pt=null;function mt(e){try{return globalThis.localStorage?.getItem(e)??null}catch{return null}}function ht(e,t){try{t===null?globalThis.localStorage?.removeItem(e):globalThis.localStorage?.setItem(e,t)}catch{}}function gt(){if(ft!==null)return ft;let e=globalThis.__RAYZEE_LOG_LEVEL__;return e!==void 0&&e in ot?(ft=ot[e],ft):(ft=ot[mt(ct)]??ot[st],ft)}function _t(){if(pt!==null)return pt;let e=globalThis.__RAYZEE_LOG_NS__??mt(lt);return pt=e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[],pt}function vt(e,t){if(t<ot.debug)return!0;let n=_t();return n.length===0||n.some(t=>e===t||e.startsWith(`${t}:`))}function yt(e,t,n){if(e>gt()||!vt(t,e))return;let r=e===ot.error?console.error:e===ot.warn?console.warn:console.log,i=`[${t}]`;typeof n[0]==`string`?r(`%c${i}%c ${n[0]}`,ut,dt,...n.slice(1)):r(`%c${i}`,ut,...n)}var 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(` · `)},bt={levels:ot,setLevel(e){return e in ot?(globalThis.__RAYZEE_LOG_LEVEL__=e,ft=ot[e],ht(ct,e===st?null:e),e):(console.warn(`[log] unknown level '${e}' — expected one of ${Object.keys(ot).join(`, `)}`),this.getLevel())},getLevel(){let e=gt();return Object.keys(ot).find(t=>ot[t]===e)},isEnabled(e){return(ot[e]??ot.debug)<=gt()},only(...e){let t=e.flat().filter(Boolean);return pt=t,globalThis.__RAYZEE_LOG_NS__=t.join(`,`),ht(lt,t.length?t.join(`,`):null),t.length&&this.setLevel(`debug`),t},refresh(){return ft=null,pt=null,this.getLevel()}};function xt(e){return{namespace:e,error:(...t)=>yt(ot.error,e,t),warn:(...t)=>yt(ot.warn,e,t),info:(...t)=>yt(ot.info,e,t),debug:(...t)=>yt(ot.debug,e,t),isEnabled:e=>bt.isEnabled(e),summary(t,n=[]){let r=n.filter(Boolean);if(r.length===0||!console.groupCollapsed){yt(ot.info,e,[t]),r.forEach(t=>yt(ot.debug,e,[t]));return}ot.info>gt()||((gt()>=ot.debug&&console.group?console.group:console.groupCollapsed)(`%c[${e}]%c ${t}`,ut,dt),r.forEach(e=>console.log(e)),console.groupEnd())}}}var St=new Set;function Ct(e,t,...n){St.has(t)||(St.add(t),e.warn(...n))}function wt(){return bt.getLevel()}var Tt=xt(`gpu`);function Et(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 Dt=()=>Et(),Ot=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=Dt(),this.writeNormalDepth=Dt(),this.writeAlbedo=Dt(),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`,Tt.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}},kt={cameraViewMatrix:`ptCameraViewMatrix`,cameraProjectionMatrix:`ptCameraProjectionMatrix`},At=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(`sunAngularSize`,.0087,`float`),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`,+(U.cameraProjection===`equirectangular`),`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(`sceneScale`,1,`float`),this._uniforms.set(`samplingTechnique`,A),A.value=U.samplingTechnique,i(`fireflyThreshold`,U.fireflyThreshold,`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=kt[e]||e}dispose(){this._disposed||(this._disposed=!0,this._uniforms.clear(),this._booleans.clear(),this._arrayWarned.clear(),this._lightBuffers={})}},jt=xt(`material`),Mt=K.SLOTS_PER_MATERIAL,Nt=G.UV_C_MAT_OFFSET+2,Pt=G.NORMAL_C_OFFSET+3,Ft=G.NORMAL_A_OFFSET+3,It=new Set([`transmission`,`transparent`,`opacity`,`alphaMode`]),Lt={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},Rt=class{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={}}setMaterialData(e){if(!e)return;let r=e.length/4;this.materialStorageNode?(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode.value=this.materialStorageAttr,this.materialStorageNode.bufferCount=r):(this.materialStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.materialStorageNode=(0,n.storage)(this.materialStorageAttr,`vec4`,r).toReadOnly()),this.materialCount=Math.floor(r/Mt),jt.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=Lt[t];if(r===void 0)return;let i=e*K.FLOATS_PER_MATERIAL+r;return i<n.length?n[i]:void 0}updateMaterialProperty(e,t,n){if(!this.materialStorageAttr){jt.warn(`material storage buffer not available`);return}let r=this.materialStorageAttr.array,i=e*K.FLOATS_PER_MATERIAL;switch(t){case`color`:n.r===void 0?Array.isArray(n)&&(r[i+K.COLOR]=n[0],r[i+K.COLOR+1]=n[1],r[i+K.COLOR+2]=n[2]):(r[i+K.COLOR]=n.r,r[i+K.COLOR+1]=n.g,r[i+K.COLOR+2]=n.b);break;case`metalness`:r[i+K.METALNESS]=n;break;case`emissive`:n.r===void 0?Array.isArray(n)&&(r[i+K.EMISSIVE]=n[0],r[i+K.EMISSIVE+1]=n[1],r[i+K.EMISSIVE+2]=n[2]):(r[i+K.EMISSIVE]=n.r,r[i+K.EMISSIVE+1]=n.g,r[i+K.EMISSIVE+2]=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)&&(r[i+K.ATTENUATION_COLOR]=n[0],r[i+K.ATTENUATION_COLOR+1]=n[1],r[i+K.ATTENUATION_COLOR+2]=n[2]):(r[i+K.ATTENUATION_COLOR]=n.r,r[i+K.ATTENUATION_COLOR+1]=n.g,r[i+K.ATTENUATION_COLOR+2]=n.b);break;case`attenuationDistance`:r[i+K.ATTENUATION_DISTANCE]=Ze(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)&&(r[i+K.SHEEN_COLOR]=n[0],r[i+K.SHEEN_COLOR+1]=n[1],r[i+K.SHEEN_COLOR+2]=n[2]):(r[i+K.SHEEN_COLOR]=n.r,r[i+K.SHEEN_COLOR+1]=n.g,r[i+K.SHEEN_COLOR+2]=n.b);break;case`specularIntensity`:r[i+K.SPECULAR_INTENSITY]=n;break;case`specularColor`:n.r===void 0?Array.isArray(n)&&(r[i+K.SPECULAR_COLOR]=n[0],r[i+K.SPECULAR_COLOR+1]=n[1],r[i+K.SPECULAR_COLOR+2]=n[2]):(r[i+K.SPECULAR_COLOR]=n.r,r[i+K.SPECULAR_COLOR+1]=n.g,r[i+K.SPECULAR_COLOR+2]=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)&&(r[i+K.SUBSURFACE_COLOR]=n[0],r[i+K.SUBSURFACE_COLOR+1]=n[1],r[i+K.SUBSURFACE_COLOR+2]=n[2]):(r[i+K.SUBSURFACE_COLOR]=n.r,r[i+K.SUBSURFACE_COLOR+1]=n.g,r[i+K.SUBSURFACE_COLOR+2]=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:jt.warn(`unknown material property: ${t}`);return}this.materialStorageAttr.needsUpdate=!0,It.has(t)&&this._recomputeOpaqueBlockerForMaterial(e),this._notifyReset()}updateMaterialDataFromObject(e,t){if(!this.materialStorageAttr){jt.warn(`material storage buffer not available`);return}let n=this.materialStorageAttr.array,r=e*K.FLOATS_PER_MATERIAL;t.color&&(n[r+K.COLOR]=t.color.r??t.color[0]??1,n[r+K.COLOR+1]=t.color.g??t.color[1]??1,n[r+K.COLOR+2]=t.color.b??t.color[2]??1),n[r+K.METALNESS]=t.metalness??0,t.emissive&&(n[r+K.EMISSIVE]=t.emissive.r??t.emissive[0]??0,n[r+K.EMISSIVE+1]=t.emissive.g??t.emissive[1]??0,n[r+K.EMISSIVE+2]=t.emissive.b??t.emissive[2]??0),n[r+K.ROUGHNESS]=t.roughness??1,n[r+K.IOR]=t.ior??1.5,n[r+K.TRANSMISSION]=t.transmission??0,n[r+K.THICKNESS]=t.thickness??.1,n[r+K.EMISSIVE_INTENSITY]=t.emissiveIntensity??1,t.attenuationColor&&(n[r+K.ATTENUATION_COLOR]=t.attenuationColor.r??t.attenuationColor[0]??1,n[r+K.ATTENUATION_COLOR+1]=t.attenuationColor.g??t.attenuationColor[1]??1,n[r+K.ATTENUATION_COLOR+2]=t.attenuationColor.b??t.attenuationColor[2]??1),n[r+K.ATTENUATION_DISTANCE]=Ze(t.attenuationDistance),n[r+K.DISPERSION]=t.dispersion??0,n[r+K.VISIBLE]=1,n[r+K.SHEEN]=t.sheen??0,n[r+K.SHEEN_ROUGHNESS]=t.sheenRoughness??1,t.sheenColor&&(n[r+K.SHEEN_COLOR]=t.sheenColor.r??t.sheenColor[0]??0,n[r+K.SHEEN_COLOR+1]=t.sheenColor.g??t.sheenColor[1]??0,n[r+K.SHEEN_COLOR+2]=t.sheenColor.b??t.sheenColor[2]??0),n[r+K.SPECULAR_INTENSITY]=t.specularIntensity??1,t.specularColor&&(n[r+K.SPECULAR_COLOR]=t.specularColor.r??t.specularColor[0]??1,n[r+K.SPECULAR_COLOR+1]=t.specularColor.g??t.specularColor[1]??1,n[r+K.SPECULAR_COLOR+2]=t.specularColor.b??t.specularColor[2]??1),n[r+K.IRIDESCENCE]=t.iridescence??0,n[r+K.IRIDESCENCE_IOR]=t.iridescenceIOR??1.3,t.iridescenceThicknessRange&&(n[r+K.IRIDESCENCE_THICKNESS_RANGE]=t.iridescenceThicknessRange[0]??100,n[r+K.IRIDESCENCE_THICKNESS_RANGE+1]=t.iridescenceThicknessRange[1]??400),n[r+K.ALBEDO_MAP_INDEX]=t.map??-1,n[r+K.NORMAL_MAP_INDEX]=t.normalMap??-1,n[r+K.ROUGHNESS_MAP_INDEX]=t.roughnessMap??-1,n[r+K.METALNESS_MAP_INDEX]=t.metalnessMap??-1,n[r+K.EMISSIVE_MAP_INDEX]=t.emissiveMap??-1,n[r+K.BUMP_MAP_INDEX]=t.bumpMap??-1,n[r+K.CLEARCOAT]=t.clearcoat??0,n[r+K.CLEARCOAT_ROUGHNESS]=t.clearcoatRoughness??0,n[r+K.OPACITY]=t.opacity??1,n[r+K.SIDE]=t.side??0,this._patchTriangleSideForMaterial(e,t.side??0),this._recomputeOpaqueBlockerForMaterial(e),n[r+K.TRANSPARENT]=t.transparent??0,n[r+K.ALPHA_TEST]=t.alphaTest??0,n[r+K.ALPHA_MODE]=t.alphaMode??0,n[r+K.DEPTH_WRITE]=t.depthWrite??1,n[r+K.NORMAL_SCALE]=t.normalScale?.x??(typeof t.normalScale==`number`?t.normalScale:1),n[r+K.NORMAL_SCALE+1]=t.normalScale?.y??(typeof t.normalScale==`number`?t.normalScale:1),n[r+K.BUMP_SCALE]=t.bumpScale??1,n[r+K.DISPLACEMENT_SCALE]=t.displacementScale??1,n[r+K.DISPLACEMENT_MAP_INDEX]=t.displacementMap??-1,n[r+K.SUBSURFACE]=t.subsurface??0,t.subsurfaceColor&&(n[r+K.SUBSURFACE_COLOR]=t.subsurfaceColor.r??t.subsurfaceColor[0]??1,n[r+K.SUBSURFACE_COLOR+1]=t.subsurfaceColor.g??t.subsurfaceColor[1]??1,n[r+K.SUBSURFACE_COLOR+2]=t.subsurfaceColor.b??t.subsurfaceColor[2]??1),t.subsurfaceRadius&&(n[r+K.SUBSURFACE_RADIUS]=t.subsurfaceRadius[0]??1,n[r+K.SUBSURFACE_RADIUS+1]=t.subsurfaceRadius[1]??.2,n[r+K.SUBSURFACE_RADIUS+2]=t.subsurfaceRadius[2]??.1),n[r+K.SUBSURFACE_RADIUS_SCALE]=t.subsurfaceRadiusScale??1,n[r+K.SUBSURFACE_ANISOTROPY]=t.subsurfaceAnisotropy??0,n[r+K.ANISOTROPY]=t.anisotropy??0,n[r+K.ANISOTROPY_ROTATION]=t.anisotropyRotation??0,n[r+K.ANISOTROPY_MAP_INDEX]=t.anisotropyMap??-1,n[r+K.TRANSMISSION_MAP_INDEX]=t.transmissionMap??-1,n[r+K.CLEARCOAT_MAP_INDEX]=t.clearcoatMap??-1,n[r+K.CLEARCOAT_ROUGHNESS_MAP_INDEX]=t.clearcoatRoughnessMap??-1,n[r+K.SHEEN_COLOR_MAP_INDEX]=t.sheenColorMap??-1,n[r+K.SHEEN_ROUGHNESS_MAP_INDEX]=t.sheenRoughnessMap??-1,n[r+K.IRIDESCENCE_MAP_INDEX]=t.iridescenceMap??-1,n[r+K.IRIDESCENCE_THICKNESS_MAP_INDEX]=t.iridescenceThicknessMap??-1,n[r+K.SPECULAR_INTENSITY_MAP_INDEX]=t.specularIntensityMap??-1,n[r+K.SPECULAR_COLOR_MAP_INDEX]=t.specularColorMap??-1;let i=[1,0,0,0,1,0,0,0,1],a=[{key:`mapMatrix`,offset:K.ALBEDO_TRANSFORM},{key:`normalMapMatrices`,offset:K.NORMAL_TRANSFORM},{key:`roughnessMapMatrices`,offset:K.ROUGHNESS_TRANSFORM},{key:`metalnessMapMatrices`,offset:K.METALNESS_TRANSFORM},{key:`emissiveMapMatrices`,offset:K.EMISSIVE_TRANSFORM},{key:`bumpMapMatrices`,offset:K.BUMP_TRANSFORM},{key:`displacementMapMatrices`,offset:K.DISPLACEMENT_TRANSFORM}];for(let{key:e,offset:o}of a){let a=t[e]??i;for(let e=0;e<8;e++)r+o+e<n.length&&(n[r+o+e]=a[e])}this.materialStorageAttr.needsUpdate=!0,this._notifyReset()}updateMaterial(e,t){let n=this.sdfs.geometryExtractor.createMaterialObject(t);(this._srgbTexPacked||this._linearTexPacked)&&(n.map=this.getPackedTextureIndex(t.map,!0),n.emissiveMap=this.getPackedTextureIndex(t.emissiveMap,!0),n.normalMap=this.getPackedTextureIndex(t.normalMap,!1),n.bumpMap=this.getPackedTextureIndex(t.bumpMap,!1),n.roughnessMap=this.getPackedTextureIndex(t.roughnessMap,!1),n.metalnessMap=this.getPackedTextureIndex(t.metalnessMap,!1),n.displacementMap=this.getPackedTextureIndex(t.displacementMap,!1),n.anisotropyMap=this.getPackedTextureIndex(t.anisotropyMap,!1),n.transmissionMap=this.getPackedTextureIndex(t.transmissionMap,!1),n.clearcoatMap=this.getPackedTextureIndex(t.clearcoatMap,!1),n.clearcoatRoughnessMap=this.getPackedTextureIndex(t.clearcoatRoughnessMap,!1),n.sheenColorMap=this.getPackedTextureIndex(t.sheenColorMap,!0),n.sheenRoughnessMap=this.getPackedTextureIndex(t.sheenRoughnessMap,!1),n.iridescenceMap=this.getPackedTextureIndex(t.iridescenceMap,!1),n.iridescenceThicknessMap=this.getPackedTextureIndex(t.iridescenceThicknessMap,!1),n.specularIntensityMap=this.getPackedTextureIndex(t.specularIntensityMap,!1),n.specularColorMap=this.getPackedTextureIndex(t.specularColorMap,!0)),this.updateMaterialDataFromObject(e,n)}updateTextureTransform(e,t,n){if(!this.materialStorageAttr){jt.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){jt.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=t[n+K.ALPHA_MODE]|0,i=t[n+K.TRANSPARENT]|0,a=t[n+K.TRANSMISSION]||0,o=t[n+K.OPACITY]??1,s=+(r===0&&i===0&&a===0&&o>=1);this._patchTriangleFlagForMaterial(e,Ft,s)}_patchTriangleFlagForMaterial(e,t,n){let r=this.callbacks.getTriangleData?.(),i=r?.array,a=r?.count|0;if(!i||a===0)return;let o=G.FLOATS_PER_TRIANGLE,s=0;for(let r=0;r<a;r++){let a=r*o;i[a+Nt]===e&&(i[a+t]=n,s++)}s>0&&this.callbacks.onTriangleDataChanged&&this.callbacks.onTriangleDataChanged()}_patchTriangleSideForMaterial(e,t){this._patchTriangleFlagForMaterial(e,Pt,t)}dispose(){this.materialStorageAttr=null,this.materialStorageNode=null,this.materialCount=0,this.srgbBuckets=null,this.linearBuckets=null,this._srgbTexPacked=null,this._linearTexPacked=null}},zt=`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})}};`,Bt=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,zt],{type:`text/javascript;charset=utf-8`});function Vt(e){let t;try{if(t=Bt&&(self.URL||self.webkitURL).createObjectURL(Bt),!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(zt),{type:`module`,name:e?.name})}}function Ht(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 Ut(e,t,n){return .2126*e+.7152*t+.0722*n}function Wt(e){return e<=.04045?e/12.92:((e+.055)/1.055)**2.4}function Gt(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]=Wt(o[e]),o[e+1]=Wt(o[e+1]),o[e+2]=Wt(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 Kt=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}=Gt(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}=Gt(e);this._worker=new Vt;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=Ut(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]=Ut(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]=(Ht(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]=(Ht(d,(n+1)/t,e*t,t)+.5)/t}return{marginalData:m,conditionalData:h,totalSum:l,compensationDelta:u}}},qt=Math.PI,Jt=Math.PI*2,Yt=Math.E,Xt=[5804542996261093e-21,13562911419845635e-21,30265902468824876e-21],Zt=[183999185144339.78,277980239196605.28,407904795438610.94],Qt=1.6110731556870734,$t=1.5,en=1e3,tn=8400,nn=1250,rn=.9999566769464484,an=.05968310365946075,on=.07957747154594767;function sn(e){return en*Math.max(0,1-Yt**+(-(Qt-Math.acos(Math.max(-1,Math.min(1,e))))/$t))}function cn(e){let t=.2*e*1e-17;return[.434*t*Zt[0],.434*t*Zt[1],.434*t*Zt[2]]}function ln(e){return an*(1+e**2)}function un(e,t){let n=t*t;return on*((1-n)/(1-2*t*e+n)**1.5)}function dn(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function fn(e){let t=Math.sqrt(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);return t===0?[0,0,0]:[e[0]/t,e[1]/t,e[2]/t]}function pn(e,t,n,r,i,a,o,s){let c=(1-t)*qt,l=(e-.5)*Jt,u=Math.sin(c),d=fn([u*Math.sin(l),Math.cos(c),u*Math.cos(l)]),f=fn(n),p=sn(f[1])*r,m=i-1*(1-(1-Math.max(0,Math.min(1,1-Math.exp(f[1]/45e4))))),h=[Xt[0]*m,Xt[1]*m,Xt[2]*m],g=cn(s),_=[g[0]*a,g[1]*a,g[2]*a],v=Math.acos(Math.max(0,d[1])),y=Math.cos(v)+.15*(93.885-180/qt*v)**-1.253,b=tn/y,x=nn/y,S=[Math.exp(-(h[0]*b+_[0]*x)),Math.exp(-(h[1]*b+_[1]*x)),Math.exp(-(h[2]*b+_[2]*x))],C=dn(d,f),w=ln(C*.5+.5),T=[h[0]*w,h[1]*w,h[2]*w],E=un(C,o),D=[_[0]*E,_[1]*E,_[2]*E],O=[T[0]+D[0],T[1]+D[1],T[2]+D[2]],k=[h[0]+_[0],h[1]+_[1],h[2]+_[2]],A=[(p*(O[0]/k[0])*(1-S[0]))**1.5,(p*(O[1]/k[1])*(1-S[1]))**1.5,(p*(O[2]/k[2])*(1-S[2]))**1.5],j=Math.max(0,Math.min(1,1-(1-f[1])**5)),M=[Math.sqrt(p*(O[0]/k[0])*S[0]),Math.sqrt(p*(O[1]/k[1])*S[1]),Math.sqrt(p*(O[2]/k[2])*S[2])],N=1-j;for(let e=0;e<3;e++){let t=1*(1-N)+M[e]*N;A[e]*=t}let P=[.1*S[0],.1*S[1],.1*S[2]],F=mn(rn,rn+2e-5,C);for(let e=0;e<3;e++)P[e]+=p*19e3*S[e]*F;let I=65504;return[Math.min((A[0]+P[0])*.04,I),Math.min((A[1]+P[1])*.04+3e-4,I),Math.min((A[2]+P[2])*.04+75e-5,I),1]}function mn(e,t,n){let r=Math.max(0,Math.min(1,(n-e)/(t-e)));return r*r*(3-2*r)}var hn=class{constructor(e=512,t=256){this.width=e,this.height=t,this.lastRenderTime=0,this._pixels=new Float32Array(e*t*4),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1}render(e){let t=performance.now(),n=[e.sunDirection.x,e.sunDirection.y,e.sunDirection.z],r=e.sunIntensity||1,i=e.rayleighDensity||2,a=e.mieDensity||.005,o=e.mieAnisotropy||.8,s=e.turbidity||2,{width:c,height:l}=this,u=this._pixels;for(let e=0;e<l;e++){let t=(e+.5)/l;for(let l=0;l<c;l++){let d=pn((l+.5)/c,t,n,r,i,a,o,s),f=(e*c+l)*4;u[f]=d[0],u[f+1]=d[1],u[f+2]=d[2],u[f+3]=d[3]}}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}setResolution(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this._pixels=new Float32Array(e*t*4),this._texture.dispose(),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1)}getLastRenderTime(){return this.lastRenderTime}dispose(){this._texture.dispose()}},gn=class{constructor(e=512,t=256){this.width=e,this.height=t,this.lastRenderTime=0,this._pixels=new Float32Array(e*t*4),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1}renderGradient(e){let t=performance.now(),{width:n,height:r}=this,i=this._pixels,a=e.zenithColor.r,o=e.zenithColor.g,s=e.zenithColor.b,c=e.horizonColor.r,l=e.horizonColor.g,u=e.horizonColor.b,d=e.groundColor.r,f=e.groundColor.g,p=e.groundColor.b;for(let e=0;e<r;e++){let t=(e+.5)/r,m,h,g;if(t>.5){let e=(t-.5)*2;m=c+(a-c)*e,h=l+(o-l)*e,g=u+(s-u)*e}else{let e=t*2;m=d+(c-d)*e,h=f+(l-f)*e,g=p+(u-p)*e}for(let t=0;t<n;t++){let r=(e*n+t)*4;i[r]=m,i[r+1]=h,i[r+2]=g,i[r+3]=1}}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}renderSolid(e){let t=performance.now(),{width:n,height:r}=this,i=this._pixels,a=e.color.r,o=e.color.g,s=e.color.b;for(let e=0;e<r;e++)for(let t=0;t<n;t++){let r=(e*n+t)*4;i[r]=a,i[r+1]=o,i[r+2]=s,i[r+3]=1}return this._texture.needsUpdate=!0,this.lastRenderTime=performance.now()-t,this._texture}setResolution(e,t){this.width===e&&this.height===t||(this.width=e,this.height=t,this._pixels=new Float32Array(e*t*4),this._texture.dispose(),this._texture=new r.DataTexture(this._pixels,e,t,r.RGBAFormat,r.FloatType),this._texture.mapping=r.EquirectangularReflectionMapping,this._texture.colorSpace=r.LinearSRGBColorSpace,this._texture.minFilter=r.LinearFilter,this._texture.magFilter=r.LinearFilter,this._texture.wrapS=r.RepeatWrapping,this._texture.wrapT=r.ClampToEdgeWrapping,this._texture.generateMipmaps=!1)}getLastRenderTime(){return this.lastRenderTime}dispose(){this._texture.dispose()}},_n=xt(`env`),vn=class{constructor(e,t){this.scene=e,this.uniforms=t,this.equirectHdrInfo=new Kt,this.proceduralSkyRenderer=null,this.simpleSkyRenderer=null,this._envPlaceholder=new r.DataTexture(new Float32Array([0,0,0,1]),1,1,r.RGBAFormat,r.FloatType,void 0,void 0,void 0,r.LinearFilter,r.LinearFilter),this._envPlaceholder.needsUpdate=!0,this.environmentTexture=this._envPlaceholder,this.envTexSize=new r.Vector2,this.envCDFTexture=null,this._initCDFTexture(),this.environmentRotationMatrix=new r.Matrix4,this.cdfBuildTime=0,this.envParams={mode:`hdri`,gradientZenithColor:new r.Color(U.gradientZenithColor),gradientHorizonColor:new r.Color(U.gradientHorizonColor),gradientGroundColor:new r.Color(U.gradientGroundColor),solidSkyColor:new r.Color(U.solidSkyColor),skySunDirection:this._calculateInitialSunDirection(),skySunIntensity:U.skySunIntensity,skyRayleighDensity:U.skyRayleighDensity,skyTurbidity:U.skyTurbidity,skyMieAnisotropy:U.skyMieAnisotropy},this.callbacks={},this._previousHDRI=null}async setMode(e){let t=this.envParams.mode;this.envParams.mode=e,e!==`hdri`&&t===`hdri`&&(this._previousHDRI=this.environmentTexture),e===`gradient`?await this.generateGradientTexture():e===`color`?await this.generateSolidColorTexture():e===`procedural`?await this.generateProceduralSkyTexture():e===`hdri`&&this._previousHDRI&&(await this.setEnvironmentMap(this._previousHDRI),this._previousHDRI=null),this.markDirty(),this.callbacks.onAutoExposureReset?.(),this._notifyReset()}markDirty(){this.environmentTexture&&(this.environmentTexture.needsUpdate=!0)}get params(){return this.envParams}get texture(){return this.environmentTexture}generateGradient(){return this.generateGradientTexture()}generateSolid(){return this.generateSolidColorTexture()}generateProcedural(){return this.generateProceduralSkyTexture()}_initCDFTexture(){this.envCDFTexture=new r.DataTexture(new Float32Array([0]),1,1,r.RedFormat,r.FloatType),this.envCDFTexture.needsUpdate=!0}_updateCDFTexture(){let e=this.equirectHdrInfo.marginalData,t=this.equirectHdrInfo.conditionalData;if(!e||!t)return;let n=this.equirectHdrInfo.width,i=this.equirectHdrInfo.height,a=n+1,o=new Float32Array(a*i);for(let r=0;r<i;r++){let i=r*a;o.set(t.subarray(r*n,r*n+n),i),o[i+n]=e[r]}this.envCDFTexture?.dispose?.(),this.envCDFTexture=new r.DataTexture(o,a,i,r.RedFormat,r.FloatType),this.envCDFTexture.needsUpdate=!0}setEnvironmentTexture(e){e&&(this.environmentTexture=e,this.envTexSize.set(e.image.width,e.image.height))}getEnvironmentTexture(){return this.environmentTexture}setEnvironmentRotation(e){let t=Math.PI/180*e;this.environmentRotationMatrix.makeRotationY(t),this.uniforms.get(`environmentMatrix`).value.copy(this.environmentRotationMatrix)}async buildEnvironmentCDF({useWorker:e=!0}={}){if(!this.scene.environment){this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0);return}try{let t=performance.now(),n=this.scene.environment;if(!n.image){this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0);return}e?await this.equirectHdrInfo.updateFromAsync(n):this.equirectHdrInfo.updateFrom(n),this.cdfBuildTime=performance.now()-t,this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,this.equirectHdrInfo.totalSum),this.uniforms.set(`envCompensationDelta`,this.equirectHdrInfo.compensationDelta);let{width:r,height:i}=this.equirectHdrInfo;r&&i&&this.uniforms.get(`envResolution`).value.set(r,i),_n.info(J.list([J.px(this.envTexSize.x,this.envTexSize.y),`CDF ${J.ms(this.cdfBuildTime)}${e?``:` (main thread)`}`]))}catch(e){_n.error(`CDF build failed:`,e),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0)}}applyCDFResults(){let e=this.scene.environment,t=this.callbacks.getSceneTextureNodes?.();t&&e&&t.envTex&&(t.envTex.value=e),e&&!e._isGeneratedProcedural&&this.uniforms.set(`hasSun`,0)}async setEnvironmentMap(e,{buildCDF:t=!0}={}){let n=this.environmentTexture;e&&n&&n!==e&&n!==this._envPlaceholder&&n!==this._previousHDRI&&n.dispose?.(),this.scene.environment=e,this.setEnvironmentTexture(e),e?t&&await this.buildEnvironmentCDF():(this._updateCDFTexture(),this.uniforms.set(`envTotalSum`,0),this.uniforms.set(`envCompensationDelta`,0));let r=this.callbacks.getSceneTextureNodes?.();r&&e&&r.envTex&&(r.envTex.value=e),e&&!e._isGeneratedProcedural&&this.uniforms.set(`hasSun`,0),this._notifyReset()}beginHDRI(e=null){this._previousHDRI&&this._previousHDRI!==e&&this._previousHDRI.dispose?.(),this._previousHDRI=null,this.envParams.mode=`hdri`}async applyHDRI(e,{buildCDF:t=!0}={}){this.beginHDRI(e),await this.setEnvironmentMap(e,{buildCDF:t})}async generateGradientTexture(){this.simpleSkyRenderer||=new gn(512,256);let e={zenithColor:this.envParams.gradientZenithColor,horizonColor:this.envParams.gradientHorizonColor,groundColor:this.envParams.gradientGroundColor};try{let t=this.simpleSkyRenderer.renderGradient(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.set(`hasSun`,0)}catch(e){_n.error(`gradient sky generation failed:`,e)}}async generateSolidColorTexture(){this.simpleSkyRenderer||=new gn(512,256);let e={color:this.envParams.solidSkyColor};try{let t=this.simpleSkyRenderer.renderSolid(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.set(`hasSun`,0)}catch(e){_n.error(`solid color sky generation failed:`,e)}}async generateProceduralSkyTexture(){this.proceduralSkyRenderer||=new hn(512,256);let e={sunDirection:this.envParams.skySunDirection.clone(),sunIntensity:this.envParams.skySunIntensity*.05,rayleighDensity:this.envParams.skyRayleighDensity*2,mieDensity:this.envParams.skyTurbidity*.005,mieAnisotropy:this.envParams.skyMieAnisotropy,turbidity:this.envParams.skyTurbidity*2};try{let t=this.proceduralSkyRenderer.render(e);t._isGeneratedProcedural=!0,await this.setEnvironmentMap(t),this.uniforms.get(`sunDirection`).value.copy(this.envParams.skySunDirection),this.uniforms.set(`sunAngularSize`,.0087),this.uniforms.set(`hasSun`,1),_n.debug(`sun synced · dir ${this.envParams.skySunDirection.toArray().map(e=>e.toFixed(2)).join(`,`)}`)}catch(e){_n.error(`procedural sky generation failed:`,e)}}_calculateInitialSunDirection(){let e=U.skySunAzimuth*(Math.PI/180),t=U.skySunElevation*(Math.PI/180);return new r.Vector3(Math.cos(t)*Math.sin(e),Math.sin(t),Math.cos(t)*Math.cos(e)).normalize()}_notifyReset(){this.callbacks.onReset&&this.callbacks.onReset()}dispose(){this.proceduralSkyRenderer=null,this.simpleSkyRenderer=null,this.envCDFTexture?.dispose?.(),this.envCDFTexture=null,this.environmentTexture&&this.environmentTexture!==this._envPlaceholder&&this.environmentTexture.dispose?.(),this._envPlaceholder?.dispose(),this._envPlaceholder=null,this.environmentTexture=null,this._previousHDRI=null}},yn=C({origin:`vec3`,direction:`vec3`}),bn=C({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`}),xn=C({transmission:`float`,clearcoat:`float`,clearcoatRoughness:`float`,sheenColor:`vec3`,sheenRoughness:`float`,iridescence:`float`,iridescenceThickness:`float`,specularIntensity:`float`,specularColor:`vec3`}),Sn=C({color:`vec4`,ior:`float`,transmission:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,albedoMapIndex:`int`,opacity:`float`,transparent:`bool`,alphaTest:`float`,alphaMode:`int`,albedoTransform:`mat3`}),Cn=C({shadowed:`vec3`,unoccluded:`vec3`});C({position:`vec3`,radius:`float`,material:bn});var wn=C({didHit:`bool`,dst:`float`,hitPoint:`vec3`,normal:`vec3`,uv:`vec2`,materialIndex:`int`,meshIndex:`int`,triangleIndex:`int`,boxTests:`int`,triTests:`int`});C({posA:`vec3`,posB:`vec3`,posC:`vec3`,uvA:`vec2`,uvB:`vec2`,uvC:`vec2`,normalA:`vec3`,normalB:`vec3`,normalC:`vec3`,material:bn,materialIndex:`int`,meshIndex:`int`}),C({color:`vec4`,samples:`int`});var Tn=C({direction:`vec3`,value:`vec3`,pdf:`float`,isTransmission:`bool`,colorWeight:`vec3`}),En=C({specular:`float`,diffuse:`float`,sheen:`float`,clearcoat:`float`,transmission:`float`,iridescence:`float`}),Dn=C({Ta:`vec3`,Ba:`vec3`}),On=C({NoL:`float`,NoV:`float`,NoH:`float`,VoH:`float`,LoH:`float`,ToH:`float`,BoH:`float`,ToV:`float`,BoV:`float`,ToL:`float`,BoL:`float`}),kn=C({compensation:`vec3`,E_total:`vec3`}),An=C({albedo:`vec4`,emissive:`vec3`,metalness:`float`,roughness:`float`,normal:`vec3`,hasTextures:`bool`}),jn=C({isMetallic:`bool`,isRough:`bool`,isSmooth:`bool`,isTransmissive:`bool`,hasClearcoat:`bool`,isEmissive:`bool`,complexityScore:`float`}),Mn=C({albedoUV:`vec2`,normalUV:`vec2`,metalnessUV:`vec2`,emissiveUV:`vec2`,bumpUV:`vec2`,roughnessUV:`vec2`,normalBumpSameUV:`bool`,metalRoughSameUV:`bool`,albedoEmissiveSameUV:`bool`,allSameUV:`bool`}),Nn=C({invRoughness:`float`,metalFactor:`float`,iorFactor:`float`,maxSheenColor:`float`});C({traversals:`int`,transmissiveTraversals:`int`,rayType:`int`,isPrimaryRay:`bool`,actualBounceDepth:`int`});var Pn=3.14159,Fn=1/Pn,In=2*Pn,Ln=1e-6,Rn=.05,zn=.089,Bn=.001,Vn=(0,n.vec3)(.2126,.7152,.0722),Hn=65504,Un=(e,t=1e7)=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,t),Wn=(e,t=1e7)=>(0,n.vec3)(Un(e.x,t),Un(e.y,t),Un(e.z,t)),Y=K.SLOTS_PER_MATERIAL,Gn=K.SLOT,X=Gn,Kn=(0,n.mat3)(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252);(0,n.wgslFn)(`
|
|
117
117
|
fn sRGBToLinear( srgbColor: vec3f ) -> vec3f {
|
|
118
118
|
|
|
119
119
|
return pow( srgbColor, vec3f( 2.2 ) );
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
return pow( color, vec3f( 1.0 / 2.2 ) );
|
|
126
126
|
|
|
127
127
|
}
|
|
128
|
-
`);var
|
|
128
|
+
`);var qn=(0,n.wgslFn)(`
|
|
129
129
|
fn square( x: f32 ) -> f32 {
|
|
130
130
|
|
|
131
131
|
return x * x;
|
|
@@ -149,24 +149,24 @@
|
|
|
149
149
|
return min( min( v.r, v.g ), v.b );
|
|
150
150
|
|
|
151
151
|
}
|
|
152
|
-
`);var
|
|
152
|
+
`);var Jn=(0,n.wgslFn)(`
|
|
153
153
|
fn luminance( color: vec3f ) -> f32 {
|
|
154
154
|
|
|
155
155
|
return dot( color, vec3f( 0.2126, 0.7152, 0.0722 ) );
|
|
156
156
|
|
|
157
157
|
}
|
|
158
|
-
`),
|
|
158
|
+
`),Yn=(0,n.wgslFn)(`
|
|
159
159
|
fn powerHeuristic( pdf1: f32, pdf2: f32 ) -> f32 {
|
|
160
160
|
|
|
161
161
|
let p1 = pdf1 * pdf1;
|
|
162
162
|
let p2 = pdf2 * pdf2;
|
|
163
|
-
return p1 / max( p1 + p2, ${
|
|
163
|
+
return p1 / max( p1 + p2, ${Bn} );
|
|
164
164
|
|
|
165
165
|
}
|
|
166
|
-
`),
|
|
166
|
+
`),Xn=(0,n.wgslFn)(`
|
|
167
167
|
fn balanceHeuristic( pdf1: f32, pdf2: f32 ) -> f32 {
|
|
168
168
|
|
|
169
|
-
return pdf1 / max( pdf1 + pdf2, ${
|
|
169
|
+
return pdf1 / max( pdf1 + pdf2, ${Bn} );
|
|
170
170
|
|
|
171
171
|
}
|
|
172
172
|
`);(0,n.wgslFn)(`
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
return color + ( dither - 0.5 ) * ditheringAmount / 255.0;
|
|
185
185
|
|
|
186
186
|
}
|
|
187
|
-
`);var
|
|
187
|
+
`);var Zn=(0,n.wgslFn)(`
|
|
188
188
|
fn constructTBN( N: vec3f ) -> mat3x3f {
|
|
189
189
|
|
|
190
190
|
var majorAxis: vec3f;
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
return mat3x3f( T, B, N );
|
|
199
199
|
|
|
200
200
|
}
|
|
201
|
-
`);(0,n.Fn)(([e,t,r])=>{let i=t.add(r).toVar(),a=(0,n.dot)(i,i).toVar();return i.assign(a.greaterThan(
|
|
201
|
+
`);(0,n.Fn)(([e,t,r])=>{let i=t.add(r).toVar(),a=(0,n.dot)(i,i).toVar();return i.assign(a.greaterThan(Ln).select(i.div(a.sqrt()),(0,n.vec3)(0,0,1))),On({NoL:(0,n.max)((0,n.dot)(e,r),.001),NoV:(0,n.max)((0,n.dot)(e,t),.001),NoH:(0,n.max)((0,n.dot)(e,i),.001),VoH:(0,n.max)((0,n.dot)(t,i),.001),LoH:(0,n.max)((0,n.dot)(r,i),.001),ToH:(0,n.float)(0),BoH:(0,n.float)(0),ToV:(0,n.float)(0),BoV:(0,n.float)(0),ToL:(0,n.float)(0),BoL:(0,n.float)(0)})});var Qn=(0,n.Fn)(([e,t])=>{let r=e.x.abs().lessThan(.999).select((0,n.vec3)(1,0,0),(0,n.vec3)(0,1,0)),i=e.cross(r).normalize(),a=e.cross(i).normalize(),o=t.cos(),s=t.sin();return Dn({Ta:i.mul(o).add(a.mul(s)),Ba:a.mul(o).sub(i.mul(s))})}),$n=(0,n.Fn)(([e,t,r,i])=>{let a=t.add(r).toVar(),o=(0,n.dot)(a,a).toVar();a.assign(o.greaterThan(Ln).select(a.div(o.sqrt()),(0,n.vec3)(0,0,1)));let s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.float)(0).toVar(),d=(0,n.float)(0).toVar(),f=(0,n.float)(0).toVar();return(0,n.If)(i.anisotropy.greaterThan(0),()=>{let o=Dn.wrap(Qn(e,i.anisotropyRotation));s.assign((0,n.dot)(o.Ta,a)),c.assign((0,n.dot)(o.Ba,a)),l.assign((0,n.dot)(o.Ta,t)),u.assign((0,n.dot)(o.Ba,t)),d.assign((0,n.dot)(o.Ta,r)),f.assign((0,n.dot)(o.Ba,r))}),On({NoL:(0,n.max)((0,n.dot)(e,r),.001),NoV:(0,n.max)((0,n.dot)(e,t),.001),NoH:(0,n.max)((0,n.dot)(e,a),.001),VoH:(0,n.max)((0,n.dot)(t,a),.001),LoH:(0,n.max)((0,n.dot)(r,a),.001),ToH:s,BoH:c,ToV:l,BoV:u,ToL:d,BoL:f})}),er=(0,n.wgslFn)(`
|
|
202
202
|
fn calculateFireflyThreshold( baseThreshold: f32, bounceIndex: i32, frame: i32 ) -> f32 {
|
|
203
203
|
|
|
204
204
|
let depthFactor = 1.0 / ( 1.0 + f32( bounceIndex ) * 0.1 );
|
|
@@ -206,7 +206,7 @@
|
|
|
206
206
|
return baseThreshold * depthFactor * relaxation;
|
|
207
207
|
|
|
208
208
|
}
|
|
209
|
-
`),
|
|
209
|
+
`),tr=(0,n.wgslFn)(`
|
|
210
210
|
fn applySoftSuppression( value: f32, threshold: f32, dampingFactor: f32 ) -> f32 {
|
|
211
211
|
|
|
212
212
|
if ( value <= threshold ) {
|
|
@@ -217,7 +217,7 @@
|
|
|
217
217
|
return value * suppressionFactor;
|
|
218
218
|
|
|
219
219
|
}
|
|
220
|
-
`),
|
|
220
|
+
`),nr=(0,n.wgslFn)(`
|
|
221
221
|
fn applySoftSuppressionRGB( color: vec3f, threshold: f32, dampingFactor: f32 ) -> vec3f {
|
|
222
222
|
|
|
223
223
|
let lum = dot( color, vec3f( 0.2126, 0.7152, 0.0722 ) );
|
|
@@ -225,13 +225,13 @@
|
|
|
225
225
|
return color;
|
|
226
226
|
}
|
|
227
227
|
let suppressedLum = applySoftSuppression( lum, threshold, dampingFactor );
|
|
228
|
-
if ( lum > ${
|
|
228
|
+
if ( lum > ${Ln} ) {
|
|
229
229
|
return color * ( suppressedLum / lum );
|
|
230
230
|
}
|
|
231
231
|
return color;
|
|
232
232
|
|
|
233
233
|
}
|
|
234
|
-
`,[
|
|
234
|
+
`,[tr]),rr=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=e.greaterThan(.7).toVar(),c=t.greaterThan(.8),l=t.lessThan(.3).toVar(),u=r.greaterThan(.5).toVar(),d=i.greaterThan(.5).toVar(),f=o.greaterThan(0),p=a.x.add(a.y).add(a.z).greaterThan(0).toVar(),m=(0,n.float)(.15).mul((0,n.float)(s)).add((0,n.float)(.25).mul((0,n.float)(l))).add((0,n.float)(.45).mul((0,n.float)(u))).add((0,n.float)(.35).mul((0,n.float)(d))).add((0,n.float)(.3).mul((0,n.float)(p))).add((0,n.float)(.4).mul((0,n.float)(f))),h=(0,n.float)(0).toVar();return(0,n.If)(s.and(l),()=>{h.addAssign(.15)}),(0,n.If)(u.and(d),()=>{h.addAssign(.2)}),(0,n.If)(p.and(u.or(s)),()=>{h.addAssign(.1)}),jn({isMetallic:s,isRough:c,isSmooth:l,isTransmissive:u,hasClearcoat:d,isEmissive:p,complexityScore:(0,n.clamp)(m.add(h),0,1)})}),Z=(0,n.Fn)(([e,t,n,r])=>{let i=t.mul(r).add(n);return e.element(i)}),ir=(0,n.wgslFn)(`
|
|
235
235
|
fn arrayToMat3( data1: vec4f, data2: vec4f ) -> mat3x3f {
|
|
236
236
|
|
|
237
237
|
return mat3x3f(
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
);
|
|
242
242
|
|
|
243
243
|
}
|
|
244
|
-
`),Zn=(0,n.Fn)(([e,t])=>{let r=Y(t,e,(0,n.int)(J.COLOR_METALNESS),(0,n.int)(q)).toVar(),i=Y(t,e,(0,n.int)(J.EMISSIVE_ROUGHNESS),(0,n.int)(q)).toVar(),a=Y(t,e,(0,n.int)(J.IOR_TRANSMISSION),(0,n.int)(q)).toVar(),o=Y(t,e,(0,n.int)(J.ATTENUATION),(0,n.int)(q)).toVar(),s=Y(t,e,(0,n.int)(J.DISPERSION_SHEEN),(0,n.int)(q)).toVar(),c=Y(t,e,(0,n.int)(J.SHEEN_COLOR),(0,n.int)(q)).toVar(),l=Y(t,e,(0,n.int)(J.SPECULAR),(0,n.int)(q)).toVar(),u=Y(t,e,(0,n.int)(J.IRIDESCENCE),(0,n.int)(q)).toVar(),d=Y(t,e,(0,n.int)(J.MAP_INDICES_A),(0,n.int)(q)).toVar(),f=Y(t,e,(0,n.int)(J.MAP_INDICES_B),(0,n.int)(q)).toVar(),p=Y(t,e,(0,n.int)(J.OPACITY_ALPHA),(0,n.int)(q)).toVar(),m=Y(t,e,(0,n.int)(J.ALPHA_MODE),(0,n.int)(q)).toVar(),h=Y(t,e,(0,n.int)(J.BUMP_DISPLACEMENT),(0,n.int)(q)).toVar(),g=Y(t,e,(0,n.int)(J.ALBEDO_TRANSFORM_A),(0,n.int)(q)).toVar(),_=Y(t,e,(0,n.int)(J.ALBEDO_TRANSFORM_B),(0,n.int)(q)).toVar(),v=Y(t,e,(0,n.int)(J.NORMAL_TRANSFORM_A),(0,n.int)(q)).toVar(),y=Y(t,e,(0,n.int)(J.NORMAL_TRANSFORM_B),(0,n.int)(q)).toVar(),b=Y(t,e,(0,n.int)(J.ROUGHNESS_TRANSFORM_A),(0,n.int)(q)).toVar(),x=Y(t,e,(0,n.int)(J.ROUGHNESS_TRANSFORM_B),(0,n.int)(q)).toVar(),S=Y(t,e,(0,n.int)(J.METALNESS_TRANSFORM_A),(0,n.int)(q)).toVar(),C=Y(t,e,(0,n.int)(J.METALNESS_TRANSFORM_B),(0,n.int)(q)).toVar(),w=Y(t,e,(0,n.int)(J.EMISSIVE_TRANSFORM_A),(0,n.int)(q)).toVar(),T=Y(t,e,(0,n.int)(J.EMISSIVE_TRANSFORM_B),(0,n.int)(q)).toVar(),E=Y(t,e,(0,n.int)(J.BUMP_TRANSFORM_A),(0,n.int)(q)).toVar(),D=Y(t,e,(0,n.int)(J.BUMP_TRANSFORM_B),(0,n.int)(q)).toVar(),O=Y(t,e,(0,n.int)(J.DISPLACEMENT_TRANSFORM_A),(0,n.int)(q)).toVar(),k=Y(t,e,(0,n.int)(J.DISPLACEMENT_TRANSFORM_B),(0,n.int)(q)).toVar(),A=Y(t,e,(0,n.int)(J.SUBSURFACE_A),(0,n.int)(q)).toVar(),j=Y(t,e,(0,n.int)(J.SUBSURFACE_B),(0,n.int)(q)).toVar(),M=Y(t,e,(0,n.int)(J.SUBSURFACE_C),(0,n.int)(q)).toVar(),N=Y(t,e,(0,n.int)(J.EXT_MAP_INDICES_A),(0,n.int)(q)).toVar(),P=Y(t,e,(0,n.int)(J.EXT_MAP_INDICES_B),(0,n.int)(q)).toVar(),F=Y(t,e,(0,n.int)(J.EXT_MAP_INDICES_C),(0,n.int)(q)).toVar();return hn({color:(0,n.vec4)(r.rgb,1),metalness:r.a,emissive:i.rgb,roughness:i.a,ior:a.r,transmission:a.g,thickness:a.b,emissiveIntensity:a.a,attenuationColor:o.rgb,attenuationDistance:o.a,dispersion:s.r,sheen:s.b,sheenRoughness:s.a,sheenColor:c.rgb,specularIntensity:l.r,specularColor:l.gba,iridescence:u.r,iridescenceIOR:u.g,iridescenceThicknessRange:u.ba,subsurfaceColor:A.rgb,subsurface:A.a,subsurfaceRadius:j.rgb,subsurfaceRadiusScale:j.a,subsurfaceAnisotropy:M.r,anisotropy:M.g,anisotropyRotation:M.b,anisotropyMapIndex:(0,n.int)(M.a),transmissionMapIndex:(0,n.int)(N.r),clearcoatMapIndex:(0,n.int)(N.g),clearcoatRoughnessMapIndex:(0,n.int)(N.b),sheenColorMapIndex:(0,n.int)(N.a),sheenRoughnessMapIndex:(0,n.int)(P.r),iridescenceMapIndex:(0,n.int)(P.g),iridescenceThicknessMapIndex:(0,n.int)(P.b),specularIntensityMapIndex:(0,n.int)(P.a),specularColorMapIndex:(0,n.int)(F.r),albedoMapIndex:(0,n.int)(d.r),normalMapIndex:(0,n.int)(d.g),roughnessMapIndex:(0,n.int)(d.b),metalnessMapIndex:(0,n.int)(d.a),emissiveMapIndex:(0,n.int)(f.r),bumpMapIndex:(0,n.int)(f.g),clearcoat:f.b,clearcoatRoughness:f.a,opacity:p.r,side:(0,n.int)(p.g),transparent:p.b,alphaTest:p.a,alphaMode:(0,n.int)(m.r),depthWrite:(0,n.int)(m.g),normalScale:(0,n.vec2)(m.b,m.b),bumpScale:h.r,displacementScale:h.g,displacementMapIndex:(0,n.int)(h.b),albedoTransform:Xn({data1:g,data2:_}),normalTransform:Xn({data1:v,data2:y}),roughnessTransform:Xn({data1:b,data2:x}),metalnessTransform:Xn({data1:S,data2:C}),emissiveTransform:Xn({data1:w,data2:T}),bumpTransform:Xn({data1:E,data2:D}),displacementTransform:Xn({data1:O,data2:k})})}),Qn=(0,n.Fn)(()=>{let e=(0,n.mat3)(1,0,0,0,1,0,0,0,1);return hn({color:(0,n.vec4)(1,1,1,1),emissive:(0,n.vec3)(0),emissiveIntensity:(0,n.float)(0),roughness:(0,n.float)(1),metalness:(0,n.float)(0),ior:(0,n.float)(1.5),transmission:(0,n.float)(0),thickness:(0,n.float)(0),clearcoat:(0,n.float)(0),clearcoatRoughness:(0,n.float)(0),opacity:(0,n.float)(1),transparent:(0,n.float)(0),attenuationColor:(0,n.vec3)(1),attenuationDistance:(0,n.float)(0),dispersion:(0,n.float)(0),sheen:(0,n.float)(0),sheenRoughness:(0,n.float)(1),sheenColor:(0,n.vec3)(0),specularIntensity:(0,n.float)(1),specularColor:(0,n.vec3)(1),alphaTest:(0,n.float)(0),alphaMode:(0,n.int)(0),side:(0,n.int)(0),depthWrite:(0,n.int)(1),albedoMapIndex:(0,n.int)(-1),emissiveMapIndex:(0,n.int)(-1),normalMapIndex:(0,n.int)(-1),bumpMapIndex:(0,n.int)(-1),bumpScale:(0,n.float)(1),displacementScale:(0,n.float)(0),metalnessMapIndex:(0,n.int)(-1),roughnessMapIndex:(0,n.int)(-1),displacementMapIndex:(0,n.int)(-1),normalScale:(0,n.vec2)(1,1),albedoTransform:e,emissiveTransform:e,normalTransform:e,bumpTransform:e,metalnessTransform:e,roughnessTransform:e,displacementTransform:e,iridescence:(0,n.float)(0),iridescenceIOR:(0,n.float)(1.3),iridescenceThicknessRange:(0,n.vec2)(100,400),subsurface:(0,n.float)(0),subsurfaceColor:(0,n.vec3)(1),subsurfaceRadius:(0,n.vec3)(1,.2,.1),subsurfaceRadiusScale:(0,n.float)(1),subsurfaceAnisotropy:(0,n.float)(0),anisotropy:(0,n.float)(0),anisotropyRotation:(0,n.float)(0),anisotropyMapIndex:(0,n.int)(-1),transmissionMapIndex:(0,n.int)(-1),clearcoatMapIndex:(0,n.int)(-1),clearcoatRoughnessMapIndex:(0,n.int)(-1),sheenColorMapIndex:(0,n.int)(-1),sheenRoughnessMapIndex:(0,n.int)(-1),iridescenceMapIndex:(0,n.int)(-1),iridescenceThicknessMapIndex:(0,n.int)(-1),specularIntensityMapIndex:(0,n.int)(-1),specularColorMapIndex:(0,n.int)(-1)})}),$n=(0,n.Fn)(([e,t])=>{let r=Y(t,e,(0,n.int)(J.IOR_TRANSMISSION),(0,n.int)(q)).toVar(),i=Y(t,e,(0,n.int)(J.ATTENUATION),(0,n.int)(q)).toVar(),a=Y(t,e,(0,n.int)(J.MAP_INDICES_A),(0,n.int)(q)).toVar(),o=Y(t,e,(0,n.int)(J.OPACITY_ALPHA),(0,n.int)(q)).toVar(),s=Y(t,e,(0,n.int)(J.ALPHA_MODE),(0,n.int)(q)).toVar(),c=Y(t,e,(0,n.int)(J.ALBEDO_TRANSFORM_A),(0,n.int)(q)).toVar(),l=Y(t,e,(0,n.int)(J.ALBEDO_TRANSFORM_B),(0,n.int)(q)).toVar();return _n({color:(0,n.vec4)(1),ior:r.r,transmission:r.g,attenuationColor:i.rgb,attenuationDistance:i.a,albedoMapIndex:(0,n.int)(a.r),opacity:o.r,transparent:o.b,alphaTest:o.a,alphaMode:(0,n.int)(s.r),albedoTransform:Xn({data1:c,data2:l})})}),er=1e-6,tr=e=>{let t=e.mul(e);return t.mul(t).mul(e)};(0,n.Fn)(([e,t,r])=>{let i=(0,n.max)((0,n.vec3)((0,n.float)(1).sub(r)),e);return e.add(i.sub(e).mul(tr((0,n.float)(1).sub(t))))});var nr=(0,n.Fn)(([e,t])=>{let r=(0,n.clamp)(e,0,1);return t.add((0,n.float)(1).sub(t).mul(tr((0,n.float)(1).sub(r))))}),rr=(0,n.Fn)(([e,t])=>{let r=(0,n.clamp)(e,0,1);return t.add((0,n.vec3)(1).sub(t).mul(tr((0,n.float)(1).sub(r))))}),ir=(0,n.Fn)(([e])=>{let t=(0,n.sqrt)(e);return(0,n.vec3)(1).add(t).div((0,n.max)((0,n.vec3)(1).sub(t),(0,n.vec3)(er)))}),ar=(0,n.Fn)(([e,t])=>{let r=e.sub((0,n.vec3)(t)),i=(0,n.max)(e.add((0,n.vec3)(t)),(0,n.vec3)(er)),a=r.div(i);return a.mul(a)}),or=(0,n.Fn)(([e,t])=>{let r=e.sub(t),i=(0,n.max)(e.add(t),er),a=r.div(i);return a.mul(a)}),sr=e=>(0,n.vec3)(or(e,(0,n.float)(1))),cr=(0,n.Fn)(([e,t])=>{let r=t.mul(t),i=r.mul(r),a=e.mul(e).mul(i.sub(1)).add(1);return i.div((0,n.max)((0,n.float)(kn).mul(a).mul(a),Mn))}),lr=(0,n.Fn)(([e,t])=>{let r=(0,n.max)(t,Nn),i=r.mul(r),a=(0,n.float)(1).div(i.mul(i)),o=e.mul(e).mul(a.sub(1)).add(1);return a.div((0,n.max)((0,n.float)(kn).mul(o).mul(o),Mn))}),ur=(0,n.Fn)(([e])=>(0,n.float)(1).div((0,n.max)(e,Nn))),dr=(0,n.Fn)(([e,t])=>(0,n.clamp)((0,n.float)(1).div((0,n.max)((0,n.float)(4).mul(t.add(e).sub(t.mul(e))),Mn)),0,1)),fr=(0,n.Fn)(([e,t])=>{let r=t.mul(t),i=r.mul(r),a=e.add((0,n.sqrt)(i.add((0,n.float)(1).sub(i).mul(e.mul(e)))));return(0,n.float)(2).mul(e).div((0,n.max)(a,Mn))}),pr=(0,n.Fn)(([e,t,r])=>{let i=r.mul(r),a=i.mul(i),o=t.mul((0,n.sqrt)(a.add((0,n.float)(1).sub(a).mul(e.mul(e))))),s=e.mul((0,n.sqrt)(a.add((0,n.float)(1).sub(a).mul(t.mul(t)))));return(0,n.float)(.5).div((0,n.max)(o.add(s),Mn))}),mr=16,hr=new r.DataTexture(new Float32Array([1,.0302,.9039,1,.9712,.0898,.8635,1,.8914,.6742,.6952,1,.9176,1.1716,.5703,1,.9447,1.3763,.4529,1,.9592,1.3948,.3509,1,.9658,1.3111,.269,1,.9679,1.183,.2061,1,.9669,1.0453,.1588,1,.9639,.9156,.1237,1,.9592,.8006,.0978,1,.9533,.7013,.0786,1,.9465,.6167,.0644,1,.9388,.5447,.0537,1,.9304,.4836,.0457,1,.9214,.4314,.0395,1,1,.0026,.7082,1,.9976,.0086,.7027,1,.9605,.1171,.6408,1,.9009,.4003,.5153,1,.8888,.6973,.4009,1,.9003,.8744,.3086,1,.9117,.9308,.2352,1,.9171,.9098,.1786,1,.9163,.8501,.1361,1,.9105,.7761,.1045,1,.9007,.7008,.0813,1,.8876,.6301,.0641,1,.872,.5661,.0514,1,.8545,.5094,.0418,1,.8354,.4596,.0345,1,.8152,.416,.029,1,1,3e-4,.4889,1,.9994,.002,.4874,1,.9894,.0281,.4696,1,.9511,.1226,.4131,1,.9046,.2856,.3306,1,.8809,.4505,.2533,1,.8752,.5628,.1913,1,.8737,.6152,.1439,1,.8693,.6237,.1084,1,.8596,.6057,.0821,1,.8444,.5742,.0629,1,.8245,.537,.0487,1,.8007,.4985,.0382,1,.7739,.4613,.0303,1,.745,.4264,.0244,1,.7147,.3943,.0199,1,1,0,.3277,1,.9999,7e-4,.3272,1,.9955,.0104,.3205,1,.9751,.0486,.2969,1,.9352,.129,.2521,1,.8955,.2363,.1989,1,.8698,.3371,.1513,1,.8545,.4098,.1136,1,.8416,.4511,.085,1,.8258,.4674,.0639,1,.805,.4664,.0484,1,.7792,.4547,.0369,1,.7489,.437,.0285,1,.7152,.4164,.0223,1,.6791,.3948,.0176,1,.6416,.3732,.014,1,1,0,.2121,1,.9999,0,.2119,1,.9976,.0047,.2095,1,.9854,.0224,.1999,1,.9564,.0638,.1784,1,.9163,.1289,.1472,1,.8792,.2046,.1149,1,.8508,.2736,.0871,1,.8274,.3262,.0653,1,.8038,.3603,.0489,1,.7767,.3787,.0368,1,.745,.3853,.0278,1,.7089,.3836,.0213,1,.6693,.3766,.0164,1,.6275,.3662,.0127,1,.5845,.3541,.01,1,1,0,.1317,1,1,0,.1317,1,.9985,.0025,.1311,1,.9904,.0121,.1277,1,.9694,.0356,.1186,1,.9343,.0766,.1026,1,.8935,.1309,.0831,1,.8558,.1889,.0644,1,.8226,.241,.0488,1,.7906,.2821,.0366,1,.7566,.3112,.0275,1,.7188,.3296,.0207,1,.6771,.3395,.0157,1,.6322,.343,.012,1,.5854,.342,.0092,1,.5379,.338,.0071,1,1,0,.0778,1,1,0,.0778,1,.999,.0015,.0779,1,.9931,.0073,.0773,1,.9774,.022,.0743,1,.9481,.049,.0673,1,.9079,.0883,.0569,1,.8651,.1349,.0456,1,.8239,.182,.0352,1,.7839,.2242,.0267,1,.7427,.2585,.0201,1,.6986,.2844,.0152,1,.6513,.3026,.0114,1,.6014,.3144,.0087,1,.5501,.3212,.0066,1,.4989,.3243,.0051,1,1,0,.0432,1,1,0,.0432,1,.9992,.001,.0435,1,.9947,.0048,.044,1,.9826,.0145,.0437,1,.9582,.0333,.0415,1,.9208,.0622,.0368,1,.876,.0993,.0307,1,.8291,.1403,.0244,1,.7818,.1806,.0189,1,.7336,.2168,.0144,1,.6832,.2471,.0109,1,.6303,.2712,.0082,1,.5755,.2895,.0062,1,.5201,.3029,.0047,1,.4656,.3123,.0036,1,1,0,.0221,1,1,0,.0222,1,.9995,7e-4,.0225,1,.9958,.0033,.0232,1,.986,.0102,.0239,1,.9656,.0237,.0238,1,.9316,.0454,.0224,1,.8869,.075,.0196,1,.8363,.1101,.0162,1,.7831,.1473,.0128,1,.7282,.1833,.0099,1,.6715,.216,.0076,1,.613,.2442,.0057,1,.5535,.2676,.0043,1,.4942,.2866,.0033,1,.4368,.3017,.0025,1,1,0,.0102,1,1,0,.0103,1,.9998,4e-4,.0105,1,.9965,.0024,.0111,1,.9884,.0074,.012,1,.971,.0175,.0127,1,.9404,.0342,.0126,1,.8971,.058,.0117,1,.8446,.0879,.0101,1,.7867,.1215,.0083,1,.7258,.1562,.0066,1,.6629,.1898,.0051,1,.5988,.2207,.0039,1,.5345,.2482,.003,1,.4716,.2719,.0022,1,.4115,.2922,.0017,1,1,0,.0041,1,1,0,.0041,1,.9999,3e-4,.0043,1,.997,.0018,.0047,1,.9901,.0056,.0054,1,.9751,.0133,.0061,1,.9476,.0265,.0065,1,.9063,.0458,.0065,1,.8531,.0712,.0059,1,.7918,.1013,.0051,1,.7256,.1341,.0041,1,.6568,.1676,.0033,1,.5871,.2002,.0025,1,.5182,.2308,.0019,1,.4517,.2586,.0015,1,.3891,.2836,.0011,1,1,0,.0013,1,1,0,.0014,1,.9999,2e-4,.0014,1,.9974,.0014,.0017,1,.9913,.0043,.0021,1,.9783,.0104,.0026,1,.9534,.021,.003,1,.9143,.0369,.0033,1,.8615,.0585,.0032,1,.7979,.0852,.0029,1,.7271,.1159,.0024,1,.6528,.1487,.002,1,.5776,.1822,.0016,1,.504,.2151,.0012,1,.4339,.2465,9e-4,1,.3692,.2758,7e-4,1,1,0,3e-4,1,1,0,3e-4,1,1,1e-4,4e-4,1,.9977,.001,5e-4,1,.9923,.0034,7e-4,1,.9807,.0083,.001,1,.9581,.0169,.0012,1,.9214,.0301,.0015,1,.8695,.0486,.0015,1,.8044,.0724,.0015,1,.7299,.1007,.0013,1,.6504,.1325,.0011,1,.5699,.1663,9e-4,1,.4916,.201,7e-4,1,.4181,.2353,6e-4,1,.3513,.2686,4e-4,1,1,0,0,1,1,0,0,1,1,0,1e-4,1,.9979,8e-4,1e-4,1,.993,.0028,2e-4,1,.9826,.0068,3e-4,1,.9619,.0139,4e-4,1,.9274,.025,6e-4,1,.8769,.0409,6e-4,1,.8112,.062,7e-4,1,.7337,.0881,6e-4,1,.6495,.1185,5e-4,1,.5637,.1522,5e-4,1,.4808,.1881,4e-4,1,.4039,.225,3e-4,1,.335,.2619,2e-4,1,1,0,0,1,1,0,0,1,1,0,0,1,.998,6e-4,0,1,.9936,.0023,0,1,.9841,.0056,1e-4,1,.9651,.0115,1e-4,1,.9327,.021,2e-4,1,.8837,.0348,2e-4,1,.8179,.0535,2e-4,1,.7381,.0775,2e-4,1,.6497,.1064,2e-4,1,.5589,.1396,2e-4,1,.4713,.1763,2e-4,1,.3911,.2154,1e-4,1,.3203,.2557,1e-4,1,1,0,0,1,1,0,0,1,1,0,0,1,.998,5e-4,0,1,.9939,.0019,0,1,.9854,.0047,0,1,.9677,.0097,0,1,.9372,.0178,0,1,.8899,.0298,0,1,.8245,.0466,0,1,.743,.0685,0,1,.6508,.0959,0,1,.5552,.1284,0,1,.4631,.1656,0,1,.3794,.2065,0,1,.3069,.25,0,1]),mr,mr,r.RGBAFormat,r.FloatType);hr.minFilter=r.LinearFilter,hr.magFilter=r.LinearFilter,hr.wrapS=r.ClampToEdgeWrapping,hr.wrapT=r.ClampToEdgeWrapping,hr.generateMipmaps=!1,hr.needsUpdate=!0;var gr=(0,n.texture)(hr);gr.setUpdateMatrix(!1);var _r=(e,t)=>(0,n.vec2)(e,t).mul((mr-1)/mr).add(.5/mr),vr=(0,n.Fn)(([e,t])=>(0,n.clamp)(gr.sample(_r(t,e)).g,0,1)),yr=(0,n.Fn)(([e,t,r])=>{let i=gr.sample(_r(r,t)).toVar(),a=(0,n.max)(i.r,.05).toVar(),o=(0,n.clamp)(i.b,0,1).toVar(),s=(0,n.max)(a.sub(o),0),c=(0,n.vec3)(1).add(e.mul((0,n.float)(1).div(a).sub(1)));return wn({compensation:c,E_total:(0,n.clamp)((0,n.max)(e.mul(s).add((0,n.vec3)(o)),(0,n.vec3)(0)).mul(c),(0,n.vec3)(0),(0,n.vec3)(1))})}),br=(0,n.Fn)(([e,t,r])=>{let i=cr(e,r),a=fr(t,r);return i.mul(a).div((0,n.max)(t.mul(4),Mn))}),xr=(0,n.Fn)(([e,t])=>{let r=(0,n.max)(e.mul(e),1e-4).toVar();return(0,n.vec2)((0,n.max)((0,n.mix)(r,(0,n.float)(1),t.mul(t)),1e-4),r)}),Sr=(0,n.Fn)(([e,t,r,i,a])=>{let o=e.mul(t),s=(0,n.vec3)(t.mul(i),e.mul(a),o.mul(r)),c=(0,n.max)((0,n.dot)(s,s),Mn),l=o.div(c);return o.mul(l.mul(l)).div(kn)}),Cr=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=c.mul((0,n.vec3)(e.mul(r),t.mul(i),s).length()),u=s.mul((0,n.vec3)(e.mul(a),t.mul(o),c).length());return(0,n.float)(.5).div((0,n.max)(l.add(u),Mn))}),wr=(0,n.Fn)(([e,t,r,i,a])=>{let o=e.mul(r),s=t.mul(i),c=o.mul(o).add(s.mul(s)),l=(0,n.max)(a.mul(a),Mn),u=(0,n.sqrt)((0,n.float)(1).add(c.div(l))).sub(1).mul(.5);return(0,n.float)(1).div(u.add(1))}),Tr=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=Sr(e,t,r,i,a),u=wr(e,t,s,c,o);return l.mul(u).div((0,n.max)(o.mul(4),Mn))}),Er=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(jn).mul(e).mul(1e-9),i=(0,n.vec3)(54856e-17,44201e-17,52481e-17),a=(0,n.vec3)(1681e3,1795300,2208400),o=(0,n.vec3)(43278e5,93046e5,66121e5),s=i.mul((0,n.sqrt)((0,n.float)(jn).mul(o))).mul((0,n.cos)(a.mul(r).add(t))).mul((0,n.exp)(zn({x:r}).negate().mul(o))).toVar();return s.x.addAssign((0,n.float)(9747e-17).mul((0,n.sqrt)((0,n.float)(jn).mul(45282e5))).mul((0,n.cos)((0,n.float)(2239900).mul(r).add(t.x))).mul((0,n.exp)((0,n.float)(-45282e5).mul(zn({x:r}))))),Rn.mul(s.div(1.0685e-7))}),Dr=(0,n.Fn)(([e,t,r,i,a])=>{let o=(0,n.mix)(e,t,(0,n.smoothstep)(0,.03,i)).toVar(),s=zn({x:e.div(o)}).mul((0,n.float)(1).sub(zn({x:r}))),c=(0,n.float)(1).sub(s).toVar(),l=(0,n.vec3)(0).toVar();return(0,n.If)(c.lessThan(0),()=>{l.assign((0,n.vec3)(1))}).Else(()=>{let t=(0,n.sqrt)(c).toVar(),s=nr(r,or(o,e)).toVar(),u=(0,n.float)(1).sub(s).toVar(),d=o.lessThan(e).select((0,n.float)(kn),(0,n.float)(0)),f=(0,n.float)(kn).sub(d),p=ir((0,n.clamp)(a,0,.9999)).toVar(),m=ar(p,o).toVar(),h=(0,n.vec3)(nr(t,m.x),nr(t,m.y),nr(t,m.z)).toVar(),g=(0,n.vec3)(p.x.lessThan(o).select((0,n.float)(kn),(0,n.float)(0)),p.y.lessThan(o).select((0,n.float)(kn),(0,n.float)(0)),p.z.lessThan(o).select((0,n.float)(kn),(0,n.float)(0))),_=(0,n.float)(2).mul(o).mul(i).mul(t).toVar(),v=(0,n.vec3)(f).add(g).toVar(),y=(0,n.clamp)((0,n.vec3)(s).mul(h),1e-5,.9999).toVar(),b=(0,n.sqrt)(y).toVar(),x=(0,n.vec3)(u.mul(u)).mul(h).div((0,n.vec3)(1).sub(y)).toVar(),S=(0,n.vec3)(s).add(x).toVar().toVar(),C=x.sub((0,n.vec3)(u)).toVar();C.mulAssign(b),S.addAssign(C.mul((0,n.float)(2).mul(Er((0,n.float)(1).mul(_),(0,n.float)(1).mul(v))))),C.mulAssign(b),S.addAssign(C.mul((0,n.float)(2).mul(Er((0,n.float)(2).mul(_),(0,n.float)(2).mul(v))))),l.assign((0,n.max)(S,(0,n.vec3)(0)))}),l}),Or=(0,n.Fn)(([e,t,r])=>{let i=r.invRoughness,a=r.metalFactor,o=(0,n.float)(0).toVar();(0,n.If)(t.isMetallic,()=>{o.assign((0,n.max)(i.mul(a),.7))}).ElseIf(t.isSmooth,()=>{o.assign(i.mul(a).mul(1.2))}).Else(()=>{o.assign((0,n.max)(i.mul(a),e.metalness.mul(.1)))});let s=o.mul(e.specularIntensity).toVar(),c=(0,n.float)(1).sub(o).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).toVar(),l=e.sheen.mul(r.maxSheenColor).toVar(),u=(0,n.float)(0).toVar();(0,n.If)(t.hasClearcoat,()=>{u.assign(e.clearcoat.mul(i).mul(.4))}).Else(()=>{u.assign(e.clearcoat.mul(i).mul(.35))});let d=(0,n.float)(0).toVar();(0,n.If)(t.isTransmissive,()=>{let t=r.iorFactor.mul(i).mul(.8);d.assign(e.transmission.mul(t).mul((0,n.float)(.6).add((0,n.float)(.4).mul(e.ior.div(2)))).mul((0,n.float)(1).add(e.dispersion.mul(.6))))}).Else(()=>{let t=r.iorFactor.mul(i).mul(.7);d.assign(e.transmission.mul(t).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.ior.div(2)))).mul((0,n.float)(1).add(e.dispersion.mul(.5))))});let f=i.mul(t.isSmooth.select((0,n.float)(.6),(0,n.float)(.5))),p=(0,n.min)(e.iridescence.mul(f).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.iridescenceThicknessRange.y.sub(e.iridescenceThicknessRange.x).div(1e3)))).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.iridescenceIOR.div(2)))),c);s.addAssign(p),c.subAssign(p);let m=s.add(c).add(l).add(u).add(d),h=(0,n.float)(1).div((0,n.max)(m,.001));return xn({specular:s.mul(h),diffuse:c.mul(h),sheen:l.mul(h),clearcoat:u.mul(h),transmission:d.mul(h),iridescence:(0,n.float)(0)})}),kr=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();return(0,n.If)(r.NoL.greaterThan(0),()=>{i.addAssign(t.diffuse.mul(r.NoL).mul(An));let a=(0,n.float)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let t=xr(e.roughness,e.anisotropy);a.assign(Tr(t.x,t.y,r.NoH,r.ToH,r.BoH,r.NoV,r.ToV,r.BoV))}).Else(()=>{a.assign(br(r.NoH,r.NoV,e.roughness))}),i.addAssign(t.specular.mul(a)),(0,n.If)(t.sheen.greaterThan(0),()=>{let a=lr(r.NoH,e.sheenRoughness).mul(r.NoH).div((0,n.max)((0,n.float)(4).mul(r.VoH),Mn));i.addAssign(t.sheen.mul(a))}),(0,n.If)(t.clearcoat.greaterThan(0),()=>{let a=(0,n.clamp)(e.clearcoatRoughness,Pn,1);i.addAssign(t.clearcoat.mul(br(r.NoH,r.NoV,a)))})}),i}),Ar=(0,n.Fn)(([e])=>Or(e,En.wrap(Yn(e.metalness,e.roughness,e.transmission,e.clearcoat,e.emissive,e.subsurface)),On({invRoughness:(0,n.float)(1).sub(e.roughness),metalFactor:(0,n.float)(.5).add((0,n.float)(.5).mul(e.metalness)),iorFactor:(0,n.min)((0,n.float)(2).div(e.ior),1),maxSheenColor:(0,n.max)(e.sheenColor.x,(0,n.max)(e.sheenColor.y,e.sheenColor.z))}))),jr=(0,n.Fn)(([e,t])=>kr(e,xn.wrap(Ar(e)),t)),Mr=(0,n.wgslFn)(`
|
|
244
|
+
`),ar=(0,n.Fn)(([e,t])=>{let r=Z(t,e,(0,n.int)(X.COLOR_METALNESS),(0,n.int)(Y)).toVar(),i=Z(t,e,(0,n.int)(X.EMISSIVE_ROUGHNESS),(0,n.int)(Y)).toVar(),a=Z(t,e,(0,n.int)(X.IOR_TRANSMISSION),(0,n.int)(Y)).toVar(),o=Z(t,e,(0,n.int)(X.ATTENUATION),(0,n.int)(Y)).toVar(),s=Z(t,e,(0,n.int)(X.DISPERSION_SHEEN),(0,n.int)(Y)).toVar(),c=Z(t,e,(0,n.int)(X.SHEEN_COLOR),(0,n.int)(Y)).toVar(),l=Z(t,e,(0,n.int)(X.SPECULAR),(0,n.int)(Y)).toVar(),u=Z(t,e,(0,n.int)(X.IRIDESCENCE),(0,n.int)(Y)).toVar(),d=Z(t,e,(0,n.int)(X.MAP_INDICES_A),(0,n.int)(Y)).toVar(),f=Z(t,e,(0,n.int)(X.MAP_INDICES_B),(0,n.int)(Y)).toVar(),p=Z(t,e,(0,n.int)(X.OPACITY_ALPHA),(0,n.int)(Y)).toVar(),m=Z(t,e,(0,n.int)(X.ALPHA_MODE),(0,n.int)(Y)).toVar(),h=Z(t,e,(0,n.int)(X.BUMP_DISPLACEMENT),(0,n.int)(Y)).toVar(),g=Z(t,e,(0,n.int)(X.ALBEDO_TRANSFORM_A),(0,n.int)(Y)).toVar(),_=Z(t,e,(0,n.int)(X.ALBEDO_TRANSFORM_B),(0,n.int)(Y)).toVar(),v=Z(t,e,(0,n.int)(X.NORMAL_TRANSFORM_A),(0,n.int)(Y)).toVar(),y=Z(t,e,(0,n.int)(X.NORMAL_TRANSFORM_B),(0,n.int)(Y)).toVar(),b=Z(t,e,(0,n.int)(X.ROUGHNESS_TRANSFORM_A),(0,n.int)(Y)).toVar(),x=Z(t,e,(0,n.int)(X.ROUGHNESS_TRANSFORM_B),(0,n.int)(Y)).toVar(),S=Z(t,e,(0,n.int)(X.METALNESS_TRANSFORM_A),(0,n.int)(Y)).toVar(),C=Z(t,e,(0,n.int)(X.METALNESS_TRANSFORM_B),(0,n.int)(Y)).toVar(),w=Z(t,e,(0,n.int)(X.EMISSIVE_TRANSFORM_A),(0,n.int)(Y)).toVar(),T=Z(t,e,(0,n.int)(X.EMISSIVE_TRANSFORM_B),(0,n.int)(Y)).toVar(),E=Z(t,e,(0,n.int)(X.BUMP_TRANSFORM_A),(0,n.int)(Y)).toVar(),D=Z(t,e,(0,n.int)(X.BUMP_TRANSFORM_B),(0,n.int)(Y)).toVar(),O=Z(t,e,(0,n.int)(X.DISPLACEMENT_TRANSFORM_A),(0,n.int)(Y)).toVar(),k=Z(t,e,(0,n.int)(X.DISPLACEMENT_TRANSFORM_B),(0,n.int)(Y)).toVar(),A=Z(t,e,(0,n.int)(X.SUBSURFACE_A),(0,n.int)(Y)).toVar(),j=Z(t,e,(0,n.int)(X.SUBSURFACE_B),(0,n.int)(Y)).toVar(),M=Z(t,e,(0,n.int)(X.SUBSURFACE_C),(0,n.int)(Y)).toVar(),N=Z(t,e,(0,n.int)(X.EXT_MAP_INDICES_A),(0,n.int)(Y)).toVar(),P=Z(t,e,(0,n.int)(X.EXT_MAP_INDICES_B),(0,n.int)(Y)).toVar(),F=Z(t,e,(0,n.int)(X.EXT_MAP_INDICES_C),(0,n.int)(Y)).toVar();return bn({color:(0,n.vec4)(r.rgb,1),metalness:r.a,emissive:i.rgb,roughness:i.a,ior:a.r,transmission:a.g,thickness:a.b,emissiveIntensity:a.a,attenuationColor:o.rgb,attenuationDistance:o.a,dispersion:s.r,sheen:s.b,sheenRoughness:s.a,sheenColor:c.rgb,specularIntensity:l.r,specularColor:l.gba,iridescence:u.r,iridescenceIOR:u.g,iridescenceThicknessRange:u.ba,subsurfaceColor:A.rgb,subsurface:A.a,subsurfaceRadius:j.rgb,subsurfaceRadiusScale:j.a,subsurfaceAnisotropy:M.r,anisotropy:M.g,anisotropyRotation:M.b,anisotropyMapIndex:(0,n.int)(M.a),transmissionMapIndex:(0,n.int)(N.r),clearcoatMapIndex:(0,n.int)(N.g),clearcoatRoughnessMapIndex:(0,n.int)(N.b),sheenColorMapIndex:(0,n.int)(N.a),sheenRoughnessMapIndex:(0,n.int)(P.r),iridescenceMapIndex:(0,n.int)(P.g),iridescenceThicknessMapIndex:(0,n.int)(P.b),specularIntensityMapIndex:(0,n.int)(P.a),specularColorMapIndex:(0,n.int)(F.r),albedoMapIndex:(0,n.int)(d.r),normalMapIndex:(0,n.int)(d.g),roughnessMapIndex:(0,n.int)(d.b),metalnessMapIndex:(0,n.int)(d.a),emissiveMapIndex:(0,n.int)(f.r),bumpMapIndex:(0,n.int)(f.g),clearcoat:f.b,clearcoatRoughness:f.a,opacity:p.r,side:(0,n.int)(p.g),transparent:p.b,alphaTest:p.a,alphaMode:(0,n.int)(m.r),depthWrite:(0,n.int)(m.g),normalScale:(0,n.vec2)(m.b,m.b),bumpScale:h.r,displacementScale:h.g,displacementMapIndex:(0,n.int)(h.b),albedoTransform:ir({data1:g,data2:_}),normalTransform:ir({data1:v,data2:y}),roughnessTransform:ir({data1:b,data2:x}),metalnessTransform:ir({data1:S,data2:C}),emissiveTransform:ir({data1:w,data2:T}),bumpTransform:ir({data1:E,data2:D}),displacementTransform:ir({data1:O,data2:k})})}),or=(0,n.Fn)(()=>{let e=(0,n.mat3)(1,0,0,0,1,0,0,0,1);return bn({color:(0,n.vec4)(1,1,1,1),emissive:(0,n.vec3)(0),emissiveIntensity:(0,n.float)(0),roughness:(0,n.float)(1),metalness:(0,n.float)(0),ior:(0,n.float)(1.5),transmission:(0,n.float)(0),thickness:(0,n.float)(0),clearcoat:(0,n.float)(0),clearcoatRoughness:(0,n.float)(0),opacity:(0,n.float)(1),transparent:(0,n.float)(0),attenuationColor:(0,n.vec3)(1),attenuationDistance:(0,n.float)(0),dispersion:(0,n.float)(0),sheen:(0,n.float)(0),sheenRoughness:(0,n.float)(1),sheenColor:(0,n.vec3)(0),specularIntensity:(0,n.float)(1),specularColor:(0,n.vec3)(1),alphaTest:(0,n.float)(0),alphaMode:(0,n.int)(0),side:(0,n.int)(0),depthWrite:(0,n.int)(1),albedoMapIndex:(0,n.int)(-1),emissiveMapIndex:(0,n.int)(-1),normalMapIndex:(0,n.int)(-1),bumpMapIndex:(0,n.int)(-1),bumpScale:(0,n.float)(1),displacementScale:(0,n.float)(0),metalnessMapIndex:(0,n.int)(-1),roughnessMapIndex:(0,n.int)(-1),displacementMapIndex:(0,n.int)(-1),normalScale:(0,n.vec2)(1,1),albedoTransform:e,emissiveTransform:e,normalTransform:e,bumpTransform:e,metalnessTransform:e,roughnessTransform:e,displacementTransform:e,iridescence:(0,n.float)(0),iridescenceIOR:(0,n.float)(1.3),iridescenceThicknessRange:(0,n.vec2)(100,400),subsurface:(0,n.float)(0),subsurfaceColor:(0,n.vec3)(1),subsurfaceRadius:(0,n.vec3)(1,.2,.1),subsurfaceRadiusScale:(0,n.float)(1),subsurfaceAnisotropy:(0,n.float)(0),anisotropy:(0,n.float)(0),anisotropyRotation:(0,n.float)(0),anisotropyMapIndex:(0,n.int)(-1),transmissionMapIndex:(0,n.int)(-1),clearcoatMapIndex:(0,n.int)(-1),clearcoatRoughnessMapIndex:(0,n.int)(-1),sheenColorMapIndex:(0,n.int)(-1),sheenRoughnessMapIndex:(0,n.int)(-1),iridescenceMapIndex:(0,n.int)(-1),iridescenceThicknessMapIndex:(0,n.int)(-1),specularIntensityMapIndex:(0,n.int)(-1),specularColorMapIndex:(0,n.int)(-1)})}),sr=(0,n.Fn)(([e,t])=>{let r=Z(t,e,(0,n.int)(X.IOR_TRANSMISSION),(0,n.int)(Y)).toVar(),i=Z(t,e,(0,n.int)(X.ATTENUATION),(0,n.int)(Y)).toVar(),a=Z(t,e,(0,n.int)(X.MAP_INDICES_A),(0,n.int)(Y)).toVar(),o=Z(t,e,(0,n.int)(X.OPACITY_ALPHA),(0,n.int)(Y)).toVar(),s=Z(t,e,(0,n.int)(X.ALPHA_MODE),(0,n.int)(Y)).toVar(),c=Z(t,e,(0,n.int)(X.ALBEDO_TRANSFORM_A),(0,n.int)(Y)).toVar(),l=Z(t,e,(0,n.int)(X.ALBEDO_TRANSFORM_B),(0,n.int)(Y)).toVar();return Sn({color:(0,n.vec4)(1),ior:r.r,transmission:r.g,attenuationColor:i.rgb,attenuationDistance:i.a,albedoMapIndex:(0,n.int)(a.r),opacity:o.r,transparent:o.b,alphaTest:o.a,alphaMode:(0,n.int)(s.r),albedoTransform:ir({data1:c,data2:l})})}),cr=1e-6,lr=e=>{let t=e.mul(e);return t.mul(t).mul(e)};(0,n.Fn)(([e,t,r])=>{let i=(0,n.max)((0,n.vec3)((0,n.float)(1).sub(r)),e);return e.add(i.sub(e).mul(lr((0,n.float)(1).sub(t))))});var ur=(0,n.Fn)(([e,t])=>{let r=(0,n.clamp)(e,0,1);return t.add((0,n.float)(1).sub(t).mul(lr((0,n.float)(1).sub(r))))}),dr=(0,n.Fn)(([e,t])=>{let r=(0,n.clamp)(e,0,1);return t.add((0,n.vec3)(1).sub(t).mul(lr((0,n.float)(1).sub(r))))}),fr=(0,n.Fn)(([e])=>{let t=(0,n.sqrt)(e);return(0,n.vec3)(1).add(t).div((0,n.max)((0,n.vec3)(1).sub(t),(0,n.vec3)(cr)))}),pr=(0,n.Fn)(([e,t])=>{let r=e.sub((0,n.vec3)(t)),i=(0,n.max)(e.add((0,n.vec3)(t)),(0,n.vec3)(cr)),a=r.div(i);return a.mul(a)}),mr=(0,n.Fn)(([e,t])=>{let r=e.sub(t),i=(0,n.max)(e.add(t),cr),a=r.div(i);return a.mul(a)}),hr=e=>(0,n.vec3)(mr(e,(0,n.float)(1))),gr=(0,n.Fn)(([e,t])=>{let r=t.mul(t),i=r.mul(r),a=e.mul(e).mul(i.sub(1)).add(1);return i.div((0,n.max)((0,n.float)(Pn).mul(a).mul(a),Ln))}),_r=(0,n.Fn)(([e,t])=>{let r=(0,n.max)(t,Rn),i=r.mul(r),a=(0,n.float)(1).div(i.mul(i)),o=e.mul(e).mul(a.sub(1)).add(1);return a.div((0,n.max)((0,n.float)(Pn).mul(o).mul(o),Ln))}),vr=(0,n.Fn)(([e])=>(0,n.float)(1).div((0,n.max)(e,Rn))),yr=(0,n.Fn)(([e,t])=>(0,n.clamp)((0,n.float)(1).div((0,n.max)((0,n.float)(4).mul(t.add(e).sub(t.mul(e))),Ln)),0,1)),br=(0,n.Fn)(([e,t])=>{let r=t.mul(t),i=r.mul(r),a=e.add((0,n.sqrt)(i.add((0,n.float)(1).sub(i).mul(e.mul(e)))));return(0,n.float)(2).mul(e).div((0,n.max)(a,Ln))}),xr=(0,n.Fn)(([e,t,r])=>{let i=r.mul(r),a=i.mul(i),o=t.mul((0,n.sqrt)(a.add((0,n.float)(1).sub(a).mul(e.mul(e))))),s=e.mul((0,n.sqrt)(a.add((0,n.float)(1).sub(a).mul(t.mul(t)))));return(0,n.float)(.5).div((0,n.max)(o.add(s),Ln))}),Sr=16,Cr=new r.DataTexture(new Float32Array([1,.0302,.9039,1,.9712,.0898,.8635,1,.8914,.6742,.6952,1,.9176,1.1716,.5703,1,.9447,1.3763,.4529,1,.9592,1.3948,.3509,1,.9658,1.3111,.269,1,.9679,1.183,.2061,1,.9669,1.0453,.1588,1,.9639,.9156,.1237,1,.9592,.8006,.0978,1,.9533,.7013,.0786,1,.9465,.6167,.0644,1,.9388,.5447,.0537,1,.9304,.4836,.0457,1,.9214,.4314,.0395,1,1,.0026,.7082,1,.9976,.0086,.7027,1,.9605,.1171,.6408,1,.9009,.4003,.5153,1,.8888,.6973,.4009,1,.9003,.8744,.3086,1,.9117,.9308,.2352,1,.9171,.9098,.1786,1,.9163,.8501,.1361,1,.9105,.7761,.1045,1,.9007,.7008,.0813,1,.8876,.6301,.0641,1,.872,.5661,.0514,1,.8545,.5094,.0418,1,.8354,.4596,.0345,1,.8152,.416,.029,1,1,3e-4,.4889,1,.9994,.002,.4874,1,.9894,.0281,.4696,1,.9511,.1226,.4131,1,.9046,.2856,.3306,1,.8809,.4505,.2533,1,.8752,.5628,.1913,1,.8737,.6152,.1439,1,.8693,.6237,.1084,1,.8596,.6057,.0821,1,.8444,.5742,.0629,1,.8245,.537,.0487,1,.8007,.4985,.0382,1,.7739,.4613,.0303,1,.745,.4264,.0244,1,.7147,.3943,.0199,1,1,0,.3277,1,.9999,7e-4,.3272,1,.9955,.0104,.3205,1,.9751,.0486,.2969,1,.9352,.129,.2521,1,.8955,.2363,.1989,1,.8698,.3371,.1513,1,.8545,.4098,.1136,1,.8416,.4511,.085,1,.8258,.4674,.0639,1,.805,.4664,.0484,1,.7792,.4547,.0369,1,.7489,.437,.0285,1,.7152,.4164,.0223,1,.6791,.3948,.0176,1,.6416,.3732,.014,1,1,0,.2121,1,.9999,0,.2119,1,.9976,.0047,.2095,1,.9854,.0224,.1999,1,.9564,.0638,.1784,1,.9163,.1289,.1472,1,.8792,.2046,.1149,1,.8508,.2736,.0871,1,.8274,.3262,.0653,1,.8038,.3603,.0489,1,.7767,.3787,.0368,1,.745,.3853,.0278,1,.7089,.3836,.0213,1,.6693,.3766,.0164,1,.6275,.3662,.0127,1,.5845,.3541,.01,1,1,0,.1317,1,1,0,.1317,1,.9985,.0025,.1311,1,.9904,.0121,.1277,1,.9694,.0356,.1186,1,.9343,.0766,.1026,1,.8935,.1309,.0831,1,.8558,.1889,.0644,1,.8226,.241,.0488,1,.7906,.2821,.0366,1,.7566,.3112,.0275,1,.7188,.3296,.0207,1,.6771,.3395,.0157,1,.6322,.343,.012,1,.5854,.342,.0092,1,.5379,.338,.0071,1,1,0,.0778,1,1,0,.0778,1,.999,.0015,.0779,1,.9931,.0073,.0773,1,.9774,.022,.0743,1,.9481,.049,.0673,1,.9079,.0883,.0569,1,.8651,.1349,.0456,1,.8239,.182,.0352,1,.7839,.2242,.0267,1,.7427,.2585,.0201,1,.6986,.2844,.0152,1,.6513,.3026,.0114,1,.6014,.3144,.0087,1,.5501,.3212,.0066,1,.4989,.3243,.0051,1,1,0,.0432,1,1,0,.0432,1,.9992,.001,.0435,1,.9947,.0048,.044,1,.9826,.0145,.0437,1,.9582,.0333,.0415,1,.9208,.0622,.0368,1,.876,.0993,.0307,1,.8291,.1403,.0244,1,.7818,.1806,.0189,1,.7336,.2168,.0144,1,.6832,.2471,.0109,1,.6303,.2712,.0082,1,.5755,.2895,.0062,1,.5201,.3029,.0047,1,.4656,.3123,.0036,1,1,0,.0221,1,1,0,.0222,1,.9995,7e-4,.0225,1,.9958,.0033,.0232,1,.986,.0102,.0239,1,.9656,.0237,.0238,1,.9316,.0454,.0224,1,.8869,.075,.0196,1,.8363,.1101,.0162,1,.7831,.1473,.0128,1,.7282,.1833,.0099,1,.6715,.216,.0076,1,.613,.2442,.0057,1,.5535,.2676,.0043,1,.4942,.2866,.0033,1,.4368,.3017,.0025,1,1,0,.0102,1,1,0,.0103,1,.9998,4e-4,.0105,1,.9965,.0024,.0111,1,.9884,.0074,.012,1,.971,.0175,.0127,1,.9404,.0342,.0126,1,.8971,.058,.0117,1,.8446,.0879,.0101,1,.7867,.1215,.0083,1,.7258,.1562,.0066,1,.6629,.1898,.0051,1,.5988,.2207,.0039,1,.5345,.2482,.003,1,.4716,.2719,.0022,1,.4115,.2922,.0017,1,1,0,.0041,1,1,0,.0041,1,.9999,3e-4,.0043,1,.997,.0018,.0047,1,.9901,.0056,.0054,1,.9751,.0133,.0061,1,.9476,.0265,.0065,1,.9063,.0458,.0065,1,.8531,.0712,.0059,1,.7918,.1013,.0051,1,.7256,.1341,.0041,1,.6568,.1676,.0033,1,.5871,.2002,.0025,1,.5182,.2308,.0019,1,.4517,.2586,.0015,1,.3891,.2836,.0011,1,1,0,.0013,1,1,0,.0014,1,.9999,2e-4,.0014,1,.9974,.0014,.0017,1,.9913,.0043,.0021,1,.9783,.0104,.0026,1,.9534,.021,.003,1,.9143,.0369,.0033,1,.8615,.0585,.0032,1,.7979,.0852,.0029,1,.7271,.1159,.0024,1,.6528,.1487,.002,1,.5776,.1822,.0016,1,.504,.2151,.0012,1,.4339,.2465,9e-4,1,.3692,.2758,7e-4,1,1,0,3e-4,1,1,0,3e-4,1,1,1e-4,4e-4,1,.9977,.001,5e-4,1,.9923,.0034,7e-4,1,.9807,.0083,.001,1,.9581,.0169,.0012,1,.9214,.0301,.0015,1,.8695,.0486,.0015,1,.8044,.0724,.0015,1,.7299,.1007,.0013,1,.6504,.1325,.0011,1,.5699,.1663,9e-4,1,.4916,.201,7e-4,1,.4181,.2353,6e-4,1,.3513,.2686,4e-4,1,1,0,0,1,1,0,0,1,1,0,1e-4,1,.9979,8e-4,1e-4,1,.993,.0028,2e-4,1,.9826,.0068,3e-4,1,.9619,.0139,4e-4,1,.9274,.025,6e-4,1,.8769,.0409,6e-4,1,.8112,.062,7e-4,1,.7337,.0881,6e-4,1,.6495,.1185,5e-4,1,.5637,.1522,5e-4,1,.4808,.1881,4e-4,1,.4039,.225,3e-4,1,.335,.2619,2e-4,1,1,0,0,1,1,0,0,1,1,0,0,1,.998,6e-4,0,1,.9936,.0023,0,1,.9841,.0056,1e-4,1,.9651,.0115,1e-4,1,.9327,.021,2e-4,1,.8837,.0348,2e-4,1,.8179,.0535,2e-4,1,.7381,.0775,2e-4,1,.6497,.1064,2e-4,1,.5589,.1396,2e-4,1,.4713,.1763,2e-4,1,.3911,.2154,1e-4,1,.3203,.2557,1e-4,1,1,0,0,1,1,0,0,1,1,0,0,1,.998,5e-4,0,1,.9939,.0019,0,1,.9854,.0047,0,1,.9677,.0097,0,1,.9372,.0178,0,1,.8899,.0298,0,1,.8245,.0466,0,1,.743,.0685,0,1,.6508,.0959,0,1,.5552,.1284,0,1,.4631,.1656,0,1,.3794,.2065,0,1,.3069,.25,0,1]),Sr,Sr,r.RGBAFormat,r.FloatType);Cr.minFilter=r.LinearFilter,Cr.magFilter=r.LinearFilter,Cr.wrapS=r.ClampToEdgeWrapping,Cr.wrapT=r.ClampToEdgeWrapping,Cr.generateMipmaps=!1,Cr.needsUpdate=!0;var wr=(0,n.texture)(Cr);wr.setUpdateMatrix(!1);var Tr=(e,t)=>(0,n.vec2)(e,t).mul((Sr-1)/Sr).add(.5/Sr),Er=(0,n.Fn)(([e,t])=>(0,n.clamp)(wr.sample(Tr(t,e)).g,0,1)),Dr=(0,n.Fn)(([e,t,r])=>{let i=wr.sample(Tr(r,t)).toVar(),a=(0,n.max)(i.r,.05).toVar(),o=(0,n.clamp)(i.b,0,1).toVar(),s=(0,n.max)(a.sub(o),0),c=(0,n.vec3)(1).add(e.mul((0,n.float)(1).div(a).sub(1)));return kn({compensation:c,E_total:(0,n.clamp)((0,n.max)(e.mul(s).add((0,n.vec3)(o)),(0,n.vec3)(0)).mul(c),(0,n.vec3)(0),(0,n.vec3)(1))})}),Or=(0,n.Fn)(([e,t,r])=>{let i=gr(e,r),a=br(t,r);return i.mul(a).div((0,n.max)(t.mul(4),Ln))}),kr=(0,n.Fn)(([e,t])=>{let r=(0,n.max)(e.mul(e),1e-4).toVar();return(0,n.vec2)((0,n.max)((0,n.mix)(r,(0,n.float)(1),t.mul(t)),1e-4),r)}),Ar=(0,n.Fn)(([e,t,r,i,a])=>{let o=e.mul(t),s=(0,n.vec3)(t.mul(i),e.mul(a),o.mul(r)),c=(0,n.max)((0,n.dot)(s,s),Ln),l=o.div(c);return o.mul(l.mul(l)).div(Pn)}),jr=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=c.mul((0,n.vec3)(e.mul(r),t.mul(i),s).length()),u=s.mul((0,n.vec3)(e.mul(a),t.mul(o),c).length());return(0,n.float)(.5).div((0,n.max)(l.add(u),Ln))}),Mr=(0,n.Fn)(([e,t,r,i,a])=>{let o=e.mul(r),s=t.mul(i),c=o.mul(o).add(s.mul(s)),l=(0,n.max)(a.mul(a),Ln),u=(0,n.sqrt)((0,n.float)(1).add(c.div(l))).sub(1).mul(.5);return(0,n.float)(1).div(u.add(1))}),Nr=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=Ar(e,t,r,i,a),u=Mr(e,t,s,c,o);return l.mul(u).div((0,n.max)(o.mul(4),Ln))}),Pr=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(In).mul(e).mul(1e-9),i=(0,n.vec3)(54856e-17,44201e-17,52481e-17),a=(0,n.vec3)(1681e3,1795300,2208400),o=(0,n.vec3)(43278e5,93046e5,66121e5),s=i.mul((0,n.sqrt)((0,n.float)(In).mul(o))).mul((0,n.cos)(a.mul(r).add(t))).mul((0,n.exp)(qn({x:r}).negate().mul(o))).toVar();return s.x.addAssign((0,n.float)(9747e-17).mul((0,n.sqrt)((0,n.float)(In).mul(45282e5))).mul((0,n.cos)((0,n.float)(2239900).mul(r).add(t.x))).mul((0,n.exp)((0,n.float)(-45282e5).mul(qn({x:r}))))),Kn.mul(s.div(1.0685e-7))}),Fr=(0,n.Fn)(([e,t,r,i,a])=>{let o=(0,n.mix)(e,t,(0,n.smoothstep)(0,.03,i)).toVar(),s=qn({x:e.div(o)}).mul((0,n.float)(1).sub(qn({x:r}))),c=(0,n.float)(1).sub(s).toVar(),l=(0,n.vec3)(0).toVar();return(0,n.If)(c.lessThan(0),()=>{l.assign((0,n.vec3)(1))}).Else(()=>{let t=(0,n.sqrt)(c).toVar(),s=ur(r,mr(o,e)).toVar(),u=(0,n.float)(1).sub(s).toVar(),d=o.lessThan(e).select((0,n.float)(Pn),(0,n.float)(0)),f=(0,n.float)(Pn).sub(d),p=fr((0,n.clamp)(a,0,.9999)).toVar(),m=pr(p,o).toVar(),h=(0,n.vec3)(ur(t,m.x),ur(t,m.y),ur(t,m.z)).toVar(),g=(0,n.vec3)(p.x.lessThan(o).select((0,n.float)(Pn),(0,n.float)(0)),p.y.lessThan(o).select((0,n.float)(Pn),(0,n.float)(0)),p.z.lessThan(o).select((0,n.float)(Pn),(0,n.float)(0))),_=(0,n.float)(2).mul(o).mul(i).mul(t).toVar(),v=(0,n.vec3)(f).add(g).toVar(),y=(0,n.clamp)((0,n.vec3)(s).mul(h),1e-5,.9999).toVar(),b=(0,n.sqrt)(y).toVar(),x=(0,n.vec3)(u.mul(u)).mul(h).div((0,n.vec3)(1).sub(y)).toVar(),S=(0,n.vec3)(s).add(x).toVar().toVar(),C=x.sub((0,n.vec3)(u)).toVar();C.mulAssign(b),S.addAssign(C.mul((0,n.float)(2).mul(Pr((0,n.float)(1).mul(_),(0,n.float)(1).mul(v))))),C.mulAssign(b),S.addAssign(C.mul((0,n.float)(2).mul(Pr((0,n.float)(2).mul(_),(0,n.float)(2).mul(v))))),l.assign((0,n.max)(S,(0,n.vec3)(0)))}),l}),Ir=(0,n.Fn)(([e,t,r])=>{let i=r.invRoughness,a=r.metalFactor,o=(0,n.float)(0).toVar();(0,n.If)(t.isMetallic,()=>{o.assign((0,n.max)(i.mul(a),.7))}).ElseIf(t.isSmooth,()=>{o.assign(i.mul(a).mul(1.2))}).Else(()=>{o.assign((0,n.max)(i.mul(a),e.metalness.mul(.1)))});let s=o.mul(e.specularIntensity).toVar(),c=(0,n.float)(1).sub(o).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).toVar(),l=e.sheen.mul(r.maxSheenColor).toVar(),u=(0,n.float)(0).toVar();(0,n.If)(t.hasClearcoat,()=>{u.assign(e.clearcoat.mul(i).mul(.4))}).Else(()=>{u.assign(e.clearcoat.mul(i).mul(.35))});let d=(0,n.float)(0).toVar();(0,n.If)(t.isTransmissive,()=>{let t=r.iorFactor.mul(i).mul(.8);d.assign(e.transmission.mul(t).mul((0,n.float)(.6).add((0,n.float)(.4).mul(e.ior.div(2)))).mul((0,n.float)(1).add(e.dispersion.mul(.6))))}).Else(()=>{let t=r.iorFactor.mul(i).mul(.7);d.assign(e.transmission.mul(t).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.ior.div(2)))).mul((0,n.float)(1).add(e.dispersion.mul(.5))))});let f=i.mul(t.isSmooth.select((0,n.float)(.6),(0,n.float)(.5))),p=(0,n.min)(e.iridescence.mul(f).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.iridescenceThicknessRange.y.sub(e.iridescenceThicknessRange.x).div(1e3)))).mul((0,n.float)(.5).add((0,n.float)(.5).mul(e.iridescenceIOR.div(2)))),c);s.addAssign(p),c.subAssign(p);let m=s.add(c).add(l).add(u).add(d),h=(0,n.float)(1).div((0,n.max)(m,.001));return En({specular:s.mul(h),diffuse:c.mul(h),sheen:l.mul(h),clearcoat:u.mul(h),transmission:d.mul(h),iridescence:(0,n.float)(0)})}),Lr=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();return(0,n.If)(r.NoL.greaterThan(0),()=>{i.addAssign(t.diffuse.mul(r.NoL).mul(Fn));let a=(0,n.float)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let t=kr(e.roughness,e.anisotropy);a.assign(Nr(t.x,t.y,r.NoH,r.ToH,r.BoH,r.NoV,r.ToV,r.BoV))}).Else(()=>{a.assign(Or(r.NoH,r.NoV,e.roughness))}),i.addAssign(t.specular.mul(a)),(0,n.If)(t.sheen.greaterThan(0),()=>{let a=_r(r.NoH,e.sheenRoughness).mul(r.NoH).div((0,n.max)((0,n.float)(4).mul(r.VoH),Ln));i.addAssign(t.sheen.mul(a))}),(0,n.If)(t.clearcoat.greaterThan(0),()=>{let a=(0,n.clamp)(e.clearcoatRoughness,zn,1);i.addAssign(t.clearcoat.mul(Or(r.NoH,r.NoV,a)))})}),i}),Rr=(0,n.Fn)(([e])=>Ir(e,jn.wrap(rr(e.metalness,e.roughness,e.transmission,e.clearcoat,e.emissive,e.subsurface)),Nn({invRoughness:(0,n.float)(1).sub(e.roughness),metalFactor:(0,n.float)(.5).add((0,n.float)(.5).mul(e.metalness)),iorFactor:(0,n.min)((0,n.float)(2).div(e.ior),1),maxSheenColor:(0,n.max)(e.sheenColor.x,(0,n.max)(e.sheenColor.y,e.sheenColor.z))}))),zr=(0,n.Fn)(([e,t])=>Lr(e,En.wrap(Rr(e)),t)),Br=(0,n.wgslFn)(`
|
|
245
245
|
fn ImportanceSampleGGX( N: vec3f, roughness: f32, Xi: vec2f ) -> vec3f {
|
|
246
246
|
let alpha = roughness * roughness;
|
|
247
247
|
let phi = 6.28318530717958647692f * Xi.x;
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
let bitangent = cross( N, tangent );
|
|
255
255
|
return normalize( tangent * H.x + bitangent * H.y + N * H.z );
|
|
256
256
|
}
|
|
257
|
-
`),
|
|
257
|
+
`),Vr=(0,n.wgslFn)(`
|
|
258
258
|
fn ImportanceSampleCosine( N: vec3f, xi: vec2f ) -> vec3f {
|
|
259
259
|
let T = normalize( cross( N, N.yzx + vec3f( 0.1f, 0.2f, 0.3f ) ) );
|
|
260
260
|
let B = cross( N, T );
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
let localDir = vec3f( sinTheta * cos( phi ), sinTheta * sin( phi ), cosTheta );
|
|
265
265
|
return normalize( T * localDir.x + B * localDir.y + N * localDir.z );
|
|
266
266
|
}
|
|
267
|
-
`),
|
|
267
|
+
`),Hr=(0,n.wgslFn)(`
|
|
268
268
|
fn cosineWeightedSample( N: vec3f, xi: vec2f ) -> vec3f {
|
|
269
269
|
let T = normalize( cross( N, N.yzx + vec3f( 0.1f, 0.2f, 0.3f ) ) );
|
|
270
270
|
let B = cross( N, T );
|
|
@@ -274,7 +274,7 @@
|
|
|
274
274
|
let localDir = vec3f( sinTheta * cos( phi ), sinTheta * sin( phi ), cosTheta );
|
|
275
275
|
return normalize( T * localDir.x + B * localDir.y + N * localDir.z );
|
|
276
276
|
}
|
|
277
|
-
`),
|
|
277
|
+
`),Ur=(0,n.wgslFn)(`
|
|
278
278
|
fn sampleGGXVNDF( V: vec3f, roughness: f32, Xi: vec2f ) -> vec3f {
|
|
279
279
|
let alpha = roughness * roughness;
|
|
280
280
|
// Transform view direction to local space
|
|
@@ -295,7 +295,7 @@
|
|
|
295
295
|
// Transform the normal back to the ellipsoid configuration
|
|
296
296
|
return normalize( vec3f( alpha * Nh.x, alpha * Nh.y, max( 0.0f, Nh.z ) ) );
|
|
297
297
|
}
|
|
298
|
-
`),
|
|
298
|
+
`),Wr=(0,n.wgslFn)(`
|
|
299
299
|
fn sampleGGXVNDFAniso( V: vec3f, alphaX: f32, alphaY: f32, Xi: vec2f ) -> vec3f {
|
|
300
300
|
let Vh = normalize( vec3f( alphaX * V.x, alphaY * V.y, V.z ) );
|
|
301
301
|
let lensq = Vh.x * Vh.x + Vh.y * Vh.y;
|
|
@@ -310,13 +310,13 @@
|
|
|
310
310
|
let Nh = T1 * t1 + T2 * t2 + Vh * sqrt( max( 0.0f, 1.0f - t1 * t1 - t2 * t2 ) );
|
|
311
311
|
return normalize( vec3f( alphaX * Nh.x, alphaY * Nh.y, max( 0.0f, Nh.z ) ) );
|
|
312
312
|
}
|
|
313
|
-
`),
|
|
313
|
+
`),Gr=C({didScatter:`bool`,t:`float`,weight:`vec3`}),Kr=C({sigmaT:`vec3`,sigmaS:`vec3`,sigmaA:`vec3`}),qr=C({direction:`vec3`,throughput:`vec3`,didReflect:`bool`}),Jr=(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)(In).mul(r.y);return Zn({N:e}).mul((0,n.vec3)(a.mul((0,n.cos)(o)),a.mul((0,n.sin)(o)),i))}),Yr=(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=B(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=B(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)}),Gr({didScatter:g,t:_,weight:v})}),Xr=(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 Kr({sigmaT:a,sigmaS:o,sigmaA:(0,n.max)(a.sub(o),(0,n.vec3)(0))})}),Zr=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d])=>{let f=qr({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),Ln)).mul((0,n.float)(1).sub(g.mul(g))).greaterThan(1).toVar(),v=mr(h,m),y=(0,n.select)(_,(0,n.float)(1),ur(g,v)).toVar(),b=(0,n.clamp)(y,.02,.98).toVar(),x=_.or(B(o,(0,n.int)(0),l.add((0,n.int)(11)),a,s,c).lessThan(b)).toVar();return f.didReflect.assign(x),(0,n.If)(x,()=>{let t=pe(o,(0,n.int)(0),l.add((0,n.int)(5)),a,s,c),i=(0,n.reflect)(e,Br({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)(y.div((0,n.max)(b,.02))))}).Else(()=>{let t=(0,n.refract)(e,p,m.div((0,n.max)(h,Ln))).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),Ln));f.throughput.assign((0,n.vec3)((0,n.float)(1).sub(y).div((0,n.max)((0,n.float)(1).sub(b),.02)).mul(e)))})}),f}),Qr=C({direction:`vec3`,throughput:`vec3`,didReflect:`bool`,pathWavelength:`float`}),$r=C({continueRay:`bool`,isTransmissive:`bool`,isAlphaSkip:`bool`,isSubsurface:`bool`,didReflect:`bool`,entering:`bool`,direction:`vec3`,throughput:`vec3`,alpha:`float`,pathWavelength:`float`});C({ior:`float`,attenuationColor:`vec3`,attenuationDistance:`float`,dispersion:`float`});var ei=C({wavelength:`float`,ior:`float`,colorWeight:`vec3`}),ti=C({direction:`vec3`,halfVector:`vec3`,didReflect:`bool`,pdf:`float`,colorWeight:`vec3`,pathWavelength:`float`});C({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 ni=(0,n.Fn)(([e,t,n])=>{let r=n.div(1e3);return e.add(t.mul(.03).div(r.mul(r)))}),ri=(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))}),ii=(0,n.Fn)(([e])=>(0,n.vec3)(ri(e,442,.0624,.0374).mul(.362).add(ri(e,599.8,.0264,.0323).mul(1.056)).sub(ri(e,501.1,.049,.0382).mul(.065)),ri(e,568.8,.0213,.0247).mul(.821).add(ri(e,530.9,.0613,.0322).mul(.286)),ri(e,437,.0845,.0278).mul(1.217).add(ri(e,459,.0385,.0725).mul(.681)))),ai=(0,n.Fn)(([e,t,r])=>{let i=(0,n.mix)((0,n.float)(380),(0,n.float)(700),r).toVar(),a=ni(e,t,i),o=ii(i).toVar();return ei({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))})}),oi=(0,n.wgslFn)(`
|
|
314
314
|
fn calculateBeerLawAbsorption( attenuationColor: vec3f, attenuationDistance: f32, pathLength: f32 ) -> vec3f {
|
|
315
315
|
if ( attenuationDistance <= 0.0f ) { return vec3f( 1.0f ); }
|
|
316
316
|
let absorption = -log( max( attenuationColor, vec3f( 0.001f ) ) ) / attenuationDistance;
|
|
317
317
|
return exp( -absorption * pathLength );
|
|
318
318
|
}
|
|
319
|
-
`)
|
|
319
|
+
`),si=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p])=>{let m=ti({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=ni(r,o,l);s.assign((0,n.select)(a,(0,n.float)(1).div(e),e))}).Else(()=>{let e=ei.wrap(ai(r,o,B(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)(Rn,i),g=Br({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=ni(r,o,l);_.assign((0,n.select)(a,(0,n.float)(1).div(e),e))}).Else(()=>{let e=ei.wrap(ai(r,o,B(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=gr(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),Bn)))}).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}),ci=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=Qr({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=mr(_,g),x=(0,n.select)(y,(0,n.float)(1),ur(v,b)).toVar(),S=(0,n.float)(0).toVar();(0,n.If)(y,()=>{S.assign(1)}).Else(()=>{let e=x,t=(0,n.float)(.95);S.assign((0,n.mix)(e,t,r.metalness))}),S.assign((0,n.clamp)(S,.05,.95));let C=y.or(B(o,(0,n.int)(0),l.add((0,n.int)(4)),a,s,c).lessThan(S)).toVar();p.didReflect.assign(C);let w=pe(o,(0,n.int)(0),l.add((0,n.int)(4)),a,s,c).toVar();return(0,n.If)(C,()=>{(0,n.If)(r.roughness.greaterThan(.05),()=>{let e=ti.wrap(si(h,m,r.ior,r.roughness,i,(0,n.float)(0),w,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(x).div((0,n.max)(S,.05)))}).Else(()=>{(0,n.If)(r.roughness.greaterThan(.05).or(r.dispersion.greaterThan(0)),()=>{let e=ti.wrap(si(h,m,r.ior,r.roughness,i,r.dispersion,w,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(S),.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(_),Ln))),p.throughput.mulAssign((0,n.float)(1).sub(x).div((0,n.max)((0,n.float)(1).sub(S),.05)))})}),p}),li=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=$r({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=B(a,(0,n.int)(0),c.add((0,n.int)(6)),i,o,s),h=B(a,(0,n.int)(0),c.add((0,n.int)(7)),i,o,s),g=L({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=Qr.wrap(ci(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(B(a,(0,n.int)(0),c.add((0,n.int)(8)),i,o,s).lessThan(r.subsurface)),()=>{let n=qr.wrap(Zr(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}),ui=q.BUCKET_LAYER_STRIDE,di=null,fi=null;function pi(e,t){di=e,fi=t}var mi=(e,t,r)=>{let i=t.div((0,n.int)(ui)).toVar(),a=t.sub(i.mul((0,n.int)(ui))).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},hi=(e,t,r)=>{let i=(0,n.vec4)(0).toVar();return mi(e,t,(e,t)=>i.assign((0,n.texture)(e,r).depth(t))),i},gi=(e,t)=>{let r=(0,n.vec2)(1).toVar();return mi(e,t,e=>r.assign((0,n.vec2)(1).div((0,n.vec2)((0,n.textureSize)(e))))),r};function _i(){return fi}function vi(){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 yi(e){let t=q.MATERIAL_BUCKET_COUNT,r=[];for(let i=0;i<t;i++){let t=e&&e[i];r.push((0,n.texture)(t||vi()))}return r}function bi(e,t){if(!(!e||!t))for(let n=0;n<e.length;n++)t[n]&&e[n]&&(e[n].value=t[n])}var xi=(0,n.wgslFn)(`
|
|
320
320
|
fn isIdentityTransform( transform: mat3x3f ) -> bool {
|
|
321
321
|
return transform[0][0] == 1.0f
|
|
322
322
|
&& transform[1][1] == 1.0f
|
|
@@ -325,7 +325,7 @@
|
|
|
325
325
|
&& transform[2][0] == 0.0f
|
|
326
326
|
&& transform[2][1] == 0.0f;
|
|
327
327
|
}
|
|
328
|
-
`),
|
|
328
|
+
`),Si=(0,n.wgslFn)(`
|
|
329
329
|
fn getTransformedUV( uv: vec2f, transform: mat3x3f ) -> vec2f {
|
|
330
330
|
if ( !isIdentityTransform( transform ) ) {
|
|
331
331
|
return fract( vec2f(
|
|
@@ -335,19 +335,19 @@
|
|
|
335
335
|
}
|
|
336
336
|
return uv;
|
|
337
337
|
}
|
|
338
|
-
`,[
|
|
338
|
+
`,[xi]),Ci=(0,n.Fn)(([e])=>e.albedoMapIndex.greaterThanEqual((0,n.int)(0)).or(e.normalMapIndex.greaterThanEqual((0,n.int)(0))).or(e.roughnessMapIndex.greaterThanEqual((0,n.int)(0))).or(e.metalnessMapIndex.greaterThanEqual((0,n.int)(0))).or(e.emissiveMapIndex.greaterThanEqual((0,n.int)(0))).or(e.bumpMapIndex.greaterThanEqual((0,n.int)(0))).or(e.displacementMapIndex.greaterThanEqual((0,n.int)(0)))),wi=(0,n.wgslFn)(`
|
|
339
339
|
fn hashTransform( t: mat3x3f ) -> f32 {
|
|
340
340
|
return t[0][0] + t[1][1] * 7.0f + t[2][0] * 13.0f + t[2][1] * 17.0f;
|
|
341
341
|
}
|
|
342
|
-
`),
|
|
342
|
+
`),Ti=(0,n.Fn)(([e,t])=>{let r=wi({t:t.albedoTransform}).toVar(),i=wi({t:t.normalTransform}).toVar(),a=wi({t:t.metalnessTransform}).toVar(),o=wi({t:t.roughnessTransform}).toVar(),s=wi({t:t.emissiveTransform}).toVar(),c=wi({t:t.bumpTransform}).toVar(),l=.001,u=(0,n.abs)(r.sub(i)).lessThan(l).toVar(),d=(0,n.abs)(i.sub(c)).lessThan(l).toVar(),f=(0,n.abs)(a.sub(o)).lessThan(l).toVar(),p=(0,n.abs)(r.sub(s)).lessThan(l).toVar(),m=u.and((0,n.abs)(r.sub(a)).lessThan(l)).and((0,n.abs)(r.sub(s)).lessThan(l)).and((0,n.abs)(r.sub(c)).lessThan(l)).toVar(),h=(0,n.vec2)(0).toVar(),g=(0,n.vec2)(0).toVar(),_=(0,n.vec2)(0).toVar(),v=(0,n.vec2)(0).toVar(),y=(0,n.vec2)(0).toVar(),b=(0,n.vec2)(0).toVar(),x=d.or(m),S=f.or(m),C=p.or(m);return(0,n.If)(m,()=>{let n=Si({uv:e,transform:t.albedoTransform});h.assign(n),g.assign(n),_.assign(n),v.assign(n),y.assign(n),b.assign(n)}).Else(()=>{h.assign(Si({uv:e,transform:t.albedoTransform})),g.assign(u.select(h,Si({uv:e,transform:t.normalTransform}))),y.assign(p.select(h,Si({uv:e,transform:t.emissiveTransform}))),(0,n.If)(d,()=>{b.assign(g)}).ElseIf((0,n.abs)(c.sub(r)).lessThan(l),()=>{b.assign(h)}).Else(()=>{b.assign(Si({uv:e,transform:t.bumpTransform}))}),(0,n.If)(f,()=>{_.assign(Si({uv:e,transform:t.metalnessTransform})),v.assign(_)}).Else(()=>{(0,n.If)((0,n.abs)(a.sub(r)).lessThan(l),()=>{_.assign(h)}).ElseIf((0,n.abs)(a.sub(i)).lessThan(l),()=>{_.assign(g)}).Else(()=>{_.assign(Si({uv:e,transform:t.metalnessTransform}))}),(0,n.If)((0,n.abs)(o.sub(r)).lessThan(l),()=>{v.assign(h)}).ElseIf((0,n.abs)(o.sub(i)).lessThan(l),()=>{v.assign(g)}).ElseIf((0,n.abs)(o.sub(a)).lessThan(l),()=>{v.assign(_)}).Else(()=>{v.assign(Si({uv:e,transform:t.roughnessTransform}))})})}),Mn({albedoUV:h,normalUV:g,metalnessUV:_,roughnessUV:v,emissiveUV:y,bumpUV:b,allSameUV:m,normalBumpSameUV:x,metalRoughSameUV:S,albedoEmissiveSameUV:C})}),Ei=(0,n.Fn)(([e,t])=>{let r=e.color.toVar();return(0,n.If)(e.albedoMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=hi(di,e.albedoMapIndex,t.albedoUV).toVar();r.assign((0,n.vec4)(e.color.rgb.mul(i.rgb),e.color.a.mul(i.a)))}),r}),Di=(0,n.Fn)(([e,t])=>{let r=e.metalness.toVar(),i=e.roughness.toVar();return(0,n.If)(e.metalnessMapIndex.greaterThanEqual((0,n.int)(0)).and(e.metalnessMapIndex.equal(e.roughnessMapIndex)),()=>{let n=hi(fi,e.metalnessMapIndex,t.metalnessUV);r.assign(e.metalness.mul(n.b)),i.assign(e.roughness.mul(n.g))}).Else(()=>{(0,n.If)(e.metalnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let n=hi(fi,e.metalnessMapIndex,t.metalnessUV);r.assign(e.metalness.mul(n.b))}),(0,n.If)(e.roughnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let n=hi(fi,e.roughnessMapIndex,t.roughnessUV);i.assign(e.roughness.mul(n.g))})}),(0,n.vec2)(r,i)}),Oi=(0,n.wgslFn)(`
|
|
343
343
|
fn uvTransformJacobian( t: mat3x3f ) -> vec2f {
|
|
344
344
|
return vec2f( t[1][1], t[0][1] );
|
|
345
345
|
}
|
|
346
|
-
`),xi=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.int)(8),o=Y(e,t,(0,n.int)(0),a).xyz,s=Y(e,t,(0,n.int)(1),a).xyz.sub(o),c=Y(e,t,(0,n.int)(2),a).xyz.sub(o),l=Y(e,t,(0,n.int)(6),a),u=Y(e,t,(0,n.int)(7),a).xy,d=l.zw.sub(l.xy),f=u.sub(l.xy),p=d.x.mul(f.y).sub(d.y.mul(f.x)),m=(0,n.vec4)(0).toVar();return(0,n.If)((0,n.abs)(p).greaterThan(1e-12),()=>{let e=(0,n.float)(1).div(p),t=s.mul(f.y).sub(c.mul(d.y)).mul(e).toVar(),a=c.mul(d.x).sub(s.mul(f.x)).mul(e).toVar(),o=bi({t:i}),l=t.mul(o.x).sub(a.mul(o.y)).toVar();(0,n.If)((0,n.length)(l).greaterThan(1e-12),()=>{t.assign(l)}),(0,n.If)((0,n.length)(t).greaterThan(1e-12),()=>{m.assign((0,n.vec4)((0,n.normalize)(t),(0,n.sign)((0,n.dot)((0,n.cross)(r,t),a))))})}),m}),Si=(0,n.Fn)(([e,t,r,i])=>{let a=e.toVar();return(0,n.If)(t.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let o=si(ii,t.normalMapIndex,r.normalUV).xyz.mul(2).sub(1).toVar();o.x.mulAssign(t.normalScale.x),o.y.assign(o.y.negate().mul(t.normalScale.x));let s=(0,n.vec3)(0).toVar(),c=(0,n.float)(1).toVar(),l=i.xyz.sub(e.mul((0,n.dot)(e,i.xyz))).toVar();(0,n.If)((0,n.abs)(i.w).greaterThan(.5).and((0,n.length)(l).greaterThan(1e-6)),()=>{s.assign((0,n.normalize)(l)),c.assign(i.w)}).Else(()=>{let t=(0,n.abs)(e.z).lessThan(.999).select((0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0));s.assign((0,n.normalize)((0,n.cross)(t,e)))});let u=(0,n.cross)(e,s).mul(c);a.assign((0,n.normalize)(s.mul(o.x).add(u.mul(o.y)).add(e.mul(o.z))))}),a}),Ci=(0,n.Fn)(([e,t,r])=>{let i=e.toVar();return(0,n.If)(t.bumpMapIndex.greaterThanEqual((0,n.int)(0)).and(t.bumpScale.greaterThan(0)),()=>{let a=(0,n.vec3)(0,0,1).toVar();oi(ii,t.bumpMapIndex,(e,i)=>{let o=(0,n.vec2)(1).div((0,n.vec2)((0,n.textureSize)(e))).toVar(),s=(0,n.texture)(e,r.bumpUV).depth(i).r,c=(0,n.texture)(e,(0,n.vec2)(r.bumpUV.x.add(o.x),r.bumpUV.y)).depth(i).r,l=(0,n.texture)(e,(0,n.vec2)(r.bumpUV.x,r.bumpUV.y.add(o.y))).depth(i).r,u=(0,n.vec2)(c.sub(s),l.sub(s)).mul(t.bumpScale);a.assign((0,n.normalize)((0,n.vec3)(u.x.negate(),u.y.negate(),1)))});let o=(0,n.normalize)((0,n.cross)((0,n.abs)(e.z).lessThan(.999).select((0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0)),e)),s=(0,n.cross)(e,o),c=o.mul(a.x).add(s.mul(a.y)).add(e.mul(a.z));i.assign((0,n.normalize)((0,n.mix)(e,c,(0,n.clamp)(t.bumpScale,0,1))))}),i}),wi=(0,n.Fn)(([e,t])=>{let r=(0,n.vec2)(e.anisotropy,e.anisotropyRotation).toVar(),i=si(ii,e.anisotropyMapIndex,t).toVar(),a=i.rg.mul(2).sub(1).toVar(),o=a.length().toVar();return(0,n.If)(o.greaterThan(1e-4),()=>{let t=a.div(o).mul(i.b).toVar(),s=e.anisotropyRotation.cos(),c=e.anisotropyRotation.sin(),l=e.anisotropy.mul(s.mul(t.x).sub(c.mul(t.y))),u=e.anisotropy.mul(c.mul(t.x).add(s.mul(t.y)));r.assign((0,n.vec2)((0,n.clamp)(l.mul(l).add(u.mul(u)).sqrt(),0,1),(0,n.atan)(u,l)))}).Else(()=>{r.assign((0,n.vec2)(0,e.anisotropyRotation))}),r}),Ti=(0,n.Fn)(([e,t])=>{let r=gn({transmission:e.transmission,clearcoat:e.clearcoat,clearcoatRoughness:e.clearcoatRoughness,sheenColor:e.sheenColor,sheenRoughness:e.sheenRoughness,iridescence:e.iridescence,iridescenceThickness:e.iridescenceThicknessRange.y,specularIntensity:e.specularIntensity,specularColor:e.specularColor}).toVar();return(0,n.If)(e.transmissionMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.transmission.assign(r.transmission.mul(si(ii,e.transmissionMapIndex,t).r))}),(0,n.If)(e.clearcoatMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.clearcoat.assign(r.clearcoat.mul(si(ii,e.clearcoatMapIndex,t).r))}),(0,n.If)(e.clearcoatRoughnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.clearcoatRoughness.assign(r.clearcoatRoughness.mul(si(ii,e.clearcoatRoughnessMapIndex,t).g))}),(0,n.If)(e.sheenColorMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.sheenColor.assign(r.sheenColor.mul(si(ri,e.sheenColorMapIndex,t).rgb))}),(0,n.If)(e.sheenRoughnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.sheenRoughness.assign((0,n.clamp)(r.sheenRoughness.mul(si(ii,e.sheenRoughnessMapIndex,t).a),.05,1))}),(0,n.If)(e.iridescenceMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.iridescence.assign(r.iridescence.mul(si(ii,e.iridescenceMapIndex,t).r))}),(0,n.If)(e.iridescenceThicknessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=si(ii,e.iridescenceThicknessMapIndex,t).g;r.iridescenceThickness.assign((0,n.mix)(e.iridescenceThicknessRange.x,e.iridescenceThicknessRange.y,i))}),(0,n.If)(e.specularIntensityMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.specularIntensity.assign(r.specularIntensity.mul(si(ii,e.specularIntensityMapIndex,t).a))}),(0,n.If)(e.specularColorMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.specularColor.assign(r.specularColor.mul(si(ri,e.specularColorMapIndex,t).rgb))}),r}),Ei=(0,n.Fn)(([e,t])=>{let r=e.emissive.mul(e.emissiveIntensity).toVar();return(0,n.If)(e.emissiveMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let n=si(ri,e.emissiveMapIndex,t.emissiveUV).toVar();r.assign(r.mul(n.rgb))}),r}),Di=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec4)(0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.vec3)(0).toVar(),u=hi(e).toVar();return a.assign(e.color),o.assign(e.emissive.mul(e.emissiveIntensity)),s.assign(e.metalness),c.assign(e.roughness),l.assign(r),(0,n.If)(u,()=>{let n=Dn.wrap(_i(t,e)).toVar();a.assign(vi(e,n));let u=yi(e,n);s.assign(u.x),c.assign(u.y);let d=Si(r,e,n,i).toVar();l.assign(Ci(d,e,n)),o.assign(Ei(e,n))}),Tn({albedo:a,emissive:o,metalness:s,roughness:c,normal:l,hasTextures:u})}),Oi=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();return(0,n.If)(e.greaterThanEqual((0,n.int)(0)),()=>{let n=mi({uv:t,transform:r});i.assign(si(ii,e,n).r)}),i}),ki=null,Ai=null;function ji(e){ki=e}function Mi(e){Ai=e}var Ni=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.float)(1).toVar(),l=e.toVar(),u=(0,n.float)(r).toVar();return(0,n.Loop)({start:(0,n.int)(0),end:(0,n.int)(16)},()=>{let e=mn({origin:l,direction:t}),r=yn.wrap(i(e,a,o,u));(0,n.If)(r.didHit.not(),()=>{(0,n.Break)()});let d=(0,n.int)(8),f=Y(o,r.triangleIndex,(0,n.int)(3),d).w;(0,n.If)(f.greaterThan(.5),()=>{c.assign(0),(0,n.Break)()});let p=_n.wrap($n(r.materialIndex,s)),m=(0,n.bool)(!1).toVar();Ai&&(0,n.If)(Ai.equal((0,n.int)(1)),()=>{let e=(0,n.float)(1).toVar();ki&&(0,n.If)(p.albedoMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let t=r.uv.x,i=r.uv.y,a=(0,n.float)(1).sub(t).sub(i),s=(0,n.int)(8),c=Y(o,r.triangleIndex,(0,n.int)(6),s),l=Y(o,r.triangleIndex,(0,n.int)(7),s),u=mi({uv:c.xy.mul(a).add(c.zw.mul(t)).add(l.xy.mul(i)),transform:p.albedoTransform});e.assign(si(ki,p.albedoMapIndex,u).a)}),(0,n.If)(p.alphaMode.equal((0,n.int)(1)),()=>{let t=p.color.a.mul(e).mul(p.opacity),r=(0,n.select)(p.alphaTest.greaterThan(0),p.alphaTest,(0,n.float)(.5));(0,n.If)(t.lessThan(r),()=>{m.assign(!0)})}).ElseIf(p.alphaMode.equal((0,n.int)(2)),()=>{let t=(0,n.clamp)(p.color.a.mul(p.opacity).mul(e),0,1);c.mulAssign((0,n.float)(1).sub(t)),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),m.assign(!0)})}),(0,n.If)(m,()=>{let e=(0,n.max)((0,n.float)(1e-5),(0,n.length)(r.hitPoint).mul(1e-6));l.assign(r.hitPoint.add(t.mul(e))),u.subAssign(r.dst.add(e))}).ElseIf(p.transmission.greaterThan(0),()=>{let e=(0,n.int)(8),i=Y(o,r.triangleIndex,(0,n.int)(0),e).xyz,a=Y(o,r.triangleIndex,(0,n.int)(1),e).xyz,s=Y(o,r.triangleIndex,(0,n.int)(2),e).xyz,d=(0,n.normalize)((0,n.cross)(a.sub(i),s.sub(i)));r.normal.assign(d);let f=(0,n.dot)(t,d).lessThan(0),m=(0,n.select)(f,d,d.negate());(0,n.If)(f.not().and(p.attenuationDistance.greaterThan(0)),()=>{let e=(0,n.length)(r.hitPoint.sub(l)),t=Qr(p.attenuationColor,p.attenuationDistance,e);c.mulAssign(t.x.add(t.y).add(t.z).div(3))});let h=nr((0,n.abs)((0,n.dot)(t,m)),or(p.ior,(0,n.float)(1))),g=(0,n.float)(1).sub(h).mul(p.transmission);c.mulAssign(g),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),l.assign(r.hitPoint.add(t.mul(.001))),u.subAssign(r.dst.add(.001))}).ElseIf(p.transparent,()=>{c.mulAssign((0,n.float)(1).sub(p.opacity)),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),l.assign(r.hitPoint.add(t.mul(.001))),u.subAssign(r.dst.add(.001))}).Else(()=>{c.assign(0),(0,n.Break)()})}),c}),Pi=(0,n.Fn)(([e,t,r])=>{let i=(0,n.max)((0,n.float)(1e-4),(0,n.length)(e).mul(1e-6)).toVar();return(0,n.If)(r.transmission.greaterThan(0),()=>{i.mulAssign(2)}),(0,n.If)(r.roughness.lessThan(.1),()=>{i.mulAssign(1.5)}),t.mul(i)}),Fi=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.max)((0,n.float)(0),(0,n.dot)(t,e.direction)),o=(0,n.float)(0).toVar();return(0,n.If)(a.greaterThan(0),()=>{let t=e.intensity.mul((0,n.dot)(e.color,In)),s=(0,n.float)(1).toVar();(0,n.If)(r.metalness.greaterThan(.7),()=>{s.assign(1.5)}).ElseIf(r.roughness.greaterThan(.8),()=>{s.assign(.7)});let c=(0,n.float)(1).div((0,n.float)(1).add((0,n.float)(i).mul(.5)));o.assign(t.mul(a).mul(s).mul(c))}),o}),Ii=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.length)(a),s=o.mul(o),c=a.div(o),l=(0,n.max)((0,n.dot)(r,c),0),u=(0,n.float)(0).toVar();return(0,n.If)(l.greaterThan(0),()=>{let t=(0,n.max)((0,n.dot)(c,e.normal).negate(),0);(0,n.If)(t.greaterThan(0),()=>{let r=(0,n.min)(e.area.div((0,n.max)(s,1e-12)),(0,n.float)(2*Math.PI)),a=(0,n.select)(e.normalize.greaterThan(.5),(0,n.float)(1).div((0,n.max)(e.area,1e-10)),(0,n.float)(1)),o=e.intensity.mul((0,n.dot)(e.color,In)).mul(a),c=(0,n.float)(1).toVar();(0,n.If)(i.metalness.greaterThan(.7),()=>{c.mulAssign(1.5),(0,n.If)(i.roughness.lessThan(.3),()=>{c.mulAssign((0,n.float)(1).add((0,n.float)(1).sub(i.roughness).mul(.5)))})}),(0,n.If)(i.transmission.greaterThan(.5),()=>{c.mulAssign((0,n.float)(1).add(i.transmission.mul(.3)))}),u.assign(o.mul(r).mul(l).mul(t).mul(c))})}),u}),Li=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.dot)(a,a),s=(0,n.float)(0).toVar();return(0,n.If)(o.greaterThanEqual(.001),()=>{let t=(0,n.sqrt)(o),c=a.div(t),l=(0,n.max)((0,n.float)(0),(0,n.dot)(r,c));(0,n.If)(l.greaterThan(0),()=>{let t=(0,n.float)(1).div((0,n.max)(o,.1)),r=e.intensity.mul((0,n.dot)(e.color,In)),a=(0,n.float)(1).toVar();(0,n.If)(i.metalness.greaterThan(.7),()=>{a.mulAssign(1.5),(0,n.If)(i.roughness.lessThan(.3),()=>{a.mulAssign((0,n.float)(1).add((0,n.float)(1).sub(i.roughness).mul(.4)))})}),(0,n.If)(i.roughness.greaterThan(.6),()=>{a.mulAssign(.9)}),(0,n.If)(i.transmission.greaterThan(.5),()=>{a.mulAssign((0,n.float)(1).add(i.transmission.mul(.2)))}),s.assign(r.mul(t).mul(l).mul(a))})}),s}),Ri=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.dot)(a,a),s=(0,n.float)(0).toVar();return(0,n.If)(o.greaterThanEqual(.001),()=>{let t=a.div((0,n.sqrt)(o)),c=(0,n.max)((0,n.float)(0),(0,n.dot)(r,t));(0,n.If)(c.greaterThan(0),()=>{let r=(0,n.dot)(t.negate(),e.direction),a=(0,n.cos)(e.angle);(0,n.If)(r.greaterThanEqual(a),()=>{let t=(0,n.float)(1).div((0,n.max)(o,.01)),l=(0,n.smoothstep)(a,a.add(.1),r),u=e.intensity.mul((0,n.dot)(e.color,In)),d=(0,n.select)(i.metalness.greaterThan(.7),(0,n.float)(1.5),(0,n.select)(i.roughness.greaterThan(.8),(0,n.float)(.8),(0,n.float)(1)));s.assign(u.mul(t).mul(l).mul(c).mul(d))})})}),s}),zi=C({direction:`vec3`,color:`vec3`,intensity:`float`,angle:`float`,goboIndex:`int`,goboIntensity:`float`,goboScale:`float`}),Bi=C({position:`vec3`,u:`vec3`,v:`vec3`,color:`vec3`,intensity:`float`,normalize:`float`,spread:`float`,shape:`float`,normal:`vec3`,area:`float`}),Vi=C({position:`vec3`,color:`vec3`,intensity:`float`,distance:`float`,decay:`float`}),Hi=C({position:`vec3`,direction:`vec3`,color:`vec3`,intensity:`float`,angle:`float`,penumbra:`float`,distance:`float`,decay:`float`,goboIndex:`int`,goboIntensity:`float`,iesIndex:`int`,iesIntensity:`float`}),Ui=C({direction:`vec3`,emission:`vec3`,pdf:`float`,distance:`float`,lightType:`int`,valid:`bool`,selectionTotalWeight:`float`}),Wi=C({direction:`vec3`,throughput:`vec3`,combinedPdf:`float`}),Gi=(0,n.Fn)(([e,t])=>{let r=t.mul(12);return zi({direction:(0,n.normalize)((0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2)))),color:(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))),intensity:e.element(r.add(6)),angle:e.element(r.add(7)),goboIndex:(0,n.int)(e.element(r.add(8))),goboIntensity:e.element(r.add(9)),goboScale:e.element(r.add(10))})}),Ki=(0,n.Fn)(([e,t])=>{let r=t.mul(16),i=(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))).toVar(),a=(0,n.vec3)(e.element(r.add(6)),e.element(r.add(7)),e.element(r.add(8))).toVar(),o=(0,n.cross)(i,a),s=e.element(r.add(15)),c=(0,n.length)(o).mul(4);return Bi({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),u:i,v:a,color:(0,n.vec3)(e.element(r.add(9)),e.element(r.add(10)),e.element(r.add(11))),intensity:e.element(r.add(12)),normalize:e.element(r.add(13)),spread:e.element(r.add(14)),shape:s,normal:(0,n.normalize)(o),area:(0,n.select)(s.greaterThan(.5),c.mul(.7853981633974483),c)})}),qi=(0,n.Fn)(([e,t])=>{let r=t.mul(9);return Vi({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),color:(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))),intensity:e.element(r.add(6)),distance:e.element(r.add(7)),decay:e.element(r.add(8))})}),Ji=(0,n.Fn)(([e,t])=>{let r=t.mul(20);return Hi({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),direction:(0,n.normalize)((0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5)))),color:(0,n.vec3)(e.element(r.add(6)),e.element(r.add(7)),e.element(r.add(8))),intensity:e.element(r.add(9)),angle:e.element(r.add(10)),penumbra:e.element(r.add(11)),distance:e.element(r.add(12)),decay:e.element(r.add(13)),goboIndex:(0,n.int)(e.element(r.add(14))),goboIntensity:e.element(r.add(15)),iesIndex:(0,n.int)(e.element(r.add(16))),iesIntensity:e.element(r.add(17))})}),Yi=(0,n.wgslFn)(`
|
|
346
|
+
`),ki=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.int)(8),o=Z(e,t,(0,n.int)(0),a).xyz,s=Z(e,t,(0,n.int)(1),a).xyz.sub(o),c=Z(e,t,(0,n.int)(2),a).xyz.sub(o),l=Z(e,t,(0,n.int)(6),a),u=Z(e,t,(0,n.int)(7),a).xy,d=l.zw.sub(l.xy),f=u.sub(l.xy),p=d.x.mul(f.y).sub(d.y.mul(f.x)),m=(0,n.vec4)(0).toVar();return(0,n.If)((0,n.abs)(p).greaterThan(1e-12),()=>{let e=(0,n.float)(1).div(p),t=s.mul(f.y).sub(c.mul(d.y)).mul(e).toVar(),a=c.mul(d.x).sub(s.mul(f.x)).mul(e).toVar(),o=Oi({t:i}),l=t.mul(o.x).sub(a.mul(o.y)).toVar();(0,n.If)((0,n.length)(l).greaterThan(1e-12),()=>{t.assign(l)}),(0,n.If)((0,n.length)(t).greaterThan(1e-12),()=>{m.assign((0,n.vec4)((0,n.normalize)(t),(0,n.sign)((0,n.dot)((0,n.cross)(r,t),a))))})}),m}),Ai=(0,n.Fn)(([e,t,r,i])=>{let a=e.toVar();return(0,n.If)(t.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let o=hi(fi,t.normalMapIndex,r.normalUV).xyz.mul(2).sub(1).toVar();o.x.mulAssign(t.normalScale.x),o.y.assign(o.y.negate().mul(t.normalScale.x));let s=(0,n.vec3)(0).toVar(),c=(0,n.float)(1).toVar(),l=i.xyz.sub(e.mul((0,n.dot)(e,i.xyz))).toVar();(0,n.If)((0,n.abs)(i.w).greaterThan(.5).and((0,n.length)(l).greaterThan(1e-6)),()=>{s.assign((0,n.normalize)(l)),c.assign(i.w)}).Else(()=>{let t=(0,n.abs)(e.z).lessThan(.999).select((0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0));s.assign((0,n.normalize)((0,n.cross)(t,e)))});let u=(0,n.cross)(e,s).mul(c);a.assign((0,n.normalize)(s.mul(o.x).add(u.mul(o.y)).add(e.mul(o.z))))}),a}),ji=(0,n.Fn)(([e,t,r])=>{let i=e.toVar();return(0,n.If)(t.bumpMapIndex.greaterThanEqual((0,n.int)(0)).and(t.bumpScale.greaterThan(0)),()=>{let a=(0,n.vec3)(0,0,1).toVar();mi(fi,t.bumpMapIndex,(e,i)=>{let o=(0,n.vec2)(1).div((0,n.vec2)((0,n.textureSize)(e))).toVar(),s=(0,n.texture)(e,r.bumpUV).depth(i).r,c=(0,n.texture)(e,(0,n.vec2)(r.bumpUV.x.add(o.x),r.bumpUV.y)).depth(i).r,l=(0,n.texture)(e,(0,n.vec2)(r.bumpUV.x,r.bumpUV.y.add(o.y))).depth(i).r,u=(0,n.vec2)(c.sub(s),l.sub(s)).mul(t.bumpScale);a.assign((0,n.normalize)((0,n.vec3)(u.x.negate(),u.y.negate(),1)))});let o=(0,n.normalize)((0,n.cross)((0,n.abs)(e.z).lessThan(.999).select((0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0)),e)),s=(0,n.cross)(e,o),c=o.mul(a.x).add(s.mul(a.y)).add(e.mul(a.z));i.assign((0,n.normalize)((0,n.mix)(e,c,(0,n.clamp)(t.bumpScale,0,1))))}),i}),Mi=(0,n.Fn)(([e,t])=>{let r=(0,n.vec2)(e.anisotropy,e.anisotropyRotation).toVar(),i=hi(fi,e.anisotropyMapIndex,t).toVar(),a=i.rg.mul(2).sub(1).toVar(),o=a.length().toVar();return(0,n.If)(o.greaterThan(1e-4),()=>{let t=a.div(o).mul(i.b).toVar(),s=e.anisotropyRotation.cos(),c=e.anisotropyRotation.sin(),l=e.anisotropy.mul(s.mul(t.x).sub(c.mul(t.y))),u=e.anisotropy.mul(c.mul(t.x).add(s.mul(t.y)));r.assign((0,n.vec2)((0,n.clamp)(l.mul(l).add(u.mul(u)).sqrt(),0,1),(0,n.atan)(u,l)))}).Else(()=>{r.assign((0,n.vec2)(0,e.anisotropyRotation))}),r}),Ni=(0,n.Fn)(([e,t])=>{let r=xn({transmission:e.transmission,clearcoat:e.clearcoat,clearcoatRoughness:e.clearcoatRoughness,sheenColor:e.sheenColor,sheenRoughness:e.sheenRoughness,iridescence:e.iridescence,iridescenceThickness:e.iridescenceThicknessRange.y,specularIntensity:e.specularIntensity,specularColor:e.specularColor}).toVar();return(0,n.If)(e.transmissionMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.transmission.assign(r.transmission.mul(hi(fi,e.transmissionMapIndex,t).r))}),(0,n.If)(e.clearcoatMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.clearcoat.assign(r.clearcoat.mul(hi(fi,e.clearcoatMapIndex,t).r))}),(0,n.If)(e.clearcoatRoughnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.clearcoatRoughness.assign(r.clearcoatRoughness.mul(hi(fi,e.clearcoatRoughnessMapIndex,t).g))}),(0,n.If)(e.sheenColorMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.sheenColor.assign(r.sheenColor.mul(hi(di,e.sheenColorMapIndex,t).rgb))}),(0,n.If)(e.sheenRoughnessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.sheenRoughness.assign((0,n.clamp)(r.sheenRoughness.mul(hi(fi,e.sheenRoughnessMapIndex,t).a),.05,1))}),(0,n.If)(e.iridescenceMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.iridescence.assign(r.iridescence.mul(hi(fi,e.iridescenceMapIndex,t).r))}),(0,n.If)(e.iridescenceThicknessMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=hi(fi,e.iridescenceThicknessMapIndex,t).g;r.iridescenceThickness.assign((0,n.mix)(e.iridescenceThicknessRange.x,e.iridescenceThicknessRange.y,i))}),(0,n.If)(e.specularIntensityMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.specularIntensity.assign(r.specularIntensity.mul(hi(fi,e.specularIntensityMapIndex,t).a))}),(0,n.If)(e.specularColorMapIndex.greaterThanEqual((0,n.int)(0)),()=>{r.specularColor.assign(r.specularColor.mul(hi(di,e.specularColorMapIndex,t).rgb))}),r}),Pi=(0,n.Fn)(([e,t])=>{let r=e.emissive.mul(e.emissiveIntensity).toVar();return(0,n.If)(e.emissiveMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let n=hi(di,e.emissiveMapIndex,t.emissiveUV).toVar();r.assign(r.mul(n.rgb))}),r}),Fi=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.vec4)(0).toVar(),o=(0,n.vec3)(0).toVar(),s=(0,n.float)(0).toVar(),c=(0,n.float)(0).toVar(),l=(0,n.vec3)(0).toVar(),u=Ci(e).toVar();return a.assign(e.color),o.assign(e.emissive.mul(e.emissiveIntensity)),s.assign(e.metalness),c.assign(e.roughness),l.assign(r),(0,n.If)(u,()=>{let n=Mn.wrap(Ti(t,e)).toVar();a.assign(Ei(e,n));let u=Di(e,n);s.assign(u.x),c.assign(u.y);let d=Ai(r,e,n,i).toVar();l.assign(ji(d,e,n)),o.assign(Pi(e,n))}),An({albedo:a,emissive:o,metalness:s,roughness:c,normal:l,hasTextures:u})}),Ii=(0,n.Fn)(([e,t,r])=>{let i=(0,n.float)(0).toVar();return(0,n.If)(e.greaterThanEqual((0,n.int)(0)),()=>{let n=Si({uv:t,transform:r});i.assign(hi(fi,e,n).r)}),i}),Li=null,Ri=null;function zi(e){Li=e}function Bi(e){Ri=e}var Vi=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.float)(1).toVar(),l=e.toVar(),u=(0,n.float)(r).toVar();return(0,n.Loop)({start:(0,n.int)(0),end:(0,n.int)(16)},()=>{let e=yn({origin:l,direction:t}),r=wn.wrap(i(e,a,o,u));(0,n.If)(r.didHit.not(),()=>{(0,n.Break)()});let d=(0,n.int)(8),f=Z(o,r.triangleIndex,(0,n.int)(3),d).w;(0,n.If)(f.greaterThan(.5),()=>{c.assign(0),(0,n.Break)()});let p=Sn.wrap(sr(r.materialIndex,s)),m=(0,n.bool)(!1).toVar();Ri&&(0,n.If)(Ri.equal((0,n.int)(1)),()=>{let e=(0,n.float)(1).toVar();Li&&(0,n.If)(p.albedoMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let t=r.uv.x,i=r.uv.y,a=(0,n.float)(1).sub(t).sub(i),s=(0,n.int)(8),c=Z(o,r.triangleIndex,(0,n.int)(6),s),l=Z(o,r.triangleIndex,(0,n.int)(7),s),u=Si({uv:c.xy.mul(a).add(c.zw.mul(t)).add(l.xy.mul(i)),transform:p.albedoTransform});e.assign(hi(Li,p.albedoMapIndex,u).a)}),(0,n.If)(p.alphaMode.equal((0,n.int)(1)),()=>{let t=p.color.a.mul(e).mul(p.opacity),r=(0,n.select)(p.alphaTest.greaterThan(0),p.alphaTest,(0,n.float)(.5));(0,n.If)(t.lessThan(r),()=>{m.assign(!0)})}).ElseIf(p.alphaMode.equal((0,n.int)(2)),()=>{let t=(0,n.clamp)(p.color.a.mul(p.opacity).mul(e),0,1);c.mulAssign((0,n.float)(1).sub(t)),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),m.assign(!0)})}),(0,n.If)(m,()=>{let e=(0,n.max)((0,n.float)(1e-5),(0,n.length)(r.hitPoint).mul(1e-6));l.assign(r.hitPoint.add(t.mul(e))),u.subAssign(r.dst.add(e))}).ElseIf(p.transmission.greaterThan(0),()=>{let e=(0,n.int)(8),i=Z(o,r.triangleIndex,(0,n.int)(0),e).xyz,a=Z(o,r.triangleIndex,(0,n.int)(1),e).xyz,s=Z(o,r.triangleIndex,(0,n.int)(2),e).xyz,d=(0,n.normalize)((0,n.cross)(a.sub(i),s.sub(i)));r.normal.assign(d);let f=(0,n.dot)(t,d).lessThan(0),m=(0,n.select)(f,d,d.negate());(0,n.If)(f.not().and(p.attenuationDistance.greaterThan(0)),()=>{let e=(0,n.length)(r.hitPoint.sub(l)),t=oi(p.attenuationColor,p.attenuationDistance,e);c.mulAssign(t.x.add(t.y).add(t.z).div(3))});let h=ur((0,n.abs)((0,n.dot)(t,m)),mr(p.ior,(0,n.float)(1))),g=(0,n.float)(1).sub(h).mul(p.transmission);c.mulAssign(g),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),l.assign(r.hitPoint.add(t.mul(.001))),u.subAssign(r.dst.add(.001))}).ElseIf(p.transparent,()=>{c.mulAssign((0,n.float)(1).sub(p.opacity)),(0,n.If)(c.lessThan(1e-4),()=>{c.assign(0),(0,n.Break)()}),l.assign(r.hitPoint.add(t.mul(.001))),u.subAssign(r.dst.add(.001))}).Else(()=>{c.assign(0),(0,n.Break)()})}),c}),Hi=(0,n.Fn)(([e,t,r])=>{let i=(0,n.max)((0,n.float)(1e-4),(0,n.length)(e).mul(1e-6)).toVar();return(0,n.If)(r.transmission.greaterThan(0),()=>{i.mulAssign(2)}),(0,n.If)(r.roughness.lessThan(.1),()=>{i.mulAssign(1.5)}),t.mul(i)}),Ui=(0,n.Fn)(([e,t,r,i])=>{let a=(0,n.max)((0,n.float)(0),(0,n.dot)(t,e.direction)),o=(0,n.float)(0).toVar();return(0,n.If)(a.greaterThan(0),()=>{let t=e.intensity.mul((0,n.dot)(e.color,Vn)),s=(0,n.float)(1).toVar();(0,n.If)(r.metalness.greaterThan(.7),()=>{s.assign(1.5)}).ElseIf(r.roughness.greaterThan(.8),()=>{s.assign(.7)});let c=(0,n.float)(1).div((0,n.float)(1).add((0,n.float)(i).mul(.5)));o.assign(t.mul(a).mul(s).mul(c))}),o}),Wi=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.length)(a),s=o.mul(o),c=a.div(o),l=(0,n.max)((0,n.dot)(r,c),0),u=(0,n.float)(0).toVar();return(0,n.If)(l.greaterThan(0),()=>{let t=(0,n.max)((0,n.dot)(c,e.normal).negate(),0);(0,n.If)(t.greaterThan(0),()=>{let r=(0,n.min)(e.area.div((0,n.max)(s,1e-12)),(0,n.float)(2*Math.PI)),a=(0,n.select)(e.normalize.greaterThan(.5),(0,n.float)(1).div((0,n.max)(e.area,1e-10)),(0,n.float)(1)),o=e.intensity.mul((0,n.dot)(e.color,Vn)).mul(a),c=(0,n.float)(1).toVar();(0,n.If)(i.metalness.greaterThan(.7),()=>{c.mulAssign(1.5),(0,n.If)(i.roughness.lessThan(.3),()=>{c.mulAssign((0,n.float)(1).add((0,n.float)(1).sub(i.roughness).mul(.5)))})}),(0,n.If)(i.transmission.greaterThan(.5),()=>{c.mulAssign((0,n.float)(1).add(i.transmission.mul(.3)))}),u.assign(o.mul(r).mul(l).mul(t).mul(c))})}),u}),Gi=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.dot)(a,a),s=(0,n.float)(0).toVar();return(0,n.If)(o.greaterThanEqual(.001),()=>{let t=(0,n.sqrt)(o),c=a.div(t),l=(0,n.max)((0,n.float)(0),(0,n.dot)(r,c));(0,n.If)(l.greaterThan(0),()=>{let t=(0,n.float)(1).div((0,n.max)(o,.1)),r=e.intensity.mul((0,n.dot)(e.color,Vn)),a=(0,n.float)(1).toVar();(0,n.If)(i.metalness.greaterThan(.7),()=>{a.mulAssign(1.5),(0,n.If)(i.roughness.lessThan(.3),()=>{a.mulAssign((0,n.float)(1).add((0,n.float)(1).sub(i.roughness).mul(.4)))})}),(0,n.If)(i.roughness.greaterThan(.6),()=>{a.mulAssign(.9)}),(0,n.If)(i.transmission.greaterThan(.5),()=>{a.mulAssign((0,n.float)(1).add(i.transmission.mul(.2)))}),s.assign(r.mul(t).mul(l).mul(a))})}),s}),Ki=(0,n.Fn)(([e,t,r,i])=>{let a=e.position.sub(t),o=(0,n.dot)(a,a),s=(0,n.float)(0).toVar();return(0,n.If)(o.greaterThanEqual(.001),()=>{let t=a.div((0,n.sqrt)(o)),c=(0,n.max)((0,n.float)(0),(0,n.dot)(r,t));(0,n.If)(c.greaterThan(0),()=>{let r=(0,n.dot)(t.negate(),e.direction),a=(0,n.cos)(e.angle);(0,n.If)(r.greaterThanEqual(a),()=>{let t=(0,n.float)(1).div((0,n.max)(o,.01)),l=(0,n.smoothstep)(a,a.add(.1),r),u=e.intensity.mul((0,n.dot)(e.color,Vn)),d=(0,n.select)(i.metalness.greaterThan(.7),(0,n.float)(1.5),(0,n.select)(i.roughness.greaterThan(.8),(0,n.float)(.8),(0,n.float)(1)));s.assign(u.mul(t).mul(l).mul(c).mul(d))})})}),s}),qi=C({direction:`vec3`,color:`vec3`,intensity:`float`,angle:`float`,goboIndex:`int`,goboIntensity:`float`,goboScale:`float`}),Ji=C({position:`vec3`,u:`vec3`,v:`vec3`,color:`vec3`,intensity:`float`,normalize:`float`,spread:`float`,shape:`float`,normal:`vec3`,area:`float`}),Yi=C({position:`vec3`,color:`vec3`,intensity:`float`,distance:`float`,decay:`float`}),Xi=C({position:`vec3`,direction:`vec3`,color:`vec3`,intensity:`float`,angle:`float`,penumbra:`float`,distance:`float`,decay:`float`,goboIndex:`int`,goboIntensity:`float`,iesIndex:`int`,iesIntensity:`float`}),Zi=C({direction:`vec3`,emission:`vec3`,pdf:`float`,distance:`float`,lightType:`int`,valid:`bool`,selectionTotalWeight:`float`}),Qi=C({direction:`vec3`,throughput:`vec3`,combinedPdf:`float`}),$i=(0,n.Fn)(([e,t])=>{let r=t.mul(12);return qi({direction:(0,n.normalize)((0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2)))),color:(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))),intensity:e.element(r.add(6)),angle:e.element(r.add(7)),goboIndex:(0,n.int)(e.element(r.add(8))),goboIntensity:e.element(r.add(9)),goboScale:e.element(r.add(10))})}),ea=(0,n.Fn)(([e,t])=>{let r=t.mul(16),i=(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))).toVar(),a=(0,n.vec3)(e.element(r.add(6)),e.element(r.add(7)),e.element(r.add(8))).toVar(),o=(0,n.cross)(i,a),s=e.element(r.add(15)),c=(0,n.length)(o).mul(4);return Ji({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),u:i,v:a,color:(0,n.vec3)(e.element(r.add(9)),e.element(r.add(10)),e.element(r.add(11))),intensity:e.element(r.add(12)),normalize:e.element(r.add(13)),spread:e.element(r.add(14)),shape:s,normal:(0,n.normalize)(o),area:(0,n.select)(s.greaterThan(.5),c.mul(.7853981633974483),c)})}),ta=(0,n.Fn)(([e,t])=>{let r=t.mul(9);return Yi({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),color:(0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5))),intensity:e.element(r.add(6)),distance:e.element(r.add(7)),decay:e.element(r.add(8))})}),na=(0,n.Fn)(([e,t])=>{let r=t.mul(20);return Xi({position:(0,n.vec3)(e.element(r),e.element(r.add(1)),e.element(r.add(2))),direction:(0,n.normalize)((0,n.vec3)(e.element(r.add(3)),e.element(r.add(4)),e.element(r.add(5)))),color:(0,n.vec3)(e.element(r.add(6)),e.element(r.add(7)),e.element(r.add(8))),intensity:e.element(r.add(9)),angle:e.element(r.add(10)),penumbra:e.element(r.add(11)),distance:e.element(r.add(12)),decay:e.element(r.add(13)),goboIndex:(0,n.int)(e.element(r.add(14))),goboIntensity:e.element(r.add(15)),iesIndex:(0,n.int)(e.element(r.add(16))),iesIntensity:e.element(r.add(17))})}),ra=(0,n.wgslFn)(`
|
|
347
347
|
fn isDirectionValid( direction: vec3f, surfaceNormal: vec3f ) -> bool {
|
|
348
348
|
return dot( direction, surfaceNormal ) > 0.0f;
|
|
349
349
|
}
|
|
350
|
-
`),
|
|
350
|
+
`),ia=(0,n.wgslFn)(`
|
|
351
351
|
fn getDistanceAttenuation( lightDistance: f32, cutoffDistance: f32, decayExponent: f32 ) -> f32 {
|
|
352
352
|
var distanceFalloff = 1.0f / max( pow( lightDistance, decayExponent ), 0.01f );
|
|
353
353
|
if ( cutoffDistance > 0.0f ) {
|
|
@@ -359,11 +359,11 @@
|
|
|
359
359
|
}
|
|
360
360
|
return distanceFalloff;
|
|
361
361
|
}
|
|
362
|
-
`),
|
|
362
|
+
`),aa=(0,n.wgslFn)(`
|
|
363
363
|
fn getSpotAttenuation( coneCosine: f32, penumbraCosine: f32, angleCosine: f32 ) -> f32 {
|
|
364
364
|
return smoothstep( coneCosine, penumbraCosine, angleCosine );
|
|
365
365
|
}
|
|
366
|
-
`),
|
|
366
|
+
`),oa=null;function sa(e){oa=e}var ca=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(e.goboIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=e.direction.toVar(),a=t.negate().toVar(),o=(0,n.dot)(a,i).toVar();(0,n.If)(o.greaterThan(0),()=>{let t=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(i.z).lessThan(.999),(0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0)),i)).toVar(),s=(0,n.cross)(i,t),c=(0,n.float)(1).div(o).toVar(),l=(0,n.dot)(a,t).mul(c),u=(0,n.dot)(a,s).mul(c),d=(0,n.float)(.5).div((0,n.max)((0,n.tan)(e.angle),(0,n.float)(1e-4))).toVar(),f=(0,n.clamp)(l.mul(d).add(.5),(0,n.float)(0),(0,n.float)(1)),p=(0,n.clamp)(u.mul(d).add(.5),(0,n.float)(0),(0,n.float)(1));if(oa){let t=(0,n.texture)(oa,(0,n.vec2)(f,p)).depth(e.goboIndex),i=(0,n.min)(t.r,t.a),a=(0,n.select)(e.goboIntensity.lessThan(0),(0,n.float)(1).sub(i),i),o=(0,n.clamp)((0,n.abs)(e.goboIntensity),(0,n.float)(0),(0,n.float)(1));r.assign((0,n.mix)((0,n.float)(1),a,o))}}).Else(()=>{r.assign(0)})}),r}),la=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(e.goboIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=e.direction.toVar(),a=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(i.z).lessThan(.999),(0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0)),i)).toVar(),o=(0,n.cross)(i,a),s=(0,n.float)(1).div((0,n.max)(e.goboScale,(0,n.float)(1e-4))).toVar(),c=(0,n.dot)(t,a).mul(s).add(.5).toVar(),l=(0,n.dot)(t,o).mul(s).add(.5).toVar(),u=c.sub(c.floor()),d=l.sub(l.floor());if(oa){let t=(0,n.texture)(oa,(0,n.vec2)(u,d)).depth(e.goboIndex),i=(0,n.min)(t.r,t.a),a=(0,n.select)(e.goboIntensity.lessThan(0),(0,n.float)(1).sub(i),i),o=(0,n.clamp)((0,n.abs)(e.goboIntensity),(0,n.float)(0),(0,n.float)(1));r.assign((0,n.mix)((0,n.float)(1),a,o))}}),r}),ua=null;function da(e){ua=e}var fa=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(e.iesIndex.greaterThanEqual((0,n.int)(0)),()=>{let i=e.direction.toVar(),a=t.negate().toVar(),o=(0,n.clamp)((0,n.acos)((0,n.clamp)((0,n.dot)(a,i),(0,n.float)(-1),(0,n.float)(1))).div((0,n.float)(Math.PI)),(0,n.float)(0),(0,n.float)(1)),s=(0,n.normalize)((0,n.cross)((0,n.select)((0,n.abs)(i.z).lessThan(.999),(0,n.vec3)(0,0,1),(0,n.vec3)(1,0,0)),i)).toVar(),c=(0,n.cross)(i,s),l=(0,n.dot)(a,s),u=(0,n.atan)((0,n.dot)(a,c),l).div((0,n.float)(2*Math.PI)).add(.5);if(ua){let t=(0,n.texture)(ua,(0,n.vec2)(u,o)).depth(e.iesIndex).r,i=(0,n.clamp)(e.iesIntensity,(0,n.float)(0),(0,n.float)(1));r.assign((0,n.mix)((0,n.float)(1),t,i))}}),r}),pa=(0,n.wgslFn)(`
|
|
367
367
|
fn sampleCone( direction: vec3f, halfAngle: f32, xi: vec2f ) -> vec3f {
|
|
368
368
|
let cosHalfAngle = cos( halfAngle );
|
|
369
369
|
let cosTheta = cosHalfAngle + xi.x * ( 1.0f - cosHalfAngle );
|
|
@@ -377,7 +377,7 @@
|
|
|
377
377
|
let localDir = vec3f( sinTheta * cos( phi ), sinTheta * sin( phi ), cosTheta );
|
|
378
378
|
return normalize( tangent * localDir.x + bitangent * localDir.y + direction * localDir.z );
|
|
379
379
|
}
|
|
380
|
-
`),
|
|
380
|
+
`),ma=(0,n.Fn)(([e,t,r])=>{let i=e.normal,a=(0,n.dot)(i,r),o=(0,n.float)(-1).toVar();return(0,n.If)(a.lessThan(-1e-4),()=>{let s=(0,n.float)(1).div(a),c=(0,n.dot)(e.position.sub(t),i).mul(s).toVar();(0,n.If)(c.greaterThan(.001),()=>{let i=t.add(r.mul(c)).sub(e.position),a=(0,n.length)(e.u),s=(0,n.length)(e.v),l=e.u.div(a),u=e.v.div(s),d=(0,n.dot)(i,l).div(a),f=(0,n.dot)(i,u).div(s);(0,n.If)((0,n.select)(e.shape.greaterThan(.5),d.mul(d).add(f.mul(f)).lessThanEqual(1),(0,n.abs)(d).lessThanEqual(1).and((0,n.abs)(f).lessThanEqual(1))),()=>{o.assign(c)})})}),o}),ha=(0,n.wgslFn)(`
|
|
381
381
|
fn sphQuadSolidAngle( o: vec3f, s: vec3f, ex: vec3f, ey: vec3f ) -> f32 {
|
|
382
382
|
let PI = 3.141592653589793f;
|
|
383
383
|
let exl = length( ex );
|
|
@@ -406,7 +406,7 @@
|
|
|
406
406
|
let g3 = acos( clamp( -dot( n3, n0 ), -1.0f, 1.0f ) );
|
|
407
407
|
return g0 + g1 + g2 + g3 - 2.0f * PI;
|
|
408
408
|
}
|
|
409
|
-
`),
|
|
409
|
+
`),ga=(0,n.wgslFn)(`
|
|
410
410
|
fn sampleSphQuad( o: vec3f, s: vec3f, ex: vec3f, ey: vec3f, uv: vec2f ) -> vec4f {
|
|
411
411
|
let PI = 3.141592653589793f;
|
|
412
412
|
let exl = length( ex );
|
|
@@ -468,7 +468,7 @@
|
|
|
468
468
|
let p = o + xu * x + yv * y + z0 * z;
|
|
469
469
|
return vec4f( p, 1.0f / S );
|
|
470
470
|
}
|
|
471
|
-
`),la=K(`shader`),ua=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),la.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;Mi(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();$i(d);let f=e.iesProfiles?(0,n.texture)(e.iesProfiles):u();ra(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}},da=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 fa;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 fa;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}}},fa=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}},pa=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}},ma=K(`bvh`),ha=null;function ga(e){ha=e}var _a={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},va=_a.FLOATS_PER_TRIANGLE,ya=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}},ba=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=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*va,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/(va*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),this.useWorker&&ha&&typeof Worker<`u`?new Promise((r,i)=>{let a=a=>{let o=this.totalTriangles,s=typeof SharedArrayBuffer<`u`;ma.debug(`SharedArrayBuffer ${s?`enabled`:`unavailable (using transfer fallback)`}`);let c=s?new SharedArrayBuffer(o*va*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(ha())}catch(i){ma.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);return{bvhData:this.flattenBVH(r),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/(va*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 da(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){ma.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 pa(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){ma.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 Float32Array(a*va);for(let e=0;e<a;e++){let t=this.indices[e]*va,n=e*va;f.set(d.subarray(t,t+va),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 ma.debug(`${G.n(a)} tris → ${G.n(this.totalNodes)} nodes in ${G.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 ya;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 ya;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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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)}},X={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20},xa=X.FLOATS_PER_TRIANGLE,Sa=16,Ca=-1,wa=-2,Ta=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let r=n.length;for(let i=0;i<r;i++){let r=n[i],a=i*xa,o=r*9,s=t[o],c=t[o+1],l=t[o+2],u=t[o+3],d=t[o+4],f=t[o+5],p=t[o+6],m=t[o+7],h=t[o+8];e[a+X.POSITION_A_OFFSET]=s,e[a+X.POSITION_A_OFFSET+1]=c,e[a+X.POSITION_A_OFFSET+2]=l,e[a+X.POSITION_B_OFFSET]=u,e[a+X.POSITION_B_OFFSET+1]=d,e[a+X.POSITION_B_OFFSET+2]=f,e[a+X.POSITION_C_OFFSET]=p,e[a+X.POSITION_C_OFFSET+1]=m,e[a+X.POSITION_C_OFFSET+2]=h;let g=u-s,_=d-c,v=f-l,y=p-s,b=m-c,x=h-l,S=_*x-v*b,C=v*y-g*x,w=g*b-_*y;e[a+X.NORMAL_A_OFFSET]=S,e[a+X.NORMAL_A_OFFSET+1]=C,e[a+X.NORMAL_A_OFFSET+2]=w,e[a+X.NORMAL_B_OFFSET]=S,e[a+X.NORMAL_B_OFFSET+1]=C,e[a+X.NORMAL_B_OFFSET+2]=w,e[a+X.NORMAL_C_OFFSET]=S,e[a+X.NORMAL_C_OFFSET+1]=C,e[a+X.NORMAL_C_OFFSET+2]=w}}refitRange(e,t,n,r){r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let i=this._bounds,a=n+r;for(let r=a-1;r>=n;r--){let a=r*Sa,o=(r-n)*6;if(e[a+3]===Ca){let n=e[a],r=e[a+1],s=1/0,c=1/0,l=1/0,u=-1/0,d=-1/0,f=-1/0;for(let e=0;e<r;e++){let r=(n+e)*xa,i=t[r+X.POSITION_A_OFFSET],a=t[r+X.POSITION_A_OFFSET+1],o=t[r+X.POSITION_A_OFFSET+2],p=t[r+X.POSITION_B_OFFSET],m=t[r+X.POSITION_B_OFFSET+1],h=t[r+X.POSITION_B_OFFSET+2],g=t[r+X.POSITION_C_OFFSET],_=t[r+X.POSITION_C_OFFSET+1],v=t[r+X.POSITION_C_OFFSET+2];s=Math.min(s,i,p,g),c=Math.min(c,a,m,_),l=Math.min(l,o,h,v),u=Math.max(u,i,p,g),d=Math.max(d,a,m,_),f=Math.max(f,o,h,v)}i[o]=s,i[o+1]=c,i[o+2]=l,i[o+3]=u,i[o+4]=d,i[o+5]=f}else{let t=e[a+3],r=e[a+7],s=(t-n)*6,c=(r-n)*6,l=i[s],u=i[s+1],d=i[s+2],f=i[s+3],p=i[s+4],m=i[s+5],h=i[c],g=i[c+1],_=i[c+2],v=i[c+3],y=i[c+4],b=i[c+5];e[a]=l,e[a+1]=u,e[a+2]=d,e[a+4]=f,e[a+5]=p,e[a+6]=m,e[a+8]=h,e[a+9]=g,e[a+10]=_,e[a+12]=v,e[a+13]=y,e[a+14]=b,i[o]=Math.min(l,h),i[o+1]=Math.min(u,g),i[o+2]=Math.min(d,_),i[o+3]=Math.max(f,v),i[o+4]=Math.max(p,y),i[o+5]=Math.max(m,b)}}}refit(e,t,n){n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let r=this._bounds;for(let i=n-1;i>=0;i--){let n=i*Sa,a=i*6,o=e[n+3];if(o===Ca){let i=e[n],o=e[n+1],s=1/0,c=1/0,l=1/0,u=-1/0,d=-1/0,f=-1/0;for(let e=0;e<o;e++){let n=(i+e)*xa,r=t[n+X.POSITION_A_OFFSET],a=t[n+X.POSITION_A_OFFSET+1],o=t[n+X.POSITION_A_OFFSET+2],p=t[n+X.POSITION_B_OFFSET],m=t[n+X.POSITION_B_OFFSET+1],h=t[n+X.POSITION_B_OFFSET+2],g=t[n+X.POSITION_C_OFFSET],_=t[n+X.POSITION_C_OFFSET+1],v=t[n+X.POSITION_C_OFFSET+2];s=Math.min(s,r,p,g),c=Math.min(c,a,m,_),l=Math.min(l,o,h,v),u=Math.max(u,r,p,g),d=Math.max(d,a,m,_),f=Math.max(f,o,h,v)}r[a]=s,r[a+1]=c,r[a+2]=l,r[a+3]=u,r[a+4]=d,r[a+5]=f}else if(o===wa){let t=e[n]*6;r[a]=r[t],r[a+1]=r[t+1],r[a+2]=r[t+2],r[a+3]=r[t+3],r[a+4]=r[t+4],r[a+5]=r[t+5]}else{let t=e[n+3],i=e[n+7],o=t*6,s=i*6,c=r[o],l=r[o+1],u=r[o+2],d=r[o+3],f=r[o+4],p=r[o+5],m=r[s],h=r[s+1],g=r[s+2],_=r[s+3],v=r[s+4],y=r[s+5];e[n]=c,e[n+1]=l,e[n+2]=u,e[n+4]=d,e[n+5]=f,e[n+6]=p,e[n+8]=m,e[n+9]=h,e[n+10]=g,e[n+12]=_,e[n+13]=v,e[n+14]=y,r[a]=Math.min(c,m),r[a+1]=Math.min(l,h),r[a+2]=Math.min(u,g),r[a+3]=Math.max(d,_),r[a+4]=Math.max(f,v),r[a+5]=Math.max(p,y)}}}},Ea="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=y(`bvh`),S={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},C=S.FLOATS_PER_TRIANGLE;var w=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}},T=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=this.triangles,n=S.POSITION_A_OFFSET,r=S.POSITION_B_OFFSET,i=S.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*C,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/(C*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);return{bvhData:this.flattenBVH(r),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/(C*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){x.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){x.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 Float32Array(s*C);for(let e=0;e<s;e++){let t=this.indices[e]*C,n=e*C;m.set(p.subarray(t,t+C),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 x.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 w;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,T=m.rMinZ,E=m.rMaxX,D=m.rMaxY,O=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,T,E,D,O),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new w;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,T=p.rMaxX,E=p.rMaxY,D=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,T,E,D),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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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 E=y(`bvh`);self.onmessage=function(e){let t=e.data,n=t.type;b(t.logLevel),n===`buildPhase1`?D(t):n===`assemble`?O(t):k(t)};function D(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 T;d&&e.setTreeletConfig(d);let f=u?e=>{self.postMessage({type:`progress`,progress:e})}:null;e.triangles=new Float32Array(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;E.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){E.error(`phase 1 failed:`,e),self.postMessage({type:`error`,error:e.message})}}function O(e){let{topFlatData:t,topNodeCount:n,frontierMap:r,subtreeResults:i,sharedTriangleData:a,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c}=e;try{let e=performance.now(),l=new T().assembleParallelBVH(t,n,r,i),u=new Uint32Array(o),d=new Float32Array(a),f=new Float32Array(s);for(let e=0;e<c;e++){let t=u[e]*32,n=e*32;f.set(d.subarray(t,t+32),n)}let p=new Uint32Array(c);for(let e=0;e<c;e++)p[u[e]]=e;let m=performance.now()-e;E.debug(`phase 3 assemble + reorder ${_.ms(m)} (${_.mb(l.byteLength)} BVH)`),self.postMessage({type:`assembleResult`,bvhData:l,originalToBvh:p,triangleCount:c},[l.buffer,p.buffer])}catch(e){E.error(`assembly failed:`,e),self.postMessage({type:`error`,error:e.message})}}function k(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}=e,p=new T;l!==void 0&&(p.maxLeafSize=l),u!==void 0&&(p.numBins=u),d!==void 0&&(p.maxBins=d),f!==void 0&&(p.minBins=f);try{o&&p.setTreeletConfig(o),s&&p.setReinsertionConfig(s);let e=a?e=>{self.postMessage({progress:e})}:null,l=n===void 0?new Float32Array(t):new Float32Array(t,n,r/4),u=c?new Float32Array(c):null,d=p.buildSync(l,i,e,u),f=performance.now(),m=p.flattenBVH(d),h=performance.now()-f;E.debug(`flatten ${_.ms(h)} (${_.mb(m.byteLength)})`);let g=p.originalToBvhMap||null;if(c){let e=[m.buffer];g&&e.push(g.buffer),self.postMessage({bvhData:m,originalToBvh:g,triangleCount:l.length/32,treeletStats:p.splitStats},e)}else{let e=p.reorderedTriangleData,t=e.byteLength/128,n=[m.buffer,e.buffer];g&&n.push(g.buffer),self.postMessage({bvhData:m,triangles:e,originalToBvh:g,triangleCount:t,treeletStats:p.splitStats},n)}}catch(e){E.error(`build failed:`,e),self.postMessage({error:e.message})}}",Da=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Ea],{type:`text/javascript;charset=utf-8`});function Oa(e){let t;try{if(t=Da&&(self.URL||self.webkitURL).createObjectURL(Da),!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(Ea),{type:`module`,name:e?.name})}}var ka="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=y(`bvh`),x={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},S=x.FLOATS_PER_TRIANGLE;var C=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}},w=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=this.triangles,n=x.POSITION_A_OFFSET,r=x.POSITION_B_OFFSET,i=x.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*S,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/(S*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);return{bvhData:this.flattenBVH(r),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/(S*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){b.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){b.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 Float32Array(s*S);for(let e=0;e<s;e++){let t=this.indices[e]*S,n=e*S;m.set(p.subarray(t,t+S),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 b.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 C;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,w=m.rMinY,T=m.rMinZ,E=m.rMaxX,D=m.rMaxY,O=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,w,T,E,D,O),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new C;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,w=p.rMinZ,T=p.rMaxX,E=p.rMaxY,D=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,w,T,E,D),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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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 w;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})}}};",Aa=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,ka],{type:`text/javascript;charset=utf-8`});function ja(e){let t;try{if(t=Aa&&(self.URL||self.webkitURL).createObjectURL(Aa),!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(ka),{type:`module`,name:e?.name})}}ga(()=>new Oa);var Ma=K(`bvh`),Na=32,Pa=5e4,Fa=8;function Ia(e,t,n,r){let i=e.byteLength/(Na*4),a=Math.min(navigator.hardwareConcurrency||4,Fa),o=Math.ceil(Math.log2(a*2.5+1));return Ma.debug(`parallel build ${G.n(i)} triangles · ${a} workers · parallelDepth ${o}`),new Promise((s,c)=>{(async()=>{let c=new SharedArrayBuffer(e.byteLength);new Float32Array(c).set(e);let l=new SharedArrayBuffer(i*3*4),u=new SharedArrayBuffer(i*3*4),d=new SharedArrayBuffer(i*3*4),f=new SharedArrayBuffer(i*4),p=new SharedArrayBuffer(i*4),m=new SharedArrayBuffer(i*Na*4),h=new Oa,g=null,_=[h],v={id:null},y=!1,b=()=>{v.id&&=(clearTimeout(v.id),null);for(let e of _)try{e.terminate()}catch{}},x=e=>{if(y)return;y=!0,Ma.warn(`parallel build failed (${e}), falling back to single worker`),b();let i=new ArrayBuffer(c.byteLength);new Float32Array(i).set(new Float32Array(c)),s(Ra(new Float32Array(i),t,n,r))};h.onerror=e=>{x(`coordinator error: ${e.message}`)},h.onmessage=e=>{let t=e.data;if(t.error||t.type===`error`){x(t.error);return}if(t.type===`progress`&&n){n(Math.floor(t.progress*.3));return}if(t.type===`phase1Result`){g=t.splitStats,La(t,a,c,l,u,d,f,m,i,n,h,_,b,x,s,v,r).catch(e=>x(e.message));return}if(t.type===`assembleResult`){y=!0,b();let e=new Float32Array(m);s({bvhData:t.bvhData,bvhRoot:!0,reorderedTriangles:e,originalToBvh:t.originalToBvh||null,splitStats:g||{}});return}},n&&n(0),h.postMessage({type:`buildPhase1`,sharedTriangleData:c,sharedCentroids:l,sharedBMin:u,sharedBMax:d,sharedIndices:f,sharedMortonCodes:p,triangleCount:i,depth:t,parallelDepth:o,reportProgress:!!n,treeletOptimization:r.treeletOptimization})})().catch(e=>{Ma.warn(`parallel build setup failed:`,e),c(e)})})}async function La(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){Ma.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},[_.buffer]);return}Ma.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},t)},A=S.length;for(let e=0;e<A;e++){let t=S[e];if(t.length===0)continue;let s=new ja;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 Ra(e,t,n,r){return new Promise((i,a)=>{(async()=>{let o=new Oa,s=e.byteLength/(Na*4),c=typeof SharedArrayBuffer<`u`?new SharedArrayBuffer(s*Na*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 Float32Array(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},[l])})().catch(e=>{Ma.warn(`single worker fallback failed:`,e),a(e)})})}function za(e){return typeof Worker<`u`&&typeof SharedArrayBuffer<`u`&&e>=Pa}var Ba=16,Va=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.entryIndex=-1}},Ha=class{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0}build(e){if(e.length===0)return{root:null,nodeCount:0};let t=[];for(let n=0;n<e.length;n++)t.push(n);let n=this._buildRecursive(e,t);return{root:n,nodeCount:this._countNodes(n)}}_buildRecursive(e,t){let n=new Va;if(t.length===1){let r=e[t[0]].worldAABB;return n.minX=r.minX,n.minY=r.minY,n.minZ=r.minZ,n.maxX=r.maxX,n.maxY=r.maxY,n.maxZ=r.maxZ,n.entryIndex=t[0],n}let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0;for(let n of t){let t=e[n].worldAABB;t.minX<r&&(r=t.minX),t.minY<i&&(i=t.minY),t.minZ<a&&(a=t.minZ),t.maxX>o&&(o=t.maxX),t.maxY>s&&(s=t.maxY),t.maxZ>c&&(c=t.maxZ)}if(n.minX=r,n.minY=i,n.minZ=a,n.maxX=o,n.maxY=s,n.maxZ=c,t.length===2)return n.leftChild=this._buildRecursive(e,[t[0]]),n.rightChild=this._buildRecursive(e,[t[1]]),n;let l=this._surfaceArea(r,i,a,o,s,c),u=1/0,d=0,f=0;if(l>0&&isFinite(l))for(let n=0;n<3;n++){let r=t.slice().sort((t,r)=>{let i=e[t].worldAABB,a=e[r].worldAABB;return this._centroid(i,n)-this._centroid(a,n)});for(let t=1;t<r.length;t++){let i=this._computeGroupAABB(e,r,0,t),a=this._computeGroupAABB(e,r,t,r.length),o=this._surfaceArea(i.minX,i.minY,i.minZ,i.maxX,i.maxY,i.maxZ),s=this._surfaceArea(a.minX,a.minY,a.minZ,a.maxX,a.maxY,a.maxZ),c=1+(o*t+s*(r.length-t))/l;c<u&&(u=c,d=n,f=t)}}if(f<=0||f>=t.length){d=0;let e=o-r,n=s-i,l=c-a;n>e&&n>l?d=1:l>e&&(d=2),f=t.length>>1}let p=t.slice().sort((t,n)=>this._centroid(e[t].worldAABB,d)-this._centroid(e[n].worldAABB,d)),m=p.slice(0,f),h=p.slice(f);return n.leftChild=this._buildRecursive(e,m),n.rightChild=this._buildRecursive(e,h),n}flatten(e,t){if(!e)return new Float32Array;let n=[],r=[e];for(;r.length>0;){let e=r.pop();e._flatIndex=n.length,n.push(e),e.rightChild&&r.push(e.rightChild),e.leftChild&&r.push(e.leftChild)}let i=n.length*Ba;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer;a.fill(0,0,i);for(let e=0;e<n.length;e++){let r=n[e],i=e*Ba;if(r.leftChild){let e=r.leftChild,t=r.rightChild;a[i]=e.minX,a[i+1]=e.minY,a[i+2]=e.minZ,a[i+3]=e._flatIndex,a[i+4]=e.maxX,a[i+5]=e.maxY,a[i+6]=e.maxZ,a[i+7]=t._flatIndex,a[i+8]=t.minX,a[i+9]=t.minY,a[i+10]=t.minZ,a[i+12]=t.maxX,a[i+13]=t.maxY,a[i+14]=t.maxZ}else{let n=t[r.entryIndex];a[i]=n.blasOffset,a[i+1]=r.entryIndex,a[i+2]=n.visible===!1?0:1,a[i+3]=Ye.BLAS_POINTER_LEAF,n.tlasLeafIndex=e}}return a.subarray(0,i)}_centroid(e,t){return t===0?(e.minX+e.maxX)*.5:t===1?(e.minY+e.maxY)*.5:(e.minZ+e.maxZ)*.5}_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)}_computeGroupAABB(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=e[t[u]].worldAABB;n.minX<i&&(i=n.minX),n.minY<a&&(a=n.minY),n.minZ<o&&(o=n.minZ),n.maxX>s&&(s=n.maxX),n.maxY>c&&(c=n.maxY),n.maxZ>l&&(l=n.maxZ)}return{minX:i,minY:a,minZ:o,maxX:s,maxY:c,maxZ:l}}_countNodes(e){if(!e)return 0;let t=0,n=[e];for(;n.length>0;){let e=n.pop();t++,e.leftChild&&n.push(e.leftChild),e.rightChild&&n.push(e.rightChild)}return t}},Ua=class{constructor(){this.entries=[],this.totalBLASNodes=0,this.tlasNodeCount=0}allocate(e){this.entries=Array(e).fill(null)}setEntry({meshIndex:e,blasNodeCount:t,triOffset:n,triCount:r,originalToBvhMap:i,bvhData:a}){this.entries[e]={meshIndex:e,blasOffset:0,blasNodeCount:t,triOffset:n,triCount:r,worldAABB:null,originalToBvhMap:i,bvhData:a,visible:!0,tlasLeafIndex:-1}}setVisibility(e,t){let n=this.entries[e];n&&(n.visible=t)}computeAABBs(e){for(let t of this.entries)t&&(t.worldAABB=this._readRootAABB(t.bvhData,t,e))}recomputeAABB(e,t,n){let r=this.entries[e],i=t.subarray(r.blasOffset*16,r.blasOffset*16+16);r.worldAABB=this._readRootAABB(i,r,n)}_readRootAABB(e,t,n){if(e[3]===-1)return this._computeAABBFromTriangles(t,n);let r=e[0],i=e[1],a=e[2],o=e[4],s=e[5],c=e[6],l=e[8],u=e[9],d=e[10],f=e[12],p=e[13],m=e[14];return{minX:Math.min(r,l),minY:Math.min(i,u),minZ:Math.min(a,d),maxX:Math.max(o,f),maxY:Math.max(s,p),maxZ:Math.max(c,m)}}_computeAABBFromTriangles(e,t){let n=H.FLOATS_PER_TRIANGLE,r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0;for(let l=0;l<e.triCount;l++){let u=(e.triOffset+l)*n;for(let e=0;e<=8;e+=4){let n=t[u+e],l=t[u+e+1],d=t[u+e+2];n<r&&(r=n),l<i&&(i=l),d<a&&(a=d),n>o&&(o=n),l>s&&(s=l),d>c&&(c=d)}}return{minX:r,minY:i,minZ:a,maxX:o,maxY:s,maxZ:c}}assignOffsets(e){this.tlasNodeCount=e;let t=e;for(let e of this.entries)e&&(e.blasOffset=t,t+=e.blasNodeCount);this.totalBLASNodes=t-e}get totalNodeCount(){return this.tlasNodeCount+this.totalBLASNodes}get count(){return this.entries.length}clear(){this.entries=[],this.totalBLASNodes=0,this.tlasNodeCount=0}},Wa="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);for(r=2**Math.ceil(Math.log2(r)),i=2**Math.ceil(Math.log2(i)),r=Math.min(r,t,n.MAX_TEXTURE_DIMENSION),i=Math.min(i,t,n.MAX_TEXTURE_DIMENSION);r>t||i>t;)r=Math.max(1,Math.floor(r/2)),i=Math.max(1,Math.floor(i/2));return{maxWidth:r,maxHeight:i}}function g(e,t){let n=h(e,t);return{maxWidth:Math.max(1,Math.floor(n.maxWidth/2)),maxHeight:Math.max(1,Math.floor(n.maxHeight/2))}}",Ga=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Wa],{type:`text/javascript;charset=utf-8`});function Ka(e){let t;try{if(t=Ga&&(self.URL||self.webkitURL).createObjectURL(Ga),!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(Wa),{type:`module`,name:e?.name})}}var qa=Object.freeze({ADAPTER_SOFTWARE:`adapter.software`,ASSET_UNREACHABLE:`asset.unreachable`,TEXTURE_BUILD_FAILED:`texture.build_failed`,TEXTURE_PROCESSING_FALLBACK:`texture.processing_fallback`,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`}),Ja=Object.freeze({ERROR:`error`,WARNING:`warning`}),Ya=class extends Error{constructor(e){super(`[${e.code}] ${e.message}`),this.name=`EngineIssueError`,this.code=e.code,this.detail=e.detail}},Xa=class{constructor({strict:e=!1,onIssue:t=null}={}){this.strict=e===!0,this._onIssue=t,this._entries=[]}record(e,t,n={},r=Ja.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===Ja.ERROR)throw new Ya(i);return i}warn(e,t,n){return this.record(e,t,n,Ja.WARNING)}get list(){return this._entries.slice()}get errors(){return this._entries.filter(e=>e.severity===Ja.ERROR)}clear(){this._entries.length=0}detach(){this._onIssue=null,this.strict=!1}},Za=class{constructor(){this.canvasContextPairs=[],this.maxPoolSize=Xe.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=[]}},Qa=class{constructor(e={}){this.pools=new Map,this.memoryUsage=0,this.maxMemoryUsage=e.maxMemory||nt.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*nt.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)}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<Xe.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`}},$a=class{constructor(e=Xe.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`;t+=`${e}x${r}_${i.slice(-8)}_${a}_`}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=[]}},eo=class{constructor(e={}){this.useWorkers=typeof Worker<`u`,this.maxConcurrentWorkers=Xe.MAX_CONCURRENT_WORKERS,this.activeWorkers=0,this._issues=e.issues??null,this.maxTextureSize=this._clampTextureSize(e.maxTextureSize??Xe.DEFAULT_MAX_TEXTURE_SIZE),this.canvasPool=new Za,this.bufferPool=new Qa({maxMemory:e.maxBufferMemory||nt.MAX_BUFFER_MEMORY,sizeStrategy:e.bufferSizeStrategy||`adaptive`}),this.textureCache=new $a,this.capabilities=this.detectCapabilities(),this.optimalMethod=this.selectOptimalMethod()}_reportTextureFailure(e,t){this._issues?.record(qa.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)||Xe.DEFAULT_MAX_TEXTURE_SIZE);return Math.max(Xe.MIN_TEXTURE_WIDTH,Math.min(t,Xe.MAX_TEXTURE_SIZE))}setMaxTextureSize(e){let t=this._clampTextureSize(e);return t===this.maxTextureSize?t:(this.maxTextureSize=t,this.textureCache?.dispose(),this.textureCache=new $a,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`}async createTexturesToDataTexture(e){if(!e||e.length===0)return null;let t=this.textureCache.generateHash(e),n=this.textureCache.get(t);if(n)return n;let{normalized:r,bitmapsToClose:i}=await this._normalizeTexturesForProcessing(e),a=this.selectProcessingStrategy(r),o;try{switch(a.method){case`worker-direct`:o=await this.processWithWorkerDirect(r);break;case`main-batch`:o=await this.processOnMainThreadBatch(r,a.batchSize);break;case`main-streaming`:o=await this.processOnMainThreadStreaming(r);break;default:o=await this.processOnMainThreadSync(r)}return o&&this.textureCache.set(t,o),o}catch(e){return this._issues?.warn(qa.TEXTURE_PROCESSING_FALLBACK,`worker texture processing failed — retrying on the main thread`,{cause:String(e?.message??e)}),await this.processOnMainThreadSync(r)}finally{for(let e of i)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>nt.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 Ka,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%nt.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=U.FLOATS_PER_MATERIAL,n=e.length,r=n*t,i=new Float32Array(r);for(let r=0;r<n;r++){let n=e[r],a=r*t,o=n.mapMatrix??et,s=n.normalMapMatrices??et,c=n.roughnessMapMatrices??et,l=n.metalnessMapMatrices??et,u=n.emissiveMapMatrices??et,d=n.bumpMapMatrices??et,f=n.displacementMapMatrices??et,p=[n.ior,n.transmission,n.thickness,n.emissiveIntensity,n.attenuationColor.r,n.attenuationColor.g,n.attenuationColor.b,Je(n.attenuationDistance),n.opacity,n.side,n.transparent,n.alphaTest,n.alphaMode,n.depthWrite,n.normalScale?.x??1,n.normalScale?.y??1,n.color.r,n.color.g,n.color.b,n.metalness,n.emissive.r,n.emissive.g,n.emissive.b,n.roughness,n.map,n.normalMap,n.roughnessMap,n.metalnessMap,n.emissiveMap,n.bumpMap,n.clearcoat,n.clearcoatRoughness,n.dispersion,n.visible,n.sheen,n.sheenRoughness,n.sheenColor.r,n.sheenColor.g,n.sheenColor.b,1,n.specularIntensity,n.specularColor.r,n.specularColor.g,n.specularColor.b,n.iridescence,n.iridescenceIOR,n.iridescenceThicknessRange[0],n.iridescenceThicknessRange[1],n.bumpScale,n.displacementScale,n.displacementMap,0,o[0],o[1],o[2],o[3],o[4],o[5],o[6],o[7],s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],n.subsurfaceColor?.r??1,n.subsurfaceColor?.g??1,n.subsurfaceColor?.b??1,n.subsurface??0,n.subsurfaceRadius?.[0]??1,n.subsurfaceRadius?.[1]??.2,n.subsurfaceRadius?.[2]??.1,n.subsurfaceRadiusScale??1,n.subsurfaceAnisotropy??0,n.anisotropy??0,n.anisotropyRotation??0,n.anisotropyMap??-1,n.transmissionMap??-1,n.clearcoatMap??-1,n.clearcoatRoughnessMap??-1,n.sheenColorMap??-1,n.sheenRoughnessMap??-1,n.iridescenceMap??-1,n.iridescenceThicknessMap??-1,n.specularIntensityMap??-1,n.specularColorMap??-1,0,0,0];i.set(p,a)}return i}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=Xe.VEC4_PER_BVH_NODE*Xe.FLOATS_PER_VEC4,i=t.length*r,a=new Float32Array(i);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,o=t[e],s=t[r];a[n]=o.boundsMin.x,a[n+1]=o.boundsMin.y,a[n+2]=o.boundsMin.z,a[n+3]=e,a[n+4]=o.boundsMax.x,a[n+5]=o.boundsMax.y,a[n+6]=o.boundsMax.z,a[n+7]=r,a[n+8]=s.boundsMin.x,a[n+9]=s.boundsMin.y,a[n+10]=s.boundsMin.z,a[n+12]=s.boundsMax.x,a[n+13]=s.boundsMax.y,a[n+14]=s.boundsMax.z}else a[n]=i.triangleOffset,a[n+1]=i.triangleCount,a[n+3]=-1}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 $a;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);for(t=2**Math.ceil(Math.log2(t)),n=2**Math.ceil(Math.log2(n));t>this.maxTextureSize||n>this.maxTextureSize;)t=Math.max(1,Math.floor(t/2)),n=Math.max(1,Math.floor(n/2));return{maxWidth:t,maxHeight: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};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:to(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:to(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 to(e,t,n){let r=new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength);return createImageBitmap(new ImageData(r,t,n))}var no=K(`geometry`),ro=128;function io(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}var ao=class{constructor(){this._vectorPool={vec3:Array(9).fill().map(()=>new r.Vector3),vec2:[,,,,,,].fill().map(()=>new r.Vector2)},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.triangleData=new Float32Array(this._triangleCapacity*H.FLOATS_PER_TRIANGLE),this.currentTriangleIndex=0,this.traverseObject(e),this.logStats(),this.getExtractedData()}_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;let t=new Float32Array(e*H.FLOATS_PER_TRIANGLE);t.set(this.triangleData),this.triangleData=t,this._triangleCapacity=e}traverseObject(e){if(e.isMesh?this.processMesh(e):e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e),e.children)for(let t of e.children)this.traverseObject(t)}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=this.currentTriangleIndex;this.extractGeometry(e,t,n),this.meshTriangleRanges.push({start:r,count:this.currentTriangleIndex-r})}processMaterial(e){let t=this._materialUuidMap.get(e.uuid)??-1;if(t===-1){e.depthWrite===!1&&(e.depthWrite=!0,yt(no,`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(){return{emissive:new r.Color(0,0,0),emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:.1,attenuationColor:new r.Color(16777215),attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:new r.Color(0),specularIntensity:1,specularColor:new r.Color(16777215),clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:{x:1,y:1},bumpScale:1,displacementScale:1,alphaTest:0,subsurface:0,subsurfaceColor:new r.Color(16777215),subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0}}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;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.r*.299+e.specular.g*.587+e.specular.b*.114;n.specularIntensity=Math.min(t*2,1),n.specularColor=e.specular.clone()}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),i=this.mapLegacyMaterialToPhysical(e,n),a=(e.transmission??0)>0,o=(e.metalness??i.metalness??0)>.1&&!a?2.5:t.ior,s=e.color||new r.Color(16777215);return n===`basic`&&!e.map&&(s=new r.Color(0)),{uuid:e.uuid,color:s,emissive:i.emissive??e.emissive??t.emissive,emissiveIntensity:i.emissiveIntensity??e.emissiveIntensity??t.emissiveIntensity,roughness:Math.max(.02,i.roughness??e.roughness??t.roughness),metalness:i.metalness??e.metalness??t.metalness,ior:e.ior??o,opacity:e.opacity??t.opacity,transmission:e.transmission??t.transmission,thickness:e.thickness??t.thickness,attenuationColor:e.attenuationColor??t.attenuationColor,attenuationDistance:e.attenuationDistance??t.attenuationDistance,dispersion:e.dispersion??t.dispersion,sheen:e.sheen??t.sheen,sheenRoughness:e.sheenRoughness??t.sheenRoughness,sheenColor:e.sheenColor??t.sheenColor,clearcoat:e.clearcoat??t.clearcoat,clearcoatRoughness:e.clearcoatRoughness??t.clearcoatRoughness,iridescence:e.iridescence??t.iridescence,iridescenceIOR:e.iridescenceIOR??t.iridescenceIOR,iridescenceThicknessRange:e.iridescenceThicknessRange??t.iridescenceThicknessRange,subsurface:e.subsurface??t.subsurface,subsurfaceColor:e.subsurfaceColor??t.subsurfaceColor,subsurfaceRadius:e.subsurfaceRadius??t.subsurfaceRadius,subsurfaceRadiusScale:e.subsurfaceRadiusScale??t.subsurfaceRadiusScale,subsurfaceAnisotropy:e.subsurfaceAnisotropy??t.subsurfaceAnisotropy,anisotropy:e.anisotropy??t.anisotropy,anisotropyRotation:e.anisotropyRotation??t.anisotropyRotation,specularIntensity:i.specularIntensity??e.specularIntensity??t.specularIntensity,specularColor:i.specularColor??e.specularColor??t.specularColor,normalScale:e.normalScale??t.normalScale,bumpScale:e.bumpScale??t.bumpScale,displacementScale:e.displacementScale??t.displacementScale,transparent:+!!e.transparent,alphaTest:e.alphaTest??t.alphaTest,alphaMode:io(e),side:this.getMaterialSide(e),depthWrite:e.depthWrite??!0?1:0,map:this.processTexture(e.map,this.maps),normalMap:this.processTexture(e.normalMap,this.normalMaps),bumpMap:this.processTexture(e.bumpMap,this.bumpMaps),roughnessMap:this.processTexture(e.roughnessMap,this.roughnessMaps),metalnessMap:this.processTexture(e.metalnessMap,this.metalnessMaps),emissiveMap:this.processTexture(e.emissiveMap,this.emissiveMaps),displacementMap:this.processTexture(e.displacementMap,this.displacementMaps),anisotropyMap:this.processTexture(e.anisotropyMap,this.anisotropyMaps),clearcoatMap:this.processTexture(e.clearcoatMap,this.clearcoatMaps),clearcoatRoughnessMap:this.processTexture(e.clearcoatRoughnessMap,this.clearcoatRoughnessMaps),transmissionMap:this.processTexture(e.transmissionMap,this.transmissionMaps),thicknessMap:this.processTexture(e.thicknessMap,[]),sheenColorMap:this.processTexture(e.sheenColorMap,this.sheenColorMaps),sheenRoughnessMap:this.processTexture(e.sheenRoughnessMap,this.sheenRoughnessMaps),specularIntensityMap:this.processTexture(e.specularIntensityMap,this.specularIntensityMaps),specularColorMap:this.processTexture(e.specularColorMap,this.specularColorMaps),iridescenceMap:this.processTexture(e.iridescenceMap,this.iridescenceMaps),iridescenceThicknessMap:this.processTexture(e.iridescenceThicknessMap,this.iridescenceThicknessMaps),mapMatrix:this.getTextureMatrix(e.map),normalMapMatrices:this.getTextureMatrix(e.normalMap),bumpMapMatrices:this.getTextureMatrix(e.bumpMap),roughnessMapMatrices:this.getTextureMatrix(e.roughnessMap),metalnessMapMatrices:this.getTextureMatrix(e.metalnessMap),emissiveMapMatrices:this.getTextureMatrix(e.emissiveMap),displacementMapMatrices:this.getTextureMatrix(e.displacementMap),originalType:n}}getTextureMatrix(e){return e?(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<ro){t.push(e);let i=t.length-1;return n.set(r,i),i}return-1}extractGeometry(e,t,n){e.updateMatrix(),e.updateMatrixWorld();let r=e.geometry;r.attributes.normal||r.computeVertexNormals();let i=r.attributes.position,a=r.attributes.normal,o=r.attributes.uv,s=r.index?r.index.array:null;this._matrixPool.mat4.copy(e.matrixWorld),this._matrixPool.mat3.getNormalMatrix(this._matrixPool.mat4);let c=s?s.length/3:i.count/3;this.extractTrianglesInBatch(i,a,o,s,c,t,n)}extractTrianglesInBatch(e,t,n,r,i,a,o){for(;this.materialTriangleCounts.length<=a;)this.materialTriangleCounts.push(0);this.materialTriangleCounts[a]+=i;let s=this._getVec3(0),c=this._getVec3(1),l=this._getVec3(2),u=this._getVec3(3),d=this._getVec3(4),f=this._getVec3(5),p=this._getVec2(0),m=this._getVec2(1),h=this._getVec2(2);this._ensureCapacity(this.currentTriangleIndex+i);for(let g=0;g<i;g++){let i=g*3,_=r?r[i+0]:i+0,v=r?r[i+1]:i+1,y=r?r[i+2]:i+2;this.getVertex(e,_,s),this.getVertex(e,v,c),this.getVertex(e,y,l),this.getVertex(t,_,u),this.getVertex(t,v,d),this.getVertex(t,y,f),n?(this.getVertex(n,_,p),this.getVertex(n,v,m),this.getVertex(n,y,h)):(p.set(0,0),m.set(0,0),h.set(0,0)),s.applyMatrix4(this._matrixPool.mat4),c.applyMatrix4(this._matrixPool.mat4),l.applyMatrix4(this._matrixPool.mat4),u.applyMatrix3(this._matrixPool.mat3).normalize(),d.applyMatrix3(this._matrixPool.mat3).normalize(),f.applyMatrix3(this._matrixPool.mat3).normalize(),this.packTriangleDataTextureFormat(this.currentTriangleIndex,s,c,l,u,d,f,p,m,h,a,o),this.currentTriangleIndex++}}packTriangleDataTextureFormat(e,t,n,r,i,a,o,s,c,l,u,d){let f=e*H.FLOATS_PER_TRIANGLE;this.triangleData[f+H.POSITION_A_OFFSET+0]=t.x,this.triangleData[f+H.POSITION_A_OFFSET+1]=t.y,this.triangleData[f+H.POSITION_A_OFFSET+2]=t.z,this.triangleData[f+H.POSITION_A_OFFSET+3]=0,this.triangleData[f+H.POSITION_B_OFFSET+0]=n.x,this.triangleData[f+H.POSITION_B_OFFSET+1]=n.y,this.triangleData[f+H.POSITION_B_OFFSET+2]=n.z,this.triangleData[f+H.POSITION_B_OFFSET+3]=0,this.triangleData[f+H.POSITION_C_OFFSET+0]=r.x,this.triangleData[f+H.POSITION_C_OFFSET+1]=r.y,this.triangleData[f+H.POSITION_C_OFFSET+2]=r.z,this.triangleData[f+H.POSITION_C_OFFSET+3]=0,this.triangleData[f+H.NORMAL_A_OFFSET+0]=i.x,this.triangleData[f+H.NORMAL_A_OFFSET+1]=i.y,this.triangleData[f+H.NORMAL_A_OFFSET+2]=i.z;{let e=this.materials[u],t=e&&!(e.alphaMode|0)&&!(e.transparent|0)&&(e.transmission||0)===0&&(e.opacity??1)>=1?1:0;this.triangleData[f+H.NORMAL_A_OFFSET+3]=t}this.triangleData[f+H.NORMAL_B_OFFSET+0]=a.x,this.triangleData[f+H.NORMAL_B_OFFSET+1]=a.y,this.triangleData[f+H.NORMAL_B_OFFSET+2]=a.z,this.triangleData[f+H.NORMAL_B_OFFSET+3]=0,this.triangleData[f+H.NORMAL_C_OFFSET+0]=o.x,this.triangleData[f+H.NORMAL_C_OFFSET+1]=o.y,this.triangleData[f+H.NORMAL_C_OFFSET+2]=o.z,this.triangleData[f+H.NORMAL_C_OFFSET+3]=this.materials[u]?.side??0,this.triangleData[f+H.UV_AB_OFFSET+0]=s.x,this.triangleData[f+H.UV_AB_OFFSET+1]=s.y,this.triangleData[f+H.UV_AB_OFFSET+2]=c.x,this.triangleData[f+H.UV_AB_OFFSET+3]=c.y,this.triangleData[f+H.UV_C_MAT_OFFSET+0]=l.x,this.triangleData[f+H.UV_C_MAT_OFFSET+1]=l.y,this.triangleData[f+H.UV_C_MAT_OFFSET+2]=u,this.triangleData[f+H.UV_C_MAT_OFFSET+3]=d}getTriangleData(){return this.triangleData?this.triangleData.subarray(0,this.currentTriangleIndex*H.FLOATS_PER_TRIANGLE):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*H.FLOATS_PER_TRIANGLE*4;no.debug(G.list([`${G.count(this.currentTriangleIndex,`tri`)} (${G.mb(e)})`,G.count(this.materials.length,`material`),G.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.triangleData=null,this.triangleCount=0,this.currentTriangleIndex=0,this.materials=[],this.materialTriangleCounts=[],this.meshes=[],this.meshTriangleRanges=[],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,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}}},oo=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=co(E,so(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=co(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 so(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 co(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)}}var lo=K(`emissive`),uo=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){this.emissiveTriangles=[],this.totalEmissivePower=0,this._totalTriangleCount=n;let r=H.FLOATS_PER_TRIANGLE,i=H.UV_C_MAT_OFFSET+2,a=H.UV_C_MAT_OFFSET+3;for(let o=0;o<n;o++){let n=o*r,s=Math.floor(e[n+i]),c=Math.floor(e[n+a]),l=t[s];if(!l)continue;let u=l.emissive||{r:0,g:0,b:0},d=l.emissiveIntensity||0;if(d>0&&(u.r>0||u.g>0||u.b>0)){let t=e[n+0],r=e[n+1],i=e[n+2],a=e[n+4],f=e[n+5],p=e[n+6],m=e[n+8],h=e[n+9],g=e[n+10],_=this._calculateTriangleArea(t,r,i,a,f,p,m,h,g),v=(.2126*u.r+.7152*u.g+.0722*u.b)*d*_,y=(f-r)*(g-i)-(p-i)*(h-r),b=(p-i)*(m-t)-(a-t)*(g-i),x=(a-t)*(h-r)-(f-r)*(m-t),S=Math.sqrt(y*y+b*b+x*x)||1,C=l.side===1?-1:1;y=y/S*C,b=b/S*C,x=x/S*C;let w=l.side===2,T=(t+a+m)/3,E=(r+f+h)/3,D=(i+p+g)/3,O=Math.min(t,a,m),k=Math.min(r,f,h),A=Math.min(i,p,g),j=Math.max(t,a,m),M=Math.max(r,f,h),N=Math.max(i,p,g);this.emissiveTriangles.push({triangleIndex:o,materialIndex:s,meshIndex:c,power:v,area:_,emissive:{r:u.r,g:u.g,b:u.b},emissiveIntensity:d,cx:T,cy:E,cz:D,bMinX:O,bMinY:k,bMinZ:A,bMaxX:j,bMaxY:M,bMaxZ:N,nx:y,ny:b,nz:x,twoSided:w}),this.totalEmissivePower+=v}}return this.emissiveCount=this.emissiveTriangles.length,this.emissiveCount>0&&lo.debug(`${G.n(this.emissiveCount)} emissive tris (${(this.emissiveCount/n*100).toFixed(2)}%) · total power ${this.totalEmissivePower.toFixed(2)}`),this._buildDataArrays(),this.emissiveCount}_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,lo.debug(`emissive texture ${G.px(t,n)} · ${G.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]=this.totalEmissivePower>0?n.power/this.totalEmissivePower:0,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 lo.debug(`emissive raw data ${G.n(this.emissiveCount)} entries (${G.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=t.emissive||{r:0,g:0,b:0},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 oo().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]=this.totalEmissivePower>0?n.power/this.totalEmissivePower:0,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,lo.debug(`rebuilt sorted emissive data · ${G.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}},fo=class{constructor(e=`Build`,{namespace:t=`build`,level:n=`debug`}={}){this.label=e,this.level=n,this.logger=K(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=G.list([this.label,...e,G.ms(t)]);return this.level===`info`?this.logger.summary(r,n):this.logger.debug(G.list([r,n.join(` · `)])),{steps:Object.fromEntries(this.order.map(e=>[e,Math.round(this.entries.get(e)?.duration??0)])),total:Math.round(t)}}},po="const e={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20},t=e.FLOATS_PER_TRIANGLE,n=new class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(n,r,i){let a=i.length;for(let o=0;o<a;o++){let a=i[o],s=o*t,c=a*9,l=r[c],u=r[c+1],d=r[c+2],f=r[c+3],p=r[c+4],m=r[c+5],h=r[c+6],g=r[c+7],_=r[c+8];n[s+e.POSITION_A_OFFSET]=l,n[s+e.POSITION_A_OFFSET+1]=u,n[s+e.POSITION_A_OFFSET+2]=d,n[s+e.POSITION_B_OFFSET]=f,n[s+e.POSITION_B_OFFSET+1]=p,n[s+e.POSITION_B_OFFSET+2]=m,n[s+e.POSITION_C_OFFSET]=h,n[s+e.POSITION_C_OFFSET+1]=g,n[s+e.POSITION_C_OFFSET+2]=_;let v=f-l,y=p-u,b=m-d,x=h-l,S=g-u,C=_-d,w=y*C-b*S,T=b*x-v*C,E=v*S-y*x;n[s+e.NORMAL_A_OFFSET]=w,n[s+e.NORMAL_A_OFFSET+1]=T,n[s+e.NORMAL_A_OFFSET+2]=E,n[s+e.NORMAL_B_OFFSET]=w,n[s+e.NORMAL_B_OFFSET+1]=T,n[s+e.NORMAL_B_OFFSET+2]=E,n[s+e.NORMAL_C_OFFSET]=w,n[s+e.NORMAL_C_OFFSET+1]=T,n[s+e.NORMAL_C_OFFSET+2]=E}}refitRange(n,r,i,a){a>this._boundsNodeCount&&(this._bounds=new Float32Array(a*6),this._boundsNodeCount=a);let o=this._bounds,s=i+a;for(let a=s-1;a>=i;a--){let s=a*16,c=(a-i)*6;if(n[s+3]===-1){let i=n[s],a=n[s+1],l=1/0,u=1/0,d=1/0,f=-1/0,p=-1/0,m=-1/0;for(let n=0;n<a;n++){let a=(i+n)*t,o=r[a+e.POSITION_A_OFFSET],s=r[a+e.POSITION_A_OFFSET+1],c=r[a+e.POSITION_A_OFFSET+2],h=r[a+e.POSITION_B_OFFSET],g=r[a+e.POSITION_B_OFFSET+1],_=r[a+e.POSITION_B_OFFSET+2],v=r[a+e.POSITION_C_OFFSET],y=r[a+e.POSITION_C_OFFSET+1],b=r[a+e.POSITION_C_OFFSET+2];l=Math.min(l,o,h,v),u=Math.min(u,s,g,y),d=Math.min(d,c,_,b),f=Math.max(f,o,h,v),p=Math.max(p,s,g,y),m=Math.max(m,c,_,b)}o[c]=l,o[c+1]=u,o[c+2]=d,o[c+3]=f,o[c+4]=p,o[c+5]=m}else{let e=n[s+3],t=n[s+7],r=(e-i)*6,a=(t-i)*6,l=o[r],u=o[r+1],d=o[r+2],f=o[r+3],p=o[r+4],m=o[r+5],h=o[a],g=o[a+1],_=o[a+2],v=o[a+3],y=o[a+4],b=o[a+5];n[s]=l,n[s+1]=u,n[s+2]=d,n[s+4]=f,n[s+5]=p,n[s+6]=m,n[s+8]=h,n[s+9]=g,n[s+10]=_,n[s+12]=v,n[s+13]=y,n[s+14]=b,o[c]=Math.min(l,h),o[c+1]=Math.min(u,g),o[c+2]=Math.min(d,_),o[c+3]=Math.max(f,v),o[c+4]=Math.max(p,y),o[c+5]=Math.max(m,b)}}}refit(n,r,i){i!==this._boundsNodeCount&&(this._bounds=new Float32Array(i*6),this._boundsNodeCount=i);let a=this._bounds;for(let o=i-1;o>=0;o--){let i=o*16,s=o*6,c=n[i+3];if(c===-1){let o=n[i],c=n[i+1],l=1/0,u=1/0,d=1/0,f=-1/0,p=-1/0,m=-1/0;for(let n=0;n<c;n++){let i=(o+n)*t,a=r[i+e.POSITION_A_OFFSET],s=r[i+e.POSITION_A_OFFSET+1],c=r[i+e.POSITION_A_OFFSET+2],h=r[i+e.POSITION_B_OFFSET],g=r[i+e.POSITION_B_OFFSET+1],_=r[i+e.POSITION_B_OFFSET+2],v=r[i+e.POSITION_C_OFFSET],y=r[i+e.POSITION_C_OFFSET+1],b=r[i+e.POSITION_C_OFFSET+2];l=Math.min(l,a,h,v),u=Math.min(u,s,g,y),d=Math.min(d,c,_,b),f=Math.max(f,a,h,v),p=Math.max(p,s,g,y),m=Math.max(m,c,_,b)}a[s]=l,a[s+1]=u,a[s+2]=d,a[s+3]=f,a[s+4]=p,a[s+5]=m}else if(c===-2){let e=n[i]*6;a[s]=a[e],a[s+1]=a[e+1],a[s+2]=a[e+2],a[s+3]=a[e+3],a[s+4]=a[e+4],a[s+5]=a[e+5]}else{let e=n[i+3],t=n[i+7],r=e*6,o=t*6,c=a[r],l=a[r+1],u=a[r+2],d=a[r+3],f=a[r+4],p=a[r+5],m=a[o],h=a[o+1],g=a[o+2],_=a[o+3],v=a[o+4],y=a[o+5];n[i]=c,n[i+1]=l,n[i+2]=u,n[i+4]=d,n[i+5]=f,n[i+6]=p,n[i+8]=m,n[i+9]=h,n[i+10]=g,n[i+12]=_,n[i+13]=v,n[i+14]=y,a[s]=Math.min(c,m),a[s+1]=Math.min(l,h),a[s+2]=Math.min(u,g),a[s+3]=Math.max(d,_),a[s+4]=Math.max(f,v),a[s+5]=Math.max(p,y)}}}};let r=null,i=null,a=null,o=null,s=0;self.onmessage=function(e){let{type:t}=e.data;if(t===`init`){r=new Float32Array(e.data.sharedBvhBuf),i=new Float32Array(e.data.sharedTriBuf),a=new Float32Array(e.data.sharedPosBuf),o=e.data.bvhToOriginal,s=r.length/16;return}if(t===`refit`)try{let e=performance.now();n.updateTrianglePositions(i,a,o),n.refit(r,i,s),self.postMessage({type:`refitComplete`,refitTimeMs:performance.now()-e})}catch(e){console.error(`[BVHRefitWorker] Refit error:`,e),self.postMessage({type:`error`,error:e.message})}};",mo=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,po],{type:`text/javascript;charset=utf-8`});function ho(e){let t;try{if(t=mo&&(self.URL||self.webkitURL).createObjectURL(mo),!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(po),{type:`module`,name:e?.name})}}var go=K(`scene`),_o=class{constructor(e={}){this.config={useWorkers:!0,bvhDepth:30,maxLeafSize:4,verbose:!1,useFloat32Array:!0,textureQuality:`adaptive`,maxTextureSize:Xe.DEFAULT_MAX_TEXTURE_SIZE,enableTextureCache:!0,maxConcurrentTextureTasks:Math.min(navigator.hardwareConcurrency||4,6),enableTreeletOptimization:!1,treeletSize:7,treeletOptimizationPasses:1,treeletMinImprovement:.01,treeletComplexityThreshold:5e4,...e},this.triangleData=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.bvhData=null,this.materialData=null,this.instanceTable=null,this.originalToBvhMap=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.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,totalProcessingTime:0}}setMaxTextureSize(e){return this.config.maxTextureSize=e,this.textureCreator?.setMaxTextureSize(e)}_initProcessors(){this.geometryExtractor=new ao,this.bvhBuilder=new ba,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 eo({maxTextureSize:this.config.maxTextureSize,issues:this.config.issues}),this.emissiveTriangleBuilder=new uo,this.tlasBuilder=new Ha}_log(e,t){t===void 0?go.debug(e):go.debug(e,t)}async buildBVH(e){if(this.isProcessing)throw Error(`Already processing a scene. Call dispose() first.`);this.isProcessing=!0,this.processingStage=`init`;let t=new fo(e.name??``,{namespace:`scene`});try{this._reset(),this._log(`Starting scene processing`),this.processingStage=`extraction`,t.start(`Geometry extraction`),await this._extractGeometry(e),t.end(`Geometry extraction`),this.performanceMetrics.geometryExtractionTime=t.getDuration(`Geometry extraction`),this.processingStage=`bvh`,t.start(`BVH construction (worker)`),t.start(`Material textures (parallel)`);let n=!1,r=this._buildBVH().then(()=>t.end(`BVH construction (worker)`)),i=this._createMaterialTextures().then(()=>{t.end(`Material textures (parallel)`),n=!0});return await r,z({status:`Building light data...`,progress:77}),t.start(`Emissive extraction + Light BVH`),this._buildEmissiveData(),t.end(`Emissive extraction + Light BVH`),n||z({status:`Processing material textures...`,progress:80}),await i,this.performanceMetrics.bvhBuildTime=t.getDuration(`BVH construction (worker)`),this.performanceMetrics.textureCreationTime=t.getDuration(`Material textures (parallel)`),this.processingStage=`finalize`,t.start(`BVH data packing`),this.bvhRoot&&!this.bvhData&&(this.bvhData=this.textureCreator.createBVHRawData(this.bvhRoot)),t.end(`BVH data packing`),this.spheres=this._createSpheres(),this.performanceMetrics.totalProcessingTime=performance.now()-t.totalStart,t.print(),this.processingStage=`complete`,z({status:`Scene data ready`,progress:85}),this}catch(e){throw this.processingStage=`error`,go.error(`processing failed:`,e),z({status:`Error: ${e.message}`,progress:100}),e}finally{this.isProcessing=!1}}async _extractGeometry(e){z({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{let n=this.geometryExtractor.extract(e);this.triangleData=n.triangleData,this.triangleCount=n.triangleCount,this._log(`Using Float32Array format: ${this.triangleCount} triangles, ${(this.triangleData.byteLength/(1024*1024)).toFixed(2)}MB`),this.materials=n.materials,this.materialTriangleCounts=n.materialTriangleCounts,this.meshes=n.meshes,this.meshTriangleRanges=n.meshTriangleRanges,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,this.anisotropyMaps=n.anisotropyMaps,this.transmissionMaps=n.transmissionMaps,this.clearcoatMaps=n.clearcoatMaps,this.clearcoatRoughnessMaps=n.clearcoatRoughnessMaps,this.sheenColorMaps=n.sheenColorMaps,this.sheenRoughnessMaps=n.sheenRoughnessMaps,this.iridescenceMaps=n.iridescenceMaps,this.iridescenceThicknessMaps=n.iridescenceThicknessMaps,this.specularIntensityMaps=n.specularIntensityMaps,this.specularColorMaps=n.specularColorMaps,this.directionalLights=n.directionalLights,this.cameras=n.cameras;let r=performance.now()-t;this._log(`Geometry extraction complete (${r.toFixed(2)}ms)`,{triangleCount:this.triangleCount,materials:this.materials.length}),z({status:`Extracted ${this.triangleCount.toLocaleString()} triangles`,progress:25})}catch(e){throw go.error(`geometry extraction failed:`,e),z({status:`Extraction error: ${e.message}`,progress:25}),e}}async _buildBVH(){if(z({status:`Building BVH...`,progress:25}),this.triangleCount===0)throw Error(`No triangles to build BVH from`);this._log(`Building two-level BVH (TLAS/BLAS)`);let e=performance.now();try{let t=H.FLOATS_PER_TRIANGLE,n=this.meshTriangleRanges;if(!n||n.length===0)throw Error(`No mesh triangle ranges available for TLAS/BLAS build`);this.instanceTable=new Ua,this.instanceTable.allocate(n.length);let r=n.length,i=this.config.enableTreeletOptimization,a=[],o=[];for(let e=0;e<r;e++){let t=n[e];t.count!==0&&(t.count>=2e5&&za(t.count)?o.push({m:e,range:t}):a.push({m:e,range:t}))}let s={depth:this.config.bvhDepth,treeletOptimization:{enabled:i!==!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,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,logLevel:bt()},c=a.length+o.length,l=this._buildBLASesWithPool(a,s,e=>{z({status:`Building BLAS ${e+o.length}/${c}...`,progress:25+Math.floor(e/c*45)})}),u=o.map(({m:e,range:n})=>Ia(this.triangleData.slice(n.start*t,(n.start+n.count)*t),this.config.bvhDepth,null,{maxLeafSize:this.bvhBuilder.maxLeafSize,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,...s}).then(t=>({m:e,range:n,result:t}))),[d,f]=await Promise.all([l,Promise.all(u)]),p={sah:0,objMed:0,spatMed:0,failed:0,treeletsImproved:0,treeletsProcessed:0};for(let{m:e,range:n,result:r}of[...d,...f]){r.reorderedTriangles&&this.triangleData.set(r.reorderedTriangles,n.start*t);let i=r.splitStats;i&&(p.sah+=i.sahSplits??0,p.objMed+=i.objectMedianSplits??0,p.spatMed+=i.spatialMedianSplits??0,p.failed+=i.failedSplits??0,p.treeletsImproved+=i.treeletsImproved??0,p.treeletsProcessed+=i.treeletsProcessed??0),this.instanceTable.setEntry({meshIndex:e,blasNodeCount:r.bvhData.length/16,triOffset:n.start,triCount:n.count,originalToBvhMap:r.originalToBvh||null,bvhData:r.bvhData})}z({status:`Built all BLASes`,progress:70}),z({status:`Building TLAS...`,progress:72});let m=this.instanceTable.entries.filter(e=>e!==null);this.instanceTable.computeAABBs(this.triangleData);let{root:h,nodeCount:g}=this.tlasBuilder.build(m);this.instanceTable.assignOffsets(g);let _=this.instanceTable.totalNodeCount,v=this.tlasBuilder.flatten(h,m);this.bvhData=new Float32Array(_*16),this.bvhData.set(v);for(let e of m){let t=e.blasOffset*16;this.bvhData.set(e.bvhData,t),this._offsetBLASInPlace(t,e.bvhData.length/16,e.blasOffset,e.triOffset)}this._buildGlobalOriginalToBvhMap();for(let e of m)e.originalToBvhMap=null,e.bvhData=null;this.bvhRoot=!0,this._disposeRefitWorker();let y=performance.now()-e;go.debug(G.list([`${G.n(m.length)} BLASes + TLAS`,`${G.n(this.bvhData.length/16)} nodes`,`SAH ${G.n(p.sah)} · objMed ${p.objMed} · spatMed ${p.spatMed} · failed ${p.failed}`,p.treeletsProcessed?`treelets ${p.treeletsImproved}/${p.treeletsProcessed} improved`:null,G.ms(y)])),z({status:`BVH construction complete`,progress:75})}catch(e){throw go.error(`BVH build failed:`,e),z({status:`BVH error: ${e.message}`,progress:75}),e}}_offsetBLASInPlace(e,t,n,r){for(let i=0;i<t;i++){let t=e+i*16;this.bvhData[t+3]===-1?this.bvhData[t]+=r:(this.bvhData[t+3]+=n,this.bvhData[t+7]+=n)}}_buildBLASesWithPool(e,t,n){if(e.length===0)return Promise.resolve([]);let r=H.FLOATS_PER_TRIANGLE,i=Math.min(e.length,this.config.maxConcurrentTextureTasks||4),a=[],o=0,s=0;return new Promise((c,l)=>{let u=[],d=n=>{if(o>=e.length){n.terminate(),u.splice(u.indexOf(n),1),u.length===0&&c(a);return}let{m:i,range:s}=e[o++],l=this.triangleData.slice(s.start*r,(s.start+s.count)*r),d=s.count,f=d<=500?{...t.treeletOptimization,enabled:!1}:t.treeletOptimization;n._currentTask={m:i,range:s},n.postMessage({triangleData:l.buffer,triangleByteOffset:l.byteOffset,triangleByteLength:l.byteLength,triangleCount:d,depth:t.depth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:f,reinsertionOptimization:t.reinsertionOptimization,maxLeafSize:t.maxLeafSize,numBins:t.numBins,maxBins:t.maxBins,minBins:t.minBins,logLevel:t.logLevel},[l.buffer])},f=(e,t)=>{let r=t.data;if(r.error){u.forEach(e=>e.terminate()),l(Error(r.error));return}if(r.progress!==void 0)return;let{m:i,range:o}=e._currentTask;a.push({m:i,range:o,result:{bvhData:r.bvhData,reorderedTriangles:r.triangles||null,originalToBvh:r.originalToBvh||null,splitStats:r.treeletStats||null}}),s++,n?.(s),d(e)};(async()=>{for(let e=0;e<i;e++){let e;try{e=new Oa}catch(e){l(e);return}e.onmessage=t=>f(e,t),e.onerror=e=>{u.forEach(e=>e.terminate()),l(e)},u.push(e),d(e)}})().catch(l)})}_buildGlobalOriginalToBvhMap(){this.originalToBvhMap=new Uint32Array(this.triangleCount);for(let e of this.instanceTable.entries){if(!e)continue;let t=new Uint32Array(e.triCount);if(e.originalToBvhMap)for(let n=0;n<e.triCount;n++){let r=e.originalToBvhMap[n];this.originalToBvhMap[e.triOffset+n]=e.triOffset+r,t[r]=n}else for(let n=0;n<e.triCount;n++)this.originalToBvhMap[e.triOffset+n]=e.triOffset+n,t[n]=n;e.bvhToOriginal=t}}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).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 go.error(`texture creation failed:`,e),e}}_bucketTextures(){let e=this.config.maxTextureSize,t=Xe.MATERIAL_BUCKET_COUNT,n=Xe.BUCKET_LAYER_STRIDE,r=Array.from({length:t},()=>[]),i=Array.from({length:t},()=>[]),a=Array.from({length:t},()=>new Map),o=Array.from({length:t},()=>new Map);this._srgbTexPacked=new Map,this._linearTexPacked=new Map;let s=(r,i,a,o)=>{if(!r||!r.image)return-1;let s=Qe(r.image.width,r.image.height,e,t),c=r.source?.uuid??r.uuid,l=a[s].get(c);if(l!==void 0)return $e(s,l);if(i[s].length>=n)return go.warn(`texture bucket ${s} full (${n}); dropping a map`),-1;i[s].push(r);let u=i[s].length-1;a[s].set(c,u);let d=$e(s,u);return o.set(c,d),d},c=(e,t,n,r)=>(e||[]).map(e=>s(e,t,n,r));return{srgbLists:r,linearLists:i,remap:{albedo:c(this.maps,r,a,this._srgbTexPacked),emissive:c(this.emissiveMaps,r,a,this._srgbTexPacked),normal:c(this.normalMaps,i,o,this._linearTexPacked),bump:c(this.bumpMaps,i,o,this._linearTexPacked),roughness:c(this.roughnessMaps,i,o,this._linearTexPacked),metalness:c(this.metalnessMaps,i,o,this._linearTexPacked),displacement:c(this.displacementMaps,i,o,this._linearTexPacked),anisotropy:c(this.anisotropyMaps,i,o,this._linearTexPacked),transmission:c(this.transmissionMaps,i,o,this._linearTexPacked),clearcoat:c(this.clearcoatMaps,i,o,this._linearTexPacked),clearcoatRoughness:c(this.clearcoatRoughnessMaps,i,o,this._linearTexPacked),sheenColor:c(this.sheenColorMaps,r,a,this._srgbTexPacked),sheenRoughness:c(this.sheenRoughnessMaps,i,o,this._linearTexPacked),iridescence:c(this.iridescenceMaps,i,o,this._linearTexPacked),iridescenceThickness:c(this.iridescenceThicknessMaps,i,o,this._linearTexPacked),specularIntensity:c(this.specularIntensityMaps,i,o,this._linearTexPacked),specularColor:c(this.specularColorMaps,r,a,this._srgbTexPacked)}}}_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.triangleData,this.materials,this.triangleCount),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._disposeTextures(),this.triangles=[],this.triangleData=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.bvhData=null,this.instanceTable=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime: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){go.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 go.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.bvhData,useFloat32Array:this.config.useFloat32Array,triangleDataSize:this.triangleData?(this.triangleData.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)}async refitBVH(e,t){if(!this.bvhData||!this.triangleData||!this.originalToBvhMap)throw Error(`No BVH data available for refit. Run buildBVH() first.`);let n=this.triangleCount*9;if(e?.length!==n)throw Error(`SceneProcessor.refitBVH: expected ${n} position floats (${this.triangleCount} triangles × 9), got ${e?.length??`none`}. Positions must cover every triangle in the scene, meshes in this.meshes order.`);if(t&&t.length!==n)throw Error(`SceneProcessor.refitBVH: expected ${n} normal floats, got ${t.length}.`);if(this._refitWorker||=new ho,!this._refitSharedBuffers){let t=new SharedArrayBuffer(this.bvhData.byteLength),n=new SharedArrayBuffer(this.triangleData.byteLength),r=new SharedArrayBuffer(e.byteLength),i=new Float32Array(t),a=new Float32Array(n);i.set(this.bvhData),a.set(this.triangleData),this.bvhData=i,this.triangleData=a;let o=this.originalToBvhMap.length,s=new Uint32Array(o);for(let e=0;e<o;e++)s[this.originalToBvhMap[e]]=e;this._refitSharedBuffers={bvhBuf:t,triBuf:n,posBuf:r,posView:new Float32Array(r)},this._refitWorker.postMessage({type:`init`,sharedBvhBuf:t,sharedTriBuf:n,sharedPosBuf:r,bvhToOriginal:s},[s.buffer])}return this._refitSharedBuffers.posView.set(e),new Promise((e,n)=>{this._refitWorker.onmessage=r=>{let i=r.data;i.type===`refitComplete`?(t&&this._patchSmoothNormals(t),e({refitTimeMs:i.refitTimeMs})):i.type===`error`&&n(Error(i.error))},this._refitWorker.postMessage({type:`refit`})})}_patchSmoothNormals(e){this._patchNormalsRange(e,0,this.originalToBvhMap.length)}refitBLASes(e,t,n){if(!this.instanceTable||!this.bvhData||!this.triangleData)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let r=this.triangleCount*9;if(t?.length!==r)throw Error(`SceneProcessor.refitBLASes: expected ${r} position floats (${this.triangleCount} triangles × 9, full scene), got ${t?.length??`none`}.`);if(n&&n.length!==r)throw Error(`SceneProcessor.refitBLASes: expected ${r} normal floats, got ${n.length}.`);let i=performance.now();this._blasRefitter||=new Ta;for(let r of e){let e=this.instanceTable.entries[r];e&&(this._updateMeshTrianglePositions(e,t),n&&this._patchMeshSmoothNormals(e,n),this._blasRefitter.refitRange(this.bvhData,this.triangleData,e.blasOffset,e.blasNodeCount),this.instanceTable.recomputeAABB(r,this.bvhData,this.triangleData))}return this._refitTLAS(),{refitTimeMs:performance.now()-i}}computeBLASDirtyRanges(e){let t=H.FLOATS_PER_TRIANGLE,n=[],r=[];for(let i of e){let e=this.instanceTable.entries[i];e&&(n.push({offset:e.triOffset*t,count:e.triCount*t}),r.push({offset:e.blasOffset*16,count:e.blasNodeCount*16}))}return r.push({offset:0,count:this.instanceTable.tlasNodeCount*16}),{triRanges:n,bvhRanges:r}}uploadToPathTracer(e,t,n,r){return this.triangleData?(e.setTriangleData(this.triangleData,this.triangleCount),this.bvhData?(e.setBVHData(this.bvhData),e.setInstanceTable(this.instanceTable),this.materialData?e.materialData.setMaterialData(this.materialData):go.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.lightBVHNodeData&&e.setLightBVHData(this.lightBVHNodeData,this.lightBVHNodeCount),t.transferSceneLights(n),!0):(go.error(`failed to get BVH data`),!1)):(go.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.triangleData,this.materials,this.triangleCount))?null:this._collectEmissivePayload()}rebuildEmissiveForVisibility(e,t=!1){return!this.emissiveTriangleBuilder||!this.emissiveTriangleBuilder.setHiddenMeshes(e)&&!t?null:this._collectEmissivePayload()}_collectEmissivePayload(){return 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,{rawData:this.emissiveTriangleData,emissiveCount:this.emissiveTriangleCount,totalPower:this.emissiveTotalPower,bitTrailMap:this.emissiveBitTrailMap,lightBVHNodeData:this.lightBVHNodeData,lightBVHNodeCount:this.lightBVHNodeCount}}_updateMeshTrianglePositions(e,t){let n=H.FLOATS_PER_TRIANGLE,r=H.POSITION_A_OFFSET,i=H.POSITION_B_OFFSET,a=H.POSITION_C_OFFSET,o=H.NORMAL_A_OFFSET,s=H.NORMAL_B_OFFSET,c=H.NORMAL_C_OFFSET,l=e.bvhToOriginal;for(let u=0;u<e.triCount;u++){let d=l[u],f=(e.triOffset+u)*n,p=(e.triOffset+d)*9,m=t[p],h=t[p+1],g=t[p+2],_=t[p+3],v=t[p+4],y=t[p+5],b=t[p+6],x=t[p+7],S=t[p+8];this.triangleData[f+r]=m,this.triangleData[f+r+1]=h,this.triangleData[f+r+2]=g,this.triangleData[f+i]=_,this.triangleData[f+i+1]=v,this.triangleData[f+i+2]=y,this.triangleData[f+a]=b,this.triangleData[f+a+1]=x,this.triangleData[f+a+2]=S;let C=_-m,w=v-h,T=y-g,E=b-m,D=x-h,O=S-g,k=w*O-T*D,A=T*E-C*O,j=C*D-w*E;this.triangleData[f+o]=k,this.triangleData[f+o+1]=A,this.triangleData[f+o+2]=j,this.triangleData[f+s]=k,this.triangleData[f+s+1]=A,this.triangleData[f+s+2]=j,this.triangleData[f+c]=k,this.triangleData[f+c+1]=A,this.triangleData[f+c+2]=j}}_patchMeshSmoothNormals(e,t){this._patchNormalsRange(t,e.triOffset,e.triCount)}_patchNormalsRange(e,t,n){let r=H.FLOATS_PER_TRIANGLE,i=H.NORMAL_A_OFFSET,a=H.NORMAL_B_OFFSET,o=H.NORMAL_C_OFFSET;for(let s=0;s<n;s++){let n=t+s,c=this.originalToBvhMap[n]*r,l=n*9;this.triangleData[c+i]=e[l],this.triangleData[c+i+1]=e[l+1],this.triangleData[c+i+2]=e[l+2],this.triangleData[c+a]=e[l+3],this.triangleData[c+a+1]=e[l+4],this.triangleData[c+a+2]=e[l+5],this.triangleData[c+o]=e[l+6],this.triangleData[c+o+1]=e[l+7],this.triangleData[c+o+2]=e[l+8]}}_refitTLAS(){let e=this.instanceTable.tlasNodeCount;(!this._tlasBounds||this._tlasBounds.length<e*6)&&(this._tlasBounds=new Float32Array(e*6)),this._blasOffsetMap||=new Map,this._blasOffsetMap.clear();for(let e of this.instanceTable.entries)e&&this._blasOffsetMap.set(e.blasOffset,e);for(let t=e-1;t>=0;t--){let e=t*16,n=this.bvhData[e+3];if(n===-2){let n=this.bvhData[e],r=this._blasOffsetMap.get(n);if(r&&r.worldAABB){let e=t*6;this._tlasBounds[e]=r.worldAABB.minX,this._tlasBounds[e+1]=r.worldAABB.minY,this._tlasBounds[e+2]=r.worldAABB.minZ,this._tlasBounds[e+3]=r.worldAABB.maxX,this._tlasBounds[e+4]=r.worldAABB.maxY,this._tlasBounds[e+5]=r.worldAABB.maxZ}}else if(n>=0){let n=this.bvhData[e+3],r=this.bvhData[e+7],i=n*6,a=r*6,o=this._tlasBounds;this.bvhData[e]=o[i],this.bvhData[e+1]=o[i+1],this.bvhData[e+2]=o[i+2],this.bvhData[e+4]=o[i+3],this.bvhData[e+5]=o[i+4],this.bvhData[e+6]=o[i+5],this.bvhData[e+8]=o[a],this.bvhData[e+9]=o[a+1],this.bvhData[e+10]=o[a+2],this.bvhData[e+12]=o[a+3],this.bvhData[e+13]=o[a+4],this.bvhData[e+14]=o[a+5];let s=t*6;o[s]=Math.min(o[i],o[a]),o[s+1]=Math.min(o[i+1],o[a+1]),o[s+2]=Math.min(o[i+2],o[a+2]),o[s+3]=Math.max(o[i+3],o[a+3]),o[s+4]=Math.max(o[i+4],o[a+4]),o[s+5]=Math.max(o[i+5],o[a+5])}}}scheduleBackgroundRebuild(e,t){if(!this.instanceTable||!this.triangleData)return;let n=H.FLOATS_PER_TRIANGLE;this._rebuildGeneration++;let r=this._rebuildGeneration,i=(e,i,a)=>{let o=this.triangleData.slice(i.triOffset*n,(i.triOffset+i.triCount)*n);this._pendingRebuilds.set(e,a),a.onmessage=n=>{let o=n.data;if(a.terminate(),this._pendingRebuilds.delete(e),o.error){go.error(`background BLAS rebuild failed (mesh ${e}):`,o.error);return}r===this._rebuildGeneration&&this._swapBLAS(e,i,o,t)},a.onerror=t=>{go.error(`background BLAS rebuild worker failed (mesh ${e}):`,t),a.terminate(),this._pendingRebuilds.delete(e)};let s=i.triCount>500;a.postMessage({triangleData:o.buffer,triangleByteOffset:o.byteOffset,triangleByteLength:o.byteLength,triangleCount:i.triCount,depth:this.config.bvhDepth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:{enabled:s,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}},[o.buffer])};for(let t of e){let e=this.instanceTable.entries[t];if(!e)continue;let n=this._pendingRebuilds.get(t);n&&n.terminate(),i(t,e,new Oa)}}_swapBLAS(e,t,n,r){let i=n.bvhData,a=i.length/16;if(a!==t.blasNodeCount){go.warn(`background rebuild node count mismatch for mesh ${e} (${a} vs ${t.blasNodeCount}), skipping swap`);return}let o=t.blasOffset*16;this.bvhData.set(i,o),this._offsetBLASInPlace(o,a,t.blasOffset,t.triOffset);let s=H.FLOATS_PER_TRIANGLE,c=n.triangles;c&&this.triangleData.set(c,t.triOffset*s);let l=n.originalToBvh;if(l){for(let e=0;e<t.triCount;e++)this.originalToBvhMap[t.triOffset+e]=t.triOffset+l[e];let e=new Uint32Array(t.triCount);for(let n=0;n<t.triCount;n++)e[l[n]]=n;t.bvhToOriginal=e}this.instanceTable.recomputeAABB(e,this.bvhData,this.triangleData),this._refitTLAS(),this._log(`Background BLAS rebuild complete for mesh ${e}`),r?.()}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()}dispose(){this._log(`Disposing resources`),this._disposeRefitWorker(),this._disposeTextures(),this._reset(),this.textureCreator&&=(this.textureCreator.dispose(),null),this.geometryExtractor=null,this.bvhBuilder=null,this.tlasBuilder=null,this._blasRefitter=null}},vo=[[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]],yo=[[-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]],bo=[[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 xo(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=vo[i],o=yo[i],s=bo[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 So=1/(4*Math.PI);function Co(e){let t=e.userData||{},n=Number.isFinite(t.exposure)?t.exposure:0,r=e.intensity*2**n,i=e.color.r,a=e.color.g,o=e.color.b;if(t.useTemperature){let[e,n,r]=xo(t.temperature??6500);i*=e,a*=n,o*=r}return{r:i,g:a,b:o,intensity:r}}var wo=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=Co(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=Co(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=Co(e);this.pointLightCache.push({data:[t.x,t.y,t.z,i.r,i.g,i.b,i.intensity*So,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=Co(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*So,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}))}}},To={stbnScalarAtlas:`https://assets.rayzee.atulmourya.com/noise/stbn_scalar_atlas.png`,stbnVec2Atlas:`https://assets.rayzee.atulmourya.com/noise/stbn_vec2_atlas.png`,ortRuntimeUrl:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/ort.webgpu.bundle.min.mjs`,ortWasmPaths:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/`,dracoDecoderPath:`https://www.gstatic.com/draco/v1/decoders/`,ktx2TranscoderPath:`https://cdn.jsdelivr.net/npm/three@0.183.2/examples/jsm/libs/basis/`,oidnWeightsBaseUrl:`https://cdn.jsdelivr.net/npm/denoiser/tzas/`,upscalerModelBaseUrl:`https://huggingface.co/notaneimu/onnx-image-models/resolve/main/`,cacheNamespace:`rayzee`};function Eo(e){e&&Object.assign(To,e)}function Do(){return{...To}}var Oo=K(`pathtracer`),ko=4,Ao=class extends be{constructor(e,t,n,i={}){super(`PathTracer`,{...i,executionMode:ye.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 _o,this.lightSerializer=new wo,this.accumulationEnabled=!0,this.isComplete=!1,this.cameras=[],this.performanceMonitor=Ie(),this.completionThreshold=0,this.renderLimitMode=`frames`,this._initDataTextures(),this.storageTextures=new Ct(0,0),this.uniforms=new Tt(a,o),this._defineUniformGetters(),this.materialData=new Nt(this.sdfs),this.materialData.callbacks.onReset=()=>this.reset(),this.materialData.callbacks.getTriangleData=()=>({array:this.triangleStorageAttr?.array,count:this.triangleCount}),this.materialData.callbacks.onTriangleDataChanged=()=>{this.triangleStorageAttr&&(this.triangleStorageAttr.needsUpdate=!0)},this.environment=new pn(this.scene,this.uniforms),this.environment.callbacks.onReset=()=>this.reset(),this.environment.callbacks.getSceneTextureNodes=()=>this.shaderBuilder.getSceneTextureNodes(),this.shaderBuilder=new ua,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.lastRenderMode=-1,this.renderModeChangeTimeout=null,this.renderModeChangeDelay=50,this.pendingRenderMode=null,this.lastInteractionModeState=!1,this.cameraChanged=!1,this.updateCompletionThreshold()}_initDataTextures(){this.triangleStorageAttr=null,this.triangleStorageNode=null,this.triangleCount=0,this.bvhStorageAttr=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._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 xe(this.renderer,{uniforms:{maxBounceCount:{get value(){return e.maxBounces.value},set value(t){e.maxBounces.value=t}},enableAccumulation:{get value(){return e.enableAccumulation.value},set value(t){e.enableAccumulation.value=t}},enableEmissiveTriangleSampling:{get value(){return e.enableEmissiveTriangleSampling.value},set value(t){e.enableEmissiveTriangleSampling.value=t}},cameraIsMoving:{get value(){return e.cameraIsMoving.value},set value(t){e.cameraIsMoving.value=t}}}},{enabled:B.interactionModeEnabled,qualitySettings:{maxBounceCount:1,enableAccumulation:!1,enableEmissiveTriangleSampling:!1},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}=Do(),a=e.loadAsync(n).then(e=>{this.stbnScalarTexture=t(e),P.value=e,Oo.debug(`STBN scalar atlas ${G.px(e.image.width,e.image.height)}`)}),o=e.loadAsync(i).then(e=>{this.stbnVec2Texture=t(e),F.value=e,Oo.debug(`STBN vec2 atlas ${G.px(e.image.width,e.image.height)}`)});this.blueNoiseReady=Promise.allSettled([a,o]).then(e=>{for(let t of e)t.status===`rejected`&&Oo.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.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:{}};if(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.hasSun.value){let t=this.environment.envParams.skySunIntensity*950,n={intensity:t,color:{r:1,g:1,b:1},userData:{angle:this.sunAngularSize.value},updateMatrixWorld:()=>{},getWorldPosition:e=>{let t=this.sunDirection.value;return e.set(t.x,t.y,t.z).multiplyScalar(1e10)}};this.lightSerializer.addDirectionalLight(n),this.lightSerializer.preprocessLights(),this.lightSerializer.updateShaderUniforms(e),this.directionalLightsData=e.uniforms.directionalLights.value,Oo.debug(`sun added as directional light · intensity ${t.toFixed(2)}`)}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.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}setTriangleData(e,r){if(!e)return;let i=e.length/4;this.triangleStorageNode?(this.triangleStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.triangleStorageNode.value=this.triangleStorageAttr,this.triangleStorageNode.bufferCount=i):(this.triangleStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.triangleStorageNode=(0,n.storage)(this.triangleStorageAttr,`vec4`,i).toReadOnly()),this.triangleCount=r,Oo.debug(`${G.n(this.triangleCount)} triangles (storage buffer)`)}setBVHData(e){if(!e)return;let r=e.length/4;this.bvhStorageNode?(this.bvhStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.bvhStorageNode.value=this.bvhStorageAttr,this.bvhStorageNode.bufferCount=r):(this.bvhStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.bvhStorageNode=(0,n.storage)(this.bvhStorageAttr,`vec4`,r).toReadOnly()),this.bvhNodeCount=Math.floor(r/ko),Oo.debug(`${G.n(this.bvhNodeCount)} BVH nodes (storage buffer)`)}setInstanceTable(e){this._instanceTable=e}setMeshVisibilityData(e){if(!(!e||e.length===0||!this._instanceTable)){for(let t=0;t<e.length;t++)this._patchTLASLeafVisibility(t,this._isWorldVisible(e[t]));this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}}updateMeshVisibility(e,t){this._patchTLASLeafVisibility(e,t)&&this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}updateAllMeshVisibility(){if(!(!this._meshRefs||!this._instanceTable)){for(let e=0;e<this._meshRefs.length;e++)this._patchTLASLeafVisibility(e,this._isWorldVisible(this._meshRefs[e]));this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}}_patchTLASLeafVisibility(e,t){let n=this._instanceTable?.entries?.[e];return!n||n.tlasLeafIndex<0||!this.bvhStorageAttr?!1:(n.visible=t,this.bvhStorageAttr.array[n.tlasLeafIndex*16+2]=+!!t,!0)}_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.needsUpdate=!0)}updateTriangleData(e){this._updateStorageBuffer(this.triangleStorageAttr,e)}updateBVHData(e){this._updateStorageBuffer(this.bvhStorageAttr,e)}updateBufferRanges(e,t){if(this.triangleStorageAttr&&e.length>0){this.triangleStorageAttr.clearUpdateRanges();for(let t of e)this.triangleStorageAttr.addUpdateRange(t.offset,t.count);this.triangleStorageAttr.version++}if(this.bvhStorageAttr&&t.length>0){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){Oo.error(`triangle data required`);return}if(!this.bvhStorageNode){Oo.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(`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.renderModeChangeTimeout=null,this.pendingRenderMode=null},this.renderModeChangeDelay))}setUniform(e,t){this.uniforms.set(e,t)}setBlueNoiseTexture(e){this.stbnScalarTexture=e,e&&(P.value=e)}_rebuildLightBuffer(){let e=this._lbvhDataCache,n=this._emissiveDataCache,r=this._bitTrailMapCache,i=e?e.length:0,a=n?n.length:0,o=r?Math.ceil(r.length/4)*4:0,s=Math.max(i+a+o,4);if(this.lightStorageAttr&&s<=this.lightStorageAttr.array.length){let t=this.lightStorageAttr.array;e&&t.set(e,0),n&&t.set(n,i),r&&t.set(r,i+a),this.lightStorageAttr.needsUpdate=!0}else{let o=new Float32Array(s);e&&o.set(e,0),n&&o.set(n,i),r&&o.set(r,i+a),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(o,4),this.lightStorageNode.value=this.lightStorageAttr,this.lightStorageNode.bufferCount=o.length/4,this._lightBufferRealloc=!0}this.emissiveVec4Offset.value=(this.lightBVHNodeCount.value||0)*4,this.reverseMapVec4Offset.value=(i+a)/4}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(),Oo.debug(`${G.n(t)} emissive triangles · totalPower ${n.toFixed(4)} (storage buffer)`))}setLightBVHData(e,t){e&&(this._lbvhDataCache=e,this.lightBVHNodeCount.value=t,this._rebuildLightBuffer(),Oo.debug(`light BVH ${G.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{Oo.debug(`material rebuild started`),await this.sdfs.rebuildMaterials(e),this.updateSceneUniforms(),this.shaderBuilder.updateSceneTextures(this),this.updateLights(),this.reset(),Oo.debug(`material rebuild complete`)}catch(e){Oo.error(`material rebuild failed:`,e);try{Oo.warn(`attempting recovery by resetting the path tracer`),this.reset()}catch(e){Oo.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.triangleStorageAttr=null,this.triangleStorageNode=null,this.bvhStorageAttr=null,this.bvhStorageNode=null,this.placeholderTexture=null,this.isReady=!1}},jo=K(`gpu`),Mo={ORIGIN_META:0,DIR_FLAGS:1,THROUGHPUT_PDF:2,RADIANCE_ALPHA:3,MEDIUM_STACK:4,MEDIUM_SIGMA_A:5,SSS_SIGMA_S:6},No={DIST_TRI_BARY:0,NORMAL_MAT:1},Po=0,Z=(e,t)=>t===0?e:e.add(t*Po);function Fo(e,t){t&&e?._attributes?.delete?.(t)}var Io=class{constructor(e=0,t=null){this.capacity=0,this._renderer=t,this._attrs={},this.rayBuffer=null,this.rngBuffer=null,this.hitBuffer=null,e>0&&this.allocate(e)}allocate(e){this.dispose(),this.capacity=e,Po=e;let r=e*7,i=new t.StorageInstancedBufferAttribute(new Float32Array(r*4),4);this._attrs.ray=i,this.rayBuffer={rw:(0,n.storage)(i,`vec4`),ro:(0,n.storage)(i,`vec4`).toReadOnly()};let a=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);this._attrs.rng=a,this.rngBuffer={rw:(0,n.storage)(a,`uint`),ro:(0,n.storage)(a,`uint`).toReadOnly()};let o=e*2,s=new t.StorageInstancedBufferAttribute(new Float32Array(o*4),4);this._attrs.hit=s,this.hitBuffer={rw:(0,n.storage)(s,`vec4`),ro:(0,n.storage)(s,`vec4`).toReadOnly()},this.rayBytes=r*16+e*4,this.hitBytes=o*16,this.totalBytes=this.rayBytes+this.hitBytes,jo.debug(`ray pool capacity ${G.n(e)} · ${G.mb(this.totalBytes)} (rays ${G.mb(this.rayBytes)} · hits ${G.mb(this.hitBytes)})`)}resize(e){return e<=this.capacity&&this.capacity>0?!1:(this.allocate(e),!0)}dispose(){Fo(this._renderer,this._attrs.ray),Fo(this._renderer,this._attrs.rng),Fo(this._renderer,this._attrs.hit),this._attrs={},this.rayBuffer=null,this.rngBuffer=null,this.hitBuffer=null,this.capacity=0}},Lo=(e,t)=>e.element(Z(t,Mo.ORIGIN_META)).xyz,Ro=(e,t)=>e.element(Z(t,Mo.DIR_FLAGS)).xyz,zo=(e,t)=>(0,n.floatBitsToUint)(e.element(Z(t,Mo.DIR_FLAGS)).w),Bo=(e,t)=>e.element(Z(t,Mo.THROUGHPUT_PDF)).xyz,Vo=(e,t)=>e.element(Z(t,Mo.THROUGHPUT_PDF)).w,Ho=(e,t)=>e.element(Z(t,Mo.RADIANCE_ALPHA)),Uo=e=>(0,n.uint)(e).mul(1),Wo=(e,t,r,i,a)=>e.element(Uo(t)).assign((0,n.uvec4)((0,n.packSnorm2x16)((0,n.vec2)(r.x,r.y)),(0,n.packSnorm2x16)((0,n.vec2)(r.z,i)),(0,n.packUnorm2x16)((0,n.vec2)(a.x,a.y)),(0,n.packUnorm2x16)((0,n.vec2)(a.z,0)))),Go=(e,t)=>e.element(Uo(t)),Ko=e=>{let t=(0,n.unpackSnorm2x16)(e.x),r=(0,n.unpackSnorm2x16)(e.y);return(0,n.vec4)((0,n.vec3)(t.x,t.y,r.x).mul(.5).add(.5),r.y)},qo=e=>(0,n.vec3)((0,n.unpackUnorm2x16)(e.z),(0,n.unpackUnorm2x16)(e.w).x),Jo=e=>{let t=(0,n.clamp)((0,n.floor)((0,n.log2)((0,n.max)(e,1e-6))),-8,7),r=(0,n.clamp)((0,n.float)(e).mul((0,n.exp2)(t.negate())).sub(1).mul(64),0,63);return(0,n.select)((0,n.float)(e).lessThan(.004),(0,n.uint)(0),(0,n.uint)(t.add(8)).shiftLeft(6).bitOr((0,n.uint)(r)))},Yo=(e,t)=>{let r=(0,n.floatBitsToUint)(e.element(Z(t,Mo.ORIGIN_META)).w).shiftRight(22),i=(0,n.float)(r.shiftRight(6).bitAnd((0,n.uint)(15))).sub(8),a=(0,n.float)(r.bitAnd((0,n.uint)(63))).div(64).add(1);return(0,n.select)(r.equal((0,n.uint)(0)),(0,n.float)(0),a.mul((0,n.exp2)(i)))},Xo=(e,t,r,i,a,o=(0,n.uint)(0),s=null)=>{let c=(0,n.uint)(i).bitAnd((0,n.uint)(255)).bitOr((0,n.uint)(a).bitAnd((0,n.uint)(255)).shiftLeft(8)).bitOr((0,n.uint)(o).bitAnd((0,n.uint)(63)).shiftLeft(16));return s!==null&&(c=c.bitOr(Jo(s).shiftLeft(22))),e.element(Z(t,Mo.ORIGIN_META)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(c)))},Zo=(e,t,r,i)=>e.element(Z(t,Mo.DIR_FLAGS)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(i))),Qo=(e,t,r,i)=>e.element(Z(t,Mo.THROUGHPUT_PDF)).assign((0,n.vec4)(r,i)),$o=(e,t,n)=>e.element(Z(t,Mo.RADIANCE_ALPHA)).assign(n),es=(e,t)=>e.element(Z(t,No.DIST_TRI_BARY)).x,ts=(e,t)=>(0,n.floatBitsToUint)(e.element(Z(t,No.DIST_TRI_BARY)).y),ns=(e,t)=>e.element(Z(t,No.DIST_TRI_BARY)).zw,rs=(e,t)=>e.element(Z(t,No.NORMAL_MAT)).xyz,is=(e,t)=>(0,n.uint)((0,n.floatBitsToUint)(e.element(Z(t,No.NORMAL_MAT)).w).bitAnd(65535)),as=(e,t,r,i,a,o,s,c,l)=>{e.element(Z(t,No.DIST_TRI_BARY)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(i),a,o)),e.element(Z(t,No.NORMAL_MAT)).assign((0,n.vec4)(s,(0,n.uintBitsToFloat)(c.bitOr(l.shiftLeft(16)))))},os=(e,t)=>{let r=e.element(Z(t,Mo.MEDIUM_STACK)),i=(0,n.floatBitsToUint)(r.x);return{stackDepth:i.bitAnd(255),transTraversals:i.shiftRight(8).bitAnd(255),wavelength:i.shiftRight(16).bitAnd(65535),ior1:r.y,ior2:r.z,ior3:r.w}},ss=(e,t,r,i,a,o,s,c=(0,n.uint)(0))=>e.element(Z(t,Mo.MEDIUM_STACK)).assign((0,n.vec4)((0,n.uintBitsToFloat)(r.bitOr(i.shiftLeft(8)).bitOr(c.shiftLeft(16))),a,o,s)),cs=(e,t)=>e.element(Z(t,Mo.MEDIUM_SIGMA_A)).xyz,ls=(e,t,r)=>{let i=e.element(Z(t,Mo.MEDIUM_SIGMA_A)).w.toVar();e.element(Z(t,Mo.MEDIUM_SIGMA_A)).assign((0,n.vec4)(r,i))},us=e=>{let t=(0,n.clamp)(e,(0,n.vec3)(0),(0,n.vec3)(1)).mul(1023).add(.5);return(0,n.uint)(t.x).bitOr((0,n.uint)(t.y).shiftLeft(10)).bitOr((0,n.uint)(t.z).shiftLeft(20))},ds=e=>(0,n.vec3)((0,n.float)(e.bitAnd((0,n.uint)(1023))),(0,n.float)(e.shiftRight(10).bitAnd((0,n.uint)(1023))),(0,n.float)(e.shiftRight(20).bitAnd((0,n.uint)(1023)))).div(1023),fs=(e,t)=>ds((0,n.floatBitsToUint)(e.element(Z(t,Mo.MEDIUM_SIGMA_A)).w)),ps=(e,t,r)=>{let i=e.element(Z(t,Mo.MEDIUM_SIGMA_A)).xyz.toVar();e.element(Z(t,Mo.MEDIUM_SIGMA_A)).assign((0,n.vec4)(i,(0,n.uintBitsToFloat)(us(r))))},ms=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(Z(t,Mo.ORIGIN_META)).w).bitAnd(255)),hs=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(Z(t,Mo.ORIGIN_META)).w).shiftRight(8).bitAnd(255)),gs=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(Z(t,Mo.ORIGIN_META)).w).shiftRight(16).bitAnd((0,n.uint)(63))),_s=(e,t)=>{let n=e.element(Z(t,Mo.SSS_SIGMA_S));return{sigmaS:n.xyz,g:n.w}},vs=(e,t,r,i)=>e.element(Z(t,Mo.SSS_SIGMA_S)).assign((0,n.vec4)(r,i)),ys=K(`gpu`),Q={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},bs=65535,$={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},xs=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(Q.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=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1),i=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);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=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);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=Q.COUNT*4+e*4*3,ys.debug(`queues capacity ${G.n(e)} · ${G.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(){Fo(this._renderer,this._countersAttr),Fo(this._renderer,this._bounceCountsAttr),Fo(this._renderer,this._attrA),Fo(this._renderer,this._attrB),Fo(this._renderer,this._sortAttr),Fo(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}},Ss={[r.RGBAFormat]:4,[r.RGBFormat]:3,[r.RGFormat]:2,[r.RedFormat]:1},Cs={[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 ws(e){return(Ss[e.format]??4)*(Cs[e.type]??4)}function Ts(e){return e?.array?.byteLength||0}function Es(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*ws(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*ws(e)}var Ds=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.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: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*ws(e));return a}return this._isResident(e)?Es(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(` `)}]`}},Os=K(`wavefront`),ks=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);Os.info(G.list([`${e.length} kernel${e.length===1?``:`s`} compiled in ${G.ms(t)}`,`slowest ${n.slice(0,2).map(e=>`${e.name} ${G.ms(e.ms)}`).join(`, `)}`])),e.forEach(e=>Os.debug(`kernel '${e.name}' first dispatch (incl. compilation) ${G.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()}},As=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.vec3)(0).toVar();return(0,n.If)(i.equal((0,n.int)(1)),()=>{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)))))}).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}),js=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h])=>{let g=(0,n.vec3)(r[3]).toVar(),_=As(e,r,i,a,o,s,c).toVar(),v=g.toVar(),y=_.toVar();return(0,n.If)(l.and(u.greaterThan(0)).and(d.lessThan(64)).and(f.greaterThan(.001)),()=>{let e=u.div(d).mul(.001).mul(p).mul(m),i=ie(t),o=i.x.mul(h.max(.01)),s=i.y,c=(0,n.vec3)(0).toVar();(0,n.If)(a.equal((0,n.int)(1)),()=>{c.assign(Un({N:_}).mul((0,n.vec3)(o,s,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(o).add(t.mul(s)))}),v.assign(g.add(c.mul(e))),y.assign((0,n.normalize)(g.add(_.mul(f)).sub(v)))}),mn({origin:v,direction:y})});function Ms(e){let{rayBufferRW:t,rngBufferRW: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,sceneScale:_,apertureScale:v,anamorphicRatio:y,renderWidth:b,chunkRowBase:x,chunkRows:S,transmissiveBounces:C,transparentBackground:w,auxGBufferEnabled:T,listDriven:E=!1,activeIndicesRO:D=null,counters:O=null}=e,k=T.greaterThan((0,n.uint)(0)),A=(e,b,x)=>{let S=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(b).add(.5)),w=ee({state:ve({pixelCoord:S,rayIndex:(0,n.int)(0),frame:o}).toVar()}).toVar(),T=_e(S,(0,n.int)(1),(0,n.int)(1),w,a,o).toVar().sub(.5),E=(0,n.vec2)(S.x.add(T.x),S.y.sub(T.y)).div(a),D=mn.wrap(js(E,w,s,c,l,u,d,f,p,m,h,g,_,v,y));Xo(t,x,D.origin,(0,n.int)(0),(0,n.int)(0)),Zo(t,x,D.direction,(0,n.uint)($.ACTIVE)),Qo(t,x,(0,n.vec4)(1,1,1,0).xyz,(0,n.float)(0)),$o(t,x,(0,n.vec4)((0,n.vec3)(0),(0,n.float)(1))),(0,n.If)(k,()=>{Wo(i,x,(0,n.vec3)(0,0,1),(0,n.float)(1),(0,n.vec3)(0)),ps(t,x,(0,n.vec3)(1))}),ss(t,x,(0,n.uint)(0),(0,n.uint)(C),(0,n.float)(1),(0,n.float)(1),(0,n.float)(1)),r.element(x).assign(w)};return(0,n.Fn)(()=>{if(E){let e=n.instanceIndex;(0,n.If)(e.lessThan((0,n.atomicLoad)(O.element((0,n.uint)(Q.ENTERING_COUNT)))),()=>{let t=(0,n.int)(D.element(e)),r=t.add(x.mul(b));A(r.mod(b),r.div(b),(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(b).and(t.lessThan(S)),()=>{A(e,t.add(x),(0,n.uint)(t.mul(b).add(e)))})}})}var Ns=32,Ps=512,Fs=4,Is=8,Ls=1e8,Rs=()=>(0,n.array)(`int`,Ns).toVar(),zs=(0,n.wgslFn)(`
|
|
471
|
+
`),_a=xt(`shader`),va=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),_a.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;Bi(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();sa(d);let f=e.iesProfiles?(0,n.texture)(e.iesProfiles):u();da(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}},ya=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 ba;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 ba;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}}},ba=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}},xa=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}},Sa=xt(`bvh`),Ca=null;function wa(e){Ca=e}var Ta={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},Ea=Ta.FLOATS_PER_TRIANGLE,Da=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}},Oa=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=this.triangles,n=Ta.POSITION_A_OFFSET,r=Ta.POSITION_B_OFFSET,i=Ta.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*Ea,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/(Ea*4),this.processedTriangles=0,this.lastProgressUpdate=performance.now(),this.useWorker&&Ca&&typeof Worker<`u`?new Promise((r,i)=>{let a=a=>{let o=this.totalTriangles,s=typeof SharedArrayBuffer<`u`;Sa.debug(`SharedArrayBuffer ${s?`enabled`:`unavailable (using transfer fallback)`}`);let c=s?new SharedArrayBuffer(o*Ea*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(Ca())}catch(i){Sa.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);return{bvhData:this.flattenBVH(r),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/(Ea*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 ya(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){Sa.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 xa(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){Sa.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 Float32Array(a*Ea);for(let e=0;e<a;e++){let t=this.indices[e]*Ea,n=e*Ea;f.set(d.subarray(t,t+Ea),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 Sa.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 Da;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 Da;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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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)}},Q={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20},ka=Q.FLOATS_PER_TRIANGLE,Aa=16,ja=-1,Ma=-2,Na=class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(e,t,n){let r=n.length;for(let i=0;i<r;i++){let r=n[i],a=i*ka,o=r*9,s=t[o],c=t[o+1],l=t[o+2],u=t[o+3],d=t[o+4],f=t[o+5],p=t[o+6],m=t[o+7],h=t[o+8];e[a+Q.POSITION_A_OFFSET]=s,e[a+Q.POSITION_A_OFFSET+1]=c,e[a+Q.POSITION_A_OFFSET+2]=l,e[a+Q.POSITION_B_OFFSET]=u,e[a+Q.POSITION_B_OFFSET+1]=d,e[a+Q.POSITION_B_OFFSET+2]=f,e[a+Q.POSITION_C_OFFSET]=p,e[a+Q.POSITION_C_OFFSET+1]=m,e[a+Q.POSITION_C_OFFSET+2]=h;let g=u-s,_=d-c,v=f-l,y=p-s,b=m-c,x=h-l,S=_*x-v*b,C=v*y-g*x,w=g*b-_*y;e[a+Q.NORMAL_A_OFFSET]=S,e[a+Q.NORMAL_A_OFFSET+1]=C,e[a+Q.NORMAL_A_OFFSET+2]=w,e[a+Q.NORMAL_B_OFFSET]=S,e[a+Q.NORMAL_B_OFFSET+1]=C,e[a+Q.NORMAL_B_OFFSET+2]=w,e[a+Q.NORMAL_C_OFFSET]=S,e[a+Q.NORMAL_C_OFFSET+1]=C,e[a+Q.NORMAL_C_OFFSET+2]=w}}refitRange(e,t,n,r){r>this._boundsNodeCount&&(this._bounds=new Float32Array(r*6),this._boundsNodeCount=r);let i=this._bounds,a=n+r;for(let r=a-1;r>=n;r--){let a=r*Aa,o=(r-n)*6;if(e[a+3]===ja){let n=e[a],r=e[a+1],s=1/0,c=1/0,l=1/0,u=-1/0,d=-1/0,f=-1/0;for(let e=0;e<r;e++){let r=(n+e)*ka,i=t[r+Q.POSITION_A_OFFSET],a=t[r+Q.POSITION_A_OFFSET+1],o=t[r+Q.POSITION_A_OFFSET+2],p=t[r+Q.POSITION_B_OFFSET],m=t[r+Q.POSITION_B_OFFSET+1],h=t[r+Q.POSITION_B_OFFSET+2],g=t[r+Q.POSITION_C_OFFSET],_=t[r+Q.POSITION_C_OFFSET+1],v=t[r+Q.POSITION_C_OFFSET+2];s=Math.min(s,i,p,g),c=Math.min(c,a,m,_),l=Math.min(l,o,h,v),u=Math.max(u,i,p,g),d=Math.max(d,a,m,_),f=Math.max(f,o,h,v)}i[o]=s,i[o+1]=c,i[o+2]=l,i[o+3]=u,i[o+4]=d,i[o+5]=f}else{let t=e[a+3],r=e[a+7],s=(t-n)*6,c=(r-n)*6,l=i[s],u=i[s+1],d=i[s+2],f=i[s+3],p=i[s+4],m=i[s+5],h=i[c],g=i[c+1],_=i[c+2],v=i[c+3],y=i[c+4],b=i[c+5];e[a]=l,e[a+1]=u,e[a+2]=d,e[a+4]=f,e[a+5]=p,e[a+6]=m,e[a+8]=h,e[a+9]=g,e[a+10]=_,e[a+12]=v,e[a+13]=y,e[a+14]=b,i[o]=Math.min(l,h),i[o+1]=Math.min(u,g),i[o+2]=Math.min(d,_),i[o+3]=Math.max(f,v),i[o+4]=Math.max(p,y),i[o+5]=Math.max(m,b)}}}refit(e,t,n){n!==this._boundsNodeCount&&(this._bounds=new Float32Array(n*6),this._boundsNodeCount=n);let r=this._bounds;for(let i=n-1;i>=0;i--){let n=i*Aa,a=i*6,o=e[n+3];if(o===ja){let i=e[n],o=e[n+1],s=1/0,c=1/0,l=1/0,u=-1/0,d=-1/0,f=-1/0;for(let e=0;e<o;e++){let n=(i+e)*ka,r=t[n+Q.POSITION_A_OFFSET],a=t[n+Q.POSITION_A_OFFSET+1],o=t[n+Q.POSITION_A_OFFSET+2],p=t[n+Q.POSITION_B_OFFSET],m=t[n+Q.POSITION_B_OFFSET+1],h=t[n+Q.POSITION_B_OFFSET+2],g=t[n+Q.POSITION_C_OFFSET],_=t[n+Q.POSITION_C_OFFSET+1],v=t[n+Q.POSITION_C_OFFSET+2];s=Math.min(s,r,p,g),c=Math.min(c,a,m,_),l=Math.min(l,o,h,v),u=Math.max(u,r,p,g),d=Math.max(d,a,m,_),f=Math.max(f,o,h,v)}r[a]=s,r[a+1]=c,r[a+2]=l,r[a+3]=u,r[a+4]=d,r[a+5]=f}else if(o===Ma){let t=e[n]*6;r[a]=r[t],r[a+1]=r[t+1],r[a+2]=r[t+2],r[a+3]=r[t+3],r[a+4]=r[t+4],r[a+5]=r[t+5]}else{let t=e[n+3],i=e[n+7],o=t*6,s=i*6,c=r[o],l=r[o+1],u=r[o+2],d=r[o+3],f=r[o+4],p=r[o+5],m=r[s],h=r[s+1],g=r[s+2],_=r[s+3],v=r[s+4],y=r[s+5];e[n]=c,e[n+1]=l,e[n+2]=u,e[n+4]=d,e[n+5]=f,e[n+6]=p,e[n+8]=m,e[n+9]=h,e[n+10]=g,e[n+12]=_,e[n+13]=v,e[n+14]=y,r[a]=Math.min(c,m),r[a+1]=Math.min(l,h),r[a+2]=Math.min(u,g),r[a+3]=Math.max(d,_),r[a+4]=Math.max(f,v),r[a+5]=Math.max(p,y)}}}},Pa="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=y(`bvh`),S={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},C=S.FLOATS_PER_TRIANGLE;var w=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}},T=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=this.triangles,n=S.POSITION_A_OFFSET,r=S.POSITION_B_OFFSET,i=S.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*C,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/(C*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);return{bvhData:this.flattenBVH(r),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/(C*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){x.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){x.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 Float32Array(s*C);for(let e=0;e<s;e++){let t=this.indices[e]*C,n=e*C;m.set(p.subarray(t,t+C),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 x.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 w;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,T=m.rMinZ,E=m.rMaxX,D=m.rMaxY,O=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,T,E,D,O),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new w;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,T=p.rMaxX,E=p.rMaxY,D=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,T,E,D),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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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 E=y(`bvh`);self.onmessage=function(e){let t=e.data,n=t.type;b(t.logLevel),n===`buildPhase1`?D(t):n===`assemble`?O(t):k(t)};function D(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 T;d&&e.setTreeletConfig(d);let f=u?e=>{self.postMessage({type:`progress`,progress:e})}:null;e.triangles=new Float32Array(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;E.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){E.error(`phase 1 failed:`,e),self.postMessage({type:`error`,error:e.message})}}function O(e){let{topFlatData:t,topNodeCount:n,frontierMap:r,subtreeResults:i,sharedTriangleData:a,sharedIndices:o,sharedReorderBuffer:s,triangleCount:c}=e;try{let e=performance.now(),l=new T().assembleParallelBVH(t,n,r,i),u=new Uint32Array(o),d=new Float32Array(a),f=new Float32Array(s);for(let e=0;e<c;e++){let t=u[e]*32,n=e*32;f.set(d.subarray(t,t+32),n)}let p=new Uint32Array(c);for(let e=0;e<c;e++)p[u[e]]=e;let m=performance.now()-e;E.debug(`phase 3 assemble + reorder ${_.ms(m)} (${_.mb(l.byteLength)} BVH)`),self.postMessage({type:`assembleResult`,bvhData:l,originalToBvh:p,triangleCount:c},[l.buffer,p.buffer])}catch(e){E.error(`assembly failed:`,e),self.postMessage({type:`error`,error:e.message})}}function k(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}=e,p=new T;l!==void 0&&(p.maxLeafSize=l),u!==void 0&&(p.numBins=u),d!==void 0&&(p.maxBins=d),f!==void 0&&(p.minBins=f);try{o&&p.setTreeletConfig(o),s&&p.setReinsertionConfig(s);let e=a?e=>{self.postMessage({progress:e})}:null,l=n===void 0?new Float32Array(t):new Float32Array(t,n,r/4),u=c?new Float32Array(c):null,d=p.buildSync(l,i,e,u),f=performance.now(),m=p.flattenBVH(d),h=performance.now()-f;E.debug(`flatten ${_.ms(h)} (${_.mb(m.byteLength)})`);let g=p.originalToBvhMap||null;if(c){let e=[m.buffer];g&&e.push(g.buffer),self.postMessage({bvhData:m,originalToBvh:g,triangleCount:l.length/32,treeletStats:p.splitStats},e)}else{let e=p.reorderedTriangleData,t=e.byteLength/128,n=[m.buffer,e.buffer];g&&n.push(g.buffer),self.postMessage({bvhData:m,triangles:e,originalToBvh:g,triangleCount:t,treeletStats:p.splitStats},n)}}catch(e){E.error(`build failed:`,e),self.postMessage({error:e.message})}}",Fa=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Pa],{type:`text/javascript;charset=utf-8`});function Ia(e){let t;try{if(t=Fa&&(self.URL||self.webkitURL).createObjectURL(Fa),!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(Pa),{type:`module`,name:e?.name})}}var La="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=y(`bvh`),x={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20,UV_AB_OFFSET:24,UV_C_MAT_OFFSET:28},S=x.FLOATS_PER_TRIANGLE;var C=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}},w=class{constructor(){this.useWorker=!0,this.maxLeafSize=8,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=this.triangles,n=x.POSITION_A_OFFSET,r=x.POSITION_B_OFFSET,i=x.POSITION_C_OFFSET;for(let a=0;a<e;a++){let e=a*S,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/(S*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);return{bvhData:this.flattenBVH(r),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/(S*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){b.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){b.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 Float32Array(s*S);for(let e=0;e<s;e++){let t=this.indices[e]*S,n=e*S;m.set(p.subarray(t,t+S),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 b.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 C;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,w=m.rMinY,T=m.rMinZ,E=m.rMaxX,D=m.rMaxY,O=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,w,T,E,D,O),d)}buildNodeRecursive(e,t,n,r,i,a,o,s,c,l){let u=new C;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,w=p.rMinZ,T=p.rMaxX,E=p.rMaxY,D=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,w,T,E,D),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)}let r=new Float32Array(t.length*16);for(let e=0;e<t.length;e++){let n=t[e],i=e*16;if(n.leftChild){let e=n.leftChild,t=n.rightChild;r[i]=e.minX,r[i+1]=e.minY,r[i+2]=e.minZ,r[i+3]=e._flatIndex,r[i+4]=e.maxX,r[i+5]=e.maxY,r[i+6]=e.maxZ,r[i+7]=t._flatIndex,r[i+8]=t.minX,r[i+9]=t.minY,r[i+10]=t.minZ,r[i+12]=t.maxX,r[i+13]=t.maxY,r[i+14]=t.maxZ}else r[i]=n.triangleOffset,r[i+1]=n.triangleCount,r[i+3]=-1}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)}let r=new Float32Array(t.length*16),i=[];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,r[a+3]=e._flatIndex,r[a+4]=e.maxX,r[a+5]=e.maxY,r[a+6]=e.maxZ,r[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 if(n.isFrontier){let t=n.frontierTaskId;r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+2]=t,r[a+3]=-2,i.push({taskId:t,flatIndex:e})}else r[a]=n.triangleOffset,r[a+1]=n.triangleCount,r[a+3]=-1}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;let o=new Float32Array(a*16);o.set(e);let s=new Map;for(let e of n)s.set(e.taskId,e.flatIndex);let c=t;for(let e=0;e<i.length;e++){let t=i[e],n=t.flatData,r=t.nodeCount,a=c*16;o.set(n,a);for(let e=0;e<r;e++){let t=a+e*16;o[t+3]!==-1&&(o[t+3]+=c,o[t+7]+=c)}let l=s.get(t.taskId);if(l!==void 0){let e=l*16,t=a;for(let n=0;n<16;n++)o[e+n]=o[t+n]}c+=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 w;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})}}};",Ra=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,La],{type:`text/javascript;charset=utf-8`});function za(e){let t;try{if(t=Ra&&(self.URL||self.webkitURL).createObjectURL(Ra),!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(La),{type:`module`,name:e?.name})}}wa(()=>new Ia);var Ba=xt(`bvh`),Va=32,Ha=5e4,Ua=8;function Wa(e,t,n,r){let i=e.byteLength/(Va*4),a=Math.min(navigator.hardwareConcurrency||4,Ua),o=Math.ceil(Math.log2(a*2.5+1));return Ba.debug(`parallel build ${J.n(i)} triangles · ${a} workers · parallelDepth ${o}`),new Promise((s,c)=>{(async()=>{let c=new SharedArrayBuffer(e.byteLength);new Float32Array(c).set(e);let l=new SharedArrayBuffer(i*3*4),u=new SharedArrayBuffer(i*3*4),d=new SharedArrayBuffer(i*3*4),f=new SharedArrayBuffer(i*4),p=new SharedArrayBuffer(i*4),m=new SharedArrayBuffer(i*Va*4),h=new Ia,g=null,_=[h],v={id:null},y=!1,b=()=>{v.id&&=(clearTimeout(v.id),null);for(let e of _)try{e.terminate()}catch{}},x=e=>{if(y)return;y=!0,Ba.warn(`parallel build failed (${e}), falling back to single worker`),b();let i=new ArrayBuffer(c.byteLength);new Float32Array(i).set(new Float32Array(c)),s(Ka(new Float32Array(i),t,n,r))};h.onerror=e=>{x(`coordinator error: ${e.message}`)},h.onmessage=e=>{let t=e.data;if(t.error||t.type===`error`){x(t.error);return}if(t.type===`progress`&&n){n(Math.floor(t.progress*.3));return}if(t.type===`phase1Result`){g=t.splitStats,Ga(t,a,c,l,u,d,f,m,i,n,h,_,b,x,s,v,r).catch(e=>x(e.message));return}if(t.type===`assembleResult`){y=!0,b();let e=new Float32Array(m);s({bvhData:t.bvhData,bvhRoot:!0,reorderedTriangles:e,originalToBvh:t.originalToBvh||null,splitStats:g||{}});return}},n&&n(0),h.postMessage({type:`buildPhase1`,sharedTriangleData:c,sharedCentroids:l,sharedBMin:u,sharedBMax:d,sharedIndices:f,sharedMortonCodes:p,triangleCount:i,depth:t,parallelDepth:o,reportProgress:!!n,treeletOptimization:r.treeletOptimization})})().catch(e=>{Ba.warn(`parallel build setup failed:`,e),c(e)})})}async function Ga(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){Ba.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},[_.buffer]);return}Ba.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},t)},A=S.length;for(let e=0;e<A;e++){let t=S[e];if(t.length===0)continue;let s=new za;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 Ka(e,t,n,r){return new Promise((i,a)=>{(async()=>{let o=new Ia,s=e.byteLength/(Va*4),c=typeof SharedArrayBuffer<`u`?new SharedArrayBuffer(s*Va*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 Float32Array(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},[l])})().catch(e=>{Ba.warn(`single worker fallback failed:`,e),a(e)})})}function qa(e){return typeof Worker<`u`&&typeof SharedArrayBuffer<`u`&&e>=Ha}var Ja=16,Ya=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.entryIndex=-1}},Xa=class{constructor(){this._flatBuffer=null,this._flatBufferCapacity=0}build(e){if(e.length===0)return{root:null,nodeCount:0};let t=[];for(let n=0;n<e.length;n++)t.push(n);let n=this._buildRecursive(e,t);return{root:n,nodeCount:this._countNodes(n)}}_buildRecursive(e,t){let n=new Ya;if(t.length===1){let r=e[t[0]].worldAABB;return n.minX=r.minX,n.minY=r.minY,n.minZ=r.minZ,n.maxX=r.maxX,n.maxY=r.maxY,n.maxZ=r.maxZ,n.entryIndex=t[0],n}let r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0;for(let n of t){let t=e[n].worldAABB;t.minX<r&&(r=t.minX),t.minY<i&&(i=t.minY),t.minZ<a&&(a=t.minZ),t.maxX>o&&(o=t.maxX),t.maxY>s&&(s=t.maxY),t.maxZ>c&&(c=t.maxZ)}if(n.minX=r,n.minY=i,n.minZ=a,n.maxX=o,n.maxY=s,n.maxZ=c,t.length===2)return n.leftChild=this._buildRecursive(e,[t[0]]),n.rightChild=this._buildRecursive(e,[t[1]]),n;let l=this._surfaceArea(r,i,a,o,s,c),u=1/0,d=0,f=0;if(l>0&&isFinite(l))for(let n=0;n<3;n++){let r=t.slice().sort((t,r)=>{let i=e[t].worldAABB,a=e[r].worldAABB;return this._centroid(i,n)-this._centroid(a,n)});for(let t=1;t<r.length;t++){let i=this._computeGroupAABB(e,r,0,t),a=this._computeGroupAABB(e,r,t,r.length),o=this._surfaceArea(i.minX,i.minY,i.minZ,i.maxX,i.maxY,i.maxZ),s=this._surfaceArea(a.minX,a.minY,a.minZ,a.maxX,a.maxY,a.maxZ),c=1+(o*t+s*(r.length-t))/l;c<u&&(u=c,d=n,f=t)}}if(f<=0||f>=t.length){d=0;let e=o-r,n=s-i,l=c-a;n>e&&n>l?d=1:l>e&&(d=2),f=t.length>>1}let p=t.slice().sort((t,n)=>this._centroid(e[t].worldAABB,d)-this._centroid(e[n].worldAABB,d)),m=p.slice(0,f),h=p.slice(f);return n.leftChild=this._buildRecursive(e,m),n.rightChild=this._buildRecursive(e,h),n}flatten(e,t){if(!e)return new Float32Array;let n=[],r=[e];for(;r.length>0;){let e=r.pop();e._flatIndex=n.length,n.push(e),e.rightChild&&r.push(e.rightChild),e.leftChild&&r.push(e.leftChild)}let i=n.length*Ja;i>this._flatBufferCapacity&&(this._flatBuffer=new Float32Array(i),this._flatBufferCapacity=i);let a=this._flatBuffer;a.fill(0,0,i);for(let e=0;e<n.length;e++){let r=n[e],i=e*Ja;if(r.leftChild){let e=r.leftChild,t=r.rightChild;a[i]=e.minX,a[i+1]=e.minY,a[i+2]=e.minZ,a[i+3]=e._flatIndex,a[i+4]=e.maxX,a[i+5]=e.maxY,a[i+6]=e.maxZ,a[i+7]=t._flatIndex,a[i+8]=t.minX,a[i+9]=t.minY,a[i+10]=t.minZ,a[i+12]=t.maxX,a[i+13]=t.maxY,a[i+14]=t.maxZ}else{let n=t[r.entryIndex];a[i]=n.blasOffset,a[i+1]=r.entryIndex,a[i+2]=n.visible===!1?0:1,a[i+3]=Qe.BLAS_POINTER_LEAF,n.tlasLeafIndex=e}}return a.subarray(0,i)}_centroid(e,t){return t===0?(e.minX+e.maxX)*.5:t===1?(e.minY+e.maxY)*.5:(e.minZ+e.maxZ)*.5}_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)}_computeGroupAABB(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=e[t[u]].worldAABB;n.minX<i&&(i=n.minX),n.minY<a&&(a=n.minY),n.minZ<o&&(o=n.minZ),n.maxX>s&&(s=n.maxX),n.maxY>c&&(c=n.maxY),n.maxZ>l&&(l=n.maxZ)}return{minX:i,minY:a,minZ:o,maxX:s,maxY:c,maxZ:l}}_countNodes(e){if(!e)return 0;let t=0,n=[e];for(;n.length>0;){let e=n.pop();t++,e.leftChild&&n.push(e.leftChild),e.rightChild&&n.push(e.rightChild)}return t}},Za=class{constructor(){this.entries=[],this.totalBLASNodes=0,this.tlasNodeCount=0}allocate(e){this.entries=Array(e).fill(null)}setEntry({meshIndex:e,blasNodeCount:t,triOffset:n,triCount:r,originalToBvhMap:i,bvhData:a}){this.entries[e]={meshIndex:e,blasOffset:0,blasNodeCount:t,triOffset:n,triCount:r,worldAABB:null,originalToBvhMap:i,bvhData:a,visible:!0,tlasLeafIndex:-1}}setVisibility(e,t){let n=this.entries[e];n&&(n.visible=t)}computeAABBs(e){for(let t of this.entries)t&&(t.worldAABB=this._readRootAABB(t.bvhData,t,e))}recomputeAABB(e,t,n){let r=this.entries[e],i=t.subarray(r.blasOffset*16,r.blasOffset*16+16);r.worldAABB=this._readRootAABB(i,r,n)}_readRootAABB(e,t,n){if(e[3]===-1)return this._computeAABBFromTriangles(t,n);let r=e[0],i=e[1],a=e[2],o=e[4],s=e[5],c=e[6],l=e[8],u=e[9],d=e[10],f=e[12],p=e[13],m=e[14];return{minX:Math.min(r,l),minY:Math.min(i,u),minZ:Math.min(a,d),maxX:Math.max(o,f),maxY:Math.max(s,p),maxZ:Math.max(c,m)}}_computeAABBFromTriangles(e,t){let n=G.FLOATS_PER_TRIANGLE,r=1/0,i=1/0,a=1/0,o=-1/0,s=-1/0,c=-1/0;for(let l=0;l<e.triCount;l++){let u=(e.triOffset+l)*n;for(let e=0;e<=8;e+=4){let n=t[u+e],l=t[u+e+1],d=t[u+e+2];n<r&&(r=n),l<i&&(i=l),d<a&&(a=d),n>o&&(o=n),l>s&&(s=l),d>c&&(c=d)}}return{minX:r,minY:i,minZ:a,maxX:o,maxY:s,maxZ:c}}assignOffsets(e){this.tlasNodeCount=e;let t=e;for(let e of this.entries)e&&(e.blasOffset=t,t+=e.blasNodeCount);this.totalBLASNodes=t-e}get totalNodeCount(){return this.tlasNodeCount+this.totalBLASNodes}get count(){return this.entries.length}clear(){this.entries=[],this.totalBLASNodes=0,this.tlasNodeCount=0}},Qa="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);for(r=2**Math.ceil(Math.log2(r)),i=2**Math.ceil(Math.log2(i)),r=Math.min(r,t,n.MAX_TEXTURE_DIMENSION),i=Math.min(i,t,n.MAX_TEXTURE_DIMENSION);r>t||i>t;)r=Math.max(1,Math.floor(r/2)),i=Math.max(1,Math.floor(i/2));return{maxWidth:r,maxHeight:i}}function g(e,t){let n=h(e,t);return{maxWidth:Math.max(1,Math.floor(n.maxWidth/2)),maxHeight:Math.max(1,Math.floor(n.maxHeight/2))}}",$a=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Qa],{type:`text/javascript;charset=utf-8`});function eo(e){let t;try{if(t=$a&&(self.URL||self.webkitURL).createObjectURL($a),!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(Qa),{type:`module`,name:e?.name})}}var to=Object.freeze({ADAPTER_SOFTWARE:`adapter.software`,ASSET_UNREACHABLE:`asset.unreachable`,TEXTURE_BUILD_FAILED:`texture.build_failed`,TEXTURE_PROCESSING_FALLBACK:`texture.processing_fallback`,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`}),no=Object.freeze({ERROR:`error`,WARNING:`warning`}),ro=class extends Error{constructor(e){super(`[${e.code}] ${e.message}`),this.name=`EngineIssueError`,this.code=e.code,this.detail=e.detail}},io=class{constructor({strict:e=!1,onIssue:t=null}={}){this.strict=e===!0,this._onIssue=t,this._entries=[]}record(e,t,n={},r=no.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===no.ERROR)throw new ro(i);return i}warn(e,t,n){return this.record(e,t,n,no.WARNING)}get list(){return this._entries.slice()}get errors(){return this._entries.filter(e=>e.severity===no.ERROR)}clear(){this._entries.length=0}detach(){this._onIssue=null,this.strict=!1}},ao=e=>Math.min(Math.max(e,0),1);function oo(e,t,n,r,i){i[0]=ao(e),i[1]=ao(t),i[2]=ao(n)}function so(e,t,n,r,i){i[0]=ao(e*r),i[1]=ao(t*r),i[2]=ao(n*r)}function co(e,t,n,r,i){e*=r,t*=r,n*=r,i[0]=ao(e/(e+1)),i[1]=ao(t/(t+1)),i[2]=ao(n/(n+1))}function lo(e,t,n,r,i){e=Math.max(e*r-.004,0),t=Math.max(t*r-.004,0),n=Math.max(n*r-.004,0);let a=e=>(e*(6.2*e+.5)/(e*(6.2*e+1.7)+.06))**2.2;i[0]=a(e),i[1]=a(t),i[2]=a(n)}function uo(e,t,n,r,i){e=e*r/.6,t=t*r/.6,n=n*r/.6;let a=.59719*e+.35458*t+.04823*n,o=.076*e+.90834*t+.01566*n,s=.0284*e+.13383*t+.83777*n,c=e=>(e*(e+.0245786)-90537e-9)/(e*(.983729*e+.432951)+.238081);a=c(a),o=c(o),s=c(s),i[0]=ao(1.60475*a-.53108*o-.07367*s),i[1]=ao(-.10208*a+1.10813*o-.00605*s),i[2]=ao(-.00327*a-.07276*o+1.07602*s)}function fo(e,t,n,r,i){e*=r,t*=r,n*=r;let a=.6274*e+.3293*t+.0433*n,o=.0691*e+.9195*t+.0113*n,s=.0164*e+.088*t+.8956*n,c=.856627153315983*a+.0951212405381588*o+.0482516061458583*s,l=.137318972929847*a+.761241990602591*o+.101439036467562*s,u=.11189821299995*a+.0767994186031903*o+.811302368396859*s,d=-12.47393,f=4.026069-d;c=ao((Math.log2(Math.max(c,1e-10))-d)/f),l=ao((Math.log2(Math.max(l,1e-10))-d)/f),u=ao((Math.log2(Math.max(u,1e-10))-d)/f);let p=e=>{let t=e*e,n=t*t;return 15.5*n*t-40.14*n*e+31.96*n-6.868*t*e+.4298*t+.1191*e-.00232};c=p(c),l=p(l),u=p(u);let m=1.1271005818144368*c-.11060664309660323*l-.016493938717834573*u,h=-.1413297634984383*c+1.157823702216272*l-.016493938717834257*u,g=-.14132976349843826*c-.11060664309660294*l+1.2519364065950405*u;m=Math.max(0,m)**2.2,h=Math.max(0,h)**2.2,g=Math.max(0,g)**2.2,i[0]=ao(1.6605*m-.5876*h-.0728*g),i[1]=ao(-.1246*m+1.1329*h-.0083*g),i[2]=ao(-.0182*m-.1006*h+1.1187*g)}function po(e,t,n,r,i){let a=.76;e*=r,t*=r,n*=r;let o=Math.min(e,Math.min(t,n)),s=o<.08?o-6.25*o*o:.04;e-=s,t-=s,n-=s;let c=Math.max(e,Math.max(t,n));if(c<a){i[0]=e,i[1]=t,i[2]=n;return}let l=1-a,u=1-l*l/(c+l-a),d=u/c;e*=d,t*=d,n*=d;let f=1-1/(.15*(c-u)+1);i[0]=e+(u-e)*f,i[1]=t+(u-t)*f,i[2]=n+(u-n)*f}var mo=e=>(t,n,r,i,a)=>e(t>0?t:0,n>0?n:0,r>0?r:0,i,a),ho=new Map([[r.NoToneMapping,mo(oo)],[r.LinearToneMapping,mo(so)],[r.ReinhardToneMapping,mo(co)],[r.CineonToneMapping,mo(lo)],[r.ACESFilmicToneMapping,mo(uo)],[r.AgXToneMapping,mo(fo)],[r.NeutralToneMapping,mo(po)]]),go=1/2.2;function _o(e){return e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function vo(e,t){return t===r.NoToneMapping?1:e}var yo=.2126,bo=.7152,xo=.0722;function So(e,t){if(t===1)return;let n=e[0]*yo+e[1]*bo+e[2]*xo;e[0]=n+(e[0]-n)*t,e[1]=n+(e[1]-n)*t,e[2]=n+(e[2]-n)*t}function Co(e,{exposure:t,toneMapping:n,saturation:i=1,preserveAlpha:a=!1}){let o=ho.get(n)??ho.get(r.NoToneMapping),s=vo(t,n),c=new Uint8ClampedArray(e.length),l=[0,0,0];for(let t=0;t<e.length;t+=4)l[0]=e[t]*s,l[1]=e[t+1]*s,l[2]=e[t+2]*s,So(l,i),o(l[0],l[1],l[2],1,l),c[t]=_o(l[0])*255+.5,c[t+1]=_o(l[1])*255+.5,c[t+2]=_o(l[2])*255+.5,c[t+3]=a?e[t+3]*255+.5:255;return c}var wo=xt(`textures`),To={toSRGB:null,toLinear:null};function Eo(e){if(!To[e]){let t=new Uint8Array(256);for(let n=0;n<256;n++){let r=n/255,i=e===`toSRGB`?_o(r):r<=.04045?r/12.92:((r+.055)/1.055)**2.4;t[n]=Math.max(0,Math.min(255,Math.round(i*255)))}To[e]=t}return To[e]}var Do=class{constructor(){this.canvasContextPairs=[],this.maxPoolSize=q.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=[]}},Oo=class{constructor(e={}){this.pools=new Map,this.memoryUsage=0,this.maxMemoryUsage=e.maxMemory||at.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*at.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)}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<q.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`}},ko=class{constructor(e=q.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`;t+=`${e}x${r}_${i.slice(-8)}_${a}_`}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=[]}},Ao=class{constructor(e={}){this.useWorkers=typeof Worker<`u`,this.maxConcurrentWorkers=q.MAX_CONCURRENT_WORKERS,this.activeWorkers=0,this._issues=e.issues??null,this.maxTextureSize=this._clampTextureSize(e.maxTextureSize??q.DEFAULT_MAX_TEXTURE_SIZE),this.canvasPool=new Do,this.bufferPool=new Oo({maxMemory:e.maxBufferMemory||at.MAX_BUFFER_MEMORY,sizeStrategy:e.bufferSizeStrategy||`adaptive`}),this.textureCache=new ko,this.capabilities=this.detectCapabilities(),this.optimalMethod=this.selectOptimalMethod()}_reportTextureFailure(e,t){this._issues?.record(to.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)||q.DEFAULT_MAX_TEXTURE_SIZE);return Math.max(q.MIN_TEXTURE_WIDTH,Math.min(t,q.MAX_TEXTURE_SIZE))}setMaxTextureSize(e){let t=this._clampTextureSize(e);return t===this.maxTextureSize?t:(this.maxTextureSize=t,this.textureCache?.dispose(),this.textureCache=new ko,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`}_harmonizeTransfer(e,t,n){let i=e?.image?.data;if(!i)return;let a=t.filter(e=>e?.image),o=n?r.SRGBColorSpace:r.LinearSRGBColorSpace,s=e.image.width*e.image.height*4,c=[];for(let e=0;e<a.length;e++){let t=a[e].colorSpace;if(t!==r.SRGBColorSpace&&t!==r.LinearSRGBColorSpace||t===o)continue;let l=Eo(n?`toSRGB`:`toLinear`),u=e*s,d=Math.min(u+s,i.length);for(let e=u;e<d;e+=4)i[e]=l[i[e]],i[e+1]=l[i[e+1]],i[e+2]=l[i[e+2]];c.push(a[e].name||a[e].source?.uuid?.slice(0,8)||`layer ${e}`)}if(c.length===0)return;e.needsUpdate=!0;let l=c.slice(0,4).join(`, `)+(c.length>4?`, +${c.length-4} more`:``);n?wo.info(`re-encoded ${c.length}/${a.length} linear-declared colour map(s) to sRGB so the GPU decode round-trips: ${l}`):wo.warn(`decoded ${c.length}/${a.length} sRGB-declared data map(s) to linear — precision is lost in the darks, check the asset: ${l}`)}async createTexturesToDataTexture(e,{srgbPool:t=!1}={}){if(!e||e.length===0)return null;let n=`${t?`s`:`l`}:${this.textureCache.generateHash(e)}`,r=this.textureCache.get(n);if(r)return r;let{normalized:i,bitmapsToClose:a}=await this._normalizeTexturesForProcessing(e),o=this.selectProcessingStrategy(i),s;try{switch(o.method){case`worker-direct`:s=await this.processWithWorkerDirect(i);break;case`main-batch`:s=await this.processOnMainThreadBatch(i,o.batchSize);break;case`main-streaming`:s=await this.processOnMainThreadStreaming(i);break;default:s=await this.processOnMainThreadSync(i)}return s&&(this._harmonizeTransfer(s,e,t),this.textureCache.set(n,s)),s}catch(n){this._issues?.warn(to.TEXTURE_PROCESSING_FALLBACK,`worker texture processing failed — retrying on the main thread`,{cause:String(n?.message??n)});let r=await this.processOnMainThreadSync(i);return this._harmonizeTransfer(r,e,t),r}finally{for(let e of a)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>at.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 eo,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%at.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=e.length,r=n*t,i=new Float32Array(r);for(let r=0;r<n;r++){let n=e[r],a=r*t,o=n.mapMatrix??nt,s=n.normalMapMatrices??nt,c=n.roughnessMapMatrices??nt,l=n.metalnessMapMatrices??nt,u=n.emissiveMapMatrices??nt,d=n.bumpMapMatrices??nt,f=n.displacementMapMatrices??nt,p=[n.ior,n.transmission,n.thickness,n.emissiveIntensity,n.attenuationColor.r,n.attenuationColor.g,n.attenuationColor.b,Ze(n.attenuationDistance),n.opacity,n.side,n.transparent,n.alphaTest,n.alphaMode,n.depthWrite,n.normalScale?.x??1,n.normalScale?.y??1,n.color.r,n.color.g,n.color.b,n.metalness,n.emissive.r,n.emissive.g,n.emissive.b,n.roughness,n.map,n.normalMap,n.roughnessMap,n.metalnessMap,n.emissiveMap,n.bumpMap,n.clearcoat,n.clearcoatRoughness,n.dispersion,n.visible,n.sheen,n.sheenRoughness,n.sheenColor.r,n.sheenColor.g,n.sheenColor.b,1,n.specularIntensity,n.specularColor.r,n.specularColor.g,n.specularColor.b,n.iridescence,n.iridescenceIOR,n.iridescenceThicknessRange[0],n.iridescenceThicknessRange[1],n.bumpScale,n.displacementScale,n.displacementMap,0,o[0],o[1],o[2],o[3],o[4],o[5],o[6],o[7],s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],n.subsurfaceColor?.r??1,n.subsurfaceColor?.g??1,n.subsurfaceColor?.b??1,n.subsurface??0,n.subsurfaceRadius?.[0]??1,n.subsurfaceRadius?.[1]??.2,n.subsurfaceRadius?.[2]??.1,n.subsurfaceRadiusScale??1,n.subsurfaceAnisotropy??0,n.anisotropy??0,n.anisotropyRotation??0,n.anisotropyMap??-1,n.transmissionMap??-1,n.clearcoatMap??-1,n.clearcoatRoughnessMap??-1,n.sheenColorMap??-1,n.sheenRoughnessMap??-1,n.iridescenceMap??-1,n.iridescenceThicknessMap??-1,n.specularIntensityMap??-1,n.specularColorMap??-1,0,0,0];i.set(p,a)}return i}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=q.VEC4_PER_BVH_NODE*q.FLOATS_PER_VEC4,i=t.length*r,a=new Float32Array(i);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,o=t[e],s=t[r];a[n]=o.boundsMin.x,a[n+1]=o.boundsMin.y,a[n+2]=o.boundsMin.z,a[n+3]=e,a[n+4]=o.boundsMax.x,a[n+5]=o.boundsMax.y,a[n+6]=o.boundsMax.z,a[n+7]=r,a[n+8]=s.boundsMin.x,a[n+9]=s.boundsMin.y,a[n+10]=s.boundsMin.z,a[n+12]=s.boundsMax.x,a[n+13]=s.boundsMax.y,a[n+14]=s.boundsMax.z}else a[n]=i.triangleOffset,a[n+1]=i.triangleCount,a[n+3]=-1}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 ko;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);for(t=2**Math.ceil(Math.log2(t)),n=2**Math.ceil(Math.log2(n));t>this.maxTextureSize||n>this.maxTextureSize;)t=Math.max(1,Math.floor(t/2)),n=Math.max(1,Math.floor(n/2));return{maxWidth:t,maxHeight: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};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:jo(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:jo(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 jo(e,t,n){let r=new Uint8ClampedArray(e.buffer,e.byteOffset,e.byteLength);return createImageBitmap(new ImageData(r,t,n))}var Mo=xt(`geometry`),No=128;function Po(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}var Fo=class{constructor(){this._vectorPool={vec3:Array(9).fill().map(()=>new r.Vector3),vec2:[,,,,,,].fill().map(()=>new r.Vector2)},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.triangleData=new Float32Array(this._triangleCapacity*G.FLOATS_PER_TRIANGLE),this.currentTriangleIndex=0,this.traverseObject(e),this.logStats(),this.getExtractedData()}_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;let t=new Float32Array(e*G.FLOATS_PER_TRIANGLE);t.set(this.triangleData),this.triangleData=t,this._triangleCapacity=e}traverseObject(e){if(e.isMesh?this.processMesh(e):e.isDirectionalLight?this.directionalLights.push(e):e.isCamera&&this.cameras.push(e),e.children)for(let t of e.children)this.traverseObject(t)}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=this.currentTriangleIndex;this.extractGeometry(e,t,n),this.meshTriangleRanges.push({start:r,count:this.currentTriangleIndex-r})}processMaterial(e){let t=this._materialUuidMap.get(e.uuid)??-1;if(t===-1){e.depthWrite===!1&&(e.depthWrite=!0,Ct(Mo,`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(){return{emissive:new r.Color(0,0,0),emissiveIntensity:1,roughness:1,metalness:0,ior:1.5,opacity:1,transmission:0,thickness:.1,attenuationColor:new r.Color(16777215),attenuationDistance:1/0,dispersion:0,sheen:0,sheenRoughness:1,sheenColor:new r.Color(0),specularIntensity:1,specularColor:new r.Color(16777215),clearcoat:0,clearcoatRoughness:0,iridescence:0,iridescenceIOR:1.3,iridescenceThicknessRange:[100,400],normalScale:{x:1,y:1},bumpScale:1,displacementScale:1,alphaTest:0,subsurface:0,subsurfaceColor:new r.Color(16777215),subsurfaceRadius:[1,.2,.1],subsurfaceRadiusScale:1,subsurfaceAnisotropy:0,anisotropy:0,anisotropyRotation:0}}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;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.r*.299+e.specular.g*.587+e.specular.b*.114;n.specularIntensity=Math.min(t*2,1),n.specularColor=e.specular.clone()}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),i=this.mapLegacyMaterialToPhysical(e,n),a=(e.transmission??0)>0,o=(e.metalness??i.metalness??0)>.1&&!a?2.5:t.ior,s=e.color||new r.Color(16777215);return n===`basic`&&!e.map&&(s=new r.Color(0)),{uuid:e.uuid,color:s,emissive:i.emissive??e.emissive??t.emissive,emissiveIntensity:i.emissiveIntensity??e.emissiveIntensity??t.emissiveIntensity,roughness:Math.max(.02,i.roughness??e.roughness??t.roughness),metalness:i.metalness??e.metalness??t.metalness,ior:e.ior??o,opacity:e.opacity??t.opacity,transmission:e.transmission??t.transmission,thickness:e.thickness??t.thickness,attenuationColor:e.attenuationColor??t.attenuationColor,attenuationDistance:e.attenuationDistance??t.attenuationDistance,dispersion:e.dispersion??t.dispersion,sheen:e.sheen??t.sheen,sheenRoughness:e.sheenRoughness??t.sheenRoughness,sheenColor:e.sheenColor??t.sheenColor,clearcoat:e.clearcoat??t.clearcoat,clearcoatRoughness:e.clearcoatRoughness??t.clearcoatRoughness,iridescence:e.iridescence??t.iridescence,iridescenceIOR:e.iridescenceIOR??t.iridescenceIOR,iridescenceThicknessRange:e.iridescenceThicknessRange??t.iridescenceThicknessRange,subsurface:e.subsurface??t.subsurface,subsurfaceColor:e.subsurfaceColor??t.subsurfaceColor,subsurfaceRadius:e.subsurfaceRadius??t.subsurfaceRadius,subsurfaceRadiusScale:e.subsurfaceRadiusScale??t.subsurfaceRadiusScale,subsurfaceAnisotropy:e.subsurfaceAnisotropy??t.subsurfaceAnisotropy,anisotropy:e.anisotropy??t.anisotropy,anisotropyRotation:e.anisotropyRotation??t.anisotropyRotation,specularIntensity:i.specularIntensity??e.specularIntensity??t.specularIntensity,specularColor:i.specularColor??e.specularColor??t.specularColor,normalScale:e.normalScale??t.normalScale,bumpScale:e.bumpScale??t.bumpScale,displacementScale:e.displacementScale??t.displacementScale,transparent:+!!e.transparent,alphaTest:e.alphaTest??t.alphaTest,alphaMode:Po(e),side:this.getMaterialSide(e),depthWrite:e.depthWrite??!0?1:0,map:this.processTexture(e.map,this.maps),normalMap:this.processTexture(e.normalMap,this.normalMaps),bumpMap:this.processTexture(e.bumpMap,this.bumpMaps),roughnessMap:this.processTexture(e.roughnessMap,this.roughnessMaps),metalnessMap:this.processTexture(e.metalnessMap,this.metalnessMaps),emissiveMap:this.processTexture(e.emissiveMap,this.emissiveMaps),displacementMap:this.processTexture(e.displacementMap,this.displacementMaps),anisotropyMap:this.processTexture(e.anisotropyMap,this.anisotropyMaps),clearcoatMap:this.processTexture(e.clearcoatMap,this.clearcoatMaps),clearcoatRoughnessMap:this.processTexture(e.clearcoatRoughnessMap,this.clearcoatRoughnessMaps),transmissionMap:this.processTexture(e.transmissionMap,this.transmissionMaps),thicknessMap:this.processTexture(e.thicknessMap,[]),sheenColorMap:this.processTexture(e.sheenColorMap,this.sheenColorMaps),sheenRoughnessMap:this.processTexture(e.sheenRoughnessMap,this.sheenRoughnessMaps),specularIntensityMap:this.processTexture(e.specularIntensityMap,this.specularIntensityMaps),specularColorMap:this.processTexture(e.specularColorMap,this.specularColorMaps),iridescenceMap:this.processTexture(e.iridescenceMap,this.iridescenceMaps),iridescenceThicknessMap:this.processTexture(e.iridescenceThicknessMap,this.iridescenceThicknessMaps),mapMatrix:this.getTextureMatrix(e.map),normalMapMatrices:this.getTextureMatrix(e.normalMap),bumpMapMatrices:this.getTextureMatrix(e.bumpMap),roughnessMapMatrices:this.getTextureMatrix(e.roughnessMap),metalnessMapMatrices:this.getTextureMatrix(e.metalnessMap),emissiveMapMatrices:this.getTextureMatrix(e.emissiveMap),displacementMapMatrices:this.getTextureMatrix(e.displacementMap),originalType:n}}getTextureMatrix(e){return e?(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<No){t.push(e);let i=t.length-1;return n.set(r,i),i}return-1}extractGeometry(e,t,n){e.updateMatrix(),e.updateMatrixWorld();let r=e.geometry;r.attributes.normal||r.computeVertexNormals();let i=r.attributes.position,a=r.attributes.normal,o=r.attributes.uv,s=r.index?r.index.array:null;this._matrixPool.mat4.copy(e.matrixWorld),this._matrixPool.mat3.getNormalMatrix(this._matrixPool.mat4);let c=s?s.length/3:i.count/3;this.extractTrianglesInBatch(i,a,o,s,c,t,n)}extractTrianglesInBatch(e,t,n,r,i,a,o){for(;this.materialTriangleCounts.length<=a;)this.materialTriangleCounts.push(0);this.materialTriangleCounts[a]+=i;let s=this._getVec3(0),c=this._getVec3(1),l=this._getVec3(2),u=this._getVec3(3),d=this._getVec3(4),f=this._getVec3(5),p=this._getVec2(0),m=this._getVec2(1),h=this._getVec2(2);this._ensureCapacity(this.currentTriangleIndex+i);for(let g=0;g<i;g++){let i=g*3,_=r?r[i+0]:i+0,v=r?r[i+1]:i+1,y=r?r[i+2]:i+2;this.getVertex(e,_,s),this.getVertex(e,v,c),this.getVertex(e,y,l),this.getVertex(t,_,u),this.getVertex(t,v,d),this.getVertex(t,y,f),n?(this.getVertex(n,_,p),this.getVertex(n,v,m),this.getVertex(n,y,h)):(p.set(0,0),m.set(0,0),h.set(0,0)),s.applyMatrix4(this._matrixPool.mat4),c.applyMatrix4(this._matrixPool.mat4),l.applyMatrix4(this._matrixPool.mat4),u.applyMatrix3(this._matrixPool.mat3).normalize(),d.applyMatrix3(this._matrixPool.mat3).normalize(),f.applyMatrix3(this._matrixPool.mat3).normalize(),this.packTriangleDataTextureFormat(this.currentTriangleIndex,s,c,l,u,d,f,p,m,h,a,o),this.currentTriangleIndex++}}packTriangleDataTextureFormat(e,t,n,r,i,a,o,s,c,l,u,d){let f=e*G.FLOATS_PER_TRIANGLE;this.triangleData[f+G.POSITION_A_OFFSET+0]=t.x,this.triangleData[f+G.POSITION_A_OFFSET+1]=t.y,this.triangleData[f+G.POSITION_A_OFFSET+2]=t.z,this.triangleData[f+G.POSITION_A_OFFSET+3]=0,this.triangleData[f+G.POSITION_B_OFFSET+0]=n.x,this.triangleData[f+G.POSITION_B_OFFSET+1]=n.y,this.triangleData[f+G.POSITION_B_OFFSET+2]=n.z,this.triangleData[f+G.POSITION_B_OFFSET+3]=0,this.triangleData[f+G.POSITION_C_OFFSET+0]=r.x,this.triangleData[f+G.POSITION_C_OFFSET+1]=r.y,this.triangleData[f+G.POSITION_C_OFFSET+2]=r.z,this.triangleData[f+G.POSITION_C_OFFSET+3]=0,this.triangleData[f+G.NORMAL_A_OFFSET+0]=i.x,this.triangleData[f+G.NORMAL_A_OFFSET+1]=i.y,this.triangleData[f+G.NORMAL_A_OFFSET+2]=i.z;{let e=this.materials[u],t=e&&!(e.alphaMode|0)&&!(e.transparent|0)&&(e.transmission||0)===0&&(e.opacity??1)>=1?1:0;this.triangleData[f+G.NORMAL_A_OFFSET+3]=t}this.triangleData[f+G.NORMAL_B_OFFSET+0]=a.x,this.triangleData[f+G.NORMAL_B_OFFSET+1]=a.y,this.triangleData[f+G.NORMAL_B_OFFSET+2]=a.z,this.triangleData[f+G.NORMAL_B_OFFSET+3]=0,this.triangleData[f+G.NORMAL_C_OFFSET+0]=o.x,this.triangleData[f+G.NORMAL_C_OFFSET+1]=o.y,this.triangleData[f+G.NORMAL_C_OFFSET+2]=o.z,this.triangleData[f+G.NORMAL_C_OFFSET+3]=this.materials[u]?.side??0,this.triangleData[f+G.UV_AB_OFFSET+0]=s.x,this.triangleData[f+G.UV_AB_OFFSET+1]=s.y,this.triangleData[f+G.UV_AB_OFFSET+2]=c.x,this.triangleData[f+G.UV_AB_OFFSET+3]=c.y,this.triangleData[f+G.UV_C_MAT_OFFSET+0]=l.x,this.triangleData[f+G.UV_C_MAT_OFFSET+1]=l.y,this.triangleData[f+G.UV_C_MAT_OFFSET+2]=u,this.triangleData[f+G.UV_C_MAT_OFFSET+3]=d}getTriangleData(){return this.triangleData?this.triangleData.subarray(0,this.currentTriangleIndex*G.FLOATS_PER_TRIANGLE):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*G.FLOATS_PER_TRIANGLE*4;Mo.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.triangleData=null,this.triangleCount=0,this.currentTriangleIndex=0,this.materials=[],this.materialTriangleCounts=[],this.meshes=[],this.meshTriangleRanges=[],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,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}}},Io=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=Ro(E,Lo(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=Ro(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 Lo(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 Ro(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)}}var zo=xt(`emissive`),Bo=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){this.emissiveTriangles=[],this.totalEmissivePower=0,this._totalTriangleCount=n;let r=G.FLOATS_PER_TRIANGLE,i=G.UV_C_MAT_OFFSET+2,a=G.UV_C_MAT_OFFSET+3;for(let o=0;o<n;o++){let n=o*r,s=Math.floor(e[n+i]),c=Math.floor(e[n+a]),l=t[s];if(!l)continue;let u=l.emissive||{r:0,g:0,b:0},d=l.emissiveIntensity||0;if(d>0&&(u.r>0||u.g>0||u.b>0)){let t=e[n+0],r=e[n+1],i=e[n+2],a=e[n+4],f=e[n+5],p=e[n+6],m=e[n+8],h=e[n+9],g=e[n+10],_=this._calculateTriangleArea(t,r,i,a,f,p,m,h,g),v=(.2126*u.r+.7152*u.g+.0722*u.b)*d*_,y=(f-r)*(g-i)-(p-i)*(h-r),b=(p-i)*(m-t)-(a-t)*(g-i),x=(a-t)*(h-r)-(f-r)*(m-t),S=Math.sqrt(y*y+b*b+x*x)||1,C=l.side===1?-1:1;y=y/S*C,b=b/S*C,x=x/S*C;let w=l.side===2,T=(t+a+m)/3,E=(r+f+h)/3,D=(i+p+g)/3,O=Math.min(t,a,m),k=Math.min(r,f,h),A=Math.min(i,p,g),j=Math.max(t,a,m),M=Math.max(r,f,h),N=Math.max(i,p,g);this.emissiveTriangles.push({triangleIndex:o,materialIndex:s,meshIndex:c,power:v,area:_,emissive:{r:u.r,g:u.g,b:u.b},emissiveIntensity:d,cx:T,cy:E,cz:D,bMinX:O,bMinY:k,bMinZ:A,bMaxX:j,bMaxY:M,bMaxZ:N,nx:y,ny:b,nz:x,twoSided:w}),this.totalEmissivePower+=v}}return this.emissiveCount=this.emissiveTriangles.length,this.emissiveCount>0&&zo.debug(`${J.n(this.emissiveCount)} emissive tris (${(this.emissiveCount/n*100).toFixed(2)}%) · total power ${this.totalEmissivePower.toFixed(2)}`),this._buildDataArrays(),this.emissiveCount}_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,zo.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]=this.totalEmissivePower>0?n.power/this.totalEmissivePower:0,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 zo.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=t.emissive||{r:0,g:0,b:0},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 Io().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]=this.totalEmissivePower>0?n.power/this.totalEmissivePower:0,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,zo.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}},Vo=class{constructor(e=`Build`,{namespace:t=`build`,level:n=`debug`}={}){this.label=e,this.level=n,this.logger=xt(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)}}},Ho="const e={FLOATS_PER_TRIANGLE:32,POSITION_A_OFFSET:0,POSITION_B_OFFSET:4,POSITION_C_OFFSET:8,NORMAL_A_OFFSET:12,NORMAL_B_OFFSET:16,NORMAL_C_OFFSET:20},t=e.FLOATS_PER_TRIANGLE,n=new class{constructor(){this._bounds=null,this._boundsNodeCount=0}updateTrianglePositions(n,r,i){let a=i.length;for(let o=0;o<a;o++){let a=i[o],s=o*t,c=a*9,l=r[c],u=r[c+1],d=r[c+2],f=r[c+3],p=r[c+4],m=r[c+5],h=r[c+6],g=r[c+7],_=r[c+8];n[s+e.POSITION_A_OFFSET]=l,n[s+e.POSITION_A_OFFSET+1]=u,n[s+e.POSITION_A_OFFSET+2]=d,n[s+e.POSITION_B_OFFSET]=f,n[s+e.POSITION_B_OFFSET+1]=p,n[s+e.POSITION_B_OFFSET+2]=m,n[s+e.POSITION_C_OFFSET]=h,n[s+e.POSITION_C_OFFSET+1]=g,n[s+e.POSITION_C_OFFSET+2]=_;let v=f-l,y=p-u,b=m-d,x=h-l,S=g-u,C=_-d,w=y*C-b*S,T=b*x-v*C,E=v*S-y*x;n[s+e.NORMAL_A_OFFSET]=w,n[s+e.NORMAL_A_OFFSET+1]=T,n[s+e.NORMAL_A_OFFSET+2]=E,n[s+e.NORMAL_B_OFFSET]=w,n[s+e.NORMAL_B_OFFSET+1]=T,n[s+e.NORMAL_B_OFFSET+2]=E,n[s+e.NORMAL_C_OFFSET]=w,n[s+e.NORMAL_C_OFFSET+1]=T,n[s+e.NORMAL_C_OFFSET+2]=E}}refitRange(n,r,i,a){a>this._boundsNodeCount&&(this._bounds=new Float32Array(a*6),this._boundsNodeCount=a);let o=this._bounds,s=i+a;for(let a=s-1;a>=i;a--){let s=a*16,c=(a-i)*6;if(n[s+3]===-1){let i=n[s],a=n[s+1],l=1/0,u=1/0,d=1/0,f=-1/0,p=-1/0,m=-1/0;for(let n=0;n<a;n++){let a=(i+n)*t,o=r[a+e.POSITION_A_OFFSET],s=r[a+e.POSITION_A_OFFSET+1],c=r[a+e.POSITION_A_OFFSET+2],h=r[a+e.POSITION_B_OFFSET],g=r[a+e.POSITION_B_OFFSET+1],_=r[a+e.POSITION_B_OFFSET+2],v=r[a+e.POSITION_C_OFFSET],y=r[a+e.POSITION_C_OFFSET+1],b=r[a+e.POSITION_C_OFFSET+2];l=Math.min(l,o,h,v),u=Math.min(u,s,g,y),d=Math.min(d,c,_,b),f=Math.max(f,o,h,v),p=Math.max(p,s,g,y),m=Math.max(m,c,_,b)}o[c]=l,o[c+1]=u,o[c+2]=d,o[c+3]=f,o[c+4]=p,o[c+5]=m}else{let e=n[s+3],t=n[s+7],r=(e-i)*6,a=(t-i)*6,l=o[r],u=o[r+1],d=o[r+2],f=o[r+3],p=o[r+4],m=o[r+5],h=o[a],g=o[a+1],_=o[a+2],v=o[a+3],y=o[a+4],b=o[a+5];n[s]=l,n[s+1]=u,n[s+2]=d,n[s+4]=f,n[s+5]=p,n[s+6]=m,n[s+8]=h,n[s+9]=g,n[s+10]=_,n[s+12]=v,n[s+13]=y,n[s+14]=b,o[c]=Math.min(l,h),o[c+1]=Math.min(u,g),o[c+2]=Math.min(d,_),o[c+3]=Math.max(f,v),o[c+4]=Math.max(p,y),o[c+5]=Math.max(m,b)}}}refit(n,r,i){i!==this._boundsNodeCount&&(this._bounds=new Float32Array(i*6),this._boundsNodeCount=i);let a=this._bounds;for(let o=i-1;o>=0;o--){let i=o*16,s=o*6,c=n[i+3];if(c===-1){let o=n[i],c=n[i+1],l=1/0,u=1/0,d=1/0,f=-1/0,p=-1/0,m=-1/0;for(let n=0;n<c;n++){let i=(o+n)*t,a=r[i+e.POSITION_A_OFFSET],s=r[i+e.POSITION_A_OFFSET+1],c=r[i+e.POSITION_A_OFFSET+2],h=r[i+e.POSITION_B_OFFSET],g=r[i+e.POSITION_B_OFFSET+1],_=r[i+e.POSITION_B_OFFSET+2],v=r[i+e.POSITION_C_OFFSET],y=r[i+e.POSITION_C_OFFSET+1],b=r[i+e.POSITION_C_OFFSET+2];l=Math.min(l,a,h,v),u=Math.min(u,s,g,y),d=Math.min(d,c,_,b),f=Math.max(f,a,h,v),p=Math.max(p,s,g,y),m=Math.max(m,c,_,b)}a[s]=l,a[s+1]=u,a[s+2]=d,a[s+3]=f,a[s+4]=p,a[s+5]=m}else if(c===-2){let e=n[i]*6;a[s]=a[e],a[s+1]=a[e+1],a[s+2]=a[e+2],a[s+3]=a[e+3],a[s+4]=a[e+4],a[s+5]=a[e+5]}else{let e=n[i+3],t=n[i+7],r=e*6,o=t*6,c=a[r],l=a[r+1],u=a[r+2],d=a[r+3],f=a[r+4],p=a[r+5],m=a[o],h=a[o+1],g=a[o+2],_=a[o+3],v=a[o+4],y=a[o+5];n[i]=c,n[i+1]=l,n[i+2]=u,n[i+4]=d,n[i+5]=f,n[i+6]=p,n[i+8]=m,n[i+9]=h,n[i+10]=g,n[i+12]=_,n[i+13]=v,n[i+14]=y,a[s]=Math.min(c,m),a[s+1]=Math.min(l,h),a[s+2]=Math.min(u,g),a[s+3]=Math.max(d,_),a[s+4]=Math.max(f,v),a[s+5]=Math.max(p,y)}}}};let r=null,i=null,a=null,o=null,s=0;self.onmessage=function(e){let{type:t}=e.data;if(t===`init`){r=new Float32Array(e.data.sharedBvhBuf),i=new Float32Array(e.data.sharedTriBuf),a=new Float32Array(e.data.sharedPosBuf),o=e.data.bvhToOriginal,s=r.length/16;return}if(t===`refit`)try{let e=performance.now();n.updateTrianglePositions(i,a,o),n.refit(r,i,s),self.postMessage({type:`refitComplete`,refitTimeMs:performance.now()-e})}catch(e){console.error(`[BVHRefitWorker] Refit error:`,e),self.postMessage({type:`error`,error:e.message})}};",Uo=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Ho],{type:`text/javascript;charset=utf-8`});function Wo(e){let t;try{if(t=Uo&&(self.URL||self.webkitURL).createObjectURL(Uo),!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(Ho),{type:`module`,name:e?.name})}}var Go=xt(`scene`),Ko=class{constructor(e={}){this.config={useWorkers:!0,bvhDepth:30,maxLeafSize:4,verbose:!1,useFloat32Array:!0,textureQuality:`adaptive`,maxTextureSize:q.DEFAULT_MAX_TEXTURE_SIZE,enableTextureCache:!0,maxConcurrentTextureTasks:Math.min(navigator.hardwareConcurrency||4,6),enableTreeletOptimization:!1,treeletSize:7,treeletOptimizationPasses:1,treeletMinImprovement:.01,treeletComplexityThreshold:5e4,...e},this.triangleData=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.bvhData=null,this.materialData=null,this.instanceTable=null,this.originalToBvhMap=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.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime:0,totalProcessingTime:0}}setMaxTextureSize(e){return this.config.maxTextureSize=e,this.textureCreator?.setMaxTextureSize(e)}_initProcessors(){this.geometryExtractor=new Fo,this.bvhBuilder=new Oa,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 Ao({maxTextureSize:this.config.maxTextureSize,issues:this.config.issues}),this.emissiveTriangleBuilder=new Bo,this.tlasBuilder=new Xa}_log(e,t){t===void 0?Go.debug(e):Go.debug(e,t)}async buildBVH(e){if(this.isProcessing)throw Error(`Already processing a scene. Call dispose() first.`);this.isProcessing=!0,this.processingStage=`init`;let t=new Vo(e.name??``,{namespace:`scene`});try{this._reset(),this._log(`Starting scene processing`),this.processingStage=`extraction`,t.start(`Geometry extraction`),await this._extractGeometry(e),t.end(`Geometry extraction`),this.performanceMetrics.geometryExtractionTime=t.getDuration(`Geometry extraction`),this.processingStage=`bvh`,t.start(`BVH construction (worker)`),t.start(`Material textures (parallel)`);let n=!1,r=this._buildBVH().then(()=>t.end(`BVH construction (worker)`)),i=this._createMaterialTextures().then(()=>{t.end(`Material textures (parallel)`),n=!0});return await r,H({status:`Building light data...`,progress:77}),t.start(`Emissive extraction + Light BVH`),this._buildEmissiveData(),t.end(`Emissive extraction + Light BVH`),n||H({status:`Processing material textures...`,progress:80}),await i,this.performanceMetrics.bvhBuildTime=t.getDuration(`BVH construction (worker)`),this.performanceMetrics.textureCreationTime=t.getDuration(`Material textures (parallel)`),this.processingStage=`finalize`,t.start(`BVH data packing`),this.bvhRoot&&!this.bvhData&&(this.bvhData=this.textureCreator.createBVHRawData(this.bvhRoot)),t.end(`BVH data packing`),this.spheres=this._createSpheres(),this.performanceMetrics.totalProcessingTime=performance.now()-t.totalStart,t.print(),this.processingStage=`complete`,H({status:`Scene data ready`,progress:85}),this}catch(e){throw this.processingStage=`error`,Go.error(`processing failed:`,e),H({status:`Error: ${e.message}`,progress:100}),e}finally{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{let n=this.geometryExtractor.extract(e);this.triangleData=n.triangleData,this.triangleCount=n.triangleCount,this._log(`Using Float32Array format: ${this.triangleCount} triangles, ${(this.triangleData.byteLength/(1024*1024)).toFixed(2)}MB`),this.materials=n.materials,this.materialTriangleCounts=n.materialTriangleCounts,this.meshes=n.meshes,this.meshTriangleRanges=n.meshTriangleRanges,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,this.anisotropyMaps=n.anisotropyMaps,this.transmissionMaps=n.transmissionMaps,this.clearcoatMaps=n.clearcoatMaps,this.clearcoatRoughnessMaps=n.clearcoatRoughnessMaps,this.sheenColorMaps=n.sheenColorMaps,this.sheenRoughnessMaps=n.sheenRoughnessMaps,this.iridescenceMaps=n.iridescenceMaps,this.iridescenceThicknessMaps=n.iridescenceThicknessMaps,this.specularIntensityMaps=n.specularIntensityMaps,this.specularColorMaps=n.specularColorMaps,this.directionalLights=n.directionalLights,this.cameras=n.cameras;let r=performance.now()-t;this._log(`Geometry extraction complete (${r.toFixed(2)}ms)`,{triangleCount:this.triangleCount,materials:this.materials.length}),H({status:`Extracted ${this.triangleCount.toLocaleString()} triangles`,progress:25})}catch(e){throw Go.error(`geometry extraction failed:`,e),H({status:`Extraction error: ${e.message}`,progress:25}),e}}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)`);let e=performance.now();try{let t=G.FLOATS_PER_TRIANGLE,n=this.meshTriangleRanges;if(!n||n.length===0)throw Error(`No mesh triangle ranges available for TLAS/BLAS build`);this.instanceTable=new Za,this.instanceTable.allocate(n.length);let r=n.length,i=this.config.enableTreeletOptimization,a=[],o=[];for(let e=0;e<r;e++){let t=n[e];t.count!==0&&(t.count>=2e5&&qa(t.count)?o.push({m:e,range:t}):a.push({m:e,range:t}))}let s={depth:this.config.bvhDepth,treeletOptimization:{enabled:i!==!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,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,logLevel:wt()},c=a.length+o.length,l=this._buildBLASesWithPool(a,s,e=>{H({status:`Building BLAS ${e+o.length}/${c}...`,progress:25+Math.floor(e/c*45)})}),u=o.map(({m:e,range:n})=>Wa(this.triangleData.slice(n.start*t,(n.start+n.count)*t),this.config.bvhDepth,null,{maxLeafSize:this.bvhBuilder.maxLeafSize,numBins:this.bvhBuilder.numBins,maxBins:this.bvhBuilder.maxBins,minBins:this.bvhBuilder.minBins,...s}).then(t=>({m:e,range:n,result:t}))),[d,f]=await Promise.all([l,Promise.all(u)]),p={sah:0,objMed:0,spatMed:0,failed:0,treeletsImproved:0,treeletsProcessed:0};for(let{m:e,range:n,result:r}of[...d,...f]){r.reorderedTriangles&&this.triangleData.set(r.reorderedTriangles,n.start*t);let i=r.splitStats;i&&(p.sah+=i.sahSplits??0,p.objMed+=i.objectMedianSplits??0,p.spatMed+=i.spatialMedianSplits??0,p.failed+=i.failedSplits??0,p.treeletsImproved+=i.treeletsImproved??0,p.treeletsProcessed+=i.treeletsProcessed??0),this.instanceTable.setEntry({meshIndex:e,blasNodeCount:r.bvhData.length/16,triOffset:n.start,triCount:n.count,originalToBvhMap:r.originalToBvh||null,bvhData:r.bvhData})}H({status:`Built all BLASes`,progress:70}),H({status:`Building TLAS...`,progress:72});let m=this.instanceTable.entries.filter(e=>e!==null);this.instanceTable.computeAABBs(this.triangleData);let{root:h,nodeCount:g}=this.tlasBuilder.build(m);this.instanceTable.assignOffsets(g);let _=this.instanceTable.totalNodeCount,v=this.tlasBuilder.flatten(h,m);this.bvhData=new Float32Array(_*16),this.bvhData.set(v);for(let e of m){let t=e.blasOffset*16;this.bvhData.set(e.bvhData,t),this._offsetBLASInPlace(t,e.bvhData.length/16,e.blasOffset,e.triOffset)}this._buildGlobalOriginalToBvhMap();for(let e of m)e.originalToBvhMap=null,e.bvhData=null;this.bvhRoot=!0,this._disposeRefitWorker();let y=performance.now()-e;Go.debug(J.list([`${J.n(m.length)} BLASes + TLAS`,`${J.n(this.bvhData.length/16)} nodes`,`SAH ${J.n(p.sah)} · objMed ${p.objMed} · spatMed ${p.spatMed} · failed ${p.failed}`,p.treeletsProcessed?`treelets ${p.treeletsImproved}/${p.treeletsProcessed} improved`:null,J.ms(y)])),H({status:`BVH construction complete`,progress:75})}catch(e){throw Go.error(`BVH build failed:`,e),H({status:`BVH error: ${e.message}`,progress:75}),e}}_offsetBLASInPlace(e,t,n,r){for(let i=0;i<t;i++){let t=e+i*16;this.bvhData[t+3]===-1?this.bvhData[t]+=r:(this.bvhData[t+3]+=n,this.bvhData[t+7]+=n)}}_buildBLASesWithPool(e,t,n){if(e.length===0)return Promise.resolve([]);let r=G.FLOATS_PER_TRIANGLE,i=Math.min(e.length,this.config.maxConcurrentTextureTasks||4),a=[],o=0,s=0;return new Promise((c,l)=>{let u=[],d=n=>{if(o>=e.length){n.terminate(),u.splice(u.indexOf(n),1),u.length===0&&c(a);return}let{m:i,range:s}=e[o++],l=this.triangleData.slice(s.start*r,(s.start+s.count)*r),d=s.count,f=d<=500?{...t.treeletOptimization,enabled:!1}:t.treeletOptimization;n._currentTask={m:i,range:s},n.postMessage({triangleData:l.buffer,triangleByteOffset:l.byteOffset,triangleByteLength:l.byteLength,triangleCount:d,depth:t.depth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:f,reinsertionOptimization:t.reinsertionOptimization,maxLeafSize:t.maxLeafSize,numBins:t.numBins,maxBins:t.maxBins,minBins:t.minBins,logLevel:t.logLevel},[l.buffer])},f=(e,t)=>{let r=t.data;if(r.error){u.forEach(e=>e.terminate()),l(Error(r.error));return}if(r.progress!==void 0)return;let{m:i,range:o}=e._currentTask;a.push({m:i,range:o,result:{bvhData:r.bvhData,reorderedTriangles:r.triangles||null,originalToBvh:r.originalToBvh||null,splitStats:r.treeletStats||null}}),s++,n?.(s),d(e)};(async()=>{for(let e=0;e<i;e++){let e;try{e=new Ia}catch(e){l(e);return}e.onmessage=t=>f(e,t),e.onerror=e=>{u.forEach(e=>e.terminate()),l(e)},u.push(e),d(e)}})().catch(l)})}_buildGlobalOriginalToBvhMap(){this.originalToBvhMap=new Uint32Array(this.triangleCount);for(let e of this.instanceTable.entries){if(!e)continue;let t=new Uint32Array(e.triCount);if(e.originalToBvhMap)for(let n=0;n<e.triCount;n++){let r=e.originalToBvhMap[n];this.originalToBvhMap[e.triOffset+n]=e.triOffset+r,t[r]=n}else for(let n=0;n<e.triCount;n++)this.originalToBvhMap[e.triOffset+n]=e.triOffset+n,t[n]=n;e.bvhToOriginal=t}}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 Go.error(`texture creation failed:`,e),e}}_bucketTextures(){let e=this.config.maxTextureSize,t=q.MATERIAL_BUCKET_COUNT,n=q.BUCKET_LAYER_STRIDE,r=Array.from({length:t},()=>[]),i=Array.from({length:t},()=>[]),a=Array.from({length:t},()=>new Map),o=Array.from({length:t},()=>new Map);this._srgbTexPacked=new Map,this._linearTexPacked=new Map;let s=(r,i,a,o)=>{if(!r||!r.image)return-1;let s=et(r.image.width,r.image.height,e,t),c=r.source?.uuid??r.uuid,l=a[s].get(c);if(l!==void 0)return tt(s,l);if(i[s].length>=n)return Go.warn(`texture bucket ${s} full (${n}); dropping a map`),-1;i[s].push(r);let u=i[s].length-1;a[s].set(c,u);let d=tt(s,u);return o.set(c,d),d},c=(e,t,n,r)=>(e||[]).map(e=>s(e,t,n,r));return{srgbLists:r,linearLists:i,remap:{albedo:c(this.maps,r,a,this._srgbTexPacked),emissive:c(this.emissiveMaps,r,a,this._srgbTexPacked),normal:c(this.normalMaps,i,o,this._linearTexPacked),bump:c(this.bumpMaps,i,o,this._linearTexPacked),roughness:c(this.roughnessMaps,i,o,this._linearTexPacked),metalness:c(this.metalnessMaps,i,o,this._linearTexPacked),displacement:c(this.displacementMaps,i,o,this._linearTexPacked),anisotropy:c(this.anisotropyMaps,i,o,this._linearTexPacked),transmission:c(this.transmissionMaps,i,o,this._linearTexPacked),clearcoat:c(this.clearcoatMaps,i,o,this._linearTexPacked),clearcoatRoughness:c(this.clearcoatRoughnessMaps,i,o,this._linearTexPacked),sheenColor:c(this.sheenColorMaps,r,a,this._srgbTexPacked),sheenRoughness:c(this.sheenRoughnessMaps,i,o,this._linearTexPacked),iridescence:c(this.iridescenceMaps,i,o,this._linearTexPacked),iridescenceThickness:c(this.iridescenceThicknessMaps,i,o,this._linearTexPacked),specularIntensity:c(this.specularIntensityMaps,i,o,this._linearTexPacked),specularColor:c(this.specularColorMaps,r,a,this._srgbTexPacked)}}}_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.triangleData,this.materials,this.triangleCount),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._disposeTextures(),this.triangles=[],this.triangleData=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.bvhData=null,this.instanceTable=null,this.lightBVHNodeData=null,this.lightBVHNodeCount=0,this.emissiveBitTrailMap=null,this.performanceMetrics={textureCreationTime:0,geometryExtractionTime:0,bvhBuildTime: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){Go.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 Go.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.bvhData,useFloat32Array:this.config.useFloat32Array,triangleDataSize:this.triangleData?(this.triangleData.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)}async refitBVH(e,t){if(!this.bvhData||!this.triangleData||!this.originalToBvhMap)throw Error(`No BVH data available for refit. Run buildBVH() first.`);let n=this.triangleCount*9;if(e?.length!==n)throw Error(`SceneProcessor.refitBVH: expected ${n} position floats (${this.triangleCount} triangles × 9), got ${e?.length??`none`}. Positions must cover every triangle in the scene, meshes in this.meshes order.`);if(t&&t.length!==n)throw Error(`SceneProcessor.refitBVH: expected ${n} normal floats, got ${t.length}.`);if(this._refitWorker||=new Wo,!this._refitSharedBuffers){let t=new SharedArrayBuffer(this.bvhData.byteLength),n=new SharedArrayBuffer(this.triangleData.byteLength),r=new SharedArrayBuffer(e.byteLength),i=new Float32Array(t),a=new Float32Array(n);i.set(this.bvhData),a.set(this.triangleData),this.bvhData=i,this.triangleData=a;let o=this.originalToBvhMap.length,s=new Uint32Array(o);for(let e=0;e<o;e++)s[this.originalToBvhMap[e]]=e;this._refitSharedBuffers={bvhBuf:t,triBuf:n,posBuf:r,posView:new Float32Array(r)},this._refitWorker.postMessage({type:`init`,sharedBvhBuf:t,sharedTriBuf:n,sharedPosBuf:r,bvhToOriginal:s},[s.buffer])}return this._refitSharedBuffers.posView.set(e),new Promise((e,n)=>{this._refitWorker.onmessage=r=>{let i=r.data;i.type===`refitComplete`?(t&&this._patchSmoothNormals(t),e({refitTimeMs:i.refitTimeMs})):i.type===`error`&&n(Error(i.error))},this._refitWorker.postMessage({type:`refit`})})}_patchSmoothNormals(e){this._patchNormalsRange(e,0,this.originalToBvhMap.length)}refitBLASes(e,t,n){if(!this.instanceTable||!this.bvhData||!this.triangleData)throw Error(`No TLAS/BLAS data available. Run buildBVH() first.`);let r=this.triangleCount*9;if(t?.length!==r)throw Error(`SceneProcessor.refitBLASes: expected ${r} position floats (${this.triangleCount} triangles × 9, full scene), got ${t?.length??`none`}.`);if(n&&n.length!==r)throw Error(`SceneProcessor.refitBLASes: expected ${r} normal floats, got ${n.length}.`);let i=performance.now();this._blasRefitter||=new Na;for(let r of e){let e=this.instanceTable.entries[r];e&&(this._updateMeshTrianglePositions(e,t),n&&this._patchMeshSmoothNormals(e,n),this._blasRefitter.refitRange(this.bvhData,this.triangleData,e.blasOffset,e.blasNodeCount),this.instanceTable.recomputeAABB(r,this.bvhData,this.triangleData))}return this._refitTLAS(),{refitTimeMs:performance.now()-i}}computeBLASDirtyRanges(e){let t=G.FLOATS_PER_TRIANGLE,n=[],r=[];for(let i of e){let e=this.instanceTable.entries[i];e&&(n.push({offset:e.triOffset*t,count:e.triCount*t}),r.push({offset:e.blasOffset*16,count:e.blasNodeCount*16}))}return r.push({offset:0,count:this.instanceTable.tlasNodeCount*16}),{triRanges:n,bvhRanges:r}}uploadToPathTracer(e,t,n,r){return this.triangleData?(e.setTriangleData(this.triangleData,this.triangleCount),this.bvhData?(e.setBVHData(this.bvhData),e.setInstanceTable(this.instanceTable),this.materialData?e.materialData.setMaterialData(this.materialData):Go.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.lightBVHNodeData&&e.setLightBVHData(this.lightBVHNodeData,this.lightBVHNodeCount),t.transferSceneLights(n),!0):(Go.error(`failed to get BVH data`),!1)):(Go.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.triangleData,this.materials,this.triangleCount))?null:this._collectEmissivePayload()}rebuildEmissiveForVisibility(e,t=!1){return!this.emissiveTriangleBuilder||!this.emissiveTriangleBuilder.setHiddenMeshes(e)&&!t?null:this._collectEmissivePayload()}_collectEmissivePayload(){return 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,{rawData:this.emissiveTriangleData,emissiveCount:this.emissiveTriangleCount,totalPower:this.emissiveTotalPower,bitTrailMap:this.emissiveBitTrailMap,lightBVHNodeData:this.lightBVHNodeData,lightBVHNodeCount:this.lightBVHNodeCount}}_updateMeshTrianglePositions(e,t){let n=G.FLOATS_PER_TRIANGLE,r=G.POSITION_A_OFFSET,i=G.POSITION_B_OFFSET,a=G.POSITION_C_OFFSET,o=G.NORMAL_A_OFFSET,s=G.NORMAL_B_OFFSET,c=G.NORMAL_C_OFFSET,l=e.bvhToOriginal;for(let u=0;u<e.triCount;u++){let d=l[u],f=(e.triOffset+u)*n,p=(e.triOffset+d)*9,m=t[p],h=t[p+1],g=t[p+2],_=t[p+3],v=t[p+4],y=t[p+5],b=t[p+6],x=t[p+7],S=t[p+8];this.triangleData[f+r]=m,this.triangleData[f+r+1]=h,this.triangleData[f+r+2]=g,this.triangleData[f+i]=_,this.triangleData[f+i+1]=v,this.triangleData[f+i+2]=y,this.triangleData[f+a]=b,this.triangleData[f+a+1]=x,this.triangleData[f+a+2]=S;let C=_-m,w=v-h,T=y-g,E=b-m,D=x-h,O=S-g,k=w*O-T*D,A=T*E-C*O,j=C*D-w*E;this.triangleData[f+o]=k,this.triangleData[f+o+1]=A,this.triangleData[f+o+2]=j,this.triangleData[f+s]=k,this.triangleData[f+s+1]=A,this.triangleData[f+s+2]=j,this.triangleData[f+c]=k,this.triangleData[f+c+1]=A,this.triangleData[f+c+2]=j}}_patchMeshSmoothNormals(e,t){this._patchNormalsRange(t,e.triOffset,e.triCount)}_patchNormalsRange(e,t,n){let r=G.FLOATS_PER_TRIANGLE,i=G.NORMAL_A_OFFSET,a=G.NORMAL_B_OFFSET,o=G.NORMAL_C_OFFSET;for(let s=0;s<n;s++){let n=t+s,c=this.originalToBvhMap[n]*r,l=n*9;this.triangleData[c+i]=e[l],this.triangleData[c+i+1]=e[l+1],this.triangleData[c+i+2]=e[l+2],this.triangleData[c+a]=e[l+3],this.triangleData[c+a+1]=e[l+4],this.triangleData[c+a+2]=e[l+5],this.triangleData[c+o]=e[l+6],this.triangleData[c+o+1]=e[l+7],this.triangleData[c+o+2]=e[l+8]}}_refitTLAS(){let e=this.instanceTable.tlasNodeCount;(!this._tlasBounds||this._tlasBounds.length<e*6)&&(this._tlasBounds=new Float32Array(e*6)),this._blasOffsetMap||=new Map,this._blasOffsetMap.clear();for(let e of this.instanceTable.entries)e&&this._blasOffsetMap.set(e.blasOffset,e);for(let t=e-1;t>=0;t--){let e=t*16,n=this.bvhData[e+3];if(n===-2){let n=this.bvhData[e],r=this._blasOffsetMap.get(n);if(r&&r.worldAABB){let e=t*6;this._tlasBounds[e]=r.worldAABB.minX,this._tlasBounds[e+1]=r.worldAABB.minY,this._tlasBounds[e+2]=r.worldAABB.minZ,this._tlasBounds[e+3]=r.worldAABB.maxX,this._tlasBounds[e+4]=r.worldAABB.maxY,this._tlasBounds[e+5]=r.worldAABB.maxZ}}else if(n>=0){let n=this.bvhData[e+3],r=this.bvhData[e+7],i=n*6,a=r*6,o=this._tlasBounds;this.bvhData[e]=o[i],this.bvhData[e+1]=o[i+1],this.bvhData[e+2]=o[i+2],this.bvhData[e+4]=o[i+3],this.bvhData[e+5]=o[i+4],this.bvhData[e+6]=o[i+5],this.bvhData[e+8]=o[a],this.bvhData[e+9]=o[a+1],this.bvhData[e+10]=o[a+2],this.bvhData[e+12]=o[a+3],this.bvhData[e+13]=o[a+4],this.bvhData[e+14]=o[a+5];let s=t*6;o[s]=Math.min(o[i],o[a]),o[s+1]=Math.min(o[i+1],o[a+1]),o[s+2]=Math.min(o[i+2],o[a+2]),o[s+3]=Math.max(o[i+3],o[a+3]),o[s+4]=Math.max(o[i+4],o[a+4]),o[s+5]=Math.max(o[i+5],o[a+5])}}}scheduleBackgroundRebuild(e,t){if(!this.instanceTable||!this.triangleData)return;let n=G.FLOATS_PER_TRIANGLE;this._rebuildGeneration++;let r=this._rebuildGeneration,i=(e,i,a)=>{let o=this.triangleData.slice(i.triOffset*n,(i.triOffset+i.triCount)*n);this._pendingRebuilds.set(e,a),a.onmessage=n=>{let o=n.data;if(a.terminate(),this._pendingRebuilds.delete(e),o.error){Go.error(`background BLAS rebuild failed (mesh ${e}):`,o.error);return}r===this._rebuildGeneration&&this._swapBLAS(e,i,o,t)},a.onerror=t=>{Go.error(`background BLAS rebuild worker failed (mesh ${e}):`,t),a.terminate(),this._pendingRebuilds.delete(e)};let s=i.triCount>500;a.postMessage({triangleData:o.buffer,triangleByteOffset:o.byteOffset,triangleByteLength:o.byteLength,triangleCount:i.triCount,depth:this.config.bvhDepth,reportProgress:!1,sharedReorderBuffer:null,treeletOptimization:{enabled:s,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}},[o.buffer])};for(let t of e){let e=this.instanceTable.entries[t];if(!e)continue;let n=this._pendingRebuilds.get(t);n&&n.terminate(),i(t,e,new Ia)}}_swapBLAS(e,t,n,r){let i=n.bvhData,a=i.length/16;if(a!==t.blasNodeCount){Go.warn(`background rebuild node count mismatch for mesh ${e} (${a} vs ${t.blasNodeCount}), skipping swap`);return}let o=t.blasOffset*16;this.bvhData.set(i,o),this._offsetBLASInPlace(o,a,t.blasOffset,t.triOffset);let s=G.FLOATS_PER_TRIANGLE,c=n.triangles;c&&this.triangleData.set(c,t.triOffset*s);let l=n.originalToBvh;if(l){for(let e=0;e<t.triCount;e++)this.originalToBvhMap[t.triOffset+e]=t.triOffset+l[e];let e=new Uint32Array(t.triCount);for(let n=0;n<t.triCount;n++)e[l[n]]=n;t.bvhToOriginal=e}this.instanceTable.recomputeAABB(e,this.bvhData,this.triangleData),this._refitTLAS(),this._log(`Background BLAS rebuild complete for mesh ${e}`),r?.()}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()}dispose(){this._log(`Disposing resources`),this._disposeRefitWorker(),this._disposeTextures(),this._reset(),this.textureCreator&&=(this.textureCreator.dispose(),null),this.geometryExtractor=null,this.bvhBuilder=null,this.tlasBuilder=null,this._blasRefitter=null}},qo=[[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]],Jo=[[-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]],Yo=[[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 Xo(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=qo[i],o=Jo[i],s=Yo[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 Zo=1/(4*Math.PI);function Qo(e){let t=e.userData||{},n=Number.isFinite(t.exposure)?t.exposure:0,r=e.intensity*2**n,i=e.color.r,a=e.color.g,o=e.color.b;if(t.useTemperature){let[e,n,r]=Xo(t.temperature??6500);i*=e,a*=n,o*=r}return{r:i,g:a,b:o,intensity:r}}var $o=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=Qo(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=Qo(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=Qo(e);this.pointLightCache.push({data:[t.x,t.y,t.z,i.r,i.g,i.b,i.intensity*Zo,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=Qo(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*Zo,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}))}}},es={stbnScalarAtlas:`https://assets.rayzee.atulmourya.com/noise/stbn_scalar_atlas.png`,stbnVec2Atlas:`https://assets.rayzee.atulmourya.com/noise/stbn_vec2_atlas.png`,ortRuntimeUrl:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/ort.webgpu.bundle.min.mjs`,ortWasmPaths:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/`,dracoDecoderPath:`https://www.gstatic.com/draco/v1/decoders/`,ktx2TranscoderPath:`https://cdn.jsdelivr.net/npm/three@0.183.2/examples/jsm/libs/basis/`,oidnWeightsBaseUrl:`https://cdn.jsdelivr.net/npm/denoiser/tzas/`,upscalerModelBaseUrl:`https://huggingface.co/notaneimu/onnx-image-models/resolve/main/`,cacheNamespace:`rayzee`};function ts(e){e&&Object.assign(es,e)}function ns(){return{...es}}var rs=xt(`pathtracer`),is=4,as=class extends _e{constructor(e,t,n,i={}){super(`PathTracer`,{...i,executionMode:ge.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 Ko,this.lightSerializer=new $o,this.accumulationEnabled=!0,this.isComplete=!1,this.cameras=[],this.performanceMonitor=Ne(),this.completionThreshold=0,this.renderLimitMode=`frames`,this._initDataTextures(),this.storageTextures=new Ot(0,0),this.uniforms=new At(a,o),this._defineUniformGetters(),this.materialData=new Rt(this.sdfs),this.materialData.callbacks.onReset=()=>this.reset(),this.materialData.callbacks.getTriangleData=()=>({array:this.triangleStorageAttr?.array,count:this.triangleCount}),this.materialData.callbacks.onTriangleDataChanged=()=>{this.triangleStorageAttr&&(this.triangleStorageAttr.needsUpdate=!0)},this.environment=new vn(this.scene,this.uniforms),this.environment.callbacks.onReset=()=>this.reset(),this.environment.callbacks.getSceneTextureNodes=()=>this.shaderBuilder.getSceneTextureNodes(),this.shaderBuilder=new va,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.lastRenderMode=-1,this.renderModeChangeTimeout=null,this.renderModeChangeDelay=50,this.pendingRenderMode=null,this.lastInteractionModeState=!1,this.cameraChanged=!1,this.updateCompletionThreshold()}_initDataTextures(){this.triangleStorageAttr=null,this.triangleStorageNode=null,this.triangleCount=0,this.bvhStorageAttr=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._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 ve(this.renderer,{uniforms:{maxBounceCount:{get value(){return e.maxBounces.value},set value(t){e.maxBounces.value=t}},enableAccumulation:{get value(){return e.enableAccumulation.value},set value(t){e.enableAccumulation.value=t}},enableEmissiveTriangleSampling:{get value(){return e.enableEmissiveTriangleSampling.value},set value(t){e.enableEmissiveTriangleSampling.value=t}},cameraIsMoving:{get value(){return e.cameraIsMoving.value},set value(t){e.cameraIsMoving.value=t}}}},{enabled:U.interactionModeEnabled,qualitySettings:{maxBounceCount:1,enableAccumulation:!1,enableEmissiveTriangleSampling:!1},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}=ns(),a=e.loadAsync(n).then(e=>{this.stbnScalarTexture=t(e),P.value=e,rs.debug(`STBN scalar atlas ${J.px(e.image.width,e.image.height)}`)}),o=e.loadAsync(i).then(e=>{this.stbnVec2Texture=t(e),F.value=e,rs.debug(`STBN vec2 atlas ${J.px(e.image.width,e.image.height)}`)});this.blueNoiseReady=Promise.allSettled([a,o]).then(e=>{for(let t of e)t.status===`rejected`&&rs.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.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:{}};if(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.hasSun.value){let t=this.environment.envParams.skySunIntensity*950,n={intensity:t,color:{r:1,g:1,b:1},userData:{angle:this.sunAngularSize.value},updateMatrixWorld:()=>{},getWorldPosition:e=>{let t=this.sunDirection.value;return e.set(t.x,t.y,t.z).multiplyScalar(1e10)}};this.lightSerializer.addDirectionalLight(n),this.lightSerializer.preprocessLights(),this.lightSerializer.updateShaderUniforms(e),this.directionalLightsData=e.uniforms.directionalLights.value,rs.debug(`sun added as directional light · intensity ${t.toFixed(2)}`)}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.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}setTriangleData(e,r){if(!e)return;let i=e.length/4;this.triangleStorageNode?(this.triangleStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.triangleStorageNode.value=this.triangleStorageAttr,this.triangleStorageNode.bufferCount=i):(this.triangleStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.triangleStorageNode=(0,n.storage)(this.triangleStorageAttr,`vec4`,i).toReadOnly()),this.triangleCount=r,rs.debug(`${J.n(this.triangleCount)} triangles (storage buffer)`)}setBVHData(e){if(!e)return;let r=e.length/4;this.bvhStorageNode?(this.bvhStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.bvhStorageNode.value=this.bvhStorageAttr,this.bvhStorageNode.bufferCount=r):(this.bvhStorageAttr=new t.StorageInstancedBufferAttribute(e,4),this.bvhStorageNode=(0,n.storage)(this.bvhStorageAttr,`vec4`,r).toReadOnly()),this.bvhNodeCount=Math.floor(r/is),rs.debug(`${J.n(this.bvhNodeCount)} BVH nodes (storage buffer)`)}setInstanceTable(e){this._instanceTable=e}setMeshVisibilityData(e){if(!(!e||e.length===0||!this._instanceTable)){for(let t=0;t<e.length;t++)this._patchTLASLeafVisibility(t,this._isWorldVisible(e[t]));this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}}updateMeshVisibility(e,t){this._patchTLASLeafVisibility(e,t)&&this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}updateAllMeshVisibility(){if(!(!this._meshRefs||!this._instanceTable)){for(let e=0;e<this._meshRefs.length;e++)this._patchTLASLeafVisibility(e,this._isWorldVisible(this._meshRefs[e]));this.bvhStorageAttr&&(this.bvhStorageAttr.needsUpdate=!0)}}_patchTLASLeafVisibility(e,t){let n=this._instanceTable?.entries?.[e];return!n||n.tlasLeafIndex<0||!this.bvhStorageAttr?!1:(n.visible=t,this.bvhStorageAttr.array[n.tlasLeafIndex*16+2]=+!!t,!0)}_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.needsUpdate=!0)}updateTriangleData(e){this._updateStorageBuffer(this.triangleStorageAttr,e)}updateBVHData(e){this._updateStorageBuffer(this.bvhStorageAttr,e)}updateBufferRanges(e,t){if(this.triangleStorageAttr&&e.length>0){this.triangleStorageAttr.clearUpdateRanges();for(let t of e)this.triangleStorageAttr.addUpdateRange(t.offset,t.count);this.triangleStorageAttr.version++}if(this.bvhStorageAttr&&t.length>0){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){rs.error(`triangle data required`);return}if(!this.bvhStorageNode){rs.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=Me(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=je(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&&(P.value=e)}_rebuildLightBuffer(){let e=this._lbvhDataCache,n=this._emissiveDataCache,r=this._bitTrailMapCache,i=e?e.length:0,a=n?n.length:0,o=r?Math.ceil(r.length/4)*4:0,s=Math.max(i+a+o,4);if(this.lightStorageAttr&&s<=this.lightStorageAttr.array.length){let t=this.lightStorageAttr.array;e&&t.set(e,0),n&&t.set(n,i),r&&t.set(r,i+a),this.lightStorageAttr.needsUpdate=!0}else{let o=new Float32Array(s);e&&o.set(e,0),n&&o.set(n,i),r&&o.set(r,i+a),this.lightStorageAttr=new t.StorageInstancedBufferAttribute(o,4),this.lightStorageNode.value=this.lightStorageAttr,this.lightStorageNode.bufferCount=o.length/4,this._lightBufferRealloc=!0}this.emissiveVec4Offset.value=(this.lightBVHNodeCount.value||0)*4,this.reverseMapVec4Offset.value=(i+a)/4}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(),rs.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(),rs.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{rs.debug(`material rebuild started`),await this.sdfs.rebuildMaterials(e),this.updateSceneUniforms(),this.shaderBuilder.updateSceneTextures(this),this.updateLights(),this.reset(),rs.debug(`material rebuild complete`)}catch(e){rs.error(`material rebuild failed:`,e);try{rs.warn(`attempting recovery by resetting the path tracer`),this.reset()}catch(e){rs.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.triangleStorageAttr=null,this.triangleStorageNode=null,this.bvhStorageAttr=null,this.bvhStorageNode=null,this.placeholderTexture=null,this.isReady=!1}},os=xt(`gpu`),ss={ORIGIN_META:0,DIR_FLAGS:1,THROUGHPUT_PDF:2,RADIANCE_ALPHA:3,MEDIUM_STACK:4,MEDIUM_SIGMA_A:5,SSS_SIGMA_S:6},cs={DIST_TRI_BARY:0,NORMAL_MAT:1},ls=0,us=(e,t)=>t===0?e:e.add(t*ls);function ds(e,t){t&&e?._attributes?.delete?.(t)}var fs=class{constructor(e=0,t=null){this.capacity=0,this._renderer=t,this._attrs={},this.rayBuffer=null,this.rngBuffer=null,this.hitBuffer=null,e>0&&this.allocate(e)}allocate(e){this.dispose(),this.capacity=e,ls=e;let r=e*7,i=new t.StorageInstancedBufferAttribute(new Float32Array(r*4),4);this._attrs.ray=i,this.rayBuffer={rw:(0,n.storage)(i,`vec4`),ro:(0,n.storage)(i,`vec4`).toReadOnly()};let a=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);this._attrs.rng=a,this.rngBuffer={rw:(0,n.storage)(a,`uint`),ro:(0,n.storage)(a,`uint`).toReadOnly()};let o=e*2,s=new t.StorageInstancedBufferAttribute(new Float32Array(o*4),4);this._attrs.hit=s,this.hitBuffer={rw:(0,n.storage)(s,`vec4`),ro:(0,n.storage)(s,`vec4`).toReadOnly()},this.rayBytes=r*16+e*4,this.hitBytes=o*16,this.totalBytes=this.rayBytes+this.hitBytes,os.debug(`ray pool capacity ${J.n(e)} · ${J.mb(this.totalBytes)} (rays ${J.mb(this.rayBytes)} · hits ${J.mb(this.hitBytes)})`)}resize(e){return e<=this.capacity&&this.capacity>0?!1:(this.allocate(e),!0)}dispose(){ds(this._renderer,this._attrs.ray),ds(this._renderer,this._attrs.rng),ds(this._renderer,this._attrs.hit),this._attrs={},this.rayBuffer=null,this.rngBuffer=null,this.hitBuffer=null,this.capacity=0}},ps=(e,t)=>e.element(us(t,ss.ORIGIN_META)).xyz,ms=(e,t)=>e.element(us(t,ss.DIR_FLAGS)).xyz,hs=(e,t)=>(0,n.floatBitsToUint)(e.element(us(t,ss.DIR_FLAGS)).w),gs=(e,t)=>e.element(us(t,ss.THROUGHPUT_PDF)).xyz,_s=(e,t)=>e.element(us(t,ss.THROUGHPUT_PDF)).w,vs=(e,t)=>e.element(us(t,ss.RADIANCE_ALPHA)),ys=e=>(0,n.uint)(e).mul(1),bs=(e,t,r,i,a,o=null)=>{let s=ys(t),c=o===null?(0,n.unpackUnorm2x16)(e.element(s).w).y:(0,n.float)(o);return e.element(s).assign((0,n.uvec4)((0,n.packSnorm2x16)((0,n.vec2)(r.x,r.y)),(0,n.packSnorm2x16)((0,n.vec2)(r.z,i)),(0,n.packUnorm2x16)((0,n.vec2)(a.x,a.y)),(0,n.packUnorm2x16)((0,n.vec2)(a.z,c))))},xs=(e,t,r)=>{let i=ys(t),a=e.element(i).toVar();return e.element(i).assign((0,n.uvec4)(a.x,a.y,a.z,(0,n.packUnorm2x16)((0,n.vec2)((0,n.unpackUnorm2x16)(a.w).x,r))))},Ss=(e,t)=>e.element(ys(t)),Cs=e=>(0,n.unpackUnorm2x16)(e.w).y,ws=e=>{let t=(0,n.unpackSnorm2x16)(e.x),r=(0,n.unpackSnorm2x16)(e.y);return(0,n.vec4)((0,n.vec3)(t.x,t.y,r.x).mul(.5).add(.5),r.y)},Ts=e=>(0,n.vec3)((0,n.unpackUnorm2x16)(e.z),(0,n.unpackUnorm2x16)(e.w).x),Es=e=>{let t=(0,n.clamp)((0,n.floor)((0,n.log2)((0,n.max)(e,1e-6))),-8,7),r=(0,n.clamp)((0,n.float)(e).mul((0,n.exp2)(t.negate())).sub(1).mul(64),0,63);return(0,n.select)((0,n.float)(e).lessThan(.004),(0,n.uint)(0),(0,n.uint)(t.add(8)).shiftLeft(6).bitOr((0,n.uint)(r)))},Ds=(e,t)=>{let r=(0,n.floatBitsToUint)(e.element(us(t,ss.ORIGIN_META)).w).shiftRight(22),i=(0,n.float)(r.shiftRight(6).bitAnd((0,n.uint)(15))).sub(8),a=(0,n.float)(r.bitAnd((0,n.uint)(63))).div(64).add(1);return(0,n.select)(r.equal((0,n.uint)(0)),(0,n.float)(0),a.mul((0,n.exp2)(i)))},Os=(e,t,r,i,a,o=(0,n.uint)(0),s=null)=>{let c=(0,n.uint)(i).bitAnd((0,n.uint)(255)).bitOr((0,n.uint)(a).bitAnd((0,n.uint)(255)).shiftLeft(8)).bitOr((0,n.uint)(o).bitAnd((0,n.uint)(63)).shiftLeft(16));return s!==null&&(c=c.bitOr(Es(s).shiftLeft(22))),e.element(us(t,ss.ORIGIN_META)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(c)))},ks=(e,t,r,i)=>e.element(us(t,ss.DIR_FLAGS)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(i))),As=(e,t,r,i)=>e.element(us(t,ss.THROUGHPUT_PDF)).assign((0,n.vec4)(r,i)),js=(e,t,n)=>e.element(us(t,ss.RADIANCE_ALPHA)).assign(n),Ms=(e,t)=>e.element(us(t,cs.DIST_TRI_BARY)).x,Ns=(e,t)=>(0,n.floatBitsToUint)(e.element(us(t,cs.DIST_TRI_BARY)).y),Ps=(e,t)=>e.element(us(t,cs.DIST_TRI_BARY)).zw,Fs=(e,t)=>e.element(us(t,cs.NORMAL_MAT)).xyz,Is=(e,t)=>(0,n.uint)((0,n.floatBitsToUint)(e.element(us(t,cs.NORMAL_MAT)).w).bitAnd(65535)),Ls=(e,t,r,i,a,o,s,c,l)=>{e.element(us(t,cs.DIST_TRI_BARY)).assign((0,n.vec4)(r,(0,n.uintBitsToFloat)(i),a,o)),e.element(us(t,cs.NORMAL_MAT)).assign((0,n.vec4)(s,(0,n.uintBitsToFloat)(c.bitOr(l.shiftLeft(16)))))},Rs=(e,t)=>{let r=e.element(us(t,ss.MEDIUM_STACK)),i=(0,n.floatBitsToUint)(r.x);return{stackDepth:i.bitAnd(255),transTraversals:i.shiftRight(8).bitAnd(255),wavelength:i.shiftRight(16).bitAnd(65535),ior1:r.y,ior2:r.z,ior3:r.w}},zs=(e,t,r,i,a,o,s,c=(0,n.uint)(0))=>e.element(us(t,ss.MEDIUM_STACK)).assign((0,n.vec4)((0,n.uintBitsToFloat)(r.bitOr(i.shiftLeft(8)).bitOr(c.shiftLeft(16))),a,o,s)),Bs=(e,t)=>e.element(us(t,ss.MEDIUM_SIGMA_A)).xyz,Vs=(e,t,r)=>{let i=e.element(us(t,ss.MEDIUM_SIGMA_A)).w.toVar();e.element(us(t,ss.MEDIUM_SIGMA_A)).assign((0,n.vec4)(r,i))},Hs=e=>{let t=(0,n.clamp)(e,(0,n.vec3)(0),(0,n.vec3)(1)).mul(1023).add(.5);return(0,n.uint)(t.x).bitOr((0,n.uint)(t.y).shiftLeft(10)).bitOr((0,n.uint)(t.z).shiftLeft(20))},Us=e=>(0,n.vec3)((0,n.float)(e.bitAnd((0,n.uint)(1023))),(0,n.float)(e.shiftRight(10).bitAnd((0,n.uint)(1023))),(0,n.float)(e.shiftRight(20).bitAnd((0,n.uint)(1023)))).div(1023),Ws=(e,t)=>Us((0,n.floatBitsToUint)(e.element(us(t,ss.MEDIUM_SIGMA_A)).w)),Gs=(e,t,r)=>{let i=e.element(us(t,ss.MEDIUM_SIGMA_A)).xyz.toVar();e.element(us(t,ss.MEDIUM_SIGMA_A)).assign((0,n.vec4)(i,(0,n.uintBitsToFloat)(Hs(r))))},Ks=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(us(t,ss.ORIGIN_META)).w).bitAnd(255)),qs=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(us(t,ss.ORIGIN_META)).w).shiftRight(8).bitAnd(255)),Js=(e,t)=>(0,n.int)((0,n.floatBitsToUint)(e.element(us(t,ss.ORIGIN_META)).w).shiftRight(16).bitAnd((0,n.uint)(63))),Ys=(e,t)=>{let n=e.element(us(t,ss.SSS_SIGMA_S));return{sigmaS:n.xyz,g:n.w}},Xs=(e,t,r,i)=>e.element(us(t,ss.SSS_SIGMA_S)).assign((0,n.vec4)(r,i)),Zs=xt(`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},Qs=65535,$s={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},ec=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=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1),i=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);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=new t.StorageInstancedBufferAttribute(new Uint32Array(e),1);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,Zs.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(){ds(this._renderer,this._countersAttr),ds(this._renderer,this._bounceCountsAttr),ds(this._renderer,this._attrA),ds(this._renderer,this._attrB),ds(this._renderer,this._sortAttr),ds(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}},tc={[r.RGBAFormat]:4,[r.RGBFormat]:3,[r.RGFormat]:2,[r.RedFormat]:1},nc={[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 rc(e){return(tc[e.format]??4)*(nc[e.type]??4)}function ic(e){return e?.array?.byteLength||0}function ac(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*rc(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*rc(e)}var oc=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.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: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*rc(e));return a}return this._isResident(e)?ac(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(` `)}]`}},sc=xt(`wavefront`),cc=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);sc.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=>sc.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()}},lc=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=(0,n.vec3)(0).toVar();return(0,n.If)(i.equal((0,n.int)(1)),()=>{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)))))}).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}),uc=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h])=>{let g=(0,n.vec3)(r[3]).toVar(),_=lc(e,r,i,a,o,s,c).toVar(),v=g.toVar(),y=_.toVar();return(0,n.If)(l.and(u.greaterThan(0)).and(d.lessThan(64)).and(f.greaterThan(.001)),()=>{let e=u.div(d).mul(.001).mul(p).mul(m),i=re(t),o=i.x.mul(h.max(.01)),s=i.y,c=(0,n.vec3)(0).toVar();(0,n.If)(a.equal((0,n.int)(1)),()=>{c.assign(Zn({N:_}).mul((0,n.vec3)(o,s,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(o).add(t.mul(s)))}),v.assign(g.add(c.mul(e))),y.assign((0,n.normalize)(g.add(_.mul(f)).sub(v)))}),yn({origin:v,direction:y})});function dc(e){let{rayBufferRW:t,rngBufferRW: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,sceneScale:_,apertureScale:v,anamorphicRatio:y,renderWidth:b,chunkRowBase:x,chunkRows:S,transmissiveBounces:C,transparentBackground:w,auxGBufferEnabled:T,listDriven:E=!1,activeIndicesRO:D=null,counters:O=null}=e,k=T.greaterThan((0,n.uint)(0)),A=(e,b,x)=>{let S=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(b).add(.5)),w=L({state:he({pixelCoord:S,rayIndex:(0,n.int)(0),frame:o}).toVar()}).toVar(),T=me(S,(0,n.int)(1),(0,n.int)(1),w,a,o).toVar().sub(.5),E=(0,n.vec2)(S.x.add(T.x),S.y.sub(T.y)).div(a),D=yn.wrap(uc(E,w,s,c,l,u,d,f,p,m,h,g,_,v,y));Os(t,x,D.origin,(0,n.int)(0),(0,n.int)(0)),ks(t,x,D.direction,(0,n.uint)($s.ACTIVE)),As(t,x,(0,n.vec4)(1,1,1,0).xyz,(0,n.float)(0)),js(t,x,(0,n.vec4)((0,n.vec3)(0),(0,n.float)(1))),(0,n.If)(k,()=>{bs(i,x,(0,n.vec3)(0,0,1),(0,n.float)(1),(0,n.vec3)(0),(0,n.float)(0)),Gs(t,x,(0,n.vec3)(1))}),zs(t,x,(0,n.uint)(0),(0,n.uint)(C),(0,n.float)(1),(0,n.float)(1),(0,n.float)(1)),r.element(x).assign(w)};return(0,n.Fn)(()=>{if(E){let e=n.instanceIndex;(0,n.If)(e.lessThan((0,n.atomicLoad)(O.element((0,n.uint)($.ENTERING_COUNT)))),()=>{let t=(0,n.int)(D.element(e)),r=t.add(x.mul(b));A(r.mod(b),r.div(b),(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(b).and(t.lessThan(S)),()=>{A(e,t.add(x),(0,n.uint)(t.mul(b).add(e)))})}})}var fc=32,pc=512,mc=4,hc=8,gc=1e8,_c=()=>(0,n.array)(`int`,fc).toVar(),vc=(0,n.wgslFn)(`
|
|
472
472
|
fn RayTriangleGeometry( rayOrigin: vec3f, rayDir: vec3f, pA: vec3f, pB: vec3f, pC: vec3f, closestHitDst: f32, woopParams: vec4f ) -> vec4f {
|
|
473
473
|
|
|
474
474
|
// Returns vec4(t, u, v, hit) where hit > 0.5 means intersection.
|
|
@@ -534,7 +534,7 @@
|
|
|
534
534
|
return result;
|
|
535
535
|
|
|
536
536
|
}
|
|
537
|
-
`),
|
|
537
|
+
`),yc=(0,n.wgslFn)(`
|
|
538
538
|
fn computeWoopRayParams( rayDir: vec3f ) -> vec4f {
|
|
539
539
|
|
|
540
540
|
let absDir = abs( rayDir );
|
|
@@ -563,7 +563,7 @@
|
|
|
563
563
|
return vec4f( Sx, Sy, Sz, f32( packed ) );
|
|
564
564
|
|
|
565
565
|
}
|
|
566
|
-
`),
|
|
566
|
+
`),bc=(0,n.wgslFn)(`
|
|
567
567
|
fn fastRayAABBDst( rayOrigin: vec3f, invDir: vec3f, boxMin: vec3f, boxMax: vec3f ) -> f32 {
|
|
568
568
|
|
|
569
569
|
let t1 = ( boxMin - rayOrigin ) * invDir;
|
|
@@ -579,7 +579,7 @@
|
|
|
579
579
|
return select( 1e20f, max( tNear, 0.0f ), isHit );
|
|
580
580
|
|
|
581
581
|
}
|
|
582
|
-
`),
|
|
582
|
+
`),xc=e=>(0,n.Fn)(([t,r,i,a])=>{let o=a??(0,n.bool)(!1),s=wn({didHit:!1,dst:(0,n.float)(0x56bc75e2d63100000),hitPoint:(0,n.vec3)(0),normal:(0,n.vec3)(0),uv:(0,n.vec2)(0),materialIndex:(0,n.int)(-1),meshIndex:(0,n.int)(-1),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}).toVar(),c=(0,n.int)(-1).toVar(),l=(0,n.float)(0).toVar(),u=(0,n.float)(0).toVar(),d=_c(),f=(0,n.int)(1).toVar();d.element((0,n.int)(0)).assign((0,n.int)(0));let p=(0,n.mix)((0,n.vec3)(1),(0,n.sign)(t.direction),(0,n.notEqual)(t.direction,(0,n.vec3)(0))),m=(0,n.mix)((0,n.vec3)(1).div(t.direction),(0,n.vec3)(gc).mul(p),(0,n.lessThan)((0,n.abs)(t.direction),(0,n.vec3)(1e-8))).toVar(),h=t.origin,g=t.direction,_=yc({rayDir:g}).toVar(),v=(0,n.int)(0).toVar();return(0,n.Loop)(f.greaterThan((0,n.int)(0)).and(v.lessThan((0,n.int)(pc))),()=>{v.addAssign(1),f.subAssign(1);let t=d.element(f).toVar(),a=Z(r,t,(0,n.int)(0),(0,n.int)(mc));e&&s.boxTests.addAssign(1),(0,n.If)(a.w.lessThan(0),()=>{(0,n.If)(a.w.greaterThan((0,n.float)(-1.5)),()=>{let t=(0,n.int)(a.x).toVar(),r=(0,n.int)(a.y).toVar();(0,n.Loop)({start:(0,n.int)(0),end:r},({i:r})=>{e&&s.triTests.addAssign(1);let a=t.add(r).toVar(),d=Z(i,a,(0,n.int)(0),(0,n.int)(hc)).xyz,f=Z(i,a,(0,n.int)(1),(0,n.int)(hc)).xyz,p=Z(i,a,(0,n.int)(2),(0,n.int)(hc)).xyz,m=vc({rayOrigin:h,rayDir:g,pA:d,pB:f,pC:p,closestHitDst:s.dst,woopParams:_});(0,n.If)(m.w.greaterThan(.5),()=>{let e=m.x,t=m.y,r=m.z,d=Z(i,a,(0,n.int)(3),(0,n.int)(hc)).xyz,f=Z(i,a,(0,n.int)(4),(0,n.int)(hc)).xyz,p=Z(i,a,(0,n.int)(5),(0,n.int)(hc)),h=p.xyz,_=(0,n.int)(p.w).toVar(),v=(0,n.float)(1).sub(t).sub(r),y=g.dot((0,n.normalize)(d.mul(v).add(f.mul(t)).add(h.mul(r))));(0,n.If)(o.or(_.equal((0,n.int)(2))).or(_.equal((0,n.int)(0)).and(y.lessThan(-1e-4))).or(_.equal((0,n.int)(1)).and(y.greaterThan(1e-4))),()=>{s.didHit.assign(!0),s.dst.assign(e),c.assign(a),l.assign(t),u.assign(r)})})}),(0,n.If)(s.didHit.and(s.dst.lessThan(.001)),()=>{(0,n.Break)()})}).Else(()=>{(0,n.If)(a.z.greaterThan(.5).and(f.lessThan((0,n.int)(fc))),()=>{d.element(f).assign((0,n.int)(a.x)),f.addAssign(1)})})}).Else(()=>{let e=Z(r,t,(0,n.int)(1),(0,n.int)(mc)),i=Z(r,t,(0,n.int)(2),(0,n.int)(mc)),o=Z(r,t,(0,n.int)(3),(0,n.int)(mc)),c=(0,n.int)(a.w).toVar(),l=(0,n.int)(e.w).toVar(),u=bc({rayOrigin:h,invDir:m,boxMin:a.xyz,boxMax:e.xyz}).toVar(),p=bc({rayOrigin:h,invDir:m,boxMin:i.xyz,boxMax:o.xyz}).toVar();(0,n.If)((0,n.min)(u,p).lessThan(s.dst),()=>{let e=u.lessThan(p);(0,n.If)((0,n.select)(e,p,u).lessThan(s.dst).and(f.lessThan((0,n.int)(fc))),()=>{d.element(f).assign((0,n.select)(e,l,c)),f.addAssign(1)}),(0,n.If)(f.lessThan((0,n.int)(fc)),()=>{d.element(f).assign((0,n.select)(e,c,l)),f.addAssign(1)})})})}),(0,n.If)(s.didHit,()=>{s.hitPoint.assign(t.origin.add(t.direction.mul(s.dst)));let e=(0,n.float)(1).sub(l).sub(u),r=Z(i,c,(0,n.int)(3),(0,n.int)(hc)).xyz,a=Z(i,c,(0,n.int)(4),(0,n.int)(hc)).xyz,o=Z(i,c,(0,n.int)(5),(0,n.int)(hc)).xyz;s.normal.assign((0,n.normalize)(r.mul(e).add(a.mul(l)).add(o.mul(u))));let d=Z(i,c,(0,n.int)(6),(0,n.int)(hc)),f=Z(i,c,(0,n.int)(7),(0,n.int)(hc));s.uv.assign(d.xy.mul(e).add(d.zw.mul(l)).add(f.xy.mul(u))),s.materialIndex.assign((0,n.int)(f.z)),s.meshIndex.assign((0,n.int)(f.w)),s.triangleIndex.assign(c)}),s}),Sc=xc(!1),Cc=xc(!0),wc=(0,n.Fn)(([e,t,r,i])=>{let a=wn({didHit:!1,dst:i,hitPoint:(0,n.vec3)(0),normal:(0,n.vec3)(0),uv:(0,n.vec2)(0),materialIndex:(0,n.int)(-1),meshIndex:(0,n.int)(-1),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}).toVar(),o=_c(),s=(0,n.int)(1).toVar();o.element((0,n.int)(0)).assign((0,n.int)(0));let c=(0,n.mix)((0,n.vec3)(1),(0,n.sign)(e.direction),(0,n.notEqual)(e.direction,(0,n.vec3)(0))),l=(0,n.mix)((0,n.vec3)(1).div(e.direction),(0,n.vec3)(gc).mul(c),(0,n.lessThan)((0,n.abs)(e.direction),(0,n.vec3)(1e-8))).toVar(),u=yc({rayDir:e.direction}).toVar(),d=(0,n.int)(0).toVar();return(0,n.Loop)(s.greaterThan((0,n.int)(0)).and(a.didHit.not()).and(d.lessThan((0,n.int)(pc))),()=>{d.addAssign(1),s.subAssign(1);let i=o.element(s).toVar(),c=Z(t,i,(0,n.int)(0),(0,n.int)(mc));(0,n.If)(c.w.lessThan(0),()=>{(0,n.If)(c.w.greaterThan((0,n.float)(-1.5)),()=>{let t=(0,n.int)(c.x).toVar(),i=(0,n.int)(c.y).toVar();(0,n.Loop)({start:(0,n.int)(0),end:i},({i})=>{let o=t.add(i).toVar(),s=Z(r,o,(0,n.int)(0),(0,n.int)(hc)).xyz,c=Z(r,o,(0,n.int)(1),(0,n.int)(hc)).xyz,l=Z(r,o,(0,n.int)(2),(0,n.int)(hc)).xyz,d=vc({rayOrigin:e.origin,rayDir:e.direction,pA:s,pB:c,pC:l,closestHitDst:a.dst,woopParams:u});(0,n.If)(d.w.greaterThan(.5),()=>{let t=Z(r,o,(0,n.int)(7),(0,n.int)(hc));a.didHit.assign(!0),a.dst.assign(d.x),a.materialIndex.assign((0,n.int)(t.z)),a.meshIndex.assign((0,n.int)(t.w)),a.hitPoint.assign(e.origin.add(e.direction.mul(d.x))),a.uv.assign((0,n.vec2)(d.y,d.z)),a.triangleIndex.assign(o),(0,n.Break)()})})}).Else(()=>{(0,n.If)(c.z.greaterThan(.5).and(s.lessThan((0,n.int)(fc))),()=>{o.element(s).assign((0,n.int)(c.x)),s.addAssign(1)})})}).Else(()=>{let r=Z(t,i,(0,n.int)(1),(0,n.int)(mc)),u=Z(t,i,(0,n.int)(2),(0,n.int)(mc)),d=Z(t,i,(0,n.int)(3),(0,n.int)(mc)),f=(0,n.int)(c.w).toVar(),p=(0,n.int)(r.w).toVar(),m=bc({rayOrigin:e.origin,invDir:l,boxMin:c.xyz,boxMax:r.xyz}).toVar(),h=bc({rayOrigin:e.origin,invDir:l,boxMin:u.xyz,boxMax:d.xyz}).toVar();(0,n.If)((0,n.min)(m,h).lessThan(a.dst),()=>{let e=m.lessThan(h);(0,n.If)((0,n.select)(e,h,m).lessThan(a.dst).and(s.lessThan((0,n.int)(fc))),()=>{o.element(s).assign((0,n.select)(e,p,f)),s.addAssign(1)}),(0,n.If)(s.lessThan((0,n.int)(fc)),()=>{o.element(s).assign((0,n.select)(e,f,p)),s.addAssign(1)})})})}),a});function Tc(e){let{bvhBuffer:t,triangleBuffer:r,rayBufferRO:i,hitBufferRW:a,activeIndicesRO:o,counters:s,maxRayCount:c}=e;return(0,n.Fn)(()=>{let e=n.instanceIndex,l=s?(0,n.atomicLoad)(s.element((0,n.uint)($.ENTERING_COUNT))):c;(0,n.If)(e.greaterThanEqual(l),()=>{(0,n.Return)()});let u=o.element(e);(0,n.If)(hs(i,u).bitAnd((0,n.uint)($s.ACTIVE)).equal((0,n.uint)(0)),()=>{(0,n.Return)()});let d=yn({origin:ps(i,u).toVar(),direction:ms(i,u).toVar()}),f=Rs(i,u).stackDepth.greaterThan((0,n.uint)(0)),p=wn.wrap(Sc(d,t,r,f)).toVar();Ls(a,u,p.dst,(0,n.uint)(p.triangleIndex),p.uv.x,p.uv.y,p.normal,(0,n.uint)(p.materialIndex),(0,n.uint)(p.meshIndex))})}var Ec=(0,n.wgslFn)(`
|
|
583
583
|
fn equirectDirectionToUv( direction: vec3f, environmentMatrix: mat4x4f ) -> vec2f {
|
|
584
584
|
let d = normalize( ( environmentMatrix * vec4f( direction, 0.0f ) ).xyz );
|
|
585
585
|
var uv = vec2f( atan2( d.z, d.x ), acos( d.y ) );
|
|
@@ -588,7 +588,7 @@
|
|
|
588
588
|
uv.y = 1.0f - uv.y;
|
|
589
589
|
return uv;
|
|
590
590
|
}
|
|
591
|
-
`),
|
|
591
|
+
`),Dc=(0,n.wgslFn)(`
|
|
592
592
|
fn equirectUvToDirection( uv: vec2f, environmentMatrix: mat4x4f ) -> vec3f {
|
|
593
593
|
let adjustedUv = vec2f( uv.x - 0.5f, 1.0f - uv.y );
|
|
594
594
|
let theta = adjustedUv.x * 6.28318530717958647692f;
|
|
@@ -597,7 +597,7 @@
|
|
|
597
597
|
let localDir = vec3f( sinPhi * cos( theta ), cos( phi ), sinPhi * sin( theta ) );
|
|
598
598
|
return normalize( ( transpose( environmentMatrix ) * vec4f( localDir, 0.0f ) ).xyz );
|
|
599
599
|
}
|
|
600
|
-
`),
|
|
600
|
+
`),Oc=(0,n.Fn)(([e,t,r,i,a,o])=>{let s=(0,n.vec4)(0).toVar();return(0,n.If)(i.equal(0),()=>{s.assign((0,n.vec4)(0))}).Else(()=>{let c=Ec({direction:t,environmentMatrix:r}).toVar(),l=(0,n.texture)(e,c,0).rgb.toVar(),u=(0,n.sin)(c.y.mul(Math.PI)).toVar(),d=(0,n.dot)(l,Vn).mul(u),f=(0,n.max)((0,n.float)(0),d.sub(a)).div(i),p=u.greaterThan(0).select((0,n.float)(1).div((0,n.float)(2*Math.PI*Math.PI).mul(u)),(0,n.float)(0)),m=(0,n.float)(o.x).mul((0,n.float)(o.y)).mul(f).mul(p);s.assign((0,n.vec4)(l,m))}),s}),kc=(0,n.Fn)(([e,t,r,i,a,o,s,c,l])=>{let u=(0,n.int)(s.x).toVar(),d=s.y,f=(0,n.clamp)(c.x.mul(d.sub(1)),0,d.sub(1)),p=(0,n.int)((0,n.floor)(f)),m=(0,n.min)(p.add(1),(0,n.int)(d).sub(1)),h=(0,n.fract)(f),g=(0,n.mix)(t.load((0,n.ivec2)(u,p)).x,t.load((0,n.ivec2)(u,m)).x,h).toVar(),_=s.x,v=s.y,y=(0,n.clamp)(c.y.mul(_.sub(1)),0,_.sub(1)),b=(0,n.clamp)(g.mul(v.sub(1)),0,v.sub(1)),x=(0,n.int)((0,n.floor)(y)),S=(0,n.int)((0,n.floor)(b)),C=(0,n.min)(x.add(1),(0,n.int)(_).sub(1)),w=(0,n.min)(S.add(1),(0,n.int)(v).sub(1)),T=(0,n.fract)(y),E=(0,n.fract)(b),D=t.load((0,n.ivec2)(x,S)).x,O=t.load((0,n.ivec2)(C,S)).x,k=t.load((0,n.ivec2)(x,w)).x,A=t.load((0,n.ivec2)(C,w)).x,j=(0,n.vec2)((0,n.mix)((0,n.mix)(D,O,T),(0,n.mix)(k,A,T),E).toVar(),g).toVar(),M=Dc({uv:j,environmentMatrix:r}).toVar(),N=(0,n.texture)(e,j,0).rgb.mul(i).toVar();l.assign(N);let P=(0,n.sin)(j.y.mul(Math.PI)).toVar(),F=(0,n.dot)(N.div(i),Vn).mul(P),I=(0,n.max)((0,n.float)(0),F.sub(o)).div(a),ee=P.greaterThan(0).select((0,n.float)(1).div((0,n.float)(2*Math.PI*Math.PI).mul(P)),(0,n.float)(0));return(0,n.vec4)(M,(0,n.float)(s.x).mul((0,n.float)(s.y)).mul(I).mul(ee))}),Ac=(0,n.wgslFn)(`
|
|
601
601
|
fn sampleEnvironment(
|
|
602
602
|
tex: texture_2d<f32>,
|
|
603
603
|
samp: sampler,
|
|
@@ -611,7 +611,7 @@
|
|
|
611
611
|
let texSample = textureSampleLevel( tex, samp, uv, 0.0 );
|
|
612
612
|
return texSample * environmentIntensity;
|
|
613
613
|
}
|
|
614
|
-
`,[qs]),Qs=(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}),$s=(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(Qs(r,t,i,a))}),s}),ec=(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(An))}).Else(()=>{let i=(0,n.clamp)((0,n.mix)(sr(e.ior).mul(e.specularColor),e.color.rgb,e.metalness).mul(e.specularIntensity),(0,n.vec3)(0),(0,n.vec3)(1)).toVar(),a=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)(a.r,a.g),a.b),i=(0,n.min)((0,n.min)(a.r,a.g),a.b);(0,n.If)(r.greaterThan(i),()=>{let e=a.sub(i).div(r.sub(i));a.assign((0,n.mix)(a,e,t.mul(.3)))})}),(0,n.If)(e.iridescence.greaterThan(0),()=>{let r=e.iridescenceThicknessRange.y,a=Dr((0,n.float)(1),e.iridescenceIOR,t.VoH,r,i);i.assign((0,n.mix)(i,a,e.iridescence))});let o=rr(t.VoH,i),s=(0,n.vec3)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let n=xr(e.roughness,e.anisotropy),r=Sr(n.x,n.y,t.NoH,t.ToH,t.BoH),i=Cr(n.x,n.y,t.ToV,t.BoV,t.ToL,t.BoL,t.NoV,t.NoL);s.assign(o.mul(r.mul(i)))}).Else(()=>{let n=cr(t.NoH,e.roughness),r=pr(t.NoV,t.NoL,e.roughness);s.assign(n.mul(r).mul(o))});let c=wn.wrap(yr(i,t.NoV,e.roughness)),l=s.mul(c.compensation),u=(0,n.vec3)(1).sub(c.E_total).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).mul(a).mul(An).add(l).toVar();(0,n.If)(e.sheen.greaterThan(0),()=>{let i=lr(t.NoH,e.sheenRoughness),a=dr(t.NoV,t.NoL),o=e.sheenColor.mul(e.sheen).mul(i).mul(a),s=vr(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(u.mul(l).add(o))}).Else(()=>{r.assign(u)}),(0,n.If)(e.clearcoat.greaterThan(0),()=>{let i=(0,n.max)(e.clearcoatRoughness,Pn),a=(0,n.vec3)(.04),o=wn.wrap(yr(a,t.NoV,i)),s=cr(t.NoH,i),c=pr(t.NoV,t.NoL,i),l=nr(t.VoH,(0,n.float)(.04)),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}),tc=(0,n.Fn)(([e,t,n,r])=>ec(r,Cn.wrap(Gn(n,e,t,r)))),nc=2*kn,rc=.9999,ic=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(t.lessThan((0,n.float)(kn).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}),ac=(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(An).mul(t)}),oc=(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)(nc).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=ca(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(ac(e).mul(ic(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))})}),Ui({valid:a,direction:o,emission:s,distance:c,pdf:l,lightType:u,selectionTotalWeight:(0,n.float)(0)})}),sc=(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 r=Zi({coneCosine:p,penumbraCosine:(0,n.cos)(e.angle.mul((0,n.float)(1).sub(e.penumbra))).max(p.add(1e-5)).toVar(),angleCosine:f}),i=Xi({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay}),a=ea(e,l),s=ia(e,l);o.assign(e.color.mul(e.intensity).mul(i).mul(r).mul(a).mul(s))})}),Ui({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),cc=(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=Xi({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))}),Ui({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),lc=(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(ta(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)(nc).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)(nc).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))}),Ui({valid:o,direction:s,emission:c,distance:(0,n.float)(1e6),pdf:l,lightType:(0,n.int)(0),selectionTotalWeight:(0,n.float)(0)})}),uc=(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)(ae+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=Fi(zi.wrap(Gi(d,e)),t,r,a).toVar();T.addAssign(i),(0,n.If)(i.greaterThan(0).and(ge(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=Bi.wrap(Ki(p,i)),u=(0,n.select)(a.intensity.greaterThan(0),Ii(a,e,t,r),(0,n.float)(0)).toVar();T.addAssign(u),(0,n.If)(u.greaterThan(0).and(ge(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=Li(Vi.wrap(qi(h,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(ge(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=Ri(Hi.wrap(Ji(_,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(ge(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=zi.wrap(Gi(d,t.sub(T)));(0,n.If)(f.intensity.greaterThan(0),()=>{let t=Ui.wrap(lc(f,e,r,i.y,ge(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=Bi.wrap(Ki(p,t.sub(T)));(0,n.If)(d.intensity.greaterThan(0),()=>{let t=(0,n.vec2)(i.y,ge(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),f=Ui.wrap(oc(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=Vi.wrap(qi(h,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Ui.wrap(cc(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=Hi.wrap(Ji(_,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Ui.wrap(sc(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=zi.wrap(Gi(d,M)),a=Ui.wrap(lc(r,e,t,i.y,ge(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=Bi.wrap(Ki(p,M)),a=(0,n.vec2)(i.y,ge(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),d=Ui.wrap(oc(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=Vi.wrap(qi(h,M)),r=Ui.wrap(cc(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=Hi.wrap(Ji(_,M)),r=Ui.wrap(sc(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)})})}),Ui({valid:y,direction:b,emission:x,distance:S,pdf:C,lightType:w,selectionTotalWeight:T})}),dc=(0,n.Fn)(([e,t])=>(0,n.max)(jr(e,t),1e-8)),fc=(0,n.Fn)(([e,t,n,r])=>dc(r,Cn.wrap(Gn(n,e,t,r)))),pc=(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])=>{let F=(0,n.vec3)(0).toVar(),I=(0,n.vec3)(0).toVar(),L=e.add(r.mul(.001)).toVar(),ee=(0,n.Fn)(([e,t,n])=>Ni(e,t,n,Gs,C,w,T)),te=g.add(v).add(b).add(S).toVar(),ne=te.greaterThan((0,n.int)(0)).toVar(),re=(0,n.float)(0).toVar();return(0,n.If)(ne,()=>{let o=he(d,(0,n.int)(0),m.add((0,n.int)(2)),u,f,p).toVar(),s=Ui.wrap(uc(e,t,i,o,l,u,d,f,p,m,h,g,_,v,y,b,x,S));re.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(Yi({direction:s.direction,surfaceNormal:r})),()=>{let r=e.add(s.direction.mul(s.distance)).sub(L).toVar(),c=(0,n.length)(r).toVar(),l=ee(L,r.div(c),c.mul(rc));(0,n.If)(l.greaterThan(0).or(P),()=>{let e=Cn.wrap(Gn(t,a,s.direction,i)),r=ec(i,e),c=dc(i,e).toVar(),u=(0,n.float)(1).toVar();(0,n.If)(c.greaterThan(0).and(s.lightType.equal((0,n.int)(1))),()=>{u.assign(Vn({pdf1:s.pdf,pdf2:c}))});let d=s.emission.mul(r).mul(o).mul(u).div((0,n.max)(s.pdf,1e-10));F.addAssign(d.mul(l)),(0,n.If)(P,()=>{I.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(Yi({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=Bi.wrap(Ki(_,t));(0,n.If)(i.intensity.greaterThan(0),()=>{let a=oa(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=Bi.wrap(Ki(_,l)),d=e.add(o.mul(r)).sub(L).toVar(),f=(0,n.length)(d).toVar(),p=ee(L,d.div(f),f.mul(rc));(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=sa(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),Mn)),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=Ii(u,e,t,i),h=(0,n.select)(re.greaterThan(0),m.div((0,n.max)(re,1e-10)),(0,n.float)(1).div((0,n.max)((0,n.float)(te),1))),g=Vn({pdf1:s,pdf2:f.mul(h).toVar()}).toVar(),_=ac(u).mul(ic(l,u.spread)).mul(c).mul(a).mul(g).div((0,n.max)(s,1e-10));F.addAssign(_.mul(p)),(0,n.If)(P,()=>{I.addAssign(_)})})})})})}),(0,n.If)(N,()=>{let e=he(d,(0,n.int)(0),m.add((0,n.int)(1)),u,f,p).toVar(),o=(0,n.vec3)(0).toVar(),s=Xs(E,k,O,D,A,j,M,e,o).toVar(),c=s.xyz.toVar(),l=s.w.toVar();(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(Yi({direction:c,surfaceNormal:r})),()=>{let r=ee(L,c,(0,n.float)(0x56bc75e2d63100000));(0,n.If)(r.greaterThan(0).or(P),()=>{let s=Cn.wrap(Gn(t,a,c,i)),u=ec(i,s),d=dc(i,s).toVar(),f=(0,n.select)(d.greaterThan(0),Hn({pdf1:l,pdf2:d}),(0,n.float)(1)).toVar(),p=o.mul(u).mul(e).mul(f).div((0,n.max)(l,1e-10));F.addAssign(p.mul(r)),(0,n.If)(P,()=>{I.addAssign(p)})})})})}),vn({shadowed:F,unoccluded:I})}),mc=(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=he(l,(0,n.int)(0),f.add((0,n.int)(8)),c,u,d);p.assign(Pr(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,Fn).toVar();p.assign(r),h.assign(l),m.assign((0,n.select)(o,t.color.xyz.mul(s),a.mul(c).div(l)))}),Wi({direction:p,throughput:m,combinedPdf:h})}),hc=(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(Or(r,d,h))}).Else(()=>{let e=On({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(Or(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(Nr({N:t,xi:i}))}).ElseIf(S.lessThan(T),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let a=Sn.wrap(Wn(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=xr(r.roughness,r.anisotropy),u=Ir({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=Un({N:t}),o=Fr({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(Mr({N:t,roughness:ur(r.sheenRoughness),Xi:i})),g.assign((0,n.reflect)(e.negate(),C))}).ElseIf(S.lessThan(D),()=>{let a=(0,n.clamp)(r.clearcoatRoughness,Pn,1),o=Un({N:t});C.assign(o.mul(Fr({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=qr.wrap($r(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),Fn)),b.assign(d.colorWeight),y.assign(!0)}),(0,n.If)(y.not(),()=>{let n=Cn.wrap(Gn(t,e,g,r));_.assign(ec(r,n)),v.assign(kr(r,x,n))}),v.assign((0,n.max)(v,Fn)),bn({direction:g,value:_,pdf:v,isTransmission:y,colorWeight:b})}),gc=(0,n.wgslFn)(`
|
|
614
|
+
`,[Ec]),jc=(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}),Mc=(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(jc(r,t,i,a))}),s}),Nc=(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(Fn))}).Else(()=>{let i=(0,n.clamp)((0,n.mix)(hr(e.ior).mul(e.specularColor),e.color.rgb,e.metalness).mul(e.specularIntensity),(0,n.vec3)(0),(0,n.vec3)(1)).toVar(),a=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)(a.r,a.g),a.b),i=(0,n.min)((0,n.min)(a.r,a.g),a.b);(0,n.If)(r.greaterThan(i),()=>{let e=a.sub(i).div(r.sub(i));a.assign((0,n.mix)(a,e,t.mul(.3)))})}),(0,n.If)(e.iridescence.greaterThan(0),()=>{let r=e.iridescenceThicknessRange.y,a=Fr((0,n.float)(1),e.iridescenceIOR,t.VoH,r,i);i.assign((0,n.mix)(i,a,e.iridescence))});let o=dr(t.VoH,i),s=(0,n.vec3)(0).toVar();(0,n.If)(e.anisotropy.greaterThan(0),()=>{let n=kr(e.roughness,e.anisotropy),r=Ar(n.x,n.y,t.NoH,t.ToH,t.BoH),i=jr(n.x,n.y,t.ToV,t.BoV,t.ToL,t.BoL,t.NoV,t.NoL);s.assign(o.mul(r.mul(i)))}).Else(()=>{let n=gr(t.NoH,e.roughness),r=xr(t.NoV,t.NoL,e.roughness);s.assign(n.mul(r).mul(o))});let c=kn.wrap(Dr(i,t.NoV,e.roughness)),l=s.mul(c.compensation),u=(0,n.vec3)(1).sub(c.E_total).mul((0,n.float)(1).sub(e.metalness)).mul((0,n.float)(1).sub(e.transmission)).mul(a).mul(Fn).add(l).toVar();(0,n.If)(e.sheen.greaterThan(0),()=>{let i=_r(t.NoH,e.sheenRoughness),a=yr(t.NoV,t.NoL),o=e.sheenColor.mul(e.sheen).mul(i).mul(a),s=Er(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(u.mul(l).add(o))}).Else(()=>{r.assign(u)}),(0,n.If)(e.clearcoat.greaterThan(0),()=>{let i=(0,n.max)(e.clearcoatRoughness,zn),a=(0,n.vec3)(.04),o=kn.wrap(Dr(a,t.NoV,i)),s=gr(t.NoH,i),c=xr(t.NoV,t.NoL,i),l=ur(t.VoH,(0,n.float)(.04)),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}),Pc=(0,n.Fn)(([e,t,n,r])=>Nc(r,On.wrap($n(n,e,t,r)))),Fc=2*Pn,Ic=.9999,Lc=(0,n.Fn)(([e,t])=>{let r=(0,n.float)(1).toVar();return(0,n.If)(t.lessThan((0,n.float)(Pn).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}),Rc=(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(Fn).mul(t)}),zc=(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)(Fc).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=ga(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(Rc(e).mul(Lc(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))})}),Zi({valid:a,direction:o,emission:s,distance:c,pdf:l,lightType:u,selectionTotalWeight:(0,n.float)(0)})}),Bc=(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 r=aa({coneCosine:p,penumbraCosine:(0,n.cos)(e.angle.mul((0,n.float)(1).sub(e.penumbra))).max(p.add(1e-5)).toVar(),angleCosine:f}),i=ia({lightDistance:t,cutoffDistance:e.distance,decayExponent:e.decay}),a=ca(e,l),s=fa(e,l);o.assign(e.color.mul(e.intensity).mul(i).mul(r).mul(a).mul(s))})}),Zi({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),Vc=(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=ia({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))}),Zi({valid:i,direction:a,emission:o,distance:s,pdf:c,lightType:l,selectionTotalWeight:(0,n.float)(0)})}),Hc=(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(la(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)(Fc).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)(Fc).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))}),Zi({valid:o,direction:s,emission:c,distance:(0,n.float)(1e6),pdf:l,lightType:(0,n.int)(0),selectionTotalWeight:(0,n.float)(0)})}),Uc=(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)(z+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=Ui(qi.wrap($i(d,e)),t,r,a).toVar();T.addAssign(i),(0,n.If)(i.greaterThan(0).and(B(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=Ji.wrap(ea(p,i)),u=(0,n.select)(a.intensity.greaterThan(0),Wi(a,e,t,r),(0,n.float)(0)).toVar();T.addAssign(u),(0,n.If)(u.greaterThan(0).and(B(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=Gi(Yi.wrap(ta(h,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(B(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=Ki(Xi.wrap(na(_,i)),e,t,r).toVar();T.addAssign(a),(0,n.If)(a.greaterThan(0).and(B(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=qi.wrap($i(d,t.sub(T)));(0,n.If)(f.intensity.greaterThan(0),()=>{let t=Zi.wrap(Hc(f,e,r,i.y,B(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=Ji.wrap(ea(p,t.sub(T)));(0,n.If)(d.intensity.greaterThan(0),()=>{let t=(0,n.vec2)(i.y,B(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),f=Zi.wrap(zc(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=Yi.wrap(ta(h,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Zi.wrap(Vc(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=Xi.wrap(na(_,t.sub(T)));(0,n.If)(i.intensity.greaterThan(0),()=>{let t=Zi.wrap(Bc(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=qi.wrap($i(d,M)),a=Zi.wrap(Hc(r,e,t,i.y,B(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=Ji.wrap(ea(p,M)),a=(0,n.vec2)(i.y,B(s,(0,n.int)(0),u.add((0,n.int)(15)),o,c,l)).toVar(),d=Zi.wrap(zc(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=Yi.wrap(ta(h,M)),r=Zi.wrap(Vc(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=Xi.wrap(na(_,M)),r=Zi.wrap(Bc(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)})})}),Zi({valid:y,direction:b,emission:x,distance:S,pdf:C,lightType:w,selectionTotalWeight:T})}),Wc=(0,n.Fn)(([e,t])=>(0,n.max)(zr(e,t),1e-8)),Gc=(0,n.Fn)(([e,t,n,r])=>Wc(r,On.wrap($n(n,e,t,r)))),Kc=(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])=>{let F=(0,n.vec3)(0).toVar(),I=(0,n.vec3)(0).toVar(),ee=e.add(r.mul(.001)).toVar(),L=(0,n.Fn)(([e,t,n])=>Vi(e,t,n,wc,C,w,T)),te=g.add(v).add(b).add(S).toVar(),R=te.greaterThan((0,n.int)(0)).toVar(),ne=(0,n.float)(0).toVar();return(0,n.If)(R,()=>{let o=pe(d,(0,n.int)(0),m.add((0,n.int)(2)),u,f,p).toVar(),s=Zi.wrap(Uc(e,t,i,o,l,u,d,f,p,m,h,g,_,v,y,b,x,S));ne.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(ra({direction:s.direction,surfaceNormal:r})),()=>{let r=e.add(s.direction.mul(s.distance)).sub(ee).toVar(),c=(0,n.length)(r).toVar(),l=L(ee,r.div(c),c.mul(Ic));(0,n.If)(l.greaterThan(0).or(P),()=>{let e=On.wrap($n(t,a,s.direction,i)),r=Nc(i,e),c=Wc(i,e).toVar(),u=(0,n.float)(1).toVar();(0,n.If)(c.greaterThan(0).and(s.lightType.equal((0,n.int)(1))),()=>{u.assign(Yn({pdf1:s.pdf,pdf2:c}))});let d=s.emission.mul(r).mul(o).mul(u).div((0,n.max)(s.pdf,1e-10));F.addAssign(d.mul(l)),(0,n.If)(P,()=>{I.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(ra({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=Ji.wrap(ea(_,t));(0,n.If)(i.intensity.greaterThan(0),()=>{let a=ma(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=Ji.wrap(ea(_,l)),d=e.add(o.mul(r)).sub(ee).toVar(),f=(0,n.length)(d).toVar(),p=L(ee,d.div(f),f.mul(Ic));(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=ha(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),Ln)),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=Wi(u,e,t,i),h=(0,n.select)(ne.greaterThan(0),m.div((0,n.max)(ne,1e-10)),(0,n.float)(1).div((0,n.max)((0,n.float)(te),1))),g=Yn({pdf1:s,pdf2:f.mul(h).toVar()}).toVar(),_=Rc(u).mul(Lc(l,u.spread)).mul(c).mul(a).mul(g).div((0,n.max)(s,1e-10));F.addAssign(_.mul(p)),(0,n.If)(P,()=>{I.addAssign(_)})})})})})}),(0,n.If)(N,()=>{let e=pe(d,(0,n.int)(0),m.add((0,n.int)(1)),u,f,p).toVar(),o=(0,n.vec3)(0).toVar(),s=kc(E,k,O,D,A,j,M,e,o).toVar(),c=s.xyz.toVar(),l=s.w.toVar();(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(ra({direction:c,surfaceNormal:r})),()=>{let r=L(ee,c,(0,n.float)(0x56bc75e2d63100000));(0,n.If)(r.greaterThan(0).or(P),()=>{let s=On.wrap($n(t,a,c,i)),u=Nc(i,s),d=Wc(i,s).toVar(),f=(0,n.select)(d.greaterThan(0),Xn({pdf1:l,pdf2:d}),(0,n.float)(1)).toVar(),p=o.mul(u).mul(e).mul(f).div((0,n.max)(l,1e-10));F.addAssign(p.mul(r)),(0,n.If)(P,()=>{I.addAssign(p)})})})})}),Cn({shadowed:F,unoccluded:I})}),qc=(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=pe(l,(0,n.int)(0),f.add((0,n.int)(8)),c,u,d);p.assign(Hr(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,Bn).toVar();p.assign(r),h.assign(l),m.assign((0,n.select)(o,t.color.xyz.mul(s),a.mul(c).div(l)))}),Qi({direction:p,throughput:m,combinedPdf:h})}),Jc=(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(Ir(r,d,h))}).Else(()=>{let e=Nn({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(Ir(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(Vr({N:t,xi:i}))}).ElseIf(S.lessThan(T),()=>{(0,n.If)(r.anisotropy.greaterThan(0),()=>{let a=Dn.wrap(Qn(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=kr(r.roughness,r.anisotropy),u=Wr({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=Zn({N:t}),o=Ur({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(Br({N:t,roughness:vr(r.sheenRoughness),Xi:i})),g.assign((0,n.reflect)(e.negate(),C))}).ElseIf(S.lessThan(D),()=>{let a=(0,n.clamp)(r.clearcoatRoughness,zn,1),o=Zn({N:t});C.assign(o.mul(Ur({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=ti.wrap(si(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),Bn)),b.assign(d.colorWeight),y.assign(!0)}),(0,n.If)(y.not(),()=>{let n=On.wrap($n(t,e,g,r));_.assign(Nc(r,n)),v.assign(Lr(r,x,n))}),v.assign((0,n.max)(v,Bn)),Tn({direction:g,value:_,pdf:v,isTransmission:y,colorWeight:b})}),Yc=(0,n.wgslFn)(`
|
|
615
615
|
fn regularizePathContribution( contribution: vec3f, pathLength: f32, fireflyThreshold: f32, frame: i32 ) -> vec3f {
|
|
616
616
|
// Indirect-only clamp: pathLength 0 is a direct/primary contribution (bounce-0 hit, direct NEE,
|
|
617
617
|
// or a directly-viewed backdrop/sun) — that is signal, not a firefly, and clamping it darkens
|
|
@@ -622,34 +622,34 @@
|
|
|
622
622
|
let threshold = calculateFireflyThreshold( fireflyThreshold, i32( pathLength ), frame );
|
|
623
623
|
return applySoftSuppressionRGB( contribution, threshold, 0.5f );
|
|
624
624
|
}
|
|
625
|
-
`,[
|
|
625
|
+
`,[er,nr]),Xc=(0,n.wgslFn)(`
|
|
626
626
|
fn computeNDCDepth( worldPos: vec3f, cameraProjectionMatrix: mat4x4f, cameraViewMatrix: mat4x4f ) -> f32 {
|
|
627
627
|
let clipPos = cameraProjectionMatrix * cameraViewMatrix * vec4f( worldPos, 1.0f );
|
|
628
628
|
let ndcDepth = clipPos.z / clipPos.w * 0.5f + 0.5f;
|
|
629
629
|
return clamp( ndcDepth, 0.0f, 1.0f );
|
|
630
630
|
}
|
|
631
|
-
`),vc=(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=ge(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=ge(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}),yc=C({brdf:`vec3`,L:`vec3`,pdf:`float`}),bc=(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,Pn),p=(0,n.max)(r.roughness,Pn),m=xn.wrap(Ar(r)).toVar(),h=m.clearcoat.toVar(),g=m.specular.toVar(),_=ge(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=Un({N:u});y.assign(e.mul(Fr({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=Sn.wrap(Wn(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=xr(r.roughness,r.anisotropy),o=Ir({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=Un({N:u});y.assign(e.mul(Fr({V:e.transpose().mul(d),roughness:p,Xi:i})))}),v.assign((0,n.reflect)(d.negate(),y))}).Else(()=>{v.assign(Nr({N:u,xi:i})),y.assign((0,n.normalize)(d.add(v)))});let b=Cn.wrap(Gn(u,d,v,r)),x=(0,n.max)(kr(r,m,b),.001);return yc({brdf:ec(r,b),L:v,pdf:x})}),xc=32,Sc=16,Cc=5,wc=8,Tc=C({hitPoint:`vec3`,uv:`vec2`,normal:`vec3`,height:`float`}),Ec=(0,n.Fn)(([e,t,r,i,a])=>{let o=t.hitPoint.toVar(),s=t.uv.toVar(),c=t.normal.toVar(),l=(0,n.float)(0).toVar(),u=t.triangleIndex,d=Y(r,u,(0,n.int)(0),(0,n.int)(wc)).xyz.toVar(),f=Y(r,u,(0,n.int)(1),(0,n.int)(wc)).xyz,p=Y(r,u,(0,n.int)(2),(0,n.int)(wc)).xyz,m=Y(r,u,(0,n.int)(6),(0,n.int)(wc)).toVar(),h=Y(r,u,(0,n.int)(7),(0,n.int)(wc)),g=m.xy.toVar(),_=m.zw,v=h.xy,y=f.sub(d).toVar(),b=p.sub(d).toVar(),x=_.sub(g).toVar(),S=v.sub(g).toVar(),C=x.x.mul(S.y).sub(S.x.mul(x.y)).toVar();return(0,n.If)((0,n.abs)(C).greaterThan(1e-8),()=>{let r=(0,n.float)(1).div(C),u=y.mul(S.y).sub(b.mul(x.y)).mul(r).toVar(),d=b.mul(x.x).sub(y.mul(S.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)(u,u),v=(0,n.dot)(u,d),w=(0,n.dot)(d,d),T=_.mul(w).sub(v.mul(v)).toVar();(0,n.If)((0,n.abs)(T).greaterThan(1e-10),()=>{let e=(0,n.float)(1).div(T),r=(0,n.dot)(g,u),y=(0,n.dot)(g,d),b=(0,n.vec2)(w.mul(r).sub(v.mul(y)).mul(e),_.mul(y).sub(v.mul(r)).mul(e)).toVar(),x=h.toVar(),S=(0,n.max)((0,n.abs)(x),.001),C=p.div(S).toVar(),E=(0,n.int)(a.equal((0,n.int)(0)).select((0,n.int)(xc),(0,n.int)(Sc))).toVar(),D=C.negate().toVar(),O=C.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(b.mul(r)),o=r.mul(x),s=Oi(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)(Cc),type:`int`,condition:`<`},()=>{let a=e.add(r).mul(.5).toVar(),o=t.uv.add(b.mul(a)),s=a.mul(x),c=Oi(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(b.mul(a)).toVar(),g=t.hitPoint.add(m.mul(a)),_=Oi(i.displacementMapIndex,h,i.displacementTransform),v=_.sub(.5).mul(p),y=ci(li(),i.displacementMapIndex).toVar(),S=_,C=Oi(i.displacementMapIndex,h.add((0,n.vec2)(y.x,0)),i.displacementTransform),w=Oi(i.displacementMapIndex,h.add((0,n.vec2)(0,y.y)),i.displacementTransform),T=(0,n.normalize)(u).toVar(),E=(0,n.normalize)(d).toVar(),D=C.sub(S).mul(p),O=w.sub(S).mul(p),j=(0,n.normalize)(f.sub(T.mul(D)).sub(E.mul(O)));o.assign(g),s.assign(h),c.assign(j),l.assign(v)})})}),Tc({hitPoint:o,uv:s,normal:c,height:l})}),Dc=C({position:`vec3`,normal:`vec3`,emission:`vec3`,direction:`vec3`,distance:`float`,pdf:`float`,area:`float`,cosThetaLight:`float`,valid:`bool`}),Oc=C({contribution:`vec3`,hasEmissive:`bool`,emissionOnly:`vec3`,distance:`float`}),kc=(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))}),Ac=(0,n.Fn)(([e,t,r])=>(0,n.length)((0,n.cross)(t.sub(e),r.sub(e))).mul(.5)),jc=(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))}),Mc=(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}),Nc=C({direction:`vec3`,position:`vec3`,solidAngle:`float`,valid:`bool`}),Pc=(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))}),Fc=(0,n.Fn)(([e,t,r,i,a])=>{let o=Nc({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=jc(e,t,r,i);return o.solidAngle.assign(u),(0,n.If)(u.greaterThan(1e-7),()=>{let d=(0,n.clamp)((0,n.dot)(Pc((0,n.cross)(s,c)),Pc((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=Pc(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=Pc(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}),Ic=(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)}),Lc=(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 Rc=8,zc=2,Bc=C({v0:`vec3`,v1:`vec3`,v2:`vec3`,n0:`vec3`,n1:`vec3`,n2:`vec3`,materialIndex:`int`}),Vc=(0,n.Fn)(([e,t])=>{let r=Y(t,e,(0,n.int)(0),(0,n.int)(Rc)),i=Y(t,e,(0,n.int)(1),(0,n.int)(Rc)),a=Y(t,e,(0,n.int)(2),(0,n.int)(Rc)),o=Y(t,e,(0,n.int)(3),(0,n.int)(Rc)),s=Y(t,e,(0,n.int)(4),(0,n.int)(Rc)),c=Y(t,e,(0,n.int)(5),(0,n.int)(Rc)),l=Y(t,e,(0,n.int)(7),(0,n.int)(Rc));return Bc({v0:r.xyz,v1:i.xyz,v2:a.xyz,n0:o.xyz,n1:s.xyz,n2:c.xyz,materialIndex:(0,n.int)(l.z)})}),Hc=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=Bc.wrap(Vc(e,a)),l=Ac(c.v0,c.v1,c.v2),u=Y(o,c.materialIndex,(0,n.int)(Ln.EMISSIVE_ROUGHNESS),q),d=Y(o,c.materialIndex,(0,n.int)(Ln.IOR_TRANSMISSION),q),f=(0,n.max)(u.x.mul(.2126).add(u.y.mul(.7152)).add(u.z.mul(.0722)).mul(d.a).mul(l),(0,n.float)(1e-10)).div((0,n.max)(s,(0,n.float)(1e-10))),p=(0,n.float)(0).toVar();return(0,n.If)(Mc(c.v0,c.v1,c.v2,i),()=>{let e=jc(c.v0,c.v1,c.v2,i);p.assign(f.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(c.v1.sub(c.v0),c.v2.sub(c.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),.001),a=t.mul(t),o=f.div(l);p.assign(o.mul(a).div(i))}),(0,n.max)(p,Fn)}),Uc=(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)(zc)))).b;(0,n.If)(s.lessThan(i),()=>{a.assign(r.add(1))}).Else(()=>{o.assign(r)})}),a}),Wc=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=Dc({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 m=Uc(c,l,u,ge(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o)).toVar(),h=l.add(m.mul((0,n.int)(zc))),g=c.element(h),_=c.element(h.add(1)),v=(0,n.int)(g.r),y=(0,n.max)(g.g,(0,n.float)(1e-10)),b=_.xyz,x=_.w,S=Bc.wrap(Vc(v,f)),C=he(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),w=(0,n.normalize)((0,n.cross)(S.v1.sub(S.v0),S.v2.sub(S.v0)));(0,n.If)(Mc(S.v0,S.v1,S.v2,e),()=>{let r=Nc.wrap(Fc(S.v0,S.v1,S.v2,e,C));(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,w.negate());(0,n.If)(o.greaterThan(0).and(s.greaterThan(0)),()=>{let t=Ic(a,S.v0,S.v1,S.v2),o=(0,n.normalize)(S.n0.mul(t.x).add(S.n1.mul(t.y)).add(S.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=y.div((0,n.max)(d,(0,n.float)(1e-10))).div(r.solidAngle);p.position.assign(a),p.normal.assign(o),p.emission.assign(b),p.direction.assign(i),p.distance.assign(c),p.pdf.assign((0,n.max)(l,Fn)),p.area.assign(x),p.cosThetaLight.assign(s),p.valid.assign(!0)})})}).Else(()=>{let r=kc(S.v0,S.v1,S.v2,C),i=Lc(S.n0,S.n1,S.n2,C),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=y.div((0,n.max)(d,(0,n.float)(1e-10)).mul(x)).mul(o).div(u);p.position.assign(r),p.normal.assign(i),p.emission.assign(b),p.direction.assign(c),p.distance.assign(s),p.pdf.assign((0,n.max)(e,Fn)),p.area.assign(x),p.cosThetaLight.assign(u),p.valid.assign(!0)})})}),p}),Gc=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y])=>{let b=Oc({contribution:(0,n.vec3)(0),hasEmissive:!1,emissionOnly:(0,n.vec3)(0),distance:(0,n.float)(0)}).toVar(),x=Dc.wrap(Wc(e,t,s,c,l,u,d,p,m,h,g,_));return(0,n.If)(x.valid.and(x.pdf.greaterThan(0)),()=>{b.hasEmissive.assign(!0),b.emissionOnly.assign(x.emission),b.distance.assign(x.distance);let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,x.direction));(0,n.If)(o.greaterThan(0).and((0,n.dot)(x.direction,r).greaterThan(0)),()=>{let s=y(e,r,a),c=e.add(s),l=x.distance.sub(.001),u=v(c,x.direction,l);(0,n.If)(u.greaterThan(0),()=>{let e=Cn.wrap(Gn(t,i,x.direction,a)),r=ec(a,e),s=dc(a,e),c=(0,n.select)(s.greaterThan(0),Vn({pdf1:x.pdf,pdf2:s}),(0,n.float)(1));b.contribution.assign(x.emission.mul(r).mul(o).div(x.pdf).mul(u).mul(f).mul(c))})})}),b}),Kc=(0,n.Fn)(([e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v])=>Oc.wrap(Gc(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v)).contribution),qc=4,Jc=2,Yc=32,Xc=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(1),t.mul(i).add(e.mul(r)))),Zc=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(0),e.mul(i).sub(t.mul(r)))),Qc=(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=Xc(p,f,v,a),b=Xc(Zc(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))}),$c=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d])=>{let f=Dc({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(),p=(0,n.float)(1).toVar(),m=(0,n.int)(0).toVar(),h=(0,n.bool)(!1).toVar(),g=ge(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o).toVar();return(0,n.Loop)(Yc,()=>{let t=m.mul((0,n.int)(qc)),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),()=>{h.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)(qc)),l=c.element(s),u=c.element(s.add((0,n.int)(1))),d=o.mul((0,n.int)(qc)),f=c.element(d),_=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=Qc(l.xyz,l.w,u.xyz,v.xyz,v.w,e),x=Qc(f.xyz,f.w,_.xyz,y.xyz,y.w,e),S=b.add(x);(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{m.assign(a)}).Else(()=>{let e=b.div(S);(0,n.If)(g.lessThan(e),()=>{g.assign((0,n.clamp)(g.div((0,n.max)(e,(0,n.float)(1e-6))),0,.999999)),p.mulAssign(e),m.assign(a)}).Else(()=>{let t=(0,n.float)(1).sub(e).toVar();g.assign((0,n.clamp)(g.sub(e).div((0,n.max)(t,(0,n.float)(1e-6))),0,.999999)),p.mulAssign(t),m.assign(o)})})}),(0,n.If)(h,()=>{let h=m.mul((0,n.int)(qc)),_=c.element(h),v=c.element(h.add((0,n.int)(2))),y=(0,n.int)(v.x),b=(0,n.int)(v.y),x=(0,n.max)(_.w,(0,n.float)(1e-10)),S=g.mul(x),C=(0,n.float)(0).toVar(),w=y.add(b.sub((0,n.int)(1))).toVar(),T=(0,n.float)(1e-10).toVar();(0,n.Loop)({start:(0,n.int)(0),end:b},({i:e})=>{let t=y.add(e),r=u.add(t.mul((0,n.int)(Jc))),i=(0,n.max)(l.element(r).g,(0,n.float)(0));C.addAssign(i),(0,n.If)(C.greaterThanEqual(S).and(i.greaterThan((0,n.float)(0))),()=>{w.assign(t),T.assign(i),(0,n.Break)()})}),p.mulAssign(T.div(x));let E=u.add(w.mul((0,n.int)(Jc))),D=l.element(E),O=l.element(E.add((0,n.int)(1))),k=(0,n.int)(D.r),A=O.xyz,j=O.w,M=Bc.wrap(Vc(k,d)),N=he(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),P=(0,n.normalize)((0,n.cross)(M.v1.sub(M.v0),M.v2.sub(M.v0)));(0,n.If)(Mc(M.v0,M.v1,M.v2,e),()=>{let r=Nc.wrap(Fc(M.v0,M.v1,M.v2,e,N));(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,P.negate());(0,n.If)(o.greaterThan((0,n.float)(0)).and(s.greaterThan((0,n.float)(0))),()=>{let t=Ic(a,M.v0,M.v1,M.v2),o=(0,n.normalize)(M.n0.mul(t.x).add(M.n1.mul(t.y)).add(M.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=p.div((0,n.max)(r.solidAngle,(0,n.float)(1e-10)));f.position.assign(a),f.normal.assign(o),f.emission.assign(A),f.direction.assign(i),f.distance.assign(c),f.pdf.assign((0,n.max)(l,Fn)),f.area.assign(j),f.cosThetaLight.assign(s),f.valid.assign(!0)})})}).Else(()=>{let r=kc(M.v0,M.v1,M.v2,N),i=Lc(M.n0,M.n1,M.n2,N),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=p.div((0,n.max)(j,(0,n.float)(1e-10))).mul(o).div(u);f.position.assign(r),f.normal.assign(i),f.emission.assign(A),f.direction.assign(c),f.distance.assign(s),f.pdf.assign((0,n.max)(e,Fn)),f.area.assign(j),f.cosThetaLight.assign(u),f.valid.assign(!0)})})}),f}),el=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=(0,n.float)(0).toVar(),u=(0,n.int)(e).toVar(),d=a.element(s.add(u.shiftRight((0,n.int)(2)))),f=u.bitAnd((0,n.int)(3)),p=(0,n.select)(f.equal((0,n.int)(0)),d.x,(0,n.select)(f.equal((0,n.int)(1)),d.y,(0,n.select)(f.equal((0,n.int)(2)),d.z,d.w))).toVar();return(0,n.If)(p.greaterThanEqual((0,n.float)(0)),()=>{let e=(0,n.int)(p).toVar(),s=(0,n.float)(1).toVar(),d=(0,n.int)(0).toVar(),f=(0,n.int)(0).toVar(),m=(0,n.bool)(!1).toVar();(0,n.Loop)(Yc,()=>{let t=d.mul((0,n.int)(qc));(0,n.If)(a.element(t.add((0,n.int)(1))).w.greaterThan(.5),()=>{m.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)(qc)),u=a.element(l),p=a.element(l.add((0,n.int)(1))),h=a.element(l.add((0,n.int)(3))),g=c.mul((0,n.int)(qc)),_=a.element(g),v=a.element(g.add((0,n.int)(1))),y=a.element(g.add((0,n.int)(3))),b=Qc(u.xyz,u.w,p.xyz,h.xyz,h.w,i),x=Qc(_.xyz,_.w,v.xyz,y.xyz,y.w,i),S=b.add(x),C=e.shiftRight(f).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)),d.assign(c)}).Else(()=>{d.assign(o)})}).Else(()=>{let e=b.div(S);(0,n.If)(C,()=>{s.mulAssign((0,n.float)(1).sub(e)),d.assign(c)}).Else(()=>{s.mulAssign(e),d.assign(o)})}),f.addAssign((0,n.int)(1))}),(0,n.If)(m.and(s.greaterThan((0,n.float)(0))),()=>{let e=d.mul((0,n.int)(qc)),f=a.element(e),p=a.element(e.add((0,n.int)(2))),m=(0,n.int)(p.x),h=(0,n.int)(p.y),g=(0,n.max)(f.w,(0,n.float)(1e-10)),_=(0,n.float)(0).toVar();(0,n.Loop)({start:(0,n.int)(0),end:h},({i:e})=>{let t=m.add(e),r=a.element(o.add(t.mul((0,n.int)(Jc))));(0,n.If)((0,n.int)(r.r).equal(u),()=>{_.assign((0,n.max)(r.g,(0,n.float)(0))),(0,n.Break)()})}),s.mulAssign(_.div(g));let v=Bc.wrap(Vc(u,c));(0,n.If)(Mc(v.v0,v.v1,v.v2,i),()=>{let e=jc(v.v0,v.v1,v.v2,i);l.assign(s.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(v.v1.sub(v.v0),v.v2.sub(v.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),(0,n.float)(.001)),a=Ac(v.v0,v.v1,v.v2),o=t.mul(t),c=s.div((0,n.max)(a,(0,n.float)(1e-10)));l.assign(c.mul(o).div(i))})})}),(0,n.max)(l,Fn)}),tl=0x8ac7230489e80000,nl=1e-4,rl=1e-4,il=.001;function al(e){let{bvhBuffer:t,triangleBuffer:r,materialBuffer:i,envCDFTexture:a,lightBuffer:o,rayBufferRW:s,rngBufferRW:c,hitBufferRO:l,gBufferRW:u,counters:d,activeIndicesRO:f,envTexture:p,environmentIntensity:m,envMatrix:h,enableEnvironmentLight:g,groundProjectionEnabled:_,groundProjectionRadius:v,groundProjectionHeight:y,groundProjectionLevel:b,enableGroundCatcher:x,groundCatcherHeight:S,envTotalSum:C,envCompensationDelta:w,envResolution:T,directionalLightsBuffer:E,numDirectionalLights:D,areaLightsBuffer:O,numAreaLights:k,pointLightsBuffer:A,numPointLights:j,spotLightsBuffer:M,numSpotLights:N,maxBounceCount:P,maxSubsurfaceSteps:F,maxTransparentBounces:I,currentBounce:L,transparentBackground:ee,backgroundIntensity:te,backgroundColor:ne,backgroundBlurriness:re,backgroundBlurSamples:ie,showBackground:oe,globalIlluminationIntensity:se,cameraProjectionMatrix:ce,cameraViewMatrix:le,fireflyThreshold:ue,frame:de,resolution:fe,accumFrame:pe,chunkRowBase:_e,emissiveTriangleCount:ve,emissiveVec4Offset:ye,emissiveTotalPower:be,emissiveBoost:xe,totalTriangleCount:R,enableEmissiveTriangleSampling:Se,lightBVHNodeCount:Ce,reverseMapVec4Offset:we,maxRayCount:Te,auxGBufferEnabled:z}=e,Ee=z.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=aa(o,t,he(a,(0,n.int)(0),(0,n.int)(ae).add(e),i,fe,de).toVar()).toVar();c.addAssign(Zs({tex:p,samp:(0,n.sampler)(p),direction:r,environmentMatrix:h,environmentIntensity:m,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),c.div((0,n.float)(s))};return(0,n.Fn)(()=>{let e=n.instanceIndex;d&&(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(d.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(d.element((0,n.uint)(Q.ACTIVE_ENERGY)),(0,n.uint)(0))});let ae=d?(0,n.atomicLoad)(d.element((0,n.uint)(Q.ENTERING_COUNT))):Te;(0,n.If)(e.greaterThanEqual(ae),()=>{(0,n.Return)()});let R=f.element(e),z=zo(s,R).toVar();(0,n.If)(z.bitAnd((0,n.uint)($.ACTIVE)).equal((0,n.uint)(0)),()=>{(0,n.Return)()});let ke=z.bitAnd((0,n.uint)($.REDIRECTED)).equal((0,n.uint)(0)).toVar(),Ae=Lo(s,R).toVar(),je=Ro(s,R).toVar(),Me=Bo(s,R).toVar(),Ne=Ho(s,R).toVar(),Pe=R,Fe=c.element(R).toVar(),Ie=(0,n.int)(fe.x).toVar(),Le=(0,n.int)(Pe).add(_e.mul(Ie)),Re=(0,n.vec2)((0,n.float)(Le.mod(Ie)).add(.5),(0,n.float)(Le.div(Ie)).add(.5)),B=(0,n.int)(L).mul((0,n.int)(32)),ze=fs(s,R).toVar(),Be=es(l,R).toVar(),V=rs(l,R).toVar(),Ve=ns(l,R).toVar(),He=is(l,R).toVar(),Ue=ts(l,R).toVar(),We=ms(s,R).toVar(),Ge=(0,n.int)(L).toVar(),Ke=hs(s,R).toVar(),qe=gs(s,R).toVar();(0,n.If)(x.and(Ge.equal(0)),()=>{let e=je.y.toVar();(0,n.If)(e.abs().greaterThan((0,n.float)(Mn)),()=>{let o=S.sub(Ae.y).div(e).toVar();(0,n.If)(o.greaterThan((0,n.float)(nl)).and(o.lessThan(Be)),()=>{let e=Ae.add(je.mul(o)).toVar(),l=(0,n.vec3)(0,1,0),d=je.negate().toVar(),f=hn.wrap(Qn()).toVar(),x=Pr(l,he(Re,(0,n.int)(0),B.add((0,n.int)(7)),Fe,fe,de).toVar()).toVar(),S=x.y.mul(An).toVar(),P=(0,n.vec3)(An),F=vn.wrap(pc(e,l,l,f,d,x,S,P,Ge,Fe,Re,fe,de,B,E,D,O,k,A,j,M,N,t,r,i,p,m,h,a,C,w,T,g,(0,n.bool)(!0))).toVar(),I=(0,n.max)((0,n.dot)(F.shadowed,In),(0,n.float)(0)),L=(0,n.max)((0,n.dot)(F.unoccluded,In),(0,n.float)(0)).toVar(),ae=(0,n.clamp)(I.div((0,n.max)(L,(0,n.float)(rl))),0,1).toVar();(0,n.If)(L.lessThan((0,n.float)(il)),()=>{ae.assign(1)});let se=$s(Ae,je,_,v,y,b).toVar(),ue=(0,n.vec3)(0).toVar();(0,n.If)(oe,()=>{(0,n.If)(re.greaterThan(0),()=>{ue.assign(Oe(se,re.mul(1.3),ie,Fe,Re))}).Else(()=>{ue.assign(Zs({tex:p,samp:(0,n.sampler)(p),direction:se,environmentMatrix:h,environmentIntensity:m,enableEnvironmentLight:(0,n.float)(1)}).xyz)})});let pe=(0,n.select)(oe,ue.mul(te),ne),me=(0,n.select)(ee,(0,n.vec3)(0),pe.mul(ae)),ge=(0,n.select)(ee,(0,n.float)(1).sub(ae),(0,n.float)(1));(0,n.If)(Ee,()=>{Wo(u,Pe,l,_c({worldPos:e,cameraProjectionMatrix:ce,cameraViewMatrix:le}),(0,n.vec3)(1))}),$o(s,R,(0,n.vec4)(me,ge)),Zo(s,R,je,z.bitOr((0,n.uint)($.AUX_LOCKED)).bitAnd((0,n.uint)(~$.ACTIVE))),c.element(R).assign(Fe),(0,n.Return)()})})}),(0,n.If)(Be.greaterThan(tl),()=>{let e=ke.and(oe),t=ke.not().and(g),r=(0,n.vec3)(0).toVar();(0,n.If)(e.or(t),()=>{let e=je.toVar();(0,n.If)(ke,()=>{e.assign($s(Ae,je,_,v,y,b))});let t=(0,n.vec3)(0).toVar();(0,n.If)(ke.and(re.greaterThan(0)),()=>{t.assign(Oe(e,re.mul(1.3),ie,Fe,Re))}).Else(()=>{t.assign(Zs({tex:p,samp:(0,n.sampler)(p),direction:e,environmentMatrix:h,environmentIntensity:m,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)(ke.not(),()=>{let e=Vo(s,R);(0,n.If)(e.greaterThan(0),()=>{let t=Ys(p,je,h,C,w,T).w;(0,n.If)(t.greaterThan(0),()=>{i.assign(Hn({pdf1:e,pdf2:t}))})})});let a=(0,n.select)(ke.not(),se,(0,n.float)(1)),o=(0,n.select)(ke,te,i.mul(a)),c=(0,n.select)(ke,(0,n.float)(0),(0,n.float)(Ge));Ne.assign((0,n.vec4)(Ne.xyz.add(gc(Me.mul(t).mul(o),c,ue,(0,n.int)(pe))),Ne.w))}),(0,n.If)(ke.and(oe.not()).and(ee.not()),()=>{Ne.assign((0,n.vec4)(Ne.xyz.add(Me.mul(ne)),Ne.w))}),(0,n.If)(z.bitAnd((0,n.uint)($.HAS_HIT_OPAQUE)).equal((0,n.uint)(0)),()=>{Ne.w.assign(0)}),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))).and(z.bitAnd((0,n.uint)($.REDIRECTED)).notEqual((0,n.uint)(0))),()=>{let e=Go(u,Pe);Wo(u,Pe,(0,n.normalize)(je),Ko(e).w,(0,n.clamp)(r.mul(ze),(0,n.vec3)(0),(0,n.vec3)(1)))}),$o(s,R,Ne),Zo(s,R,je,z.bitAnd((0,n.uint)(~$.ACTIVE))),(0,n.Return)()});let H=Ae.add(je.mul(Be)).toVar(),U=(0,n.normalize)(V).toVar(),Je=os(s,R),Ye=(0,n.int)(Je.stackDepth).toVar(),Xe=Je.ior1.toVar(),Ze=Je.ior2.toVar(),Qe=Je.ior3.toVar(),$e=(0,n.int)(Je.transTraversals).toVar(),et=(0,n.float)(Je.wavelength).toVar();(0,n.If)(Ye.greaterThan(0),()=>{let e=cs(s,R).toVar(),t=_s(s,R),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(Be).negate()).toVar();Me.mulAssign(t),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{ze.mulAssign(t)})}).Else(()=>{let t=e.add(r),a=Lr.wrap(Vr(t,r,Me,Be,Fe,Re,fe,de,B)).toVar();Me.mulAssign(a.weight),(0,n.If)(a.didScatter,()=>{let e=he(Re,(0,n.int)(0),B.add((0,n.int)(6)),Fe,fe,de),t=Ae.add(je.mul(a.t)),r=Br(je,i,e).toVar();Ke.addAssign(1);let o=(0,n.clamp)((0,n.max)((0,n.max)(Me.x,Me.y),Me.z),.02,1).toVar();(0,n.If)(Ke.greaterThanEqual(F).or(ge(Re,(0,n.int)(0),B.add((0,n.int)(12)),Fe,fe,de).greaterThan(o)).toVar(),()=>{$o(s,R,Ne),Zo(s,R,je,z.bitAnd((0,n.uint)(~$.ACTIVE))),c.element(R).assign(Fe),(0,n.Return)()}),Me.divAssign(o),z.assign(z.bitOr((0,n.uint)($.REDIRECTED))),Xo(s,R,t,We,Ke,qe),Zo(s,R,r,z),Qo(s,R,Me,Vo(s,R)),$o(s,R,Ne),c.element(R).assign(Fe),(0,n.Return)()})})});let W=hn.wrap(Zn((0,n.int)(He),i)).toVar(),tt=Ve.toVar(),nt=U.toVar();(0,n.If)(W.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(W.displacementScale.greaterThan(0)),()=>{let e=mn({origin:Ae,direction:je}),t=yn({didHit:!0,dst:Be,hitPoint:H,normal:U,uv:Ve,materialIndex:(0,n.int)(He),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(Ue),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),i=Tc.wrap(Ec(e,t,r,W,Ge)).toVar();tt.assign(i.uv),nt.assign(i.normal),H.assign(i.hitPoint)});let rt=(0,n.vec4)(0).toVar();(0,n.If)(W.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{rt.assign(xi(r,(0,n.int)(Ue),U,W.normalTransform))});let it=Tn.wrap(Di(W,tt,U,rt)).toVar(),at=it.roughness.toVar();W.color.assign(it.albedo),W.metalness.assign(it.metalness.clamp(0,1)),W.roughness.assign(it.roughness.clamp(.05,1)),W.sheenRoughness.assign(W.sheenRoughness.clamp(.05,1));let ot=mi({uv:tt,transform:W.albedoTransform}).toVar();(0,n.If)(W.anisotropyMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let e=wi(W,ot).toVar();W.anisotropy.assign(e.x),W.anisotropyRotation.assign(e.y)});let st=gn.wrap(Ti(W,ot)).toVar();W.transmission.assign(st.transmission),W.clearcoat.assign(st.clearcoat),W.clearcoatRoughness.assign(st.clearcoatRoughness),W.sheenColor.assign(st.sheenColor),W.sheenRoughness.assign(st.sheenRoughness),W.iridescence.assign(st.iridescence),W.iridescenceThicknessRange.assign((0,n.vec2)(W.iridescenceThicknessRange.x,st.iridescenceThickness)),W.specularIntensity.assign(st.specularIntensity),W.specularColor.assign(st.specularColor);let ct=it.albedo.toVar();(0,n.If)(W.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(W.displacementScale.greaterThan(0)),()=>{U.assign((0,n.normalize)(nt.add(it.normal.sub((0,n.normalize)(V)))))}).Else(()=>{U.assign(it.normal)});let lt=W.metalness.toVar(),ut=W.transmission.toVar(),dt=(0,n.smoothstep)((0,n.float)(0),(0,n.float)(.15),at).toVar(),ft=(0,n.clamp)((0,n.float)(1).sub(lt).mul((0,n.float)(1).sub(ut)).add(dt.mul(lt.mul((0,n.float)(1).sub(ut)).add(ut))),0,1).greaterThanEqual((0,n.float)(.25)).toVar(),pt=ze.toVar(),mt=e=>{(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let t=Ko(Go(u,Pe)).w;Wo(u,Pe,e,t,(0,n.clamp)(ct.mul(pt),(0,n.vec3)(0),(0,n.vec3)(1)))})},ht=()=>{$o(s,R,Ne),Zo(s,R,je,z.bitAnd((0,n.uint)(~$.ACTIVE))),c.element(R).assign(Fe)};(0,n.If)(Ge.equal(0).and(Ee),()=>{let e=_c({worldPos:H,cameraProjectionMatrix:ce,cameraViewMatrix:le});Wo(u,Pe,(0,n.vec3)(0,0,1),e,(0,n.vec3)(0))});let gt=(0,n.float)(1).toVar(),G=(0,n.float)(1).toVar();(0,n.If)(Ye.equal(1),()=>{gt.assign(Xe)}).ElseIf(Ye.equal(2),()=>{gt.assign(Ze),G.assign(Xe)}).ElseIf(Ye.equal(3),()=>{gt.assign(Qe),G.assign(Ze)});let _t=mn({origin:Ae,direction:je}),K=Gr.wrap(ti(_t,U,W,Fe,Re,fe,de,B,(0,n.int)($e),gt,G,et)).toVar();et.assign(K.pathWavelength),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Ko(Go(u,Pe)).w,t=(0,n.select)((0,n.dot)(U,je.negate()).lessThan(0),U.negate(),U).toVar(),r=(0,n.clamp)(ct.mul(pt),(0,n.vec3)(0),(0,n.vec3)(1)).toVar();(0,n.If)(W.alphaMode.equal((0,n.int)(2)),()=>{Wo(u,Pe,t,e,r),z.assign(z.bitOr((0,n.uint)($.AUX_LOCKED)))}).ElseIf(K.isAlphaSkip,()=>{}).ElseIf(K.isSubsurface,()=>{Wo(u,Pe,t,e,r),z.assign(z.bitOr((0,n.uint)($.AUX_LOCKED)))}).ElseIf(K.isTransmissive,()=>{(0,n.If)(ft.or(W.dispersion.greaterThan(0)),()=>{Wo(u,Pe,t,e,r),z.assign(z.bitOr((0,n.uint)($.AUX_LOCKED)))}).Else(()=>{ze.mulAssign((0,n.clamp)(ct,(0,n.vec3)(0),(0,n.vec3)(1)))})})}),(0,n.If)(K.continueRay,()=>{(0,n.If)(K.isTransmissive.and(K.didReflect.not()),()=>{(0,n.If)(K.entering,()=>{(0,n.If)(Ye.lessThan(3),()=>{Ye.addAssign(1),(0,n.If)(Ye.equal(1),()=>{Xe.assign(W.ior)}),(0,n.If)(Ye.equal(2),()=>{Ze.assign(W.ior)}),(0,n.If)(Ye.equal(3),()=>{Qe.assign(W.ior)}),ls(s,R,(0,n.select)(W.attenuationDistance.greaterThan(0),(0,n.log)((0,n.max)(W.attenuationColor,(0,n.vec3)(.001))).negate().div(W.attenuationDistance),(0,n.vec3)(0))),vs(s,R,(0,n.vec3)(0),(0,n.float)(0))})}).Else(()=>{(0,n.If)(Ye.greaterThan(0),()=>{Ye.subAssign(1)})})}),(0,n.If)(K.isSubsurface.and(K.didReflect.not()),()=>{(0,n.If)(K.entering,()=>{(0,n.If)(Ye.lessThan(3),()=>{Ye.addAssign(1),(0,n.If)(Ye.equal(1),()=>{Xe.assign(W.ior)}),(0,n.If)(Ye.equal(2),()=>{Ze.assign(W.ior)}),(0,n.If)(Ye.equal(3),()=>{Qe.assign(W.ior)});let e=Rr.wrap(Hr(W.subsurfaceColor,W.subsurfaceRadius,W.subsurfaceRadiusScale)).toVar();ls(s,R,e.sigmaT.sub(e.sigmaS)),vs(s,R,e.sigmaS,(0,n.clamp)(W.subsurfaceAnisotropy,-.99,.99))})}).Else(()=>{(0,n.If)(Ye.greaterThan(0),()=>{Ye.subAssign(1)})})}),(0,n.If)(K.isTransmissive.and($e.greaterThan(0)),()=>{$e.subAssign(1)}),Me.mulAssign(K.throughput);let e=(0,n.select)(K.entering,U,U.negate()),t=(0,n.select)(K.didReflect,e,je),r=H.add(t.mul(.001));(0,n.If)(K.isAlphaSkip.not(),()=>{z.assign(z.bitOr((0,n.uint)($.REDIRECTED)))}).Else(()=>{qe.addAssign(1),(0,n.If)(qe.greaterThan(I),()=>{mt((0,n.select)((0,n.dot)(U,je.negate()).lessThan(0),U.negate(),U)),ht(),(0,n.Return)()})}),Xo(s,R,r,We,Ke,qe,(0,n.select)(K.isAlphaSkip,Yo(s,R).add(Be),(0,n.float)(0))),Zo(s,R,K.direction,z),Qo(s,R,Me,Vo(s,R)),$o(s,R,Ne),ss(s,R,(0,n.uint)(Ye),(0,n.uint)($e),Xe,Ze,Qe,(0,n.uint)(et.add(.5))),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{ps(s,R,ze)}),c.element(R).assign(Fe),(0,n.Return)()}),z.assign(z.bitOr((0,n.uint)($.HAS_HIT_OPAQUE|$.REDIRECTED)));let vt=it.emissive.toVar();(0,n.If)((0,n.length)(vt).greaterThan(0),()=>{let e=(0,n.select)(ke.not(),se,(0,n.float)(1)),t=(0,n.float)(1).toVar();De&&(0,n.If)(Se.equal((0,n.int)(1)).and(ve.greaterThan((0,n.int)(0))).and(Ge.greaterThan(0)),()=>{let e=Vo(s,R);(0,n.If)(e.greaterThan(0),()=>{let a=Yo(s,R).toVar(),c=Ae.sub(je.mul(a)).toVar(),l=Be.add(a).toVar(),u=(0,n.float)(0).toVar();(0,n.If)(Ce.greaterThan((0,n.int)(0)),()=>{u.assign(el((0,n.int)(Ue),l,je,c,o,ye,we,r))}).Else(()=>{u.assign(Hc((0,n.int)(Ue),l,je,c,r,i,be))}),t.assign(Vn({pdf1:e,pdf2:u}))})}),Ne.assign((0,n.vec4)(Ne.xyz.add(gc(vt.mul(Me).mul(e).mul(t),(0,n.float)(Ge),ue,(0,n.int)(pe))),Ne.w))});let yt=je.negate().toVar(),bt=(0,n.normalize)(V),xt=(0,n.select)((0,n.dot)(bt,yt).lessThan(0),bt.negate(),bt).toVar();(0,n.If)((0,n.dot)(bt,yt).lessThan(0),()=>{U.assign(U.negate())}),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=Ko(Go(u,Pe)).w;(0,n.If)(ft,()=>{Wo(u,Pe,U,e,(0,n.clamp)(ct.mul(pt),(0,n.vec3)(0),(0,n.vec3)(1))),z.assign(z.bitOr((0,n.uint)($.AUX_LOCKED)))}).Else(()=>{let e=(0,n.max)((0,n.dot)(U,yt),(0,n.float)(.001)),t=(0,n.clamp)((0,n.mix)(sr(W.ior).mul(W.specularColor),ct,W.metalness).mul(W.specularIntensity),(0,n.vec3)(0),(0,n.vec3)(1));ze.mulAssign(wn.wrap(yr(t,e,(0,n.max)(at,(0,n.float)(.02)))).E_total)})});let St=En.wrap(Yn(W.metalness,W.roughness,W.transmission,W.clearcoat,W.emissive,W.subsurface)).toVar(),Ct=me(Re,(0,n.int)(0),Ge,Fe,(0,n.int)(-1),fe,de).toVar(),wt=ge(Re,(0,n.int)(0),B.add((0,n.int)(2)),Fe,fe,de).toVar(),Tt=xn({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)}),Et=On({invRoughness:(0,n.float)(0),metalFactor:(0,n.float)(.5),iorFactor:(0,n.float)(.67),maxSheenColor:(0,n.float)(0)}),Dt=(0,n.vec3)(0).toVar(),Ot=(0,n.vec3)(0).toVar(),kt=(0,n.float)(0).toVar(),At=(0,n.bool)(!1).toVar(),jt=(0,n.vec3)(1).toVar();(0,n.If)(W.clearcoat.greaterThan(0),()=>{let e=mn({origin:Ae,direction:je}),t=yn({didHit:!0,dst:Be,hitPoint:H,normal:U,uv:Ve,materialIndex:(0,n.int)(He),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(0),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),r=yc.wrap(bc(e,t,W,Ct,Fe,Re,fe,de,B));Dt.assign(r.L),Ot.assign(r.brdf),kt.assign(r.pdf)}).Else(()=>{let e=bn.wrap(hc(yt,U,W,Ct,wt,Fe,Re,fe,de,B,St,!1,Tt,!1,Et));Dt.assign(e.direction),Ot.assign(e.value),kt.assign(e.pdf),At.assign(e.isTransmission),jt.assign(e.colorWeight)});let Mt=vn.wrap(pc(H,U,xt,W,yt,Dt,kt,Ot,Ge,Fe,Re,fe,de,B,E,D,O,k,A,j,M,N,t,r,i,p,m,h,a,C,w,T,g,(0,n.bool)(!1))).shadowed.toVar(),Nt=(0,n.select)(Ge.greaterThan(0),se,(0,n.float)(1));Ne.assign((0,n.vec4)(Ne.xyz.add(gc(Me.mul(Mt).mul(Nt),(0,n.float)(Ge),ue,(0,n.int)(pe))),Ne.w)),De&&(0,n.If)(Se.equal((0,n.int)(1)).and(ve.greaterThan((0,n.int)(0))),()=>{let e=(0,n.Fn)(([e,n,a])=>Ni(e,n,a,Gs,t,r,i));(0,n.If)(Ce.greaterThan((0,n.int)(0)),()=>{let t=Dc.wrap($c(H,U,Fe,Re,fe,de,B,o,o,ye,r));(0,n.If)(t.valid.and(t.pdf.greaterThan(0)),()=>{let r=(0,n.max)((0,n.float)(0),(0,n.dot)(U,t.direction));(0,n.If)(r.greaterThan(0).and((0,n.dot)(t.direction,xt).greaterThan(0)),()=>{let i=Pi(H,xt,W),a=H.add(i),o=t.distance.sub(.001),s=e(a,t.direction,o);(0,n.If)(s.greaterThan(0),()=>{let e=tc(yt,t.direction,U,W),i=fc(yt,t.direction,U,W),a=(0,n.select)(i.greaterThan(0),Vn({pdf1:t.pdf,pdf2:i}),(0,n.float)(1)),o=t.emission.mul(e).mul(r).div(t.pdf).mul(s).mul(xe).mul(a);Ne.assign((0,n.vec4)(Ne.xyz.add(gc(o.mul(Me).mul(Nt),(0,n.float)(Ge),ue,(0,n.int)(pe))),Ne.w))})})})}).Else(()=>{let t=Kc(H,U,xt,yt,W,Ge,Fe,Re,fe,de,B,xe,o,ye,ve,be,r,e,Pi);Ne.assign((0,n.vec4)(Ne.xyz.add(gc(t.mul(Me).mul(Nt),(0,n.float)(Ge),ue,(0,n.int)(pe))),Ne.w))})});let Pt=Wi.wrap(mc(U,W,Dt,kt,Ot,At,jt,Fe,Re,fe,de,B)).toVar(),Ft=Pt.direction.toVar();(0,n.If)(At.not().and((0,n.dot)(Ft,xt).lessThanEqual(0)),()=>{mt(U),ht(),(0,n.Return)()});let It=(0,n.max)(Pt.combinedPdf,.001).toVar();Me.mulAssign(Pt.throughput);let Lt=vc(Ge,Me,St,Ft,Fe,Re,fe,de,B,g).toVar();(0,n.If)(Lt.lessThanEqual(0),()=>{mt(U),ht(),(0,n.Return)()}),Me.divAssign(Lt),(0,n.If)(We.greaterThanEqual(P),()=>{mt(U),ht(),(0,n.Return)()}),Xo(s,R,H.add(U.mul(.001)),We.add(1),Ke,qe),Zo(s,R,Ft,z),Qo(s,R,Me,It),$o(s,R,Ne),ss(s,R,(0,n.uint)(Ye),(0,n.uint)($e),Xe,Ze,Qe,(0,n.uint)(et.add(.5))),(0,n.If)(Ee.and(z.bitAnd((0,n.uint)($.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{ps(s,R,ze)}),c.element(R).assign(Fe)})}var ol=(e,t)=>{let r=Bo(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)(bs))};function sl(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)(Q.ENTERING_COUNT))):o;(0,n.If)(e.greaterThanEqual(s),()=>{(0,n.Return)()});let c=r.element(e);(0,n.If)(zo(t,c).bitAnd((0,n.uint)($.ACTIVE)).notEqual((0,n.uint)(0)),()=>{let e=(0,n.atomicAdd)(a.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)),(0,n.uint)(1));i.element(e).assign(c),(0,n.atomicAdd)(a.element((0,n.uint)(Q.ACTIVE_ENERGY)),ol(t,c))})})}function cl(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)(Q.ENTERING_COUNT))):o,c=e.lessThan(s),l=r.element(e),u=zo(t,l),d=c.and(u.bitAnd((0,n.uint)($.ACTIVE)).notEqual((0,n.uint)(0))),f=(0,n.select)(d,(0,n.uint)(1),(0,n.uint)(0)),p=(0,n.select)(d,ol(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)(Q.ACTIVE_RAY_COUNT)),h)),(0,n.atomicAdd)(a.element((0,n.uint)(Q.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 ll=(0,n.wgslFn)(`
|
|
631
|
+
`),Zc=(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=B(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=B(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}),Qc=C({brdf:`vec3`,L:`vec3`,pdf:`float`}),$c=(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,zn),p=(0,n.max)(r.roughness,zn),m=En.wrap(Rr(r)).toVar(),h=m.clearcoat.toVar(),g=m.specular.toVar(),_=B(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=Zn({N:u});y.assign(e.mul(Ur({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=Dn.wrap(Qn(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=kr(r.roughness,r.anisotropy),o=Wr({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=Zn({N:u});y.assign(e.mul(Ur({V:e.transpose().mul(d),roughness:p,Xi:i})))}),v.assign((0,n.reflect)(d.negate(),y))}).Else(()=>{v.assign(Vr({N:u,xi:i})),y.assign((0,n.normalize)(d.add(v)))});let b=On.wrap($n(u,d,v,r)),x=(0,n.max)(Lr(r,m,b),.001);return Qc({brdf:Nc(r,b),L:v,pdf:x})}),el=32,tl=16,nl=5,rl=8,il=C({hitPoint:`vec3`,uv:`vec2`,normal:`vec3`,height:`float`}),al=(0,n.Fn)(([e,t,r,i,a])=>{let o=t.hitPoint.toVar(),s=t.uv.toVar(),c=t.normal.toVar(),l=(0,n.float)(0).toVar(),u=t.triangleIndex,d=Z(r,u,(0,n.int)(0),(0,n.int)(rl)).xyz.toVar(),f=Z(r,u,(0,n.int)(1),(0,n.int)(rl)).xyz,p=Z(r,u,(0,n.int)(2),(0,n.int)(rl)).xyz,m=Z(r,u,(0,n.int)(6),(0,n.int)(rl)).toVar(),h=Z(r,u,(0,n.int)(7),(0,n.int)(rl)),g=m.xy.toVar(),_=m.zw,v=h.xy,y=f.sub(d).toVar(),b=p.sub(d).toVar(),x=_.sub(g).toVar(),S=v.sub(g).toVar(),C=x.x.mul(S.y).sub(S.x.mul(x.y)).toVar();return(0,n.If)((0,n.abs)(C).greaterThan(1e-8),()=>{let r=(0,n.float)(1).div(C),u=y.mul(S.y).sub(b.mul(x.y)).mul(r).toVar(),d=b.mul(x.x).sub(y.mul(S.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)(u,u),v=(0,n.dot)(u,d),w=(0,n.dot)(d,d),T=_.mul(w).sub(v.mul(v)).toVar();(0,n.If)((0,n.abs)(T).greaterThan(1e-10),()=>{let e=(0,n.float)(1).div(T),r=(0,n.dot)(g,u),y=(0,n.dot)(g,d),b=(0,n.vec2)(w.mul(r).sub(v.mul(y)).mul(e),_.mul(y).sub(v.mul(r)).mul(e)).toVar(),x=h.toVar(),S=(0,n.max)((0,n.abs)(x),.001),C=p.div(S).toVar(),E=(0,n.int)(a.equal((0,n.int)(0)).select((0,n.int)(el),(0,n.int)(tl))).toVar(),D=C.negate().toVar(),O=C.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(b.mul(r)),o=r.mul(x),s=Ii(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)(nl),type:`int`,condition:`<`},()=>{let a=e.add(r).mul(.5).toVar(),o=t.uv.add(b.mul(a)),s=a.mul(x),c=Ii(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(b.mul(a)).toVar(),g=t.hitPoint.add(m.mul(a)),_=Ii(i.displacementMapIndex,h,i.displacementTransform),v=_.sub(.5).mul(p),y=gi(_i(),i.displacementMapIndex).toVar(),S=_,C=Ii(i.displacementMapIndex,h.add((0,n.vec2)(y.x,0)),i.displacementTransform),w=Ii(i.displacementMapIndex,h.add((0,n.vec2)(0,y.y)),i.displacementTransform),T=(0,n.normalize)(u).toVar(),E=(0,n.normalize)(d).toVar(),D=C.sub(S).mul(p),O=w.sub(S).mul(p),j=(0,n.normalize)(f.sub(T.mul(D)).sub(E.mul(O)));o.assign(g),s.assign(h),c.assign(j),l.assign(v)})})}),il({hitPoint:o,uv:s,normal:c,height:l})}),ol=C({position:`vec3`,normal:`vec3`,emission:`vec3`,direction:`vec3`,distance:`float`,pdf:`float`,area:`float`,cosThetaLight:`float`,valid:`bool`}),sl=C({contribution:`vec3`,hasEmissive:`bool`,emissionOnly:`vec3`,distance:`float`}),cl=(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))}),ll=(0,n.Fn)(([e,t,r])=>(0,n.length)((0,n.cross)(t.sub(e),r.sub(e))).mul(.5)),ul=(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))}),dl=(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}),fl=C({direction:`vec3`,position:`vec3`,solidAngle:`float`,valid:`bool`}),pl=(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))}),ml=(0,n.Fn)(([e,t,r,i,a])=>{let o=fl({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=ul(e,t,r,i);return o.solidAngle.assign(u),(0,n.If)(u.greaterThan(1e-7),()=>{let d=(0,n.clamp)((0,n.dot)(pl((0,n.cross)(s,c)),pl((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=pl(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=pl(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}),hl=(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)}),gl=(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 _l=8,vl=2,yl=C({v0:`vec3`,v1:`vec3`,v2:`vec3`,n0:`vec3`,n1:`vec3`,n2:`vec3`,materialIndex:`int`}),bl=(0,n.Fn)(([e,t])=>{let r=Z(t,e,(0,n.int)(0),(0,n.int)(_l)),i=Z(t,e,(0,n.int)(1),(0,n.int)(_l)),a=Z(t,e,(0,n.int)(2),(0,n.int)(_l)),o=Z(t,e,(0,n.int)(3),(0,n.int)(_l)),s=Z(t,e,(0,n.int)(4),(0,n.int)(_l)),c=Z(t,e,(0,n.int)(5),(0,n.int)(_l)),l=Z(t,e,(0,n.int)(7),(0,n.int)(_l));return yl({v0:r.xyz,v1:i.xyz,v2:a.xyz,n0:o.xyz,n1:s.xyz,n2:c.xyz,materialIndex:(0,n.int)(l.z)})}),xl=(0,n.Fn)(([e,t,r,i,a,o,s])=>{let c=yl.wrap(bl(e,a)),l=ll(c.v0,c.v1,c.v2),u=Z(o,c.materialIndex,(0,n.int)(Gn.EMISSIVE_ROUGHNESS),Y),d=Z(o,c.materialIndex,(0,n.int)(Gn.IOR_TRANSMISSION),Y),f=(0,n.max)(u.x.mul(.2126).add(u.y.mul(.7152)).add(u.z.mul(.0722)).mul(d.a).mul(l),(0,n.float)(1e-10)).div((0,n.max)(s,(0,n.float)(1e-10))),p=(0,n.float)(0).toVar();return(0,n.If)(dl(c.v0,c.v1,c.v2,i),()=>{let e=ul(c.v0,c.v1,c.v2,i);p.assign(f.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(c.v1.sub(c.v0),c.v2.sub(c.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),.001),a=t.mul(t),o=f.div(l);p.assign(o.mul(a).div(i))}),(0,n.max)(p,Bn)}),Sl=(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)(vl)))).b;(0,n.If)(s.lessThan(i),()=>{a.assign(r.add(1))}).Else(()=>{o.assign(r)})}),a}),Cl=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f])=>{let p=ol({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 m=Sl(c,l,u,B(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o)).toVar(),h=l.add(m.mul((0,n.int)(vl))),g=c.element(h),_=c.element(h.add(1)),v=(0,n.int)(g.r),y=(0,n.max)(g.g,(0,n.float)(1e-10)),b=_.xyz,x=_.w,S=yl.wrap(bl(v,f)),C=pe(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),w=(0,n.normalize)((0,n.cross)(S.v1.sub(S.v0),S.v2.sub(S.v0)));(0,n.If)(dl(S.v0,S.v1,S.v2,e),()=>{let r=fl.wrap(ml(S.v0,S.v1,S.v2,e,C));(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,w.negate());(0,n.If)(o.greaterThan(0).and(s.greaterThan(0)),()=>{let t=hl(a,S.v0,S.v1,S.v2),o=(0,n.normalize)(S.n0.mul(t.x).add(S.n1.mul(t.y)).add(S.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=y.div((0,n.max)(d,(0,n.float)(1e-10))).div(r.solidAngle);p.position.assign(a),p.normal.assign(o),p.emission.assign(b),p.direction.assign(i),p.distance.assign(c),p.pdf.assign((0,n.max)(l,Bn)),p.area.assign(x),p.cosThetaLight.assign(s),p.valid.assign(!0)})})}).Else(()=>{let r=cl(S.v0,S.v1,S.v2,C),i=gl(S.n0,S.n1,S.n2,C),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=y.div((0,n.max)(d,(0,n.float)(1e-10)).mul(x)).mul(o).div(u);p.position.assign(r),p.normal.assign(i),p.emission.assign(b),p.direction.assign(c),p.distance.assign(s),p.pdf.assign((0,n.max)(e,Bn)),p.area.assign(x),p.cosThetaLight.assign(u),p.valid.assign(!0)})})}),p}),wl=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y])=>{let b=sl({contribution:(0,n.vec3)(0),hasEmissive:!1,emissionOnly:(0,n.vec3)(0),distance:(0,n.float)(0)}).toVar(),x=ol.wrap(Cl(e,t,s,c,l,u,d,p,m,h,g,_));return(0,n.If)(x.valid.and(x.pdf.greaterThan(0)),()=>{b.hasEmissive.assign(!0),b.emissionOnly.assign(x.emission),b.distance.assign(x.distance);let o=(0,n.max)((0,n.float)(0),(0,n.dot)(t,x.direction));(0,n.If)(o.greaterThan(0).and((0,n.dot)(x.direction,r).greaterThan(0)),()=>{let s=y(e,r,a),c=e.add(s),l=x.distance.sub(.001),u=v(c,x.direction,l);(0,n.If)(u.greaterThan(0),()=>{let e=On.wrap($n(t,i,x.direction,a)),r=Nc(a,e),s=Wc(a,e),c=(0,n.select)(s.greaterThan(0),Yn({pdf1:x.pdf,pdf2:s}),(0,n.float)(1));b.contribution.assign(x.emission.mul(r).mul(o).div(x.pdf).mul(u).mul(f).mul(c))})})}),b}),Tl=(0,n.Fn)(([e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v])=>sl.wrap(wl(e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v)).contribution),El=4,Dl=2,Ol=32,kl=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(1),t.mul(i).add(e.mul(r)))),Al=(0,n.Fn)(([e,t,r,i])=>(0,n.select)(t.greaterThan(i),(0,n.float)(0),e.mul(i).sub(t.mul(r)))),jl=(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=kl(p,f,v,a),b=kl(Al(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))}),Ml=(0,n.Fn)(([e,t,r,i,a,o,s,c,l,u,d])=>{let f=ol({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(),p=(0,n.float)(1).toVar(),m=(0,n.int)(0).toVar(),h=(0,n.bool)(!1).toVar(),g=B(i,(0,n.int)(0),s.add((0,n.int)(1)),r,a,o).toVar();return(0,n.Loop)(Ol,()=>{let t=m.mul((0,n.int)(El)),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),()=>{h.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)(El)),l=c.element(s),u=c.element(s.add((0,n.int)(1))),d=o.mul((0,n.int)(El)),f=c.element(d),_=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=jl(l.xyz,l.w,u.xyz,v.xyz,v.w,e),x=jl(f.xyz,f.w,_.xyz,y.xyz,y.w,e),S=b.add(x);(0,n.If)(S.lessThanEqual((0,n.float)(0)),()=>{m.assign(a)}).Else(()=>{let e=b.div(S);(0,n.If)(g.lessThan(e),()=>{g.assign((0,n.clamp)(g.div((0,n.max)(e,(0,n.float)(1e-6))),0,.999999)),p.mulAssign(e),m.assign(a)}).Else(()=>{let t=(0,n.float)(1).sub(e).toVar();g.assign((0,n.clamp)(g.sub(e).div((0,n.max)(t,(0,n.float)(1e-6))),0,.999999)),p.mulAssign(t),m.assign(o)})})}),(0,n.If)(h,()=>{let h=m.mul((0,n.int)(El)),_=c.element(h),v=c.element(h.add((0,n.int)(2))),y=(0,n.int)(v.x),b=(0,n.int)(v.y),x=(0,n.max)(_.w,(0,n.float)(1e-10)),S=g.mul(x),C=(0,n.float)(0).toVar(),w=y.add(b.sub((0,n.int)(1))).toVar(),T=(0,n.float)(1e-10).toVar();(0,n.Loop)({start:(0,n.int)(0),end:b},({i:e})=>{let t=y.add(e),r=u.add(t.mul((0,n.int)(Dl))),i=(0,n.max)(l.element(r).g,(0,n.float)(0));C.addAssign(i),(0,n.If)(C.greaterThanEqual(S).and(i.greaterThan((0,n.float)(0))),()=>{w.assign(t),T.assign(i),(0,n.Break)()})}),p.mulAssign(T.div(x));let E=u.add(w.mul((0,n.int)(Dl))),D=l.element(E),O=l.element(E.add((0,n.int)(1))),k=(0,n.int)(D.r),A=O.xyz,j=O.w,M=yl.wrap(bl(k,d)),N=pe(i,(0,n.int)(0),s.add((0,n.int)(3)),r,a,o).toVar(),P=(0,n.normalize)((0,n.cross)(M.v1.sub(M.v0),M.v2.sub(M.v0)));(0,n.If)(dl(M.v0,M.v1,M.v2,e),()=>{let r=fl.wrap(ml(M.v0,M.v1,M.v2,e,N));(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,P.negate());(0,n.If)(o.greaterThan((0,n.float)(0)).and(s.greaterThan((0,n.float)(0))),()=>{let t=hl(a,M.v0,M.v1,M.v2),o=(0,n.normalize)(M.n0.mul(t.x).add(M.n1.mul(t.y)).add(M.n2.mul(t.z))),c=(0,n.length)(a.sub(e)),l=p.div((0,n.max)(r.solidAngle,(0,n.float)(1e-10)));f.position.assign(a),f.normal.assign(o),f.emission.assign(A),f.direction.assign(i),f.distance.assign(c),f.pdf.assign((0,n.max)(l,Bn)),f.area.assign(j),f.cosThetaLight.assign(s),f.valid.assign(!0)})})}).Else(()=>{let r=cl(M.v0,M.v1,M.v2,N),i=gl(M.n0,M.n1,M.n2,N),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=p.div((0,n.max)(j,(0,n.float)(1e-10))).mul(o).div(u);f.position.assign(r),f.normal.assign(i),f.emission.assign(A),f.direction.assign(c),f.distance.assign(s),f.pdf.assign((0,n.max)(e,Bn)),f.area.assign(j),f.cosThetaLight.assign(u),f.valid.assign(!0)})})}),f}),Nl=(0,n.Fn)(([e,t,r,i,a,o,s,c])=>{let l=(0,n.float)(0).toVar(),u=(0,n.int)(e).toVar(),d=a.element(s.add(u.shiftRight((0,n.int)(2)))),f=u.bitAnd((0,n.int)(3)),p=(0,n.select)(f.equal((0,n.int)(0)),d.x,(0,n.select)(f.equal((0,n.int)(1)),d.y,(0,n.select)(f.equal((0,n.int)(2)),d.z,d.w))).toVar();return(0,n.If)(p.greaterThanEqual((0,n.float)(0)),()=>{let e=(0,n.int)(p).toVar(),s=(0,n.float)(1).toVar(),d=(0,n.int)(0).toVar(),f=(0,n.int)(0).toVar(),m=(0,n.bool)(!1).toVar();(0,n.Loop)(Ol,()=>{let t=d.mul((0,n.int)(El));(0,n.If)(a.element(t.add((0,n.int)(1))).w.greaterThan(.5),()=>{m.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)(El)),u=a.element(l),p=a.element(l.add((0,n.int)(1))),h=a.element(l.add((0,n.int)(3))),g=c.mul((0,n.int)(El)),_=a.element(g),v=a.element(g.add((0,n.int)(1))),y=a.element(g.add((0,n.int)(3))),b=jl(u.xyz,u.w,p.xyz,h.xyz,h.w,i),x=jl(_.xyz,_.w,v.xyz,y.xyz,y.w,i),S=b.add(x),C=e.shiftRight(f).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)),d.assign(c)}).Else(()=>{d.assign(o)})}).Else(()=>{let e=b.div(S);(0,n.If)(C,()=>{s.mulAssign((0,n.float)(1).sub(e)),d.assign(c)}).Else(()=>{s.mulAssign(e),d.assign(o)})}),f.addAssign((0,n.int)(1))}),(0,n.If)(m.and(s.greaterThan((0,n.float)(0))),()=>{let e=d.mul((0,n.int)(El)),f=a.element(e),p=a.element(e.add((0,n.int)(2))),m=(0,n.int)(p.x),h=(0,n.int)(p.y),g=(0,n.max)(f.w,(0,n.float)(1e-10)),_=(0,n.float)(0).toVar();(0,n.Loop)({start:(0,n.int)(0),end:h},({i:e})=>{let t=m.add(e),r=a.element(o.add(t.mul((0,n.int)(Dl))));(0,n.If)((0,n.int)(r.r).equal(u),()=>{_.assign((0,n.max)(r.g,(0,n.float)(0))),(0,n.Break)()})}),s.mulAssign(_.div(g));let v=yl.wrap(bl(u,c));(0,n.If)(dl(v.v0,v.v1,v.v2,i),()=>{let e=ul(v.v0,v.v1,v.v2,i);l.assign(s.div((0,n.max)(e,(0,n.float)(1e-10))))}).Else(()=>{let e=(0,n.normalize)((0,n.cross)(v.v1.sub(v.v0),v.v2.sub(v.v0))),i=(0,n.max)((0,n.dot)(r.negate(),e),(0,n.float)(.001)),a=ll(v.v0,v.v1,v.v2),o=t.mul(t),c=s.div((0,n.max)(a,(0,n.float)(1e-10)));l.assign(c.mul(o).div(i))})})}),(0,n.max)(l,Bn)}),Pl=0x8ac7230489e80000,Fl=1e-4,Il=1e-4,Ll=.001;function Rl(e){let{bvhBuffer:t,triangleBuffer:r,materialBuffer:i,envCDFTexture:a,lightBuffer:o,rayBufferRW:s,rngBufferRW:c,hitBufferRO:l,gBufferRW:u,counters:d,activeIndicesRO:f,envTexture:p,environmentIntensity:m,envMatrix:h,enableEnvironmentLight:g,groundProjectionEnabled:_,groundProjectionRadius:v,groundProjectionHeight:y,groundProjectionLevel:b,enableGroundCatcher:x,groundCatcherHeight:S,envTotalSum:C,envCompensationDelta:w,envResolution:T,directionalLightsBuffer:E,numDirectionalLights:D,areaLightsBuffer:O,numAreaLights:k,pointLightsBuffer:A,numPointLights:j,spotLightsBuffer:M,numSpotLights:N,maxBounceCount:P,maxSubsurfaceSteps:F,maxTransparentBounces:I,currentBounce:ee,transparentBackground:L,backgroundIntensity:te,backgroundColor:R,backgroundBlurriness:ne,backgroundBlurSamples:re,showBackground:ie,globalIlluminationIntensity:ae,cameraProjectionMatrix:oe,cameraViewMatrix:se,fireflyThreshold:ce,frame:le,resolution:ue,accumFrame:de,chunkRowBase:me,emissiveTriangleCount:he,emissiveVec4Offset:ge,emissiveTotalPower:_e,emissiveBoost:ve,totalTriangleCount:V,enableEmissiveTriangleSampling:ye,lightBVHNodeCount:be,reverseMapVec4Offset:xe,maxRayCount:Se,auxGBufferEnabled:H}=e,Ce=H.greaterThan((0,n.uint)(0)),we=o!==void 0,Te=(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=pa(o,t,pe(a,(0,n.int)(0),(0,n.int)(z).add(e),i,ue,le).toVar()).toVar();c.addAssign(Ac({tex:p,samp:(0,n.sampler)(p),direction:r,environmentMatrix:h,environmentIntensity:m,enableEnvironmentLight:(0,n.float)(1)}).xyz)}),c.div((0,n.float)(s))};return(0,n.Fn)(()=>{let e=n.instanceIndex;d&&(0,n.If)(e.equal((0,n.uint)(0)),()=>{(0,n.atomicStore)(d.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(d.element((0,n.uint)($.ACTIVE_ENERGY)),(0,n.uint)(0))});let z=d?(0,n.atomicLoad)(d.element((0,n.uint)($.ENTERING_COUNT))):Se;(0,n.If)(e.greaterThanEqual(z),()=>{(0,n.Return)()});let V=f.element(e),H=hs(s,V).toVar();(0,n.If)(H.bitAnd((0,n.uint)($s.ACTIVE)).equal((0,n.uint)(0)),()=>{(0,n.Return)()});let Ee=H.bitAnd((0,n.uint)($s.REDIRECTED)).equal((0,n.uint)(0)).toVar(),De=ps(s,V).toVar(),Oe=ms(s,V).toVar(),ke=gs(s,V).toVar(),Ae=vs(s,V).toVar(),je=V,Me=c.element(V).toVar(),Ne=(0,n.int)(ue.x).toVar(),Pe=(0,n.int)(je).add(me.mul(Ne)),Fe=(0,n.vec2)((0,n.float)(Pe.mod(Ne)).add(.5),(0,n.float)(Pe.div(Ne)).add(.5)),U=(0,n.int)(ee).mul((0,n.int)(32)),Ie=Ws(s,V).toVar(),Le=Ms(l,V).toVar(),ze=Fs(l,V).toVar(),Be=Ps(l,V).toVar(),W=Is(l,V).toVar(),Ve=Ns(l,V).toVar(),He=Ks(s,V).toVar(),Ue=(0,n.int)(ee).toVar(),We=qs(s,V).toVar(),Ge=Js(s,V).toVar();(0,n.If)(Ce.and(He.equal(1)),()=>{let e=se.mul((0,n.vec4)(De,1)).z.abs().mul(Re).add(3);xs(u,je,Ds(s,V).add((0,n.min)(Le,(0,n.float)(1e6))).div((0,n.max)(e,(0,n.float)(1e-4))).clamp(0,1))}),(0,n.If)(x.and(Ue.equal(0)),()=>{let e=Oe.y.toVar();(0,n.If)(e.abs().greaterThan((0,n.float)(Ln)),()=>{let o=S.sub(De.y).div(e).toVar();(0,n.If)(o.greaterThan((0,n.float)(Fl)).and(o.lessThan(Le)),()=>{let e=De.add(Oe.mul(o)).toVar(),l=(0,n.vec3)(0,1,0),d=Oe.negate().toVar(),f=bn.wrap(or()).toVar(),x=Hr(l,pe(Fe,(0,n.int)(0),U.add((0,n.int)(7)),Me,ue,le).toVar()).toVar(),S=x.y.mul(Fn).toVar(),P=(0,n.vec3)(Fn),F=Cn.wrap(Kc(e,l,l,f,d,x,S,P,Ue,Me,Fe,ue,le,U,E,D,O,k,A,j,M,N,t,r,i,p,m,h,a,C,w,T,g,(0,n.bool)(!0))).toVar(),I=(0,n.max)((0,n.dot)(F.shadowed,Vn),(0,n.float)(0)),ee=(0,n.max)((0,n.dot)(F.unoccluded,Vn),(0,n.float)(0)).toVar(),z=(0,n.clamp)(I.div((0,n.max)(ee,(0,n.float)(Il))),0,1).toVar();(0,n.If)(ee.lessThan((0,n.float)(Ll)),()=>{z.assign(1)});let ae=Mc(De,Oe,_,v,y,b).toVar(),ce=(0,n.vec3)(0).toVar();(0,n.If)(ie,()=>{(0,n.If)(ne.greaterThan(0),()=>{ce.assign(Te(ae,ne.mul(1.3),re,Me,Fe))}).Else(()=>{ce.assign(Ac({tex:p,samp:(0,n.sampler)(p),direction:ae,environmentMatrix:h,environmentIntensity:m,enableEnvironmentLight:(0,n.float)(1)}).xyz)})});let de=(0,n.select)(ie,ce.mul(te),R),fe=(0,n.select)(L,(0,n.vec3)(0),de.mul(z)),B=(0,n.select)(L,(0,n.float)(1).sub(z),(0,n.float)(1));(0,n.If)(Ce,()=>{bs(u,je,l,Xc({worldPos:e,cameraProjectionMatrix:oe,cameraViewMatrix:se}),(0,n.vec3)(1))}),js(s,V,(0,n.vec4)(fe,B)),ks(s,V,Oe,H.bitOr((0,n.uint)($s.AUX_LOCKED)).bitAnd((0,n.uint)(~$s.ACTIVE))),c.element(V).assign(Me),(0,n.Return)()})})}),(0,n.If)(Le.greaterThan(Pl),()=>{let e=Ee.and(ie),t=Ee.not().and(g),r=(0,n.vec3)(0).toVar();(0,n.If)(e.or(t),()=>{let e=Oe.toVar();(0,n.If)(Ee,()=>{e.assign(Mc(De,Oe,_,v,y,b))});let t=(0,n.vec3)(0).toVar();(0,n.If)(Ee.and(ne.greaterThan(0)),()=>{t.assign(Te(e,ne.mul(1.3),re,Me,Fe))}).Else(()=>{t.assign(Ac({tex:p,samp:(0,n.sampler)(p),direction:e,environmentMatrix:h,environmentIntensity:m,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)(Ee.not(),()=>{let e=_s(s,V);(0,n.If)(e.greaterThan(0),()=>{let t=Oc(p,Oe,h,C,w,T).w;(0,n.If)(t.greaterThan(0),()=>{i.assign(Xn({pdf1:e,pdf2:t}))})})});let a=(0,n.select)(Ee.not(),ae,(0,n.float)(1)),o=(0,n.select)(Ee,te,i.mul(a)),c=(0,n.select)(Ee,(0,n.float)(0),(0,n.float)(Ue));Ae.assign((0,n.vec4)(Ae.xyz.add(Yc(ke.mul(t).mul(o),c,ce,(0,n.int)(de))),Ae.w))}),(0,n.If)(Ee.and(ie.not()).and(L.not()),()=>{Ae.assign((0,n.vec4)(Ae.xyz.add(ke.mul(R)),Ae.w))}),(0,n.If)(H.bitAnd((0,n.uint)($s.HAS_HIT_OPAQUE)).equal((0,n.uint)(0)),()=>{Ae.w.assign(0)}),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))).and(H.bitAnd((0,n.uint)($s.REDIRECTED)).notEqual((0,n.uint)(0))),()=>{let e=Ss(u,je);bs(u,je,(0,n.normalize)(Oe),ws(e).w,(0,n.clamp)(r.mul(Ie),(0,n.vec3)(0),(0,n.vec3)(1)))}),js(s,V,Ae),ks(s,V,Oe,H.bitAnd((0,n.uint)(~$s.ACTIVE))),(0,n.Return)()});let Ke=De.add(Oe.mul(Le)).toVar(),qe=(0,n.normalize)(ze).toVar(),Je=Rs(s,V),Ye=(0,n.int)(Je.stackDepth).toVar(),Xe=Je.ior1.toVar(),G=Je.ior2.toVar(),K=Je.ior3.toVar(),Ze=(0,n.int)(Je.transTraversals).toVar(),Qe=(0,n.float)(Je.wavelength).toVar();(0,n.If)(Ye.greaterThan(0),()=>{let e=Bs(s,V).toVar(),t=Ys(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(Le).negate()).toVar();ke.mulAssign(t),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{Ie.mulAssign(t)})}).Else(()=>{let t=e.add(r),a=Gr.wrap(Yr(t,r,ke,Le,Me,Fe,ue,le,U)).toVar();ke.mulAssign(a.weight),(0,n.If)(a.didScatter,()=>{let e=pe(Fe,(0,n.int)(0),U.add((0,n.int)(6)),Me,ue,le),t=De.add(Oe.mul(a.t)),r=Jr(Oe,i,e).toVar();We.addAssign(1);let o=(0,n.clamp)((0,n.max)((0,n.max)(ke.x,ke.y),ke.z),.02,1).toVar();(0,n.If)(We.greaterThanEqual(F).or(B(Fe,(0,n.int)(0),U.add((0,n.int)(12)),Me,ue,le).greaterThan(o)).toVar(),()=>{js(s,V,Ae),ks(s,V,Oe,H.bitAnd((0,n.uint)(~$s.ACTIVE))),c.element(V).assign(Me),(0,n.Return)()}),ke.divAssign(o),H.assign(H.bitOr((0,n.uint)($s.REDIRECTED))),Os(s,V,t,He,We,Ge),ks(s,V,r,H),As(s,V,ke,_s(s,V)),js(s,V,Ae),c.element(V).assign(Me),(0,n.Return)()})})});let q=bn.wrap(ar((0,n.int)(W),i)).toVar(),$e=Be.toVar(),et=qe.toVar();(0,n.If)(q.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(q.displacementScale.greaterThan(0)),()=>{let e=yn({origin:De,direction:Oe}),t=wn({didHit:!0,dst:Le,hitPoint:Ke,normal:qe,uv:Be,materialIndex:(0,n.int)(W),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(Ve),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),i=il.wrap(al(e,t,r,q,Ue)).toVar();$e.assign(i.uv),et.assign(i.normal),Ke.assign(i.hitPoint)});let tt=(0,n.vec4)(0).toVar();(0,n.If)(q.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{tt.assign(ki(r,(0,n.int)(Ve),qe,q.normalTransform))});let nt=An.wrap(Fi(q,$e,qe,tt)).toVar(),rt=nt.roughness.toVar();q.color.assign(nt.albedo),q.metalness.assign(nt.metalness.clamp(0,1)),q.roughness.assign(nt.roughness.clamp(.05,1)),q.sheenRoughness.assign(q.sheenRoughness.clamp(.05,1));let it=Si({uv:$e,transform:q.albedoTransform}).toVar();(0,n.If)(q.anisotropyMapIndex.greaterThanEqual((0,n.int)(0)),()=>{let e=Mi(q,it).toVar();q.anisotropy.assign(e.x),q.anisotropyRotation.assign(e.y)});let at=xn.wrap(Ni(q,it)).toVar();q.transmission.assign(at.transmission),q.clearcoat.assign(at.clearcoat),q.clearcoatRoughness.assign(at.clearcoatRoughness),q.sheenColor.assign(at.sheenColor),q.sheenRoughness.assign(at.sheenRoughness),q.iridescence.assign(at.iridescence),q.iridescenceThicknessRange.assign((0,n.vec2)(q.iridescenceThicknessRange.x,at.iridescenceThickness)),q.specularIntensity.assign(at.specularIntensity),q.specularColor.assign(at.specularColor);let ot=nt.albedo.toVar();(0,n.If)(q.displacementMapIndex.greaterThanEqual((0,n.int)(0)).and(q.displacementScale.greaterThan(0)),()=>{qe.assign((0,n.normalize)(et.add(nt.normal.sub((0,n.normalize)(ze)))))}).Else(()=>{qe.assign(nt.normal)});let st=q.metalness.toVar(),ct=q.transmission.toVar(),lt=(0,n.smoothstep)((0,n.float)(0),(0,n.float)(.15),rt).toVar(),ut=(0,n.clamp)((0,n.float)(1).sub(st).mul((0,n.float)(1).sub(ct)).add(lt.mul(st.mul((0,n.float)(1).sub(ct)).add(ct))),0,1).greaterThanEqual((0,n.float)(.25)).toVar(),dt=Ie.toVar(),ft=e=>{(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let t=ws(Ss(u,je)).w;bs(u,je,e,t,(0,n.clamp)(ot.mul(dt),(0,n.vec3)(0),(0,n.vec3)(1)))})},pt=()=>{js(s,V,Ae),ks(s,V,Oe,H.bitAnd((0,n.uint)(~$s.ACTIVE))),c.element(V).assign(Me)};(0,n.If)(Ue.equal(0).and(Ce),()=>{let e=Xc({worldPos:Ke,cameraProjectionMatrix:oe,cameraViewMatrix:se});bs(u,je,(0,n.vec3)(0,0,1),e,(0,n.vec3)(0))});let mt=(0,n.float)(1).toVar(),ht=(0,n.float)(1).toVar();(0,n.If)(Ye.equal(1),()=>{mt.assign(Xe)}).ElseIf(Ye.equal(2),()=>{mt.assign(G),ht.assign(Xe)}).ElseIf(Ye.equal(3),()=>{mt.assign(K),ht.assign(G)});let gt=yn({origin:De,direction:Oe}),_t=$r.wrap(li(gt,qe,q,Me,Fe,ue,le,U,(0,n.int)(Ze),mt,ht,Qe)).toVar();Qe.assign(_t.pathWavelength),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=ws(Ss(u,je)).w,t=(0,n.select)((0,n.dot)(qe,Oe.negate()).lessThan(0),qe.negate(),qe).toVar(),r=(0,n.clamp)(ot.mul(dt),(0,n.vec3)(0),(0,n.vec3)(1)).toVar();(0,n.If)(q.alphaMode.equal((0,n.int)(2)),()=>{bs(u,je,t,e,r),H.assign(H.bitOr((0,n.uint)($s.AUX_LOCKED)))}).ElseIf(_t.isAlphaSkip,()=>{}).ElseIf(_t.isSubsurface,()=>{bs(u,je,t,e,r),H.assign(H.bitOr((0,n.uint)($s.AUX_LOCKED)))}).ElseIf(_t.isTransmissive,()=>{(0,n.If)(ut.or(q.dispersion.greaterThan(0)),()=>{bs(u,je,t,e,r),H.assign(H.bitOr((0,n.uint)($s.AUX_LOCKED)))}).Else(()=>{Ie.mulAssign((0,n.clamp)(ot,(0,n.vec3)(0),(0,n.vec3)(1)))})})}),(0,n.If)(_t.continueRay,()=>{(0,n.If)(_t.isTransmissive.and(_t.didReflect.not()),()=>{(0,n.If)(_t.entering,()=>{(0,n.If)(Ye.lessThan(3),()=>{Ye.addAssign(1),(0,n.If)(Ye.equal(1),()=>{Xe.assign(q.ior)}),(0,n.If)(Ye.equal(2),()=>{G.assign(q.ior)}),(0,n.If)(Ye.equal(3),()=>{K.assign(q.ior)}),Vs(s,V,(0,n.select)(q.attenuationDistance.greaterThan(0),(0,n.log)((0,n.max)(q.attenuationColor,(0,n.vec3)(.001))).negate().div(q.attenuationDistance),(0,n.vec3)(0))),Xs(s,V,(0,n.vec3)(0),(0,n.float)(0))})}).Else(()=>{(0,n.If)(Ye.greaterThan(0),()=>{Ye.subAssign(1)})})}),(0,n.If)(_t.isSubsurface.and(_t.didReflect.not()),()=>{(0,n.If)(_t.entering,()=>{(0,n.If)(Ye.lessThan(3),()=>{Ye.addAssign(1),(0,n.If)(Ye.equal(1),()=>{Xe.assign(q.ior)}),(0,n.If)(Ye.equal(2),()=>{G.assign(q.ior)}),(0,n.If)(Ye.equal(3),()=>{K.assign(q.ior)});let e=Kr.wrap(Xr(q.subsurfaceColor,q.subsurfaceRadius,q.subsurfaceRadiusScale)).toVar();Vs(s,V,e.sigmaT.sub(e.sigmaS)),Xs(s,V,e.sigmaS,(0,n.clamp)(q.subsurfaceAnisotropy,-.99,.99))})}).Else(()=>{(0,n.If)(Ye.greaterThan(0),()=>{Ye.subAssign(1)})})}),(0,n.If)(_t.isTransmissive.and(Ze.greaterThan(0)),()=>{Ze.subAssign(1)}),ke.mulAssign(_t.throughput);let e=(0,n.select)(_t.entering,qe,qe.negate()),t=(0,n.select)(_t.didReflect,e,Oe),r=Ke.add(t.mul(.001));(0,n.If)(_t.isAlphaSkip.not(),()=>{H.assign(H.bitOr((0,n.uint)($s.REDIRECTED)))}).Else(()=>{Ge.addAssign(1),(0,n.If)(Ge.greaterThan(I),()=>{ft((0,n.select)((0,n.dot)(qe,Oe.negate()).lessThan(0),qe.negate(),qe)),pt(),(0,n.Return)()})}),Os(s,V,r,He,We,Ge,(0,n.select)(_t.isAlphaSkip,Ds(s,V).add(Le),(0,n.float)(0))),ks(s,V,_t.direction,H),As(s,V,ke,_s(s,V)),js(s,V,Ae),zs(s,V,(0,n.uint)(Ye),(0,n.uint)(Ze),Xe,G,K,(0,n.uint)(Qe.add(.5))),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{Gs(s,V,Ie)}),c.element(V).assign(Me),(0,n.Return)()}),H.assign(H.bitOr((0,n.uint)($s.HAS_HIT_OPAQUE|$s.REDIRECTED)));let vt=nt.emissive.toVar();(0,n.If)((0,n.length)(vt).greaterThan(0),()=>{let e=(0,n.select)(Ee.not(),ae,(0,n.float)(1)),t=(0,n.float)(1).toVar();we&&(0,n.If)(ye.equal((0,n.int)(1)).and(he.greaterThan((0,n.int)(0))).and(Ue.greaterThan(0)),()=>{let e=_s(s,V);(0,n.If)(e.greaterThan(0),()=>{let a=Ds(s,V).toVar(),c=De.sub(Oe.mul(a)).toVar(),l=Le.add(a).toVar(),u=(0,n.float)(0).toVar();(0,n.If)(be.greaterThan((0,n.int)(0)),()=>{u.assign(Nl((0,n.int)(Ve),l,Oe,c,o,ge,xe,r))}).Else(()=>{u.assign(xl((0,n.int)(Ve),l,Oe,c,r,i,_e))}),t.assign(Yn({pdf1:e,pdf2:u}))})}),Ae.assign((0,n.vec4)(Ae.xyz.add(Yc(vt.mul(ke).mul(e).mul(t),(0,n.float)(Ue),ce,(0,n.int)(de))),Ae.w))});let yt=Oe.negate().toVar(),J=(0,n.normalize)(ze),bt=(0,n.select)((0,n.dot)(J,yt).lessThan(0),J.negate(),J).toVar();(0,n.If)((0,n.dot)(J,yt).lessThan(0),()=>{qe.assign(qe.negate())}),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{let e=ws(Ss(u,je)).w;(0,n.If)(ut,()=>{bs(u,je,qe,e,(0,n.clamp)(ot.mul(dt),(0,n.vec3)(0),(0,n.vec3)(1))),H.assign(H.bitOr((0,n.uint)($s.AUX_LOCKED)))}).Else(()=>{let e=(0,n.max)((0,n.dot)(qe,yt),(0,n.float)(.001)),t=(0,n.clamp)((0,n.mix)(hr(q.ior).mul(q.specularColor),ot,q.metalness).mul(q.specularIntensity),(0,n.vec3)(0),(0,n.vec3)(1));Ie.mulAssign(kn.wrap(Dr(t,e,(0,n.max)(rt,(0,n.float)(.02)))).E_total)})});let xt=jn.wrap(rr(q.metalness,q.roughness,q.transmission,q.clearcoat,q.emissive,q.subsurface)).toVar(),St=fe(Fe,(0,n.int)(0),Ue,Me,(0,n.int)(-1),ue,le).toVar(),Ct=B(Fe,(0,n.int)(0),U.add((0,n.int)(2)),Me,ue,le).toVar(),wt=En({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)}),Tt=Nn({invRoughness:(0,n.float)(0),metalFactor:(0,n.float)(.5),iorFactor:(0,n.float)(.67),maxSheenColor:(0,n.float)(0)}),Et=(0,n.vec3)(0).toVar(),Dt=(0,n.vec3)(0).toVar(),Ot=(0,n.float)(0).toVar(),kt=(0,n.bool)(!1).toVar(),At=(0,n.vec3)(1).toVar();(0,n.If)(q.clearcoat.greaterThan(0),()=>{let e=yn({origin:De,direction:Oe}),t=wn({didHit:!0,dst:Le,hitPoint:Ke,normal:qe,uv:Be,materialIndex:(0,n.int)(W),meshIndex:(0,n.int)(0),triangleIndex:(0,n.int)(0),boxTests:(0,n.int)(0),triTests:(0,n.int)(0)}),r=Qc.wrap($c(e,t,q,St,Me,Fe,ue,le,U));Et.assign(r.L),Dt.assign(r.brdf),Ot.assign(r.pdf)}).Else(()=>{let e=Tn.wrap(Jc(yt,qe,q,St,Ct,Me,Fe,ue,le,U,xt,!1,wt,!1,Tt));Et.assign(e.direction),Dt.assign(e.value),Ot.assign(e.pdf),kt.assign(e.isTransmission),At.assign(e.colorWeight)});let jt=Cn.wrap(Kc(Ke,qe,bt,q,yt,Et,Ot,Dt,Ue,Me,Fe,ue,le,U,E,D,O,k,A,j,M,N,t,r,i,p,m,h,a,C,w,T,g,(0,n.bool)(!1))).shadowed.toVar(),Mt=(0,n.select)(Ue.greaterThan(0),ae,(0,n.float)(1));Ae.assign((0,n.vec4)(Ae.xyz.add(Yc(ke.mul(jt).mul(Mt),(0,n.float)(Ue),ce,(0,n.int)(de))),Ae.w)),we&&(0,n.If)(ye.equal((0,n.int)(1)).and(he.greaterThan((0,n.int)(0))),()=>{let e=(0,n.Fn)(([e,n,a])=>Vi(e,n,a,wc,t,r,i));(0,n.If)(be.greaterThan((0,n.int)(0)),()=>{let t=ol.wrap(Ml(Ke,qe,Me,Fe,ue,le,U,o,o,ge,r));(0,n.If)(t.valid.and(t.pdf.greaterThan(0)),()=>{let r=(0,n.max)((0,n.float)(0),(0,n.dot)(qe,t.direction));(0,n.If)(r.greaterThan(0).and((0,n.dot)(t.direction,bt).greaterThan(0)),()=>{let i=Hi(Ke,bt,q),a=Ke.add(i),o=t.distance.sub(.001),s=e(a,t.direction,o);(0,n.If)(s.greaterThan(0),()=>{let e=Pc(yt,t.direction,qe,q),i=Gc(yt,t.direction,qe,q),a=(0,n.select)(i.greaterThan(0),Yn({pdf1:t.pdf,pdf2:i}),(0,n.float)(1)),o=t.emission.mul(e).mul(r).div(t.pdf).mul(s).mul(ve).mul(a);Ae.assign((0,n.vec4)(Ae.xyz.add(Yc(o.mul(ke).mul(Mt),(0,n.float)(Ue),ce,(0,n.int)(de))),Ae.w))})})})}).Else(()=>{let t=Tl(Ke,qe,bt,yt,q,Ue,Me,Fe,ue,le,U,ve,o,ge,he,_e,r,e,Hi);Ae.assign((0,n.vec4)(Ae.xyz.add(Yc(t.mul(ke).mul(Mt),(0,n.float)(Ue),ce,(0,n.int)(de))),Ae.w))})});let Nt=Qi.wrap(qc(qe,q,Et,Ot,Dt,kt,At,Me,Fe,ue,le,U)).toVar(),Pt=Nt.direction.toVar();(0,n.If)(kt.not().and((0,n.dot)(Pt,bt).lessThanEqual(0)),()=>{ft(qe),pt(),(0,n.Return)()});let Ft=(0,n.max)(Nt.combinedPdf,.001).toVar();ke.mulAssign(Nt.throughput);let It=Zc(Ue,ke,xt,Pt,Me,Fe,ue,le,U,g).toVar();(0,n.If)(It.lessThanEqual(0),()=>{ft(qe),pt(),(0,n.Return)()}),ke.divAssign(It),(0,n.If)(He.greaterThanEqual(P),()=>{ft(qe),pt(),(0,n.Return)()}),Os(s,V,Ke.add(qe.mul(.001)),He.add(1),We,Ge),ks(s,V,Pt,H),As(s,V,ke,Ft),js(s,V,Ae),zs(s,V,(0,n.uint)(Ye),(0,n.uint)(Ze),Xe,G,K,(0,n.uint)(Qe.add(.5))),(0,n.If)(Ce.and(H.bitAnd((0,n.uint)($s.AUX_LOCKED)).equal((0,n.uint)(0))),()=>{Gs(s,V,Ie)}),c.element(V).assign(Me)})}var zl=(e,t)=>{let r=gs(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)(Qs))};function Bl(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)(hs(t,c).bitAnd((0,n.uint)($s.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)),zl(t,c))})})}function Vl(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=hs(t,l),d=c.and(u.bitAnd((0,n.uint)($s.ACTIVE)).notEqual((0,n.uint)(0))),f=(0,n.select)(d,(0,n.uint)(1),(0,n.uint)(0)),p=(0,n.select)(d,zl(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 Hl=(0,n.wgslFn)(`
|
|
632
632
|
fn nanInfToRed( c: vec3f ) -> vec3f {
|
|
633
633
|
let isNan = c.x != c.x || c.y != c.y || c.z != c.z;
|
|
634
634
|
let isInf = abs( c.x ) > 1e30f || abs( c.y ) > 1e30f || abs( c.z ) > 1e30f;
|
|
635
635
|
if ( isNan || isInf ) { return vec3f( 1.0f, 0.0f, 0.0f ); }
|
|
636
636
|
return vec3f( 0.0f );
|
|
637
637
|
}
|
|
638
|
-
`);function
|
|
638
|
+
`);function Ul(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)),ee=k.greaterThan((0,n.int)(0)),L=I.or(ee).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=vs(t,w),N=k.xyz.toVar(),te=(0,n.select)(h,k.w,(0,n.float)(1)).toVar(),R=ee.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=Ss(r,w);ne.assign(ws(e)),re.assign((0,n.vec4)(Ts(e),0).xyz),z.assign(Cs(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)(R,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,()=>{te.assign((0,n.select)(R,e.w,(0,n.mix)(e.w,k.w,d)))})}),(0,n.If)(L,()=>{let e=Jn(k.xyz),t=T.element(E).toVar(),r=(0,n.select)(R,t,(0,n.mix)(t,e.mul(e),d)).toVar();T.element(E).assign(r);let i=Jn(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(ee),()=>{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)(ee,()=>{(0,n.If)(c.equal((0,n.uint)(0)),()=>{a.assign((0,n.uint)(0))}),(0,n.If)(R.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(Hl(N))});let ae=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(x));(0,n.textureStore)(i,ae,(0,n.vec4)(N,te)).toWriteOnly(),(0,n.If)(P,()=>{(0,n.textureStore)(a,ae,ne).toWriteOnly(),(0,n.textureStore)(o,ae,(0,n.vec4)(re,z)).toWriteOnly()})})})}var Wl=(0,n.wgslFn)(`
|
|
639
639
|
fn visualizeDepth( depth: f32 ) -> vec3f {
|
|
640
640
|
return vec3f( 1.0f - depth );
|
|
641
641
|
}
|
|
642
|
-
`),
|
|
642
|
+
`),Gl=(0,n.wgslFn)(`
|
|
643
643
|
fn visualizeNormal( normal: vec3f ) -> vec3f {
|
|
644
644
|
return normal * 0.5f + 0.5f;
|
|
645
645
|
}
|
|
646
|
-
`),
|
|
646
|
+
`),Kl=(0,n.wgslFn)(`
|
|
647
647
|
fn computeNDCDepthLocal( worldPos: vec3f, cameraProjectionMatrix: mat4x4f, cameraViewMatrix: mat4x4f ) -> f32 {
|
|
648
648
|
let clipPos = cameraProjectionMatrix * cameraViewMatrix * vec4f( worldPos, 1.0f );
|
|
649
649
|
let ndcDepth = clipPos.z / clipPos.w * 0.5f + 0.5f;
|
|
650
650
|
return clamp( ndcDepth, 0.0f, 1.0f );
|
|
651
651
|
}
|
|
652
|
-
`),ml=(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=mn({origin:e,direction:t}),y=yn.wrap(Ws(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=Zs({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).toVar(),r=(0,n.dot)(e.xyz,In).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=hn.wrap(Zn(y.materialIndex,a)).toVar(),r=Tn.wrap(Di(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=hn.wrap(Zn(y.materialIndex,a)).toVar(),t=(0,n.normalize)(Tn.wrap(Di(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().normal);_.assign((0,n.vec4)(fl({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=pl({worldPos:y.hitPoint,cameraProjectionMatrix:m,cameraViewMatrix:h});_.assign((0,n.vec4)(dl({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=hn.wrap(Zn(y.materialIndex,a)).toVar(),t=Tn.wrap(Di(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=hn.wrap(Zn(y.materialIndex,a)).toVar(),t=Tn.wrap(Di(e,y.uv,y.normal,(0,n.vec4)(0))).toVar(),u=t.albedo.rgb,d=(0,n.normalize)(t.normal).toVar(),p=ee({state:te({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=Pr({N:d,xi:(0,n.vec2)(re(p).toVar(),re(p).toVar())}).toVar(),h=mn({origin:y.hitPoint.add(d.mul(.001)),direction:m}),v=yn.wrap(Ws(h,r,i).toVar()),b=(0,n.vec3)(0).toVar();(0,n.If)(v.didHit.not(),()=>{(0,n.If)(l,()=>{b.assign(Zs({tex:o,samp:(0,n.sampler)(o),direction:m,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz)})}).Else(()=>{let e=hn.wrap(Zn(v.materialIndex,a)).toVar(),t=Tn.wrap(Di(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=Zs({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=Zs({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=Zs({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 hl(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,sceneScale:b,apertureScale:x,anamorphicRatio:S,bvhBuffer:C,triangleBuffer:w,materialBuffer:T,envTexture:E,environmentMatrix:D,environmentIntensity:O,enableEnvironmentLight:k,visMode:A,debugVisScale:j,frame:M}=e;return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),N=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(o).and(N.lessThan(s)),()=>{let o=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(N).add(.5)),s=ee({state:(0,n.uint)(N.mul((0,n.int)(a.x)).add(e)).add((0,n.uint)(1))}).toVar(),P=mn.wrap(js(o.div(a),s,c,l,f,p,m,h,g,_,v,y,b,x,S)),F=(0,n.vec4)(1,0,1,1).toVar();(0,n.If)(A.equal((0,n.int)(9)),()=>{let e=_e(o,(0,n.int)(0),(0,n.int)(1),s,a,M);F.assign((0,n.vec4)(e,1,1))}).Else(()=>{F.assign(ml(P.origin,P.direction,C,w,T,E,D,O,k,A,j,o,a,u,d,M))});let I=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(N));(0,n.textureStore)(t,I,F).toWriteOnly(),(0,n.textureStore)(r,I,(0,n.vec4)(.5,.5,1,1)).toWriteOnly(),(0,n.textureStore)(i,I,(0,n.vec4)(F.xyz,1)).toWriteOnly()})})}function gl({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 _l({hitBufferRO:e,activeIndicesReadRO:t,sortGlobalHistogram:r,counters:i,bins:a=256}){return(0,n.Fn)(()=>{let o=n.instanceIndex,s=n.localId.x,c=E(`uint`,a);(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)(Q.ENTERING_COUNT)));(0,n.If)(o.lessThan(l),()=>{let r=(0,n.uint)(is(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 vl({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 yl({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=E(`uint`,o);(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)(Q.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)(is(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)})})}var bl=K(`wavefront`),xl=256,Sl=[`extend`,`shade`,`globalHist`,`globalScatter`,`compact`,`compactCopyback`],Cl=class extends Ao{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._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 Ds(this.renderer),this._registerVRAMProviders(),bl.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.triangleStorageAttr,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._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=s+this.transmissiveBounces.value+this.maxSubsurfaceSteps.value,l=this._wfRenderHeight.value,u=this._chunkRows,d=this._numChunks<=1,f=this._lastBounceCounts,p=d&&f?s<=this._lastBounceCountsBudget?c+1:this._lastBounceCountsBudget: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 m=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<p&&f[n]!==void 0?r=f[n]:p>0&&(r=f[p-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 Sl)o.setDispatchForCount(e,n)}else{o.dispatch(`enterFull`);for(let e of Sl)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<p&&e<c&&m?.[e]!==void 0&&m[e]<=h)break}o.dispatch(`finalWrite`)}this._maybeReadbackCounters(),this.storageTextures.copyToReadTargets(this.renderer,this._auxGBufferEnabled);let m=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,m),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}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}_maybeReadbackCounters(){if(this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()){this._readbackFrameCounter=this._readbackEveryNFrames;return}if(this._readbackPending||(this.maxBounces.value!==this._lastBounceCountsBudget&&(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._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,r),this._lastBounceEnergy=t.subarray(r,2*r),this._lastBounceCountsBudget=n,this._curveSizingValid=!0}this._readbackPending=!1}).catch(e=>{bl.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[Q.CONVERGED_COUNT]/n;let r=t[Q.GEOMETRY_COUNT];this._geometryPixelCount=r,this._convergedGeometryFraction=r>0?t[Q.CONVERGED_GEOMETRY_COUNT]/r:1,this._lastActivePixelCount=t[Q.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&&(fi(e.srgbBuckets,n.srgbBuckets),fi(e.linearBuckets,n.linearBuckets))}_rebuildKernelsIfResized(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;n===e&&r===t||!(this.materialData?.materialCount>0)||(this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-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/176),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,V),t=Math.min(this.storageTextures.renderHeight||1,V);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 r=this.storageTextures.renderWidth,i=this.storageTextures.renderHeight;this._pathBudget||=this._computePathBudget();let a=this._pathBudget;this._updateChunkLayout();let o=this._chunkRows*r;this._packedBuffers?this._packedBuffers.resize(a):this._packedBuffers=new Io(a,this.renderer);let s=a*1;Fo(this.renderer,this._gBufferAttr),this._gBufferAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(s*4),4);let c=(0,n.storage)(this._gBufferAttr,`uvec4`),l=(0,n.storage)(this._gBufferAttr,`uvec4`).toReadOnly(),u=V*V;(!this._m2Attr||this._m2Attr.count<u)&&(Fo(this.renderer,this._m2Attr),this._m2Attr=new t.StorageInstancedBufferAttribute(new Float32Array(u),1),Fo(this.renderer,this._streakAttr),this._streakAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(u),1),Fo(this.renderer,this._frozenMaskAttr),this._frozenMaskAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(u),1));let d=(0,n.storage)(this._m2Attr,`float`),f=(0,n.storage)(this._streakAttr,`uint`),p=(0,n.storage)(this._streakAttr,`uint`).toReadOnly(),m=(0,n.storage)(this._frozenMaskAttr,`uint`),h=(0,n.storage)(this._frozenMaskAttr,`uint`).toReadOnly();this._queueManager?this._queueManager.resize(this._packedBuffers.capacity):this._queueManager=new xs(this._packedBuffers.capacity,this.renderer),this._kernelManager||=new ks(this.renderer);let g=this._packedBuffers,_=this._queueManager;this._wfRenderWidth.value=r,this._wfRenderHeight.value=i,this._wfMaxRayCount.value=Math.min(a,this._chunkRows*r);let v=this.shaderBuilder.prevColorTexNode,y=this.shaderBuilder.prevAlbedoTexNode,b=this.shaderBuilder.prevNormalDepthTexNode,x=this.storageTextures.getWriteTextures(),S=_.getCounters(),C=_.getBounceCounts(),w=this._wfCurrentBounce,T=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(S.element((0,n.uint)(Q.ACTIVE_RAY_COUNT))),t=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS-1));C.element(t).assign(e),C.element(t.add((0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(S.element((0,n.uint)(Q.ACTIVE_ENERGY)))),(0,n.atomicStore)(S.element((0,n.uint)(Q.ENTERING_COUNT)),e)});this._kernelManager.register(`snapshotBounceCount`,T().compute([1,1,1],[1,1,1]));let E=_.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)(S.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)),this._wfMaxRayCount),(0,n.atomicStore)(S.element((0,n.uint)(Q.ENTERING_COUNT)),this._wfMaxRayCount),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(S.element((0,n.uint)(Q.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)(Q.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)(Q.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})})});this._kernelManager.register(`initActiveIndices`,D().compute([Math.ceil(this._chunkRows*r/xl),1,1],[xl,1,1]));let O={rayBufferRW:g.rayBuffer.rw,rngBufferRW:g.rngBuffer.rw,gBufferRW:c,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,sceneScale:this.sceneScale,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows,transmissiveBounces:this.transmissiveBounces,transparentBackground:this.transparentBackground,auxGBufferEnabled:this._auxGBufferUniform},k=Ms(O);this._kernelManager.register(`generate`,k().compute([Math.ceil(r/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let A=this.pixelFreezeStability,j=(0,n.Fn)(()=>{(0,n.atomicStore)(S.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(S.element((0,n.uint)(Q.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)(Q.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)(Q.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(p.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)(p.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))})})}})}),m.element(t).assign(r),(0,n.If)(r.equal((0,n.uint)(0)),()=>{let t=(0,n.atomicAdd)(S.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)),(0,n.uint)(1));E.element(t).assign(e)})})});this._kernelManager.register(`buildActivePixels`,M().compute([Math.ceil(this._chunkRows*r/xl),1,1],[xl,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=p.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)(p.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)(S.element((0,n.uint)(Q.CONVERGED_COUNT)),(0,n.uint)(1))}),(0,n.If)(l,()=>{(0,n.atomicAdd)(S.element((0,n.uint)(Q.GEOMETRY_COUNT)),(0,n.uint)(1)),(0,n.If)(u,()=>{(0,n.atomicAdd)(S.element((0,n.uint)(Q.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(1))})})})});this._kernelManager.register(`countConvergedDilated`,N().compute([Math.ceil(r*i/xl),1,1],[xl,1,1]));let P=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(S.element((0,n.uint)(Q.ACTIVE_RAY_COUNT)));(0,n.atomicStore)(S.element((0,n.uint)(Q.ENTERING_COUNT)),e),(0,n.atomicStore)(S.element((0,n.uint)(Q.ACTIVE_PIXEL_COUNT)),e)});this._kernelManager.register(`seedEnter`,P().compute([1,1,1],[1,1,1]));let F=Ms({...O,listDriven:!0,activeIndicesRO:_.activeIndicesRO.a,counters:S});this._kernelManager.register(`generateList`,F().compute([Math.ceil(o/xl),1,1],[xl,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,ae=di(re.srgbBuckets),oe=di(re.linearBuckets);ai(ae,oe),ji(ae);let se=ie.environmentTexture?(0,n.texture)(ie.environmentTexture):e.envTex;this._wfTexNodes={envTex:se,envCDFTex:te,srgbBuckets:ae,linearBuckets:oe},this._sortMaterials=(B.wavefrontSortMaterials??!1)&&(this.materialData?.materialCount??0)>8;let ce=Ks({bvhBuffer:I,triangleBuffer:L,rayBufferRO:g.rayBuffer.ro,hitBufferRW:g.hitBuffer.rw,activeIndicesRO:_.getActiveReadRO(),counters:S,maxRayCount:this._wfMaxRayCount});if(this._kernelManager.register(`extend`,ce().compute([Math.ceil(o/256),1,1],[256,1,1])),this._sortMaterials){let e=_.getSortGlobalHistogram(),t=Math.min(256,this.materialData?.materialCount??256);this._kernelManager.register(`resetGlobalHist`,gl({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[256,1,1])),this._kernelManager.register(`globalHist`,_l({hitBufferRO:g.hitBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),sortGlobalHistogram:e,counters:S,bins:t})().compute([Math.ceil(o/256),1,1],[256,1,1])),this._kernelManager.register(`globalPrefix`,vl({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[1,1,1])),this._kernelManager.register(`globalScatter`,yl({hitBufferRO:g.hitBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),sortedIndicesRW:_.getSortedRW(),sortGlobalHistogram:e,counters:S,bins:t})().compute([Math.ceil(o/256),1,1],[256,1,1]))}let le=al({gBufferRW:c,envCompensationDelta:this.envCompensationDelta,bvhBuffer:I,triangleBuffer:L,materialBuffer:ee,envCDFTexture:te,lightBuffer:ne,rayBufferRW:g.rayBuffer.rw,rngBufferRW:g.rngBuffer.rw,hitBufferRO:g.hitBuffer.ro,counters:S,activeIndicesRO:this._sortMaterials?_.getSortedRO():_.getActiveReadRO(),envTexture:se,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,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});this._kernelManager.register(`shade`,le().compute([Math.ceil(o/256),1,1],[256,1,1]));let ue=this._useSubgroupCompact&&(this.renderer.hasFeature?this.renderer.hasFeature(`subgroups`):!1);this._compactIsSubgroup=ue;let de=(ue?cl:sl)({rayBufferRO:g.rayBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),activeIndicesWriteRW:_.getActiveWrite(),counters:S,currentActiveCount:this._wfMaxRayCount});this._kernelManager.register(`compact`,de().compute([Math.ceil(o/256),1,1],[256,1,1]));let fe=(0,n.Fn)(()=>{(0,n.atomicStore)(S.element((0,n.uint)(Q.ENTERING_COUNT)),this._wfMaxRayCount)});this._kernelManager.register(`enterFull`,fe().compute([1,1,1],[1,1,1]));let pe=_.activeIndicesRO.b,me=_.activeIndices.a,he=(0,n.Fn)(()=>{let e=n.instanceIndex,t=(0,n.atomicLoad)(S.element((0,n.uint)(Q.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)(_.MAX_BOUNCE_SNAPSHOTS-1));C.element(e).assign(t),C.element(e.add((0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(S.element((0,n.uint)(Q.ACTIVE_ENERGY)))),(0,n.atomicStore)(S.element((0,n.uint)(Q.ENTERING_COUNT)),t)}),(0,n.If)(e.greaterThanEqual(t),()=>{(0,n.Return)()}),me.element(e).assign(pe.element(e))});this._kernelManager.register(`compactCopyback`,he().compute([Math.ceil(o/xl),1,1],[xl,1,1]));let ge=ul({rayBufferRO:g.rayBuffer.ro,gBufferRO:l,writeColorTex:x.color,writeNDTex:x.normalDepth,writeAlbedoTex:x.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:v,prevAlbedoTexture:y,prevNormalDepthTexture:b,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,visMode:this.visMode,auxGBufferEnabled:this._auxGBufferUniform,cleanAuxNormalEnabled:this._cleanAuxNormalUniform,m2BufferRW:d,useAdaptiveSampling:this.useAdaptiveSampling,noiseThreshold:this.noiseThreshold,adaptiveMinSamples:this.adaptiveMinSamples,usePixelFreeze:this.usePixelFreeze,pixelFreezeThreshold:this.pixelFreezeThreshold,streakBufferRW:f,frozenMaskRO:h,convergenceOverlay:this.convergenceOverlay,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows});this._kernelManager.register(`finalWrite`,ge().compute([Math.ceil(r/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let _e=hl({writeColorTex:x.color,writeNDTex:x.normalDepth,writeAlbedoTex:x.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,sceneScale:this.sceneScale,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,bvhBuffer:I,triangleBuffer:L,materialBuffer:ee,envTexture:se,environmentMatrix:this.environmentMatrix,environmentIntensity:this.environmentIntensity,enableEnvironmentLight:this.enableEnvironment,visMode:this.visMode,debugVisScale:this.debugVisScale,frame:this.frame});this._kernelManager.register(`debug`,_e().compute([Math.ceil(r/16),Math.ceil(i/16),1],[16,16,1])),this._wavefrontReady=!0;let ve=(this._packedBuffers?.totalBytes??0)+(this._queueManager?.totalBytes??0);bl.info(G.list([G.px(r,i),`${G.mb(ve)} wavefront buffers`,`budget ${G.n(a)} 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}},wl=class extends be{constructor(e,i={}){super(`NormalDepth`,{...i,executionMode:ye.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.cameraProjection=(0,n.uniform)(0,`int`),this.panoLonRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLatRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLevelHorizon=(0,n.uniform)(1,`int`),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(V,V),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(V,V),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._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.triangleStorageAttr&&e.triangleStorageAttr!==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.triangleStorageAttr&&!this._triStorageNode&&(this._triStorageNode=(0,n.storage)(e.triangleStorageAttr,`vec4`,e.triangleStorageAttr.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&&fi(this._linearBuckets,e.materialData?.linearBuckets),this._lastTriAttr=e.triangleStorageAttr||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=di(this.pathTracer?.materialData?.linearBuckets),ai(di(null),this._linearBuckets);let i=this.cameraWorldMatrix,a=this.cameraProjectionMatrixInverse,o=this.resolutionWidth,s=this.resolutionHeight,c=this._outputStorageTex,l=this._shadingStorageTex;this._computeNode=(0,n.Fn)(([i,a])=>{let u=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),d=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(u.lessThan((0,n.int)(o)).and(d.lessThan((0,n.int)(s))),()=>{let f=As((0,n.vec2)((0,n.float)(u).add(.5).div(o),(0,n.float)(d).add(.5).div(s)),i,a,this.cameraProjection,this.panoLonRange,this.panoLatRange,this.panoLevelHorizon),p=mn({origin:(0,n.vec3)(i[3]),direction:f}),m=yn.wrap(Us(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)(u),(0,n.uint)(d)),_).toWriteOnly();let v=m.normal.toVar();(0,n.If)(m.didHit,()=>{let t=hn.wrap(Zn(m.materialIndex,r)).toVar(),i=Dn.wrap(_i(m.uv,t)).toVar(),a=(0,n.vec4)(0).toVar();(0,n.If)(t.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{a.assign(xi(e,m.triangleIndex,m.normal,t.normalTransform))});let o=Si(m.normal,t,i,a).toVar();v.assign(Ci(o,t,i))});let y=m.didHit.select((0,n.vec4)(v.mul(.5).add(.5),g),(0,n.vec4)(0,0,0,(0,n.float)(65504)));(0,n.textureStore)(l,(0,n.uvec2)((0,n.uint)(u),(0,n.uint)(d)),y).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.cameraProjection.value=t.uniforms.get(`cameraProjection`).value,this.panoLonRange.value.copy(t.uniforms.get(`panoLonRange`).value),this.panoLatRange.value.copy(t.uniforms.get(`panoLatRange`).value),this.panoLevelHorizon.value=t.uniforms.get(`panoLevelHorizon`).value),!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);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._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._dirty=!1}releaseGPUMemory(){this._outputStorageTex?.dispose(),this._shadingStorageTex?.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._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(V,V);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._computeBuilt=!1}dispose(){this._computeNode?.dispose(),this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._shadingRT?.dispose(),this._rtA?.dispose(),this._rtB?.dispose()}},Tl=class extends be{constructor(e,i,a={}){super(`MotionVector`,{...a,executionMode:ye.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.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(V,V),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(V,V),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=(0,n.vec3)((0,n.float)(c).add(.5).div(a).mul(2).sub(1),(0,n.float)(l).add(.5).div(o).mul(2).sub(1).negate(),1),s=r.mul((0,n.vec4)(e,1)),p=(0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(s.xyz.div(s.w))),m=(0,n.vec3)(t[3]).add(p.mul(u)),h=i.mul((0,n.vec4)(m,1)),g=h.xy.div(h.w),_=(0,n.vec2)(g.x.mul(.5).add(.5),g.y.mul(-.5).add(.5)),v=d.sub(_),y=_.x.greaterThanEqual(0).and(_.x.lessThanEqual(1)).and(_.y.greaterThanEqual(0)).and(_.y.lessThanEqual(1));f.assign(y.select((0,n.vec4)(v,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.vec3)((0,n.float)(d).add(.5).div(c).mul(2).sub(1),(0,n.float)(f).add(.5).div(l).mul(2).sub(1).negate(),1),a=r.mul((0,n.vec4)(e,1)),u=(0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(a.xyz.div(a.w))),h=(0,n.vec3)(t[3]).add(u.mul(p)),g=(0,n.vec2)((0,n.float)(d).add(.5).div(c),(0,n.float)(f).add(.5).div(l)),_=i.mul((0,n.vec4)(h,1)),v=_.xy.div(_.w),y=(0,n.vec2)(v.x.mul(.5).add(.5),v.y.mul(-.5).add(.5)),b=y.x.greaterThanEqual(0).and(y.x.lessThanEqual(1)).and(y.y.greaterThanEqual(0)).and(y.y.lessThanEqual(1)),x=g.sub(y),S=(0,n.vec3)(x.x.div(o).mul(s),x.y.div(o).mul(s),0);m.assign(b.select((0,n.vec4)(S,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)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(V,V);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()}},El=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),Dl=e=>(0,n.vec3)(El(e.x),El(e.y),El(e.z)),Ol=class extends be{constructor(e,i={}){super(`ASVGF`,{...i,executionMode:ye.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(V,V),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(V,V),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(V,V),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(V,V),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(V,V),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=Bn(Dl(m.div((0,n.max)(_,(0,n.vec3)(ze))))).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(Bn(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)(ze)),T=Dl(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=Dl((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=Bn(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(V,V);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()}},kl=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),Al=(0,n.wgslFn)(`
|
|
652
|
+
`),ql=(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=yn({origin:e,direction:t}),y=wn.wrap(Cc(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=Ac({tex:o,samp:(0,n.sampler)(o),direction:t,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).toVar(),r=(0,n.dot)(e.xyz,Vn).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=bn.wrap(ar(y.materialIndex,a)).toVar(),r=An.wrap(Fi(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=bn.wrap(ar(y.materialIndex,a)).toVar(),t=(0,n.normalize)(An.wrap(Fi(e,y.uv,y.normal,(0,n.vec4)(0))).toVar().normal);_.assign((0,n.vec4)(Gl({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=Kl({worldPos:y.hitPoint,cameraProjectionMatrix:m,cameraViewMatrix:h});_.assign((0,n.vec4)(Wl({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=bn.wrap(ar(y.materialIndex,a)).toVar(),t=An.wrap(Fi(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=bn.wrap(ar(y.materialIndex,a)).toVar(),t=An.wrap(Fi(e,y.uv,y.normal,(0,n.vec4)(0))).toVar(),u=t.albedo.rgb,d=(0,n.normalize)(t.normal).toVar(),p=L({state:te({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=Hr({N:d,xi:(0,n.vec2)(ne(p).toVar(),ne(p).toVar())}).toVar(),h=yn({origin:y.hitPoint.add(d.mul(.001)),direction:m}),v=wn.wrap(Cc(h,r,i).toVar()),b=(0,n.vec3)(0).toVar();(0,n.If)(v.didHit.not(),()=>{(0,n.If)(l,()=>{b.assign(Ac({tex:o,samp:(0,n.sampler)(o),direction:m,environmentMatrix:s,environmentIntensity:c,enableEnvironmentLight:l}).xyz)})}).Else(()=>{let e=bn.wrap(ar(v.materialIndex,a)).toVar(),t=An.wrap(Fi(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=Ac({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=Ac({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=Ac({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 Jl(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,sceneScale:b,apertureScale:x,anamorphicRatio:S,bvhBuffer:C,triangleBuffer:w,materialBuffer:T,envTexture:E,environmentMatrix:D,environmentIntensity:O,enableEnvironmentLight:k,visMode:A,debugVisScale:j,frame:M}=e;return(0,n.Fn)(()=>{let e=(0,n.int)(n.workgroupId.x).mul(16).add((0,n.int)(n.localId.x)),N=(0,n.int)(n.workgroupId.y).mul(16).add((0,n.int)(n.localId.y));(0,n.If)(e.lessThan(o).and(N.lessThan(s)),()=>{let o=(0,n.vec2)((0,n.float)(e).add(.5),(0,n.float)(N).add(.5)),s=L({state:(0,n.uint)(N.mul((0,n.int)(a.x)).add(e)).add((0,n.uint)(1))}).toVar(),P=yn.wrap(uc(o.div(a),s,c,l,f,p,m,h,g,_,v,y,b,x,S)),F=(0,n.vec4)(1,0,1,1).toVar();(0,n.If)(A.equal((0,n.int)(9)),()=>{let e=me(o,(0,n.int)(0),(0,n.int)(1),s,a,M);F.assign((0,n.vec4)(e,1,1))}).Else(()=>{F.assign(ql(P.origin,P.direction,C,w,T,E,D,O,k,A,j,o,a,u,d,M))});let I=(0,n.uvec2)((0,n.uint)(e),(0,n.uint)(N));(0,n.textureStore)(t,I,F).toWriteOnly(),(0,n.textureStore)(r,I,(0,n.vec4)(.5,.5,1,1)).toWriteOnly(),(0,n.textureStore)(i,I,(0,n.vec4)(F.xyz,1)).toWriteOnly()})})}function Yl({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 Xl({hitBufferRO:e,activeIndicesReadRO:t,sortGlobalHistogram:r,counters:i,bins:a=256}){return(0,n.Fn)(()=>{let o=n.instanceIndex,s=n.localId.x,c=E(`uint`,a);(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)(Is(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 Zl({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 Ql({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=E(`uint`,o);(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)(Is(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)})})}var $l=xt(`wavefront`),eu=256,tu=[`extend`,`shade`,`globalHist`,`globalScatter`,`compact`,`compactCopyback`],nu=class extends as{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._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 oc(this.renderer),this._registerVRAMProviders(),$l.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.triangleStorageAttr,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._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=s+this.transmissiveBounces.value+this.maxSubsurfaceSteps.value,l=this._wfRenderHeight.value,u=this._chunkRows,d=this._numChunks<=1,f=this._lastBounceCounts,p=d&&f?s<=this._lastBounceCountsBudget?c+1:this._lastBounceCountsBudget: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 m=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<p&&f[n]!==void 0?r=f[n]:p>0&&(r=f[p-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 tu)o.setDispatchForCount(e,n)}else{o.dispatch(`enterFull`);for(let e of tu)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<p&&e<c&&m?.[e]!==void 0&&m[e]<=h)break}o.dispatch(`finalWrite`)}this._maybeReadbackCounters(),this.storageTextures.copyToReadTargets(this.renderer,this._auxGBufferEnabled);let m=this.storageTextures.getReadTextures();e&&this._publishTexturesToContext(e,m),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}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}_maybeReadbackCounters(){if(this.cameraChanged||this.cameraOptimizer?.isInInteractionMode()){this._readbackFrameCounter=this._readbackEveryNFrames;return}if(this._readbackPending||(this.maxBounces.value!==this._lastBounceCountsBudget&&(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._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,r),this._lastBounceEnergy=t.subarray(r,2*r),this._lastBounceCountsBudget=n,this._curveSizingValid=!0}this._readbackPending=!1}).catch(e=>{$l.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&&(bi(e.srgbBuckets,n.srgbBuckets),bi(e.linearBuckets,n.linearBuckets))}_rebuildKernelsIfResized(e,t){let n=this.storageTextures.renderWidth,r=this.storageTextures.renderHeight;n===e&&r===t||!(this.materialData?.materialCount>0)||(this._lastBounceCounts=null,this._lastBounceEnergy=null,this._lastBounceCountsBudget=-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/176),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 r=this.storageTextures.renderWidth,i=this.storageTextures.renderHeight;this._pathBudget||=this._computePathBudget();let a=this._pathBudget;this._updateChunkLayout();let o=this._chunkRows*r;this._packedBuffers?this._packedBuffers.resize(a):this._packedBuffers=new fs(a,this.renderer);let s=a*1;ds(this.renderer,this._gBufferAttr),this._gBufferAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(s*4),4);let c=(0,n.storage)(this._gBufferAttr,`uvec4`),l=(0,n.storage)(this._gBufferAttr,`uvec4`).toReadOnly(),u=W*W;(!this._m2Attr||this._m2Attr.count<u)&&(ds(this.renderer,this._m2Attr),this._m2Attr=new t.StorageInstancedBufferAttribute(new Float32Array(u),1),ds(this.renderer,this._streakAttr),this._streakAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(u),1),ds(this.renderer,this._frozenMaskAttr),this._frozenMaskAttr=new t.StorageInstancedBufferAttribute(new Uint32Array(u),1));let d=(0,n.storage)(this._m2Attr,`float`),f=(0,n.storage)(this._streakAttr,`uint`),p=(0,n.storage)(this._streakAttr,`uint`).toReadOnly(),m=(0,n.storage)(this._frozenMaskAttr,`uint`),h=(0,n.storage)(this._frozenMaskAttr,`uint`).toReadOnly();this._queueManager?this._queueManager.resize(this._packedBuffers.capacity):this._queueManager=new ec(this._packedBuffers.capacity,this.renderer),this._kernelManager||=new cc(this.renderer);let g=this._packedBuffers,_=this._queueManager;this._wfRenderWidth.value=r,this._wfRenderHeight.value=i,this._wfMaxRayCount.value=Math.min(a,this._chunkRows*r);let v=this.shaderBuilder.prevColorTexNode,y=this.shaderBuilder.prevAlbedoTexNode,b=this.shaderBuilder.prevNormalDepthTexNode,x=this.storageTextures.getWriteTextures(),S=_.getCounters(),C=_.getBounceCounts(),w=this._wfCurrentBounce,T=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(S.element((0,n.uint)($.ACTIVE_RAY_COUNT))),t=(0,n.uint)(w).clamp((0,n.uint)(0),(0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS-1));C.element(t).assign(e),C.element(t.add((0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(S.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(S.element((0,n.uint)($.ENTERING_COUNT)),e)});this._kernelManager.register(`snapshotBounceCount`,T().compute([1,1,1],[1,1,1]));let E=_.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)(S.element((0,n.uint)($.ACTIVE_RAY_COUNT)),this._wfMaxRayCount),(0,n.atomicStore)(S.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(S.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(0))})})});this._kernelManager.register(`initActiveIndices`,D().compute([Math.ceil(this._chunkRows*r/eu),1,1],[eu,1,1]));let O={rayBufferRW:g.rayBuffer.rw,rngBufferRW:g.rngBuffer.rw,gBufferRW:c,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,sceneScale:this.sceneScale,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows,transmissiveBounces:this.transmissiveBounces,transparentBackground:this.transparentBackground,auxGBufferEnabled:this._auxGBufferUniform},k=dc(O);this._kernelManager.register(`generate`,k().compute([Math.ceil(r/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let A=this.pixelFreezeStability,j=(0,n.Fn)(()=>{(0,n.atomicStore)(S.element((0,n.uint)($.ACTIVE_RAY_COUNT)),(0,n.uint)(0)),(0,n.If)(this._wfIsFirstChunk.greaterThan((0,n.uint)(0)),()=>{(0,n.atomicStore)(S.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(0)),(0,n.atomicStore)(S.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(p.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)(p.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))})})}})}),m.element(t).assign(r),(0,n.If)(r.equal((0,n.uint)(0)),()=>{let t=(0,n.atomicAdd)(S.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*r/eu),1,1],[eu,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=p.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)(p.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)(S.element((0,n.uint)($.CONVERGED_COUNT)),(0,n.uint)(1))}),(0,n.If)(l,()=>{(0,n.atomicAdd)(S.element((0,n.uint)($.GEOMETRY_COUNT)),(0,n.uint)(1)),(0,n.If)(u,()=>{(0,n.atomicAdd)(S.element((0,n.uint)($.CONVERGED_GEOMETRY_COUNT)),(0,n.uint)(1))})})})});this._kernelManager.register(`countConvergedDilated`,N().compute([Math.ceil(r*i/eu),1,1],[eu,1,1]));let P=(0,n.Fn)(()=>{let e=(0,n.atomicLoad)(S.element((0,n.uint)($.ACTIVE_RAY_COUNT)));(0,n.atomicStore)(S.element((0,n.uint)($.ENTERING_COUNT)),e),(0,n.atomicStore)(S.element((0,n.uint)($.ACTIVE_PIXEL_COUNT)),e)});this._kernelManager.register(`seedEnter`,P().compute([1,1,1],[1,1,1]));let F=dc({...O,listDriven:!0,activeIndicesRO:_.activeIndicesRO.a,counters:S});this._kernelManager.register(`generateList`,F().compute([Math.ceil(o/eu),1,1],[eu,1,1]));let I=this.bvhStorageNode,ee=this.triangleStorageNode,L=this.materialData.materialStorageNode,te=(0,n.texture)(this.environment.envCDFTexture),R=this.lightStorageNode,ne=this.materialData,re=this.environment,z=yi(ne.srgbBuckets),ie=yi(ne.linearBuckets);pi(z,ie),zi(z);let ae=re.environmentTexture?(0,n.texture)(re.environmentTexture):e.envTex;this._wfTexNodes={envTex:ae,envCDFTex:te,srgbBuckets:z,linearBuckets:ie},this._sortMaterials=(U.wavefrontSortMaterials??!1)&&(this.materialData?.materialCount??0)>8;let oe=Tc({bvhBuffer:I,triangleBuffer:ee,rayBufferRO:g.rayBuffer.ro,hitBufferRW:g.hitBuffer.rw,activeIndicesRO:_.getActiveReadRO(),counters:S,maxRayCount:this._wfMaxRayCount});if(this._kernelManager.register(`extend`,oe().compute([Math.ceil(o/256),1,1],[256,1,1])),this._sortMaterials){let e=_.getSortGlobalHistogram(),t=Math.min(256,this.materialData?.materialCount??256);this._kernelManager.register(`resetGlobalHist`,Yl({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[256,1,1])),this._kernelManager.register(`globalHist`,Xl({hitBufferRO:g.hitBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),sortGlobalHistogram:e,counters:S,bins:t})().compute([Math.ceil(o/256),1,1],[256,1,1])),this._kernelManager.register(`globalPrefix`,Zl({sortGlobalHistogram:e,bins:t})().compute([1,1,1],[1,1,1])),this._kernelManager.register(`globalScatter`,Ql({hitBufferRO:g.hitBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),sortedIndicesRW:_.getSortedRW(),sortGlobalHistogram:e,counters:S,bins:t})().compute([Math.ceil(o/256),1,1],[256,1,1]))}let se=Rl({gBufferRW:c,envCompensationDelta:this.envCompensationDelta,bvhBuffer:I,triangleBuffer:ee,materialBuffer:L,envCDFTexture:te,lightBuffer:R,rayBufferRW:g.rayBuffer.rw,rngBufferRW:g.rngBuffer.rw,hitBufferRO:g.hitBuffer.ro,counters:S,activeIndicesRO:this._sortMaterials?_.getSortedRO():_.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,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});this._kernelManager.register(`shade`,se().compute([Math.ceil(o/256),1,1],[256,1,1]));let ce=this._useSubgroupCompact&&(this.renderer.hasFeature?this.renderer.hasFeature(`subgroups`):!1);this._compactIsSubgroup=ce;let le=(ce?Vl:Bl)({rayBufferRO:g.rayBuffer.ro,activeIndicesReadRO:_.getActiveReadRO(),activeIndicesWriteRW:_.getActiveWrite(),counters:S,currentActiveCount:this._wfMaxRayCount});this._kernelManager.register(`compact`,le().compute([Math.ceil(o/256),1,1],[256,1,1]));let ue=(0,n.Fn)(()=>{(0,n.atomicStore)(S.element((0,n.uint)($.ENTERING_COUNT)),this._wfMaxRayCount)});this._kernelManager.register(`enterFull`,ue().compute([1,1,1],[1,1,1]));let de=_.activeIndicesRO.b,fe=_.activeIndices.a,pe=(0,n.Fn)(()=>{let e=n.instanceIndex,t=(0,n.atomicLoad)(S.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)(_.MAX_BOUNCE_SNAPSHOTS-1));C.element(e).assign(t),C.element(e.add((0,n.uint)(_.MAX_BOUNCE_SNAPSHOTS))).assign((0,n.atomicLoad)(S.element((0,n.uint)($.ACTIVE_ENERGY)))),(0,n.atomicStore)(S.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(o/eu),1,1],[eu,1,1]));let B=Ul({rayBufferRO:g.rayBuffer.ro,gBufferRO:l,writeColorTex:x.color,writeNDTex:x.normalDepth,writeAlbedoTex:x.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:v,prevAlbedoTexture:y,prevNormalDepthTexture:b,renderWidth:this._wfRenderWidth,renderHeight:this._wfRenderHeight,visMode:this.visMode,auxGBufferEnabled:this._auxGBufferUniform,cleanAuxNormalEnabled:this._cleanAuxNormalUniform,m2BufferRW:d,useAdaptiveSampling:this.useAdaptiveSampling,noiseThreshold:this.noiseThreshold,adaptiveMinSamples:this.adaptiveMinSamples,usePixelFreeze:this.usePixelFreeze,pixelFreezeThreshold:this.pixelFreezeThreshold,streakBufferRW:f,frozenMaskRO:h,convergenceOverlay:this.convergenceOverlay,chunkRowBase:this._wfChunkRowBase,chunkRows:this._wfChunkRows});this._kernelManager.register(`finalWrite`,B().compute([Math.ceil(r/16),Math.ceil(this._chunkRows/16),1],[16,16,1]));let me=Jl({writeColorTex:x.color,writeNDTex:x.normalDepth,writeAlbedoTex:x.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,sceneScale:this.sceneScale,apertureScale:this.apertureScale,anamorphicRatio:this.anamorphicRatio,bvhBuffer:I,triangleBuffer:ee,materialBuffer:L,envTexture:ae,environmentMatrix:this.environmentMatrix,environmentIntensity:this.environmentIntensity,enableEnvironmentLight:this.enableEnvironment,visMode:this.visMode,debugVisScale:this.debugVisScale,frame:this.frame});this._kernelManager.register(`debug`,me().compute([Math.ceil(r/16),Math.ceil(i/16),1],[16,16,1])),this._wavefrontReady=!0;let he=(this._packedBuffers?.totalBytes??0)+(this._queueManager?.totalBytes??0);$l.info(J.list([J.px(r,i),`${J.mb(he)} wavefront buffers`,`budget ${J.n(a)} 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}},ru=class extends _e{constructor(e,i={}){super(`NormalDepth`,{...i,executionMode:ge.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.cameraProjection=(0,n.uniform)(0,`int`),this.panoLonRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLatRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLevelHorizon=(0,n.uniform)(1,`int`),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._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.triangleStorageAttr&&e.triangleStorageAttr!==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.triangleStorageAttr&&!this._triStorageNode&&(this._triStorageNode=(0,n.storage)(e.triangleStorageAttr,`vec4`,e.triangleStorageAttr.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&&bi(this._linearBuckets,e.materialData?.linearBuckets),this._lastTriAttr=e.triangleStorageAttr||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=yi(this.pathTracer?.materialData?.linearBuckets),pi(yi(null),this._linearBuckets);let i=this.cameraWorldMatrix,a=this.cameraProjectionMatrixInverse,o=this.resolutionWidth,s=this.resolutionHeight,c=this._outputStorageTex,l=this._shadingStorageTex;this._computeNode=(0,n.Fn)(([i,a])=>{let u=(0,n.int)(n.workgroupId.x).mul(8).add((0,n.int)(n.localId.x)),d=(0,n.int)(n.workgroupId.y).mul(8).add((0,n.int)(n.localId.y));(0,n.If)(u.lessThan((0,n.int)(o)).and(d.lessThan((0,n.int)(s))),()=>{let f=lc((0,n.vec2)((0,n.float)(u).add(.5).div(o),(0,n.float)(d).add(.5).div(s)),i,a,this.cameraProjection,this.panoLonRange,this.panoLatRange,this.panoLevelHorizon),p=yn({origin:(0,n.vec3)(i[3]),direction:f}),m=wn.wrap(Sc(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)(u),(0,n.uint)(d)),_).toWriteOnly();let v=m.normal.toVar(),y=(0,n.float)(1).toVar();(0,n.If)(m.didHit,()=>{let t=bn.wrap(ar(m.materialIndex,r)).toVar(),i=Mn.wrap(Ti(m.uv,t)).toVar(),a=(0,n.vec4)(0).toVar();(0,n.If)(t.normalMapIndex.greaterThanEqual((0,n.int)(0)),()=>{a.assign(ki(e,m.triangleIndex,m.normal,t.normalTransform))});let o=Ai(m.normal,t,i,a).toVar();v.assign(ji(o,t,i)),y.assign(Di(t,i).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)(u),(0,n.uint)(d)),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.cameraProjection.value=t.uniforms.get(`cameraProjection`).value,this.panoLonRange.value.copy(t.uniforms.get(`panoLonRange`).value),this.panoLatRange.value.copy(t.uniforms.get(`panoLatRange`).value),this.panoLevelHorizon.value=t.uniforms.get(`panoLevelHorizon`).value),!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);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._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._dirty=!1}releaseGPUMemory(){this._outputStorageTex?.dispose(),this._shadingStorageTex?.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._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._computeBuilt=!1}dispose(){this._computeNode?.dispose(),this._outputStorageTex?.dispose(),this._shadingStorageTex?.dispose(),this._shadingRT?.dispose(),this._rtA?.dispose(),this._rtB?.dispose()}},iu=class extends _e{constructor(e,i,a={}){super(`MotionVector`,{...a,executionMode:ge.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.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=(0,n.vec3)((0,n.float)(c).add(.5).div(a).mul(2).sub(1),(0,n.float)(l).add(.5).div(o).mul(2).sub(1).negate(),1),s=r.mul((0,n.vec4)(e,1)),p=(0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(s.xyz.div(s.w))),m=(0,n.vec3)(t[3]).add(p.mul(u)),h=i.mul((0,n.vec4)(m,1)),g=h.xy.div(h.w),_=(0,n.vec2)(g.x.mul(.5).add(.5),g.y.mul(-.5).add(.5)),v=d.sub(_),y=_.x.greaterThanEqual(0).and(_.x.lessThanEqual(1)).and(_.y.greaterThanEqual(0)).and(_.y.lessThanEqual(1));f.assign(y.select((0,n.vec4)(v,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.vec3)((0,n.float)(d).add(.5).div(c).mul(2).sub(1),(0,n.float)(f).add(.5).div(l).mul(2).sub(1).negate(),1),a=r.mul((0,n.vec4)(e,1)),u=(0,n.normalize)((0,n.mat3)(t[0].xyz,t[1].xyz,t[2].xyz).mul(a.xyz.div(a.w))),h=(0,n.vec3)(t[3]).add(u.mul(p)),g=(0,n.vec2)((0,n.float)(d).add(.5).div(c),(0,n.float)(f).add(.5).div(l)),_=i.mul((0,n.vec4)(h,1)),v=_.xy.div(_.w),y=(0,n.vec2)(v.x.mul(.5).add(.5),v.y.mul(-.5).add(.5)),b=y.x.greaterThanEqual(0).and(y.x.lessThanEqual(1)).and(y.y.greaterThanEqual(0)).and(y.y.lessThanEqual(1)),x=g.sub(y),S=(0,n.vec3)(x.x.div(o).mul(s),x.y.div(o).mul(s),0);m.assign(b.select((0,n.vec4)(S,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)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()}},au=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),ou=e=>(0,n.vec3)(au(e.x),au(e.y),au(e.z)),su=class extends _e{constructor(e,i={}){super(`ASVGF`,{...i,executionMode:ge.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=Jn(ou(m.div((0,n.max)(_,(0,n.vec3)(ze))))).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(Jn(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)(ze)),T=ou(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),ee=F(O,k,M),L=F(C,A,N),te=F(O,A,P),R=I.add(ee).add(L).add(te);(0,n.If)(R.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(R),o=e.xyz.mul(I).add(t.xyz.mul(ee)).add(r.xyz.mul(L)).add(i.xyz.mul(te)).mul(a),l=e.w.mul(I).add(t.w.mul(ee)).add(r.w.mul(L)).add(i.w.mul(te)).mul(a),p=(0,n.textureLoad)(c,y).x.mul(f).clamp(0,1),m=ou((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=Jn(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()}},cu=1e-6,lu=1.5/255,uu=.01,du=3,fu=2,pu=2,mu=3,hu=2,gu=38,_u=.1,vu=4,yu=Math.cos(89*Math.PI/180),bu=.5,xu=16,Su={pre:{radiusScale:1,fractionScale:2},blur:{radiusScale:1,fractionScale:1},post:{radiusScale:2,fractionScale:.5}},Cu=.25*Math.SQRT2,wu=[[-1,0,1],[0,1,1],[1,0,1],[0,-1,1],[-Cu,Cu,.5],[Cu,Cu,.5],[Cu,-Cu,.5],[-Cu,-Cu,.5]],Tu=(e,t,r)=>(0,n.smoothstep)(0,1,(0,n.float)(1).sub(e.mul(t).add(r).abs())),Eu=(e,t,r)=>{let i=e.mul(t).add(r).abs().mul(-du);return(0,n.float)(1).div(i.mul(i).sub(i).add(1))},Du=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)))),Ou=(e,t)=>(0,n.float)(1).sub((0,n.exp2)(e.mul(e).mul(-200))).mul((0,n.pow)((0,n.saturate)(e),t)),ku=(e,t)=>(0,n.saturate)(e).mul((0,n.sqrt)(t.div((0,n.float)(1).sub(t).add(cu)))),Au=(e,t,r,i)=>{let a=(0,n.max)((0,n.atan)(ku(r,i.mul((0,n.mix)((0,n.saturate)(t),(0,n.float)(1),e)))),(0,n.float)(lu));return(0,n.float)(1).div(a)},ju=(e,t)=>{let r=(0,n.float)(1).div((0,n.mix)((0,n.float)(uu),(0,n.float)(1),(0,n.saturate)(e.mul(t))));return(0,n.vec2)(r,e.mul(r).negate())},Mu=(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())},Nu=(e,t)=>{let r=(0,n.float)(1).div(t);return(0,n.vec2)(r,e.mul(r).negate())},Pu=(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())},Fu=e=>(0,n.vec2)(1).sub((0,n.vec2)(1).sub((0,n.fract)(e.mul(.5)).mul(2)).abs()).min(.99999),Iu=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))),Lu=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))},Ru=(e,t)=>t.add(cu).div(e.add(cu)),zu=(e,t)=>(0,n.vec4)(e.xyz.mul(Ru(e.x,t)),e.w),Bu=e=>(0,n.vec4)(Iu(Lu(e.xyz)),(0,n.saturate)(e.w)),Vu=(e,t)=>(0,n.sqrt)(t.sub(e.mul(e)).abs()),Hu=(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))),Uu=(e,t)=>(0,n.select)(e.equal(0),(0,n.vec4)(0),t);function Wu(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 Gu=class extends _e{constructor(e,i={}){super(`NRD`,{...i,executionMode:ge.PER_CYCLE}),this.renderer=e,this.pathTracer=i.pathTracer||null,this.settings={...Ue,...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.cameraProjection=(0,n.uniform)(0,`int`),this.panoLonRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLatRange=(0,n.uniform)(new r.Vector2,`vec2`),this.panoLevelHorizon=(0,n.uniform)(1,`int`),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/xu),this._dispatchY=Math.ceil(o/xu),this._buildKernels()}_allocStorage(){let e=()=>Et(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 Ue&&(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,r,i){let a=lc(e,r,i,this.cameraProjection,this.panoLonRange,this.panoLatRange,this.panoLevelHorizon);return(0,n.vec3)(r[3]).add(a.mul(t))}_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=bu,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],[xu,xu,1])}_buildSpatial(e){let t=e===`pre`,{radiusScale:r,fractionScale:i}=Su[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)(Iu(Wn(t.xyz.div((0,n.max)(r.xyz,(0,n.vec3)(ze))))),Un(r.w,Hn).min(1))}:e=>(0,n.textureLoad)(d,e),S=(0,n.Fn)(([o,s])=>{let d=(0,n.int)(n.workgroupId.x).mul(xu).add((0,n.int)(n.localId.x)),S=(0,n.int)(n.workgroupId.y).mul(xu).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(Ie),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)(Ie).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,(0,n.normalize)(_.sub(f))).abs().toVar(),p=this.minRectDimMulUnproject.mul(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=Ou(k,.5).toVar(),D=A.mul(Re).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))))),ee=(0,n.max)((0,n.saturate)((0,n.sqrt)((0,n.saturate)(F)).mul(r)).mul(h).mul(E),I.mul(E)).toVar(),L=Pu(a.planeDistSensitivity,p,f,O).toVar(),te=Au(T,a.lobeAngleFraction,k,a.lobeVolumePercent).div(i).toVar(),R=ju(k,a.roughnessFraction.mul(i)).toVar(),ne=Nu(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(ee).toVar(),ae=(0,n.float)(1).toVar();for(let t=0;t<wu.length;t++){let r=wu[t],i=e.add(Hu(m,(0,n.vec2)(r[0],r[1])).mul(ie)),a=Fu(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=Du((0,n.dot)(O,(0,n.normalize)(h.xyz.mul(2).sub(1))));u.mulAssign(Tu(g,te,(0,n.float)(0))),u.mulAssign(Tu(h.w,R.x,R.y)),u.mulAssign(Tu((0,n.dot)(O,p),L.x,L.y)),u.assign((0,n.select)(f.greaterThanEqual(Ie),(0,n.float)(0),u));let _=Uu(u,x(d));u.mulAssign(re.add(Eu(_.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(xu).add((0,n.int)(n.localId.x)),C=(0,n.int)(n.workgroupId.y).mul(xu).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(Ie),()=>{(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,(0,n.normalize)(m.sub(M))).abs().toVar(),F=this.minRectDimMulUnproject.mul(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(Ie);I.addAssign((0,n.select)(s,o,k).mul(.25))}let ee=(0,n.textureLoad)(i,g),L=j.sub(ee.xy).toVar(),te=p.mul((0,n.vec4)(M,1)).z.abs().toVar(),R=this._bilinear(L),ne=F.mul((0,n.saturate)(e.disocclusionThreshold.div((0,n.max)(P,.05)))).sub(cu).toVar(),re=(0,n.float)(1).sub(y),z=[],ie=[];for(let e=0;e<4;e++){let t=(0,n.textureLoad)(l,R.taps[e]),r=(0,n.select)((0,n.dot)(t.xyz,I).greaterThan(yu),(0,n.float)(1),(0,n.float)(0)),i=(0,n.select)(t.w.sub(te).abs().lessThanEqual(ne),(0,n.float)(1),(0,n.float)(0)),a=(0,n.select)(t.w.lessThan(Ie),(0,n.float)(1),(0,n.float)(0));z.push(r.mul(i).mul(a).mul(R.inScreen[e]).mul(re).toVar()),ie.push((0,n.textureLoad)(c,R.taps[e]).x)}let ae=R.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,(0,n.normalize)(h.sub(M))).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)(R.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=Bu(this._sampleHistory(e=>(0,n.textureLoad)(o,e),L,R,ae,oe)).toVar(),fe=(0,n.max)(this._applyCustomWeights(R.taps.map(e=>(0,n.textureLoad)(s,e).x),ae,(0,n.float)(0)),0).toVar(),pe=v.add(1),B=this._handover(pe).toVar(),me=ce.mul((0,n.float)(1).sub(B)),he=pe.div(pe.add(me)).toVar(),ge=(0,n.float)(1).div((0,n.float)(1).add(Ou(A,.25).mul(.5).mul(E))),_e=(0,n.vec4)((0,n.mix)(de.xyz,T.xyz,he),(0,n.mix)(de.w,T.w,(0,n.max)(he,ge))).toVar(),ve=e.fireflyMinRelativeScale.add((0,n.float)(gu).div(ce.add(1))).toVar(),V=ce.mul(e.maxBlurRadius).mul(_u).toVar();V.assign(V.div(V.add(1)).mul((0,n.float)(1).sub(B)));let ye=(0,n.mix)(_e.x,(0,n.min)(_e.x,de.x.mul(ve)),V);_e.assign(zu(_e,ye));let be=(0,n.float)(1.2).add((0,n.float)(1).div(ce.add(1)));_e.assign((0,n.vec4)(_e.xyz,(0,n.mix)(_e.w,(0,n.min)(_e.w,de.w.mul(be)),V))),(0,n.textureStore)(u,_,_e).toWriteOnly();let xe=(0,n.min)(ce,D).mul((0,n.float)(1).sub(B)),Se=pe.div(pe.add(xe)),H=(0,n.mix)(fe,T.x,Se).toVar(),Ce=(0,n.min)(H,de.x.mul(ve).mul(vu));H.assign((0,n.mix)(H,Ce,V)),(0,n.textureStore)(d,_,(0,n.vec4)(H,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(xu).add((0,n.int)(n.localId.x)),h=(0,n.int)(n.workgroupId.y).mul(xu).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(Ie),()=>{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.minRectDimMulUnproject.mul(O).toVar(),A=(0,n.textureLoad)(i,g).toVar(),j=(0,n.float)(1).div(x.add(1)).toVar(),M=O.mul(Re).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/fu).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=Au(j,e.lobeAngleFraction,T,e.lobeVolumePercent).toVar(),s=Pu(e.planeDistSensitivity,k,D,w).toVar(),c=Nu(P,j).toVar(),d=Mu(T.mul(T),(0,n.sqrt)(e.roughnessFraction),uu).toVar(),m=(0,n.float)(1).add(b).toVar();A.mulAssign(m);for(let e=-fu;e<=fu;e++)for(let h=-fu;h<=fu;h++){if(h===0&&e===0||Math.abs(h)+Math.abs(e)===fu*2)continue;let g=Fu(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=Eu(Du((0,n.dot)((0,n.normalize)(b.xyz.mul(2).sub(1)),w)),o,(0,n.float)(0)).toVar();x.mulAssign(Eu(b.w.mul(b.w),d.x,d.y)),x.mulAssign((0,n.float)(1).add((0,n.textureLoad)(a,_).y)),x.mulAssign(Tu((0,n.dot)(w,y),s.x,s.y)),x.assign((0,n.select)(v.greaterThanEqual(Ie),(0,n.float)(0),x));let S=Uu(x,(0,n.textureLoad)(i,_));x.mulAssign(Eu(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(),ee=(0,n.saturate)(b.div((0,n.max)(e.historyFixFrameNum,cu))),L=(0,n.mix)(I,y.x,ee).toVar();(0,n.textureStore)(s,_,(0,n.vec4)(L,0,0,0)).toWriteOnly();let te=L.toVar(),R=L.mul(L).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(Ie),L,(0,n.textureLoad)(a,o).x);Math.abs(e)<=pu&&Math.abs(r)<=pu&&(te.addAssign(c),R.addAssign(c.mul(c))),i&&(ne.addAssign(c),re.addAssign(c.mul(c)))},ie=e.antiFirefly.greaterThan(.5);for(let e=-pu;e<=pu;e++)for(let t=-pu;t<=pu;t++)t===0&&e===0||z(t,e,Math.abs(t)>1||Math.abs(e)>1);(0,n.If)(ie,()=>{for(let e=-mu;e<=mu;e++)for(let t=-mu;t<=mu;t++)Math.abs(t)<=pu&&Math.abs(e)<=pu||z(t,e,!0)}),(0,n.If)(ie,()=>{let e=1/((mu*2+1)**2-9),t=ne.mul(e),r=Vu(t,re.mul(e)).mul(hu);I.assign((0,n.mix)(I.clamp(t.sub(r),t.add(r)),I,S))});{let t=1/(pu*2+1)**2,r=te.mul(t),i=Vu(r,R.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,_,zu(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(xu).add((0,n.int)(n.localId.x)),y=(0,n.int)(n.workgroupId.y).mul(xu).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(Ie),()=>{(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(),ee=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(Ie),F,(0,n.textureLoad)(c,r).x);I.addAssign(o),ee.addAssign(o.mul(o))}I.divAssign(9),ee.divAssign(9);let L=Vu(I,ee).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(),R=L.mul(t.antilag.x),ne=t.antilag.y.mul(4),re=te.clamp(I.sub(R),I.add(R)),z=te.sub(re).abs().div((0,n.max)(te,re).add(cu)),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,te.clamp(I.sub(L.mul(le)),I.add(L.mul(le))),(0,n.min)(ce,ue)).toVar();P.assign(zu(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),B=(0,n.vec4)(Lu(P.xyz).mul((0,n.max)(pe.xyz,(0,n.vec3)(ze))),x.w).toVar();(0,n.If)(_.equal((0,n.int)(1)),()=>{let e=(0,n.saturate)(D.div((0,n.max)(t.maxAccum,1)));B.assign((0,n.vec4)((0,n.float)(1).sub(e),e,.2,1))}).ElseIf(_.equal((0,n.int)(2)),()=>{B.assign((0,n.vec4)((0,n.vec3)(P.w),1))}).ElseIf(_.equal((0,n.int)(3)),()=>{B.assign((0,n.vec4)((0,n.vec3)(S),1))}).ElseIf(_.equal((0,n.int)(4)),()=>{let e=E.x.div(E.x.add(1));B.assign((0,n.vec4)((0,n.vec3)(e),1))}).ElseIf(_.equal((0,n.int)(5)),()=>{B.assign((0,n.vec4)((0,n.vec3)(E.z.div(15)),1))}),(0,n.textureStore)(f,m,B).toWriteOnly()})})().compute([this._dispatchX,this._dispatchY,1],[xu,xu,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.camWorld.value.copy(t),this.camProjInv.value.copy(r),this.camView.value.copy(n),this.camPos.value.setFromMatrixPosition(t),this.cameraProjection.value=e.uniforms.get(`cameraProjection`).value,this.panoLonRange.value.copy(e.uniforms.get(`panoLonRange`).value),this.panoLatRange.value.copy(e.uniforms.get(`panoLatRange`).value),this.panoLevelHorizon.value=e.uniforms.get(`panoLevelHorizon`).value,this._camInitialized||=(this.prevCamView.value.copy(n),this.prevCamPos.value.copy(this.camPos.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=Wu(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/xu),this._dispatchY=Math.ceil(t/xu);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()}},Ku=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),qu=(0,n.wgslFn)(`
|
|
653
653
|
fn temporalAccumulate(
|
|
654
654
|
lum: f32,
|
|
655
655
|
prevMean: f32,
|
|
@@ -671,7 +671,7 @@
|
|
|
671
671
|
);
|
|
672
672
|
|
|
673
673
|
}
|
|
674
|
-
`),
|
|
674
|
+
`),Ju=class extends _e{constructor(e,i={}){super(`VarianceEstimation`,{...i,executionMode:ge.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(Ku(Jn(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(Ku(Jn(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)),qu(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()}},Yu=(0,n.wgslFn)(`
|
|
675
675
|
fn bilateralWeight(
|
|
676
676
|
centerLum: f32, sLum: f32,
|
|
677
677
|
centerNormal: vec3f, sNormal: vec3f,
|
|
@@ -696,7 +696,7 @@
|
|
|
696
696
|
return kernelW * lumW * normW * depW * colW;
|
|
697
697
|
|
|
698
698
|
}
|
|
699
|
-
`),Nl=class extends be{constructor(e,i={}){super(`BilateralFiltering`,{...i,executionMode:ye.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(V,V),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(V,V),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=Bn(C),O=(0,n.max)((0,n.textureLoad)(a,x).xyz,(0,n.vec3)(ze)),k=(0,n.max)(Bn(O),(0,n.float)(ze)).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=Ml(D,Bn(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(V,V);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()}},Pl=6e4,Fl=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),Il=e=>(0,n.vec3)(Fl(e.x),Fl(e.y),Fl(e.z)),Ll=4,Rl=[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],zl=class extends be{constructor(e,i={}){super(`EdgeAwareFiltering`,{...i,executionMode:ye.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(V,V);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)(Pl)),u=(0,n.textureLoad)(r,a).xyz,d=(0,n.select)(l,(0,n.max)(u,(0,n.vec3)(ze)),(0,n.vec3)(1)),f=Il(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=Bn(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)(Pl)),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)(ze)),(0,n.vec3)(1)),A=(0,n.max)(Bn(k),(0,n.float)(ze)),j=m.equal((0,n.int)(1)),M=h.lessThan((0,n.int)(Ll)),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=Rl[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=Bn(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)(Pl)),(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,ae=(0,n.mix)(ie,te.mul(k),c),oe=re.select(ae,te),se=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)(oe,se)).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()}},Bl=256,Vl=-8,Hl=6-Vl,Ul=Hl/Bl,Wl=1e4,Gl=(0,n.wgslFn)(`
|
|
699
|
+
`),Xu=class extends _e{constructor(e,i={}){super(`BilateralFiltering`,{...i,executionMode:ge.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=Jn(C),O=(0,n.max)((0,n.textureLoad)(a,x).xyz,(0,n.vec3)(ze)),k=(0,n.max)(Jn(O),(0,n.float)(ze)).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=Yu(D,Jn(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 ee=P.div((0,n.max)(F,(0,n.float)(1e-4))),L=I.div((0,n.max)(F.mul(F),(0,n.float)(1e-8))),te=m.equal((0,n.int)(1)),R=te.select(ee.mul(O),ee),ne=te.select((0,n.textureLoad)(s,x).w,(0,n.sqrt)((0,n.max)(L,(0,n.float)(0))));(0,n.textureStore)(e,(0,n.uvec2)((0,n.uint)(y),(0,n.uint)(b)),(0,n.vec4)(R,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()}},Zu=6e4,Qu=e=>(0,n.select)(e.equal(e),e,(0,n.float)(0)).clamp(0,1e7),$u=e=>(0,n.vec3)(Qu(e.x),Qu(e.y),Qu(e.z)),ed=4,td=[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],nd=class extends _e{constructor(e,i={}){super(`EdgeAwareFiltering`,{...i,executionMode:ge.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)(Zu)),u=(0,n.textureLoad)(r,a).xyz,d=(0,n.select)(l,(0,n.max)(u,(0,n.vec3)(ze)),(0,n.vec3)(1)),f=$u(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=Jn(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)(Zu)),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)(ze)),(0,n.vec3)(1)),A=(0,n.max)(Jn(k),(0,n.float)(ze)),j=m.equal((0,n.int)(1)),M=h.lessThan((0,n.int)(ed)),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(),ee=(0,n.float)(0).toVar(),L=(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=td[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=Jn(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)(Zu)),(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),R=(0,n.float)(c).mul(E).mul(te).mul(P),ne=j.select(N(l),p.w.mul(p.w));I.addAssign(m.mul(R)),ee.addAssign(R),L.addAssign(R.mul(R).mul((0,n.max)(ne,(0,n.float)(0))))}let te=I.div((0,n.max)(ee,(0,n.float)(1e-4))),R=L.div((0,n.max)(ee.mul(ee),(0,n.float)(1e-8))),ne=p.equal((0,n.int)(1)),re=(0,n.textureLoad)(r,b).xyz,z=(0,n.mix)(re,te.mul(k),c),ie=ne.select(z,te),ae=ne.select((0,n.textureLoad)(r,b).w,(0,n.sqrt)((0,n.max)(R,(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()}},rd=256,id=-8,ad=6-id,od=ad/rd,sd=1e4,cd=(0,n.wgslFn)(`
|
|
700
700
|
fn adaptExposure(
|
|
701
701
|
geoMean: f32,
|
|
702
702
|
prevExposure: f32,
|
|
@@ -725,10 +725,10 @@
|
|
|
725
725
|
return vec4f( newExposure, geoMean, targetExp, 1.0 );
|
|
726
726
|
|
|
727
727
|
}
|
|
728
|
-
`),Kl=class extends be{constructor(e,r={}){super(`AutoExposure`,{...r,executionMode:ye.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)(Bl,`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=Bn((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)(Vl)).div((0,n.float)(Hl)).mul((0,n.float)(Bl)).floor().clamp(0,(0,n.float)(Bl-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)(Wl)));(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)(Bl,({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)(Bl,({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)(Vl).add((0,n.float)(t).add(.5).mul((0,n.float)(Ul)));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=Gl(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()}},ql=class extends be{constructor(e,i={}){super(`Compositor`,{...i,executionMode:ye.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,In)),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`)||e.getTexture(`edgeFiltering:output`)||e.getTexture(`bilateralFiltering:output`)||e.getTexture(`asvgf: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,In).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}},Jl=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={}}},Yl=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):[]}},Xl=!1,Zl=[],Ql=new WeakMap;function $l(e){Xl=!!e}function eu(){return Zl.slice()}function tu(){Zl.length=0}function nu(e){let t=[];for(let n of Object.keys(e))e[n]?.isTextureNode===!0&&t.push(n);return t}var ru=e=>!e||!e.image||!(e.image.width>0);function iu(e,t,n){if(!Xl){n();return}let r=Ql.get(e);if(r||(r={phase:`pending`,unboundAtCompile:[]},Ql.set(e,r)),r.phase!==`pending`){n(),r.phase===`watch`&&au(e,r);return}let i=Object.prototype.hasOwnProperty.call(t,`compute`),a=t.compute;t.compute=function(...t){return r.phase===`pending`&&(r.unboundAtCompile=nu(e).filter(t=>ru(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 au(e,t){let n=[];for(let r of t.unboundAtCompile){let t=e[r]?.value;if(ru(t))return;t.isStorageTexture!==!0&&n.push(r)}t.phase=`done`,n.length!==0&&Zl.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 ou=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(qa.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 Jl,this.eventBus=new Yl,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(iu(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()}},su=K(`engine`),cu=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,su.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}},lu=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:R.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=e.distance;this.showFocusPoint(e.point),this.toggleFocusMode(),this.dispatchEvent({type:`focusChanged`,distance:t/this.assetLoader.getSceneScale(),worldDistance:t})}}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}}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:R.OBJECT_SELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`objectDeselected`,t=>{this.select(null),e.refreshFrame(),e.dispatchEvent({type:R.OBJECT_DESELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`selectModeChanged`,t=>{e.dispatchEvent({type:R.SELECT_MODE_CHANGED,enabled:t.enabled})}),this.addEventListener(`objectDoubleClicked`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:R.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:R.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}},uu={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},samplingTechnique:{uniform:`samplingTechnique`,reset:!0},fireflyThreshold:{uniform:`fireflyThreshold`,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},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`}},du=Object.freeze({DEFAULT:`default`,HOST:`host`,SCENE_METADATA:`scene-metadata`,MODE_PRESET:`mode-preset`}),fu={bounces:`maxBounces`,debugMode:`visMode`},pu=class extends r.EventDispatcher{constructor(e=B,{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,cameraManager:o}){let s=new r.Vector2,c=(t,n)=>{s.set(n?.[0]??0,n?.[1]??0).multiplyScalar(r.MathUtils.DEG2RAD),e.pathTracer?.setUniform(t,s)};return{handleCameraProjection:t=>{let n=t===`equirectangular`;e.pathTracer?.setUniform(`cameraProjection`,+!!n),n&&(a?.denoiserStrategy===`asvgf`&&a.setDenoiserStrategy(`edgeaware`),o?.setAutoFocusMode(`manual`))},handlePanoramaLonRange:e=>c(`panoLonRange`,e),handlePanoramaLatRange:e=>c(`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)}}}set(e,t,{reset:n,silent:r,source:i=du.HOST}={}){let a=this._applyOne(e,t,i);a?.route&&((n===void 0?a.route.reset??!0:n)&&this._resetCallback?.(),r||this.dispatchEvent({type:R.SETTING_CHANGED,key:e,value:t,prev:a.prev}))}setMany(e,{silent:t,reset:n,source:r=du.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:R.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=uu[e];return i?(this._applyRoute(i,t,r),{route:i,prev:r}):(this._reportUnknownKey(e),{route:null,prev:r})}_reportUnknownKey(e){this._issues?.record(qa.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)??du.DEFAULT,routed:uu[t]!==void 0};return e}getAll(){return Object.fromEntries(this._values)}applyAll(){for(let[e,t]of this._values){let n=uu[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(uu))t in e&&(this._values.set(t,e[t]),this._sources.set(t,du.DEFAULT));for(let[t,n]of Object.entries(fu))t in e&&(this._values.set(n,e[t]),this._sources.set(n,du.DEFAULT))}},mu=e=>Math.min(Math.max(e,0),1);function hu(e,t,n,r,i){i[0]=mu(e),i[1]=mu(t),i[2]=mu(n)}function gu(e,t,n,r,i){i[0]=mu(e*r),i[1]=mu(t*r),i[2]=mu(n*r)}function _u(e,t,n,r,i){e*=r,t*=r,n*=r,i[0]=mu(e/(e+1)),i[1]=mu(t/(t+1)),i[2]=mu(n/(n+1))}function vu(e,t,n,r,i){e=Math.max(e*r-.004,0),t=Math.max(t*r-.004,0),n=Math.max(n*r-.004,0);let a=e=>(e*(6.2*e+.5)/(e*(6.2*e+1.7)+.06))**2.2;i[0]=a(e),i[1]=a(t),i[2]=a(n)}function yu(e,t,n,r,i){e=e*r/.6,t=t*r/.6,n=n*r/.6;let a=.59719*e+.35458*t+.04823*n,o=.076*e+.90834*t+.01566*n,s=.0284*e+.13383*t+.83777*n,c=e=>(e*(e+.0245786)-90537e-9)/(e*(.983729*e+.432951)+.238081);a=c(a),o=c(o),s=c(s),i[0]=mu(1.60475*a-.53108*o-.07367*s),i[1]=mu(-.10208*a+1.10813*o-.00605*s),i[2]=mu(-.00327*a-.07276*o+1.07602*s)}function bu(e,t,n,r,i){e*=r,t*=r,n*=r;let a=.6274*e+.3293*t+.0433*n,o=.0691*e+.9195*t+.0113*n,s=.0164*e+.088*t+.8956*n,c=.856627153315983*a+.0951212405381588*o+.0482516061458583*s,l=.137318972929847*a+.761241990602591*o+.101439036467562*s,u=.11189821299995*a+.0767994186031903*o+.811302368396859*s,d=-12.47393,f=4.026069-d;c=mu((Math.log2(Math.max(c,1e-10))-d)/f),l=mu((Math.log2(Math.max(l,1e-10))-d)/f),u=mu((Math.log2(Math.max(u,1e-10))-d)/f);let p=e=>{let t=e*e,n=t*t;return 15.5*n*t-40.14*n*e+31.96*n-6.868*t*e+.4298*t+.1191*e-.00232};c=p(c),l=p(l),u=p(u);let m=1.1271005818144368*c-.11060664309660323*l-.016493938717834573*u,h=-.1413297634984383*c+1.157823702216272*l-.016493938717834257*u,g=-.14132976349843826*c-.11060664309660294*l+1.2519364065950405*u;m=Math.max(0,m)**2.2,h=Math.max(0,h)**2.2,g=Math.max(0,g)**2.2,i[0]=mu(1.6605*m-.5876*h-.0728*g),i[1]=mu(-.1246*m+1.1329*h-.0083*g),i[2]=mu(-.0182*m-.1006*h+1.1187*g)}function xu(e,t,n,r,i){let a=.76;e*=r,t*=r,n*=r;let o=Math.min(e,Math.min(t,n)),s=o<.08?o-6.25*o*o:.04;e-=s,t-=s,n-=s;let c=Math.max(e,Math.max(t,n));if(c<a){i[0]=e,i[1]=t,i[2]=n;return}let l=1-a,u=1-l*l/(c+l-a),d=u/c;e*=d,t*=d,n*=d;let f=1-1/(.15*(c-u)+1);i[0]=e+(u-e)*f,i[1]=t+(u-t)*f,i[2]=n+(u-n)*f}var Su=e=>(t,n,r,i,a)=>e(t>0?t:0,n>0?n:0,r>0?r:0,i,a),Cu=new Map([[r.NoToneMapping,Su(hu)],[r.LinearToneMapping,Su(gu)],[r.ReinhardToneMapping,Su(_u)],[r.CineonToneMapping,Su(vu)],[r.ACESFilmicToneMapping,Su(yu)],[r.AgXToneMapping,Su(bu)],[r.NeutralToneMapping,Su(xu)]]),wu=1/2.2;function Tu(e){return e<=.0031308?12.92*e:1.055*e**(1/2.4)-.055}function Eu(e,t){return t===r.NoToneMapping?1:e}var Du=.2126,Ou=.7152,ku=.0722;function Au(e,t){if(t===1)return;let n=e[0]*Du+e[1]*Ou+e[2]*ku;e[0]=n+(e[0]-n)*t,e[1]=n+(e[1]-n)*t,e[2]=n+(e[2]-n)*t}function ju(e,{exposure:t,toneMapping:n,saturation:i=1,preserveAlpha:a=!1}){let o=Cu.get(n)??Cu.get(r.NoToneMapping),s=Eu(t,n),c=new Uint8ClampedArray(e.length),l=[0,0,0];for(let t=0;t<e.length;t+=4)l[0]=e[t]*s,l[1]=e[t+1]*s,l[2]=e[t+2]*s,Au(l,i),o(l[0],l[1],l[2],1,l),c[t]=Tu(l[0])*255+.5,c[t+1]=Tu(l[1])*255+.5,c[t+2]=Tu(l[2])*255+.5,c[t+3]=a?e[t+3]*255+.5:255;return c}var Mu={STRING:`string`,NUMBER:`number`,WORD:`word`,LBRACKET:`[`,RBRACKET:`]`},Nu=e=>e===` `||e===` `||e===`
|
|
729
|
-
`||e===`\r`||e===`\f`,
|
|
730
|
-
`;)r++;continue}if(i===`[`){t.push({type:Mu.LBRACKET}),r++;continue}if(i===`]`){t.push({type:Mu.RBRACKET}),r++;continue}if(i===`"`){r++;let i=r;for(;r<n&&e[r]!==`"`;)r++;if(r>=n)throw Error(`PBRT tokenizer: unterminated string literal`);t.push({type:Mu.STRING,value:e.slice(i,r)}),r++;continue}if(Fu(i,e[r+1],e[r+2])){let i=r;for(r++;r<n;){let t=e[r];if(t>=`0`&&t<=`9`||t===`.`||t===`e`||t===`E`||t===`-`||t===`+`)r++;else break}let a=e.slice(i,r),o=Number(a);if(Number.isNaN(o))throw Error(`PBRT tokenizer: invalid number "${a}"`);t.push({type:Mu.NUMBER,value:o});continue}{let i=r;for(;r<n&&!Nu(e[r])&&e[r]!==`"`&&e[r]!==`[`&&e[r]!==`]`&&e[r]!==`#`;)r++;t.push({type:Mu.WORD,value:e.slice(i,r)})}}return t}function Lu(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function Ru(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 zu(e,t,n){return[1,0,0,0,0,1,0,0,0,0,1,0,e,t,n,1]}function Bu(e,t,n){return[e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1]}function Vu(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 Hu(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function Uu(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 Wu(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function Gu(e,t,n){let r=Wu(Hu(t,e)),i=Wu(Uu(Wu(n),r)),a=Uu(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 Ku(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 Lu();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 qu=class{constructor(e={}){this.resolveInclude=e.resolveInclude||(()=>{throw Error(`PBRTParser: Include used but no resolveInclude provided`)}),this.ir={film:null,camera:null,namedMaterials:new Map,namedTextures:new Map,shapes:[],lights:[],instances:[],objects:new Map,warnings:[]},this.ctm=Lu(),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.tokens=[],this.pos=0,this._warnedUnknown=new Set}parse(e,t=``){return this.dirStack=[t],this._run(Iu(e)),this.ir}_peek(){return this.tokens[this.pos]}_next(){return this.tokens[this.pos++]}_expectNumber(e){let t=this._next();if(!t||t.type!==Mu.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!==Mu.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===Mu.LBRACKET){this._next();let e=[];for(;this._peek()&&this._peek().type!==Mu.RBRACKET;)e.push(this._expectNumber(`transform element`));return this._next(),e}return this._readNumbers(e)}_parseParams(){let e={};for(;this._peek()&&this._peek().type===Mu.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()}}return e}_parseParamValue(){let e=[];if(this._peek()&&this._peek().type===Mu.LBRACKET){for(this._next();this._peek()&&this._peek().type!==Mu.RBRACKET;)e.push(this._coerceValueToken(this._next()));this._next()}else e.push(this._coerceValueToken(this._next()));return e}_coerceValueToken(e){if(!e)throw Error(`PBRT parser: unexpected EOF in parameter value`);if(e.type===Mu.NUMBER||e.type===Mu.STRING)return e.value;if(e.type===Mu.WORD)return e.value===`true`?!0:e.value===`false`?!1:e.value;throw Error(`PBRT parser: unexpected token in parameter value: ${e.type}`)}_run(e){let t=this.tokens,n=this.pos;for(this.tokens=e,this.pos=0;this.pos<this.tokens.length;){let e=this._next();if(e.type!==Mu.WORD)throw Error(`PBRT parser: expected directive, got ${e.type} ${e.value??``}`);this._directive(e.value)}this.tokens=t,this.pos=n}_directive(e){switch(e){case`Identity`:this.ctm=Lu();break;case`Translate`:{let[e,t,n]=this._readNumbers(3);this.ctm=Ru(this.ctm,zu(e,t,n));break}case`Scale`:{let[e,t,n]=this._readNumbers(3);this.ctm=Ru(this.ctm,Bu(e,t,n));break}case`Rotate`:{let[e,t,n,r]=this._readNumbers(4);this.ctm=Ru(this.ctm,Vu(e,t,n,r));break}case`LookAt`:{let e=this._readNumbers(9),t=Gu([e[0],e[1],e[2]],[e[3],e[4],e[5]],[e[6],e[7],e[8]]);this.ctm=Ru(this.ctm,Ku(t));break}case`Transform`:this.ctm=this._readBracketedOrBareNumbers(16);break;case`ConcatTransform`:{let e=this._readBracketedOrBareNumbers(16);this.ctm=Ru(this.ctm,e);break}case`CoordinateSystem`:this.coordSystems.set(this._expectString(`CoordinateSystem`),this.ctm.slice());break;case`CoordSysTransform`:{let e=this.coordSystems.get(this._expectString(`CoordSysTransform`));e&&(this.ctm=e.slice());break}case`Camera`:{let e=this._expectString(`Camera type`),t=this._parseParams();this.ir.camera={type:e,params:t,cameraToWorld:Ku(this.ctm)};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=Lu(),this.state={material:null,areaLight:null,reverseOrientation:!1};break;case`WorldEnd`:break;case`AttributeBegin`:this.attributeStack.push({ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation});break;case`AttributeEnd`:{let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation});break}case`TransformBegin`:this.transformStack.push(this.ctm.slice());break;case`TransformEnd`:{let e=this.transformStack.pop();e&&(this.ctm=e);break}case`ReverseOrientation`:this.state.reverseOrientation=!this.state.reverseOrientation;break;case`Attribute`:this._expectString(`Attribute target`),this._parseParams();break;case`ActiveTransform`:this._next();break;case`TransformTimes`:this._readNumbers(2);break;case`MediumInterface`:this._peek()&&this._peek().type===Mu.STRING&&this._next(),this._peek()&&this._peek().type===Mu.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.ir.lights.push({type:e,params:t,ctm:this.ctm.slice()});break}case`Shape`:{let e={type:this._expectString(`Shape type`),params:this._parseParams(),ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation};this._emitShape(e);break}case`ObjectBegin`:{let e=this._expectString(`ObjectBegin name`);this.attributeStack.push({ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation}),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;let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation});break}case`ObjectInstance`:{let e=this._expectString(`ObjectInstance name`);this.ir.instances.push({name:e,ctm:this.ctm.slice()});break}case`Include`:case`Import`:{let t=this._expectString(e);this._include(t);break}default:this._warnUnknown(e),this._parseParams();break}}_emitShape(e){this.currentObject===null?this.ir.shapes.push(e):(e.relativeCTM=Ru(Ku(this.objectBeginCTM),e.ctm),this.ir.objects.get(this.currentObject).push(e))}_include(e){let t=this.resolveInclude(e,this.dirStack[this.dirStack.length-1]);if(t==null){this._warn(`Include target not found: ${e}`);return}let n=e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`)):``;this.dirStack.push(n),this._run(Iu(t)),this.dirStack.pop()}_skipTypeAndParams(){this._peek()&&this._peek().type===Mu.STRING&&this._next(),this._parseParams()}_skipNamedAndParams(){this._peek()&&this._peek().type===Mu.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)}_warnUnknown(e){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(`Unsupported directive ignored: ${e}`))}},Ju={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]},Yu=[.92,.92,.92];function Xu(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 Zu(e,t,n){let r=e[t];return r&&typeof r.value[0]==`number`?r.value[0]:n}function Qu(e,t,n){let r=e[t];return r&&typeof r.value[0]==`string`?r.value[0]:n}async function $u(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:Xu(i.value[0]),texture:null};if(i.type===`spectrum`){if(typeof i.value[0]==`string`){let e=ed(i.value[0]);return e&&Ju[e]?{rgb:Ju[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 ed(e){let t=e.toLowerCase().match(/metal-([a-z]+)/);if(t)return t[1];for(let t of Object.keys(Ju))if(e.toLowerCase().includes(t))return t;return null}function td(e,t){if(e.roughness&&typeof e.roughness.value[0]==`number`)return e.roughness.value[0];let n=Zu(e,`uroughness`,null),r=Zu(e,`vroughness`,null);return n!==null&&r!==null?(n+r)/2:n===null?t:n}async function nd(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 $u(i,`reflectance`,t,[.5,.5,.5])),a.roughness=1,a.metalness=0;break;case`conductor`:case`metal`:{let e=await $u(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 $u(i,`eta`,t,[.2,.92,1.1])).rgb,n=(await $u(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 $u(i,`eta`,t,Yu)).rgb||Yu:Ju.cu);a.metalness=1,a.roughness=td(i,.1);break}case`dielectric`:case`thindielectric`:a.transmission=1,a.metalness=0,a.color.setRGB(1,1,1),a.ior=Zu(i,`eta`,1.5),a.roughness=td(i,0),a.thickness=n===`thindielectric`?0:Zu(i,`thickness`,0);break;case`coateddiffuse`:s(await $u(i,`reflectance`,t,[.5,.5,.5])),a.roughness=.6,a.metalness=0,a.clearcoat=1,a.clearcoatRoughness=td(i,0);break;case`diffusetransmission`:{let e=await $u(i,`transmittance`,t,[.25,.25,.25]);s(await $u(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,Zu(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([nd(o,t),nd(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 $u(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}var rd=[1,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,1],id=class{constructor(e={}){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}warn(e){this.warnings.push(e)}async build(e){this.ir=e;let t=new r.Group;t.name=`PBRTScene`;for(let n=0;n<e.shapes.length;n++){let r=await this._buildShapeMesh(e.shapes[n],e.shapes[n].ctm,`shape_${n}`);r&&t.add(r)}await this._buildInstances(e,t);let n=null;e.camera&&(n=this._buildCamera(e.camera,e.film),n&&t.add(n));let i=await this._buildEnvironment(e.lights);return this._reportUnsupportedLights(e.lights),{group:t,camera:n,environment:i,report:this.report,warnings:this.warnings.concat(e.warnings||[])}}async _buildInstances(e,t){let n=0;for(let r of e.instances){let i=e.objects.get(r.name);if(!i){this.warn(`ObjectInstance "${r.name}" has no template`);continue}for(let e of i){let i=Ru(r.ctm,e.relativeCTM||e.ctm),a=await this._buildShapeMesh(e,i,`instance_${n++}`);a&&t.add(a)}}}async _buildShapeMesh(e,t,n){let[i,a]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);if(!i)return null;let o=!!i.getAttribute(`uv`),s=a;a.map&&!o&&(this.warn(`${n} (${e.type}, "${e.material?.type||`diffuse`}") has a texture map but no UVs — dropping map, using base color`),s=a.clone(),s.map=null);let c=new r.Mesh(i,s);c.name=n;let l=this.convertHandedness?Ru(rd,t):t;new r.Matrix4().fromArray(l).decompose(c.position,c.quaternion,c.scale),c.updateMatrix(),i.computeBoundingBox();let u=i.boundingBox?i.boundingBox.clone().applyMatrix4(c.matrix).getSize(new r.Vector3):new r.Vector3;return this.report.push({mesh:n,shape:e.type,material:e.material?.type||`diffuse`,color:`#`+s.color.getHexString(),map:s.map?`yes`:`-`,uv:o?`yes`:`NO`,normals:i.getAttribute(`normal`)?`yes`:`NO`,emissive:s.emissiveIntensity>0?`#${s.emissive.getHexString()}×${s.emissiveIntensity}`:`-`,size:`${u.x.toFixed(2)}×${u.y.toFixed(2)}×${u.z.toFixed(2)}`,tris:i.index?i.index.count/3:i.getAttribute(`position`).count/3}),c}async _buildGeometry(e){switch(e.type){case`trianglemesh`:return this._triangleMesh(e.params);case`bilinearmesh`:return this._bilinearMesh(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(Float32Array.from(t),3));let i=e.N?.value;i&&i.length===t.length&&n.setAttribute(`normal`,new r.Float32BufferAttribute(Float32Array.from(i),3));let a=(e.uv||e.st)?.value;a&&a.length===t.length/3*2&&n.setAttribute(`uv`,new r.Float32BufferAttribute(Float32Array.from(a),2));let o=e.indices?.value;return o&&o.length&&n.setIndex(o),i||n.computeVertexNormals(),n}_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}async _plyMesh(e){let t=Qu(e,`filename`,null);if(!t)return this.warn(`plymesh missing filename`),null;try{let e=await this.resolvePLY(t);return e?(e.getAttribute(`normal`)||e.computeVertexNormals(),e):(this.warn(`plymesh file not found: ${t}`),null)}catch(e){return this.warn(`failed to load plymesh ${t}: ${e.message}`),null}}_sphere(e){return new r.SphereGeometry(Zu(e,`radius`,1),48,32)}_disk(e){let t=Zu(e,`radius`,1),n=Zu(e,`innerradius`,0),i=Zu(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 nd(e.material,n);return e.areaLight&&await this._applyAreaLight(r,e.areaLight,n),t.set(e.areaLight,r),r}async _applyAreaLight(e,t,n){let r=await $u(t.params,`L`,n,[1,1,1]),i=Zu(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=Qu(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 t.class===`scale`?n=await this._resolveScaleTexture(e,t):this.warn(`texture class "${t.class}" not supported (texture "${e}")`);return this._textureCache.set(e,n),n}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=new r.Matrix4().fromArray(e.cameraToWorld).elements,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);let s=i.clone().add(a),c=t&&t.yresolution?t.xresolution/t.yresolution:16/9,l=new r.PerspectiveCamera(this._verticalFov(e.params,c),c,.01,1e4);return l.name=`PBRT Camera`,l.up.copy(o.normalize()),l.position.copy(i),l.lookAt(s),l.updateMatrixWorld(!0),l}_verticalFov(e,t){let n=Zu(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}async _buildEnvironment(e){let t=e.find(e=>e.type===`infinite`);if(!t)return null;let n=Zu(t.params,`scale`,1),i=Qu(t.params,`filename`,null);if(i)try{let e=await this.resolveEnvironment(i);if(e)return 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 $u(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)`)}},ad=new TextDecoder;function od(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 sd(e,t){return!e||t.startsWith(`/`)?od(t):od(`${e}/${t}`)}var cd=class{constructor(e){this.byPath=new Map,this.byBase=new Map;for(let t in e){let n=od(t).toLowerCase(),r={norm:n,bytes:e[t]};this.byPath.set(n,r);let i=n.split(`/`).pop(),a=this.byBase.get(i);a?a.push(r):this.byBase.set(i,[r])}}find(e){let t=od(e).toLowerCase();if(this.byPath.has(t))return this.byPath.get(t).bytes;let n=this.byBase.get(t.split(`/`).pop());return n?(n.find(e=>e.norm.endsWith(`/`+t))||n[0]).bytes:null}};function ld(e){let t=Object.keys(e).filter(e=>e.toLowerCase().endsWith(`.pbrt`));if(t.length===0)return null;let n=t.filter(e=>/(^|\/)(scene|main)\.pbrt$/i.test(e)),r=n.length?n:t;return r.sort((e,t)=>{let n=e.split(`/`).length,r=t.split(`/`).length;return n===r?e.length-t.length:n-r}),r[0]}async function ud(e){let{vfs:t,plyParser:n,imageFromBytes:r,envFromBytes:i,convertHandedness:a}=e,o=new cd(t),s=e.entryPath||ld(t);if(!s)throw Error(`PBRT loader: no .pbrt file found in archive`);let c=o.find(s);if(!c)throw Error(`PBRT loader: entry "${s}" not readable`);let l=s.includes(`/`)?s.slice(0,s.lastIndexOf(`/`)):``,u=new qu({resolveInclude:(e,t)=>{let n=o.find(sd(t,e))||o.find(e);return n?ad.decode(n):null}}).parse(ad.decode(c),l),d=e=>e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);return{...await new id({convertHandedness:a,resolvePLY:async e=>{let t=o.find(e);return t?n(d(t)):null},resolveImage:async e=>{let t=o.find(e);return t?r(t,e):null},resolveEnvironment:async e=>{let t=o.find(e);return t?(i||r)(t,e):null}}).build(u),entryPath:s}}var dd=[`sourceFile`,`url`,`file`];function fd(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 pd(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)?t:void 0}function md(e){let t=fd(e);if(!t)return null;let n=fd(t.rayzee);return n&&n.environment!==void 0?n:t.environment===void 0?null:t}function hd(e){let t=fd(e);if(!t)return null;let n=dd.map(e=>t[e]).find(e=>typeof e==`string`&&e.trim());if(!n)return null;let r=pd(t.rotation),i=pd(t.intensity),a={sourceFile:n.trim()};return r!==void 0&&(a.rotation=r),i!==void 0&&(a.intensity=Math.max(0,i)),a}function gd(e){let t=md(e);if(!t)return null;let n=hd(t.environment);return n?{environment:n}:null}function _d(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=gd(e);if(t)return t}return null}var vd={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`}},yd=/\.(usd|usda|usdc)$/i,bd=/\.(png|jpg|jpeg|avif)$/i;function xd(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}function Sd(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 Cd=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.loaderCache={},this.uploadedFileInfo=null,this.animations=[],this.renderer=null,this.sceneMetadata=null,this._loadingManager=new r.LoadingManager,this._loadCancelled=!1,this._issues=i,this._profile=a??Re(),this._loadingManager.onError=e=>{this._loadCancelled||this._issues?.record(qa.ASSET_UNREACHABLE,`asset "${e}" could not be fetched — anything depending on it renders without it`,{url:e})}}cancelActiveLoad(){this._loadCancelled=!0,this._loadingManager.abort()}_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;z({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){z({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.targetModel&&(this.removeModelRoot(this.targetModel),this.targetModel=null,this.animations=[])}setRenderer(e){this.renderer=e}getFileFormat(e){return vd[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){let t=e.name,n=this.getFileFormat(t);if(!n)throw Error(`Unsupported file format: ${t}`);z({isLoading:!0,status:`Loading ${n.name}...`,progress:2});try{let r;switch(n.type){case`model`:r=await this.loadModelFromFile(e,t);break;case`environment`:case`image`:r=await this.loadEnvironmentFromFile(e,t);break;case`archive`:r=await this.loadArchiveFromFile(e,t);break;default:throw Error(`Unknown asset type: ${n.type}`)}return r}catch(e){throw this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadModelFromFile(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 e=await this.loadEnvironment(n);return this.dispatchEvent({type:`load`,texture:e,filename:t}),e}finally{URL.revokeObjectURL(n)}}async loadEnvironment(e){this._loadCancelled=!1;try{this.dispatchEvent({type:`beforeEnvironmentLoad`,url:e});let t;if(e.startsWith(`blob:`))t=await this.loadEnvironmentFromBlob(e);else{let n=e.split(/[?#]/)[0].split(`.`).pop().toLowerCase();t=await this.loadEnvironmentByExtension(e,n)}return t.generateMipmaps=!0,this.applyEnvironmentToScene(t),this.dispatchEvent({type:`load`,texture:t,url:e,filename:e.split(/[?#]/)[0].split(`/`).pop()}),t}catch(t){throw this._isCancellation(t)?this._cancellationError():(console.error(`Error loading environment:`,t),this.dispatchEvent({type:`error`,message:t.message,filename:e}),t)}}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=this._downloadProgress(`Downloading Environment...`,i),o;return n===`hdr`||n===`exr`?o=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(t,a):(this.loaderCache.texture||(this.loaderCache.texture=new r.TextureLoader(this._loadingManager)),o=await this.loaderCache.texture.loadAsync(t,a),o.colorSpace=r.SRGBColorSpace),this._downloadComplete(`Processing Environment...`,62),o.mapping=r.EquirectangularReflectionMapping,o.minFilter=r.LinearFilter,o.magFilter=r.LinearFilter,o}applyEnvironmentToScene(e){this.scene.background=e,this.scene.environment=e}async loadArchiveFromFile(e,t){try{let n=await this.readFileAsArrayBuffer(e),r=(0,m.unzipSync)(new Uint8Array(n));return ld(r)?await this.loadPBRTFromZip(r,t):await this.processObjMtlPairsInZip(r,t)||await this.findAndLoadModelFromZip(r,t)}catch(e){throw console.error(`Error loading ZIP archive:`,e),e}}async loadPBRTFromZip(e,t){if(z({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{group:n,environment:r,report:i,warnings:a,entryPath:o}=await ud({vfs:e,plyParser:e=>this.loaderCache.ply.parse(e),imageFromBytes:(e,t)=>this._pbrtTextureFromBytes(e,t),envFromBytes:async(e,t)=>{let n=t.split(`.`).pop().toLowerCase(),r=URL.createObjectURL(new Blob([e]));try{return await this.loadEnvironmentByExtension(r,n)}finally{URL.revokeObjectURL(r)}}});return i&&i.length&&typeof console.table==`function`&&(console.groupCollapsed(`PBRT loader: ${i.length} mesh(es) from "${o}"`),console.table(i),console.groupEnd()),a&&a.length&&(console.warn(`PBRT loader: ${a.length} warning(s) parsing "${o}"`),a.forEach(e=>console.warn(` •`,e))),r?.texture&&(r.texture.generateMipmaps=!0,this.applyEnvironmentToScene(r.texture)),n.name=o||t,this.releaseTargetModel(),this.targetModel=n,z({isLoading:!0,status:`Processing PBRT geometry...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:`${o} (from ZIP)`}),n}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(vd[n]&&vd[n].type===`model`)return yd.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=>yd.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&&(yd.test(e)||bd.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(yd,``)===t[t.length-2]})||r[0]}async loadModelFromZipEntry(e,t,n,r){try{z({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=_d(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 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 s.preload(),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);f.preload();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}=Do(),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){this._loadCancelled=!1;let n=await this.createGLTFLoader(),r=e._isNetworkUrl(t);try{z({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:r,loadedBytes:0,totalBytes:0});let e=await n.loadAsync(t,this._downloadProgress(`Downloading Model...`,r));return this._downloadComplete(),this.releaseTargetModel(),this.targetModel=e.scene,this.animations=e.animations||[],this.sceneMetadata=_d(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{this._disposeGLTFLoader(n)}}_processAndParent(e){this.processModelObjects(e),this.scene.add(e),e.updateMatrixWorld(!0)}async appendModel(t){this._loadCancelled=!1;let n=await this.createGLTFLoader(),r=e._isNetworkUrl(t);try{z({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:r,loadedBytes:0,totalBytes:0});let e=await n.loadAsync(t,this._downloadProgress(`Downloading Model...`,r));return this._downloadComplete(),this._processAndParent(e.scene),{root:e.scene,animations:e.animations||[]}}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._disposeGLTFLoader(n)}}appendObject3D(e,t=`object3d`){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{z({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=_d(r),z({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(z({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,z({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(z({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,z({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(z({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,z({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(z({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,z({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(z({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,z({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(z({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,z({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(z({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,z({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,z({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 fo(`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 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();e.getWorldPosition(n.position),e.getWorldQuaternion(n.quaternion),(!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*=Sd(e,e.width,e.height,n),n.__radianceConverted=!0),(e.isPointLight||e.isSpotLight)&&!n.__candelaConverted&&(e.intensity*=4*Math.PI,n.__candelaConverted=!0),e.name.startsWith(`RectAreaLightPlaceholder`)&&n.name&&n.type===`RectAreaLight`){let t=n.normalize??!0,i=n.shape??`rectangle`,a=n.intensity*Sd(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=xd(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}getTargetModel(){return this.targetModel}getSupportedFormats(e=null){if(e){let t={};for(let[n,r]of Object.entries(vd))r.type===e&&(t[n]=r);return t}return vd}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.releaseTargetModel()}removeAllEventListeners(){this._listeners=void 0}},wd=class extends r.EventDispatcher{constructor(e){super();let t=e.clientWidth,n=e.clientHeight;this.camera=new r.PerspectiveCamera(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.interactionManager=null,this.cameras=[this.camera],this.currentCameraIndex=0,this._userCameraCounter=0,this.autoFocusMode=qe.SMOOTHING_FACTOR?`auto`:`manual`,this.afScreenPoint={x:.5,y:.5},this.afSmoothingFactor=qe.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}addCameraFromView(e){let t=this.camera,n=new r.PerspectiveCamera(t.fov,t.aspect,t.near,t.far);return n.position.copy(t.position),n.quaternion.copy(t.quaternion),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`),autoFocusMode:this.autoFocusMode,afScreenPoint:{...this.afScreenPoint}}:null}_applyEffects(e){e&&(this._applySettings?.({enableDOF:e.enableDOF,focusDistance:e.focusDistance,aperture:e.aperture,focalLength:e.focalLength,apertureScale:e.apertureScale,anamorphicRatio:e.anamorphicRatio}),e.autoFocusMode!==void 0&&this.setAutoFocusMode(e.autoFocusMode),e.afScreenPoint&&this.setAFScreenPoint(e.afScreenPoint.x,e.afScreenPoint.y))}_getSceneScale(){return this._afContext?.assetLoader?.getSceneScale?.()||1}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(),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.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.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._applyEffects(this.cameras[e]?.userData?.__rayzeeEffects),n?.(),i?.();let o=this._captureEffects();o&&(o.focusDistance/=this._getSceneScale()),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:e,effects:o,fov:this.camera.fov})}focusOn(e){!e||!this.controls||(this.controls.target.copy(e),this.controls.update(),this._onReset?.())}get active(){return this.camera}getNames(){return this.getCameraNames()}setAutoFocusMode(e){this.autoFocusMode=e,e!==`manual`&&(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{meshScene:t,assetLoader:n,floorPlane:r,currentFocusDistance:i,pathTracer:a,setFocusDistance:o,softReset:s,hardReset:c}=e||this._afContext||{};if(!t||this.autoFocusMode===`manual`)return;if(!a?.enableDOF?.value){this._afSuspended=!0;return}this._afSuspended&&(this._afSuspended=!1,this._smoothedFocusDistance=null);let l=a;if(l?.isReady&&l.renderMode?.value===1&&l.frameCount>0&&!l.isComplete)return;let u=this.afScreenPoint.x*2-1,d=-(this.afScreenPoint.y*2-1),f=this.interactionManager?.raycaster;if(!f)return;f.setFromCamera({x:u,y:d},this.camera);let p=f.intersectObjects(t.children,!0).find(e=>e.object!==this.interactionManager?.focusPointIndicator&&e.object!==r&&!e.object.name.includes(`Helper`)&&e.object.type===`Mesh`),m;if(p)m=p.distance,this._lastValidFocusDistance=m;else if(this._lastValidFocusDistance!==null)m=this._lastValidFocusDistance;else{let e=n?.getSceneScale()||1;m=qe.FALLBACK_DISTANCE*e,this._lastValidFocusDistance=m}let h=this._afPointDirty;this._afPointDirty=!1,h||this._smoothedFocusDistance===null||this._smoothedFocusDistance===0||Math.abs(m-this._smoothedFocusDistance)/this._smoothedFocusDistance>qe.SNAP_THRESHOLD?this._smoothedFocusDistance=m:this._smoothedFocusDistance+=this.afSmoothingFactor*(m-this._smoothedFocusDistance);let g=i,_=this._smoothedFocusDistance;if(h||g===0||Math.abs(_-g)/Math.max(g,.001)>.001){o(_);let e=n?.getSceneScale()||1;this.dispatchEvent({type:R.AUTO_FOCUS_UPDATED,distance:_/e});let t=Math.abs(_-g)/Math.max(g,.001);h?c?.():t>qe.RESET_THRESHOLD&&s?.()}}setInteractionManager(e){this.interactionManager=e}initAutoFocus({meshScene:e,assetLoader:t,floorPlane:n,pathTracer:r,settings:i,softReset:a,hardReset:o}){this._afContext={meshScene:e,assetLoader:t,floorPlane:n,pathTracer:r,setFocusDistance:e=>i.set(`focusDistance`,e,{silent:!0}),softReset:a,hardReset:o},Object.defineProperty(this._afContext,`currentFocusDistance`,{get:()=>i.get(`focusDistance`)})}dispose(){this.controls?.dispose()}},Td=class extends r.EventDispatcher{constructor(e,t,n,r={}){super(),this.scene=e,this.sceneHelpers=t,this.pathTracer=n,this._onReset=r.onReset||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.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.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){this._removeAllLights();let t=e.getObjectsByProperty(`isLight`,!0);if(!t||t.length===0){this.updateLights();return}for(let e of t){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()}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.sceneHelpers?.clear(),this._removeAllLights(),this._onReset=null,this.pathTracer=null,this.sceneHelpers=null,this.scene=null)}_removeAllLights(){this.scene.getObjectsByProperty(`isLight`,!0).forEach(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}},Ed=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=>Dd(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:Od(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}};function Dd(e){return new Promise((t,n)=>{let r=new Image;r.crossOrigin=`anonymous`,r.onload=()=>t(r),r.onerror=()=>n(Error(`Failed to load gobo image: ${e}`)),r.src=e})}function Od(e){return Math.max(0,Math.min(1,e))}function kd(e,t=`ies`){let n=e.search(/TILT\s*=/i);if(n<0)throw Error(`IES (${t}): missing TILT line`);let r=e.indexOf(`
|
|
731
|
-
`,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=
|
|
728
|
+
`),ld=class extends _e{constructor(e,r={}){super(`AutoExposure`,{...r,executionMode:ge.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)(rd,`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=Jn((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)(id)).div((0,n.float)(ad)).mul((0,n.float)(rd)).floor().clamp(0,(0,n.float)(rd-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)(sd)));(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)(rd,({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)(rd,({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)(id).add((0,n.float)(t).add(.5).mul((0,n.float)(od)));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=cd(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()}},ud=class extends _e{constructor(e,i={}){super(`Compositor`,{...i,executionMode:ge.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,Vn)),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`)||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,Vn).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}},dd=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={}}},fd=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):[]}},pd=!1,md=[],hd=new WeakMap;function gd(e){pd=!!e}function _d(){return md.slice()}function vd(){md.length=0}function yd(e){let t=[];for(let n of Object.keys(e))e[n]?.isTextureNode===!0&&t.push(n);return t}var bd=e=>!e||!e.image||!(e.image.width>0);function xd(e,t,n){if(!pd){n();return}let r=hd.get(e);if(r||(r={phase:`pending`,unboundAtCompile:[]},hd.set(e,r)),r.phase!==`pending`){n(),r.phase===`watch`&&Sd(e,r);return}let i=Object.prototype.hasOwnProperty.call(t,`compute`),a=t.compute;t.compute=function(...t){return r.phase===`pending`&&(r.unboundAtCompile=yd(e).filter(t=>bd(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 Sd(e,t){let n=[];for(let r of t.unboundAtCompile){let t=e[r]?.value;if(bd(t))return;t.isStorageTexture!==!0&&n.push(r)}t.phase=`done`,n.length!==0&&md.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 Cd=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(to.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 dd,this.eventBus=new fd,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(xd(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()}},wd=xt(`engine`),Td=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,wd.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}},Ed=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:V.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=e.distance;this.showFocusPoint(e.point),this.toggleFocusMode(),this.dispatchEvent({type:`focusChanged`,distance:t/this.assetLoader.getSceneScale(),worldDistance:t})}}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}}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:V.OBJECT_SELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`objectDeselected`,t=>{this.select(null),e.refreshFrame(),e.dispatchEvent({type:V.OBJECT_DESELECTED,object:t.object,uuid:t.uuid})}),this.addEventListener(`selectModeChanged`,t=>{e.dispatchEvent({type:V.SELECT_MODE_CHANGED,enabled:t.enabled})}),this.addEventListener(`objectDoubleClicked`,t=>{this.select(t.object),e.refreshFrame(),e.dispatchEvent({type:V.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:V.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}},Dd={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},samplingTechnique:{uniform:`samplingTechnique`,reset:!0},fireflyThreshold:{uniform:`fireflyThreshold`,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},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`}},Od=Object.freeze({DEFAULT:`default`,HOST:`host`,SCENE_METADATA:`scene-metadata`,MODE_PRESET:`mode-preset`}),kd={bounces:`maxBounces`,debugMode:`visMode`},Ad=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,cameraManager:o}){let s=new r.Vector2,c=(t,n)=>{s.set(n?.[0]??0,n?.[1]??0).multiplyScalar(r.MathUtils.DEG2RAD),e.pathTracer?.setUniform(t,s)};return{handleCameraProjection:t=>{let n=t===`equirectangular`;e.pathTracer?.setUniform(`cameraProjection`,+!!n),n&&(a?.requiresMotionVectors&&a.setDenoiserStrategy(`edgeaware`),o?.setAutoFocusMode(`manual`))},handlePanoramaLonRange:e=>c(`panoLonRange`,e),handlePanoramaLatRange:e=>c(`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)}}}set(e,t,{reset:n,silent:r,source:i=Od.HOST}={}){let a=this._applyOne(e,t,i);a?.route&&((n===void 0?a.route.reset??!0:n)&&this._resetCallback?.(),r||this.dispatchEvent({type:V.SETTING_CHANGED,key:e,value:t,prev:a.prev}))}setMany(e,{silent:t,reset:n,source:r=Od.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:V.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=Dd[e];return i?(this._applyRoute(i,t,r),{route:i,prev:r}):(this._reportUnknownKey(e),{route:null,prev:r})}_reportUnknownKey(e){this._issues?.record(to.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)??Od.DEFAULT,routed:Dd[t]!==void 0};return e}getAll(){return Object.fromEntries(this._values)}applyAll(){for(let[e,t]of this._values){let n=Dd[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(Dd))t in e&&(this._values.set(t,e[t]),this._sources.set(t,Od.DEFAULT));for(let[t,n]of Object.entries(kd))t in e&&(this._values.set(n,e[t]),this._sources.set(n,Od.DEFAULT))}},jd={STRING:`string`,NUMBER:`number`,WORD:`word`,LBRACKET:`[`,RBRACKET:`]`},Md=e=>e===` `||e===` `||e===`
|
|
729
|
+
`||e===`\r`||e===`\f`,Nd=e=>e>=`0`&&e<=`9`,Pd=(e,t,n)=>!!(Nd(e)||e===`.`&&Nd(t)||(e===`-`||e===`+`)&&(Nd(t)||t===`.`&&Nd(n)));function Fd(e){let t=[],n=e.length,r=0;for(;r<n;){let i=e[r];if(Md(i)){r++;continue}if(i===`#`){for(;r<n&&e[r]!==`
|
|
730
|
+
`;)r++;continue}if(i===`[`){t.push({type:jd.LBRACKET}),r++;continue}if(i===`]`){t.push({type:jd.RBRACKET}),r++;continue}if(i===`"`){r++;let i=r;for(;r<n&&e[r]!==`"`;)r++;if(r>=n)throw Error(`PBRT tokenizer: unterminated string literal`);t.push({type:jd.STRING,value:e.slice(i,r)}),r++;continue}if(Pd(i,e[r+1],e[r+2])){let i=r;for(r++;r<n;){let t=e[r];if(t>=`0`&&t<=`9`||t===`.`||t===`e`||t===`E`||t===`-`||t===`+`)r++;else break}let a=e.slice(i,r),o=Number(a);if(Number.isNaN(o))throw Error(`PBRT tokenizer: invalid number "${a}"`);t.push({type:jd.NUMBER,value:o});continue}{let i=r;for(;r<n&&!Md(e[r])&&e[r]!==`"`&&e[r]!==`[`&&e[r]!==`]`&&e[r]!==`#`;)r++;t.push({type:jd.WORD,value:e.slice(i,r)})}}return t}function Id(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function Ld(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 Rd(e,t,n){return[1,0,0,0,0,1,0,0,0,0,1,0,e,t,n,1]}function zd(e,t,n){return[e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1]}function Bd(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 Vd(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function Hd(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 Ud(e){let t=Math.hypot(e[0],e[1],e[2])||1;return[e[0]/t,e[1]/t,e[2]/t]}function Wd(e,t,n){let r=Ud(Vd(t,e)),i=Ud(Hd(Ud(n),r)),a=Hd(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 Gd(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 Id();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 Kd=class{constructor(e={}){this.resolveInclude=e.resolveInclude||(()=>{throw Error(`PBRTParser: Include used but no resolveInclude provided`)}),this.ir={film:null,camera:null,namedMaterials:new Map,namedTextures:new Map,shapes:[],lights:[],instances:[],objects:new Map,warnings:[]},this.ctm=Id(),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.tokens=[],this.pos=0,this._warnedUnknown=new Set}parse(e,t=``){return this.dirStack=[t],this._run(Fd(e)),this.ir}_peek(){return this.tokens[this.pos]}_next(){return this.tokens[this.pos++]}_expectNumber(e){let t=this._next();if(!t||t.type!==jd.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!==jd.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===jd.LBRACKET){this._next();let e=[];for(;this._peek()&&this._peek().type!==jd.RBRACKET;)e.push(this._expectNumber(`transform element`));return this._next(),e}return this._readNumbers(e)}_parseParams(){let e={};for(;this._peek()&&this._peek().type===jd.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()}}return e}_parseParamValue(){let e=[];if(this._peek()&&this._peek().type===jd.LBRACKET){for(this._next();this._peek()&&this._peek().type!==jd.RBRACKET;)e.push(this._coerceValueToken(this._next()));this._next()}else e.push(this._coerceValueToken(this._next()));return e}_coerceValueToken(e){if(!e)throw Error(`PBRT parser: unexpected EOF in parameter value`);if(e.type===jd.NUMBER||e.type===jd.STRING)return e.value;if(e.type===jd.WORD)return e.value===`true`?!0:e.value===`false`?!1:e.value;throw Error(`PBRT parser: unexpected token in parameter value: ${e.type}`)}_run(e){let t=this.tokens,n=this.pos;for(this.tokens=e,this.pos=0;this.pos<this.tokens.length;){let e=this._next();if(e.type!==jd.WORD)throw Error(`PBRT parser: expected directive, got ${e.type} ${e.value??``}`);this._directive(e.value)}this.tokens=t,this.pos=n}_directive(e){switch(e){case`Identity`:this.ctm=Id();break;case`Translate`:{let[e,t,n]=this._readNumbers(3);this.ctm=Ld(this.ctm,Rd(e,t,n));break}case`Scale`:{let[e,t,n]=this._readNumbers(3);this.ctm=Ld(this.ctm,zd(e,t,n));break}case`Rotate`:{let[e,t,n,r]=this._readNumbers(4);this.ctm=Ld(this.ctm,Bd(e,t,n,r));break}case`LookAt`:{let e=this._readNumbers(9),t=Wd([e[0],e[1],e[2]],[e[3],e[4],e[5]],[e[6],e[7],e[8]]);this.ctm=Ld(this.ctm,Gd(t));break}case`Transform`:this.ctm=this._readBracketedOrBareNumbers(16);break;case`ConcatTransform`:{let e=this._readBracketedOrBareNumbers(16);this.ctm=Ld(this.ctm,e);break}case`CoordinateSystem`:this.coordSystems.set(this._expectString(`CoordinateSystem`),this.ctm.slice());break;case`CoordSysTransform`:{let e=this.coordSystems.get(this._expectString(`CoordSysTransform`));e&&(this.ctm=e.slice());break}case`Camera`:{let e=this._expectString(`Camera type`),t=this._parseParams();this.ir.camera={type:e,params:t,cameraToWorld:Gd(this.ctm)};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=Id(),this.state={material:null,areaLight:null,reverseOrientation:!1};break;case`WorldEnd`:break;case`AttributeBegin`:this.attributeStack.push({ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation});break;case`AttributeEnd`:{let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation});break}case`TransformBegin`:this.transformStack.push(this.ctm.slice());break;case`TransformEnd`:{let e=this.transformStack.pop();e&&(this.ctm=e);break}case`ReverseOrientation`:this.state.reverseOrientation=!this.state.reverseOrientation;break;case`Attribute`:this._expectString(`Attribute target`),this._parseParams();break;case`ActiveTransform`:this._next();break;case`TransformTimes`:this._readNumbers(2);break;case`MediumInterface`:this._peek()&&this._peek().type===jd.STRING&&this._next(),this._peek()&&this._peek().type===jd.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.ir.lights.push({type:e,params:t,ctm:this.ctm.slice()});break}case`Shape`:{let e={type:this._expectString(`Shape type`),params:this._parseParams(),ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation};this._emitShape(e);break}case`ObjectBegin`:{let e=this._expectString(`ObjectBegin name`);this.attributeStack.push({ctm:this.ctm.slice(),material:this.state.material,areaLight:this.state.areaLight,reverseOrientation:this.state.reverseOrientation}),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;let e=this.attributeStack.pop();e&&(this.ctm=e.ctm,this.state={material:e.material,areaLight:e.areaLight,reverseOrientation:e.reverseOrientation});break}case`ObjectInstance`:{let e=this._expectString(`ObjectInstance name`);this.ir.instances.push({name:e,ctm:this.ctm.slice()});break}case`Include`:case`Import`:{let t=this._expectString(e);this._include(t);break}default:this._warnUnknown(e),this._parseParams();break}}_emitShape(e){this.currentObject===null?this.ir.shapes.push(e):(e.relativeCTM=Ld(Gd(this.objectBeginCTM),e.ctm),this.ir.objects.get(this.currentObject).push(e))}_include(e){let t=this.resolveInclude(e,this.dirStack[this.dirStack.length-1]);if(t==null){this._warn(`Include target not found: ${e}`);return}let n=e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`)):``;this.dirStack.push(n),this._run(Fd(t)),this.dirStack.pop()}_skipTypeAndParams(){this._peek()&&this._peek().type===jd.STRING&&this._next(),this._parseParams()}_skipNamedAndParams(){this._peek()&&this._peek().type===jd.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)}_warnUnknown(e){this._warnedUnknown.has(e)||(this._warnedUnknown.add(e),this._warn(`Unsupported directive ignored: ${e}`))}},qd={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]},Jd=[.92,.92,.92];function Yd(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 Xd(e,t,n){let r=e[t];return r&&typeof r.value[0]==`number`?r.value[0]:n}function Zd(e,t,n){let r=e[t];return r&&typeof r.value[0]==`string`?r.value[0]:n}async function Qd(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:Yd(i.value[0]),texture:null};if(i.type===`spectrum`){if(typeof i.value[0]==`string`){let e=$d(i.value[0]);return e&&qd[e]?{rgb:qd[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 $d(e){let t=e.toLowerCase().match(/metal-([a-z]+)/);if(t)return t[1];for(let t of Object.keys(qd))if(e.toLowerCase().includes(t))return t;return null}function ef(e,t){if(e.roughness&&typeof e.roughness.value[0]==`number`)return e.roughness.value[0];let n=Xd(e,`uroughness`,null),r=Xd(e,`vroughness`,null);return n!==null&&r!==null?(n+r)/2:n===null?t:n}async function tf(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 Qd(i,`reflectance`,t,[.5,.5,.5])),a.roughness=1,a.metalness=0;break;case`conductor`:case`metal`:{let e=await Qd(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 Qd(i,`eta`,t,[.2,.92,1.1])).rgb,n=(await Qd(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 Qd(i,`eta`,t,Jd)).rgb||Jd:qd.cu);a.metalness=1,a.roughness=ef(i,.1);break}case`dielectric`:case`thindielectric`:a.transmission=1,a.metalness=0,a.color.setRGB(1,1,1),a.ior=Xd(i,`eta`,1.5),a.roughness=ef(i,0),a.thickness=n===`thindielectric`?0:Xd(i,`thickness`,0);break;case`coateddiffuse`:s(await Qd(i,`reflectance`,t,[.5,.5,.5])),a.roughness=.6,a.metalness=0,a.clearcoat=1,a.clearcoatRoughness=ef(i,0);break;case`diffusetransmission`:{let e=await Qd(i,`transmittance`,t,[.25,.25,.25]);s(await Qd(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,Xd(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([tf(o,t),tf(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 Qd(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}var nf=[1,0,0,0,0,1,0,0,0,0,-1,0,0,0,0,1],rf=class{constructor(e={}){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}warn(e){this.warnings.push(e)}async build(e){this.ir=e;let t=new r.Group;t.name=`PBRTScene`;for(let n=0;n<e.shapes.length;n++){let r=await this._buildShapeMesh(e.shapes[n],e.shapes[n].ctm,`shape_${n}`);r&&t.add(r)}await this._buildInstances(e,t);let n=null;e.camera&&(n=this._buildCamera(e.camera,e.film),n&&t.add(n));let i=await this._buildEnvironment(e.lights);return this._reportUnsupportedLights(e.lights),{group:t,camera:n,environment:i,report:this.report,warnings:this.warnings.concat(e.warnings||[])}}async _buildInstances(e,t){let n=0;for(let r of e.instances){let i=e.objects.get(r.name);if(!i){this.warn(`ObjectInstance "${r.name}" has no template`);continue}for(let e of i){let i=Ld(r.ctm,e.relativeCTM||e.ctm),a=await this._buildShapeMesh(e,i,`instance_${n++}`);a&&t.add(a)}}}async _buildShapeMesh(e,t,n){let[i,a]=await Promise.all([this._buildGeometry(e),this._getMaterial(e)]);if(!i)return null;let o=!!i.getAttribute(`uv`),s=a;a.map&&!o&&(this.warn(`${n} (${e.type}, "${e.material?.type||`diffuse`}") has a texture map but no UVs — dropping map, using base color`),s=a.clone(),s.map=null);let c=new r.Mesh(i,s);c.name=n;let l=this.convertHandedness?Ld(nf,t):t;new r.Matrix4().fromArray(l).decompose(c.position,c.quaternion,c.scale),c.updateMatrix(),i.computeBoundingBox();let u=i.boundingBox?i.boundingBox.clone().applyMatrix4(c.matrix).getSize(new r.Vector3):new r.Vector3;return this.report.push({mesh:n,shape:e.type,material:e.material?.type||`diffuse`,color:`#`+s.color.getHexString(),map:s.map?`yes`:`-`,uv:o?`yes`:`NO`,normals:i.getAttribute(`normal`)?`yes`:`NO`,emissive:s.emissiveIntensity>0?`#${s.emissive.getHexString()}×${s.emissiveIntensity}`:`-`,size:`${u.x.toFixed(2)}×${u.y.toFixed(2)}×${u.z.toFixed(2)}`,tris:i.index?i.index.count/3:i.getAttribute(`position`).count/3}),c}async _buildGeometry(e){switch(e.type){case`trianglemesh`:return this._triangleMesh(e.params);case`bilinearmesh`:return this._bilinearMesh(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(Float32Array.from(t),3));let i=e.N?.value;i&&i.length===t.length&&n.setAttribute(`normal`,new r.Float32BufferAttribute(Float32Array.from(i),3));let a=(e.uv||e.st)?.value;a&&a.length===t.length/3*2&&n.setAttribute(`uv`,new r.Float32BufferAttribute(Float32Array.from(a),2));let o=e.indices?.value;return o&&o.length&&n.setIndex(o),i||n.computeVertexNormals(),n}_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}async _plyMesh(e){let t=Zd(e,`filename`,null);if(!t)return this.warn(`plymesh missing filename`),null;try{let e=await this.resolvePLY(t);return e?(e.getAttribute(`normal`)||e.computeVertexNormals(),e):(this.warn(`plymesh file not found: ${t}`),null)}catch(e){return this.warn(`failed to load plymesh ${t}: ${e.message}`),null}}_sphere(e){return new r.SphereGeometry(Xd(e,`radius`,1),48,32)}_disk(e){let t=Xd(e,`radius`,1),n=Xd(e,`innerradius`,0),i=Xd(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 tf(e.material,n);return e.areaLight&&await this._applyAreaLight(r,e.areaLight,n),t.set(e.areaLight,r),r}async _applyAreaLight(e,t,n){let r=await Qd(t.params,`L`,n,[1,1,1]),i=Xd(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=Zd(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 t.class===`scale`?n=await this._resolveScaleTexture(e,t):this.warn(`texture class "${t.class}" not supported (texture "${e}")`);return this._textureCache.set(e,n),n}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=new r.Matrix4().fromArray(e.cameraToWorld).elements,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);let s=i.clone().add(a),c=t&&t.yresolution?t.xresolution/t.yresolution:16/9,l=new r.PerspectiveCamera(this._verticalFov(e.params,c),c,.01,1e4);return l.name=`PBRT Camera`,l.up.copy(o.normalize()),l.position.copy(i),l.lookAt(s),l.updateMatrixWorld(!0),l}_verticalFov(e,t){let n=Xd(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}async _buildEnvironment(e){let t=e.find(e=>e.type===`infinite`);if(!t)return null;let n=Xd(t.params,`scale`,1),i=Zd(t.params,`filename`,null);if(i)try{let e=await this.resolveEnvironment(i);if(e)return 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 Qd(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)`)}},af=new TextDecoder;function of(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 sf(e,t){return!e||t.startsWith(`/`)?of(t):of(`${e}/${t}`)}var cf=class{constructor(e){this.byPath=new Map,this.byBase=new Map;for(let t in e){let n=of(t).toLowerCase(),r={norm:n,bytes:e[t]};this.byPath.set(n,r);let i=n.split(`/`).pop(),a=this.byBase.get(i);a?a.push(r):this.byBase.set(i,[r])}}find(e){let t=of(e).toLowerCase();if(this.byPath.has(t))return this.byPath.get(t).bytes;let n=this.byBase.get(t.split(`/`).pop());return n?(n.find(e=>e.norm.endsWith(`/`+t))||n[0]).bytes:null}};function lf(e){let t=Object.keys(e).filter(e=>e.toLowerCase().endsWith(`.pbrt`));if(t.length===0)return null;let n=t.filter(e=>/(^|\/)(scene|main)\.pbrt$/i.test(e)),r=n.length?n:t;return r.sort((e,t)=>{let n=e.split(`/`).length,r=t.split(`/`).length;return n===r?e.length-t.length:n-r}),r[0]}async function uf(e){let{vfs:t,plyParser:n,imageFromBytes:r,envFromBytes:i,convertHandedness:a}=e,o=new cf(t),s=e.entryPath||lf(t);if(!s)throw Error(`PBRT loader: no .pbrt file found in archive`);let c=o.find(s);if(!c)throw Error(`PBRT loader: entry "${s}" not readable`);let l=s.includes(`/`)?s.slice(0,s.lastIndexOf(`/`)):``,u=new Kd({resolveInclude:(e,t)=>{let n=o.find(sf(t,e))||o.find(e);return n?af.decode(n):null}}).parse(af.decode(c),l),d=e=>e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);return{...await new rf({convertHandedness:a,resolvePLY:async e=>{let t=o.find(e);return t?n(d(t)):null},resolveImage:async e=>{let t=o.find(e);return t?r(t,e):null},resolveEnvironment:async e=>{let t=o.find(e);return t?(i||r)(t,e):null}}).build(u),entryPath:s}}var df=[`sourceFile`,`url`,`file`];function ff(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 pf(e){let t=typeof e==`string`?parseFloat(e):e;return Number.isFinite(t)?t:void 0}function mf(e){let t=ff(e);if(!t)return null;let n=ff(t.rayzee);return n&&n.environment!==void 0?n:t.environment===void 0?null:t}function hf(e){let t=ff(e);if(!t)return null;let n=df.map(e=>t[e]).find(e=>typeof e==`string`&&e.trim());if(!n)return null;let r=pf(t.rotation),i=pf(t.intensity),a={sourceFile:n.trim()};return r!==void 0&&(a.rotation=r),i!==void 0&&(a.intensity=Math.max(0,i)),a}function gf(e){let t=mf(e);if(!t)return null;let n=hf(t.environment);return n?{environment:n}:null}function _f(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=gf(e);if(t)return t}return null}var vf={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`}},yf=/\.(usd|usda|usdc)$/i,bf=/\.(png|jpg|jpeg|avif)$/i;function xf(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}function Sf(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 Cf=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.loaderCache={},this.uploadedFileInfo=null,this.animations=[],this.renderer=null,this.sceneMetadata=null,this._loadingManager=new r.LoadingManager,this._loadCancelled=!1,this._issues=i,this._profile=a??Fe(),this._loadingManager.onError=e=>{this._loadCancelled||this._issues?.record(to.ASSET_UNREACHABLE,`asset "${e}" could not be fetched — anything depending on it renders without it`,{url:e})}}cancelActiveLoad(){this._loadCancelled=!0,this._loadingManager.abort()}_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.targetModel&&(this.removeModelRoot(this.targetModel),this.targetModel=null,this.animations=[])}setRenderer(e){this.renderer=e}getFileFormat(e){return vf[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){let t=e.name,n=this.getFileFormat(t);if(!n)throw Error(`Unsupported file format: ${t}`);H({isLoading:!0,status:`Loading ${n.name}...`,progress:2});try{let r;switch(n.type){case`model`:r=await this.loadModelFromFile(e,t);break;case`environment`:case`image`:r=await this.loadEnvironmentFromFile(e,t);break;case`archive`:r=await this.loadArchiveFromFile(e,t);break;default:throw Error(`Unknown asset type: ${n.type}`)}return r}catch(e){throw this.dispatchEvent({type:`error`,message:e.message,filename:t}),e}}async loadModelFromFile(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 e=await this.loadEnvironment(n);return this.dispatchEvent({type:`load`,texture:e,filename:t}),e}finally{URL.revokeObjectURL(n)}}async loadEnvironment(e){this._loadCancelled=!1;try{this.dispatchEvent({type:`beforeEnvironmentLoad`,url:e});let t;if(e.startsWith(`blob:`))t=await this.loadEnvironmentFromBlob(e);else{let n=e.split(/[?#]/)[0].split(`.`).pop().toLowerCase();t=await this.loadEnvironmentByExtension(e,n)}return t.generateMipmaps=!0,this.applyEnvironmentToScene(t),this.dispatchEvent({type:`load`,texture:t,url:e,filename:e.split(/[?#]/)[0].split(`/`).pop()}),t}catch(t){throw this._isCancellation(t)?this._cancellationError():(console.error(`Error loading environment:`,t),this.dispatchEvent({type:`error`,message:t.message,filename:e}),t)}}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=this._downloadProgress(`Downloading Environment...`,i),o;return n===`hdr`||n===`exr`?o=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(t,a):(this.loaderCache.texture||(this.loaderCache.texture=new r.TextureLoader(this._loadingManager)),o=await this.loaderCache.texture.loadAsync(t,a),o.colorSpace=r.SRGBColorSpace),this._downloadComplete(`Processing Environment...`,62),o.mapping=r.EquirectangularReflectionMapping,o.minFilter=r.LinearFilter,o.magFilter=r.LinearFilter,o}applyEnvironmentToScene(e){this.scene.background=e,this.scene.environment=e}async loadArchiveFromFile(e,t){try{let n=await this.readFileAsArrayBuffer(e),r=(0,m.unzipSync)(new Uint8Array(n));return lf(r)?await this.loadPBRTFromZip(r,t):await this.processObjMtlPairsInZip(r,t)||await this.findAndLoadModelFromZip(r,t)}catch(e){throw console.error(`Error loading ZIP archive:`,e),e}}async loadPBRTFromZip(e,t){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{group:n,environment:r,report:i,warnings:a,entryPath:o}=await uf({vfs:e,plyParser:e=>this.loaderCache.ply.parse(e),imageFromBytes:(e,t)=>this._pbrtTextureFromBytes(e,t),envFromBytes:async(e,t)=>{let n=t.split(`.`).pop().toLowerCase(),r=URL.createObjectURL(new Blob([e]));try{return await this.loadEnvironmentByExtension(r,n)}finally{URL.revokeObjectURL(r)}}});return i&&i.length&&typeof console.table==`function`&&(console.groupCollapsed(`PBRT loader: ${i.length} mesh(es) from "${o}"`),console.table(i),console.groupEnd()),a&&a.length&&(console.warn(`PBRT loader: ${a.length} warning(s) parsing "${o}"`),a.forEach(e=>console.warn(` •`,e))),r?.texture&&(r.texture.generateMipmaps=!0,this.applyEnvironmentToScene(r.texture)),n.name=o||t,this.releaseTargetModel(),this.targetModel=n,H({isLoading:!0,status:`Processing PBRT geometry...`,progress:10}),await this.onModelLoad(this.targetModel),this.dispatchEvent({type:`load`,model:n,filename:`${o} (from ZIP)`}),n}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(vf[n]&&vf[n].type===`model`)return yf.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=>yf.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&&(yf.test(e)||bf.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(yf,``)===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=_f(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 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 s.preload(),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);f.preload();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}=ns(),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){this._loadCancelled=!1;let n=await this.createGLTFLoader(),r=e._isNetworkUrl(t);try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:r,loadedBytes:0,totalBytes:0});let e=await n.loadAsync(t,this._downloadProgress(`Downloading Model...`,r));return this._downloadComplete(),this.releaseTargetModel(),this.targetModel=e.scene,this.animations=e.animations||[],this.sceneMetadata=_f(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{this._disposeGLTFLoader(n)}}_processAndParent(e){this.processModelObjects(e),this.scene.add(e),e.updateMatrixWorld(!0)}async appendModel(t){this._loadCancelled=!1;let n=await this.createGLTFLoader(),r=e._isNetworkUrl(t);try{H({isLoading:!0,status:`Downloading Model...`,progress:2,canCancel:r,loadedBytes:0,totalBytes:0});let e=await n.loadAsync(t,this._downloadProgress(`Downloading Model...`,r));return this._downloadComplete(),this._processAndParent(e.scene),{root:e.scene,animations:e.animations||[]}}catch(e){throw this._isCancellation(e)?this._cancellationError():e}finally{this._disposeGLTFLoader(n)}}appendObject3D(e,t=`object3d`){let n=this._adoptExternalObject(e);return n.name=e.name||t,this._processAndParent(n),{root:n}}removeModelRoot(e){e&&(e.userData.__rayzeeExternal?(Ae(e),e.parent?.remove(e)):ke(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=_f(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 Vo(`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 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();e.getWorldPosition(n.position),e.getWorldQuaternion(n.quaternion),(!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*=Sf(e,e.width,e.height,n),n.__radianceConverted=!0),(e.isPointLight||e.isSpotLight)&&!n.__candelaConverted&&(e.intensity*=4*Math.PI,n.__candelaConverted=!0),e.name.startsWith(`RectAreaLightPlaceholder`)&&n.name&&n.type===`RectAreaLight`){let t=n.normalize??!0,i=n.shape??`rectangle`,a=n.intensity*Sf(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=xf(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}getTargetModel(){return this.targetModel}getSupportedFormats(e=null){if(e){let t={};for(let[n,r]of Object.entries(vf))r.type===e&&(t[n]=r);return t}return vf}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.releaseTargetModel()}removeAllEventListeners(){this._listeners=void 0}},wf=class extends r.EventDispatcher{constructor(e){super();let t=e.clientWidth,n=e.clientHeight;this.camera=new r.PerspectiveCamera(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.interactionManager=null,this.cameras=[this.camera],this.currentCameraIndex=0,this._userCameraCounter=0,this.autoFocusMode=Xe.SMOOTHING_FACTOR?`auto`:`manual`,this.afScreenPoint={x:.5,y:.5},this.afSmoothingFactor=Xe.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}addCameraFromView(e){let t=this.camera,n=new r.PerspectiveCamera(t.fov,t.aspect,t.near,t.far);return n.position.copy(t.position),n.quaternion.copy(t.quaternion),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`),autoFocusMode:this.autoFocusMode,afScreenPoint:{...this.afScreenPoint}}:null}_applyEffects(e){e&&(this._applySettings?.({enableDOF:e.enableDOF,focusDistance:e.focusDistance,aperture:e.aperture,focalLength:e.focalLength,apertureScale:e.apertureScale,anamorphicRatio:e.anamorphicRatio}),e.autoFocusMode!==void 0&&this.setAutoFocusMode(e.autoFocusMode),e.afScreenPoint&&this.setAFScreenPoint(e.afScreenPoint.x,e.afScreenPoint.y))}_getSceneScale(){return this._afContext?.assetLoader?.getSceneScale?.()||1}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(),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.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.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._applyEffects(this.cameras[e]?.userData?.__rayzeeEffects),n?.(),i?.();let o=this._captureEffects();o&&(o.focusDistance/=this._getSceneScale()),this.dispatchEvent({type:`CameraSwitched`,cameraIndex:e,effects:o,fov:this.camera.fov})}focusOn(e){!e||!this.controls||(this.controls.target.copy(e),this.controls.update(),this._onReset?.())}get active(){return this.camera}getNames(){return this.getCameraNames()}setAutoFocusMode(e){this.autoFocusMode=e,e!==`manual`&&(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{meshScene:t,assetLoader:n,floorPlane:r,currentFocusDistance:i,pathTracer:a,setFocusDistance:o,softReset:s,hardReset:c}=e||this._afContext||{};if(!t||this.autoFocusMode===`manual`)return;if(!a?.enableDOF?.value){this._afSuspended=!0;return}this._afSuspended&&(this._afSuspended=!1,this._smoothedFocusDistance=null);let l=a;if(l?.isReady&&l.renderMode?.value===1&&l.frameCount>0&&!l.isComplete)return;let u=this.afScreenPoint.x*2-1,d=-(this.afScreenPoint.y*2-1),f=this.interactionManager?.raycaster;if(!f)return;f.setFromCamera({x:u,y:d},this.camera);let p=f.intersectObjects(t.children,!0).find(e=>e.object!==this.interactionManager?.focusPointIndicator&&e.object!==r&&!e.object.name.includes(`Helper`)&&e.object.type===`Mesh`),m;if(p)m=p.distance,this._lastValidFocusDistance=m;else if(this._lastValidFocusDistance!==null)m=this._lastValidFocusDistance;else{let e=n?.getSceneScale()||1;m=Xe.FALLBACK_DISTANCE*e,this._lastValidFocusDistance=m}let h=this._afPointDirty;this._afPointDirty=!1,h||this._smoothedFocusDistance===null||this._smoothedFocusDistance===0||Math.abs(m-this._smoothedFocusDistance)/this._smoothedFocusDistance>Xe.SNAP_THRESHOLD?this._smoothedFocusDistance=m:this._smoothedFocusDistance+=this.afSmoothingFactor*(m-this._smoothedFocusDistance);let g=i,_=this._smoothedFocusDistance;if(h||g===0||Math.abs(_-g)/Math.max(g,.001)>.001){o(_);let e=n?.getSceneScale()||1;this.dispatchEvent({type:V.AUTO_FOCUS_UPDATED,distance:_/e});let t=Math.abs(_-g)/Math.max(g,.001);h?c?.():t>Xe.RESET_THRESHOLD&&s?.()}}setInteractionManager(e){this.interactionManager=e}initAutoFocus({meshScene:e,assetLoader:t,floorPlane:n,pathTracer:r,settings:i,softReset:a,hardReset:o}){this._afContext={meshScene:e,assetLoader:t,floorPlane:n,pathTracer:r,setFocusDistance:e=>i.set(`focusDistance`,e,{silent:!0}),softReset:a,hardReset:o},Object.defineProperty(this._afContext,`currentFocusDistance`,{get:()=>i.get(`focusDistance`)})}dispose(){this.controls?.dispose()}},Tf=class extends r.EventDispatcher{constructor(e,t,n,r={}){super(),this.scene=e,this.sceneHelpers=t,this.pathTracer=n,this._onReset=r.onReset||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.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.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){this._removeAllLights();let t=e.getObjectsByProperty(`isLight`,!0);if(!t||t.length===0){this.updateLights();return}for(let e of t){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()}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.sceneHelpers?.clear(),this._removeAllLights(),this._onReset=null,this.pathTracer=null,this.sceneHelpers=null,this.scene=null)}_removeAllLights(){this.scene.getObjectsByProperty(`isLight`,!0).forEach(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}},Ef=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=>Df(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:Of(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}};function Df(e){return new Promise((t,n)=>{let r=new Image;r.crossOrigin=`anonymous`,r.onload=()=>t(r),r.onerror=()=>n(Error(`Failed to load gobo image: ${e}`)),r.src=e})}function Of(e){return Math.max(0,Math.min(1,e))}function kf(e,t=`ies`){let n=e.search(/TILT\s*=/i);if(n<0)throw Error(`IES (${t}): missing TILT line`);let r=e.indexOf(`
|
|
731
|
+
`,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=Nf(o),t=2+2*Number(e[1]);o=Pf(o,t)}let s=Nf(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 Af(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=Ff(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=If(o[p][0],o[m][0],g);else{let e=u+(n+.5)/t*(l-u),r=Ff(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=If(If(f,h,d),If(_,v,d),g)}let c=Math.min(1,Math.max(0,i/s));r[e*t+n]=Math.round(c*255)}}return r}function jf(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 Mf(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 Nf(e){return e.split(/\s+/).filter(e=>e.length>0)}function Pf(e,t){let n=/\S+/g,r=0;for(;n.exec(e)!==null;)if(r++,r===t)return e.slice(n.lastIndex);return``}function Ff(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 If(e,t,n){return e+(t-e)*n}var Lf=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 r=await fetch(e.url);if(!r.ok)throw Error(`HTTP ${r.status}`);let i=kf(await r.text(),e.name);return{it:e,profile:i,grid:Af(i,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=jf(r);c.push({name:i[e].it.name,index:e,maxCandela:r.maxCandela,photometricType:r.photometricType,suggestedAngle:a,suggestedPenumbra:Mf(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:Rf(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 Rf(e){return Math.max(0,Math.min(1,e))}var zf=xt(`oidn`),Bf=null;async function Vf(){return Bf||=(await import(`oidn-web`)).initUNetFromURL,Bf}var Hf=new Float32Array(3),Uf={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`,debugGbufferMaps:!0,tileSize:1024}},Wf=`
|
|
732
732
|
@group(0) @binding(0) var<storage, read_write> col: array<vec4<f32>>;
|
|
733
733
|
@group(0) @binding(1) var<uniform> scale: f32;
|
|
734
734
|
|
|
@@ -740,4 +740,4 @@ fn main( @builtin(global_invocation_id) gid: vec3<u32>,
|
|
|
740
740
|
let c = col[ i ];
|
|
741
741
|
col[ i ] = vec4<f32>( c.xyz * scale, c.w );
|
|
742
742
|
}
|
|
743
|
-
`,Gd=64,Kd=32768,qd=.18;function Jd(e,t){let n=0;for(let r=0;r<t;r++){let t=r*4,i=.212671*e[t]+.71516*e[t+1]+.072169*e[t+2];n+=Math.log2(Math.max(i,0)+1e-4)}let r=qd/2**(n/t);return Number.isFinite(r)&&r>0?r:1}var Yd=class extends r.EventDispatcher{constructor(e,t,n,i,a={}){if(super(),!e||!t||!n||!i)throw Error(`OIDNDenoiser requires output canvas, renderer, scene, and camera`);this.renderer=t,this.scene=n,this.camera=i,this.input=t.domElement,this.output=e,this.extractGBufferData=a.extractGBufferData||null,this.getMRTRenderTarget=a.getMRTRenderTarget||null,this.backendParamsGetter=a.backendParams||null,this.getGPUTextures=a.getGPUTextures||null,this.refreshInput=a.refreshInput||null,this.getExposure=a.getExposure||(()=>1),this.getToneMapping=a.getToneMapping||(()=>r.ACESFilmicToneMapping),this.getSaturation=a.getSaturation||(()=>1),this.getTransparentBackground=a.getTransparentBackground||(()=>!1),this.isGPUMode=!!this.backendParamsGetter,this.gpuDevice=null,this._gpuInputBuffers={color:null,albedo:null,normal:null},this._gpuInputBufferSize={width:0,height:0},this._gpuInputPadBuffer=null,this._gpuInputPaddedRowBytes=0,this._colorScalePipeline=null,this._colorScaleBindGroup=null,this._colorScaleUniform=null,this._oidnInputScale=1,this._alphaReadbackBuffer=null,this._alphaReadbackMapped=!1,this._cachedAlpha=null,this._cachedAlphaWidth=0,this.config={...Ud.DEFAULT_OPTIONS,...a},this.enabled=this.config.enableOIDN,this.quality=this.config.oidnQuality,this.debugGbufferMaps=this.config.debugGbufferMaps,this.maxTileSize=this.config.tileSize,this._activeTileSize=0,this.state={isDenoising:!1,isLoading:!1,abortController:null},this._pendingStagingBuffers=new Set,this._pendingTileBlits=[],this.currentTZAUrl=null,this.unet=null,this._pendingStart=!1,this._initialize().catch(e=>{zd.error(`init failed:`,e),this.dispatchEvent({type:`error`,error:e})})}async _initialize(){try{this._setupCanvas(),await this._setupUNetDenoiser()}catch(e){throw Error(`Initialization failed: ${e.message}`)}}_setupCanvas(){if(!this.output.getContext)throw Error(`Output must be a valid Canvas element`);this.output.willReadFrequently=!0,this.output.width=this.input.width,this.output.height=this.input.height,Object.assign(this.output.style,{position:`absolute`,top:`0`,left:`0`,width:`100%`,height:`100%`,borderRadius:`5px`,background:`repeating-conic-gradient(#808080 0% 25%, transparent 0% 50%) 50% / 20px 20px`}),this.ctx=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0})}expectsCleanAux(e=this.quality){let{QUALITY_MODELS:t}=Ud;return(t[e]||t.balance).cleanAux}getRuntimeInfo(){return this.unet?.getRuntimeInfo?.()??null}profileNextDenoise(){return this.unet?.profileNextExecution?.()??!1}async getLastDenoiseProfile(){return await this.unet?.getLastExecutionProfile?.()??null}_resolveTileSize(){let e=Math.max(this.output?.width||0,this.output?.height||0);return e?Math.min(e,this.maxTileSize):this.maxTileSize}async _setupUNetDenoiser(){if(this.state.isLoading)return;this.state.isLoading=!0;let e=this._generateTzaUrl(),t=this._resolveTileSize();if(this.currentTZAUrl===e&&this._activeTileSize===t&&this.unet){this.state.isLoading=!1;return}try{this.dispatchEvent({type:`loading`,message:`Loading UNet denoiser...`}),this.unet&&=(this.unet.dispose(),null);let n;if(this.isGPUMode&&this.backendParamsGetter){let e=this.backendParamsGetter();this.gpuDevice=e?.device??null,n=e?.device?e:void 0}this.unet=await(await Vd())(e,n,{aux:!0,hdr:!0,maxTileSize:t,dynamicTile:!1}),this.currentTZAUrl=e,this._activeTileSize=t,this.dispatchEvent({type:`loaded`}),zd.debug(`UNet weights loaded:`,e)}catch(e){zd.error(`UNet weights failed to load:`,e),this.dispatchEvent({type:`error`,error:Error(`Denoiser loading failed: ${e.message}`)})}finally{this.state.isLoading=!1,this._pendingStart&&this.unet&&this.enabled&&(this._pendingStart=!1,this.start())}}_generateTzaUrl(){let{oidnWeightsBaseUrl:e}=Do(),{QUALITY_MODELS:t}=Ud;return`${e}${(t[this.quality]||t.balance).model}.tza`}async updateConfiguration(e){Object.keys(e).some(t=>this.config[t]!==e[t])&&(Object.assign(this.config,e),this.quality=this.config.oidnQuality,this.debugGbufferMaps=this.config.debugGbufferMaps,this.maxTileSize=this.config.tileSize,await this._setupUNetDenoiser())}async updateQuality(e){if(!Object.prototype.hasOwnProperty.call(Ud.QUALITY_MODELS,e))throw Error(`Invalid quality setting: ${e}. Must be one of: ${Object.keys(Ud.QUALITY_MODELS).join(`, `)}`);await this.updateConfiguration({oidnQuality:e})}async start(){if(!this.enabled||this.state.isDenoising)return!1;if(this.unet&&!this.state.isLoading&&this._activeTileSize!==this._resolveTileSize()&&await this._setupUNetDenoiser(),this.state.isLoading)return this._pendingStart=!0,!1;this.dispatchEvent({type:`start`});let e=performance.now(),t=await this.execute();if(t){this.renderer?.resetState?.(),this.input.style.opacity=`0`;let t=performance.now()-e;zd.debug(`denoise complete in ${G.ms(t)} · quality ${this.quality}`)}return t}_revealOutput(){this.output.style.display=`block`,this.input.style.opacity=`0`}async execute(){if(!this.enabled||!this.unet)return!1;this.state.abortController=new AbortController,this.state.isDenoising=!0;try{return await this._executeUNet(),!0}catch(e){return e.name===`AbortError`?zd.debug(`denoise aborted`):zd.error(`denoise error:`,e),this.input.style.opacity=`1`,!1}finally{this.state.isDenoising=!1,this.state.abortController=null,this.dispatchEvent({type:`end`})}}async _executeUNet(){return this._executeUNetGPU()}async _executeUNetGPU(){let{width:e,height:t}=this.output;if(!this.getGPUTextures)return zd.warn(`GPU mode enabled but getGPUTextures not provided`),!1;let n=this.getGPUTextures();if(!n?.color)return zd.warn(`GPU textures not ready yet`),!1;let r=this.gpuDevice;if(!r)return zd.warn(`gpuDevice not available`),!1;this.refreshInput?.(),this.ctx.drawImage(this.input,0,0,e,t),this._revealOutput(),this._ensureGPUInputBuffers(e,t);let i=r.createCommandEncoder({label:`oidn-tex-to-buf`}),a=e*16,o=this._gpuInputPaddedRowBytes,s=o>a,c=this._gpuInputPadBuffer,l=(n,r)=>{if(!s)i.copyTextureToBuffer({texture:n,mipLevel:0},{buffer:r,offset:0,bytesPerRow:a,rowsPerImage:t},{width:e,height:t,depthOrArrayLayers:1});else{i.copyTextureToBuffer({texture:n,mipLevel:0},{buffer:c,offset:0,bytesPerRow:o,rowsPerImage:t},{width:e,height:t,depthOrArrayLayers:1});for(let e=0;e<t;e++)i.copyBufferToBuffer(c,e*o,r,e*a,a)}};l(n.color,this._gpuInputBuffers.color),l(n.albedo,this._gpuInputBuffers.albedo),l(n.normal,this._gpuInputBuffers.normal),r.queue.submit([i.finish()]),await this._readbackColor(r,e,t),globalThis.__OIDN_NO_INPUT_SCALE&&(this._oidnInputScale=1),this._applyColorScale(r,e*t);let u={color:{data:this._gpuInputBuffers.color,width:e,height:t},albedo:{data:this._gpuInputBuffers.albedo,width:e,height:t},normal:{data:this._gpuInputBuffers.normal,width:e,height:t}};return this._executeWithAbortGPU(u)}_ensureGPUInputBuffers(e,t){let{width:n,height:r}=this._gpuInputBufferSize;if(n===e&&r===t&&this._gpuInputBuffers.color)return;this._destroyGPUInputBuffers();let i=this.gpuDevice,a=e*t*16,o=GPUBufferUsage.COPY_DST|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC;this._gpuInputBuffers.color=i.createBuffer({label:`oidn-in-color`,size:a,usage:o}),this._gpuInputBuffers.albedo=i.createBuffer({label:`oidn-in-albedo`,size:a,usage:o}),this._gpuInputBuffers.normal=i.createBuffer({label:`oidn-in-normal`,size:a,usage:o}),this._gpuInputBufferSize={width:e,height:t};let s=e*16,c=Math.ceil(s/256)*256;c===s?this._gpuInputPaddedRowBytes=s:(this._gpuInputPadBuffer=i.createBuffer({label:`oidn-in-pad`,size:c*t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this._gpuInputPaddedRowBytes=c)}_destroyGPUInputBuffers(){if(this._gpuInputBuffers.color?.destroy(),this._gpuInputBuffers.albedo?.destroy(),this._gpuInputBuffers.normal?.destroy(),this._gpuInputPadBuffer?.destroy(),this._alphaReadbackMapped&&this._alphaReadbackBuffer)try{this._alphaReadbackBuffer.unmap()}catch{}this._alphaReadbackBuffer?.destroy(),this._alphaReadbackMapped=!1,this._colorScaleBindGroup=null,this._colorScaleUniform?.destroy(),this._colorScaleUniform=null,this._gpuInputBuffers={color:null,albedo:null,normal:null},this._gpuInputPadBuffer=null,this._gpuInputPaddedRowBytes=0,this._alphaReadbackBuffer=null,this._gpuInputBufferSize={width:0,height:0}}async _readbackColor(e,t,n){let r=t*n*16;this._alphaReadbackBuffer===null&&(this._alphaReadbackBuffer=e.createBuffer({label:`oidn-alpha-readback`,size:r,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}));let i=this._alphaReadbackBuffer,a=e.createCommandEncoder();a.copyBufferToBuffer(this._gpuInputBuffers.color,0,i,0,r),e.queue.submit([a.finish()]),this._alphaReadbackMapped=!0;try{await i.mapAsync(GPUMapMode.READ)}catch{this._alphaReadbackMapped=!1;return}let o=new Float32Array(i.getMappedRange()),s=t*n;this._oidnInputScale=Jd(o,s);let c=null;if(this.getTransparentBackground()){c=new Uint8Array(s);for(let e=0;e<s;e++)c[e]=Math.min(Math.max(o[e*4+3]*255,0),255)|0}i.unmap(),this._alphaReadbackMapped=!1,this._cachedAlpha=c,this._cachedAlphaWidth=t}_outputExposure(){return Eu(this.getExposure(),this.getToneMapping())/this._oidnInputScale}_applyColorScale(e,t){let n=this._oidnInputScale;if(!this._ensureColorScalePipeline(e))return;e.queue.writeBuffer(this._colorScaleUniform,0,new Float32Array([n]));let r=Math.ceil(t/Gd),i=Math.min(r,Kd),a=Math.ceil(r/i),o=e.createCommandEncoder({label:`oidn-color-scale`}),s=o.beginComputePass({label:`oidn-color-scale`});s.setPipeline(this._colorScalePipeline),s.setBindGroup(0,this._colorScaleBindGroup),s.dispatchWorkgroups(i,a,1),s.end(),e.queue.submit([o.finish()])}_ensureColorScalePipeline(e){let t=this._gpuInputBuffers.color;return!e||!t?null:(this._colorScalePipeline||=e.createComputePipeline({label:`oidn-color-scale`,layout:`auto`,compute:{module:e.createShaderModule({label:`oidn-color-scale`,code:Wd}),entryPoint:`main`}}),this._colorScaleUniform||=e.createBuffer({label:`oidn-color-scale-uniform`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this._colorScaleBindGroup||=e.createBindGroup({label:`oidn-color-scale`,layout:this._colorScalePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t}},{binding:1,resource:{buffer:this._colorScaleUniform}}]}),this._colorScalePipeline)}_executeWithAbortGPU(e){return new Promise((t,n)=>{if(this.state.abortController?.signal.aborted){n(new DOMException(`Aborted`,`AbortError`));return}let i=null;this._pendingTileBlits=[];let a=()=>{i&&=(i(),null),n(new DOMException(`Aborted`,`AbortError`))};this.state.abortController.signal.addEventListener(`abort`,a,{once:!0}),i=this.unet.tileExecute({...e,done:async e=>{this.state.abortController.signal.removeEventListener(`abort`,a),i=null;try{this._pendingTileBlits.length>0?await Promise.allSettled(this._pendingTileBlits):await this._displayGPUOutput(e),t()}catch(e){n(e)}},progress:(e,t,n)=>{if(!e?.data||!n)return;let i=this.gpuDevice,a=e.width,o=e.height,s=Math.min(n.width,a-n.x),c=Math.min(n.height,o-n.y);if(s<=0||c<=0)return;let l=s*16,u=s*c*16,d=i.createBuffer({size:u,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});this._pendingStagingBuffers.add(d);let f=i.createCommandEncoder();for(let t=0;t<c;t++){let r=((n.y+t)*a+n.x)*16,i=t*l;f.copyBufferToBuffer(e.data,r,d,i,l)}i.queue.submit([f.finish()]);let p=d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(d.getMappedRange()),t=new ImageData(s,c),i=this._outputExposure(),l=this.getSaturation(),u=Cu.get(this.getToneMapping())||Cu.get(r.ACESFilmicToneMapping),f=this._cachedAlpha,p=this._cachedAlphaWidth;for(let r=0,a=e.length;r<a;r+=4){let a=e[r]*i,o=e[r+1]*i,c=e[r+2]*i;if(l!==1&&(Hd[0]=a,Hd[1]=o,Hd[2]=c,Au(Hd,l),a=Hd[0],o=Hd[1],c=Hd[2]),u(a,o,c,1,Hd),t.data[r]=Tu(Hd[0])*255+.5|0,t.data[r+1]=Tu(Hd[1])*255+.5|0,t.data[r+2]=Tu(Hd[2])*255+.5|0,f){let e=(r>>2)%s,i=(r>>2)/s|0;t.data[r+3]=f[(n.y+i)*p+n.x+e]}else t.data[r+3]=255}d.unmap(),d.destroy(),this._pendingStagingBuffers.delete(d),this.ctx.putImageData(t,n.x,n.y),this.dispatchEvent({type:`tileProgress`,tile:{x:n.x,y:n.y,width:s,height:c},imageWidth:a,imageHeight:o})}).catch(()=>{d.destroy(),this._pendingStagingBuffers.delete(d)});this._pendingTileBlits.push(p)}})})}async _displayGPUOutput({data:e,width:t,height:n}){let i=this.gpuDevice;if(!i){zd.error(`gpuDevice not available for output readback`);return}let a=t*n*4*4,o=i.createBuffer({label:`oidn-output-staging`,size:a,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});try{let s=i.createCommandEncoder({label:`oidn-readback`});s.copyBufferToBuffer(e,0,o,0,a),i.queue.submit([s.finish()]),await o.mapAsync(GPUMapMode.READ);let c=new Float32Array(o.getMappedRange()),l=new ImageData(t,n),u=this._outputExposure(),d=this.getSaturation(),f=Cu.get(this.getToneMapping())||Cu.get(r.ACESFilmicToneMapping),p=this._cachedAlpha;for(let e=0,t=c.length;e<t;e+=4){let t=c[e]*u,n=c[e+1]*u,r=c[e+2]*u;d!==1&&(Hd[0]=t,Hd[1]=n,Hd[2]=r,Au(Hd,d),t=Hd[0],n=Hd[1],r=Hd[2]),f(t,n,r,1,Hd),l.data[e]=Tu(Hd[0])*255+.5|0,l.data[e+1]=Tu(Hd[1])*255+.5|0,l.data[e+2]=Tu(Hd[2])*255+.5|0,l.data[e+3]=p?p[e>>2]:255}o.unmap(),this.ctx.putImageData(l,0,0)}finally{o.destroy()}}abort(){this._pendingStart=!1,!(!this.enabled||!this.state.isDenoising)&&(this.state.abortController?.abort(),this._destroyPendingStagingBuffers(),this.input.style.opacity=`1`,this.state.isDenoising=!1,this.dispatchEvent({type:`end`}),zd.debug(`denoise aborted`))}setSize(e,t){if(e<=0||t<=0)throw Error(`Invalid dimensions: ${e}x${t}`);this.output.width=e,this.output.height=t,this._setupUNetDenoiser().catch(e=>{zd.error(`reinitialize after size change failed:`,e)})}_destroyPendingStagingBuffers(){for(let e of this._pendingStagingBuffers)e.destroy();this._pendingStagingBuffers.clear()}dispose(){this.abort(),this._destroyPendingStagingBuffers(),this.unet?.dispose(),this._destroyGPUInputBuffers(),this._colorScalePipeline=null,this.output?.parentNode&&this.output.remove(),this.unet=null,this.ctx=null,this.state.abortController=null,this.removeAllListeners?.(),zd.debug(`disposed`)}},Xd='let e={ortRuntimeUrl:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/ort.webgpu.bundle.min.mjs`,ortWasmPaths:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/`,cacheNamespace:`rayzee`},t=null;async function n(){return t||(t=await import(e.ortRuntimeUrl),t.env.wasm.wasmPaths=e.ortWasmPaths,t.env.logLevel=`error`,t)}function r(){return`${e.cacheNamespace}:ai-upscaler-models`}const i=`models`;let a=null,o=null;function s(){return new Promise((e,t)=>{let n=indexedDB.open(r(),1);n.onupgradeneeded=()=>n.result.createObjectStore(i),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function c(e){try{let t=await s();return await new Promise((n,r)=>{let a=t.transaction(i,`readonly`).objectStore(i).get(e);a.onsuccess=()=>n(a.result||null),a.onerror=()=>r(a.error)})}catch{return null}}async function l(e,t){try{let n=await s();await new Promise((r,a)=>{let o=n.transaction(i,`readwrite`);o.objectStore(i).put(t,e),o.oncomplete=()=>r(),o.onerror=()=>a(o.error)})}catch{}}async function u(e){let t=await c(e);if(t)return console.log(`AI Upscaler Worker: model loaded from cache (${(t.byteLength/1024/1024).toFixed(1)}MB)`),t;let n=await fetch(e);if(!n.ok)throw Error(`Failed to fetch model: ${n.status}`);let r=await n.arrayBuffer();return l(e,r.slice(0)),r}async function d(e,t){if(a&&o===e){self.postMessage({type:`loaded`,backend:`webgpu`});return}a&&=(await a.release(),null);let[r,i]=await Promise.all([u(e),n()]);a=await i.InferenceSession.create(r,t),o=e;let s=512;try{let e=await navigator.gpu?.requestAdapter(),t=await e?.requestAdapterInfo?.()||e?.info,n=/apple|swiftshader|llvmpipe/i.test(t?.vendor||``)||/apple|swiftshader/i.test(t?.architecture||``),r=t?.device?.toLowerCase?.()?.includes(`integrated`)||/intel.*iris|intel.*uhd|intel.*hd|amd.*vega|radeon.*graphics/i.test(t?.description||``);s=n?128:r?256:512,console.log(`AI Upscaler Worker: GPU="${t?.description||t?.device||`unknown`}", tileSize=${s}`)}catch{}let c=(r.byteLength/1024/1024).toFixed(1);console.log(`AI Upscaler Worker: model loaded (${c}MB), backend: webgpu`),self.postMessage({type:`loaded`,backend:`webgpu`,tileSize:s})}async function f(e,t,r,i){let o=await n(),s=a.inputNames[0],c=a.outputNames[0],l=new o.Tensor(`float32`,e,[1,3,r,t]),u=(await a.run({[s]:l}))[c].data;self.postMessage({type:`inferred`,outputData:u,id:i},[u.buffer])}self.onmessage=async t=>{let{type:n}=t.data;try{n===`load`?(t.data.ortRuntimeUrl&&(e.ortRuntimeUrl=t.data.ortRuntimeUrl),t.data.ortWasmPaths&&(e.ortWasmPaths=t.data.ortWasmPaths),t.data.cacheNamespace&&(e.cacheNamespace=t.data.cacheNamespace),await d(t.data.url,t.data.sessionOptions)):n===`infer`?await f(t.data.tileData,t.data.width,t.data.height,t.data.id):n===`dispose`&&a&&(await a.release(),a=null,o=null)}catch(e){self.postMessage({type:`error`,message:e.message,id:t.data?.id})}};',Zd=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Xd],{type:`text/javascript;charset=utf-8`});function Qd(e){let t;try{if(t=Zd&&(self.URL||self.webkitURL).createObjectURL(Zd),!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(Xd),{type:`module`,name:e?.name})}}var $d={fast:{2:`2x-spanx2-ch48.onnx`,4:`4xNomos8k_span_otf_strong_fp32_opset17.onnx`},balanced:{2:`2xNomosUni_compact_otf_medium.onnx`,4:`RealESRGAN_x4plus.onnx`},quality:{2:`2x-realesrgan-x2plus.onnx`,4:`4xNomos2_hq_mosr_fp32.onnx`}};function ef(){let{upscalerModelBaseUrl:e}=Do(),t={};for(let n in $d){t[n]={};for(let r in $d[n])t[n][r]=e+$d[n][r]}return t}var tf={get QUALITY_PRESETS(){return ef()},TILE_SIZE:512,TILE_OVERLAP:16,SESSION_OPTIONS:{executionProviders:[{name:`webgpu`,preferredLayout:`NCHW`}],graphOptimizationLevel:`all`}},nf=class extends r.EventDispatcher{constructor(e,t,n={}){if(super(),!e||!t)throw Error(`AIUpscaler requires output canvas and renderer`);this.renderer=t,this.input=t.domElement,this.output=e,this.getSourceCanvas=n.getSourceCanvas||null,this.getGPUTextures=n.getGPUTextures||null,this.getExposure=n.getExposure||(()=>1),this.getToneMapping=n.getToneMapping||(()=>r.ACESFilmicToneMapping),this.getSaturation=n.getSaturation||(()=>1),this.enabled=!1,this.hdr=!1,this.scaleFactor=n.scaleFactor||2,this.quality=n.quality||`fast`,this.refreshInput=n.refreshInput||null,this.tileSize=n.tileSize||tf.TILE_SIZE,this._tileSizeOverride=!!n.tileSize,this.state={isUpscaling:!1,isLoading:!1,abortController:null},this._worker=null,this._currentModelUrl=null,this._tileId=0,this._pendingWorkerHandlers=new Set,this._upscaledAlpha=null,this._upscaledAlphaWidth=0,this._backupCanvas=null,this._baseWidth=e.width,this._baseHeight=e.height,this._hdrStagingBuffer=null,this._hdrStagingWidth=0,this._hdrStagingHeight=0}async _ensureSession(){let e=tf.QUALITY_PRESETS[this.quality];if(!e)throw Error(`Unknown quality preset: ${this.quality}`);let t=e[this.scaleFactor];if(!t)throw Error(`No model for ${this.quality}/${this.scaleFactor}x`);if(!(this._worker&&this._currentModelUrl===t)){this.state.isLoading=!0,this.dispatchEvent({type:`loading`,message:`Loading ${this.scaleFactor}x upscale model...`});try{this._worker||=new Qd,await new Promise((e,n)=>{let r=t=>{t.data.type===`loaded`?(this._worker.removeEventListener(`message`,r),t.data.tileSize&&!this._tileSizeOverride&&(this.tileSize=t.data.tileSize),console.log(`AI Upscaler: ${this.scaleFactor}x model loaded, backend: ${t.data.backend}, tileSize: ${this.tileSize}`),e()):t.data.type===`error`&&(this._worker.removeEventListener(`message`,r),n(Error(t.data.message)))},{ortRuntimeUrl:i,ortWasmPaths:a,cacheNamespace:o}=Do();this._worker.addEventListener(`message`,r),this._worker.postMessage({type:`load`,url:t,sessionOptions:tf.SESSION_OPTIONS,ortRuntimeUrl:i,ortWasmPaths:a,cacheNamespace:o})}),this._currentModelUrl=t,this.dispatchEvent({type:`loaded`})}catch(e){throw console.error(`AI Upscaler: Failed to load model:`,e),this.dispatchEvent({type:`error`,error:e}),e}finally{this.state.isLoading=!1}}}async start(){if(!this.enabled||this.state.isUpscaling||this.state.isLoading)return!1;this.dispatchEvent({type:`start`});let e=performance.now(),t=await this.execute();if(t){this.renderer?.resetState?.();let t=performance.now()-e;console.log(`AI Upscaler: ${this.scaleFactor}x upscale completed in ${t.toFixed(1)}ms`)}return t}_revealOutput(){this.output.style.display=`block`,this.input.style.opacity=`0`}async execute(){if(!this.enabled)return!1;this.state.abortController=new AbortController,this.state.isUpscaling=!0,this.hdr&&this.getGPUTextures?this._capturedSource=await this._captureSourceHDR():this._capturedSource=this._captureSource(),this._createBackup(this._capturedSource);let e=this._capturedSource.width*this.scaleFactor,t=this._capturedSource.height*this.scaleFactor;this.output.width=e,this.output.height=t;let n=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0});n.imageSmoothingEnabled=!0,n.imageSmoothingQuality=`high`,n.drawImage(this._backupCanvas,0,0,e,t),this._revealOutput();try{return await this._ensureSession(),await this._runUpscale(),this.dispatchEvent({type:`resolution_changed`,width:this.output.width,height:this.output.height}),!0}catch(e){return e.name===`AbortError`?console.log(`AI Upscaler: Upscaling was aborted`):(console.error(`AI Upscaler: Upscaling error:`,e),this.dispatchEvent({type:`error`,error:e}),this._restoreBackup(),this.input.style.opacity=`1`,this.dispatchEvent({type:`resolution_changed`,width:this._baseWidth,height:this._baseHeight})),!1}finally{this._capturedSource=null,this._upscaledAlpha=null,this._backupCanvas=null,this.state.isUpscaling&&(this.state.isUpscaling=!1,this.state.abortController=null,this.dispatchEvent({type:`end`}))}}abort(){this.state.isUpscaling&&(this.state.abortController?.abort(),this._cleanupPendingWorkerHandlers(),this.input.style.opacity=`1`,this._restoreBackup(),this.dispatchEvent({type:`resolution_changed`,width:this._baseWidth,height:this._baseHeight}),this.state.isUpscaling=!1,this.dispatchEvent({type:`end`}),console.log(`AI Upscaler: Aborted`))}async _runUpscale(){let e=this.state.abortController.signal,t=this._capturedSource;this._capturedSource=null;let{width:n,height:i}=t,a=this.scaleFactor,o=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0});this._cacheUpscaledAlpha(t,n*a,i*a),t.isHDR&&(this._hdrToneMapFn=Cu.get(this.getToneMapping())||Cu.get(r.ACESFilmicToneMapping),this._hdrExposure=Eu(this.getExposure(),this.getToneMapping()),this._hdrSaturation=this.getSaturation(),this._tmOut=new Float32Array(3));let s=tf.TILE_OVERLAP,c=this.tileSize,l=c-s*2,u=Math.ceil(n/l),d=Math.ceil(i/l),f=u*d,p=0;for(let r=0;r<d;r++)for(let s=0;s<u;s++){if(e.aborted)throw new DOMException(`Aborted`,`AbortError`);let u=Math.min(s*l,Math.max(0,n-c)),d=Math.min(r*l,Math.max(0,i-c)),m=Math.min(c,n-u),h=Math.min(c,i-d),g=this._extractTile(t,u,d,m,h),_=await this._inferTile(g,m,h),v=u*a,y=d*a,b=m*a,x=h*a,S=this._tensorToImageData(_,b,x,v,y);o.putImageData(S,v,y),p++,this.dispatchEvent({type:`progress`,progress:p/f,tile:{x:s,y:r,total:f,completed:p}}),this.dispatchEvent({type:`tileProgress`,tile:{x:v,y,width:b,height:x},imageWidth:n*a,imageHeight:i*a})}}_captureSource(){let e=this.getSourceCanvas?this.getSourceCanvas():null;if(e&&e!==this.output){this.refreshInput?.();let t=document.createElement(`canvas`);t.width=e.width,t.height=e.height;let n=t.getContext(`2d`);return n.drawImage(e,0,0),n.getImageData(0,0,t.width,t.height)}return this.output.getContext(`2d`,{willReadFrequently:!0}).getImageData(0,0,this.output.width,this.output.height)}async _captureSourceHDR(){let e=this.getGPUTextures();if(!e?.color)throw Error(`No GPU color texture available for HDR capture`);let t=this.renderer.backend.device,n=e.color,r=n.width,i=n.height,a=Math.ceil(r*16/256)*256,o=a*i;(this._hdrStagingWidth!==r||this._hdrStagingHeight!==i)&&(this._hdrStagingBuffer?.destroy(),this._hdrStagingBuffer=t.createBuffer({label:`aiupscaler-hdr-readback`,size:o,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this._hdrStagingWidth=r,this._hdrStagingHeight=i);let s=this._hdrStagingBuffer,c=t.createCommandEncoder();c.copyTextureToBuffer({texture:n},{buffer:s,bytesPerRow:a,rowsPerImage:i},{width:r,height:i,depthOrArrayLayers:1}),t.queue.submit([c.finish()]),await s.mapAsync(GPUMapMode.READ);let l=new Float32Array(s.getMappedRange()),u=r*4,d=a/4,f=new Float32Array(r*i*4);for(let e=0;e<i;e++){let t=e*d,n=e*u;f.set(l.subarray(t,t+u),n)}return s.unmap(),{data:f,width:r,height:i,isHDR:!0}}_extractTile(e,t,n,r,i){let{data:a,width:o}=e,s=e.isHDR,c=r*i,l=new Float32Array(3*c);for(let e=0;e<i;e++)for(let i=0;i<r;i++){let u=((n+e)*o+(t+i))*4,d=e*r+i;if(s){let e=this._hdrToneMapFn,t=this._hdrExposure,n=this._hdrSaturation,r=a[u]*t,i=a[u+1]*t,o=a[u+2]*t;n!==1&&(this._tmOut[0]=r,this._tmOut[1]=i,this._tmOut[2]=o,Au(this._tmOut,n),r=this._tmOut[0],i=this._tmOut[1],o=this._tmOut[2]),e(r,i,o,1,this._tmOut),l[d]=this._tmOut[0]**+wu,l[c+d]=this._tmOut[1]**+wu,l[2*c+d]=this._tmOut[2]**+wu}else l[d]=a[u]/255,l[c+d]=a[u+1]/255,l[2*c+d]=a[u+2]/255}return l}async _inferTile(e,t,n){let r=++this._tileId;return new Promise((i,a)=>{let o=e=>{e.data.id===r&&(this._worker.removeEventListener(`message`,o),this._pendingWorkerHandlers.delete(o),e.data.type===`inferred`?i(e.data.outputData):e.data.type===`error`&&a(Error(e.data.message)))};this._pendingWorkerHandlers.add(o),this._worker.addEventListener(`message`,o),this._worker.postMessage({type:`infer`,tileData:e,width:t,height:n,id:r},[e.buffer])})}_tensorToImageData(e,t,n,r,i){let a=new ImageData(t,n),o=a.data,s=t*n,c=this._upscaledAlpha,l=this._upscaledAlphaWidth;for(let n=0;n<s;n++)if(o[n*4]=Math.min(255,Math.max(0,e[n]*255+.5))|0,o[n*4+1]=Math.min(255,Math.max(0,e[s+n]*255+.5))|0,o[n*4+2]=Math.min(255,Math.max(0,e[2*s+n]*255+.5))|0,c){let e=n/t|0,a=n%t;o[n*4+3]=c[(i+e)*l+(r+a)]}else o[n*4+3]=255;return a}_cacheUpscaledAlpha(e,t,n){let{data:r,width:i,height:a}=e,o=e.isHDR,s=o?1:255,c=!1;for(let e=3;e<r.length;e+=4)if(r[e]<s){c=!0;break}if(!c){this._upscaledAlpha=null,this._upscaledAlphaWidth=0;return}let l=document.createElement(`canvas`);l.width=i,l.height=a;let u=l.getContext(`2d`),d=u.createImageData(i,a);for(let e=0,t=i*a;e<t;e++){let t=o?Math.min(Math.max(r[e*4+3]*255,0),255)|0:r[e*4+3];d.data[e*4]=t,d.data[e*4+1]=t,d.data[e*4+2]=t,d.data[e*4+3]=255}u.putImageData(d,0,0);let f=document.createElement(`canvas`);f.width=t,f.height=n;let p=f.getContext(`2d`);p.imageSmoothingEnabled=!0,p.imageSmoothingQuality=`high`,p.drawImage(l,0,0,t,n);let m=p.getImageData(0,0,t,n).data,h=new Uint8Array(t*n);for(let e=0,r=t*n;e<r;e++)h[e]=m[e*4];this._upscaledAlpha=h,this._upscaledAlphaWidth=t}_createBackup(e){this._backupCanvas=document.createElement(`canvas`),this._backupCanvas.width=e.width,this._backupCanvas.height=e.height;let t=this._backupCanvas.getContext(`2d`);if(e.isHDR){let{data:n,width:i,height:a}=e,o=t.createImageData(i,a),s=o.data,c=Cu.get(this.getToneMapping())||Cu.get(r.ACESFilmicToneMapping),l=Eu(this.getExposure(),this.getToneMapping()),u=this.getSaturation(),d=new Float32Array(3);for(let e=0,t=i*a;e<t;e++){let t=e*4,r=n[t]*l,i=n[t+1]*l,a=n[t+2]*l;u!==1&&(d[0]=r,d[1]=i,d[2]=a,Au(d,u),r=d[0],i=d[1],a=d[2]),c(r,i,a,1,d),s[t]=d[0]**+wu*255+.5|0,s[t+1]=d[1]**+wu*255+.5|0,s[t+2]=d[2]**+wu*255+.5|0,s[t+3]=255}t.putImageData(o,0,0)}else t.putImageData(e,0,0)}_restoreBackup(){this._backupCanvas&&=(this.output.width=this._backupCanvas.width,this.output.height=this._backupCanvas.height,this.output.getContext(`2d`).drawImage(this._backupCanvas,0,0),null)}toggleHDR(e){this.hdr=!!e}setQuality(e){if(!tf.QUALITY_PRESETS[e]){console.warn(`AIUpscaler: Invalid quality "${e}", must be fast/balanced/quality`);return}this.quality=e}setScaleFactor(e){if(e=Number(e),e!==2&&e!==4){console.warn(`AIUpscaler: Invalid scale factor ${e}, must be 2 or 4`);return}this.scaleFactor=e}setBaseSize(e,t){this._baseWidth=e,this._baseHeight=t}_cleanupPendingWorkerHandlers(){if(this._worker)for(let e of this._pendingWorkerHandlers)this._worker.removeEventListener(`message`,e);this._pendingWorkerHandlers.clear()}async dispose(){this.abort(),this._cleanupPendingWorkerHandlers(),this._worker&&=(this._worker.postMessage({type:`dispose`}),this._worker.terminate(),null),this._currentModelUrl=null,this._backupCanvas=null,this._upscaledAlpha=null,this.state.abortController=null,this._hdrStagingBuffer?.destroy(),this._hdrStagingBuffer=null,this._hdrStagingWidth=0,this._hdrStagingHeight=0,console.log(`AIUpscaler disposed`)}},rf=class extends r.EventDispatcher{constructor({renderer:e,mainCanvas:t,scene:n,camera:r,stages:i,pipeline:a,getExposure:o,getSaturation:s,getTransparentBg:c}){super(),this.renderer=e,this.mainCanvas=t,this.denoiserCanvas=this._createDenoiserCanvas(t),this.scene=n,this.camera=r,this.pipeline=a,this._stages=i,this._getExposure=o,this._getSaturation=s,this._getTransparentBg=c,this.denoiser=null,this.upscaler=null,this._onReset=null,this._onPostProcessRefresh=null,this._lastRenderWidth=0,this._lastRenderHeight=0,this._pendingStartUpscaler=null,this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null}_createDenoiserCanvas(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%`,t.insertBefore(n,e),n}setRenderSize(e,t){this._lastRenderWidth=e,this._lastRenderHeight=t,this.denoiser?.setSize(e,t),this.upscaler?.setBaseSize(e,t)}restoreBaseResolution(){if(!this.denoiserCanvas||!this._lastRenderWidth||!this._lastRenderHeight)return!1;let e=this.denoiserCanvas.width!==this._lastRenderWidth||this.denoiserCanvas.height!==this._lastRenderHeight;return this.denoiserCanvas.width=this._lastRenderWidth,this.denoiserCanvas.height=this._lastRenderHeight,e}setupDenoiser(){if(!this.denoiserCanvas)return;let e=this._stages.pathTracer;this.denoiser=new Yd(this.denoiserCanvas,this.renderer,this.scene,this.camera,{...B,backendParams:()=>({device:this.renderer.backend.device,adapterInfo:null}),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(),{backend:n}=this.renderer;return{color:n.get(t.color).texture,normal:n.get(t.normalDepth).texture,albedo:n.get(t.albedo).texture}},getExposure:()=>this._getEffectiveExposure(),getToneMapping:()=>this._getToneMapping(),getSaturation:()=>this._getSaturation(),getTransparentBackground:()=>this._getTransparentBg(),getMRTRenderTarget:()=>e?.storageTextures?.readTarget??null}),this.denoiser.enabled=B.enableOIDN,this._denoiserStartHandler=()=>this.dispatchEvent({type:R.DENOISING_START}),this._denoiserEndHandler=()=>this.dispatchEvent({type:R.DENOISING_END}),this.denoiser.addEventListener(`start`,this._denoiserStartHandler),this.denoiser.addEventListener(`end`,this._denoiserEndHandler)}setupUpscaler(){if(!this.denoiserCanvas)return;let e=this._stages.pathTracer;this.upscaler=new nf(this.denoiserCanvas,this.renderer,{scaleFactor:B.upscalerScale||2,quality:B.upscalerQuality||`fast`,getSourceCanvas:()=>this.denoiser?.enabled?null: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=B.enableUpscaler||!1,this._upscalerResChangedHandler=e=>this.dispatchEvent({type:`resolution_changed`,width:e.width,height:e.height}),this._upscalerStartHandler=()=>this.dispatchEvent({type:R.UPSCALING_START}),this._upscalerProgressHandler=e=>this.dispatchEvent({type:R.UPSCALING_PROGRESS,progress:e.progress}),this._upscalerEndHandler=()=>this.dispatchEvent({type:R.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._stages.asvgf?.enabled?`asvgf`:this._stages.edgeFilter?.enabled?`edgeaware`:`none`}setDenoiserStrategy(e,t){let n=this._stages;switch(n.asvgf&&(n.asvgf.enabled=!1),n.variance&&(n.variance.enabled=!1),n.bilateralFilter&&(n.bilateralFilter.enabled=!1),n.edgeFilter&&n.edgeFilter.setFilteringEnabled(!1),this._clearDenoiserTextures(),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`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.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))}_syncGBufferStages(){let e=this._stages,t=e.normalDepth,n=e.motionVector,r=!!e.asvgf?.enabled,i=r||!!(e.edgeFilter?.enabled||e.bilateralFilter?.enabled);t&&(i&&!t.enabled&&t.reset(),t.enabled=i),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?.quality!==`fast`);for(let r of[e.asvgf,e.variance,e.bilateralFilter,e.edgeFilter,t,n])r&&!r.enabled&&r.releaseGPUMemory?.()}_cleanupCompletionListener(){this._pendingStartUpscaler&&this.denoiser&&this.denoiser.removeEventListener(`end`,this._pendingStartUpscaler),this._pendingStartUpscaler=null}onRenderComplete({isStillComplete:e,context:t}){this._cleanupCompletionListener();let n=()=>{this._pendingStartUpscaler=null,e()&&this.upscaler?.enabled&&this.upscaler.start()};this.denoiser?.enabled?(this._pendingStartUpscaler=n,this.denoiser.addEventListener(`end`,n,{once:!0}),this.denoiser.start()):n()}abort(e){this._cleanupCompletionListener(),e&&(e.style.opacity=`1`),this.upscaler&&this.upscaler.abort(),this.denoiser&&(this.denoiser.enabled&&this.denoiser.abort(),this.denoiser.output&&(this.denoiser.output.style.display=`none`))}dispose(){this._cleanupCompletionListener(),this.denoiser&&=(this._denoiserStartHandler&&this.denoiser.removeEventListener(`start`,this._denoiserStartHandler),this._denoiserEndHandler&&this.denoiser.removeEventListener(`end`,this._denoiserEndHandler),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(),null),this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null,this.denoiserCanvas?.parentNode&&(this.denoiserCanvas.parentNode.removeChild(this.denoiserCanvas),this.denoiserCanvas=null)}setOverlayManager(e){this._overlayManager=e}setResetCallback(e){this._onReset=e}setPostProcessRefreshCallback(e){this._onPostProcessRefresh=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)}setOIDNEnabled(e){this.denoiser&&(this.denoiser.enabled=e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}setOIDNQuality(e){this.denoiser?.updateQuality(e),this._stages.pathTracer?.setCleanAuxNormal?.(!!this.denoiser?.enabled&&!!this.denoiser?.expectsCleanAux(e)),this._onPostProcessRefresh?.()}setTileHelperEnabled(e){this._setTileHelper(e)}setUpscalerEnabled(e){this.upscaler&&(this.upscaler.enabled=e)}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?.()}_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`].forEach(t=>e.removeTexture(t))}_applyASVGFPreset(e){let t=He[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))}},af=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}},of=class{constructor(e,i){this.layer=`scene`,this._enabled=!0,this._outlineNode=(0,g.outline)(e,i,{selectedObjects:[],edgeThickness:(0,n.uniform)(1),edgeGlow:(0,n.uniform)(0)});let a=(0,n.uniform)(3),o=(0,n.uniform)(new r.Color(16777215)),s=(0,n.uniform)(new r.Color(1640965)),{visibleEdge:c,hiddenEdge:l}=this._outlineNode,u=c.mul(o).add(l.mul(s)).mul(a),d=u.r.max(u.g).max(u.b).clamp(0,1);this._material=new t.MeshBasicNodeMaterial,this._material.colorNode=(0,n.vec4)(u,d),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;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 sf(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 cf(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 lf=4096,uf=class{constructor(){this.canvas=sf(!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=cf(this._sizeSource,lf);!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)}},df=K(`overlay`),ff=(e,t)=>e.visible&&e.layer===t&&e.render,pf=class{constructor(e){this.camera=e,this._helpers=new Map,this._hudCanvas=sf(),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 uf().init({device:e,sizeSource:t})}catch(e){df.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 af;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 of(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.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)&&(df.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())ff(t,`scene`)&&t.render(e,this.camera)}_hasVisibleSceneOverlay(){if(this._helperScene?.isDrawing)return!0;for(let e of this._helpers.values())if(ff(e,`scene`))return!0;return!1}refreshHUD(){let e=this._hudCanvas,t=this._hudCtx,n=!1;for(let e of this._helpers.values())if(ff(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?cf(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())ff(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)}},mf=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._posBuffer=null,this._tempVec=new r.Vector3,this._skinnedCache=null,this._clipsCache=null,this._savedTimeScale=1,this.onFinished=null,this.wakeCallback=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.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}),this._skinnedCache.push(new Float32Array(a*3)),s+=i}this._posBuffer=new Float32Array(s*9);let c=n.filter(e=>e.isSkinnedMesh).length;console.debug(`[AnimationManager] Init: ${i.length} clips, ${n.length} meshes (${c} skinned), ${s} triangles`)}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.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:R.ANIMATION_STARTED})}}pause(){this.mixer&&(this.mixer.timeScale=0,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:R.ANIMATION_PAUSED}))}resume(){this.mixer&&(this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:R.ANIMATION_STARTED}))}stop(){this.mixer&&(this.mixer.stopAllAction(),this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:R.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.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._computePositions(),this._posBuffer}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._computePositions(),this._posBuffer}_computePositions(){let e=this._tempVec,t=this._posBuffer;this._mixerRoot.updateMatrixWorld(!0);for(let n=0;n<this._meshes.length;n++){let r=this._meshes[n],{start:i,count:a,uniqueVerts:o,indices:s}=this._meshTriRanges[n],c=this._skinnedCache[n],l=r.matrixWorld;for(let t=0;t<o;t++)r.getVertexPosition(t,e),e.applyMatrix4(l),c[t*3]=e.x,c[t*3+1]=e.y,c[t*3+2]=e.z;if(s)for(let e=0;e<a;e++){let n=e*3,r=s[n]*3,a=s[n+1]*3,o=s[n+2]*3,l=(i+e)*9;t[l]=c[r],t[l+1]=c[r+1],t[l+2]=c[r+2],t[l+3]=c[a],t[l+4]=c[a+1],t[l+5]=c[a+2],t[l+6]=c[o],t[l+7]=c[o+1],t[l+8]=c[o+2]}else for(let e=0;e<a;e++){let n=e*3*3,r=(e*3+1)*3,a=(e*3+2)*3,o=(i+e)*9;t[o]=c[n],t[o+1]=c[n+1],t[o+2]=c[n+2],t[o+3]=c[r],t[o+4]=c[r+1],t[o+5]=c[r+2],t[o+6]=c[a],t[o+7]=c[a+1],t[o+8]=c[a+2]}}}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._posBuffer=null,this._skinnedCache=null,this._clipsCache=null}},hf=new r.Vector3(0,0,-1),gf=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._meshTriRanges=null,this._posBuffer=null,this._normalBuffer=null,this._skinnedCache=null,this._normalCache=null,this._tempVec=new r.Vector3,this._normalMatrix=new r.Matrix3,this._refitInFlight=!1,this._baselineComputed=!1,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,this._meshTriRanges=[],this._skinnedCache=[],this._normalCache=[];let t=0;for(let n of e){let e=n.geometry,r=e.attributes.position,i=e.index?e.index.array:null,a=i?i.length/3:r.count/3,o=r.count;this._meshTriRanges.push({start:t,count:a,uniqueVerts:o,indices:i}),this._skinnedCache.push(new Float32Array(o*3)),this._normalCache.push(new Float32Array(o*3)),t+=a}this._posBuffer=new Float32Array(t*9),this._normalBuffer=new Float32Array(t*9),this._baselineComputed=!1}attach(e){if(this._attached!==e&&(this._controls.attach(e),this._attached=e,this._lightTargetDistance=null,this._lastLightPosition=null,e.isLight&&e.target)){let t=e.target.position.clone().sub(e.position),n=t.length();n>1e-4?(e.quaternion.setFromUnitVectors(hf,t.normalize()),this._lightTargetDistance=n):this._lightTargetDistance=1,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:R.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:R.OBJECT_TRANSFORM_START}):(this._attached?.isLight?this._finalizeLightTransform():this._recomputeAndRefit(),this._app.dispatchEvent({type:R.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){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.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()}_recomputeAndRefit(){if(!this._meshes||!this._posBuffer||this._refitInFlight||!this._attached)return;this._attached.updateMatrixWorld(!0);let e=this._findAffectedMeshIndices(this._attached);if(e.length!==0){if(!this._baselineComputed)this._computeAllPositions(),this._baselineComputed=!0;else for(let t of e)this._computeMeshPositions(t);this._refitInFlight=!0;try{this._app.refitBLASes(e,this._posBuffer,this._normalBuffer)}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}_computeAllPositions(){for(let e=0;e<this._meshes.length;e++)this._computeMeshPositions(e)}_computeMeshPositions(e){let t=this._meshes[e],{start:n,count:r,uniqueVerts:i,indices:a}=this._meshTriRanges[e],o=this._skinnedCache[e],s=this._normalCache[e],c=this._tempVec,l=this._posBuffer,u=this._normalBuffer;t.updateMatrixWorld(!0);let d=t.matrixWorld;this._normalMatrix.getNormalMatrix(d);let f=this._normalMatrix.elements,p=t.geometry.attributes.normal;for(let e=0;e<i;e++)if(t.getVertexPosition(e,c),c.applyMatrix4(d),o[e*3]=c.x,o[e*3+1]=c.y,o[e*3+2]=c.z,p){let t=p.getX(e),n=p.getY(e),r=p.getZ(e);s[e*3]=f[0]*t+f[3]*n+f[6]*r,s[e*3+1]=f[1]*t+f[4]*n+f[7]*r,s[e*3+2]=f[2]*t+f[5]*n+f[8]*r}if(a)for(let e=0;e<r;e++){let t=e*3,r=a[t]*3,i=a[t+1]*3,c=a[t+2]*3,d=(n+e)*9;l[d]=o[r],l[d+1]=o[r+1],l[d+2]=o[r+2],l[d+3]=o[i],l[d+4]=o[i+1],l[d+5]=o[i+2],l[d+6]=o[c],l[d+7]=o[c+1],l[d+8]=o[c+2],u[d]=s[r],u[d+1]=s[r+1],u[d+2]=s[r+2],u[d+3]=s[i],u[d+4]=s[i+1],u[d+5]=s[i+2],u[d+6]=s[c],u[d+7]=s[c+1],u[d+8]=s[c+2]}else for(let e=0;e<r;e++){let t=e*3*3,r=(e*3+1)*3,i=(e*3+2)*3,a=(n+e)*9;l[a]=o[t],l[a+1]=o[t+1],l[a+2]=o[t+2],l[a+3]=o[r],l[a+4]=o[r+1],l[a+5]=o[r+2],l[a+6]=o[i],l[a+7]=o[i+1],l[a+8]=o[i+2],u[a]=s[t],u[a+1]=s[t+1],u[a+2]=s[t+2],u[a+3]=s[r],u[a+4]=s[r+1],u[a+5]=s[r+2],u[a+6]=s[i],u[a+7]=s[i+1],u[a+8]=s[i+2]}}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._meshTriRanges=null,this._posBuffer=null,this._normalBuffer=null,this._skinnedCache=null,this._normalCache=null,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}},_f=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}},vf=new WeakMap,yf=K(`engine`);function bf(e,t){e.lost.then(e=>{t.app&&t.app._handleDeviceLost(e)})}var xf=/swiftshader|llvmpipe|lavapipe|basic render|microsoft basic|warp/i;function Sf(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||xf.test(n)}}var Cf=class extends r.EventDispatcher{constructor(e,t={}){super();try{vf.get(e)?.dispose()}catch(e){yf.warn(`prior canvas owner dispose failed`,e)}vf.set(e,this),this.canvas=e,this._autoResize=t.autoResize!==!1,this._container=t.container||null,this._applySceneMetadataEnabled=t.applySceneMetadata!==!1,this._applyingSceneMetadata=!1,this._profile=Re(t.profile),this._issues=new Xa({strict:t.strict===!0,onIssue:e=>this.dispatchEvent({type:R.ISSUE,issue:e})}),this.settings=new pu({...B,environmentRotation:this._profile.environmentRotation,saturation:this._profile.saturation},{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._maxTextureSize=B.maxTextureSize,this.pipeline=null,this._pendingReservedRenderSize=null,this.stages={},this.cameraManager=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 mf,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 cu,this._resizeDebounceTimer=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){yf.warn(`failed to remove listener`,t,e)}this._trackedListeners.length=0}async init(){return await this._initRenderer(),this._applyPendingReservedRenderSize(),this._initCameraManager(),this._initScenes(),this._initAssetPipeline(),this._initPipeline(),await this._initManagers(),this._wireEvents(),this.stages.pathTracer.setTriangleData(new Float32Array(32),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setupMaterial(),this.isInitialized=!0,yf.debug(`WebGPU path tracer app initialized`),this}animate(){if(!this._deviceLost){if(this.animationManagerId=requestAnimationFrame(()=>this.animate()),this._loadingInProgress||this._sdf?.isProcessing){this.dispatchEvent({type:R.FRAME});return}if(this.cameraManager.controls&&this.cameraManager.controls.update(),this.animationManager?.isPlaying&&!this._animRefitInFlight){let e=this.animationManager.update();e&&(this._animRefitInFlight=!0,this.refitBVH(e).catch(e=>yf.error(`animation refit error:`,e)).finally(()=>{this._animRefitInFlight=!1}))}if(this.needsReset&&=(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}this.pipeline.render(),this.stages.pathTracer.isComplete||this.completion.updateTime(),this._ensureVRAMWiring();let e=this.stages.pathTracer?.vramTracker,t=this.stages.pathTracer?.frameCount??0;if(e&&(t<=1||t%30==0)&&e.measure(),Ee({timeElapsed:this.completion.timeElapsed,samples:De(this.stages.pathTracer),memoryUsed:e?.current??0,memoryPeak:e?.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:R.RENDER_COMPLETE,...e})}}this._renderHelperOverlay(),this.dispatchEvent({type:R.FRAME})}}}stopAnimation(){this.animationManagerId&&=(cancelAnimationFrame(this.animationManagerId),null)}_handleDeviceLost(e){this._deviceLost||(this._deviceLost=!0,yf.error(`WebGPU device lost (${e?.reason||`unknown`}): ${e?.message||``}`),this.stopAnimation(),this.dispatchEvent({type:R.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){this.pipeline&&(this.pipeline.reset(),e||this.pipeline.eventBus.emit(`asvgf:reset`)),this._abortPostProcess(),this.completion.reset(),this.wake(),this.dispatchEvent({type:`RenderReset`}),this.dispatchEvent({type:R.RENDER_RESET})}dispose(){if(!this._disposed){if(this._disposed=!0,this.dispatchEvent({type:R.DISPOSE}),this.stopAnimation(),clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=null,this._removeTrackedListeners(),we(null),this._issues.detach(),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.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){yf.warn(`failed to clear TSL texture singleton listeners`,e)}this.canvas&&vf.get(this.canvas)===this&&vf.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.lightManager?.clearLights?.(),this.stages.pathTracer&&(this.stages.pathTracer.setTriangleData(new Float32Array(32),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.reset(),this.dispatchEvent({type:`SceneUnloaded`}))}}async loadModel(e){await this._loadWithSceneRebuild(()=>this.assetLoader.loadModel(e),{type:`ModelLoaded`,url:e})}async loadObject3D(e,t=`object3d`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadObject3D(e,t),{type:`Object3DLoaded`,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 loadFile(e){let t=this.assetLoader?.getFileFormat(e?.name||``);if(!t)throw Error(`Unsupported file format: ${e?.name}`);if(t.type!==`environment`&&t.type!==`image`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromFile(e),{type:`ModelLoaded`,filename:e.name});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})}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?.triangleData&&!this._loadingInProgress){this._loadingInProgress=!0;try{await this.loadSceneData(),this.reset(),this.dispatchEvent({type:`TexturesReprocessed`,maxTextureSize:this._maxTextureSize})}finally{this._loadingInProgress=!1}}}async _loadWithSceneRebuild(e,t){if(this._loadingInProgress)throw this._busyError(`PathTracerApp`);this._loadingInProgress=!0;try{await e(),this._emissiveSamplingUserSet=!1,this._clearAppendedModels(),this._syncControlsAfterLoad(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()}),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.cameraManager.currentCameraIndex=0,this.dispatchEvent(t),this._dispatchCamerasUpdated()}finally{this._loadingInProgress=!1}}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(qa.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:du.SCENE_METADATA}),this.scene&&(this.scene.background=e),this.dispatchEvent({type:R.SCENE_METADATA_APPLIED,metadata:t,environment:{...n}})}async loadSceneData({pendingEnvironment:e=null}={}){this._preserveSelectionOnRebuild||this.interactionManager?.deselect(),this.animationManager.dispose(),this._animRefitInFlight=!1,this._tagPrimarySceneObject();let t=new fo(``,{namespace:`scene`,level:`info`}),n=this.meshScene.environment,r=null;if(e?(t.start(`Environment fetch + CDF (concurrent)`),r=e.then(async e=>{e&&(await this.stages.pathTracer.environment.applyHDRI(e),this._applySceneMetadataSettings(e))}).catch(e=>this._issues.record(qa.ENVIRONMENT_LOAD_FAILED,`authored environment failed to install — the scene is lit by whatever was already loaded`,{cause:String(e?.message??e)})).finally(()=>t.end(`Environment fetch + CDF (concurrent)`))):n?.image?.data&&(t.start(`Environment CDF build (worker)`),this.stages.pathTracer.scene.environment=n,r=this.stages.pathTracer.environment.buildEnvironmentCDF().then(()=>t.end(`Environment CDF build (worker)`))),t.start(`BVH build (SceneProcessor)`),this._sdf.setMaxTextureSize(this._maxTextureSize),await this._sdf.buildBVH(this.meshScene),t.end(`BVH build (SceneProcessor)`),z({status:`Transferring data to GPU...`,progress:86}),await new Promise(e=>setTimeout(e,0)),t.start(`GPU data transfer`),!this._sdf.uploadToPathTracer(this.stages.pathTracer,this.lightManager,this.meshScene,this.meshScene.environment))return!1;this.stages.pathTracer._meshRefs=this.stages.pathTracer._collectMeshRefs(this.meshScene),this.stages.pathTracer.setMeshVisibilityData(this.stages.pathTracer._meshRefs),this._refreshEmissiveForVisibility(),t.end(`GPU data transfer`),z({status:`Compiling shaders...`,progress:90}),await new Promise(e=>setTimeout(e,0)),t.start(`Material setup (TSL compile)`),this.stages.pathTracer.setupMaterial(),t.end(`Material setup (TSL compile)`),this._rasterPrecompile=null,this._pathTracerEnabled||(t.start(`Pipeline precompile`),await this.precompileRaster(),t.end(`Pipeline precompile`)),r&&(z({status:`Finalizing environment map...`,progress:95}),await r,this.stages.pathTracer.environment.applyCDFResults());let i=this.getSceneMinY();if(this.settings.set(`groundProjectionLevel`,i,{reset:!1}),this.settings.set(`groundCatcherHeight`,i,{reset:!1}),!this._emissiveSamplingUserSet){let e=(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0;this.settings.set(`enableEmissiveTriangleSampling`,e,{reset:!1})}return t.start(`Apply settings`),this.settings.applyAll(),this.stages.compositor.setTransparentBackground(this.settings.get(`transparentBackground`)),t.end(`Apply settings`),t.print(this._sceneSummaryParts()),Te(),this._initAnimationAndTransforms(),this.dispatchEvent({type:`SceneRebuild`}),!0}_sceneSummaryParts(){let e=this.stages.pathTracer,t=this._sdf?.instanceTable?.entries?.filter(Boolean).length??0,n=this._sdf?.geometryExtractor?.maps?.length??0;return[G.count(e.triangleCount,`tri`),t?G.count(t,`mesh`,`meshes`):null,G.count(e.materialData.materialCount,`material`),n?G.count(n,`map`):null,G.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(),this._recalibrateControlLimits(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),e&&this.dispatchEvent(e)}async addModel(e,{name:t}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModel: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:n}=await this.assetLoader.appendModel(e);return n.userData.__rayzeeSceneObject=!0,t&&(n.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,url:e,id:n.uuid}),n.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}_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){let n=await this._sdf.refitBVH(e,t);return this.stages.pathTracer.updateTriangleData(this._sdf.triangleData),this.stages.pathTracer.updateBVHData(this._sdf.bvhData),this.reset(),n}refitBLASes(e,t,n){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(),this._sdf.scheduleBackgroundRebuild(e,()=>{this.stages.pathTracer.updateTriangleData(this._sdf.triangleData),this.stages.pathTracer.updateBVHData(this._sdf.bvhData),this.reset()}),r}setReservedRenderResolution(e,{allowLower:t=!1}={}){let n=t?e:Math.max(e,V);if(!this.renderer)return this._pendingReservedRenderSize={requestedPx:e,allowLower:t},Math.max(256,Math.min(Be,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?Be:2048,a=Ve(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(qa.RENDER_RESERVE_CAPPED,`reserved render size ${G.n(e.requestedPx)}px was capped to ${G.n(t)}px by this device's limits — renders above ${G.n(t)}px will be declined`,{requested:e.requestedPx,applied:t}),this.dispatchEvent({type:`reserved_render_size_changed`,size:t})}getReservedRenderResolution(){return V}_isRenderSizeSupported(e,t){return e>V||t>V?(this._issues.record(qa.RENDER_SIZE_DECLINED,`render resolution ${e}×${t} exceeds the ${V}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:V}),!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.renderer.setSize(e,t,!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix();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(e,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.renderer.setSize(e,t,!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix(),clearTimeout(this._resizeDebounceTimer),this._applyRenderResize(e,t),{width:e,height:t})}configureForMode(e,t={}){let n=e===`production`,r=n?W:tt;this.cameraManager.controls.enabled=!n,this.settings.setMany({maxSamples:r.maxSamples,maxBounces:r.bounces,transmissiveBounces:r.transmissiveBounces,maxSubsurfaceSteps:r.maxSubsurfaceSteps,enableAlphaShadows:r.enableAlphaShadows??!1,useAdaptiveSampling:r.useAdaptiveSampling??!1,noiseThreshold:r.noiseThreshold??B.noiseThreshold,adaptiveStopFraction:r.adaptiveStopFraction??B.adaptiveStopFraction,adaptiveMinSamples:r.adaptiveMinSamples??B.adaptiveMinSamples,usePixelFreeze:r.usePixelFreeze??!1,pixelFreezeThreshold:r.pixelFreezeThreshold??B.pixelFreezeThreshold,pixelFreezeStability:r.pixelFreezeStability??B.pixelFreezeStability},{silent:!0,source:du.MODE_PRESET}),this.stages.pathTracer?.setUniform(`renderMode`,parseInt(r.renderMode)),this.stages.pathTracer?.updateCompletionThreshold?.();let i=this.denoisingManager?.denoiser;if(i&&(i.abort(),i.enabled=r.enableOIDN,i.updateQuality(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(){if(this.denoisingManager?.abort(this.canvas),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},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),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),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 renderToBuffer({colorSpace:e=`srgb`,preserveAlpha:t=!1}={}){if(e!==`linear`&&e!==`srgb`)throw Error(`renderToBuffer: colorSpace must be 'linear' or 'srgb', got "${e}"`);let n=this.stages?.pathTracer,r=n?.storageTextures?.readTarget;if(!r)throw Error(`renderToBuffer: no render target — call init() and render at least one sample`);let{width:i,height:a}=n,o=await this.renderer.readRenderTargetPixelsAsync(r,0,0,i,a,0);return e===`linear`?{data:o,width:i,height:a,colorSpace:e}:{data:ju(o,{exposure:this.renderer.toneMappingExposure,toneMapping:this.renderer.toneMapping,saturation:this.settings.get(`saturation`)??1,preserveAlpha:t}),width:i,height:a,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;return(e?.denoiser?.enabled||e?.upscaler?.enabled)&&e?.denoiserCanvas&&this.stages.pathTracer?.isComplete?e.denoiserCanvas:(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=>yf.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:{}}}_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)}setMaterialProperty(e,t,n){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?.entries;if(!e)return;let t=new Set;for(let n of e)n&&n.visible===!1&&t.add(n.meshIndex);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 rebuildMaterials(e){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=Sf(e),this.adapterInfo.isSoftware&&(this._issues.warn(qa.ADAPTER_SOFTWARE,`software GPU adapter "${this.adapterInfo.description||this.adapterInfo.vendor}" — renders are correct but orders of magnitude slower than hardware`,{...this.adapterInfo}),yf.warn(`software GPU adapter — check app.adapterInfo.isSoftware. ${this.adapterInfo.description}`));let n=e.limits;if(this.renderer=new t.WebGPURenderer({canvas:this.canvas,alpha:!0,powerPreference:`high-performance`,requiredLimits:{maxBufferSize:n.maxBufferSize,maxStorageBufferBindingSize:n.maxStorageBufferBindingSize,maxColorAttachmentBytesPerSample:128,maxStorageBuffersPerShaderStage:Math.min(n.maxStorageBuffersPerShaderStage,10)}}),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 r=this.renderer.backend?.device;r?.lost&&(this._gpuDevice=r,this._deviceLostHolder={app:this},bf(r,this._deviceLostHolder),r.onuncapturederror=e=>yf.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)}_initCameraManager(){this.cameraManager=new wd(this.canvas)}_initScenes(){this.scene=new r.Scene,this.meshScene=new r.Scene,this._sceneHelpers=new k}_initAssetPipeline(){this._sdf=new _o({issues:this._issues}),this.assetLoader=new Cd(this.meshScene,this.cameraManager.camera,this.cameraManager.controls,{issues:this._issues,profile:this._profile}),this.assetLoader.setRenderer(this.renderer),this.assetLoader.createFloorPlane(),this._addTrackedListener(this.cameraManager.controls,`change`,()=>{this.needsReset=!0,this.wake()})}_initPipeline(){this._createStages();let{clientWidth:e,clientHeight:t}=this.canvas;this.pipeline=new ou(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.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.pipeline.setSize(n,r)}async _initManagers(){this.interactionManager=new lu({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 Td(this.scene,this._sceneHelpers,this.stages.pathTracer,{onReset:()=>this.reset()}),this.goboManager=new Ed(this.stages.pathTracer,{onReset:()=>this.reset()}),this.iesManager=new Ld(this.stages.pathTracer,{onReset:()=>this.reset()}),this._setupDenoisingManager(),await this._setupOverlayManager(),this.transformManager=new gf({camera:this.cameraManager.camera,canvas:this.canvas,orbitControls:this.cameraManager.controls,app:this}),this.overlayManager.register(`transform`,new _f(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.setSettings(this.settings),this.environmentManager=this.stages.pathTracer.environment,this.environmentManager.callbacks.onAutoExposureReset=()=>this.pipeline.eventBus.emit(`autoexposure:resetHistory`)}_wireEvents(){this._addTrackedListener(this.cameraManager,`CameraSwitched`,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,R.AUTO_FOCUS_UPDATED,e=>this.dispatchEvent(e)),this._forwardEvents(this.denoisingManager,[R.DENOISING_START,R.DENOISING_END,R.UPSCALING_START,R.UPSCALING_PROGRESS,R.UPSCALING_END,`resolution_changed`]),this._setupAutoExposureListener(),this.animationManager.wakeCallback=()=>this.wake(),this._forwardEvents(this.animationManager,[R.ANIMATION_STARTED,R.ANIMATION_PAUSED,R.ANIMATION_STOPPED]),this._addTrackedListener(this.animationManager,R.ANIMATION_PAUSED,()=>{this._animRefitInFlight=!1}),this._addTrackedListener(this.animationManager,R.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({meshScene:this.meshScene,assetLoader:this.assetLoader,floorPlane:this.assetLoader.floorPlane,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,cameraManager:this.cameraManager}),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.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.dispatchEvent({type:R.ANIMATION_FINISHED})}}this.transformManager?.setMeshData(this._sdf.meshes)}_createStages(){this.stages.pathTracer=new Cl(this.renderer,this.scene,this.cameraManager.camera),this.stages.normalDepth=new wl(this.renderer,{pathTracer:this.stages.pathTracer}),this.stages.motionVector=new Tl(this.renderer,this.cameraManager.camera,{pathTracer:this.stages.pathTracer}),this.stages.asvgf=new Ol(this.renderer,{enabled:!1}),this.stages.variance=new jl(this.renderer,{enabled:!1}),this.stages.bilateralFilter=new Nl(this.renderer,{enabled:!1}),this.stages.edgeFilter=new zl(this.renderer,{enabled:!1}),this.stages.autoExposure=new Kl(this.renderer,{enabled:B.autoExposure??!1}),this.stages.compositor=new ql(this.renderer,{saturation:this.settings.get(`saturation`)??B.saturation,pathTracer:this.stages.pathTracer})}_setupDenoisingManager(){this.denoisingManager=new rf({renderer:this.renderer,mainCanvas:this.canvas,scene:this.scene,camera:this.cameraManager.camera,stages:{pathTracer:this.stages.pathTracer,normalDepth:this.stages.normalDepth,motionVector:this.stages.motionVector,asvgf:this.stages.asvgf,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,getTransparentBg:()=>this.settings.get(`transparentBackground`)??!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:R.RENDER_RESET}),this.wake())}_setupAutoExposureListener(){this.stages.autoExposure&&this.stages.autoExposure.on(`autoexposure:updated`,e=>{this.dispatchEvent({type:R.AUTO_EXPOSURE_UPDATED,exposure:e.exposure,luminance:e.luminance})})}_renderHelperOverlay(){this.scene.updateMatrixWorld(),this.overlayManager?.render()}async _setupOverlayManager(){this.overlayManager=new pf(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.controls.saveState(),this.cameraManager.controls.update()}_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 wf(e){let t=await Ef(e);try{return await Tf(t,e)}finally{t.dispose()}}async function Tf(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 Ef({canvas:e,model:t=null,width:n=1920,height:r=1080,strict:i=!0,profile:a=`physical`,deterministic:o=!0,settings:s=null}={}){if(!e)throw Error(`openHeadless: a canvas is required`);let c=new Cf(e,{autoResize:!1,strict:i,profile:a});try{return c.setReservedRenderResolution(Math.max(n,r)),await c.init(),c.setCanvasSize(n,r),t&&await c.loadModel(t),s&&c.settings.setMany(s,{silent:!0}),o&&c.setDeterministicMode(!0),c}catch(e){throw c.dispose(),e}}var Df=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=W.maxSamples,enableOIDN:a=!0,onFrame:o,onProgress:s,onComplete:c}=e,l=this._app;if(!l.animationManager?.hasAnimations){console.warn(`VideoRenderManager: No animation clips available`),c?.(!1);return}let u=l.animationManager.clips[t];if(!u){console.warn(`VideoRenderManager: Invalid clip index ${t}`),c?.(!1);return}let d=u.duration/(r||1),f=e.totalFrames||Math.ceil(d*n),p=1/n;this._cancelled=!1,this._rendering=!0;let m=this._saveState();l.stopAnimation(),l.configureForMode(`production`),l.settings.setMany({maxSamples:i},{silent:!0}),l.stages.pathTracer?.updateCompletionThreshold?.(),l.cameraManager.controls&&(l.cameraManager.controls.enabled=!1);try{for(let e=0;e<f&&!this._cancelled;e++){let n=e*p*r,i=l.animationManager.seekTo(n,t);if(i?await l.refitBVH(i):l.reset(),l.stopAnimation(),await this._accumulateFrame(l),this._cancelled||(a&&l.denoisingManager?.denoiser?.enabled&&await this._waitForDenoise(l),this._cancelled))break;let c=l.getCanvas();if(c&&o){let t=await createImageBitmap(c);await o(t,e,f),t.close()}let u={frame:e+1,totalFrames:f,percent:(e+1)/f*100};s?.(u),l.dispatchEvent({type:R.VIDEO_RENDER_PROGRESS,...u})}}catch(e){console.error(`VideoRenderManager: Render error:`,e),this._cancelled=!0}finally{this._restoreState(m),this._rendering=!1;let e=!this._cancelled;c?.(e),l.dispatchEvent({type:R.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(R.DENOISING_END,i),clearTimeout(n)},i=()=>{r(),t()};n=setTimeout(()=>{console.warn(`VideoRenderManager: Denoise timed out, skipping`),r(),t()},3e4),e.addEventListener(R.DENOISING_END,i),e.denoisingManager.onRenderComplete({isStillComplete:()=>!this._cancelled,context:e.pipeline?.context})})}_saveState(){let e=this._app;return{maxSamples:e.settings.get(`maxSamples`),maxBounces:e.settings.get(`maxBounces`),transmissiveBounces:e.settings.get(`transmissiveBounces`),renderMode:e.stages.pathTracer?.renderMode?.value,controlsEnabled:e.cameraManager.controls?.enabled,oidnEnabled:e.denoisingManager?.denoiser?.enabled,oidnQuality:e.denoisingManager?.denoiser?.quality,wasPlaying:e.animationManager?.isPlaying,pauseRendering:e.pauseRendering}}_restoreState(e){let t=this._app;t.settings.setMany({maxSamples:e.maxSamples,maxBounces:e.maxBounces,transmissiveBounces:e.transmissiveBounces},{silent:!0}),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.denoiser.enabled=e.oidnEnabled??!1,e.oidnQuality&&t.denoisingManager.denoiser.updateQuality(e.oidnQuality)),t.pauseRendering=e.pauseRendering??!1,t.animationManager?.stop(),t.reset(),t.wake()}};e.AF_DEFAULTS=qe,e.ASVGF_QUALITY_PRESETS=He,e.AUTO_FOCUS_MODES=Ke,e.AnimationManager=mf,e.BVH_LEAF_MARKERS=Ye,e.CAMERA_PRESETS=Ge,e.CAMERA_RANGES=Ue,e.CameraManager=wd,e.DEFAULT_TEXTURE_MATRIX=et,e.DenoisingManager=rf,e.ENGINE_DEFAULTS=B,e.EngineEvents=R,e.EngineIssueError=Ya,e.GoboManager=Ed,e.IESManager=Ld,e.INTERACTIVE_RENDER_CONFIG=tt,e.ISSUE_CODES=qa,e.ISSUE_SEVERITY=Ja,e.InteractionManager=lu,e.IssueLog=Xa,e.LOG_LEVELS=rt,e.LightManager=Td,e.Logger=_t,e.MAX_RESERVABLE_RENDER_SIZE=Be,e.MEMORY_CONSTANTS=nt,e.OverlayManager=pf,e.PRODUCTION_RENDER_CONFIG=W,e.PathTracerApp=Cf,e.PipelineContext=Jl,e.RENDER_PROFILES=Le,e.RenderPipeline=ou,e.RenderSettings=pu,e.RenderStage=be,e.SETTING_SOURCE=du,e.SKY_PRESETS=We,e.StageExecutionMode=ye,e.TEXTURE_CONSTANTS=Xe,e.TRIANGLE_DATA_LAYOUT=H,e.TransformManager=gf,e.VRAMTracker=Ds,e.VideoRenderManager=Df,e.bufferBytes=Ts,e.captureHeadless=Tf,e.clearBindingAuditFindings=tu,e.configureAssets=Eo,e.createLogger=K,e.deriveAlphaMode=io,e.describeAdapter=Sf,e.extractSceneMetadata=_d,e.fmt=G,e.getAssetConfig=Do,e.getBindingAuditFindings=eu,e.getRenderProfile=Re,e.openHeadless=Ef,e.parseSceneMetadata=gd,e.renderHeadless=wf,e.setBindingAudit=$l,e.textureBytes=Es});
|
|
743
|
+
`,Gf=64,Kf=32768,qf=.18;function Jf(e,t){let n=0;for(let r=0;r<t;r++){let t=r*4,i=.212671*e[t]+.71516*e[t+1]+.072169*e[t+2];n+=Math.log2(Math.max(i,0)+1e-4)}let r=qf/2**(n/t);return Number.isFinite(r)&&r>0?r:1}var Yf=class extends r.EventDispatcher{constructor(e,t,n,i,a={}){if(super(),!e||!t||!n||!i)throw Error(`OIDNDenoiser requires output canvas, renderer, scene, and camera`);this.renderer=t,this.scene=n,this.camera=i,this.input=t.domElement,this.output=e,this.extractGBufferData=a.extractGBufferData||null,this.getMRTRenderTarget=a.getMRTRenderTarget||null,this.backendParamsGetter=a.backendParams||null,this.getGPUTextures=a.getGPUTextures||null,this.refreshInput=a.refreshInput||null,this.getExposure=a.getExposure||(()=>1),this.getToneMapping=a.getToneMapping||(()=>r.ACESFilmicToneMapping),this.getSaturation=a.getSaturation||(()=>1),this.getTransparentBackground=a.getTransparentBackground||(()=>!1),this.isGPUMode=!!this.backendParamsGetter,this.gpuDevice=null,this._gpuInputBuffers={color:null,albedo:null,normal:null},this._gpuInputBufferSize={width:0,height:0},this._gpuInputPadBuffer=null,this._gpuInputPaddedRowBytes=0,this._colorScalePipeline=null,this._colorScaleBindGroup=null,this._colorScaleUniform=null,this._oidnInputScale=1,this._alphaReadbackBuffer=null,this._alphaReadbackMapped=!1,this._cachedAlpha=null,this._cachedAlphaWidth=0,this.config={...Uf.DEFAULT_OPTIONS,...a},this.enabled=this.config.enableOIDN,this.quality=this.config.oidnQuality,this.debugGbufferMaps=this.config.debugGbufferMaps,this.maxTileSize=this.config.tileSize,this._activeTileSize=0,this.state={isDenoising:!1,isLoading:!1,abortController:null},this._pendingStagingBuffers=new Set,this._pendingTileBlits=[],this.currentTZAUrl=null,this.unet=null,this._pendingStart=!1,this._initialize().catch(e=>{zf.error(`init failed:`,e),this.dispatchEvent({type:`error`,error:e})})}async _initialize(){try{this._setupCanvas(),await this._setupUNetDenoiser()}catch(e){throw Error(`Initialization failed: ${e.message}`)}}_setupCanvas(){if(!this.output.getContext)throw Error(`Output must be a valid Canvas element`);this.output.willReadFrequently=!0,this.output.width=this.input.width,this.output.height=this.input.height,Object.assign(this.output.style,{position:`absolute`,top:`0`,left:`0`,width:`100%`,height:`100%`,borderRadius:`5px`,background:`repeating-conic-gradient(#808080 0% 25%, transparent 0% 50%) 50% / 20px 20px`}),this.ctx=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0})}expectsCleanAux(e=this.quality){let{QUALITY_MODELS:t}=Uf;return(t[e]||t.balance).cleanAux}getRuntimeInfo(){return this.unet?.getRuntimeInfo?.()??null}profileNextDenoise(){return this.unet?.profileNextExecution?.()??!1}async getLastDenoiseProfile(){return await this.unet?.getLastExecutionProfile?.()??null}_resolveTileSize(){let e=Math.max(this.output?.width||0,this.output?.height||0);return e?Math.min(e,this.maxTileSize):this.maxTileSize}async _setupUNetDenoiser(){if(this.state.isLoading)return;this.state.isLoading=!0;let e=this._generateTzaUrl(),t=this._resolveTileSize();if(this.currentTZAUrl===e&&this._activeTileSize===t&&this.unet){this.state.isLoading=!1;return}try{this.dispatchEvent({type:`loading`,message:`Loading UNet denoiser...`}),this.unet&&=(this.unet.dispose(),null);let n;if(this.isGPUMode&&this.backendParamsGetter){let e=this.backendParamsGetter();this.gpuDevice=e?.device??null,n=e?.device?e:void 0}this.unet=await(await Vf())(e,n,{aux:!0,hdr:!0,maxTileSize:t,dynamicTile:!1}),this.currentTZAUrl=e,this._activeTileSize=t,this.dispatchEvent({type:`loaded`}),zf.debug(`UNet weights loaded:`,e)}catch(e){zf.error(`UNet weights failed to load:`,e),this.dispatchEvent({type:`error`,error:Error(`Denoiser loading failed: ${e.message}`)})}finally{this.state.isLoading=!1,this._pendingStart&&this.unet&&this.enabled&&(this._pendingStart=!1,this.start())}}_generateTzaUrl(){let{oidnWeightsBaseUrl:e}=ns(),{QUALITY_MODELS:t}=Uf;return`${e}${(t[this.quality]||t.balance).model}.tza`}async updateConfiguration(e){Object.keys(e).some(t=>this.config[t]!==e[t])&&(Object.assign(this.config,e),this.quality=this.config.oidnQuality,this.debugGbufferMaps=this.config.debugGbufferMaps,this.maxTileSize=this.config.tileSize,await this._setupUNetDenoiser())}async updateQuality(e){if(!Object.prototype.hasOwnProperty.call(Uf.QUALITY_MODELS,e))throw Error(`Invalid quality setting: ${e}. Must be one of: ${Object.keys(Uf.QUALITY_MODELS).join(`, `)}`);await this.updateConfiguration({oidnQuality:e})}async start(){if(!this.enabled||this.state.isDenoising)return!1;if(this.unet&&!this.state.isLoading&&this._activeTileSize!==this._resolveTileSize()&&await this._setupUNetDenoiser(),this.state.isLoading)return this._pendingStart=!0,!1;this.dispatchEvent({type:`start`});let e=performance.now(),t=await this.execute();if(t){this.renderer?.resetState?.(),this.input.style.opacity=`0`;let t=performance.now()-e;zf.debug(`denoise complete in ${J.ms(t)} · quality ${this.quality}`)}return t}_revealOutput(){this.output.style.display=`block`,this.input.style.opacity=`0`}async execute(){if(!this.enabled||!this.unet)return!1;this.state.abortController=new AbortController,this.state.isDenoising=!0;try{return await this._executeUNet(),!0}catch(e){return e.name===`AbortError`?zf.debug(`denoise aborted`):zf.error(`denoise error:`,e),this.input.style.opacity=`1`,!1}finally{this.state.isDenoising=!1,this.state.abortController=null,this.dispatchEvent({type:`end`})}}async _executeUNet(){return this._executeUNetGPU()}async _executeUNetGPU(){let{width:e,height:t}=this.output;if(!this.getGPUTextures)return zf.warn(`GPU mode enabled but getGPUTextures not provided`),!1;let n=this.getGPUTextures();if(!n?.color)return zf.warn(`GPU textures not ready yet`),!1;let r=this.gpuDevice;if(!r)return zf.warn(`gpuDevice not available`),!1;this.refreshInput?.(),this.ctx.drawImage(this.input,0,0,e,t),this._revealOutput(),this._ensureGPUInputBuffers(e,t);let i=r.createCommandEncoder({label:`oidn-tex-to-buf`}),a=e*16,o=this._gpuInputPaddedRowBytes,s=o>a,c=this._gpuInputPadBuffer,l=(n,r)=>{if(!s)i.copyTextureToBuffer({texture:n,mipLevel:0},{buffer:r,offset:0,bytesPerRow:a,rowsPerImage:t},{width:e,height:t,depthOrArrayLayers:1});else{i.copyTextureToBuffer({texture:n,mipLevel:0},{buffer:c,offset:0,bytesPerRow:o,rowsPerImage:t},{width:e,height:t,depthOrArrayLayers:1});for(let e=0;e<t;e++)i.copyBufferToBuffer(c,e*o,r,e*a,a)}};l(n.color,this._gpuInputBuffers.color),l(n.albedo,this._gpuInputBuffers.albedo),l(n.normal,this._gpuInputBuffers.normal),r.queue.submit([i.finish()]),await this._readbackColor(r,e,t),globalThis.__OIDN_NO_INPUT_SCALE&&(this._oidnInputScale=1),this._applyColorScale(r,e*t);let u={color:{data:this._gpuInputBuffers.color,width:e,height:t},albedo:{data:this._gpuInputBuffers.albedo,width:e,height:t},normal:{data:this._gpuInputBuffers.normal,width:e,height:t}};return this._executeWithAbortGPU(u)}_ensureGPUInputBuffers(e,t){let{width:n,height:r}=this._gpuInputBufferSize;if(n===e&&r===t&&this._gpuInputBuffers.color)return;this._destroyGPUInputBuffers();let i=this.gpuDevice,a=e*t*16,o=GPUBufferUsage.COPY_DST|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC;this._gpuInputBuffers.color=i.createBuffer({label:`oidn-in-color`,size:a,usage:o}),this._gpuInputBuffers.albedo=i.createBuffer({label:`oidn-in-albedo`,size:a,usage:o}),this._gpuInputBuffers.normal=i.createBuffer({label:`oidn-in-normal`,size:a,usage:o}),this._gpuInputBufferSize={width:e,height:t};let s=e*16,c=Math.ceil(s/256)*256;c===s?this._gpuInputPaddedRowBytes=s:(this._gpuInputPadBuffer=i.createBuffer({label:`oidn-in-pad`,size:c*t,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),this._gpuInputPaddedRowBytes=c)}_destroyGPUInputBuffers(){if(this._gpuInputBuffers.color?.destroy(),this._gpuInputBuffers.albedo?.destroy(),this._gpuInputBuffers.normal?.destroy(),this._gpuInputPadBuffer?.destroy(),this._alphaReadbackMapped&&this._alphaReadbackBuffer)try{this._alphaReadbackBuffer.unmap()}catch{}this._alphaReadbackBuffer?.destroy(),this._alphaReadbackMapped=!1,this._colorScaleBindGroup=null,this._colorScaleUniform?.destroy(),this._colorScaleUniform=null,this._gpuInputBuffers={color:null,albedo:null,normal:null},this._gpuInputPadBuffer=null,this._gpuInputPaddedRowBytes=0,this._alphaReadbackBuffer=null,this._gpuInputBufferSize={width:0,height:0}}async _readbackColor(e,t,n){let r=t*n*16;this._alphaReadbackBuffer===null&&(this._alphaReadbackBuffer=e.createBuffer({label:`oidn-alpha-readback`,size:r,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}));let i=this._alphaReadbackBuffer,a=e.createCommandEncoder();a.copyBufferToBuffer(this._gpuInputBuffers.color,0,i,0,r),e.queue.submit([a.finish()]),this._alphaReadbackMapped=!0;try{await i.mapAsync(GPUMapMode.READ)}catch{this._alphaReadbackMapped=!1;return}let o=new Float32Array(i.getMappedRange()),s=t*n;this._oidnInputScale=Jf(o,s);let c=null;if(this.getTransparentBackground()){c=new Uint8Array(s);for(let e=0;e<s;e++)c[e]=Math.min(Math.max(o[e*4+3]*255,0),255)|0}i.unmap(),this._alphaReadbackMapped=!1,this._cachedAlpha=c,this._cachedAlphaWidth=t}_outputExposure(){return vo(this.getExposure(),this.getToneMapping())/this._oidnInputScale}_applyColorScale(e,t){let n=this._oidnInputScale;if(!this._ensureColorScalePipeline(e))return;e.queue.writeBuffer(this._colorScaleUniform,0,new Float32Array([n]));let r=Math.ceil(t/Gf),i=Math.min(r,Kf),a=Math.ceil(r/i),o=e.createCommandEncoder({label:`oidn-color-scale`}),s=o.beginComputePass({label:`oidn-color-scale`});s.setPipeline(this._colorScalePipeline),s.setBindGroup(0,this._colorScaleBindGroup),s.dispatchWorkgroups(i,a,1),s.end(),e.queue.submit([o.finish()])}_ensureColorScalePipeline(e){let t=this._gpuInputBuffers.color;return!e||!t?null:(this._colorScalePipeline||=e.createComputePipeline({label:`oidn-color-scale`,layout:`auto`,compute:{module:e.createShaderModule({label:`oidn-color-scale`,code:Wf}),entryPoint:`main`}}),this._colorScaleUniform||=e.createBuffer({label:`oidn-color-scale-uniform`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this._colorScaleBindGroup||=e.createBindGroup({label:`oidn-color-scale`,layout:this._colorScalePipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t}},{binding:1,resource:{buffer:this._colorScaleUniform}}]}),this._colorScalePipeline)}_executeWithAbortGPU(e){return new Promise((t,n)=>{if(this.state.abortController?.signal.aborted){n(new DOMException(`Aborted`,`AbortError`));return}let i=null;this._pendingTileBlits=[];let a=()=>{i&&=(i(),null),n(new DOMException(`Aborted`,`AbortError`))};this.state.abortController.signal.addEventListener(`abort`,a,{once:!0}),i=this.unet.tileExecute({...e,done:async e=>{this.state.abortController.signal.removeEventListener(`abort`,a),i=null;try{this._pendingTileBlits.length>0?await Promise.allSettled(this._pendingTileBlits):await this._displayGPUOutput(e),t()}catch(e){n(e)}},progress:(e,t,n)=>{if(!e?.data||!n)return;let i=this.gpuDevice,a=e.width,o=e.height,s=Math.min(n.width,a-n.x),c=Math.min(n.height,o-n.y);if(s<=0||c<=0)return;let l=s*16,u=s*c*16,d=i.createBuffer({size:u,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});this._pendingStagingBuffers.add(d);let f=i.createCommandEncoder();for(let t=0;t<c;t++){let r=((n.y+t)*a+n.x)*16,i=t*l;f.copyBufferToBuffer(e.data,r,d,i,l)}i.queue.submit([f.finish()]);let p=d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(d.getMappedRange()),t=new ImageData(s,c),i=this._outputExposure(),l=this.getSaturation(),u=ho.get(this.getToneMapping())||ho.get(r.ACESFilmicToneMapping),f=this._cachedAlpha,p=this._cachedAlphaWidth;for(let r=0,a=e.length;r<a;r+=4){let a=e[r]*i,o=e[r+1]*i,c=e[r+2]*i;if(l!==1&&(Hf[0]=a,Hf[1]=o,Hf[2]=c,So(Hf,l),a=Hf[0],o=Hf[1],c=Hf[2]),u(a,o,c,1,Hf),t.data[r]=_o(Hf[0])*255+.5|0,t.data[r+1]=_o(Hf[1])*255+.5|0,t.data[r+2]=_o(Hf[2])*255+.5|0,f){let e=(r>>2)%s,i=(r>>2)/s|0;t.data[r+3]=f[(n.y+i)*p+n.x+e]}else t.data[r+3]=255}d.unmap(),d.destroy(),this._pendingStagingBuffers.delete(d),this.ctx.putImageData(t,n.x,n.y),this.dispatchEvent({type:`tileProgress`,tile:{x:n.x,y:n.y,width:s,height:c},imageWidth:a,imageHeight:o})}).catch(()=>{d.destroy(),this._pendingStagingBuffers.delete(d)});this._pendingTileBlits.push(p)}})})}async _displayGPUOutput({data:e,width:t,height:n}){let i=this.gpuDevice;if(!i){zf.error(`gpuDevice not available for output readback`);return}let a=t*n*4*4,o=i.createBuffer({label:`oidn-output-staging`,size:a,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});try{let s=i.createCommandEncoder({label:`oidn-readback`});s.copyBufferToBuffer(e,0,o,0,a),i.queue.submit([s.finish()]),await o.mapAsync(GPUMapMode.READ);let c=new Float32Array(o.getMappedRange()),l=new ImageData(t,n),u=this._outputExposure(),d=this.getSaturation(),f=ho.get(this.getToneMapping())||ho.get(r.ACESFilmicToneMapping),p=this._cachedAlpha;for(let e=0,t=c.length;e<t;e+=4){let t=c[e]*u,n=c[e+1]*u,r=c[e+2]*u;d!==1&&(Hf[0]=t,Hf[1]=n,Hf[2]=r,So(Hf,d),t=Hf[0],n=Hf[1],r=Hf[2]),f(t,n,r,1,Hf),l.data[e]=_o(Hf[0])*255+.5|0,l.data[e+1]=_o(Hf[1])*255+.5|0,l.data[e+2]=_o(Hf[2])*255+.5|0,l.data[e+3]=p?p[e>>2]:255}o.unmap(),this.ctx.putImageData(l,0,0)}finally{o.destroy()}}abort(){this._pendingStart=!1,!(!this.enabled||!this.state.isDenoising)&&(this.state.abortController?.abort(),this._destroyPendingStagingBuffers(),this.input.style.opacity=`1`,this.state.isDenoising=!1,this.dispatchEvent({type:`end`}),zf.debug(`denoise aborted`))}setSize(e,t){if(e<=0||t<=0)throw Error(`Invalid dimensions: ${e}x${t}`);this.output.width=e,this.output.height=t,this._setupUNetDenoiser().catch(e=>{zf.error(`reinitialize after size change failed:`,e)})}_destroyPendingStagingBuffers(){for(let e of this._pendingStagingBuffers)e.destroy();this._pendingStagingBuffers.clear()}dispose(){this.abort(),this._destroyPendingStagingBuffers(),this.unet?.dispose(),this._destroyGPUInputBuffers(),this._colorScalePipeline=null,this.output?.parentNode&&this.output.remove(),this.unet=null,this.ctx=null,this.state.abortController=null,this.removeAllListeners?.(),zf.debug(`disposed`)}},Xf='let e={ortRuntimeUrl:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/ort.webgpu.bundle.min.mjs`,ortWasmPaths:`https://cdn.jsdelivr.net/npm/onnxruntime-web@1.24.3/dist/`,cacheNamespace:`rayzee`},t=null;async function n(){return t||(t=await import(e.ortRuntimeUrl),t.env.wasm.wasmPaths=e.ortWasmPaths,t.env.logLevel=`error`,t)}function r(){return`${e.cacheNamespace}:ai-upscaler-models`}const i=`models`;let a=null,o=null;function s(){return new Promise((e,t)=>{let n=indexedDB.open(r(),1);n.onupgradeneeded=()=>n.result.createObjectStore(i),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function c(e){try{let t=await s();return await new Promise((n,r)=>{let a=t.transaction(i,`readonly`).objectStore(i).get(e);a.onsuccess=()=>n(a.result||null),a.onerror=()=>r(a.error)})}catch{return null}}async function l(e,t){try{let n=await s();await new Promise((r,a)=>{let o=n.transaction(i,`readwrite`);o.objectStore(i).put(t,e),o.oncomplete=()=>r(),o.onerror=()=>a(o.error)})}catch{}}async function u(e){let t=await c(e);if(t)return console.log(`AI Upscaler Worker: model loaded from cache (${(t.byteLength/1024/1024).toFixed(1)}MB)`),t;let n=await fetch(e);if(!n.ok)throw Error(`Failed to fetch model: ${n.status}`);let r=await n.arrayBuffer();return l(e,r.slice(0)),r}async function d(e,t){if(a&&o===e){self.postMessage({type:`loaded`,backend:`webgpu`});return}a&&=(await a.release(),null);let[r,i]=await Promise.all([u(e),n()]);a=await i.InferenceSession.create(r,t),o=e;let s=512;try{let e=await navigator.gpu?.requestAdapter(),t=await e?.requestAdapterInfo?.()||e?.info,n=/apple|swiftshader|llvmpipe/i.test(t?.vendor||``)||/apple|swiftshader/i.test(t?.architecture||``),r=t?.device?.toLowerCase?.()?.includes(`integrated`)||/intel.*iris|intel.*uhd|intel.*hd|amd.*vega|radeon.*graphics/i.test(t?.description||``);s=n?128:r?256:512,console.log(`AI Upscaler Worker: GPU="${t?.description||t?.device||`unknown`}", tileSize=${s}`)}catch{}let c=(r.byteLength/1024/1024).toFixed(1);console.log(`AI Upscaler Worker: model loaded (${c}MB), backend: webgpu`),self.postMessage({type:`loaded`,backend:`webgpu`,tileSize:s})}async function f(e,t,r,i){let o=await n(),s=a.inputNames[0],c=a.outputNames[0],l=new o.Tensor(`float32`,e,[1,3,r,t]),u=(await a.run({[s]:l}))[c].data;self.postMessage({type:`inferred`,outputData:u,id:i},[u.buffer])}self.onmessage=async t=>{let{type:n}=t.data;try{n===`load`?(t.data.ortRuntimeUrl&&(e.ortRuntimeUrl=t.data.ortRuntimeUrl),t.data.ortWasmPaths&&(e.ortWasmPaths=t.data.ortWasmPaths),t.data.cacheNamespace&&(e.cacheNamespace=t.data.cacheNamespace),await d(t.data.url,t.data.sessionOptions)):n===`infer`?await f(t.data.tileData,t.data.width,t.data.height,t.data.id):n===`dispose`&&a&&(await a.release(),a=null,o=null)}catch(e){self.postMessage({type:`error`,message:e.message,id:t.data?.id})}};',Zf=typeof self<`u`&&self.Blob&&new Blob([`URL.revokeObjectURL(import.meta.url);`,Xf],{type:`text/javascript;charset=utf-8`});function Qf(e){let t;try{if(t=Zf&&(self.URL||self.webkitURL).createObjectURL(Zf),!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(Xf),{type:`module`,name:e?.name})}}var $f={fast:{2:`2x-spanx2-ch48.onnx`,4:`4xNomos8k_span_otf_strong_fp32_opset17.onnx`},balanced:{2:`2xNomosUni_compact_otf_medium.onnx`,4:`RealESRGAN_x4plus.onnx`},quality:{2:`2x-realesrgan-x2plus.onnx`,4:`4xNomos2_hq_mosr_fp32.onnx`}};function ep(){let{upscalerModelBaseUrl:e}=ns(),t={};for(let n in $f){t[n]={};for(let r in $f[n])t[n][r]=e+$f[n][r]}return t}var tp={get QUALITY_PRESETS(){return ep()},TILE_SIZE:512,TILE_OVERLAP:16,SESSION_OPTIONS:{executionProviders:[{name:`webgpu`,preferredLayout:`NCHW`}],graphOptimizationLevel:`all`}},np=class extends r.EventDispatcher{constructor(e,t,n={}){if(super(),!e||!t)throw Error(`AIUpscaler requires output canvas and renderer`);this.renderer=t,this.input=t.domElement,this.output=e,this.getSourceCanvas=n.getSourceCanvas||null,this.getGPUTextures=n.getGPUTextures||null,this.getExposure=n.getExposure||(()=>1),this.getToneMapping=n.getToneMapping||(()=>r.ACESFilmicToneMapping),this.getSaturation=n.getSaturation||(()=>1),this.enabled=!1,this.hdr=!1,this.scaleFactor=n.scaleFactor||2,this.quality=n.quality||`fast`,this.refreshInput=n.refreshInput||null,this.tileSize=n.tileSize||tp.TILE_SIZE,this._tileSizeOverride=!!n.tileSize,this.state={isUpscaling:!1,isLoading:!1,abortController:null},this._worker=null,this._currentModelUrl=null,this._tileId=0,this._pendingWorkerHandlers=new Set,this._upscaledAlpha=null,this._upscaledAlphaWidth=0,this._backupCanvas=null,this._baseWidth=e.width,this._baseHeight=e.height,this._hdrStagingBuffer=null,this._hdrStagingWidth=0,this._hdrStagingHeight=0}async _ensureSession(){let e=tp.QUALITY_PRESETS[this.quality];if(!e)throw Error(`Unknown quality preset: ${this.quality}`);let t=e[this.scaleFactor];if(!t)throw Error(`No model for ${this.quality}/${this.scaleFactor}x`);if(!(this._worker&&this._currentModelUrl===t)){this.state.isLoading=!0,this.dispatchEvent({type:`loading`,message:`Loading ${this.scaleFactor}x upscale model...`});try{this._worker||=new Qf,await new Promise((e,n)=>{let r=t=>{t.data.type===`loaded`?(this._worker.removeEventListener(`message`,r),t.data.tileSize&&!this._tileSizeOverride&&(this.tileSize=t.data.tileSize),console.log(`AI Upscaler: ${this.scaleFactor}x model loaded, backend: ${t.data.backend}, tileSize: ${this.tileSize}`),e()):t.data.type===`error`&&(this._worker.removeEventListener(`message`,r),n(Error(t.data.message)))},{ortRuntimeUrl:i,ortWasmPaths:a,cacheNamespace:o}=ns();this._worker.addEventListener(`message`,r),this._worker.postMessage({type:`load`,url:t,sessionOptions:tp.SESSION_OPTIONS,ortRuntimeUrl:i,ortWasmPaths:a,cacheNamespace:o})}),this._currentModelUrl=t,this.dispatchEvent({type:`loaded`})}catch(e){throw console.error(`AI Upscaler: Failed to load model:`,e),this.dispatchEvent({type:`error`,error:e}),e}finally{this.state.isLoading=!1}}}async start(){if(!this.enabled||this.state.isUpscaling||this.state.isLoading)return!1;this.dispatchEvent({type:`start`});let e=performance.now(),t=await this.execute();if(t){this.renderer?.resetState?.();let t=performance.now()-e;console.log(`AI Upscaler: ${this.scaleFactor}x upscale completed in ${t.toFixed(1)}ms`)}return t}_revealOutput(){this.output.style.display=`block`,this.input.style.opacity=`0`}async execute(){if(!this.enabled)return!1;this.state.abortController=new AbortController,this.state.isUpscaling=!0,this.hdr&&this.getGPUTextures?this._capturedSource=await this._captureSourceHDR():this._capturedSource=this._captureSource(),this._createBackup(this._capturedSource);let e=this._capturedSource.width*this.scaleFactor,t=this._capturedSource.height*this.scaleFactor;this.output.width=e,this.output.height=t;let n=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0});n.imageSmoothingEnabled=!0,n.imageSmoothingQuality=`high`,n.drawImage(this._backupCanvas,0,0,e,t),this._revealOutput();try{return await this._ensureSession(),await this._runUpscale(),this.dispatchEvent({type:`resolution_changed`,width:this.output.width,height:this.output.height}),!0}catch(e){return e.name===`AbortError`?console.log(`AI Upscaler: Upscaling was aborted`):(console.error(`AI Upscaler: Upscaling error:`,e),this.dispatchEvent({type:`error`,error:e}),this._restoreBackup(),this.input.style.opacity=`1`,this.dispatchEvent({type:`resolution_changed`,width:this._baseWidth,height:this._baseHeight})),!1}finally{this._capturedSource=null,this._upscaledAlpha=null,this._backupCanvas=null,this.state.isUpscaling&&(this.state.isUpscaling=!1,this.state.abortController=null,this.dispatchEvent({type:`end`}))}}abort(){this.state.isUpscaling&&(this.state.abortController?.abort(),this._cleanupPendingWorkerHandlers(),this.input.style.opacity=`1`,this._restoreBackup(),this.dispatchEvent({type:`resolution_changed`,width:this._baseWidth,height:this._baseHeight}),this.state.isUpscaling=!1,this.dispatchEvent({type:`end`}),console.log(`AI Upscaler: Aborted`))}async _runUpscale(){let e=this.state.abortController.signal,t=this._capturedSource;this._capturedSource=null;let{width:n,height:i}=t,a=this.scaleFactor,o=this.output.getContext(`2d`,{willReadFrequently:!0,alpha:!0});this._cacheUpscaledAlpha(t,n*a,i*a),t.isHDR&&(this._hdrToneMapFn=ho.get(this.getToneMapping())||ho.get(r.ACESFilmicToneMapping),this._hdrExposure=vo(this.getExposure(),this.getToneMapping()),this._hdrSaturation=this.getSaturation(),this._tmOut=new Float32Array(3));let s=tp.TILE_OVERLAP,c=this.tileSize,l=c-s*2,u=Math.ceil(n/l),d=Math.ceil(i/l),f=u*d,p=0;for(let r=0;r<d;r++)for(let s=0;s<u;s++){if(e.aborted)throw new DOMException(`Aborted`,`AbortError`);let u=Math.min(s*l,Math.max(0,n-c)),d=Math.min(r*l,Math.max(0,i-c)),m=Math.min(c,n-u),h=Math.min(c,i-d),g=this._extractTile(t,u,d,m,h),_=await this._inferTile(g,m,h),v=u*a,y=d*a,b=m*a,x=h*a,S=this._tensorToImageData(_,b,x,v,y);o.putImageData(S,v,y),p++,this.dispatchEvent({type:`progress`,progress:p/f,tile:{x:s,y:r,total:f,completed:p}}),this.dispatchEvent({type:`tileProgress`,tile:{x:v,y,width:b,height:x},imageWidth:n*a,imageHeight:i*a})}}_captureSource(){let e=this.getSourceCanvas?this.getSourceCanvas():null;if(e&&e!==this.output){this.refreshInput?.();let t=document.createElement(`canvas`);t.width=e.width,t.height=e.height;let n=t.getContext(`2d`);return n.drawImage(e,0,0),n.getImageData(0,0,t.width,t.height)}return this.output.getContext(`2d`,{willReadFrequently:!0}).getImageData(0,0,this.output.width,this.output.height)}async _captureSourceHDR(){let e=this.getGPUTextures();if(!e?.color)throw Error(`No GPU color texture available for HDR capture`);let t=this.renderer.backend.device,n=e.color,r=n.width,i=n.height,a=Math.ceil(r*16/256)*256,o=a*i;(this._hdrStagingWidth!==r||this._hdrStagingHeight!==i)&&(this._hdrStagingBuffer?.destroy(),this._hdrStagingBuffer=t.createBuffer({label:`aiupscaler-hdr-readback`,size:o,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this._hdrStagingWidth=r,this._hdrStagingHeight=i);let s=this._hdrStagingBuffer,c=t.createCommandEncoder();c.copyTextureToBuffer({texture:n},{buffer:s,bytesPerRow:a,rowsPerImage:i},{width:r,height:i,depthOrArrayLayers:1}),t.queue.submit([c.finish()]),await s.mapAsync(GPUMapMode.READ);let l=new Float32Array(s.getMappedRange()),u=r*4,d=a/4,f=new Float32Array(r*i*4);for(let e=0;e<i;e++){let t=e*d,n=e*u;f.set(l.subarray(t,t+u),n)}return s.unmap(),{data:f,width:r,height:i,isHDR:!0}}_extractTile(e,t,n,r,i){let{data:a,width:o}=e,s=e.isHDR,c=r*i,l=new Float32Array(3*c);for(let e=0;e<i;e++)for(let i=0;i<r;i++){let u=((n+e)*o+(t+i))*4,d=e*r+i;if(s){let e=this._hdrToneMapFn,t=this._hdrExposure,n=this._hdrSaturation,r=a[u]*t,i=a[u+1]*t,o=a[u+2]*t;n!==1&&(this._tmOut[0]=r,this._tmOut[1]=i,this._tmOut[2]=o,So(this._tmOut,n),r=this._tmOut[0],i=this._tmOut[1],o=this._tmOut[2]),e(r,i,o,1,this._tmOut),l[d]=this._tmOut[0]**+go,l[c+d]=this._tmOut[1]**+go,l[2*c+d]=this._tmOut[2]**+go}else l[d]=a[u]/255,l[c+d]=a[u+1]/255,l[2*c+d]=a[u+2]/255}return l}async _inferTile(e,t,n){let r=++this._tileId;return new Promise((i,a)=>{let o=e=>{e.data.id===r&&(this._worker.removeEventListener(`message`,o),this._pendingWorkerHandlers.delete(o),e.data.type===`inferred`?i(e.data.outputData):e.data.type===`error`&&a(Error(e.data.message)))};this._pendingWorkerHandlers.add(o),this._worker.addEventListener(`message`,o),this._worker.postMessage({type:`infer`,tileData:e,width:t,height:n,id:r},[e.buffer])})}_tensorToImageData(e,t,n,r,i){let a=new ImageData(t,n),o=a.data,s=t*n,c=this._upscaledAlpha,l=this._upscaledAlphaWidth;for(let n=0;n<s;n++)if(o[n*4]=Math.min(255,Math.max(0,e[n]*255+.5))|0,o[n*4+1]=Math.min(255,Math.max(0,e[s+n]*255+.5))|0,o[n*4+2]=Math.min(255,Math.max(0,e[2*s+n]*255+.5))|0,c){let e=n/t|0,a=n%t;o[n*4+3]=c[(i+e)*l+(r+a)]}else o[n*4+3]=255;return a}_cacheUpscaledAlpha(e,t,n){let{data:r,width:i,height:a}=e,o=e.isHDR,s=o?1:255,c=!1;for(let e=3;e<r.length;e+=4)if(r[e]<s){c=!0;break}if(!c){this._upscaledAlpha=null,this._upscaledAlphaWidth=0;return}let l=document.createElement(`canvas`);l.width=i,l.height=a;let u=l.getContext(`2d`),d=u.createImageData(i,a);for(let e=0,t=i*a;e<t;e++){let t=o?Math.min(Math.max(r[e*4+3]*255,0),255)|0:r[e*4+3];d.data[e*4]=t,d.data[e*4+1]=t,d.data[e*4+2]=t,d.data[e*4+3]=255}u.putImageData(d,0,0);let f=document.createElement(`canvas`);f.width=t,f.height=n;let p=f.getContext(`2d`);p.imageSmoothingEnabled=!0,p.imageSmoothingQuality=`high`,p.drawImage(l,0,0,t,n);let m=p.getImageData(0,0,t,n).data,h=new Uint8Array(t*n);for(let e=0,r=t*n;e<r;e++)h[e]=m[e*4];this._upscaledAlpha=h,this._upscaledAlphaWidth=t}_createBackup(e){this._backupCanvas=document.createElement(`canvas`),this._backupCanvas.width=e.width,this._backupCanvas.height=e.height;let t=this._backupCanvas.getContext(`2d`);if(e.isHDR){let{data:n,width:i,height:a}=e,o=t.createImageData(i,a),s=o.data,c=ho.get(this.getToneMapping())||ho.get(r.ACESFilmicToneMapping),l=vo(this.getExposure(),this.getToneMapping()),u=this.getSaturation(),d=new Float32Array(3);for(let e=0,t=i*a;e<t;e++){let t=e*4,r=n[t]*l,i=n[t+1]*l,a=n[t+2]*l;u!==1&&(d[0]=r,d[1]=i,d[2]=a,So(d,u),r=d[0],i=d[1],a=d[2]),c(r,i,a,1,d),s[t]=d[0]**+go*255+.5|0,s[t+1]=d[1]**+go*255+.5|0,s[t+2]=d[2]**+go*255+.5|0,s[t+3]=255}t.putImageData(o,0,0)}else t.putImageData(e,0,0)}_restoreBackup(){this._backupCanvas&&=(this.output.width=this._backupCanvas.width,this.output.height=this._backupCanvas.height,this.output.getContext(`2d`).drawImage(this._backupCanvas,0,0),null)}toggleHDR(e){this.hdr=!!e}setQuality(e){if(!tp.QUALITY_PRESETS[e]){console.warn(`AIUpscaler: Invalid quality "${e}", must be fast/balanced/quality`);return}this.quality=e}setScaleFactor(e){if(e=Number(e),e!==2&&e!==4){console.warn(`AIUpscaler: Invalid scale factor ${e}, must be 2 or 4`);return}this.scaleFactor=e}setBaseSize(e,t){this._baseWidth=e,this._baseHeight=t}_cleanupPendingWorkerHandlers(){if(this._worker)for(let e of this._pendingWorkerHandlers)this._worker.removeEventListener(`message`,e);this._pendingWorkerHandlers.clear()}async dispose(){this.abort(),this._cleanupPendingWorkerHandlers(),this._worker&&=(this._worker.postMessage({type:`dispose`}),this._worker.terminate(),null),this._currentModelUrl=null,this._backupCanvas=null,this._upscaledAlpha=null,this.state.abortController=null,this._hdrStagingBuffer?.destroy(),this._hdrStagingBuffer=null,this._hdrStagingWidth=0,this._hdrStagingHeight=0,console.log(`AIUpscaler disposed`)}},rp=class extends r.EventDispatcher{constructor({renderer:e,mainCanvas:t,scene:n,camera:r,stages:i,pipeline:a,getExposure:o,getSaturation:s,getTransparentBg:c}){super(),this.renderer=e,this.mainCanvas=t,this.denoiserCanvas=this._createDenoiserCanvas(t),this.scene=n,this.camera=r,this.pipeline=a,this._stages=i,this._getExposure=o,this._getSaturation=s,this._getTransparentBg=c,this.denoiser=null,this.upscaler=null,this._onReset=null,this._onPostProcessRefresh=null,this._lastRenderWidth=0,this._lastRenderHeight=0,this._pendingStartUpscaler=null,this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null}_createDenoiserCanvas(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%`,t.insertBefore(n,e),n}setRenderSize(e,t){this._lastRenderWidth=e,this._lastRenderHeight=t,this.denoiser?.setSize(e,t),this.upscaler?.setBaseSize(e,t)}restoreBaseResolution(){if(!this.denoiserCanvas||!this._lastRenderWidth||!this._lastRenderHeight)return!1;let e=this.denoiserCanvas.width!==this._lastRenderWidth||this.denoiserCanvas.height!==this._lastRenderHeight;return this.denoiserCanvas.width=this._lastRenderWidth,this.denoiserCanvas.height=this._lastRenderHeight,e}setupDenoiser(){if(!this.denoiserCanvas)return;let e=this._stages.pathTracer;this.denoiser=new Yf(this.denoiserCanvas,this.renderer,this.scene,this.camera,{...U,backendParams:()=>({device:this.renderer.backend.device,adapterInfo:null}),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(),{backend:n}=this.renderer;return{color:n.get(t.color).texture,normal:n.get(t.normalDepth).texture,albedo:n.get(t.albedo).texture}},getExposure:()=>this._getEffectiveExposure(),getToneMapping:()=>this._getToneMapping(),getSaturation:()=>this._getSaturation(),getTransparentBackground:()=>this._getTransparentBg(),getMRTRenderTarget:()=>e?.storageTextures?.readTarget??null}),this.denoiser.enabled=U.enableOIDN,this._denoiserStartHandler=()=>this.dispatchEvent({type:V.DENOISING_START}),this._denoiserEndHandler=()=>this.dispatchEvent({type:V.DENOISING_END}),this.denoiser.addEventListener(`start`,this._denoiserStartHandler),this.denoiser.addEventListener(`end`,this._denoiserEndHandler)}setupUpscaler(){if(!this.denoiserCanvas)return;let e=this._stages.pathTracer;this.upscaler=new np(this.denoiserCanvas,this.renderer,{scaleFactor:U.upscalerScale||2,quality:U.upscalerQuality||`fast`,getSourceCanvas:()=>this.denoiser?.enabled?null: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:V.UPSCALING_START}),this._upscalerProgressHandler=e=>this.dispatchEvent({type:V.UPSCALING_PROGRESS,progress:e.progress}),this._upscalerEndHandler=()=>this.dispatchEvent({type:V.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._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(),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||!!(e.edgeFilter?.enabled||e.bilateralFilter?.enabled);t&&(i&&!t.enabled&&t.reset(),t.enabled=i),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?.quality!==`fast`);for(let r of[e.asvgf,e.nrd,e.variance,e.bilateralFilter,e.edgeFilter,t,n])r&&!r.enabled&&r.releaseGPUMemory?.()}_cleanupCompletionListener(){this._pendingStartUpscaler&&this.denoiser&&this.denoiser.removeEventListener(`end`,this._pendingStartUpscaler),this._pendingStartUpscaler=null}onRenderComplete({isStillComplete:e,context:t}){this._cleanupCompletionListener();let n=()=>{this._pendingStartUpscaler=null,e()&&this.upscaler?.enabled&&this.upscaler.start()};this.denoiser?.enabled?(this._pendingStartUpscaler=n,this.denoiser.addEventListener(`end`,n,{once:!0}),this.denoiser.start()):n()}abort(e){this._cleanupCompletionListener(),e&&(e.style.opacity=`1`),this.upscaler&&this.upscaler.abort(),this.denoiser&&(this.denoiser.enabled&&this.denoiser.abort(),this.denoiser.output&&(this.denoiser.output.style.display=`none`))}dispose(){this._cleanupCompletionListener(),this.denoiser&&=(this._denoiserStartHandler&&this.denoiser.removeEventListener(`start`,this._denoiserStartHandler),this._denoiserEndHandler&&this.denoiser.removeEventListener(`end`,this._denoiserEndHandler),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(),null),this._denoiserStartHandler=null,this._denoiserEndHandler=null,this._upscalerResChangedHandler=null,this._upscalerStartHandler=null,this._upscalerProgressHandler=null,this._upscalerEndHandler=null,this.denoiserCanvas?.parentNode&&(this.denoiserCanvas.parentNode.removeChild(this.denoiserCanvas),this.denoiserCanvas=null)}setOverlayManager(e){this._overlayManager=e}setResetCallback(e){this._onReset=e}setPostProcessRefreshCallback(e){this._onPostProcessRefresh=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)}setOIDNEnabled(e){this.denoiser&&(this.denoiser.enabled=e),this._syncGBufferStages(),this._onPostProcessRefresh?.()}setOIDNQuality(e){this.denoiser?.updateQuality(e),this._stages.pathTracer?.setCleanAuxNormal?.(!!this.denoiser?.enabled&&!!this.denoiser?.expectsCleanAux(e)),this._onPostProcessRefresh?.()}setTileHelperEnabled(e){this._setTileHelper(e)}setUpscalerEnabled(e){this.upscaler&&(this.upscaler.enabled=e)}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`].forEach(t=>e.removeTexture(t))}_applyNRDPreset(e){let t=Ge[e];if(!t)return;let n={};for(let e of We)n[e]=Ue[e];this._stages.nrd?.updateParameters({...n,...t})}_applyASVGFPreset(e){let t=He[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))}},ip=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}},ap=class{constructor(e,i){this.layer=`scene`,this._enabled=!0,this._outlineNode=(0,g.outline)(e,i,{selectedObjects:[],edgeThickness:(0,n.uniform)(1),edgeGlow:(0,n.uniform)(0)});let a=(0,n.uniform)(3),o=(0,n.uniform)(new r.Color(16777215)),s=(0,n.uniform)(new r.Color(1640965)),{visibleEdge:c,hiddenEdge:l}=this._outlineNode,u=c.mul(o).add(l.mul(s)).mul(a),d=u.r.max(u.g).max(u.b).clamp(0,1);this._material=new t.MeshBasicNodeMaterial,this._material.colorNode=(0,n.vec4)(u,d),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;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 op(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 sp(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 cp=4096,lp=class{constructor(){this.canvas=op(!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=sp(this._sizeSource,cp);!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(){Oe(this.renderer),this.renderer=null,this.canvas.parentElement?.removeChild(this.canvas)}},up=xt(`overlay`),dp=(e,t)=>e.visible&&e.layer===t&&e.render,fp=class{constructor(e){this.camera=e,this._helpers=new Map,this._hudCanvas=op(),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 lp().init({device:e,sizeSource:t})}catch(e){up.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 ip;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 ap(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.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)&&(up.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())dp(t,`scene`)&&t.render(e,this.camera)}_hasVisibleSceneOverlay(){if(this._helperScene?.isDrawing)return!0;for(let e of this._helpers.values())if(dp(e,`scene`))return!0;return!1}refreshHUD(){let e=this._hudCanvas,t=this._hudCtx,n=!1;for(let e of this._helpers.values())if(dp(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?sp(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())dp(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)}},pp=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._posBuffer=null,this._tempVec=new r.Vector3,this._skinnedCache=null,this._clipsCache=null,this._savedTimeScale=1,this.onFinished=null,this.wakeCallback=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.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}),this._skinnedCache.push(new Float32Array(a*3)),s+=i}this._posBuffer=new Float32Array(s*9);let c=n.filter(e=>e.isSkinnedMesh).length;console.debug(`[AnimationManager] Init: ${i.length} clips, ${n.length} meshes (${c} skinned), ${s} triangles`)}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.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:V.ANIMATION_STARTED})}}pause(){this.mixer&&(this.mixer.timeScale=0,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:V.ANIMATION_PAUSED}))}resume(){this.mixer&&(this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!0,this.wakeCallback?.(),this.dispatchEvent({type:V.ANIMATION_STARTED}))}stop(){this.mixer&&(this.mixer.stopAllAction(),this.mixer.timeScale=this._savedTimeScale||1,this.timer.reset(),this.isPlaying=!1,this.dispatchEvent({type:V.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.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._computePositions(),this._posBuffer}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._computePositions(),this._posBuffer}_computePositions(){let e=this._tempVec,t=this._posBuffer;this._mixerRoot.updateMatrixWorld(!0);for(let n=0;n<this._meshes.length;n++){let r=this._meshes[n],{start:i,count:a,uniqueVerts:o,indices:s}=this._meshTriRanges[n],c=this._skinnedCache[n],l=r.matrixWorld;for(let t=0;t<o;t++)r.getVertexPosition(t,e),e.applyMatrix4(l),c[t*3]=e.x,c[t*3+1]=e.y,c[t*3+2]=e.z;if(s)for(let e=0;e<a;e++){let n=e*3,r=s[n]*3,a=s[n+1]*3,o=s[n+2]*3,l=(i+e)*9;t[l]=c[r],t[l+1]=c[r+1],t[l+2]=c[r+2],t[l+3]=c[a],t[l+4]=c[a+1],t[l+5]=c[a+2],t[l+6]=c[o],t[l+7]=c[o+1],t[l+8]=c[o+2]}else for(let e=0;e<a;e++){let n=e*3*3,r=(e*3+1)*3,a=(e*3+2)*3,o=(i+e)*9;t[o]=c[n],t[o+1]=c[n+1],t[o+2]=c[n+2],t[o+3]=c[r],t[o+4]=c[r+1],t[o+5]=c[r+2],t[o+6]=c[a],t[o+7]=c[a+1],t[o+8]=c[a+2]}}}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._posBuffer=null,this._skinnedCache=null,this._clipsCache=null}},mp=new r.Vector3(0,0,-1),hp=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._meshTriRanges=null,this._posBuffer=null,this._normalBuffer=null,this._skinnedCache=null,this._normalCache=null,this._tempVec=new r.Vector3,this._normalMatrix=new r.Matrix3,this._refitInFlight=!1,this._baselineComputed=!1,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,this._meshTriRanges=[],this._skinnedCache=[],this._normalCache=[];let t=0;for(let n of e){let e=n.geometry,r=e.attributes.position,i=e.index?e.index.array:null,a=i?i.length/3:r.count/3,o=r.count;this._meshTriRanges.push({start:t,count:a,uniqueVerts:o,indices:i}),this._skinnedCache.push(new Float32Array(o*3)),this._normalCache.push(new Float32Array(o*3)),t+=a}this._posBuffer=new Float32Array(t*9),this._normalBuffer=new Float32Array(t*9),this._baselineComputed=!1}attach(e){if(this._attached!==e&&(this._controls.attach(e),this._attached=e,this._lightTargetDistance=null,this._lastLightPosition=null,e.isLight&&e.target)){let t=e.target.position.clone().sub(e.position),n=t.length();n>1e-4?(e.quaternion.setFromUnitVectors(mp,t.normalize()),this._lightTargetDistance=n):this._lightTargetDistance=1,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:V.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:V.OBJECT_TRANSFORM_START}):(this._attached?.isLight?this._finalizeLightTransform():this._recomputeAndRefit(),this._app.dispatchEvent({type:V.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){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.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()}_recomputeAndRefit(){if(!this._meshes||!this._posBuffer||this._refitInFlight||!this._attached)return;this._attached.updateMatrixWorld(!0);let e=this._findAffectedMeshIndices(this._attached);if(e.length!==0){if(!this._baselineComputed)this._computeAllPositions(),this._baselineComputed=!0;else for(let t of e)this._computeMeshPositions(t);this._refitInFlight=!0;try{this._app.refitBLASes(e,this._posBuffer,this._normalBuffer)}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}_computeAllPositions(){for(let e=0;e<this._meshes.length;e++)this._computeMeshPositions(e)}_computeMeshPositions(e){let t=this._meshes[e],{start:n,count:r,uniqueVerts:i,indices:a}=this._meshTriRanges[e],o=this._skinnedCache[e],s=this._normalCache[e],c=this._tempVec,l=this._posBuffer,u=this._normalBuffer;t.updateMatrixWorld(!0);let d=t.matrixWorld;this._normalMatrix.getNormalMatrix(d);let f=this._normalMatrix.elements,p=t.geometry.attributes.normal;for(let e=0;e<i;e++)if(t.getVertexPosition(e,c),c.applyMatrix4(d),o[e*3]=c.x,o[e*3+1]=c.y,o[e*3+2]=c.z,p){let t=p.getX(e),n=p.getY(e),r=p.getZ(e);s[e*3]=f[0]*t+f[3]*n+f[6]*r,s[e*3+1]=f[1]*t+f[4]*n+f[7]*r,s[e*3+2]=f[2]*t+f[5]*n+f[8]*r}if(a)for(let e=0;e<r;e++){let t=e*3,r=a[t]*3,i=a[t+1]*3,c=a[t+2]*3,d=(n+e)*9;l[d]=o[r],l[d+1]=o[r+1],l[d+2]=o[r+2],l[d+3]=o[i],l[d+4]=o[i+1],l[d+5]=o[i+2],l[d+6]=o[c],l[d+7]=o[c+1],l[d+8]=o[c+2],u[d]=s[r],u[d+1]=s[r+1],u[d+2]=s[r+2],u[d+3]=s[i],u[d+4]=s[i+1],u[d+5]=s[i+2],u[d+6]=s[c],u[d+7]=s[c+1],u[d+8]=s[c+2]}else for(let e=0;e<r;e++){let t=e*3*3,r=(e*3+1)*3,i=(e*3+2)*3,a=(n+e)*9;l[a]=o[t],l[a+1]=o[t+1],l[a+2]=o[t+2],l[a+3]=o[r],l[a+4]=o[r+1],l[a+5]=o[r+2],l[a+6]=o[i],l[a+7]=o[i+1],l[a+8]=o[i+2],u[a]=s[t],u[a+1]=s[t+1],u[a+2]=s[t+2],u[a+3]=s[r],u[a+4]=s[r+1],u[a+5]=s[r+2],u[a+6]=s[i],u[a+7]=s[i+1],u[a+8]=s[i+2]}}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._meshTriRanges=null,this._posBuffer=null,this._normalBuffer=null,this._skinnedCache=null,this._normalCache=null,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}},gp=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}},_p=new WeakMap,vp=xt(`engine`);function yp(e,t){e.lost.then(e=>{t.app&&t.app._handleDeviceLost(e)})}var bp=/swiftshader|llvmpipe|lavapipe|basic render|microsoft basic|warp/i;function xp(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||bp.test(n)}}var Sp=class extends r.EventDispatcher{constructor(e,t={}){super();try{_p.get(e)?.dispose()}catch(e){vp.warn(`prior canvas owner dispose failed`,e)}_p.set(e,this),this.canvas=e,this._autoResize=t.autoResize!==!1,this._container=t.container||null,this._applySceneMetadataEnabled=t.applySceneMetadata!==!1,this._applyingSceneMetadata=!1,this._profile=Fe(t.profile),this._issues=new io({strict:t.strict===!0,onIssue:e=>this.dispatchEvent({type:V.ISSUE,issue:e})}),this.settings=new Ad({...U,environmentRotation:this._profile.environmentRotation,saturation:this._profile.saturation},{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._maxTextureSize=U.maxTextureSize,this.pipeline=null,this._pendingReservedRenderSize=null,this.stages={},this.cameraManager=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 pp,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 Td,this._resizeDebounceTimer=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){vp.warn(`failed to remove listener`,t,e)}this._trackedListeners.length=0}async init(){return await this._initRenderer(),this._applyPendingReservedRenderSize(),this._initCameraManager(),this._initScenes(),this._initAssetPipeline(),this._initPipeline(),await this._initManagers(),this._wireEvents(),this.stages.pathTracer.setTriangleData(new Float32Array(32),0),this.stages.pathTracer.setBVHData(new Float32Array(16)),this.stages.pathTracer.materialData.setMaterialData(new Float32Array(16)),this.stages.pathTracer.setupMaterial(),this.isInitialized=!0,vp.debug(`WebGPU path tracer app initialized`),this}animate(){if(!this._deviceLost){if(this.animationManagerId=requestAnimationFrame(()=>this.animate()),this._loadingInProgress||this._sdf?.isProcessing){this.dispatchEvent({type:V.FRAME});return}if(this.cameraManager.controls&&this.cameraManager.controls.update(),this.animationManager?.isPlaying&&!this._animRefitInFlight){let e=this.animationManager.update();e&&(this._animRefitInFlight=!0,this.refitBVH(e).catch(e=>vp.error(`animation refit error:`,e)).finally(()=>{this._animRefitInFlight=!1}))}if(this.needsReset&&=(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}this.pipeline.render(),this.stages.pathTracer.isComplete||this.completion.updateTime(),this._ensureVRAMWiring();let e=this.stages.pathTracer?.vramTracker,t=this.stages.pathTracer?.frameCount??0;if(e&&(t<=1||t%30==0)&&e.measure(),Ce({timeElapsed:this.completion.timeElapsed,samples:we(this.stages.pathTracer),memoryUsed:e?.current??0,memoryPeak:e?.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:V.RENDER_COMPLETE,...e})}}this._renderHelperOverlay(),this.dispatchEvent({type:V.FRAME})}}}stopAnimation(){this.animationManagerId&&=(cancelAnimationFrame(this.animationManagerId),null)}_handleDeviceLost(e){this._deviceLost||(this._deviceLost=!0,vp.error(`WebGPU device lost (${e?.reason||`unknown`}): ${e?.message||``}`),this.stopAnimation(),this.dispatchEvent({type:V.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){this.pipeline&&(this.pipeline.reset(),e||(this.pipeline.eventBus.emit(`asvgf:reset`),this.pipeline.eventBus.emit(`denoiser:reset`))),this._abortPostProcess(),this.completion.reset(),this.wake(),this.dispatchEvent({type:`RenderReset`}),this.dispatchEvent({type:V.RENDER_RESET})}dispose(){if(!this._disposed){if(this._disposed=!0,this.dispatchEvent({type:V.DISPOSE}),this.stopAnimation(),clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=null,this._removeTrackedListeners(),xe(null),this._issues.detach(),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.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])ke(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){vp.warn(`failed to clear TSL texture singleton listeners`,e)}this.canvas&&_p.get(this.canvas)===this&&_p.delete(this.canvas),this._gpuDevice&&=(this._gpuDevice.onuncapturederror=null,null),this._deviceLostHolder&&=(this._deviceLostHolder.app=null,null),Oe(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.lightManager?.clearLights?.(),this.stages.pathTracer&&(this.stages.pathTracer.setTriangleData(new Float32Array(32),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.reset(),this.dispatchEvent({type:`SceneUnloaded`}))}}async loadModel(e){await this._loadWithSceneRebuild(()=>this.assetLoader.loadModel(e),{type:`ModelLoaded`,url:e})}async loadObject3D(e,t=`object3d`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadObject3D(e,t),{type:`Object3DLoaded`,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 loadFile(e){let t=this.assetLoader?.getFileFormat(e?.name||``);if(!t)throw Error(`Unsupported file format: ${e?.name}`);if(t.type!==`environment`&&t.type!==`image`){await this._loadWithSceneRebuild(()=>this.assetLoader.loadAssetFromFile(e),{type:`ModelLoaded`,filename:e.name});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})}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?.triangleData&&!this._loadingInProgress){this._loadingInProgress=!0;try{await this.loadSceneData(),this.reset(),this.dispatchEvent({type:`TexturesReprocessed`,maxTextureSize:this._maxTextureSize})}finally{this._loadingInProgress=!1}}}async _loadWithSceneRebuild(e,t){if(this._loadingInProgress)throw this._busyError(`PathTracerApp`);this._loadingInProgress=!0;try{await e(),this._emissiveSamplingUserSet=!1,this._clearAppendedModels(),this._syncControlsAfterLoad(),await this.loadSceneData({pendingEnvironment:this._beginSceneMetadataEnvironment()}),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),this.cameraManager.currentCameraIndex=0,this.dispatchEvent(t),this._dispatchCamerasUpdated()}finally{this._loadingInProgress=!1}}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(to.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:Od.SCENE_METADATA}),this.scene&&(this.scene.background=e),this.dispatchEvent({type:V.SCENE_METADATA_APPLIED,metadata:t,environment:{...n}})}async loadSceneData({pendingEnvironment:e=null}={}){this._preserveSelectionOnRebuild||this.interactionManager?.deselect(),this.animationManager.dispose(),this._animRefitInFlight=!1,this._tagPrimarySceneObject();let t=new Vo(``,{namespace:`scene`,level:`info`}),n=this.meshScene.environment,r=null;if(e?(t.start(`Environment fetch + CDF (concurrent)`),r=e.then(async e=>{e&&(await this.stages.pathTracer.environment.applyHDRI(e),this._applySceneMetadataSettings(e))}).catch(e=>this._issues.record(to.ENVIRONMENT_LOAD_FAILED,`authored environment failed to install — the scene is lit by whatever was already loaded`,{cause:String(e?.message??e)})).finally(()=>t.end(`Environment fetch + CDF (concurrent)`))):n?.image?.data&&(t.start(`Environment CDF build (worker)`),this.stages.pathTracer.scene.environment=n,r=this.stages.pathTracer.environment.buildEnvironmentCDF().then(()=>t.end(`Environment CDF build (worker)`))),t.start(`BVH build (SceneProcessor)`),this._sdf.setMaxTextureSize(this._maxTextureSize),await this._sdf.buildBVH(this.meshScene),t.end(`BVH build (SceneProcessor)`),H({status:`Transferring data to GPU...`,progress:86}),await new Promise(e=>setTimeout(e,0)),t.start(`GPU data transfer`),!this._sdf.uploadToPathTracer(this.stages.pathTracer,this.lightManager,this.meshScene,this.meshScene.environment))return!1;this.stages.pathTracer._meshRefs=this.stages.pathTracer._collectMeshRefs(this.meshScene),this.stages.pathTracer.setMeshVisibilityData(this.stages.pathTracer._meshRefs),this._refreshEmissiveForVisibility(),t.end(`GPU data transfer`),H({status:`Compiling shaders...`,progress:90}),await new Promise(e=>setTimeout(e,0)),t.start(`Material setup (TSL compile)`),this.stages.pathTracer.setupMaterial(),t.end(`Material setup (TSL compile)`),this._rasterPrecompile=null,this._pathTracerEnabled||(t.start(`Pipeline precompile`),await this.precompileRaster(),t.end(`Pipeline precompile`)),r&&(H({status:`Finalizing environment map...`,progress:95}),await r,this.stages.pathTracer.environment.applyCDFResults());let i=this.getSceneMinY();if(this.settings.set(`groundProjectionLevel`,i,{reset:!1}),this.settings.set(`groundCatcherHeight`,i,{reset:!1}),!this._emissiveSamplingUserSet){let e=(this._sdf?.emissiveTriangleBuilder?.emissiveTriangles?.length??this._sdf?.emissiveTriangleCount??0)>0;this.settings.set(`enableEmissiveTriangleSampling`,e,{reset:!1})}return t.start(`Apply settings`),this.settings.applyAll(),this.stages.compositor.setTransparentBackground(this.settings.get(`transparentBackground`)),t.end(`Apply settings`),t.print(this._sceneSummaryParts()),Se(),this._initAnimationAndTransforms(),this.dispatchEvent({type:`SceneRebuild`}),!0}_sceneSummaryParts(){let e=this.stages.pathTracer,t=this._sdf?.instanceTable?.entries?.filter(Boolean).length??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(),this._recalibrateControlLimits(),this.pipeline?.eventBus.emit(`autoexposure:resetHistory`),this.reset(),e&&this.dispatchEvent(e)}async addModel(e,{name:t}={}){if(this._loadingInProgress)throw Error(`PathTracerApp.addModel: another load is already in progress`);this._loadingInProgress=!0,this._preserveSelectionOnRebuild=!0;try{let{root:n}=await this.assetLoader.appendModel(e);return n.userData.__rayzeeSceneObject=!0,t&&(n.userData.__rayzeeName=t),await this._finishRebuildNoReframe({type:`ModelAdded`,url:e,id:n.uuid}),n.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}_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){let n=await this._sdf.refitBVH(e,t);return this.stages.pathTracer.updateTriangleData(this._sdf.triangleData),this.stages.pathTracer.updateBVHData(this._sdf.bvhData),this.reset(),n}refitBLASes(e,t,n){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(),this._sdf.scheduleBackgroundRebuild(e,()=>{this.stages.pathTracer.updateTriangleData(this._sdf.triangleData),this.stages.pathTracer.updateBVHData(this._sdf.bvhData),this.reset()}),r}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(Be,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?Be:2048,a=Ve(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(to.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(to.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.renderer.setSize(e,t,!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix();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(e,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.renderer.setSize(e,t,!1),this.cameraManager.camera.aspect=e/t,this.cameraManager.camera.updateProjectionMatrix(),clearTimeout(this._resizeDebounceTimer),this._applyRenderResize(e,t),{width:e,height:t})}configureForMode(e,t={}){let n=e===`production`,r=n?rt:it;this.cameraManager.controls.enabled=!n,this.settings.setMany({maxSamples:r.maxSamples,maxBounces:r.bounces,transmissiveBounces:r.transmissiveBounces,maxSubsurfaceSteps:r.maxSubsurfaceSteps,enableAlphaShadows:r.enableAlphaShadows??!1,useAdaptiveSampling:r.useAdaptiveSampling??!1,noiseThreshold:r.noiseThreshold??U.noiseThreshold,adaptiveStopFraction:r.adaptiveStopFraction??U.adaptiveStopFraction,adaptiveMinSamples:r.adaptiveMinSamples??U.adaptiveMinSamples,usePixelFreeze:r.usePixelFreeze??!1,pixelFreezeThreshold:r.pixelFreezeThreshold??U.pixelFreezeThreshold,pixelFreezeStability:r.pixelFreezeStability??U.pixelFreezeStability},{silent:!0,source:Od.MODE_PRESET}),this.stages.pathTracer?.setUniform(`renderMode`,parseInt(r.renderMode)),this.stages.pathTracer?.updateCompletionThreshold?.();let i=this.denoisingManager?.denoiser;if(i&&(i.abort(),i.enabled=r.enableOIDN,i.updateQuality(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(){if(this.denoisingManager?.abort(this.canvas),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},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),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),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 renderToBuffer({colorSpace:e=`srgb`,preserveAlpha:t=!1}={}){if(e!==`linear`&&e!==`srgb`)throw Error(`renderToBuffer: colorSpace must be 'linear' or 'srgb', got "${e}"`);let n=this.stages?.pathTracer,r=n?.storageTextures?.readTarget;if(!r)throw Error(`renderToBuffer: no render target — call init() and render at least one sample`);let{width:i,height:a}=n,o=await this.renderer.readRenderTargetPixelsAsync(r,0,0,i,a,0);return e===`linear`?{data:o,width:i,height:a,colorSpace:e}:{data:Co(o,{exposure:this.renderer.toneMappingExposure,toneMapping:this.renderer.toneMapping,saturation:this.settings.get(`saturation`)??1,preserveAlpha:t}),width:i,height:a,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;return(e?.denoiser?.enabled||e?.upscaler?.enabled)&&e?.denoiserCanvas&&this.stages.pathTracer?.isComplete?e.denoiserCanvas:(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=>vp.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:{}}}_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)}setMaterialProperty(e,t,n){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?.entries;if(!e)return;let t=new Set;for(let n of e)n&&n.visible===!1&&t.add(n.meshIndex);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 rebuildMaterials(e){await this.stages.pathTracer?.rebuildMaterials(e||this.meshScene),this.reset()}async _initRenderer(){if(xe(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=xp(e),this.adapterInfo.isSoftware&&(this._issues.warn(to.ADAPTER_SOFTWARE,`software GPU adapter "${this.adapterInfo.description||this.adapterInfo.vendor}" — renders are correct but orders of magnitude slower than hardware`,{...this.adapterInfo}),vp.warn(`software GPU adapter — check app.adapterInfo.isSoftware. ${this.adapterInfo.description}`));let n=e.limits;if(this.renderer=new t.WebGPURenderer({canvas:this.canvas,alpha:!0,powerPreference:`high-performance`,requiredLimits:{maxBufferSize:n.maxBufferSize,maxStorageBufferBindingSize:n.maxStorageBufferBindingSize,maxColorAttachmentBytesPerSample:128,maxStorageBuffersPerShaderStage:Math.min(n.maxStorageBuffersPerShaderStage,10)}}),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 r=this.renderer.backend?.device;r?.lost&&(this._gpuDevice=r,this._deviceLostHolder={app:this},yp(r,this._deviceLostHolder),r.onuncapturederror=e=>vp.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)}_initCameraManager(){this.cameraManager=new wf(this.canvas)}_initScenes(){this.scene=new r.Scene,this.meshScene=new r.Scene,this._sceneHelpers=new k}_initAssetPipeline(){this._sdf=new Ko({issues:this._issues}),this.assetLoader=new Cf(this.meshScene,this.cameraManager.camera,this.cameraManager.controls,{issues:this._issues,profile:this._profile}),this.assetLoader.setRenderer(this.renderer),this.assetLoader.createFloorPlane(),this._addTrackedListener(this.cameraManager.controls,`change`,()=>{this.needsReset=!0,this.wake()})}_initPipeline(){this._createStages();let{clientWidth:e,clientHeight:t}=this.canvas;this.pipeline=new Cd(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.pipeline.setSize(n,r)}async _initManagers(){this.interactionManager=new Ed({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 Tf(this.scene,this._sceneHelpers,this.stages.pathTracer,{onReset:()=>this.reset()}),this.goboManager=new Ef(this.stages.pathTracer,{onReset:()=>this.reset()}),this.iesManager=new Lf(this.stages.pathTracer,{onReset:()=>this.reset()}),this._setupDenoisingManager(),await this._setupOverlayManager(),this.transformManager=new hp({camera:this.cameraManager.camera,canvas:this.canvas,orbitControls:this.cameraManager.controls,app:this}),this.overlayManager.register(`transform`,new gp(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.setSettings(this.settings),this.environmentManager=this.stages.pathTracer.environment,this.environmentManager.callbacks.onAutoExposureReset=()=>this.pipeline.eventBus.emit(`autoexposure:resetHistory`)}_wireEvents(){this._addTrackedListener(this.cameraManager,`CameraSwitched`,e=>this.dispatchEvent(e)),this._addTrackedListener(this.cameraManager,V.AUTO_FOCUS_UPDATED,e=>this.dispatchEvent(e)),this._forwardEvents(this.denoisingManager,[V.DENOISING_START,V.DENOISING_END,V.UPSCALING_START,V.UPSCALING_PROGRESS,V.UPSCALING_END,`resolution_changed`]),this._setupAutoExposureListener(),this.animationManager.wakeCallback=()=>this.wake(),this._forwardEvents(this.animationManager,[V.ANIMATION_STARTED,V.ANIMATION_PAUSED,V.ANIMATION_STOPPED]),this._addTrackedListener(this.animationManager,V.ANIMATION_PAUSED,()=>{this._animRefitInFlight=!1}),this._addTrackedListener(this.animationManager,V.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({meshScene:this.meshScene,assetLoader:this.assetLoader,floorPlane:this.assetLoader.floorPlane,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,cameraManager:this.cameraManager}),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),Se()}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.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.dispatchEvent({type:V.ANIMATION_FINISHED})}}this.transformManager?.setMeshData(this._sdf.meshes)}_createStages(){this.stages.pathTracer=new nu(this.renderer,this.scene,this.cameraManager.camera),this.stages.normalDepth=new ru(this.renderer,{pathTracer:this.stages.pathTracer}),this.stages.motionVector=new iu(this.renderer,this.cameraManager.camera,{pathTracer:this.stages.pathTracer}),this.stages.asvgf=new su(this.renderer,{enabled:!1}),this.stages.nrd=new Gu(this.renderer,{enabled:!1,pathTracer:this.stages.pathTracer}),this.stages.variance=new Ju(this.renderer,{enabled:!1}),this.stages.bilateralFilter=new Xu(this.renderer,{enabled:!1}),this.stages.edgeFilter=new nd(this.renderer,{enabled:!1}),this.stages.autoExposure=new ld(this.renderer,{enabled:U.autoExposure??!1}),this.stages.compositor=new ud(this.renderer,{saturation:this.settings.get(`saturation`)??U.saturation,pathTracer:this.stages.pathTracer})}_setupDenoisingManager(){this.denoisingManager=new rp({renderer:this.renderer,mainCanvas:this.canvas,scene:this.scene,camera:this.cameraManager.camera,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,getTransparentBg:()=>this.settings.get(`transparentBackground`)??!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:V.RENDER_RESET}),this.wake())}_setupAutoExposureListener(){this.stages.autoExposure&&this.stages.autoExposure.on(`autoexposure:updated`,e=>{this.dispatchEvent({type:V.AUTO_EXPOSURE_UPDATED,exposure:e.exposure,luminance:e.luminance})})}_renderHelperOverlay(){this.scene.updateMatrixWorld(),this.overlayManager?.render()}async _setupOverlayManager(){this.overlayManager=new fp(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.controls.saveState(),this.cameraManager.controls.update()}_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 Cp(e){let t=await Tp(e);try{return await wp(t,e)}finally{t.dispose()}}async function wp(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 Tp({canvas:e,model:t=null,width:n=1920,height:r=1080,strict:i=!0,profile:a=`physical`,deterministic:o=!0,settings:s=null}={}){if(!e)throw Error(`openHeadless: a canvas is required`);let c=new Sp(e,{autoResize:!1,strict:i,profile:a});try{return c.setReservedRenderResolution(Math.max(n,r)),await c.init(),c.setCanvasSize(n,r),t&&await c.loadModel(t),s&&c.settings.setMany(s,{silent:!0}),o&&c.setDeterministicMode(!0),c}catch(e){throw c.dispose(),e}}var Ep=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=rt.maxSamples,enableOIDN:a=!0,onFrame:o,onProgress:s,onComplete:c}=e,l=this._app;if(!l.animationManager?.hasAnimations){console.warn(`VideoRenderManager: No animation clips available`),c?.(!1);return}let u=l.animationManager.clips[t];if(!u){console.warn(`VideoRenderManager: Invalid clip index ${t}`),c?.(!1);return}let d=u.duration/(r||1),f=e.totalFrames||Math.ceil(d*n),p=1/n;this._cancelled=!1,this._rendering=!0;let m=this._saveState();l.stopAnimation(),l.configureForMode(`production`),l.settings.setMany({maxSamples:i},{silent:!0}),l.stages.pathTracer?.updateCompletionThreshold?.(),l.cameraManager.controls&&(l.cameraManager.controls.enabled=!1);try{for(let e=0;e<f&&!this._cancelled;e++){let n=e*p*r,i=l.animationManager.seekTo(n,t);if(i?await l.refitBVH(i):l.reset(),l.stopAnimation(),await this._accumulateFrame(l),this._cancelled||(a&&l.denoisingManager?.denoiser?.enabled&&await this._waitForDenoise(l),this._cancelled))break;let c=l.getCanvas();if(c&&o){let t=await createImageBitmap(c);await o(t,e,f),t.close()}let u={frame:e+1,totalFrames:f,percent:(e+1)/f*100};s?.(u),l.dispatchEvent({type:V.VIDEO_RENDER_PROGRESS,...u})}}catch(e){console.error(`VideoRenderManager: Render error:`,e),this._cancelled=!0}finally{this._restoreState(m),this._rendering=!1;let e=!this._cancelled;c?.(e),l.dispatchEvent({type:V.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&&(Ce({samples:we(t)}),await new Promise(e=>setTimeout(e,0)))}_waitForDenoise(e){return new Promise(t=>{let n,r=()=>{e.removeEventListener(V.DENOISING_END,i),clearTimeout(n)},i=()=>{r(),t()};n=setTimeout(()=>{console.warn(`VideoRenderManager: Denoise timed out, skipping`),r(),t()},3e4),e.addEventListener(V.DENOISING_END,i),e.denoisingManager.onRenderComplete({isStillComplete:()=>!this._cancelled,context:e.pipeline?.context})})}_saveState(){let e=this._app;return{maxSamples:e.settings.get(`maxSamples`),maxBounces:e.settings.get(`maxBounces`),transmissiveBounces:e.settings.get(`transmissiveBounces`),renderMode:e.stages.pathTracer?.renderMode?.value,controlsEnabled:e.cameraManager.controls?.enabled,oidnEnabled:e.denoisingManager?.denoiser?.enabled,oidnQuality:e.denoisingManager?.denoiser?.quality,wasPlaying:e.animationManager?.isPlaying,pauseRendering:e.pauseRendering}}_restoreState(e){let t=this._app;t.settings.setMany({maxSamples:e.maxSamples,maxBounces:e.maxBounces,transmissiveBounces:e.transmissiveBounces},{silent:!0}),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.denoiser.enabled=e.oidnEnabled??!1,e.oidnQuality&&t.denoisingManager.denoiser.updateQuality(e.oidnQuality)),t.pauseRendering=e.pauseRendering??!1,t.animationManager?.stop(),t.reset(),t.wake()}};e.AF_DEFAULTS=Xe,e.ASVGF_QUALITY_PRESETS=He,e.AUTO_FOCUS_MODES=Ye,e.AnimationManager=pp,e.BVH_LEAF_MARKERS=Qe,e.CAMERA_PRESETS=Je,e.CAMERA_RANGES=Ke,e.CameraManager=wf,e.DEFAULT_TEXTURE_MATRIX=nt,e.DenoisingManager=rp,e.ENGINE_DEFAULTS=U,e.EngineEvents=V,e.EngineIssueError=ro,e.GoboManager=Ef,e.IESManager=Lf,e.INTERACTIVE_RENDER_CONFIG=it,e.ISSUE_CODES=to,e.ISSUE_SEVERITY=no,e.InteractionManager=Ed,e.IssueLog=io,e.LOG_LEVELS=ot,e.LightManager=Tf,e.Logger=bt,e.MAX_RESERVABLE_RENDER_SIZE=Be,e.MEMORY_CONSTANTS=at,e.NRD_DEFAULTS=Ue,e.NRD_HIT_DIST_A=Le,e.NRD_HIT_DIST_B=Re,e.NRD_PRESET_KEYS=We,e.NRD_QUALITY_PRESETS=Ge,e.OverlayManager=fp,e.PRODUCTION_RENDER_CONFIG=rt,e.PathTracerApp=Sp,e.PipelineContext=dd,e.RENDER_PROFILES=Pe,e.RenderPipeline=Cd,e.RenderSettings=Ad,e.RenderStage=_e,e.SETTING_SOURCE=Od,e.SKY_PRESETS=qe,e.StageExecutionMode=ge,e.TEXTURE_CONSTANTS=q,e.TRIANGLE_DATA_LAYOUT=G,e.TransformManager=hp,e.VRAMTracker=oc,e.VideoRenderManager=Ep,e.bufferBytes=ic,e.captureHeadless=wp,e.clearBindingAuditFindings=vd,e.configureAssets=ts,e.createLogger=xt,e.deriveAlphaMode=Po,e.describeAdapter=xp,e.extractSceneMetadata=_f,e.fmt=J,e.getAssetConfig=ns,e.getBindingAuditFindings=_d,e.getRenderProfile=Fe,e.openHeadless=Tp,e.parseSceneMetadata=gf,e.renderHeadless=Cp,e.setBindingAudit=gd,e.textureBytes=ac});
|