@footgun/cobalt 0.1.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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +18 -0
  3. package/bundle.js +284 -0
  4. package/cobalt2.jpeg +0 -0
  5. package/esbuild.js +20 -0
  6. package/examples/01-primitives/Game.js +8 -0
  7. package/examples/01-primitives/component-animation.js +8 -0
  8. package/examples/01-primitives/component-transform.js +13 -0
  9. package/examples/01-primitives/constants.js +6 -0
  10. package/examples/01-primitives/deps.js +2 -0
  11. package/examples/01-primitives/entity-sprite.js +47 -0
  12. package/examples/01-primitives/index.html +191 -0
  13. package/examples/01-primitives/system-renderer.js +37 -0
  14. package/examples/02-sprites/Game.js +8 -0
  15. package/examples/02-sprites/assets/spritesheet.json +6276 -0
  16. package/examples/02-sprites/assets/spritesheet.png +0 -0
  17. package/examples/02-sprites/assets/spritesheet_emissive.png +0 -0
  18. package/examples/02-sprites/component-animation.js +8 -0
  19. package/examples/02-sprites/component-transform.js +13 -0
  20. package/examples/02-sprites/constants.js +6 -0
  21. package/examples/02-sprites/deps.js +2 -0
  22. package/examples/02-sprites/entity-sprite.js +47 -0
  23. package/examples/02-sprites/index.html +310 -0
  24. package/examples/02-sprites/system-renderer.js +38 -0
  25. package/examples/03-tiles/Game.js +8 -0
  26. package/examples/03-tiles/assets/spelunky-tiles.png +0 -0
  27. package/examples/03-tiles/assets/spelunky0.png +0 -0
  28. package/examples/03-tiles/assets/spelunky1.png +0 -0
  29. package/examples/03-tiles/component-animation.js +8 -0
  30. package/examples/03-tiles/component-transform.js +13 -0
  31. package/examples/03-tiles/constants.js +6 -0
  32. package/examples/03-tiles/deps.js +2 -0
  33. package/examples/03-tiles/entity-sprite.js +47 -0
  34. package/examples/03-tiles/index.html +309 -0
  35. package/examples/03-tiles/system-renderer.js +38 -0
  36. package/examples/04-overlay/assets/spritesheet.json +22 -0
  37. package/examples/04-overlay/assets/spritesheet.png +0 -0
  38. package/examples/04-overlay/assets/spritesheet_emissive.png +0 -0
  39. package/examples/04-overlay/constants.js +6 -0
  40. package/examples/04-overlay/deps.js +1 -0
  41. package/examples/04-overlay/index.html +133 -0
  42. package/examples/05-bloom/Game.js +8 -0
  43. package/examples/05-bloom/assets/spritesheet.json +6276 -0
  44. package/examples/05-bloom/assets/spritesheet.png +0 -0
  45. package/examples/05-bloom/assets/spritesheet_emissive.png +0 -0
  46. package/examples/05-bloom/component-animation.js +8 -0
  47. package/examples/05-bloom/component-transform.js +13 -0
  48. package/examples/05-bloom/constants.js +6 -0
  49. package/examples/05-bloom/deps.js +2 -0
  50. package/examples/05-bloom/entity-sprite.js +47 -0
  51. package/examples/05-bloom/index.html +357 -0
  52. package/examples/05-bloom/system-renderer.js +38 -0
  53. package/examples/06-displacement/Game.js +8 -0
  54. package/examples/06-displacement/assets/displacement_map_repeat.jpg +0 -0
  55. package/examples/06-displacement/assets/spelunky-tiles.png +0 -0
  56. package/examples/06-displacement/assets/spelunky0.png +0 -0
  57. package/examples/06-displacement/assets/spelunky1.png +0 -0
  58. package/examples/06-displacement/component-animation.js +8 -0
  59. package/examples/06-displacement/component-transform.js +13 -0
  60. package/examples/06-displacement/constants.js +6 -0
  61. package/examples/06-displacement/deps.js +2 -0
  62. package/examples/06-displacement/entity-sprite.js +47 -0
  63. package/examples/06-displacement/index.html +350 -0
  64. package/examples/06-displacement/system-renderer.js +38 -0
  65. package/examples/07-sdl/assets/spritesheet.json +22 -0
  66. package/examples/07-sdl/assets/spritesheet.png +0 -0
  67. package/examples/07-sdl/assets/spritesheet_emissive.png +0 -0
  68. package/examples/07-sdl/main.js +109 -0
  69. package/examples/07-sdl/package.json +19 -0
  70. package/examples/08-light/Game.js +8 -0
  71. package/examples/08-light/assets/spelunky-tiles.png +0 -0
  72. package/examples/08-light/assets/spelunky0.png +0 -0
  73. package/examples/08-light/assets/spelunky1.png +0 -0
  74. package/examples/08-light/constants.js +6 -0
  75. package/examples/08-light/deps.js +2 -0
  76. package/examples/08-light/index.html +477 -0
  77. package/package.json +34 -0
  78. package/src/bloom/bloom.js +467 -0
  79. package/src/bloom/bloom.wgsl +176 -0
  80. package/src/cobalt.js +231 -0
  81. package/src/create-texture-from-buffer.js +39 -0
  82. package/src/create-texture-from-url.js +35 -0
  83. package/src/create-texture.js +46 -0
  84. package/src/deps.js +3 -0
  85. package/src/displacement/composition.wgsl +58 -0
  86. package/src/displacement/displacement-composition.ts +161 -0
  87. package/src/displacement/displacement-parameters-buffer.ts +44 -0
  88. package/src/displacement/displacement-texture.ts +221 -0
  89. package/src/displacement/displacement.js +160 -0
  90. package/src/displacement/displacement.wgsl +31 -0
  91. package/src/displacement/triangles-buffer.ts +95 -0
  92. package/src/fb-blit/fb-blit.js +161 -0
  93. package/src/fb-blit/fb-blit.wgsl +40 -0
  94. package/src/fb-texture/fb-texture.js +56 -0
  95. package/src/light/README.md +61 -0
  96. package/src/light/light.js +148 -0
  97. package/src/light/lights-buffer.ts +98 -0
  98. package/src/light/lights-renderer.ts +278 -0
  99. package/src/light/public-api.js +20 -0
  100. package/src/light/readme/01_illumination.webp +0 -0
  101. package/src/light/readme/02_lights_texture.webp +0 -0
  102. package/src/light/readme/03_lights_texture_decomposed.webp +0 -0
  103. package/src/light/readme/04_lights_texture_mask.webp +0 -0
  104. package/src/light/readme/05_lights_obstacle_decomposition.webp +0 -0
  105. package/src/light/readme/06_lights_hard_cast_shadows.webp +0 -0
  106. package/src/light/texture/lights-texture-initializer.ts +191 -0
  107. package/src/light/texture/lights-texture-mask.ts +286 -0
  108. package/src/light/texture/lights-texture.ts +121 -0
  109. package/src/light/types.ts +23 -0
  110. package/src/light/viewport.ts +63 -0
  111. package/src/overlay/constants.js +1 -0
  112. package/src/overlay/overlay.js +341 -0
  113. package/src/overlay/overlay.wgsl +88 -0
  114. package/src/primitives/constants.js +1 -0
  115. package/src/primitives/primitives.js +252 -0
  116. package/src/primitives/primitives.wgsl +54 -0
  117. package/src/primitives/public-api.js +325 -0
  118. package/src/scene-composite/scene-composite.js +168 -0
  119. package/src/scene-composite/scene-composite.wgsl +94 -0
  120. package/src/sprite/constants.js +1 -0
  121. package/src/sprite/create-sprite-quads.js +60 -0
  122. package/src/sprite/public-api.js +215 -0
  123. package/src/sprite/read-spritesheet.js +103 -0
  124. package/src/sprite/sorted-binary-insert.js +45 -0
  125. package/src/sprite/sprite.js +268 -0
  126. package/src/sprite/sprite.wgsl +103 -0
  127. package/src/sprite/spritesheet.js +212 -0
  128. package/src/tile/atlas.js +193 -0
  129. package/src/tile/tile.js +171 -0
  130. package/src/tile/tile.wgsl +105 -0
  131. package/src/uuid.js +3 -0
package/bundle.js ADDED
@@ -0,0 +1,284 @@
1
+ var zn=Object.defineProperty;var Ie=(s,r)=>{for(var m in r)zn(s,m,{get:r[m],enumerable:!0})};function Rt(s,r,m,v,P,T,B){let G=s.createTexture({label:r,size:{width:m,height:v},format:T,usage:B,mipLevelCount:P,sampleCount:1,dimension:"2d"}),_=G.createView(),U=[];for(let R=0;R<P;R++)U.push(G.createView({label:r,format:T,dimension:"2d",aspect:"all",baseMipLevel:R,mipLevelCount:1,baseArrayLayer:0,arrayLayerCount:1}));let z=s.createSampler({label:`${r} sampler`,addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",addressModeW:"clamp-to-edge",magFilter:"linear",minFilter:"linear",mipmapFilter:"linear"});return{size:{width:m,height:v},texture:G,view:_,mip_view:U,sampler:z}}async function qt(s,r,m,v="rgba8unorm"){let T=await(await fetch(m)).blob(),B=await createImageBitmap(T),G=GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT,U=Rt(s.device,r,B.width,B.height,1,v,G);s.device.queue.copyExternalImageToTexture({source:B},{texture:U.texture},{width:B.width,height:B.height});let z={addressModeU:"repeat",addressModeV:"repeat",magFilter:"nearest",minFilter:"nearest",mipmapFilter:"nearest",maxAnisotropy:1};return U.sampler=s.device.createSampler(z),U}function oe(s,r,m,v="rgba8unorm"){let P=GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT,B=Rt(s.device,r,m.width,m.height,1,v,P);s.device.queue.writeTexture({texture:B.texture},m.data,{bytesPerRow:4*m.width},{width:m.width,height:m.height});let G={addressModeU:"repeat",addressModeV:"repeat",magFilter:"nearest",minFilter:"nearest",mipmapFilter:"nearest",maxAnisotropy:1};return B.sampler=s.device.createSampler(G),B}var Le="const BLOOM_MIP_COUNT:i32=7;const MODE_PREFILTER:u32=0u;const MODE_DOWNSAMPLE:u32=1u;const MODE_UPSAMPLE_FIRST:u32=2u;const MODE_UPSAMPLE:u32=3u;const EPSILON:f32=1.0e-4;struct bloom_param{parameters:vec4<f32>,combine_constant:f32,doop:u32,ferp:u32,}struct mode_lod_param{mode_lod:u32,}@group(0)@binding(0)var output_texture:texture_storage_2d<rgba16float,write>;@group(0)@binding(1)var input_texture:texture_2d<f32>;@group(0)@binding(2)var bloom_texture:texture_2d<f32>;@group(0)@binding(3)var samp:sampler;@group(0)@binding(4)var<uniform> param:bloom_param;@group(0)@binding(5)var<uniform> pc:mode_lod_param;fn QuadraticThreshold(color:vec4<f32>,threshold:f32,curve:vec3<f32>)->vec4<f32>{let brightness=max(max(color.r,color.g),color.b);var rq:f32=clamp(brightness-curve.x,0.0,curve.y);rq=curve.z*(rq*rq);let ret_color=color*max(rq,brightness-threshold)/max(brightness,EPSILON);return ret_color;}fn Prefilter(color:vec4<f32>,uv:vec2<f32>)->vec4<f32>{let clamp_value=20.0;var c=min(vec4<f32>(clamp_value),color);c=QuadraticThreshold(color,param.parameters.x,param.parameters.yzw);return c;}fn DownsampleBox13(tex:texture_2d<f32>,lod:f32,uv:vec2<f32>,tex_size:vec2<f32>)->vec3<f32>{let A=textureSampleLevel(tex,samp,uv,lod).rgb;let texel_size=tex_size*0.5;let B=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(-1.0,-1.0),lod).rgb;let C=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(-1.0,1.0),lod).rgb;let D=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(1.0,1.0),lod).rgb;let E=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(1.0,-1.0),lod).rgb;let F=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(-2.0,-2.0),lod).rgb;let G=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(-2.0,0.0),lod).rgb;let H=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(0.0,2.0),lod).rgb;let I=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(2.0,2.0),lod).rgb;let J=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(2.0,2.0),lod).rgb;let K=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(2.0,0.0),lod).rgb;let L=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(-2.0,-2.0),lod).rgb;let M=textureSampleLevel(tex,samp,uv+texel_size*vec2<f32>(0.0,-2.0),lod).rgb;var result:vec3<f32>=vec3<f32>(0.0);result=result+(B+C+D+E)*0.5;result=result+(F+G+A+M)*0.125;result=result+(G+H+I+A)*0.125;result=result+(A+I+J+K)*0.125;result=result+(M+A+K+L)*0.125;result=result*0.25;return result;}fn UpsampleTent9(tex:texture_2d<f32>,lod:f32,uv:vec2<f32>,texel_size:vec2<f32>,radius:f32)->vec3<f32>{let offset=texel_size.xyxy*vec4<f32>(1.0,1.0,-1.0,0.0)*radius;var result:vec3<f32>=textureSampleLevel(tex,samp,uv,lod).rgb*4.0;result=result+textureSampleLevel(tex,samp,uv-offset.xy,lod).rgb;result=result+textureSampleLevel(tex,samp,uv-offset.wy,lod).rgb*2.0;result=result+textureSampleLevel(tex,samp,uv-offset.zy,lod).rgb;result=result+textureSampleLevel(tex,samp,uv+offset.zw,lod).rgb*2.0;result=result+textureSampleLevel(tex,samp,uv+offset.xw,lod).rgb*2.0;result=result+textureSampleLevel(tex,samp,uv+offset.zy,lod).rgb;result=result+textureSampleLevel(tex,samp,uv+offset.wy,lod).rgb*2.0;result=result+textureSampleLevel(tex,samp,uv+offset.xy,lod).rgb;return result*(1.0/16.0);}fn combine(ex_color:vec3<f32>,color_to_add:vec3<f32>,combine_constant:f32)->vec3<f32>{let existing_color=ex_color+(-color_to_add);let blended_color=(combine_constant*existing_color)+color_to_add;return blended_color;}@compute @workgroup_size(8,4,1)fn cs_main(@builtin(global_invocation_id)global_invocation_id:vec3<u32>){let mode=pc.mode_lod>>16u;let lod=pc.mode_lod&65535u;let imgSize=textureDimensions(output_texture);if(global_invocation_id.x<u32(imgSize.x)&&global_invocation_id.y<u32(imgSize.y)){var texCoords:vec2<f32>=vec2<f32>(f32(global_invocation_id.x)/f32(imgSize.x),f32(global_invocation_id.y)/f32(imgSize.y));texCoords=texCoords+(1.0/vec2<f32>(imgSize))*0.5;let texSize=vec2<f32>(textureDimensions(input_texture,i32(lod)));var color:vec4<f32>=vec4<f32>(1.0);if(mode==MODE_PREFILTER){color=vec4<f32>(DownsampleBox13(input_texture,f32(lod),texCoords,1.0/texSize),1.0);color=Prefilter(color,texCoords);}else if(mode==MODE_DOWNSAMPLE){color=vec4<f32>(DownsampleBox13(input_texture,f32(lod),texCoords,1.0/texSize),1.0);}else if(mode==MODE_UPSAMPLE_FIRST){let bloomTexSize=textureDimensions(input_texture,i32(lod)+1);let sampleScale=1.0;let upsampledTexture=UpsampleTent9(input_texture,f32(lod)+1.0,texCoords,1.0/vec2<f32>(bloomTexSize),sampleScale);let existing=textureSampleLevel(input_texture,samp,texCoords,f32(lod)).rgb;color=vec4<f32>(combine(existing,upsampledTexture,param.combine_constant),1.0);}else if(mode==MODE_UPSAMPLE){let bloomTexSize=textureDimensions(bloom_texture,i32(lod)+1);let sampleScale=1.0;let upsampledTexture=UpsampleTent9(bloom_texture,f32(lod)+1.0,texCoords,1.0/vec2<f32>(bloomTexSize),sampleScale);let existing=textureSampleLevel(input_texture,samp,texCoords,f32(lod)).rgb;color=vec4<f32>(combine(existing,upsampledTexture,param.combine_constant),1.0);}textureStore(output_texture,vec2<i32>(global_invocation_id.xy),color);}}";var Ot=7,Un=0,Ae=1,En=2,Fe=3,Re={type:"cobalt:bloom",refs:[{name:"emissive",type:"textureView",format:"rgba16",access:"read"},{name:"hdr",type:"textureView",format:"rgba16",access:"read"},{name:"bloom",type:"textureView",format:"rgba16",access:"readwrite"}],onInit:async function(s,r={}){return In(s,r)},onRun:function(s,r,m){Ln(s,r.data,m)},onDestroy:function(s,r){Oe(r)},onResize:function(s,r){An(s,r)},onViewportPosition:function(s,r){}};function In(s,r){let{device:m}=s,v=s.viewport.width,P=s.viewport.height,T={compute_pipeline:null,bind_group:[],bind_group_layout:[],bind_groups_textures:[]},B=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba16float",viewDimension:"2d"}},{binding:1,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"float",viewDimension:"2d",multisampled:!1}},{binding:2,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"float",viewDimension:"2d",multisampled:!1}},{binding:3,visibility:GPUShaderStage.COMPUTE,sampler:{}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}}]});T.bind_group_layout.push(B),T.bind_groups_textures.push(Rt(m,"bloom downsampler image 0",v/2,P/2,Ot,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),T.bind_groups_textures.push(Rt(m,"bloom downsampler image 1",v/2,P/2,Ot,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),T.bind_groups_textures.push(r.refs.bloom.data);let G=m.createPipelineLayout({bindGroupLayouts:T.bind_group_layout}),_=m.createComputePipeline({layout:G,compute:{module:m.createShaderModule({code:Le}),entryPoint:"cs_main"}});return Ve(s,T,r),T.compute_pipeline=_,T}function Ve(s,r,m){let{refs:v}=m,{device:P}=s,T=m.options.bloom_threshold??.1,B=m.options.bloom_knee??.2,G=m.options.bloom_combine_constant??.68,_=new Float32Array([T,T-B,B*2,.25/B,G,0,0,0]),U=P.createBuffer({label:"bloom static parameters buffer",size:_.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});new Float32Array(U.getMappedRange()).set(_),U.unmap(),r.bind_group.length=0,r.params_buf=U,r.bind_group.push(Jt(P,r,r.bind_groups_textures[0].mip_view[0],v.emissive.data.view,v.hdr.data.view,v.hdr.data.sampler,U,Un<<16|0));for(let R=1;R<Ot;R++)r.bind_group.push(Jt(P,r,r.bind_groups_textures[1].mip_view[R],r.bind_groups_textures[0].view,v.hdr.data.view,v.hdr.data.sampler,U,Ae<<16|R-1)),r.bind_group.push(Jt(P,r,r.bind_groups_textures[0].mip_view[R],r.bind_groups_textures[1].view,v.hdr.data.view,v.hdr.data.sampler,U,Ae<<16|R));r.bind_group.push(Jt(P,r,r.bind_groups_textures[2].mip_view[Ot-1],r.bind_groups_textures[0].view,v.hdr.data.view,v.hdr.data.sampler,U,En<<16|Ot-2));let z=!0;for(let R=Ot-2;R>=0;R--)z?(r.bind_group.push(Jt(P,r,r.bind_groups_textures[1].mip_view[R],r.bind_groups_textures[0].view,r.bind_groups_textures[2].view,v.hdr.data.sampler,U,Fe<<16|R)),z=!1):(r.bind_group.push(Jt(P,r,r.bind_groups_textures[2].mip_view[R],r.bind_groups_textures[0].view,r.bind_groups_textures[1].view,v.hdr.data.sampler,U,Fe<<16|R)),z=!0)}function Jt(s,r,m,v,P,T,B,G){let _=new Uint32Array([G]),U=s.createBuffer({label:"bloom static mode_lod buffer",size:_.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return new Uint32Array(U.getMappedRange()).set(_),U.unmap(),s.createBindGroup({label:"bloom bind group layout",layout:r.bind_group_layout[0],entries:[{binding:0,resource:m},{binding:1,resource:v},{binding:2,resource:P},{binding:3,resource:T},{binding:4,resource:{buffer:B}},{binding:5,resource:{buffer:U}}]})}function Ln(s,r,m){let G=0,_=m.beginComputePass({label:"bloom Compute Pass"});_.setPipeline(r.compute_pipeline),_.setBindGroup(0,r.bind_group[G]),G+=1;let U=ce(0,r.bind_groups_textures[0]);_.dispatchWorkgroups(U.width/8+1,U.height/4+1,1);for(let z=1;z<Ot;z++)U=ce(z,r.bind_groups_textures[0]),_.setBindGroup(0,r.bind_group[G]),G+=1,_.dispatchWorkgroups(U.width/8+1,U.height/4+1,1),_.setBindGroup(0,r.bind_group[G]),G+=1,_.dispatchWorkgroups(U.width/8+1,U.height/4+1,1);_.setBindGroup(0,r.bind_group[G]),G+=1,U=ce(Ot-1,r.bind_groups_textures[2]),_.dispatchWorkgroups(U.width/8+1,U.height/4+1,1);for(let z=Ot-2;z>=0;z--)U=ce(z,r.bind_groups_textures[2]),_.setBindGroup(0,r.bind_group[G]),G+=1,_.dispatchWorkgroups(U.width/8+1,U.height/4+1,1);_.end()}function ce(s,r){let m=r.size.width,v=r.size.height;for(let P=0;P<s;P++)m/=2,v/=2;return{width:m,height:v,depthOrArrayLayers:1}}function An(s,r){let{device:m}=s,v=r.data;Oe(v),v.bind_groups_textures.push(Rt(m,"bloom downsampler image 0",s.viewport.width/2,s.viewport.height/2,Ot,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),v.bind_groups_textures.push(Rt(m,"bloom downsampler image 1",s.viewport.width/2,s.viewport.height/2,Ot,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),v.bind_groups_textures.push(r.refs.bloom.data),Ve(s,v,r)}function Oe(s){for(let r of s.bind_groups_textures)r.texture.destroy();s.bind_groups_textures.length=0}var Me="struct BloomComposite{bloom_intensity:f32,bloom_combine_constant:f32,}@group(0)@binding(0)var mySampler:sampler;@group(0)@binding(1)var colorTexture:texture_2d<f32>;@group(0)@binding(2)var emissiveTexture:texture_2d<f32>;@group(0)@binding(3)var<uniform> composite_parameter:BloomComposite;struct VertexOutput{@builtin(position)Position:vec4<f32>,@location(0)fragUV:vec2<f32>,}const positions=array<vec2<f32>,3>(vec2<f32>(-1.0,-3.0),vec2<f32>(3.0,1.0),vec2<f32>(-1.0,1.0));const uvs=array<vec2<f32>,3>(vec2<f32>(0.0,2.0),vec2<f32>(2.0,0.0),vec2<f32>(0.0,0.0));@vertex fn vert_main(@builtin(vertex_index)VertexIndex:u32)->VertexOutput{var output:VertexOutput;output.Position=vec4<f32>(positions[VertexIndex],0.0,1.0);output.fragUV=vec2<f32>(uvs[VertexIndex]);return output;}fn GTTonemap_point(x:f32)->f32{let m:f32=0.22;let a:f32=1.0;let c:f32=1.33;let P:f32=1.0;let l:f32=0.4;let l0:f32=((P-m)*l)/a;let S0:f32=m+l0;let S1:f32=m+a*l0;let C2:f32=(a*P)/(P-S1);let L:f32=m+a*(x-m);let T:f32=m*pow(x/m,c);let S:f32=P-(P-S1)*exp(-C2*(x-S0)/P);let w0:f32=1.0-smoothstep(0.0,m,x);var w2:f32=1.0;if(x<m+l){w2=0.0;}let w1:f32=1.0-w0-w2;return f32(T*w0+L*w1+S*w2);}fn GTTonemap(x:vec3<f32>)->vec3<f32>{return vec3<f32>(GTTonemap_point(x.r),GTTonemap_point(x.g),GTTonemap_point(x.b));}fn aces(x:vec3<f32>)->vec3<f32>{let a:f32=2.51;let b:f32=0.03;let c:f32=2.43;let d:f32=0.59;let e:f32=0.14;return clamp((x*(a*x+b))/(x*(c*x+d)+e),vec3<f32>(0.0),vec3<f32>(1.0));}@fragment fn frag_main(@location(0)fragUV:vec2<f32>)->@location(0)vec4<f32>{let hdr_color=textureSample(colorTexture,mySampler,fragUV);let bloom_color=textureSample(emissiveTexture,mySampler,fragUV);let combined_color=((bloom_color*composite_parameter.bloom_intensity)*composite_parameter.bloom_combine_constant);let mapped_color=GTTonemap(combined_color.rgb);let gamma_corrected_color=pow(mapped_color,vec3<f32>(1.0/2.2));return vec4<f32>(gamma_corrected_color+hdr_color.rgb,1.0);}";var qe={type:"cobalt:bloom",refs:[{name:"hdr",type:"textureView",format:"rgba16",access:"read"},{name:"bloom",type:"textureView",format:"rgba16",access:"read"},{name:"combined",type:"textureView",format:"rgba8unorm",access:"write"}],onInit:async function(s,r={}){return Rn(s,r)},onRun:function(s,r,m){Vn(s,r,m)},onDestroy:function(s,r){},onResize:function(s,r){On(s,r)},onViewportPosition:function(s,r){}};function Rn(s,r){let{options:m,refs:v}=r,{device:P}=s,T=Ne(s),B=m.bloom_intensity??40,G=m.bloom_combine_constant??.68,_=new Float32Array([B,G]),U=P.createBuffer({label:"scene composite params buffer",size:_.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});new Float32Array(U.getMappedRange()).set(_),U.unmap();let z=P.createRenderPipeline({layout:"auto",vertex:{module:P.createShaderModule({code:Me}),entryPoint:"vert_main"},fragment:{module:P.createShaderModule({code:Me}),entryPoint:"frag_main",targets:[{format:T}]},primitive:{topology:"triangle-list"}});return{bindGroup:P.createBindGroup({layout:z.getBindGroupLayout(0),entries:[{binding:0,resource:v.hdr.data.sampler},{binding:1,resource:v.hdr.data.view},{binding:2,resource:v.bloom.data.mip_view[0]},{binding:3,resource:{buffer:U}}]}),pipeline:z,params_buf:U}}function Vn(s,r,m){let v=m.beginRenderPass({colorAttachments:[{view:r.refs.combined.data.view,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}),{pipeline:P,bindGroup:T}=r.data;v.setPipeline(P),v.setBindGroup(0,T),v.draw(3),v.end()}function On(s,r){let{pipeline:m,params_buf:v}=r.data,{device:P}=s;r.data.bindGroup=P.createBindGroup({layout:m.getBindGroupLayout(0),entries:[{binding:0,resource:r.refs.hdr.data.sampler},{binding:1,resource:r.refs.hdr.data.view},{binding:2,resource:r.refs.bloom.data.mip_view[0]},{binding:3,resource:{buffer:v}}]})}var ie={};Ie(ie,{addSprite:()=>Nn,clear:()=>$n,removeSprite:()=>Yn,setSprite:()=>kn,setSpriteName:()=>Xn,setSpriteOpacity:()=>jn,setSpritePosition:()=>Hn,setSpriteRotation:()=>Zn,setSpriteScale:()=>Qn,setSpriteTint:()=>Wn});function De(s,r,m){if(m.spriteCount===0)return 0;let v=0,P=m.spriteCount-1,T=s<<16&16711680|r&65535;for(;v<=P;){let B=m.spriteData[v*12+11];if(T<=B)return v;let G=m.spriteData[P*12+11];if(T>=G)return P+1;let _=Math.floor((v+P)/2),U=m.spriteData[_*12+11];if(T===U)return _+1;T>U?v=_+1:P=_-1}return v}function se(){return Math.ceil(Math.random()*(Number.MAX_SAFE_INTEGER-10))}function Nn(s,r,m,v,P,T,B,G,_){let U=r.refs.spritesheet.data.spritesheet;r=r.data;let z=U.locations.indexOf(m),R=De(_,z,r),X=(R+1)*12;r.spriteData.set(r.spriteData.subarray(R*12,r.spriteCount*12),X),Ye(r,U,R,m,v,P,T,B,G,_);for(let[H,F]of r.spriteIndices)F>=R&&r.spriteIndices.set(H,F+1);let Y=se();return r.spriteIndices.set(Y,R),r.spriteCount++,r.dirty=!0,Y}function Yn(s,r,m){r=r.data;let v=r.spriteIndices.get(m);for(let[T,B]of r.spriteIndices)B>v&&r.spriteIndices.set(T,B-1);let P=v*12;r.spriteData.set(r.spriteData.subarray((v+1)*12,r.spriteCount*12),P),r.spriteIndices.delete(m),r.spriteCount--,r.dirty=!0}function $n(s,r){r=r.data,r.spriteIndices.clear(),r.spriteCount=0,r.instancedDrawCallCount=0,r.dirty=!0}function Xn(s,r,m,v,P){let T=r.refs.spritesheet.data.spritesheet;r=r.data;let B=T.locations.indexOf(v),G=T.spriteMeta[v].w,_=T.spriteMeta[v].h,z=r.spriteIndices.get(m)*12;r.spriteData[z+2]=G*P[0],r.spriteData[z+3]=_*P[1];let X=(r.spriteData[z+11]>>16&255)<<16&16711680|B&65535;r.spriteData[z+11]=X,r.dirty=!0}function Hn(s,r,m,v){r=r.data;let T=r.spriteIndices.get(m)*12;r.spriteData[T]=v[0],r.spriteData[T+1]=v[1],r.dirty=!0}function Wn(s,r,m,v){r=r.data;let T=r.spriteIndices.get(m)*12;r.spriteData[T+4]=v[0],r.spriteData[T+5]=v[1],r.spriteData[T+6]=v[2],r.spriteData[T+7]=v[3],r.dirty=!0}function jn(s,r,m,v){r=r.data;let T=r.spriteIndices.get(m)*12;r.spriteData[T+8]=v,r.dirty=!0}function Zn(s,r,m,v){r=r.data;let T=r.spriteIndices.get(m)*12;r.spriteData[T+9]=v,r.dirty=!0}function Qn(s,r,m,v,P){let T=r.refs.spritesheet.data.spritesheet;r=r.data;let G=r.spriteIndices.get(m)*12,_=T.spriteMeta[v].w,U=T.spriteMeta[v].h;r.spriteData[G+2]=_*P[0],r.spriteData[G+3]=U*P[1],r.dirty=!0}function kn(s,r,m,v,P,T,B,G,_,U){let z=r.refs.spritesheet.data.spritesheet;r=r.data;let R=r.spriteIndices.get(m);Ye(r,z,R,v,P,T,B,G,_,U),r.dirty=!0}function Ye(s,r,m,v,P,T,B,G,_,U){if(!r.spriteMeta[v])throw new Error(`Sprite name ${v} could not be found in the spritesheet metaData`);let z=m*12,R=r.spriteMeta[v].w,X=r.spriteMeta[v].h,Y=r.locations.indexOf(v),H=U<<16&16711680|Y&65535;s.spriteData[z]=P[0],s.spriteData[z+1]=P[1],s.spriteData[z+2]=R*T[0],s.spriteData[z+3]=X*T[1],s.spriteData[z+4]=B[0],s.spriteData[z+5]=B[1],s.spriteData[z+6]=B[2],s.spriteData[z+7]=B[3],s.spriteData[z+8]=G,s.spriteData[z+9]=_,s.spriteData[z+11]=H}var $e={type:"cobalt:sprite",refs:[{name:"spritesheet",type:"customResource",access:"read"},{name:"hdr",type:"textureView",format:"rgba16float",access:"write"},{name:"emissive",type:"textureView",format:"rgba16float",access:"write"}],onInit:async function(s,r={}){return Kn(s,r)},onRun:function(s,r,m){Jn(s,r,m)},onDestroy:function(s,r){tr(r)},onResize:function(s,r){},onViewportPosition:function(s,r){},customFunctions:{...ie}};async function Kn(s,r){let{device:m}=s,v=16192,P=v,B=Float32Array.BYTES_PER_ELEMENT*2,_=Float32Array.BYTES_PER_ELEMENT*2,z=Float32Array.BYTES_PER_ELEMENT*4,X=Float32Array.BYTES_PER_ELEMENT*4,Y=m.createBuffer({size:(B+_+z+X)*P,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),H=r.refs.spritesheet.data,F=m.createBindGroup({layout:r.refs.spritesheet.data.bindGroupLayout,entries:[{binding:0,resource:{buffer:H.uniformBuffer}},{binding:1,resource:H.colorTexture.view},{binding:2,resource:H.colorTexture.sampler},{binding:3,resource:{buffer:Y}},{binding:4,resource:H.emissiveTexture.view}]});return{instancedDrawCalls:new Uint32Array(v*2),instancedDrawCallCount:0,bindGroup:F,spriteBuffer:Y,spriteData:new Float32Array(v*12),spriteCount:0,spriteIndices:new Map,dirty:!1}}function Jn(s,r,m){let{device:v}=s,P=r.options.loadOp||"load";if(r.data.dirty&&(Cn(r.data),r.data.dirty=!1),r.data.spriteCount>0){let _=r.data.spriteCount*12*Float32Array.BYTES_PER_ELEMENT;v.queue.writeBuffer(r.data.spriteBuffer,0,r.data.spriteData.buffer,0,_)}let T=m.beginRenderPass({colorAttachments:[{view:r.refs.hdr.data.view,clearValue:s.clearValue,loadOp:P,storeOp:"store"},{view:r.refs.emissive.data.view,clearValue:s.clearValue,loadOp:"clear",storeOp:"store"}]});T.setPipeline(r.refs.spritesheet.data.pipeline),T.setBindGroup(0,r.data.bindGroup),T.setVertexBuffer(0,r.refs.spritesheet.data.quads.buffer);let B=6,G=0;for(let _=0;_<r.data.instancedDrawCallCount;_++){let U=r.data.instancedDrawCalls[_*2]*B,z=r.data.instancedDrawCalls[_*2+1];T.draw(B,z,U,G),G+=z}T.end()}function Cn(s){let r=-1,m=0;s.instancedDrawCallCount=0;for(let v=0;v<s.spriteCount;v++){let P=s.spriteData[v*12+11]&65535;P!==r&&(m>0&&(s.instancedDrawCalls[s.instancedDrawCallCount*2]=r,s.instancedDrawCalls[s.instancedDrawCallCount*2+1]=m,s.instancedDrawCallCount++),r=P,m=0),m++}m>0&&(s.instancedDrawCalls[s.instancedDrawCallCount*2]=r,s.instancedDrawCalls[s.instancedDrawCallCount*2+1]=m,s.instancedDrawCallCount++)}function tr(s){s.data.instancedDrawCalls=null,s.data.bindGroup=null,s.data.spriteBuffer.destroy(),s.data.spriteBuffer=null,s.data.spriteData=null,s.data.spriteIndices.clear(),s.data.spriteIndices=null}var He={type:"cobalt:tile",refs:[{name:"tileAtlas",type:"textureView",format:"rgba8unorm",access:"write"}],onInit:async function(s,r={}){return er(s,r)},onRun:function(s,r,m){nr(s,r,m)},onDestroy:function(s,r){Xe(r)},onResize:function(s,r){},onViewportPosition:function(s,r){},customFunctions:{setTexture:async function(s,r,m){let{device:v}=s;Xe(r),r.options.textureUrl=m;let P=await qt(s,"tile map",r.options.textureUrl),T=v.createBindGroup({layout:r.refs.tileAtlas.data.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:r.data.uniformBuffer}},{binding:1,resource:P.view},{binding:2,resource:P.sampler}]});r.data.bindGroup=T,r.data.material=P}}};async function er(s,r){let{device:m}=s,v=await qt(s,"tile map",r.options.textureUrl),P=new Float32Array([r.options.scrollScale,r.options.scrollScale]),T=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,B={size:P.byteLength,usage:T,mappedAtCreation:!0},G=m.createBuffer(B);return new Float32Array(G.getMappedRange()).set(P),G.unmap(),{bindGroup:m.createBindGroup({layout:r.refs.tileAtlas.data.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:G}},{binding:1,resource:v.view},{binding:2,resource:v.sampler}]}),material:v,uniformBuffer:G,scrollScale:r.options.scrollScale}}function nr(s,r,m){let{device:v}=s,P=r.options.loadOp||"load",T=m.beginRenderPass({colorAttachments:[{view:r.refs.hdr.data.view,clearValue:s.clearValue,loadOp:P,storeOp:"store"}]}),B=r.refs.tileAtlas.data;T.setPipeline(B.pipeline),T.setBindGroup(0,r.data.bindGroup),T.setBindGroup(1,B.atlasBindGroup),T.draw(3),T.end()}function Xe(s){s.data.material.texture.destroy(),s.data.material.texture=void 0}var ae=class{device;floatsPerSprite=6;bufferGpu;bufferNeedsUpdate=!1;sprites=new Map;get spriteCount(){return this.sprites.size}constructor(r){this.device=r.device,this.bufferGpu=this.device.createBuffer({size:r.maxSpriteCount*this.floatsPerSprite*Float32Array.BYTES_PER_ELEMENT,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST})}destroy(){this.bufferGpu.destroy}update(){if(this.bufferNeedsUpdate){let r=[];for(let v of this.sprites.values())r.push(...v);let m=new Float32Array(r);this.device.queue.writeBuffer(this.bufferGpu,0,m)}}addTriangle(r){let m=se();if(this.sprites.has(m))throw new Error(`Duplicate triangle "${m}".`);let v=this.buildTriangleData(r);return this.sprites.set(m,v),this.bufferNeedsUpdate=!0,m}removeTriangle(r){if(!this.sprites.has(r))throw new Error(`Unknown triangle "${r}".`);this.sprites.delete(r),this.bufferNeedsUpdate=!0}setTriangle(r,m){if(!this.sprites.has(r))throw new Error(`Unknown triangle "${r}".`);let v=this.buildTriangleData(m);this.sprites.set(r,v),this.bufferNeedsUpdate=!0}buildTriangleData(r){return[r[0][0],r[0][1],r[1][0],r[1][1],r[2][0],r[2][1]]}};var ue=class{device;bufferGpu;needsUpdate=!0;constructor(r){this.device=r.device,this.bufferGpu=this.device.createBuffer({label:"DisplacementParametersBuffer buffer",size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.setParameters(r.initialParameters)}setParameters(r){this.device.queue.writeBuffer(this.bufferGpu,0,new Float32Array([r.offsetX,r.offsetY,r.scale]))}destroy(){this.bufferGpu.destroy()}};var We="struct DisplacementParameters{offset:vec2<f32>,scale:f32,};@group(0)@binding(0)var<uniform> uniforms:DisplacementParameters;@group(0)@binding(1)var colorTexture:texture_2d<f32>;@group(0)@binding(2)var colorSampler:sampler;@group(0)@binding(3)var noiseTexture:texture_2d<f32>;@group(0)@binding(4)var noiseSampler:sampler;@group(0)@binding(5)var displacementTexture:texture_2d<f32>;struct VertexIn{@builtin(vertex_index)vertexIndex:u32,};struct VertexOut{@builtin(position)position:vec4<f32>,@location(0)uv:vec2<f32>,};@vertex fn main_vertex(in:VertexIn)->VertexOut{const corners=array<vec2<f32>,4>(vec2<f32>(-1,-1),vec2<f32>(1,-1),vec2<f32>(-1,1),vec2<f32>(1,1),);let screenPosition=corners[in.vertexIndex];var out:VertexOut;out.position=vec4<f32>(screenPosition,0,1);out.uv=(0.5+0.5*screenPosition*vec2<f32>(1,-1));return out;}struct FragmentOut{@location(0)color:vec4<f32>,};@fragment fn main_fragment(in:VertexOut)->FragmentOut{let noiseTextureDimensions=vec2<f32>(textureDimensions(noiseTexture,0));let noiseUv=in.uv+uniforms.offset/noiseTextureDimensions;var noise=textureSample(noiseTexture,noiseSampler,noiseUv).rg;noise-=0.5;noise*=uniforms.scale/noiseTextureDimensions;let displacement=textureSample(displacementTexture,colorSampler,in.uv).r;noise*=displacement;let colorUv=in.uv+noise;var out:FragmentOut;out.color=textureSample(colorTexture,colorSampler,colorUv);return out;}";var le=class{device;targetFormat;renderPipeline;colorSampler;noiseSampler;displacementParametersBuffer;renderBundle=null;colorTextureView;noiseMapTextureView;displacementTextureView;constructor(r){this.device=r.device,this.targetFormat=r.targetFormat,this.colorTextureView=r.colorTextureView,this.noiseMapTextureView=r.noiseMapTextureView,this.displacementTextureView=r.displacementTextureView,this.displacementParametersBuffer=r.displacementParametersBuffer;let m=this.device.createShaderModule({label:"DisplacementComposition shader module",code:We});this.renderPipeline=this.device.createRenderPipeline({label:"DisplacementComposition renderpipeline",layout:"auto",vertex:{module:m,entryPoint:"main_vertex"},fragment:{module:m,entryPoint:"main_fragment",targets:[{format:r.targetFormat}]},primitive:{cullMode:"none",topology:"triangle-strip"}}),this.noiseSampler=this.device.createSampler({label:"DisplacementComposition noisesampler",addressModeU:"repeat",addressModeV:"repeat",addressModeW:"repeat",magFilter:"linear",minFilter:"linear",mipmapFilter:"linear"}),this.colorSampler=this.device.createSampler({label:"DisplacementComposition colorSampler",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",addressModeW:"clamp-to-edge",magFilter:"linear",minFilter:"linear",mipmapFilter:"linear"})}getRenderBundle(){return this.renderBundle||(this.renderBundle=this.buildRenderBundle()),this.renderBundle}destroy(){}setColorTextureView(r){this.colorTextureView=r,this.renderBundle=null}setNoiseMapTextureView(r){this.noiseMapTextureView=r,this.renderBundle=null}setDisplacementTextureView(r){this.displacementTextureView=r,this.renderBundle=null}buildRenderBundle(){let r=this.device.createBindGroup({label:"DisplacementComposition bindgroup 0",layout:this.renderPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.displacementParametersBuffer.bufferGpu}},{binding:1,resource:this.colorTextureView},{binding:2,resource:this.colorSampler},{binding:3,resource:this.noiseMapTextureView},{binding:4,resource:this.noiseSampler},{binding:5,resource:this.displacementTextureView}]}),m=this.device.createRenderBundleEncoder({label:"DisplacementComposition renderbundle encoder",colorFormats:[this.targetFormat]});return m.setPipeline(this.renderPipeline),m.setBindGroup(0,r),m.draw(4),m.finish({label:"DisplacementComposition renderbundle"})}};var je="struct TransformData{mvpMatrix:mat4x4<f32>,};@group(0)@binding(0)var<uniform> transformUBO:TransformData;struct VertexIn{@location(0)position:vec2<f32>,};struct VertexOut{@builtin(position)position:vec4<f32>,};@vertex fn main_vertex(in:VertexIn)->VertexOut{var output:VertexOut;output.position=transformUBO.mvpMatrix*vec4<f32>(in.position,0.0,1.0);return output;}struct FragmentOut{@location(0)color:vec4<f32>,};@fragment fn main_fragment()->FragmentOut{var out:FragmentOut;out.color=vec4<f32>(1.0,1.0,1.0,1.0);return out;}";function sr(s,r){return class extends s{constructor(...m){super(...m),r(this)}}}var ir=sr(Array,s=>s.fill(0)),Q=1e-6;function cr(s){function r(t=0,a=0){let e=new s(2);return t!==void 0&&(e[0]=t,a!==void 0&&(e[1]=a)),e}let m=r;function v(t,a,e){let o=e??new s(2);return o[0]=t,o[1]=a,o}function P(t,a){let e=a??new s(2);return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e}function T(t,a){let e=a??new s(2);return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e}function B(t,a){let e=a??new s(2);return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e}function G(t,a=0,e=1,o){let l=o??new s(2);return l[0]=Math.min(e,Math.max(a,t[0])),l[1]=Math.min(e,Math.max(a,t[1])),l}function _(t,a,e){let o=e??new s(2);return o[0]=t[0]+a[0],o[1]=t[1]+a[1],o}function U(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+a[0]*e,l[1]=t[1]+a[1]*e,l}function z(t,a){let e=t[0],o=t[1],l=a[0],g=a[1],D=Math.sqrt(e*e+o*o),u=Math.sqrt(l*l+g*g),f=D*u,w=f&&Dt(t,a)/f;return Math.acos(w)}function R(t,a,e){let o=e??new s(2);return o[0]=t[0]-a[0],o[1]=t[1]-a[1],o}let X=R;function Y(t,a){return Math.abs(t[0]-a[0])<Q&&Math.abs(t[1]-a[1])<Q}function H(t,a){return t[0]===a[0]&&t[1]===a[1]}function F(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+e*(a[0]-t[0]),l[1]=t[1]+e*(a[1]-t[1]),l}function nt(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+e[0]*(a[0]-t[0]),l[1]=t[1]+e[1]*(a[1]-t[1]),l}function rt(t,a,e){let o=e??new s(2);return o[0]=Math.max(t[0],a[0]),o[1]=Math.max(t[1],a[1]),o}function W(t,a,e){let o=e??new s(2);return o[0]=Math.min(t[0],a[0]),o[1]=Math.min(t[1],a[1]),o}function et(t,a,e){let o=e??new s(2);return o[0]=t[0]*a,o[1]=t[1]*a,o}let Bt=et;function gt(t,a,e){let o=e??new s(2);return o[0]=t[0]/a,o[1]=t[1]/a,o}function xt(t,a){let e=a??new s(2);return e[0]=1/t[0],e[1]=1/t[1],e}let Mt=xt;function mt(t,a,e){let o=e??new s(3),l=t[0]*a[1]-t[1]*a[0];return o[0]=0,o[1]=0,o[2]=l,o}function Dt(t,a){return t[0]*a[0]+t[1]*a[1]}function C(t){let a=t[0],e=t[1];return Math.sqrt(a*a+e*e)}let _t=C;function q(t){let a=t[0],e=t[1];return a*a+e*e}let $=q;function O(t,a){let e=t[0]-a[0],o=t[1]-a[1];return Math.sqrt(e*e+o*o)}let Ut=O;function lt(t,a){let e=t[0]-a[0],o=t[1]-a[1];return e*e+o*o}let Et=lt;function ft(t,a){let e=a??new s(2),o=t[0],l=t[1],g=Math.sqrt(o*o+l*l);return g>1e-5?(e[0]=o/g,e[1]=l/g):(e[0]=0,e[1]=0),e}function It(t,a){let e=a??new s(2);return e[0]=-t[0],e[1]=-t[1],e}function j(t,a){let e=a??new s(2);return e[0]=t[0],e[1]=t[1],e}let Lt=j;function vt(t,a,e){let o=e??new s(2);return o[0]=t[0]*a[0],o[1]=t[1]*a[1],o}let At=vt;function yt(t,a,e){let o=e??new s(2);return o[0]=t[0]/a[0],o[1]=t[1]/a[1],o}let zt=yt;function bt(t=1,a){let e=a??new s(2),o=Math.random()*2*Math.PI;return e[0]=Math.cos(o)*t,e[1]=Math.sin(o)*t,e}function i(t){let a=t??new s(2);return a[0]=0,a[1]=0,a}function p(t,a,e){let o=e??new s(2),l=t[0],g=t[1];return o[0]=l*a[0]+g*a[4]+a[12],o[1]=l*a[1]+g*a[5]+a[13],o}function n(t,a,e){let o=e??new s(2),l=t[0],g=t[1];return o[0]=a[0]*l+a[4]*g+a[8],o[1]=a[1]*l+a[5]*g+a[9],o}function c(t,a,e,o){let l=o??new s(2),g=t[0]-a[0],D=t[1]-a[1],u=Math.sin(e),f=Math.cos(e);return l[0]=g*f-D*u+a[0],l[1]=g*u+D*f+a[1],l}function d(t,a,e){let o=e??new s(2);return ft(t,o),et(o,a,o)}function h(t,a,e){let o=e??new s(2);return C(t)>a?d(t,a,o):j(t,o)}function M(t,a,e){let o=e??new s(2);return F(t,a,.5,o)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,angle:z,subtract:R,sub:X,equalsApproximately:Y,equals:H,lerp:F,lerpV:nt,max:rt,min:W,mulScalar:et,scale:Bt,divScalar:gt,inverse:xt,invert:Mt,cross:mt,dot:Dt,length:C,len:_t,lengthSq:q,lenSq:$,distance:O,dist:Ut,distanceSq:lt,distSq:Et,normalize:ft,negate:It,copy:j,clone:Lt,multiply:vt,mul:At,divide:yt,div:zt,random:bt,zero:i,transformMat4:p,transformMat3:n,rotate:c,setLength:d,truncate:h,midpoint:M}}var Ze=new Map;function tn(s){let r=Ze.get(s);return r||(r=cr(s),Ze.set(s,r)),r}function ar(s){function r(u,f,w){let x=new s(3);return u!==void 0&&(x[0]=u,f!==void 0&&(x[1]=f,w!==void 0&&(x[2]=w))),x}let m=r;function v(u,f,w,x){let y=x??new s(3);return y[0]=u,y[1]=f,y[2]=w,y}function P(u,f){let w=f??new s(3);return w[0]=Math.ceil(u[0]),w[1]=Math.ceil(u[1]),w[2]=Math.ceil(u[2]),w}function T(u,f){let w=f??new s(3);return w[0]=Math.floor(u[0]),w[1]=Math.floor(u[1]),w[2]=Math.floor(u[2]),w}function B(u,f){let w=f??new s(3);return w[0]=Math.round(u[0]),w[1]=Math.round(u[1]),w[2]=Math.round(u[2]),w}function G(u,f=0,w=1,x){let y=x??new s(3);return y[0]=Math.min(w,Math.max(f,u[0])),y[1]=Math.min(w,Math.max(f,u[1])),y[2]=Math.min(w,Math.max(f,u[2])),y}function _(u,f,w){let x=w??new s(3);return x[0]=u[0]+f[0],x[1]=u[1]+f[1],x[2]=u[2]+f[2],x}function U(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+f[0]*w,y[1]=u[1]+f[1]*w,y[2]=u[2]+f[2]*w,y}function z(u,f){let w=u[0],x=u[1],y=u[2],b=f[0],S=f[1],I=f[2],A=Math.sqrt(w*w+x*x+y*y),E=Math.sqrt(b*b+S*S+I*I),L=A*E,V=L&&Dt(u,f)/L;return Math.acos(V)}function R(u,f,w){let x=w??new s(3);return x[0]=u[0]-f[0],x[1]=u[1]-f[1],x[2]=u[2]-f[2],x}let X=R;function Y(u,f){return Math.abs(u[0]-f[0])<Q&&Math.abs(u[1]-f[1])<Q&&Math.abs(u[2]-f[2])<Q}function H(u,f){return u[0]===f[0]&&u[1]===f[1]&&u[2]===f[2]}function F(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+w*(f[0]-u[0]),y[1]=u[1]+w*(f[1]-u[1]),y[2]=u[2]+w*(f[2]-u[2]),y}function nt(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+w[0]*(f[0]-u[0]),y[1]=u[1]+w[1]*(f[1]-u[1]),y[2]=u[2]+w[2]*(f[2]-u[2]),y}function rt(u,f,w){let x=w??new s(3);return x[0]=Math.max(u[0],f[0]),x[1]=Math.max(u[1],f[1]),x[2]=Math.max(u[2],f[2]),x}function W(u,f,w){let x=w??new s(3);return x[0]=Math.min(u[0],f[0]),x[1]=Math.min(u[1],f[1]),x[2]=Math.min(u[2],f[2]),x}function et(u,f,w){let x=w??new s(3);return x[0]=u[0]*f,x[1]=u[1]*f,x[2]=u[2]*f,x}let Bt=et;function gt(u,f,w){let x=w??new s(3);return x[0]=u[0]/f,x[1]=u[1]/f,x[2]=u[2]/f,x}function xt(u,f){let w=f??new s(3);return w[0]=1/u[0],w[1]=1/u[1],w[2]=1/u[2],w}let Mt=xt;function mt(u,f,w){let x=w??new s(3),y=u[2]*f[0]-u[0]*f[2],b=u[0]*f[1]-u[1]*f[0];return x[0]=u[1]*f[2]-u[2]*f[1],x[1]=y,x[2]=b,x}function Dt(u,f){return u[0]*f[0]+u[1]*f[1]+u[2]*f[2]}function C(u){let f=u[0],w=u[1],x=u[2];return Math.sqrt(f*f+w*w+x*x)}let _t=C;function q(u){let f=u[0],w=u[1],x=u[2];return f*f+w*w+x*x}let $=q;function O(u,f){let w=u[0]-f[0],x=u[1]-f[1],y=u[2]-f[2];return Math.sqrt(w*w+x*x+y*y)}let Ut=O;function lt(u,f){let w=u[0]-f[0],x=u[1]-f[1],y=u[2]-f[2];return w*w+x*x+y*y}let Et=lt;function ft(u,f){let w=f??new s(3),x=u[0],y=u[1],b=u[2],S=Math.sqrt(x*x+y*y+b*b);return S>1e-5?(w[0]=x/S,w[1]=y/S,w[2]=b/S):(w[0]=0,w[1]=0,w[2]=0),w}function It(u,f){let w=f??new s(3);return w[0]=-u[0],w[1]=-u[1],w[2]=-u[2],w}function j(u,f){let w=f??new s(3);return w[0]=u[0],w[1]=u[1],w[2]=u[2],w}let Lt=j;function vt(u,f,w){let x=w??new s(3);return x[0]=u[0]*f[0],x[1]=u[1]*f[1],x[2]=u[2]*f[2],x}let At=vt;function yt(u,f,w){let x=w??new s(3);return x[0]=u[0]/f[0],x[1]=u[1]/f[1],x[2]=u[2]/f[2],x}let zt=yt;function bt(u=1,f){let w=f??new s(3),x=Math.random()*2*Math.PI,y=Math.random()*2-1,b=Math.sqrt(1-y*y)*u;return w[0]=Math.cos(x)*b,w[1]=Math.sin(x)*b,w[2]=y*u,w}function i(u){let f=u??new s(3);return f[0]=0,f[1]=0,f[2]=0,f}function p(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2],I=f[3]*y+f[7]*b+f[11]*S+f[15]||1;return x[0]=(f[0]*y+f[4]*b+f[8]*S+f[12])/I,x[1]=(f[1]*y+f[5]*b+f[9]*S+f[13])/I,x[2]=(f[2]*y+f[6]*b+f[10]*S+f[14])/I,x}function n(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2];return x[0]=y*f[0*4+0]+b*f[1*4+0]+S*f[2*4+0],x[1]=y*f[0*4+1]+b*f[1*4+1]+S*f[2*4+1],x[2]=y*f[0*4+2]+b*f[1*4+2]+S*f[2*4+2],x}function c(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2];return x[0]=y*f[0]+b*f[4]+S*f[8],x[1]=y*f[1]+b*f[5]+S*f[9],x[2]=y*f[2]+b*f[6]+S*f[10],x}function d(u,f,w){let x=w??new s(3),y=f[0],b=f[1],S=f[2],I=f[3]*2,A=u[0],E=u[1],L=u[2],V=b*L-S*E,N=S*A-y*L,Z=y*E-b*A;return x[0]=A+V*I+(b*Z-S*N)*2,x[1]=E+N*I+(S*V-y*Z)*2,x[2]=L+Z*I+(y*N-b*V)*2,x}function h(u,f){let w=f??new s(3);return w[0]=u[12],w[1]=u[13],w[2]=u[14],w}function M(u,f,w){let x=w??new s(3),y=f*4;return x[0]=u[y+0],x[1]=u[y+1],x[2]=u[y+2],x}function t(u,f){let w=f??new s(3),x=u[0],y=u[1],b=u[2],S=u[4],I=u[5],A=u[6],E=u[8],L=u[9],V=u[10];return w[0]=Math.sqrt(x*x+y*y+b*b),w[1]=Math.sqrt(S*S+I*I+A*A),w[2]=Math.sqrt(E*E+L*L+V*V),w}function a(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[0],S[1]=b[1]*Math.cos(w)-b[2]*Math.sin(w),S[2]=b[1]*Math.sin(w)+b[2]*Math.cos(w),y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function e(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[2]*Math.sin(w)+b[0]*Math.cos(w),S[1]=b[1],S[2]=b[2]*Math.cos(w)-b[0]*Math.sin(w),y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function o(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[0]*Math.cos(w)-b[1]*Math.sin(w),S[1]=b[0]*Math.sin(w)+b[1]*Math.cos(w),S[2]=b[2],y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function l(u,f,w){let x=w??new s(3);return ft(u,x),et(x,f,x)}function g(u,f,w){let x=w??new s(3);return C(u)>f?l(u,f,x):j(u,x)}function D(u,f,w){let x=w??new s(3);return F(u,f,.5,x)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,angle:z,subtract:R,sub:X,equalsApproximately:Y,equals:H,lerp:F,lerpV:nt,max:rt,min:W,mulScalar:et,scale:Bt,divScalar:gt,inverse:xt,invert:Mt,cross:mt,dot:Dt,length:C,len:_t,lengthSq:q,lenSq:$,distance:O,dist:Ut,distanceSq:lt,distSq:Et,normalize:ft,negate:It,copy:j,clone:Lt,multiply:vt,mul:At,divide:yt,div:zt,random:bt,zero:i,transformMat4:p,transformMat4Upper3x3:n,transformMat3:c,transformQuat:d,getTranslation:h,getAxis:M,getScaling:t,rotateX:a,rotateY:e,rotateZ:o,setLength:l,truncate:g,midpoint:D}}var Qe=new Map;function fe(s){let r=Qe.get(s);return r||(r=ar(s),Qe.set(s,r)),r}function ur(s){let r=tn(s),m=fe(s);function v(i,p,n,c,d,h,M,t,a){let e=new s(12);return e[3]=0,e[7]=0,e[11]=0,i!==void 0&&(e[0]=i,p!==void 0&&(e[1]=p,n!==void 0&&(e[2]=n,c!==void 0&&(e[4]=c,d!==void 0&&(e[5]=d,h!==void 0&&(e[6]=h,M!==void 0&&(e[8]=M,t!==void 0&&(e[9]=t,a!==void 0&&(e[10]=a))))))))),e}function P(i,p,n,c,d,h,M,t,a,e){let o=e??new s(12);return o[0]=i,o[1]=p,o[2]=n,o[3]=0,o[4]=c,o[5]=d,o[6]=h,o[7]=0,o[8]=M,o[9]=t,o[10]=a,o[11]=0,o}function T(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[3]=0,n[4]=i[4],n[5]=i[5],n[6]=i[6],n[7]=0,n[8]=i[8],n[9]=i[9],n[10]=i[10],n[11]=0,n}function B(i,p){let n=p??new s(12),c=i[0],d=i[1],h=i[2],M=i[3],t=c+c,a=d+d,e=h+h,o=c*t,l=d*t,g=d*a,D=h*t,u=h*a,f=h*e,w=M*t,x=M*a,y=M*e;return n[0]=1-g-f,n[1]=l+y,n[2]=D-x,n[3]=0,n[4]=l-y,n[5]=1-o-f,n[6]=u+w,n[7]=0,n[8]=D+x,n[9]=u-w,n[10]=1-o-g,n[11]=0,n}function G(i,p){let n=p??new s(12);return n[0]=-i[0],n[1]=-i[1],n[2]=-i[2],n[4]=-i[4],n[5]=-i[5],n[6]=-i[6],n[8]=-i[8],n[9]=-i[9],n[10]=-i[10],n}function _(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[4]=i[4],n[5]=i[5],n[6]=i[6],n[8]=i[8],n[9]=i[9],n[10]=i[10],n}let U=_;function z(i,p){return Math.abs(i[0]-p[0])<Q&&Math.abs(i[1]-p[1])<Q&&Math.abs(i[2]-p[2])<Q&&Math.abs(i[4]-p[4])<Q&&Math.abs(i[5]-p[5])<Q&&Math.abs(i[6]-p[6])<Q&&Math.abs(i[8]-p[8])<Q&&Math.abs(i[9]-p[9])<Q&&Math.abs(i[10]-p[10])<Q}function R(i,p){return i[0]===p[0]&&i[1]===p[1]&&i[2]===p[2]&&i[4]===p[4]&&i[5]===p[5]&&i[6]===p[6]&&i[8]===p[8]&&i[9]===p[9]&&i[10]===p[10]}function X(i){let p=i??new s(12);return p[0]=1,p[1]=0,p[2]=0,p[4]=0,p[5]=1,p[6]=0,p[8]=0,p[9]=0,p[10]=1,p}function Y(i,p){let n=p??new s(12);if(n===i){let g;return g=i[1],i[1]=i[4],i[4]=g,g=i[2],i[2]=i[8],i[8]=g,g=i[6],i[6]=i[9],i[9]=g,n}let c=i[0*4+0],d=i[0*4+1],h=i[0*4+2],M=i[1*4+0],t=i[1*4+1],a=i[1*4+2],e=i[2*4+0],o=i[2*4+1],l=i[2*4+2];return n[0]=c,n[1]=M,n[2]=e,n[4]=d,n[5]=t,n[6]=o,n[8]=h,n[9]=a,n[10]=l,n}function H(i,p){let n=p??new s(12),c=i[0*4+0],d=i[0*4+1],h=i[0*4+2],M=i[1*4+0],t=i[1*4+1],a=i[1*4+2],e=i[2*4+0],o=i[2*4+1],l=i[2*4+2],g=l*t-a*o,D=-l*M+a*e,u=o*M-t*e,f=1/(c*g+d*D+h*u);return n[0]=g*f,n[1]=(-l*d+h*o)*f,n[2]=(a*d-h*t)*f,n[4]=D*f,n[5]=(l*c-h*e)*f,n[6]=(-a*c+h*M)*f,n[8]=u*f,n[9]=(-o*c+d*e)*f,n[10]=(t*c-d*M)*f,n}function F(i){let p=i[0],n=i[0*4+1],c=i[0*4+2],d=i[1*4+0],h=i[1*4+1],M=i[1*4+2],t=i[2*4+0],a=i[2*4+1],e=i[2*4+2];return p*(h*e-a*M)-d*(n*e-a*c)+t*(n*M-h*c)}let nt=H;function rt(i,p,n){let c=n??new s(12),d=i[0],h=i[1],M=i[2],t=i[4],a=i[5],e=i[6],o=i[8],l=i[9],g=i[10],D=p[0],u=p[1],f=p[2],w=p[4],x=p[5],y=p[6],b=p[8],S=p[9],I=p[10];return c[0]=d*D+t*u+o*f,c[1]=h*D+a*u+l*f,c[2]=M*D+e*u+g*f,c[4]=d*w+t*x+o*y,c[5]=h*w+a*x+l*y,c[6]=M*w+e*x+g*y,c[8]=d*b+t*S+o*I,c[9]=h*b+a*S+l*I,c[10]=M*b+e*S+g*I,c}let W=rt;function et(i,p,n){let c=n??X();return i!==c&&(c[0]=i[0],c[1]=i[1],c[2]=i[2],c[4]=i[4],c[5]=i[5],c[6]=i[6]),c[8]=p[0],c[9]=p[1],c[10]=1,c}function Bt(i,p){let n=p??r.create();return n[0]=i[8],n[1]=i[9],n}function gt(i,p,n){let c=n??r.create(),d=p*4;return c[0]=i[d+0],c[1]=i[d+1],c}function xt(i,p,n,c){let d=c===i?i:_(i,c),h=n*4;return d[h+0]=p[0],d[h+1]=p[1],d}function Mt(i,p){let n=p??r.create(),c=i[0],d=i[1],h=i[4],M=i[5];return n[0]=Math.sqrt(c*c+d*d),n[1]=Math.sqrt(h*h+M*M),n}function mt(i,p){let n=p??m.create(),c=i[0],d=i[1],h=i[2],M=i[4],t=i[5],a=i[6],e=i[8],o=i[9],l=i[10];return n[0]=Math.sqrt(c*c+d*d+h*h),n[1]=Math.sqrt(M*M+t*t+a*a),n[2]=Math.sqrt(e*e+o*o+l*l),n}function Dt(i,p){let n=p??new s(12);return n[0]=1,n[1]=0,n[2]=0,n[4]=0,n[5]=1,n[6]=0,n[8]=i[0],n[9]=i[1],n[10]=1,n}function C(i,p,n){let c=n??new s(12),d=p[0],h=p[1],M=i[0],t=i[1],a=i[2],e=i[1*4+0],o=i[1*4+1],l=i[1*4+2],g=i[2*4+0],D=i[2*4+1],u=i[2*4+2];return i!==c&&(c[0]=M,c[1]=t,c[2]=a,c[4]=e,c[5]=o,c[6]=l),c[8]=M*d+e*h+g,c[9]=t*d+o*h+D,c[10]=a*d+l*h+u,c}function _t(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=c,n[1]=d,n[2]=0,n[4]=-d,n[5]=c,n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function q(i,p,n){let c=n??new s(12),d=i[0*4+0],h=i[0*4+1],M=i[0*4+2],t=i[1*4+0],a=i[1*4+1],e=i[1*4+2],o=Math.cos(p),l=Math.sin(p);return c[0]=o*d+l*t,c[1]=o*h+l*a,c[2]=o*M+l*e,c[4]=o*t-l*d,c[5]=o*a-l*h,c[6]=o*e-l*M,i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function $(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=1,n[1]=0,n[2]=0,n[4]=0,n[5]=c,n[6]=d,n[8]=0,n[9]=-d,n[10]=c,n}function O(i,p,n){let c=n??new s(12),d=i[4],h=i[5],M=i[6],t=i[8],a=i[9],e=i[10],o=Math.cos(p),l=Math.sin(p);return c[4]=o*d+l*t,c[5]=o*h+l*a,c[6]=o*M+l*e,c[8]=o*t-l*d,c[9]=o*a-l*h,c[10]=o*e-l*M,i!==c&&(c[0]=i[0],c[1]=i[1],c[2]=i[2]),c}function Ut(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=c,n[1]=0,n[2]=-d,n[4]=0,n[5]=1,n[6]=0,n[8]=d,n[9]=0,n[10]=c,n}function lt(i,p,n){let c=n??new s(12),d=i[0*4+0],h=i[0*4+1],M=i[0*4+2],t=i[2*4+0],a=i[2*4+1],e=i[2*4+2],o=Math.cos(p),l=Math.sin(p);return c[0]=o*d-l*t,c[1]=o*h-l*a,c[2]=o*M-l*e,c[8]=o*t+l*d,c[9]=o*a+l*h,c[10]=o*e+l*M,i!==c&&(c[4]=i[4],c[5]=i[5],c[6]=i[6]),c}let Et=_t,ft=q;function It(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=0,n[2]=0,n[4]=0,n[5]=i[1],n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function j(i,p,n){let c=n??new s(12),d=p[0],h=p[1];return c[0]=d*i[0*4+0],c[1]=d*i[0*4+1],c[2]=d*i[0*4+2],c[4]=h*i[1*4+0],c[5]=h*i[1*4+1],c[6]=h*i[1*4+2],i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function Lt(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=0,n[2]=0,n[4]=0,n[5]=i[1],n[6]=0,n[8]=0,n[9]=0,n[10]=i[2],n}function vt(i,p,n){let c=n??new s(12),d=p[0],h=p[1],M=p[2];return c[0]=d*i[0*4+0],c[1]=d*i[0*4+1],c[2]=d*i[0*4+2],c[4]=h*i[1*4+0],c[5]=h*i[1*4+1],c[6]=h*i[1*4+2],c[8]=M*i[2*4+0],c[9]=M*i[2*4+1],c[10]=M*i[2*4+2],c}function At(i,p){let n=p??new s(12);return n[0]=i,n[1]=0,n[2]=0,n[4]=0,n[5]=i,n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function yt(i,p,n){let c=n??new s(12);return c[0]=p*i[0*4+0],c[1]=p*i[0*4+1],c[2]=p*i[0*4+2],c[4]=p*i[1*4+0],c[5]=p*i[1*4+1],c[6]=p*i[1*4+2],i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function zt(i,p){let n=p??new s(12);return n[0]=i,n[1]=0,n[2]=0,n[4]=0,n[5]=i,n[6]=0,n[8]=0,n[9]=0,n[10]=i,n}function bt(i,p,n){let c=n??new s(12);return c[0]=p*i[0*4+0],c[1]=p*i[0*4+1],c[2]=p*i[0*4+2],c[4]=p*i[1*4+0],c[5]=p*i[1*4+1],c[6]=p*i[1*4+2],c[8]=p*i[2*4+0],c[9]=p*i[2*4+1],c[10]=p*i[2*4+2],c}return{clone:U,create:v,set:P,fromMat4:T,fromQuat:B,negate:G,copy:_,equalsApproximately:z,equals:R,identity:X,transpose:Y,inverse:H,invert:nt,determinant:F,mul:W,multiply:rt,setTranslation:et,getTranslation:Bt,getAxis:gt,setAxis:xt,getScaling:Mt,get3DScaling:mt,translation:Dt,translate:C,rotation:_t,rotate:q,rotationX:$,rotateX:O,rotationY:Ut,rotateY:lt,rotationZ:Et,rotateZ:ft,scaling:It,scale:j,uniformScaling:At,uniformScale:yt,scaling3D:Lt,scale3D:vt,uniformScaling3D:zt,uniformScale3D:bt}}var ke=new Map;function lr(s){let r=ke.get(s);return r||(r=ur(s),ke.set(s,r)),r}function fr(s){let r=fe(s);function m(t,a,e,o,l,g,D,u,f,w,x,y,b,S,I,A){let E=new s(16);return t!==void 0&&(E[0]=t,a!==void 0&&(E[1]=a,e!==void 0&&(E[2]=e,o!==void 0&&(E[3]=o,l!==void 0&&(E[4]=l,g!==void 0&&(E[5]=g,D!==void 0&&(E[6]=D,u!==void 0&&(E[7]=u,f!==void 0&&(E[8]=f,w!==void 0&&(E[9]=w,x!==void 0&&(E[10]=x,y!==void 0&&(E[11]=y,b!==void 0&&(E[12]=b,S!==void 0&&(E[13]=S,I!==void 0&&(E[14]=I,A!==void 0&&(E[15]=A)))))))))))))))),E}function v(t,a,e,o,l,g,D,u,f,w,x,y,b,S,I,A,E){let L=E??new s(16);return L[0]=t,L[1]=a,L[2]=e,L[3]=o,L[4]=l,L[5]=g,L[6]=D,L[7]=u,L[8]=f,L[9]=w,L[10]=x,L[11]=y,L[12]=b,L[13]=S,L[14]=I,L[15]=A,L}function P(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=0,e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=0,e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function T(t,a){let e=a??new s(16),o=t[0],l=t[1],g=t[2],D=t[3],u=o+o,f=l+l,w=g+g,x=o*u,y=l*u,b=l*f,S=g*u,I=g*f,A=g*w,E=D*u,L=D*f,V=D*w;return e[0]=1-b-A,e[1]=y+V,e[2]=S-L,e[3]=0,e[4]=y-V,e[5]=1-x-A,e[6]=I+E,e[7]=0,e[8]=S+L,e[9]=I-E,e[10]=1-x-b,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function B(t,a){let e=a??new s(16);return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=-t[3],e[4]=-t[4],e[5]=-t[5],e[6]=-t[6],e[7]=-t[7],e[8]=-t[8],e[9]=-t[9],e[10]=-t[10],e[11]=-t[11],e[12]=-t[12],e[13]=-t[13],e[14]=-t[14],e[15]=-t[15],e}function G(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}let _=G;function U(t,a){return Math.abs(t[0]-a[0])<Q&&Math.abs(t[1]-a[1])<Q&&Math.abs(t[2]-a[2])<Q&&Math.abs(t[3]-a[3])<Q&&Math.abs(t[4]-a[4])<Q&&Math.abs(t[5]-a[5])<Q&&Math.abs(t[6]-a[6])<Q&&Math.abs(t[7]-a[7])<Q&&Math.abs(t[8]-a[8])<Q&&Math.abs(t[9]-a[9])<Q&&Math.abs(t[10]-a[10])<Q&&Math.abs(t[11]-a[11])<Q&&Math.abs(t[12]-a[12])<Q&&Math.abs(t[13]-a[13])<Q&&Math.abs(t[14]-a[14])<Q&&Math.abs(t[15]-a[15])<Q}function z(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]&&t[4]===a[4]&&t[5]===a[5]&&t[6]===a[6]&&t[7]===a[7]&&t[8]===a[8]&&t[9]===a[9]&&t[10]===a[10]&&t[11]===a[11]&&t[12]===a[12]&&t[13]===a[13]&&t[14]===a[14]&&t[15]===a[15]}function R(t){let a=t??new s(16);return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=1,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a}function X(t,a){let e=a??new s(16);if(e===t){let N;return N=t[1],t[1]=t[4],t[4]=N,N=t[2],t[2]=t[8],t[8]=N,N=t[3],t[3]=t[12],t[12]=N,N=t[6],t[6]=t[9],t[9]=N,N=t[7],t[7]=t[13],t[13]=N,N=t[11],t[11]=t[14],t[14]=N,e}let o=t[0*4+0],l=t[0*4+1],g=t[0*4+2],D=t[0*4+3],u=t[1*4+0],f=t[1*4+1],w=t[1*4+2],x=t[1*4+3],y=t[2*4+0],b=t[2*4+1],S=t[2*4+2],I=t[2*4+3],A=t[3*4+0],E=t[3*4+1],L=t[3*4+2],V=t[3*4+3];return e[0]=o,e[1]=u,e[2]=y,e[3]=A,e[4]=l,e[5]=f,e[6]=b,e[7]=E,e[8]=g,e[9]=w,e[10]=S,e[11]=L,e[12]=D,e[13]=x,e[14]=I,e[15]=V,e}function Y(t,a){let e=a??new s(16),o=t[0*4+0],l=t[0*4+1],g=t[0*4+2],D=t[0*4+3],u=t[1*4+0],f=t[1*4+1],w=t[1*4+2],x=t[1*4+3],y=t[2*4+0],b=t[2*4+1],S=t[2*4+2],I=t[2*4+3],A=t[3*4+0],E=t[3*4+1],L=t[3*4+2],V=t[3*4+3],N=S*V,Z=L*I,K=w*V,J=L*x,tt=w*I,ot=S*x,st=g*V,it=L*D,ct=g*I,at=S*D,dt=g*x,pt=w*D,ht=y*E,wt=A*b,Tt=u*E,St=A*f,Pt=u*b,$t=y*f,Xt=o*E,Ht=A*l,Wt=o*b,jt=y*l,Zt=o*f,Qt=u*l,te=N*f+J*b+tt*E-(Z*f+K*b+ot*E),ee=Z*l+st*b+at*E-(N*l+it*b+ct*E),ne=K*l+it*f+dt*E-(J*l+st*f+pt*E),re=ot*l+ct*f+pt*b-(tt*l+at*f+dt*b),ut=1/(o*te+u*ee+y*ne+A*re);return e[0]=ut*te,e[1]=ut*ee,e[2]=ut*ne,e[3]=ut*re,e[4]=ut*(Z*u+K*y+ot*A-(N*u+J*y+tt*A)),e[5]=ut*(N*o+it*y+ct*A-(Z*o+st*y+at*A)),e[6]=ut*(J*o+st*u+pt*A-(K*o+it*u+dt*A)),e[7]=ut*(tt*o+at*u+dt*y-(ot*o+ct*u+pt*y)),e[8]=ut*(ht*x+St*I+Pt*V-(wt*x+Tt*I+$t*V)),e[9]=ut*(wt*D+Xt*I+jt*V-(ht*D+Ht*I+Wt*V)),e[10]=ut*(Tt*D+Ht*x+Zt*V-(St*D+Xt*x+Qt*V)),e[11]=ut*($t*D+Wt*x+Qt*I-(Pt*D+jt*x+Zt*I)),e[12]=ut*(Tt*S+$t*L+wt*w-(Pt*L+ht*w+St*S)),e[13]=ut*(Wt*L+ht*g+Ht*S-(Xt*S+jt*L+wt*g)),e[14]=ut*(Xt*w+Qt*L+St*g-(Zt*L+Tt*g+Ht*w)),e[15]=ut*(Zt*S+Pt*g+jt*w-(Wt*w+Qt*S+$t*g)),e}function H(t){let a=t[0],e=t[0*4+1],o=t[0*4+2],l=t[0*4+3],g=t[1*4+0],D=t[1*4+1],u=t[1*4+2],f=t[1*4+3],w=t[2*4+0],x=t[2*4+1],y=t[2*4+2],b=t[2*4+3],S=t[3*4+0],I=t[3*4+1],A=t[3*4+2],E=t[3*4+3],L=y*E,V=A*b,N=u*E,Z=A*f,K=u*b,J=y*f,tt=o*E,ot=A*l,st=o*b,it=y*l,ct=o*f,at=u*l,dt=L*D+Z*x+K*I-(V*D+N*x+J*I),pt=V*e+tt*x+it*I-(L*e+ot*x+st*I),ht=N*e+ot*D+ct*I-(Z*e+tt*D+at*I),wt=J*e+st*D+at*x-(K*e+it*D+ct*x);return a*dt+g*pt+w*ht+S*wt}let F=Y;function nt(t,a,e){let o=e??new s(16),l=t[0],g=t[1],D=t[2],u=t[3],f=t[4],w=t[5],x=t[6],y=t[7],b=t[8],S=t[9],I=t[10],A=t[11],E=t[12],L=t[13],V=t[14],N=t[15],Z=a[0],K=a[1],J=a[2],tt=a[3],ot=a[4],st=a[5],it=a[6],ct=a[7],at=a[8],dt=a[9],pt=a[10],ht=a[11],wt=a[12],Tt=a[13],St=a[14],Pt=a[15];return o[0]=l*Z+f*K+b*J+E*tt,o[1]=g*Z+w*K+S*J+L*tt,o[2]=D*Z+x*K+I*J+V*tt,o[3]=u*Z+y*K+A*J+N*tt,o[4]=l*ot+f*st+b*it+E*ct,o[5]=g*ot+w*st+S*it+L*ct,o[6]=D*ot+x*st+I*it+V*ct,o[7]=u*ot+y*st+A*it+N*ct,o[8]=l*at+f*dt+b*pt+E*ht,o[9]=g*at+w*dt+S*pt+L*ht,o[10]=D*at+x*dt+I*pt+V*ht,o[11]=u*at+y*dt+A*pt+N*ht,o[12]=l*wt+f*Tt+b*St+E*Pt,o[13]=g*wt+w*Tt+S*St+L*Pt,o[14]=D*wt+x*Tt+I*St+V*Pt,o[15]=u*wt+y*Tt+A*St+N*Pt,o}let rt=nt;function W(t,a,e){let o=e??R();return t!==o&&(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=t[3],o[4]=t[4],o[5]=t[5],o[6]=t[6],o[7]=t[7],o[8]=t[8],o[9]=t[9],o[10]=t[10],o[11]=t[11]),o[12]=a[0],o[13]=a[1],o[14]=a[2],o[15]=1,o}function et(t,a){let e=a??r.create();return e[0]=t[12],e[1]=t[13],e[2]=t[14],e}function Bt(t,a,e){let o=e??r.create(),l=a*4;return o[0]=t[l+0],o[1]=t[l+1],o[2]=t[l+2],o}function gt(t,a,e,o){let l=o===t?o:G(t,o),g=e*4;return l[g+0]=a[0],l[g+1]=a[1],l[g+2]=a[2],l}function xt(t,a){let e=a??r.create(),o=t[0],l=t[1],g=t[2],D=t[4],u=t[5],f=t[6],w=t[8],x=t[9],y=t[10];return e[0]=Math.sqrt(o*o+l*l+g*g),e[1]=Math.sqrt(D*D+u*u+f*f),e[2]=Math.sqrt(w*w+x*x+y*y),e}function Mt(t,a,e,o,l){let g=l??new s(16),D=Math.tan(Math.PI*.5-.5*t);if(g[0]=D/a,g[1]=0,g[2]=0,g[3]=0,g[4]=0,g[5]=D,g[6]=0,g[7]=0,g[8]=0,g[9]=0,g[11]=-1,g[12]=0,g[13]=0,g[15]=0,Number.isFinite(o)){let u=1/(e-o);g[10]=o*u,g[14]=o*e*u}else g[10]=-1,g[14]=-e;return g}function mt(t,a,e,o=1/0,l){let g=l??new s(16),D=1/Math.tan(t*.5);if(g[0]=D/a,g[1]=0,g[2]=0,g[3]=0,g[4]=0,g[5]=D,g[6]=0,g[7]=0,g[8]=0,g[9]=0,g[11]=-1,g[12]=0,g[13]=0,g[15]=0,o===1/0)g[10]=0,g[14]=e;else{let u=1/(o-e);g[10]=e*u,g[14]=o*e*u}return g}function Dt(t,a,e,o,l,g,D){let u=D??new s(16);return u[0]=2/(a-t),u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2/(o-e),u[6]=0,u[7]=0,u[8]=0,u[9]=0,u[10]=1/(l-g),u[11]=0,u[12]=(a+t)/(t-a),u[13]=(o+e)/(e-o),u[14]=l/(l-g),u[15]=1,u}function C(t,a,e,o,l,g,D){let u=D??new s(16),f=a-t,w=o-e,x=l-g;return u[0]=2*l/f,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2*l/w,u[6]=0,u[7]=0,u[8]=(t+a)/f,u[9]=(o+e)/w,u[10]=g/x,u[11]=-1,u[12]=0,u[13]=0,u[14]=l*g/x,u[15]=0,u}function _t(t,a,e,o,l,g=1/0,D){let u=D??new s(16),f=a-t,w=o-e;if(u[0]=2*l/f,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2*l/w,u[6]=0,u[7]=0,u[8]=(t+a)/f,u[9]=(o+e)/w,u[11]=-1,u[12]=0,u[13]=0,u[15]=0,g===1/0)u[10]=0,u[14]=l;else{let x=1/(g-l);u[10]=l*x,u[14]=g*l*x}return u}let q=r.create(),$=r.create(),O=r.create();function Ut(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(a,t,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=q[1],l[2]=q[2],l[3]=0,l[4]=$[0],l[5]=$[1],l[6]=$[2],l[7]=0,l[8]=O[0],l[9]=O[1],l[10]=O[2],l[11]=0,l[12]=t[0],l[13]=t[1],l[14]=t[2],l[15]=1,l}function lt(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(t,a,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=q[1],l[2]=q[2],l[3]=0,l[4]=$[0],l[5]=$[1],l[6]=$[2],l[7]=0,l[8]=O[0],l[9]=O[1],l[10]=O[2],l[11]=0,l[12]=t[0],l[13]=t[1],l[14]=t[2],l[15]=1,l}function Et(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(t,a,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=$[0],l[2]=O[0],l[3]=0,l[4]=q[1],l[5]=$[1],l[6]=O[1],l[7]=0,l[8]=q[2],l[9]=$[2],l[10]=O[2],l[11]=0,l[12]=-(q[0]*t[0]+q[1]*t[1]+q[2]*t[2]),l[13]=-($[0]*t[0]+$[1]*t[1]+$[2]*t[2]),l[14]=-(O[0]*t[0]+O[1]*t[1]+O[2]*t[2]),l[15]=1,l}function ft(t,a){let e=a??new s(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e}function It(t,a,e){let o=e??new s(16),l=a[0],g=a[1],D=a[2],u=t[0],f=t[1],w=t[2],x=t[3],y=t[1*4+0],b=t[1*4+1],S=t[1*4+2],I=t[1*4+3],A=t[2*4+0],E=t[2*4+1],L=t[2*4+2],V=t[2*4+3],N=t[3*4+0],Z=t[3*4+1],K=t[3*4+2],J=t[3*4+3];return t!==o&&(o[0]=u,o[1]=f,o[2]=w,o[3]=x,o[4]=y,o[5]=b,o[6]=S,o[7]=I,o[8]=A,o[9]=E,o[10]=L,o[11]=V),o[12]=u*l+y*g+A*D+N,o[13]=f*l+b*g+E*D+Z,o[14]=w*l+S*g+L*D+K,o[15]=x*l+I*g+V*D+J,o}function j(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=o,e[6]=l,e[7]=0,e[8]=0,e[9]=-l,e[10]=o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Lt(t,a,e){let o=e??new s(16),l=t[4],g=t[5],D=t[6],u=t[7],f=t[8],w=t[9],x=t[10],y=t[11],b=Math.cos(a),S=Math.sin(a);return o[4]=b*l+S*f,o[5]=b*g+S*w,o[6]=b*D+S*x,o[7]=b*u+S*y,o[8]=b*f-S*l,o[9]=b*w-S*g,o[10]=b*x-S*D,o[11]=b*y-S*u,t!==o&&(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=t[3],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function vt(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=o,e[1]=0,e[2]=-l,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=l,e[9]=0,e[10]=o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function At(t,a,e){let o=e??new s(16),l=t[0*4+0],g=t[0*4+1],D=t[0*4+2],u=t[0*4+3],f=t[2*4+0],w=t[2*4+1],x=t[2*4+2],y=t[2*4+3],b=Math.cos(a),S=Math.sin(a);return o[0]=b*l-S*f,o[1]=b*g-S*w,o[2]=b*D-S*x,o[3]=b*u-S*y,o[8]=b*f+S*l,o[9]=b*w+S*g,o[10]=b*x+S*D,o[11]=b*y+S*u,t!==o&&(o[4]=t[4],o[5]=t[5],o[6]=t[6],o[7]=t[7],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function yt(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=o,e[1]=l,e[2]=0,e[3]=0,e[4]=-l,e[5]=o,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function zt(t,a,e){let o=e??new s(16),l=t[0*4+0],g=t[0*4+1],D=t[0*4+2],u=t[0*4+3],f=t[1*4+0],w=t[1*4+1],x=t[1*4+2],y=t[1*4+3],b=Math.cos(a),S=Math.sin(a);return o[0]=b*l+S*f,o[1]=b*g+S*w,o[2]=b*D+S*x,o[3]=b*u+S*y,o[4]=b*f-S*l,o[5]=b*w-S*g,o[6]=b*x-S*D,o[7]=b*y-S*u,t!==o&&(o[8]=t[8],o[9]=t[9],o[10]=t[10],o[11]=t[11],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function bt(t,a,e){let o=e??new s(16),l=t[0],g=t[1],D=t[2],u=Math.sqrt(l*l+g*g+D*D);l/=u,g/=u,D/=u;let f=l*l,w=g*g,x=D*D,y=Math.cos(a),b=Math.sin(a),S=1-y;return o[0]=f+(1-f)*y,o[1]=l*g*S+D*b,o[2]=l*D*S-g*b,o[3]=0,o[4]=l*g*S-D*b,o[5]=w+(1-w)*y,o[6]=g*D*S+l*b,o[7]=0,o[8]=l*D*S+g*b,o[9]=g*D*S-l*b,o[10]=x+(1-x)*y,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o}let i=bt;function p(t,a,e,o){let l=o??new s(16),g=a[0],D=a[1],u=a[2],f=Math.sqrt(g*g+D*D+u*u);g/=f,D/=f,u/=f;let w=g*g,x=D*D,y=u*u,b=Math.cos(e),S=Math.sin(e),I=1-b,A=w+(1-w)*b,E=g*D*I+u*S,L=g*u*I-D*S,V=g*D*I-u*S,N=x+(1-x)*b,Z=D*u*I+g*S,K=g*u*I+D*S,J=D*u*I-g*S,tt=y+(1-y)*b,ot=t[0],st=t[1],it=t[2],ct=t[3],at=t[4],dt=t[5],pt=t[6],ht=t[7],wt=t[8],Tt=t[9],St=t[10],Pt=t[11];return l[0]=A*ot+E*at+L*wt,l[1]=A*st+E*dt+L*Tt,l[2]=A*it+E*pt+L*St,l[3]=A*ct+E*ht+L*Pt,l[4]=V*ot+N*at+Z*wt,l[5]=V*st+N*dt+Z*Tt,l[6]=V*it+N*pt+Z*St,l[7]=V*ct+N*ht+Z*Pt,l[8]=K*ot+J*at+tt*wt,l[9]=K*st+J*dt+tt*Tt,l[10]=K*it+J*pt+tt*St,l[11]=K*ct+J*ht+tt*Pt,t!==l&&(l[12]=t[12],l[13]=t[13],l[14]=t[14],l[15]=t[15]),l}let n=p;function c(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t[1],e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t[2],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function d(t,a,e){let o=e??new s(16),l=a[0],g=a[1],D=a[2];return o[0]=l*t[0*4+0],o[1]=l*t[0*4+1],o[2]=l*t[0*4+2],o[3]=l*t[0*4+3],o[4]=g*t[1*4+0],o[5]=g*t[1*4+1],o[6]=g*t[1*4+2],o[7]=g*t[1*4+3],o[8]=D*t[2*4+0],o[9]=D*t[2*4+1],o[10]=D*t[2*4+2],o[11]=D*t[2*4+3],t!==o&&(o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function h(t,a){let e=a??new s(16);return e[0]=t,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function M(t,a,e){let o=e??new s(16);return o[0]=a*t[0*4+0],o[1]=a*t[0*4+1],o[2]=a*t[0*4+2],o[3]=a*t[0*4+3],o[4]=a*t[1*4+0],o[5]=a*t[1*4+1],o[6]=a*t[1*4+2],o[7]=a*t[1*4+3],o[8]=a*t[2*4+0],o[9]=a*t[2*4+1],o[10]=a*t[2*4+2],o[11]=a*t[2*4+3],t!==o&&(o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}return{create:m,set:v,fromMat3:P,fromQuat:T,negate:B,copy:G,clone:_,equalsApproximately:U,equals:z,identity:R,transpose:X,inverse:Y,determinant:H,invert:F,multiply:nt,mul:rt,setTranslation:W,getTranslation:et,getAxis:Bt,setAxis:gt,getScaling:xt,perspective:Mt,perspectiveReverseZ:mt,ortho:Dt,frustum:C,frustumReverseZ:_t,aim:Ut,cameraAim:lt,lookAt:Et,translation:ft,translate:It,rotationX:j,rotateX:Lt,rotationY:vt,rotateY:At,rotationZ:yt,rotateZ:zt,axisRotation:bt,rotation:i,axisRotate:p,rotate:n,scaling:c,scale:d,uniformScaling:h,uniformScale:M}}var Ke=new Map;function dr(s){let r=Ke.get(s);return r||(r=fr(s),Ke.set(s,r)),r}function pr(s){let r=fe(s);function m(i,p,n,c){let d=new s(4);return i!==void 0&&(d[0]=i,p!==void 0&&(d[1]=p,n!==void 0&&(d[2]=n,c!==void 0&&(d[3]=c)))),d}let v=m;function P(i,p,n,c,d){let h=d??new s(4);return h[0]=i,h[1]=p,h[2]=n,h[3]=c,h}function T(i,p,n){let c=n??new s(4),d=p*.5,h=Math.sin(d);return c[0]=h*i[0],c[1]=h*i[1],c[2]=h*i[2],c[3]=Math.cos(d),c}function B(i,p){let n=p??r.create(3),c=Math.acos(i[3])*2,d=Math.sin(c*.5);return d>Q?(n[0]=i[0]/d,n[1]=i[1]/d,n[2]=i[2]/d):(n[0]=1,n[1]=0,n[2]=0),{angle:c,axis:n}}function G(i,p){let n=C(i,p);return Math.acos(2*n*n-1)}function _(i,p,n){let c=n??new s(4),d=i[0],h=i[1],M=i[2],t=i[3],a=p[0],e=p[1],o=p[2],l=p[3];return c[0]=d*l+t*a+h*o-M*e,c[1]=h*l+t*e+M*a-d*o,c[2]=M*l+t*o+d*e-h*a,c[3]=t*l-d*a-h*e-M*o,c}let U=_;function z(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o+a*e,c[1]=M*o+t*e,c[2]=t*o-M*e,c[3]=a*o-h*e,c}function R(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o-t*e,c[1]=M*o+a*e,c[2]=t*o+h*e,c[3]=a*o-M*e,c}function X(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o+M*e,c[1]=M*o-h*e,c[2]=t*o+a*e,c[3]=a*o-t*e,c}function Y(i,p,n,c){let d=c??new s(4),h=i[0],M=i[1],t=i[2],a=i[3],e=p[0],o=p[1],l=p[2],g=p[3],D=h*e+M*o+t*l+a*g;D<0&&(D=-D,e=-e,o=-o,l=-l,g=-g);let u,f;if(1-D>Q){let w=Math.acos(D),x=Math.sin(w);u=Math.sin((1-n)*w)/x,f=Math.sin(n*w)/x}else u=1-n,f=n;return d[0]=u*h+f*e,d[1]=u*M+f*o,d[2]=u*t+f*l,d[3]=u*a+f*g,d}function H(i,p){let n=p??new s(4),c=i[0],d=i[1],h=i[2],M=i[3],t=c*c+d*d+h*h+M*M,a=t?1/t:0;return n[0]=-c*a,n[1]=-d*a,n[2]=-h*a,n[3]=M*a,n}function F(i,p){let n=p??new s(4);return n[0]=-i[0],n[1]=-i[1],n[2]=-i[2],n[3]=i[3],n}function nt(i,p){let n=p??new s(4),c=i[0]+i[5]+i[10];if(c>0){let d=Math.sqrt(c+1);n[3]=.5*d;let h=.5/d;n[0]=(i[6]-i[9])*h,n[1]=(i[8]-i[2])*h,n[2]=(i[1]-i[4])*h}else{let d=0;i[5]>i[0]&&(d=1),i[10]>i[d*4+d]&&(d=2);let h=(d+1)%3,M=(d+2)%3,t=Math.sqrt(i[d*4+d]-i[h*4+h]-i[M*4+M]+1);n[d]=.5*t;let a=.5/t;n[3]=(i[h*4+M]-i[M*4+h])*a,n[h]=(i[h*4+d]+i[d*4+h])*a,n[M]=(i[M*4+d]+i[d*4+M])*a}return n}function rt(i,p,n,c,d){let h=d??new s(4),M=i*.5,t=p*.5,a=n*.5,e=Math.sin(M),o=Math.cos(M),l=Math.sin(t),g=Math.cos(t),D=Math.sin(a),u=Math.cos(a);switch(c){case"xyz":h[0]=e*g*u+o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u-e*l*D;break;case"xzy":h[0]=e*g*u-o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u+e*l*D;break;case"yxz":h[0]=e*g*u+o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u+e*l*D;break;case"yzx":h[0]=e*g*u+o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u-e*l*D;break;case"zxy":h[0]=e*g*u-o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u-e*l*D;break;case"zyx":h[0]=e*g*u-o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u+e*l*D;break;default:throw new Error(`Unknown rotation order: ${c}`)}return h}function W(i,p){let n=p??new s(4);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[3]=i[3],n}let et=W;function Bt(i,p,n){let c=n??new s(4);return c[0]=i[0]+p[0],c[1]=i[1]+p[1],c[2]=i[2]+p[2],c[3]=i[3]+p[3],c}function gt(i,p,n){let c=n??new s(4);return c[0]=i[0]-p[0],c[1]=i[1]-p[1],c[2]=i[2]-p[2],c[3]=i[3]-p[3],c}let xt=gt;function Mt(i,p,n){let c=n??new s(4);return c[0]=i[0]*p,c[1]=i[1]*p,c[2]=i[2]*p,c[3]=i[3]*p,c}let mt=Mt;function Dt(i,p,n){let c=n??new s(4);return c[0]=i[0]/p,c[1]=i[1]/p,c[2]=i[2]/p,c[3]=i[3]/p,c}function C(i,p){return i[0]*p[0]+i[1]*p[1]+i[2]*p[2]+i[3]*p[3]}function _t(i,p,n,c){let d=c??new s(4);return d[0]=i[0]+n*(p[0]-i[0]),d[1]=i[1]+n*(p[1]-i[1]),d[2]=i[2]+n*(p[2]-i[2]),d[3]=i[3]+n*(p[3]-i[3]),d}function q(i){let p=i[0],n=i[1],c=i[2],d=i[3];return Math.sqrt(p*p+n*n+c*c+d*d)}let $=q;function O(i){let p=i[0],n=i[1],c=i[2],d=i[3];return p*p+n*n+c*c+d*d}let Ut=O;function lt(i,p){let n=p??new s(4),c=i[0],d=i[1],h=i[2],M=i[3],t=Math.sqrt(c*c+d*d+h*h+M*M);return t>1e-5?(n[0]=c/t,n[1]=d/t,n[2]=h/t,n[3]=M/t):(n[0]=0,n[1]=0,n[2]=0,n[3]=1),n}function Et(i,p){return Math.abs(i[0]-p[0])<Q&&Math.abs(i[1]-p[1])<Q&&Math.abs(i[2]-p[2])<Q&&Math.abs(i[3]-p[3])<Q}function ft(i,p){return i[0]===p[0]&&i[1]===p[1]&&i[2]===p[2]&&i[3]===p[3]}function It(i){let p=i??new s(4);return p[0]=0,p[1]=0,p[2]=0,p[3]=1,p}let j=r.create(),Lt=r.create(),vt=r.create();function At(i,p,n){let c=n??new s(4),d=r.dot(i,p);return d<-.999999?(r.cross(Lt,i,j),r.len(j)<1e-6&&r.cross(vt,i,j),r.normalize(j,j),T(j,Math.PI,c),c):d>.999999?(c[0]=0,c[1]=0,c[2]=0,c[3]=1,c):(r.cross(i,p,j),c[0]=j[0],c[1]=j[1],c[2]=j[2],c[3]=1+d,lt(c,c))}let yt=new s(4),zt=new s(4);function bt(i,p,n,c,d,h){let M=h??new s(4);return Y(i,c,d,yt),Y(p,n,d,zt),Y(yt,zt,2*d*(1-d),M),M}return{create:m,fromValues:v,set:P,fromAxisAngle:T,toAxisAngle:B,angle:G,multiply:_,mul:U,rotateX:z,rotateY:R,rotateZ:X,slerp:Y,inverse:H,conjugate:F,fromMat:nt,fromEuler:rt,copy:W,clone:et,add:Bt,subtract:gt,sub:xt,mulScalar:Mt,scale:mt,divScalar:Dt,dot:C,lerp:_t,length:q,len:$,lengthSq:O,lenSq:Ut,normalize:lt,equalsApproximately:Et,equals:ft,identity:It,rotationTo:At,sqlerp:bt}}var Je=new Map;function hr(s){let r=Je.get(s);return r||(r=pr(s),Je.set(s,r)),r}function wr(s){function r(n,c,d,h){let M=new s(4);return n!==void 0&&(M[0]=n,c!==void 0&&(M[1]=c,d!==void 0&&(M[2]=d,h!==void 0&&(M[3]=h)))),M}let m=r;function v(n,c,d,h,M){let t=M??new s(4);return t[0]=n,t[1]=c,t[2]=d,t[3]=h,t}function P(n,c){let d=c??new s(4);return d[0]=Math.ceil(n[0]),d[1]=Math.ceil(n[1]),d[2]=Math.ceil(n[2]),d[3]=Math.ceil(n[3]),d}function T(n,c){let d=c??new s(4);return d[0]=Math.floor(n[0]),d[1]=Math.floor(n[1]),d[2]=Math.floor(n[2]),d[3]=Math.floor(n[3]),d}function B(n,c){let d=c??new s(4);return d[0]=Math.round(n[0]),d[1]=Math.round(n[1]),d[2]=Math.round(n[2]),d[3]=Math.round(n[3]),d}function G(n,c=0,d=1,h){let M=h??new s(4);return M[0]=Math.min(d,Math.max(c,n[0])),M[1]=Math.min(d,Math.max(c,n[1])),M[2]=Math.min(d,Math.max(c,n[2])),M[3]=Math.min(d,Math.max(c,n[3])),M}function _(n,c,d){let h=d??new s(4);return h[0]=n[0]+c[0],h[1]=n[1]+c[1],h[2]=n[2]+c[2],h[3]=n[3]+c[3],h}function U(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+c[0]*d,M[1]=n[1]+c[1]*d,M[2]=n[2]+c[2]*d,M[3]=n[3]+c[3]*d,M}function z(n,c,d){let h=d??new s(4);return h[0]=n[0]-c[0],h[1]=n[1]-c[1],h[2]=n[2]-c[2],h[3]=n[3]-c[3],h}let R=z;function X(n,c){return Math.abs(n[0]-c[0])<Q&&Math.abs(n[1]-c[1])<Q&&Math.abs(n[2]-c[2])<Q&&Math.abs(n[3]-c[3])<Q}function Y(n,c){return n[0]===c[0]&&n[1]===c[1]&&n[2]===c[2]&&n[3]===c[3]}function H(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+d*(c[0]-n[0]),M[1]=n[1]+d*(c[1]-n[1]),M[2]=n[2]+d*(c[2]-n[2]),M[3]=n[3]+d*(c[3]-n[3]),M}function F(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+d[0]*(c[0]-n[0]),M[1]=n[1]+d[1]*(c[1]-n[1]),M[2]=n[2]+d[2]*(c[2]-n[2]),M[3]=n[3]+d[3]*(c[3]-n[3]),M}function nt(n,c,d){let h=d??new s(4);return h[0]=Math.max(n[0],c[0]),h[1]=Math.max(n[1],c[1]),h[2]=Math.max(n[2],c[2]),h[3]=Math.max(n[3],c[3]),h}function rt(n,c,d){let h=d??new s(4);return h[0]=Math.min(n[0],c[0]),h[1]=Math.min(n[1],c[1]),h[2]=Math.min(n[2],c[2]),h[3]=Math.min(n[3],c[3]),h}function W(n,c,d){let h=d??new s(4);return h[0]=n[0]*c,h[1]=n[1]*c,h[2]=n[2]*c,h[3]=n[3]*c,h}let et=W;function Bt(n,c,d){let h=d??new s(4);return h[0]=n[0]/c,h[1]=n[1]/c,h[2]=n[2]/c,h[3]=n[3]/c,h}function gt(n,c){let d=c??new s(4);return d[0]=1/n[0],d[1]=1/n[1],d[2]=1/n[2],d[3]=1/n[3],d}let xt=gt;function Mt(n,c){return n[0]*c[0]+n[1]*c[1]+n[2]*c[2]+n[3]*c[3]}function mt(n){let c=n[0],d=n[1],h=n[2],M=n[3];return Math.sqrt(c*c+d*d+h*h+M*M)}let Dt=mt;function C(n){let c=n[0],d=n[1],h=n[2],M=n[3];return c*c+d*d+h*h+M*M}let _t=C;function q(n,c){let d=n[0]-c[0],h=n[1]-c[1],M=n[2]-c[2],t=n[3]-c[3];return Math.sqrt(d*d+h*h+M*M+t*t)}let $=q;function O(n,c){let d=n[0]-c[0],h=n[1]-c[1],M=n[2]-c[2],t=n[3]-c[3];return d*d+h*h+M*M+t*t}let Ut=O;function lt(n,c){let d=c??new s(4),h=n[0],M=n[1],t=n[2],a=n[3],e=Math.sqrt(h*h+M*M+t*t+a*a);return e>1e-5?(d[0]=h/e,d[1]=M/e,d[2]=t/e,d[3]=a/e):(d[0]=0,d[1]=0,d[2]=0,d[3]=0),d}function Et(n,c){let d=c??new s(4);return d[0]=-n[0],d[1]=-n[1],d[2]=-n[2],d[3]=-n[3],d}function ft(n,c){let d=c??new s(4);return d[0]=n[0],d[1]=n[1],d[2]=n[2],d[3]=n[3],d}let It=ft;function j(n,c,d){let h=d??new s(4);return h[0]=n[0]*c[0],h[1]=n[1]*c[1],h[2]=n[2]*c[2],h[3]=n[3]*c[3],h}let Lt=j;function vt(n,c,d){let h=d??new s(4);return h[0]=n[0]/c[0],h[1]=n[1]/c[1],h[2]=n[2]/c[2],h[3]=n[3]/c[3],h}let At=vt;function yt(n){let c=n??new s(4);return c[0]=0,c[1]=0,c[2]=0,c[3]=0,c}function zt(n,c,d){let h=d??new s(4),M=n[0],t=n[1],a=n[2],e=n[3];return h[0]=c[0]*M+c[4]*t+c[8]*a+c[12]*e,h[1]=c[1]*M+c[5]*t+c[9]*a+c[13]*e,h[2]=c[2]*M+c[6]*t+c[10]*a+c[14]*e,h[3]=c[3]*M+c[7]*t+c[11]*a+c[15]*e,h}function bt(n,c,d){let h=d??new s(4);return lt(n,h),W(h,c,h)}function i(n,c,d){let h=d??new s(4);return mt(n)>c?bt(n,c,h):ft(n,h)}function p(n,c,d){let h=d??new s(4);return H(n,c,.5,h)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,subtract:z,sub:R,equalsApproximately:X,equals:Y,lerp:H,lerpV:F,max:nt,min:rt,mulScalar:W,scale:et,divScalar:Bt,inverse:gt,invert:xt,dot:Mt,length:mt,len:Dt,lengthSq:C,lenSq:_t,distance:q,dist:$,distanceSq:O,distSq:Ut,normalize:lt,negate:Et,copy:ft,clone:It,multiply:j,mul:Lt,divide:vt,div:At,zero:yt,transformMat4:zt,setLength:bt,truncate:i,midpoint:p}}var Ce=new Map;function gr(s){let r=Ce.get(s);return r||(r=wr(s),Ce.set(s,r)),r}function be(s,r,m,v,P,T){return{mat3:lr(s),mat4:dr(r),quat:hr(m),vec2:tn(v),vec3:fe(P),vec4:gr(T)}}var{mat3:No,mat4:Gt,quat:Yo,vec2:$o,vec3:Xo,vec4:Ho}=be(Float32Array,Float32Array,Float32Array,Float32Array,Float32Array,Float32Array),{mat3:Wo,mat4:jo,quat:Zo,vec2:Qo,vec3:ko,vec4:Ko}=be(Float64Array,Float64Array,Float64Array,Float64Array,Float64Array,Float64Array),{mat3:Jo,mat4:Co,quat:ts,vec2:es,vec3:ns,vec4:rs}=be(ir,Array,Array,Array,Array,Array);var de=class{device;format="r8unorm";downsizeFactor;multisample;textureSimple;textureMultisampled=null;renderPipeline;bindgroup;uniformsBuffer;trianglesBuffer;constructor(r){this.device=r.device,this.downsizeFactor=r.blurFactor,this.multisample=this.downsizeFactor>1?4:1,[this.textureSimple,this.textureMultisampled]=this.createTextures(r.width,r.height),this.trianglesBuffer=r.trianglesBuffer;let m=this.device.createShaderModule({label:"DisplacementTexture shader module",code:je});this.renderPipeline=this.device.createRenderPipeline({label:"DisplacementTexture renderpipeline",layout:"auto",vertex:{module:m,entryPoint:"main_vertex",buffers:[{attributes:[{shaderLocation:0,offset:0,format:"float32x2"}],arrayStride:2*Float32Array.BYTES_PER_ELEMENT,stepMode:"vertex"}]},fragment:{module:m,entryPoint:"main_fragment",targets:[{format:this.format}]},primitive:{cullMode:"none",topology:"triangle-list"},multisample:{count:this.multisample}}),this.uniformsBuffer=this.device.createBuffer({label:"DisplacementTexture uniforms buffer",size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.bindgroup=this.device.createBindGroup({label:"DisplacementTexture bindgroup",layout:this.renderPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.uniformsBuffer}}]})}update(r){let m=this.textureMultisampled??this.textureSimple,v={view:m.view,clearValue:[0,0,0,1],loadOp:"clear",storeOp:"store"};this.textureMultisampled&&(v.resolveTarget=this.textureSimple.view);let P=r.beginRenderPass({label:"DisplacementTexture render to texture renderpass",colorAttachments:[v]}),[T,B]=[m.texture.width,m.texture.height];P.setViewport(0,0,T,B,0,1),P.setScissorRect(0,0,T,B),P.setPipeline(this.renderPipeline),P.setBindGroup(0,this.bindgroup),P.setVertexBuffer(0,this.trianglesBuffer.bufferGpu),P.draw(3*this.trianglesBuffer.spriteCount),P.end()}resize(r,m){this.textureSimple.texture.destroy(),this.textureMultisampled?.texture.destroy(),[this.textureSimple,this.textureMultisampled]=this.createTextures(r,m)}setViewport(r){let m=[1,1,1],v=0,P=[1,1,0],T=Gt.identity();Gt.multiply(Gt.scaling(m),T,T),Gt.multiply(Gt.rotationZ(v),T,T),Gt.multiply(Gt.translation(P),T,T);let B=Gt.translation([-r.position[0],-r.position[1],0]),G=r.width/r.zoom,_=r.height/r.zoom,U=Gt.ortho(0,G,_,0,-10,10),z=Gt.identity();Gt.multiply(B,T,z),Gt.multiply(U,z,z),this.device.queue.writeBuffer(this.uniformsBuffer,0,z)}getView(){return this.textureSimple.view}destroy(){this.textureSimple.texture.destroy(),this.textureMultisampled?.texture.destroy(),this.uniformsBuffer.destroy()}createTextures(r,m){let v=this.device.createTexture({label:"DisplacementTexture texture",size:[Math.ceil(r/this.downsizeFactor),Math.ceil(m/this.downsizeFactor)],format:this.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT}),P={texture:v,view:v.createView({label:"DisplacementTexture texture view"})},T=null;if(this.multisample>1){let B=this.device.createTexture({label:"DisplacementTexture texture multisampled",size:[v.width,v.height],format:v.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT,sampleCount:this.multisample});T={texture:B,view:B.createView({label:"DisplacementTexture texture multisampled view"})}}return[P,T]}};var nn={type:"cobalt:displacement",refs:[{name:"color",type:"textureView",format:"bgra8unorm",access:"read"},{name:"map",type:"cobaltTexture",format:"bgra8unorm",access:"read"},{name:"out",type:"textureView",format:"bgra8unorm",access:"write"}],onInit:async function(s,r={}){return xr(s,r)},onRun:function(s,r,m){mr(s,r,m)},onDestroy:function(s,r){vr(r)},onResize:function(s,r){r.data.displacementTexture.resize(s.viewport.width,s.viewport.height),r.data.displacementComposition.setColorTextureView(r.refs.color.data.view),r.data.displacementComposition.setNoiseMapTextureView(r.refs.map.view),r.data.displacementComposition.setDisplacementTextureView(r.data.displacementTexture.getView())},onViewportPosition:function(s,r){r.data.displacementTexture.setViewport(s.viewport)},customFunctions:{addTriangle:function(s,r,m){return r.data.trianglesBuffer.addTriangle(m)},removeTriangle:function(s,r,m){r.data.trianglesBuffer.removeTriangle(m)},setPosition:function(s,r,m,v){r.data.trianglesBuffer.setTriangle(m,v)}}};async function xr(s,r){let{device:m}=s,v=new ue({device:m,initialParameters:{offsetX:r.options.offseyX??0,offsetY:r.options.offseyY??0,scale:r.options.scale??20}}),P=256,T=new ae({device:m,maxSpriteCount:P}),B=new de({device:m,width:s.viewport.width,height:s.viewport.height,blurFactor:8,trianglesBuffer:T}),G=new le({device:m,targetFormat:"bgra8unorm",colorTextureView:r.refs.color.data.view,noiseMapTextureView:r.refs.map.view,displacementTextureView:B.getView(),displacementParametersBuffer:v});return{displacementParameters:v,displacementTexture:B,displacementComposition:G,trianglesBuffer:T}}function mr(s,r,m){if(r.data.trianglesBuffer.spriteCount===0)return;r.data.trianglesBuffer.update(),r.data.displacementTexture.update(m);let P=m.beginRenderPass({colorAttachments:[{view:r.refs.out,clearValue:s.clearValue,loadOp:"load",storeOp:"store"}]});P.executeBundles([r.data.displacementComposition.getRenderBundle()]),P.end()}function vr(s){s.data.trianglesBuffer.destroy(),s.data.trianglesBuffer=null,s.data.displacementParameters.destroy(),s.data.displacementParameters=null,s.data.displacementTexture.destroy(),s.data.displacementTexture=null,s.data.displacementComposition.destroy(),s.data.displacementComposition=null}function Te(s,r){let m=r.vertices,v=GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,P={size:m.byteLength,usage:v,mappedAtCreation:!0},T=s.createBuffer(P);return new Float32Array(T.getMappedRange()).set(m),T.unmap(),{buffer:T,bufferLayout:{arrayStride:20,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x3",offset:0},{shaderLocation:1,format:"float32x2",offset:12}]}}}var Se="struct TransformData{view:mat4x4<f32>,projection:mat4x4<f32>};struct Sprite{translate:vec2<f32>,scale:vec2<f32>,tint:vec4<f32>,opacity:f32,rotation:f32,};struct SpritesBuffer{models:array<Sprite>,};@binding(0)@group(0)var<uniform> transformUBO:TransformData;@binding(1)@group(0)var myTexture:texture_2d<f32>;@binding(2)@group(0)var mySampler:sampler;@binding(3)@group(0)var<storage,read>sprites:SpritesBuffer;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)TexCoord:vec2<f32>,@location(1)Tint:vec4<f32>,@location(2)Opacity:f32,};@vertex fn vs_main(@builtin(instance_index)i_id:u32,@location(0)vertexPosition:vec3<f32>,@location(1)vertexTexCoord:vec2<f32>)->Fragment{var output:Fragment;var sx:f32=sprites.models[i_id].scale.x;var sy:f32=sprites.models[i_id].scale.y;var sz:f32=1.0;var rot:f32=sprites.models[i_id].rotation;var tx:f32=sprites.models[i_id].translate.x;var ty:f32=sprites.models[i_id].translate.y;var tz:f32=0;var s=sin(rot);var c=cos(rot);var scaleM:mat4x4<f32>=mat4x4<f32>(sx,0.0,0.0,0.0,0.0,sy,0.0,0.0,0.0,0.0,sz,0.0,0,0,0,1.0);var modelM:mat4x4<f32>=mat4x4<f32>(c,s,0.0,0.0,-s,c,0.0,0.0,0.0,0.0,1.0,0.0,tx,ty,tz,1.0)*scaleM;output.Position=transformUBO.projection*transformUBO.view*modelM*vec4<f32>(vertexPosition,1.0);output.TexCoord=vertexTexCoord;output.Tint=sprites.models[i_id].tint;output.Opacity=sprites.models[i_id].opacity;return output;}@fragment fn fs_main(@location(0)TexCoord:vec2<f32>,@location(1)Tint:vec4<f32>,@location(2)Opacity:f32)->@location(0)vec4<f32>{var outColor:vec4<f32>=textureSample(myTexture,mySampler,TexCoord);var output=vec4<f32>(outColor.rgb*(1.0-Tint.a)+(Tint.rgb*Tint.a),outColor.a*Opacity);return output;}";function Dr(s,r){return class extends s{constructor(...m){super(...m),r(this)}}}var br=Dr(Array,s=>s.fill(0)),k=1e-6;function Tr(s){function r(t=0,a=0){let e=new s(2);return t!==void 0&&(e[0]=t,a!==void 0&&(e[1]=a)),e}let m=r;function v(t,a,e){let o=e??new s(2);return o[0]=t,o[1]=a,o}function P(t,a){let e=a??new s(2);return e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e}function T(t,a){let e=a??new s(2);return e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e}function B(t,a){let e=a??new s(2);return e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e}function G(t,a=0,e=1,o){let l=o??new s(2);return l[0]=Math.min(e,Math.max(a,t[0])),l[1]=Math.min(e,Math.max(a,t[1])),l}function _(t,a,e){let o=e??new s(2);return o[0]=t[0]+a[0],o[1]=t[1]+a[1],o}function U(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+a[0]*e,l[1]=t[1]+a[1]*e,l}function z(t,a){let e=t[0],o=t[1],l=a[0],g=a[1],D=Math.sqrt(e*e+o*o),u=Math.sqrt(l*l+g*g),f=D*u,w=f&&Dt(t,a)/f;return Math.acos(w)}function R(t,a,e){let o=e??new s(2);return o[0]=t[0]-a[0],o[1]=t[1]-a[1],o}let X=R;function Y(t,a){return Math.abs(t[0]-a[0])<k&&Math.abs(t[1]-a[1])<k}function H(t,a){return t[0]===a[0]&&t[1]===a[1]}function F(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+e*(a[0]-t[0]),l[1]=t[1]+e*(a[1]-t[1]),l}function nt(t,a,e,o){let l=o??new s(2);return l[0]=t[0]+e[0]*(a[0]-t[0]),l[1]=t[1]+e[1]*(a[1]-t[1]),l}function rt(t,a,e){let o=e??new s(2);return o[0]=Math.max(t[0],a[0]),o[1]=Math.max(t[1],a[1]),o}function W(t,a,e){let o=e??new s(2);return o[0]=Math.min(t[0],a[0]),o[1]=Math.min(t[1],a[1]),o}function et(t,a,e){let o=e??new s(2);return o[0]=t[0]*a,o[1]=t[1]*a,o}let Bt=et;function gt(t,a,e){let o=e??new s(2);return o[0]=t[0]/a,o[1]=t[1]/a,o}function xt(t,a){let e=a??new s(2);return e[0]=1/t[0],e[1]=1/t[1],e}let Mt=xt;function mt(t,a,e){let o=e??new s(3),l=t[0]*a[1]-t[1]*a[0];return o[0]=0,o[1]=0,o[2]=l,o}function Dt(t,a){return t[0]*a[0]+t[1]*a[1]}function C(t){let a=t[0],e=t[1];return Math.sqrt(a*a+e*e)}let _t=C;function q(t){let a=t[0],e=t[1];return a*a+e*e}let $=q;function O(t,a){let e=t[0]-a[0],o=t[1]-a[1];return Math.sqrt(e*e+o*o)}let Ut=O;function lt(t,a){let e=t[0]-a[0],o=t[1]-a[1];return e*e+o*o}let Et=lt;function ft(t,a){let e=a??new s(2),o=t[0],l=t[1],g=Math.sqrt(o*o+l*l);return g>1e-5?(e[0]=o/g,e[1]=l/g):(e[0]=0,e[1]=0),e}function It(t,a){let e=a??new s(2);return e[0]=-t[0],e[1]=-t[1],e}function j(t,a){let e=a??new s(2);return e[0]=t[0],e[1]=t[1],e}let Lt=j;function vt(t,a,e){let o=e??new s(2);return o[0]=t[0]*a[0],o[1]=t[1]*a[1],o}let At=vt;function yt(t,a,e){let o=e??new s(2);return o[0]=t[0]/a[0],o[1]=t[1]/a[1],o}let zt=yt;function bt(t=1,a){let e=a??new s(2),o=Math.random()*2*Math.PI;return e[0]=Math.cos(o)*t,e[1]=Math.sin(o)*t,e}function i(t){let a=t??new s(2);return a[0]=0,a[1]=0,a}function p(t,a,e){let o=e??new s(2),l=t[0],g=t[1];return o[0]=l*a[0]+g*a[4]+a[12],o[1]=l*a[1]+g*a[5]+a[13],o}function n(t,a,e){let o=e??new s(2),l=t[0],g=t[1];return o[0]=a[0]*l+a[4]*g+a[8],o[1]=a[1]*l+a[5]*g+a[9],o}function c(t,a,e,o){let l=o??new s(2),g=t[0]-a[0],D=t[1]-a[1],u=Math.sin(e),f=Math.cos(e);return l[0]=g*f-D*u+a[0],l[1]=g*u+D*f+a[1],l}function d(t,a,e){let o=e??new s(2);return ft(t,o),et(o,a,o)}function h(t,a,e){let o=e??new s(2);return C(t)>a?d(t,a,o):j(t,o)}function M(t,a,e){let o=e??new s(2);return F(t,a,.5,o)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,angle:z,subtract:R,sub:X,equalsApproximately:Y,equals:H,lerp:F,lerpV:nt,max:rt,min:W,mulScalar:et,scale:Bt,divScalar:gt,inverse:xt,invert:Mt,cross:mt,dot:Dt,length:C,len:_t,lengthSq:q,lenSq:$,distance:O,dist:Ut,distanceSq:lt,distSq:Et,normalize:ft,negate:It,copy:j,clone:Lt,multiply:vt,mul:At,divide:yt,div:zt,random:bt,zero:i,transformMat4:p,transformMat3:n,rotate:c,setLength:d,truncate:h,midpoint:M}}var rn=new Map;function ln(s){let r=rn.get(s);return r||(r=Tr(s),rn.set(s,r)),r}function Sr(s){function r(u,f,w){let x=new s(3);return u!==void 0&&(x[0]=u,f!==void 0&&(x[1]=f,w!==void 0&&(x[2]=w))),x}let m=r;function v(u,f,w,x){let y=x??new s(3);return y[0]=u,y[1]=f,y[2]=w,y}function P(u,f){let w=f??new s(3);return w[0]=Math.ceil(u[0]),w[1]=Math.ceil(u[1]),w[2]=Math.ceil(u[2]),w}function T(u,f){let w=f??new s(3);return w[0]=Math.floor(u[0]),w[1]=Math.floor(u[1]),w[2]=Math.floor(u[2]),w}function B(u,f){let w=f??new s(3);return w[0]=Math.round(u[0]),w[1]=Math.round(u[1]),w[2]=Math.round(u[2]),w}function G(u,f=0,w=1,x){let y=x??new s(3);return y[0]=Math.min(w,Math.max(f,u[0])),y[1]=Math.min(w,Math.max(f,u[1])),y[2]=Math.min(w,Math.max(f,u[2])),y}function _(u,f,w){let x=w??new s(3);return x[0]=u[0]+f[0],x[1]=u[1]+f[1],x[2]=u[2]+f[2],x}function U(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+f[0]*w,y[1]=u[1]+f[1]*w,y[2]=u[2]+f[2]*w,y}function z(u,f){let w=u[0],x=u[1],y=u[2],b=f[0],S=f[1],I=f[2],A=Math.sqrt(w*w+x*x+y*y),E=Math.sqrt(b*b+S*S+I*I),L=A*E,V=L&&Dt(u,f)/L;return Math.acos(V)}function R(u,f,w){let x=w??new s(3);return x[0]=u[0]-f[0],x[1]=u[1]-f[1],x[2]=u[2]-f[2],x}let X=R;function Y(u,f){return Math.abs(u[0]-f[0])<k&&Math.abs(u[1]-f[1])<k&&Math.abs(u[2]-f[2])<k}function H(u,f){return u[0]===f[0]&&u[1]===f[1]&&u[2]===f[2]}function F(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+w*(f[0]-u[0]),y[1]=u[1]+w*(f[1]-u[1]),y[2]=u[2]+w*(f[2]-u[2]),y}function nt(u,f,w,x){let y=x??new s(3);return y[0]=u[0]+w[0]*(f[0]-u[0]),y[1]=u[1]+w[1]*(f[1]-u[1]),y[2]=u[2]+w[2]*(f[2]-u[2]),y}function rt(u,f,w){let x=w??new s(3);return x[0]=Math.max(u[0],f[0]),x[1]=Math.max(u[1],f[1]),x[2]=Math.max(u[2],f[2]),x}function W(u,f,w){let x=w??new s(3);return x[0]=Math.min(u[0],f[0]),x[1]=Math.min(u[1],f[1]),x[2]=Math.min(u[2],f[2]),x}function et(u,f,w){let x=w??new s(3);return x[0]=u[0]*f,x[1]=u[1]*f,x[2]=u[2]*f,x}let Bt=et;function gt(u,f,w){let x=w??new s(3);return x[0]=u[0]/f,x[1]=u[1]/f,x[2]=u[2]/f,x}function xt(u,f){let w=f??new s(3);return w[0]=1/u[0],w[1]=1/u[1],w[2]=1/u[2],w}let Mt=xt;function mt(u,f,w){let x=w??new s(3),y=u[2]*f[0]-u[0]*f[2],b=u[0]*f[1]-u[1]*f[0];return x[0]=u[1]*f[2]-u[2]*f[1],x[1]=y,x[2]=b,x}function Dt(u,f){return u[0]*f[0]+u[1]*f[1]+u[2]*f[2]}function C(u){let f=u[0],w=u[1],x=u[2];return Math.sqrt(f*f+w*w+x*x)}let _t=C;function q(u){let f=u[0],w=u[1],x=u[2];return f*f+w*w+x*x}let $=q;function O(u,f){let w=u[0]-f[0],x=u[1]-f[1],y=u[2]-f[2];return Math.sqrt(w*w+x*x+y*y)}let Ut=O;function lt(u,f){let w=u[0]-f[0],x=u[1]-f[1],y=u[2]-f[2];return w*w+x*x+y*y}let Et=lt;function ft(u,f){let w=f??new s(3),x=u[0],y=u[1],b=u[2],S=Math.sqrt(x*x+y*y+b*b);return S>1e-5?(w[0]=x/S,w[1]=y/S,w[2]=b/S):(w[0]=0,w[1]=0,w[2]=0),w}function It(u,f){let w=f??new s(3);return w[0]=-u[0],w[1]=-u[1],w[2]=-u[2],w}function j(u,f){let w=f??new s(3);return w[0]=u[0],w[1]=u[1],w[2]=u[2],w}let Lt=j;function vt(u,f,w){let x=w??new s(3);return x[0]=u[0]*f[0],x[1]=u[1]*f[1],x[2]=u[2]*f[2],x}let At=vt;function yt(u,f,w){let x=w??new s(3);return x[0]=u[0]/f[0],x[1]=u[1]/f[1],x[2]=u[2]/f[2],x}let zt=yt;function bt(u=1,f){let w=f??new s(3),x=Math.random()*2*Math.PI,y=Math.random()*2-1,b=Math.sqrt(1-y*y)*u;return w[0]=Math.cos(x)*b,w[1]=Math.sin(x)*b,w[2]=y*u,w}function i(u){let f=u??new s(3);return f[0]=0,f[1]=0,f[2]=0,f}function p(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2],I=f[3]*y+f[7]*b+f[11]*S+f[15]||1;return x[0]=(f[0]*y+f[4]*b+f[8]*S+f[12])/I,x[1]=(f[1]*y+f[5]*b+f[9]*S+f[13])/I,x[2]=(f[2]*y+f[6]*b+f[10]*S+f[14])/I,x}function n(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2];return x[0]=y*f[0*4+0]+b*f[1*4+0]+S*f[2*4+0],x[1]=y*f[0*4+1]+b*f[1*4+1]+S*f[2*4+1],x[2]=y*f[0*4+2]+b*f[1*4+2]+S*f[2*4+2],x}function c(u,f,w){let x=w??new s(3),y=u[0],b=u[1],S=u[2];return x[0]=y*f[0]+b*f[4]+S*f[8],x[1]=y*f[1]+b*f[5]+S*f[9],x[2]=y*f[2]+b*f[6]+S*f[10],x}function d(u,f,w){let x=w??new s(3),y=f[0],b=f[1],S=f[2],I=f[3]*2,A=u[0],E=u[1],L=u[2],V=b*L-S*E,N=S*A-y*L,Z=y*E-b*A;return x[0]=A+V*I+(b*Z-S*N)*2,x[1]=E+N*I+(S*V-y*Z)*2,x[2]=L+Z*I+(y*N-b*V)*2,x}function h(u,f){let w=f??new s(3);return w[0]=u[12],w[1]=u[13],w[2]=u[14],w}function M(u,f,w){let x=w??new s(3),y=f*4;return x[0]=u[y+0],x[1]=u[y+1],x[2]=u[y+2],x}function t(u,f){let w=f??new s(3),x=u[0],y=u[1],b=u[2],S=u[4],I=u[5],A=u[6],E=u[8],L=u[9],V=u[10];return w[0]=Math.sqrt(x*x+y*y+b*b),w[1]=Math.sqrt(S*S+I*I+A*A),w[2]=Math.sqrt(E*E+L*L+V*V),w}function a(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[0],S[1]=b[1]*Math.cos(w)-b[2]*Math.sin(w),S[2]=b[1]*Math.sin(w)+b[2]*Math.cos(w),y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function e(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[2]*Math.sin(w)+b[0]*Math.cos(w),S[1]=b[1],S[2]=b[2]*Math.cos(w)-b[0]*Math.sin(w),y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function o(u,f,w,x){let y=x??new s(3),b=[],S=[];return b[0]=u[0]-f[0],b[1]=u[1]-f[1],b[2]=u[2]-f[2],S[0]=b[0]*Math.cos(w)-b[1]*Math.sin(w),S[1]=b[0]*Math.sin(w)+b[1]*Math.cos(w),S[2]=b[2],y[0]=S[0]+f[0],y[1]=S[1]+f[1],y[2]=S[2]+f[2],y}function l(u,f,w){let x=w??new s(3);return ft(u,x),et(x,f,x)}function g(u,f,w){let x=w??new s(3);return C(u)>f?l(u,f,x):j(u,x)}function D(u,f,w){let x=w??new s(3);return F(u,f,.5,x)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,angle:z,subtract:R,sub:X,equalsApproximately:Y,equals:H,lerp:F,lerpV:nt,max:rt,min:W,mulScalar:et,scale:Bt,divScalar:gt,inverse:xt,invert:Mt,cross:mt,dot:Dt,length:C,len:_t,lengthSq:q,lenSq:$,distance:O,dist:Ut,distanceSq:lt,distSq:Et,normalize:ft,negate:It,copy:j,clone:Lt,multiply:vt,mul:At,divide:yt,div:zt,random:bt,zero:i,transformMat4:p,transformMat4Upper3x3:n,transformMat3:c,transformQuat:d,getTranslation:h,getAxis:M,getScaling:t,rotateX:a,rotateY:e,rotateZ:o,setLength:l,truncate:g,midpoint:D}}var on=new Map;function pe(s){let r=on.get(s);return r||(r=Sr(s),on.set(s,r)),r}function Pr(s){let r=ln(s),m=pe(s);function v(i,p,n,c,d,h,M,t,a){let e=new s(12);return e[3]=0,e[7]=0,e[11]=0,i!==void 0&&(e[0]=i,p!==void 0&&(e[1]=p,n!==void 0&&(e[2]=n,c!==void 0&&(e[4]=c,d!==void 0&&(e[5]=d,h!==void 0&&(e[6]=h,M!==void 0&&(e[8]=M,t!==void 0&&(e[9]=t,a!==void 0&&(e[10]=a))))))))),e}function P(i,p,n,c,d,h,M,t,a,e){let o=e??new s(12);return o[0]=i,o[1]=p,o[2]=n,o[3]=0,o[4]=c,o[5]=d,o[6]=h,o[7]=0,o[8]=M,o[9]=t,o[10]=a,o[11]=0,o}function T(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[3]=0,n[4]=i[4],n[5]=i[5],n[6]=i[6],n[7]=0,n[8]=i[8],n[9]=i[9],n[10]=i[10],n[11]=0,n}function B(i,p){let n=p??new s(12),c=i[0],d=i[1],h=i[2],M=i[3],t=c+c,a=d+d,e=h+h,o=c*t,l=d*t,g=d*a,D=h*t,u=h*a,f=h*e,w=M*t,x=M*a,y=M*e;return n[0]=1-g-f,n[1]=l+y,n[2]=D-x,n[3]=0,n[4]=l-y,n[5]=1-o-f,n[6]=u+w,n[7]=0,n[8]=D+x,n[9]=u-w,n[10]=1-o-g,n[11]=0,n}function G(i,p){let n=p??new s(12);return n[0]=-i[0],n[1]=-i[1],n[2]=-i[2],n[4]=-i[4],n[5]=-i[5],n[6]=-i[6],n[8]=-i[8],n[9]=-i[9],n[10]=-i[10],n}function _(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[4]=i[4],n[5]=i[5],n[6]=i[6],n[8]=i[8],n[9]=i[9],n[10]=i[10],n}let U=_;function z(i,p){return Math.abs(i[0]-p[0])<k&&Math.abs(i[1]-p[1])<k&&Math.abs(i[2]-p[2])<k&&Math.abs(i[4]-p[4])<k&&Math.abs(i[5]-p[5])<k&&Math.abs(i[6]-p[6])<k&&Math.abs(i[8]-p[8])<k&&Math.abs(i[9]-p[9])<k&&Math.abs(i[10]-p[10])<k}function R(i,p){return i[0]===p[0]&&i[1]===p[1]&&i[2]===p[2]&&i[4]===p[4]&&i[5]===p[5]&&i[6]===p[6]&&i[8]===p[8]&&i[9]===p[9]&&i[10]===p[10]}function X(i){let p=i??new s(12);return p[0]=1,p[1]=0,p[2]=0,p[4]=0,p[5]=1,p[6]=0,p[8]=0,p[9]=0,p[10]=1,p}function Y(i,p){let n=p??new s(12);if(n===i){let g;return g=i[1],i[1]=i[4],i[4]=g,g=i[2],i[2]=i[8],i[8]=g,g=i[6],i[6]=i[9],i[9]=g,n}let c=i[0*4+0],d=i[0*4+1],h=i[0*4+2],M=i[1*4+0],t=i[1*4+1],a=i[1*4+2],e=i[2*4+0],o=i[2*4+1],l=i[2*4+2];return n[0]=c,n[1]=M,n[2]=e,n[4]=d,n[5]=t,n[6]=o,n[8]=h,n[9]=a,n[10]=l,n}function H(i,p){let n=p??new s(12),c=i[0*4+0],d=i[0*4+1],h=i[0*4+2],M=i[1*4+0],t=i[1*4+1],a=i[1*4+2],e=i[2*4+0],o=i[2*4+1],l=i[2*4+2],g=l*t-a*o,D=-l*M+a*e,u=o*M-t*e,f=1/(c*g+d*D+h*u);return n[0]=g*f,n[1]=(-l*d+h*o)*f,n[2]=(a*d-h*t)*f,n[4]=D*f,n[5]=(l*c-h*e)*f,n[6]=(-a*c+h*M)*f,n[8]=u*f,n[9]=(-o*c+d*e)*f,n[10]=(t*c-d*M)*f,n}function F(i){let p=i[0],n=i[0*4+1],c=i[0*4+2],d=i[1*4+0],h=i[1*4+1],M=i[1*4+2],t=i[2*4+0],a=i[2*4+1],e=i[2*4+2];return p*(h*e-a*M)-d*(n*e-a*c)+t*(n*M-h*c)}let nt=H;function rt(i,p,n){let c=n??new s(12),d=i[0],h=i[1],M=i[2],t=i[4],a=i[5],e=i[6],o=i[8],l=i[9],g=i[10],D=p[0],u=p[1],f=p[2],w=p[4],x=p[5],y=p[6],b=p[8],S=p[9],I=p[10];return c[0]=d*D+t*u+o*f,c[1]=h*D+a*u+l*f,c[2]=M*D+e*u+g*f,c[4]=d*w+t*x+o*y,c[5]=h*w+a*x+l*y,c[6]=M*w+e*x+g*y,c[8]=d*b+t*S+o*I,c[9]=h*b+a*S+l*I,c[10]=M*b+e*S+g*I,c}let W=rt;function et(i,p,n){let c=n??X();return i!==c&&(c[0]=i[0],c[1]=i[1],c[2]=i[2],c[4]=i[4],c[5]=i[5],c[6]=i[6]),c[8]=p[0],c[9]=p[1],c[10]=1,c}function Bt(i,p){let n=p??r.create();return n[0]=i[8],n[1]=i[9],n}function gt(i,p,n){let c=n??r.create(),d=p*4;return c[0]=i[d+0],c[1]=i[d+1],c}function xt(i,p,n,c){let d=c===i?i:_(i,c),h=n*4;return d[h+0]=p[0],d[h+1]=p[1],d}function Mt(i,p){let n=p??r.create(),c=i[0],d=i[1],h=i[4],M=i[5];return n[0]=Math.sqrt(c*c+d*d),n[1]=Math.sqrt(h*h+M*M),n}function mt(i,p){let n=p??m.create(),c=i[0],d=i[1],h=i[2],M=i[4],t=i[5],a=i[6],e=i[8],o=i[9],l=i[10];return n[0]=Math.sqrt(c*c+d*d+h*h),n[1]=Math.sqrt(M*M+t*t+a*a),n[2]=Math.sqrt(e*e+o*o+l*l),n}function Dt(i,p){let n=p??new s(12);return n[0]=1,n[1]=0,n[2]=0,n[4]=0,n[5]=1,n[6]=0,n[8]=i[0],n[9]=i[1],n[10]=1,n}function C(i,p,n){let c=n??new s(12),d=p[0],h=p[1],M=i[0],t=i[1],a=i[2],e=i[1*4+0],o=i[1*4+1],l=i[1*4+2],g=i[2*4+0],D=i[2*4+1],u=i[2*4+2];return i!==c&&(c[0]=M,c[1]=t,c[2]=a,c[4]=e,c[5]=o,c[6]=l),c[8]=M*d+e*h+g,c[9]=t*d+o*h+D,c[10]=a*d+l*h+u,c}function _t(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=c,n[1]=d,n[2]=0,n[4]=-d,n[5]=c,n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function q(i,p,n){let c=n??new s(12),d=i[0*4+0],h=i[0*4+1],M=i[0*4+2],t=i[1*4+0],a=i[1*4+1],e=i[1*4+2],o=Math.cos(p),l=Math.sin(p);return c[0]=o*d+l*t,c[1]=o*h+l*a,c[2]=o*M+l*e,c[4]=o*t-l*d,c[5]=o*a-l*h,c[6]=o*e-l*M,i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function $(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=1,n[1]=0,n[2]=0,n[4]=0,n[5]=c,n[6]=d,n[8]=0,n[9]=-d,n[10]=c,n}function O(i,p,n){let c=n??new s(12),d=i[4],h=i[5],M=i[6],t=i[8],a=i[9],e=i[10],o=Math.cos(p),l=Math.sin(p);return c[4]=o*d+l*t,c[5]=o*h+l*a,c[6]=o*M+l*e,c[8]=o*t-l*d,c[9]=o*a-l*h,c[10]=o*e-l*M,i!==c&&(c[0]=i[0],c[1]=i[1],c[2]=i[2]),c}function Ut(i,p){let n=p??new s(12),c=Math.cos(i),d=Math.sin(i);return n[0]=c,n[1]=0,n[2]=-d,n[4]=0,n[5]=1,n[6]=0,n[8]=d,n[9]=0,n[10]=c,n}function lt(i,p,n){let c=n??new s(12),d=i[0*4+0],h=i[0*4+1],M=i[0*4+2],t=i[2*4+0],a=i[2*4+1],e=i[2*4+2],o=Math.cos(p),l=Math.sin(p);return c[0]=o*d-l*t,c[1]=o*h-l*a,c[2]=o*M-l*e,c[8]=o*t+l*d,c[9]=o*a+l*h,c[10]=o*e+l*M,i!==c&&(c[4]=i[4],c[5]=i[5],c[6]=i[6]),c}let Et=_t,ft=q;function It(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=0,n[2]=0,n[4]=0,n[5]=i[1],n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function j(i,p,n){let c=n??new s(12),d=p[0],h=p[1];return c[0]=d*i[0*4+0],c[1]=d*i[0*4+1],c[2]=d*i[0*4+2],c[4]=h*i[1*4+0],c[5]=h*i[1*4+1],c[6]=h*i[1*4+2],i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function Lt(i,p){let n=p??new s(12);return n[0]=i[0],n[1]=0,n[2]=0,n[4]=0,n[5]=i[1],n[6]=0,n[8]=0,n[9]=0,n[10]=i[2],n}function vt(i,p,n){let c=n??new s(12),d=p[0],h=p[1],M=p[2];return c[0]=d*i[0*4+0],c[1]=d*i[0*4+1],c[2]=d*i[0*4+2],c[4]=h*i[1*4+0],c[5]=h*i[1*4+1],c[6]=h*i[1*4+2],c[8]=M*i[2*4+0],c[9]=M*i[2*4+1],c[10]=M*i[2*4+2],c}function At(i,p){let n=p??new s(12);return n[0]=i,n[1]=0,n[2]=0,n[4]=0,n[5]=i,n[6]=0,n[8]=0,n[9]=0,n[10]=1,n}function yt(i,p,n){let c=n??new s(12);return c[0]=p*i[0*4+0],c[1]=p*i[0*4+1],c[2]=p*i[0*4+2],c[4]=p*i[1*4+0],c[5]=p*i[1*4+1],c[6]=p*i[1*4+2],i!==c&&(c[8]=i[8],c[9]=i[9],c[10]=i[10]),c}function zt(i,p){let n=p??new s(12);return n[0]=i,n[1]=0,n[2]=0,n[4]=0,n[5]=i,n[6]=0,n[8]=0,n[9]=0,n[10]=i,n}function bt(i,p,n){let c=n??new s(12);return c[0]=p*i[0*4+0],c[1]=p*i[0*4+1],c[2]=p*i[0*4+2],c[4]=p*i[1*4+0],c[5]=p*i[1*4+1],c[6]=p*i[1*4+2],c[8]=p*i[2*4+0],c[9]=p*i[2*4+1],c[10]=p*i[2*4+2],c}return{clone:U,create:v,set:P,fromMat4:T,fromQuat:B,negate:G,copy:_,equalsApproximately:z,equals:R,identity:X,transpose:Y,inverse:H,invert:nt,determinant:F,mul:W,multiply:rt,setTranslation:et,getTranslation:Bt,getAxis:gt,setAxis:xt,getScaling:Mt,get3DScaling:mt,translation:Dt,translate:C,rotation:_t,rotate:q,rotationX:$,rotateX:O,rotationY:Ut,rotateY:lt,rotationZ:Et,rotateZ:ft,scaling:It,scale:j,uniformScaling:At,uniformScale:yt,scaling3D:Lt,scale3D:vt,uniformScaling3D:zt,uniformScale3D:bt}}var sn=new Map;function Br(s){let r=sn.get(s);return r||(r=Pr(s),sn.set(s,r)),r}function _r(s){let r=pe(s);function m(t,a,e,o,l,g,D,u,f,w,x,y,b,S,I,A){let E=new s(16);return t!==void 0&&(E[0]=t,a!==void 0&&(E[1]=a,e!==void 0&&(E[2]=e,o!==void 0&&(E[3]=o,l!==void 0&&(E[4]=l,g!==void 0&&(E[5]=g,D!==void 0&&(E[6]=D,u!==void 0&&(E[7]=u,f!==void 0&&(E[8]=f,w!==void 0&&(E[9]=w,x!==void 0&&(E[10]=x,y!==void 0&&(E[11]=y,b!==void 0&&(E[12]=b,S!==void 0&&(E[13]=S,I!==void 0&&(E[14]=I,A!==void 0&&(E[15]=A)))))))))))))))),E}function v(t,a,e,o,l,g,D,u,f,w,x,y,b,S,I,A,E){let L=E??new s(16);return L[0]=t,L[1]=a,L[2]=e,L[3]=o,L[4]=l,L[5]=g,L[6]=D,L[7]=u,L[8]=f,L[9]=w,L[10]=x,L[11]=y,L[12]=b,L[13]=S,L[14]=I,L[15]=A,L}function P(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=0,e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=0,e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function T(t,a){let e=a??new s(16),o=t[0],l=t[1],g=t[2],D=t[3],u=o+o,f=l+l,w=g+g,x=o*u,y=l*u,b=l*f,S=g*u,I=g*f,A=g*w,E=D*u,L=D*f,V=D*w;return e[0]=1-b-A,e[1]=y+V,e[2]=S-L,e[3]=0,e[4]=y-V,e[5]=1-x-A,e[6]=I+E,e[7]=0,e[8]=S+L,e[9]=I-E,e[10]=1-x-b,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function B(t,a){let e=a??new s(16);return e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=-t[3],e[4]=-t[4],e[5]=-t[5],e[6]=-t[6],e[7]=-t[7],e[8]=-t[8],e[9]=-t[9],e[10]=-t[10],e[11]=-t[11],e[12]=-t[12],e[13]=-t[13],e[14]=-t[14],e[15]=-t[15],e}function G(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}let _=G;function U(t,a){return Math.abs(t[0]-a[0])<k&&Math.abs(t[1]-a[1])<k&&Math.abs(t[2]-a[2])<k&&Math.abs(t[3]-a[3])<k&&Math.abs(t[4]-a[4])<k&&Math.abs(t[5]-a[5])<k&&Math.abs(t[6]-a[6])<k&&Math.abs(t[7]-a[7])<k&&Math.abs(t[8]-a[8])<k&&Math.abs(t[9]-a[9])<k&&Math.abs(t[10]-a[10])<k&&Math.abs(t[11]-a[11])<k&&Math.abs(t[12]-a[12])<k&&Math.abs(t[13]-a[13])<k&&Math.abs(t[14]-a[14])<k&&Math.abs(t[15]-a[15])<k}function z(t,a){return t[0]===a[0]&&t[1]===a[1]&&t[2]===a[2]&&t[3]===a[3]&&t[4]===a[4]&&t[5]===a[5]&&t[6]===a[6]&&t[7]===a[7]&&t[8]===a[8]&&t[9]===a[9]&&t[10]===a[10]&&t[11]===a[11]&&t[12]===a[12]&&t[13]===a[13]&&t[14]===a[14]&&t[15]===a[15]}function R(t){let a=t??new s(16);return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=1,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a}function X(t,a){let e=a??new s(16);if(e===t){let N;return N=t[1],t[1]=t[4],t[4]=N,N=t[2],t[2]=t[8],t[8]=N,N=t[3],t[3]=t[12],t[12]=N,N=t[6],t[6]=t[9],t[9]=N,N=t[7],t[7]=t[13],t[13]=N,N=t[11],t[11]=t[14],t[14]=N,e}let o=t[0*4+0],l=t[0*4+1],g=t[0*4+2],D=t[0*4+3],u=t[1*4+0],f=t[1*4+1],w=t[1*4+2],x=t[1*4+3],y=t[2*4+0],b=t[2*4+1],S=t[2*4+2],I=t[2*4+3],A=t[3*4+0],E=t[3*4+1],L=t[3*4+2],V=t[3*4+3];return e[0]=o,e[1]=u,e[2]=y,e[3]=A,e[4]=l,e[5]=f,e[6]=b,e[7]=E,e[8]=g,e[9]=w,e[10]=S,e[11]=L,e[12]=D,e[13]=x,e[14]=I,e[15]=V,e}function Y(t,a){let e=a??new s(16),o=t[0*4+0],l=t[0*4+1],g=t[0*4+2],D=t[0*4+3],u=t[1*4+0],f=t[1*4+1],w=t[1*4+2],x=t[1*4+3],y=t[2*4+0],b=t[2*4+1],S=t[2*4+2],I=t[2*4+3],A=t[3*4+0],E=t[3*4+1],L=t[3*4+2],V=t[3*4+3],N=S*V,Z=L*I,K=w*V,J=L*x,tt=w*I,ot=S*x,st=g*V,it=L*D,ct=g*I,at=S*D,dt=g*x,pt=w*D,ht=y*E,wt=A*b,Tt=u*E,St=A*f,Pt=u*b,$t=y*f,Xt=o*E,Ht=A*l,Wt=o*b,jt=y*l,Zt=o*f,Qt=u*l,te=N*f+J*b+tt*E-(Z*f+K*b+ot*E),ee=Z*l+st*b+at*E-(N*l+it*b+ct*E),ne=K*l+it*f+dt*E-(J*l+st*f+pt*E),re=ot*l+ct*f+pt*b-(tt*l+at*f+dt*b),ut=1/(o*te+u*ee+y*ne+A*re);return e[0]=ut*te,e[1]=ut*ee,e[2]=ut*ne,e[3]=ut*re,e[4]=ut*(Z*u+K*y+ot*A-(N*u+J*y+tt*A)),e[5]=ut*(N*o+it*y+ct*A-(Z*o+st*y+at*A)),e[6]=ut*(J*o+st*u+pt*A-(K*o+it*u+dt*A)),e[7]=ut*(tt*o+at*u+dt*y-(ot*o+ct*u+pt*y)),e[8]=ut*(ht*x+St*I+Pt*V-(wt*x+Tt*I+$t*V)),e[9]=ut*(wt*D+Xt*I+jt*V-(ht*D+Ht*I+Wt*V)),e[10]=ut*(Tt*D+Ht*x+Zt*V-(St*D+Xt*x+Qt*V)),e[11]=ut*($t*D+Wt*x+Qt*I-(Pt*D+jt*x+Zt*I)),e[12]=ut*(Tt*S+$t*L+wt*w-(Pt*L+ht*w+St*S)),e[13]=ut*(Wt*L+ht*g+Ht*S-(Xt*S+jt*L+wt*g)),e[14]=ut*(Xt*w+Qt*L+St*g-(Zt*L+Tt*g+Ht*w)),e[15]=ut*(Zt*S+Pt*g+jt*w-(Wt*w+Qt*S+$t*g)),e}function H(t){let a=t[0],e=t[0*4+1],o=t[0*4+2],l=t[0*4+3],g=t[1*4+0],D=t[1*4+1],u=t[1*4+2],f=t[1*4+3],w=t[2*4+0],x=t[2*4+1],y=t[2*4+2],b=t[2*4+3],S=t[3*4+0],I=t[3*4+1],A=t[3*4+2],E=t[3*4+3],L=y*E,V=A*b,N=u*E,Z=A*f,K=u*b,J=y*f,tt=o*E,ot=A*l,st=o*b,it=y*l,ct=o*f,at=u*l,dt=L*D+Z*x+K*I-(V*D+N*x+J*I),pt=V*e+tt*x+it*I-(L*e+ot*x+st*I),ht=N*e+ot*D+ct*I-(Z*e+tt*D+at*I),wt=J*e+st*D+at*x-(K*e+it*D+ct*x);return a*dt+g*pt+w*ht+S*wt}let F=Y;function nt(t,a,e){let o=e??new s(16),l=t[0],g=t[1],D=t[2],u=t[3],f=t[4],w=t[5],x=t[6],y=t[7],b=t[8],S=t[9],I=t[10],A=t[11],E=t[12],L=t[13],V=t[14],N=t[15],Z=a[0],K=a[1],J=a[2],tt=a[3],ot=a[4],st=a[5],it=a[6],ct=a[7],at=a[8],dt=a[9],pt=a[10],ht=a[11],wt=a[12],Tt=a[13],St=a[14],Pt=a[15];return o[0]=l*Z+f*K+b*J+E*tt,o[1]=g*Z+w*K+S*J+L*tt,o[2]=D*Z+x*K+I*J+V*tt,o[3]=u*Z+y*K+A*J+N*tt,o[4]=l*ot+f*st+b*it+E*ct,o[5]=g*ot+w*st+S*it+L*ct,o[6]=D*ot+x*st+I*it+V*ct,o[7]=u*ot+y*st+A*it+N*ct,o[8]=l*at+f*dt+b*pt+E*ht,o[9]=g*at+w*dt+S*pt+L*ht,o[10]=D*at+x*dt+I*pt+V*ht,o[11]=u*at+y*dt+A*pt+N*ht,o[12]=l*wt+f*Tt+b*St+E*Pt,o[13]=g*wt+w*Tt+S*St+L*Pt,o[14]=D*wt+x*Tt+I*St+V*Pt,o[15]=u*wt+y*Tt+A*St+N*Pt,o}let rt=nt;function W(t,a,e){let o=e??R();return t!==o&&(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=t[3],o[4]=t[4],o[5]=t[5],o[6]=t[6],o[7]=t[7],o[8]=t[8],o[9]=t[9],o[10]=t[10],o[11]=t[11]),o[12]=a[0],o[13]=a[1],o[14]=a[2],o[15]=1,o}function et(t,a){let e=a??r.create();return e[0]=t[12],e[1]=t[13],e[2]=t[14],e}function Bt(t,a,e){let o=e??r.create(),l=a*4;return o[0]=t[l+0],o[1]=t[l+1],o[2]=t[l+2],o}function gt(t,a,e,o){let l=o===t?o:G(t,o),g=e*4;return l[g+0]=a[0],l[g+1]=a[1],l[g+2]=a[2],l}function xt(t,a){let e=a??r.create(),o=t[0],l=t[1],g=t[2],D=t[4],u=t[5],f=t[6],w=t[8],x=t[9],y=t[10];return e[0]=Math.sqrt(o*o+l*l+g*g),e[1]=Math.sqrt(D*D+u*u+f*f),e[2]=Math.sqrt(w*w+x*x+y*y),e}function Mt(t,a,e,o,l){let g=l??new s(16),D=Math.tan(Math.PI*.5-.5*t);if(g[0]=D/a,g[1]=0,g[2]=0,g[3]=0,g[4]=0,g[5]=D,g[6]=0,g[7]=0,g[8]=0,g[9]=0,g[11]=-1,g[12]=0,g[13]=0,g[15]=0,Number.isFinite(o)){let u=1/(e-o);g[10]=o*u,g[14]=o*e*u}else g[10]=-1,g[14]=-e;return g}function mt(t,a,e,o=1/0,l){let g=l??new s(16),D=1/Math.tan(t*.5);if(g[0]=D/a,g[1]=0,g[2]=0,g[3]=0,g[4]=0,g[5]=D,g[6]=0,g[7]=0,g[8]=0,g[9]=0,g[11]=-1,g[12]=0,g[13]=0,g[15]=0,o===1/0)g[10]=0,g[14]=e;else{let u=1/(o-e);g[10]=e*u,g[14]=o*e*u}return g}function Dt(t,a,e,o,l,g,D){let u=D??new s(16);return u[0]=2/(a-t),u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2/(o-e),u[6]=0,u[7]=0,u[8]=0,u[9]=0,u[10]=1/(l-g),u[11]=0,u[12]=(a+t)/(t-a),u[13]=(o+e)/(e-o),u[14]=l/(l-g),u[15]=1,u}function C(t,a,e,o,l,g,D){let u=D??new s(16),f=a-t,w=o-e,x=l-g;return u[0]=2*l/f,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2*l/w,u[6]=0,u[7]=0,u[8]=(t+a)/f,u[9]=(o+e)/w,u[10]=g/x,u[11]=-1,u[12]=0,u[13]=0,u[14]=l*g/x,u[15]=0,u}function _t(t,a,e,o,l,g=1/0,D){let u=D??new s(16),f=a-t,w=o-e;if(u[0]=2*l/f,u[1]=0,u[2]=0,u[3]=0,u[4]=0,u[5]=2*l/w,u[6]=0,u[7]=0,u[8]=(t+a)/f,u[9]=(o+e)/w,u[11]=-1,u[12]=0,u[13]=0,u[15]=0,g===1/0)u[10]=0,u[14]=l;else{let x=1/(g-l);u[10]=l*x,u[14]=g*l*x}return u}let q=r.create(),$=r.create(),O=r.create();function Ut(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(a,t,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=q[1],l[2]=q[2],l[3]=0,l[4]=$[0],l[5]=$[1],l[6]=$[2],l[7]=0,l[8]=O[0],l[9]=O[1],l[10]=O[2],l[11]=0,l[12]=t[0],l[13]=t[1],l[14]=t[2],l[15]=1,l}function lt(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(t,a,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=q[1],l[2]=q[2],l[3]=0,l[4]=$[0],l[5]=$[1],l[6]=$[2],l[7]=0,l[8]=O[0],l[9]=O[1],l[10]=O[2],l[11]=0,l[12]=t[0],l[13]=t[1],l[14]=t[2],l[15]=1,l}function Et(t,a,e,o){let l=o??new s(16);return r.normalize(r.subtract(t,a,O),O),r.normalize(r.cross(e,O,q),q),r.normalize(r.cross(O,q,$),$),l[0]=q[0],l[1]=$[0],l[2]=O[0],l[3]=0,l[4]=q[1],l[5]=$[1],l[6]=O[1],l[7]=0,l[8]=q[2],l[9]=$[2],l[10]=O[2],l[11]=0,l[12]=-(q[0]*t[0]+q[1]*t[1]+q[2]*t[2]),l[13]=-($[0]*t[0]+$[1]*t[1]+$[2]*t[2]),l[14]=-(O[0]*t[0]+O[1]*t[1]+O[2]*t[2]),l[15]=1,l}function ft(t,a){let e=a??new s(16);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=t[0],e[13]=t[1],e[14]=t[2],e[15]=1,e}function It(t,a,e){let o=e??new s(16),l=a[0],g=a[1],D=a[2],u=t[0],f=t[1],w=t[2],x=t[3],y=t[1*4+0],b=t[1*4+1],S=t[1*4+2],I=t[1*4+3],A=t[2*4+0],E=t[2*4+1],L=t[2*4+2],V=t[2*4+3],N=t[3*4+0],Z=t[3*4+1],K=t[3*4+2],J=t[3*4+3];return t!==o&&(o[0]=u,o[1]=f,o[2]=w,o[3]=x,o[4]=y,o[5]=b,o[6]=S,o[7]=I,o[8]=A,o[9]=E,o[10]=L,o[11]=V),o[12]=u*l+y*g+A*D+N,o[13]=f*l+b*g+E*D+Z,o[14]=w*l+S*g+L*D+K,o[15]=x*l+I*g+V*D+J,o}function j(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=o,e[6]=l,e[7]=0,e[8]=0,e[9]=-l,e[10]=o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Lt(t,a,e){let o=e??new s(16),l=t[4],g=t[5],D=t[6],u=t[7],f=t[8],w=t[9],x=t[10],y=t[11],b=Math.cos(a),S=Math.sin(a);return o[4]=b*l+S*f,o[5]=b*g+S*w,o[6]=b*D+S*x,o[7]=b*u+S*y,o[8]=b*f-S*l,o[9]=b*w-S*g,o[10]=b*x-S*D,o[11]=b*y-S*u,t!==o&&(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=t[3],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function vt(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=o,e[1]=0,e[2]=-l,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=l,e[9]=0,e[10]=o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function At(t,a,e){let o=e??new s(16),l=t[0*4+0],g=t[0*4+1],D=t[0*4+2],u=t[0*4+3],f=t[2*4+0],w=t[2*4+1],x=t[2*4+2],y=t[2*4+3],b=Math.cos(a),S=Math.sin(a);return o[0]=b*l-S*f,o[1]=b*g-S*w,o[2]=b*D-S*x,o[3]=b*u-S*y,o[8]=b*f+S*l,o[9]=b*w+S*g,o[10]=b*x+S*D,o[11]=b*y+S*u,t!==o&&(o[4]=t[4],o[5]=t[5],o[6]=t[6],o[7]=t[7],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function yt(t,a){let e=a??new s(16),o=Math.cos(t),l=Math.sin(t);return e[0]=o,e[1]=l,e[2]=0,e[3]=0,e[4]=-l,e[5]=o,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function zt(t,a,e){let o=e??new s(16),l=t[0*4+0],g=t[0*4+1],D=t[0*4+2],u=t[0*4+3],f=t[1*4+0],w=t[1*4+1],x=t[1*4+2],y=t[1*4+3],b=Math.cos(a),S=Math.sin(a);return o[0]=b*l+S*f,o[1]=b*g+S*w,o[2]=b*D+S*x,o[3]=b*u+S*y,o[4]=b*f-S*l,o[5]=b*w-S*g,o[6]=b*x-S*D,o[7]=b*y-S*u,t!==o&&(o[8]=t[8],o[9]=t[9],o[10]=t[10],o[11]=t[11],o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function bt(t,a,e){let o=e??new s(16),l=t[0],g=t[1],D=t[2],u=Math.sqrt(l*l+g*g+D*D);l/=u,g/=u,D/=u;let f=l*l,w=g*g,x=D*D,y=Math.cos(a),b=Math.sin(a),S=1-y;return o[0]=f+(1-f)*y,o[1]=l*g*S+D*b,o[2]=l*D*S-g*b,o[3]=0,o[4]=l*g*S-D*b,o[5]=w+(1-w)*y,o[6]=g*D*S+l*b,o[7]=0,o[8]=l*D*S+g*b,o[9]=g*D*S-l*b,o[10]=x+(1-x)*y,o[11]=0,o[12]=0,o[13]=0,o[14]=0,o[15]=1,o}let i=bt;function p(t,a,e,o){let l=o??new s(16),g=a[0],D=a[1],u=a[2],f=Math.sqrt(g*g+D*D+u*u);g/=f,D/=f,u/=f;let w=g*g,x=D*D,y=u*u,b=Math.cos(e),S=Math.sin(e),I=1-b,A=w+(1-w)*b,E=g*D*I+u*S,L=g*u*I-D*S,V=g*D*I-u*S,N=x+(1-x)*b,Z=D*u*I+g*S,K=g*u*I+D*S,J=D*u*I-g*S,tt=y+(1-y)*b,ot=t[0],st=t[1],it=t[2],ct=t[3],at=t[4],dt=t[5],pt=t[6],ht=t[7],wt=t[8],Tt=t[9],St=t[10],Pt=t[11];return l[0]=A*ot+E*at+L*wt,l[1]=A*st+E*dt+L*Tt,l[2]=A*it+E*pt+L*St,l[3]=A*ct+E*ht+L*Pt,l[4]=V*ot+N*at+Z*wt,l[5]=V*st+N*dt+Z*Tt,l[6]=V*it+N*pt+Z*St,l[7]=V*ct+N*ht+Z*Pt,l[8]=K*ot+J*at+tt*wt,l[9]=K*st+J*dt+tt*Tt,l[10]=K*it+J*pt+tt*St,l[11]=K*ct+J*ht+tt*Pt,t!==l&&(l[12]=t[12],l[13]=t[13],l[14]=t[14],l[15]=t[15]),l}let n=p;function c(t,a){let e=a??new s(16);return e[0]=t[0],e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t[1],e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t[2],e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function d(t,a,e){let o=e??new s(16),l=a[0],g=a[1],D=a[2];return o[0]=l*t[0*4+0],o[1]=l*t[0*4+1],o[2]=l*t[0*4+2],o[3]=l*t[0*4+3],o[4]=g*t[1*4+0],o[5]=g*t[1*4+1],o[6]=g*t[1*4+2],o[7]=g*t[1*4+3],o[8]=D*t[2*4+0],o[9]=D*t[2*4+1],o[10]=D*t[2*4+2],o[11]=D*t[2*4+3],t!==o&&(o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}function h(t,a){let e=a??new s(16);return e[0]=t,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=t,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=t,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function M(t,a,e){let o=e??new s(16);return o[0]=a*t[0*4+0],o[1]=a*t[0*4+1],o[2]=a*t[0*4+2],o[3]=a*t[0*4+3],o[4]=a*t[1*4+0],o[5]=a*t[1*4+1],o[6]=a*t[1*4+2],o[7]=a*t[1*4+3],o[8]=a*t[2*4+0],o[9]=a*t[2*4+1],o[10]=a*t[2*4+2],o[11]=a*t[2*4+3],t!==o&&(o[12]=t[12],o[13]=t[13],o[14]=t[14],o[15]=t[15]),o}return{create:m,set:v,fromMat3:P,fromQuat:T,negate:B,copy:G,clone:_,equalsApproximately:U,equals:z,identity:R,transpose:X,inverse:Y,determinant:H,invert:F,multiply:nt,mul:rt,setTranslation:W,getTranslation:et,getAxis:Bt,setAxis:gt,getScaling:xt,perspective:Mt,perspectiveReverseZ:mt,ortho:Dt,frustum:C,frustumReverseZ:_t,aim:Ut,cameraAim:lt,lookAt:Et,translation:ft,translate:It,rotationX:j,rotateX:Lt,rotationY:vt,rotateY:At,rotationZ:yt,rotateZ:zt,axisRotation:bt,rotation:i,axisRotate:p,rotate:n,scaling:c,scale:d,uniformScaling:h,uniformScale:M}}var cn=new Map;function zr(s){let r=cn.get(s);return r||(r=_r(s),cn.set(s,r)),r}function Gr(s){let r=pe(s);function m(i,p,n,c){let d=new s(4);return i!==void 0&&(d[0]=i,p!==void 0&&(d[1]=p,n!==void 0&&(d[2]=n,c!==void 0&&(d[3]=c)))),d}let v=m;function P(i,p,n,c,d){let h=d??new s(4);return h[0]=i,h[1]=p,h[2]=n,h[3]=c,h}function T(i,p,n){let c=n??new s(4),d=p*.5,h=Math.sin(d);return c[0]=h*i[0],c[1]=h*i[1],c[2]=h*i[2],c[3]=Math.cos(d),c}function B(i,p){let n=p??r.create(3),c=Math.acos(i[3])*2,d=Math.sin(c*.5);return d>k?(n[0]=i[0]/d,n[1]=i[1]/d,n[2]=i[2]/d):(n[0]=1,n[1]=0,n[2]=0),{angle:c,axis:n}}function G(i,p){let n=C(i,p);return Math.acos(2*n*n-1)}function _(i,p,n){let c=n??new s(4),d=i[0],h=i[1],M=i[2],t=i[3],a=p[0],e=p[1],o=p[2],l=p[3];return c[0]=d*l+t*a+h*o-M*e,c[1]=h*l+t*e+M*a-d*o,c[2]=M*l+t*o+d*e-h*a,c[3]=t*l-d*a-h*e-M*o,c}let U=_;function z(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o+a*e,c[1]=M*o+t*e,c[2]=t*o-M*e,c[3]=a*o-h*e,c}function R(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o-t*e,c[1]=M*o+a*e,c[2]=t*o+h*e,c[3]=a*o-M*e,c}function X(i,p,n){let c=n??new s(4),d=p*.5,h=i[0],M=i[1],t=i[2],a=i[3],e=Math.sin(d),o=Math.cos(d);return c[0]=h*o+M*e,c[1]=M*o-h*e,c[2]=t*o+a*e,c[3]=a*o-t*e,c}function Y(i,p,n,c){let d=c??new s(4),h=i[0],M=i[1],t=i[2],a=i[3],e=p[0],o=p[1],l=p[2],g=p[3],D=h*e+M*o+t*l+a*g;D<0&&(D=-D,e=-e,o=-o,l=-l,g=-g);let u,f;if(1-D>k){let w=Math.acos(D),x=Math.sin(w);u=Math.sin((1-n)*w)/x,f=Math.sin(n*w)/x}else u=1-n,f=n;return d[0]=u*h+f*e,d[1]=u*M+f*o,d[2]=u*t+f*l,d[3]=u*a+f*g,d}function H(i,p){let n=p??new s(4),c=i[0],d=i[1],h=i[2],M=i[3],t=c*c+d*d+h*h+M*M,a=t?1/t:0;return n[0]=-c*a,n[1]=-d*a,n[2]=-h*a,n[3]=M*a,n}function F(i,p){let n=p??new s(4);return n[0]=-i[0],n[1]=-i[1],n[2]=-i[2],n[3]=i[3],n}function nt(i,p){let n=p??new s(4),c=i[0]+i[5]+i[10];if(c>0){let d=Math.sqrt(c+1);n[3]=.5*d;let h=.5/d;n[0]=(i[6]-i[9])*h,n[1]=(i[8]-i[2])*h,n[2]=(i[1]-i[4])*h}else{let d=0;i[5]>i[0]&&(d=1),i[10]>i[d*4+d]&&(d=2);let h=(d+1)%3,M=(d+2)%3,t=Math.sqrt(i[d*4+d]-i[h*4+h]-i[M*4+M]+1);n[d]=.5*t;let a=.5/t;n[3]=(i[h*4+M]-i[M*4+h])*a,n[h]=(i[h*4+d]+i[d*4+h])*a,n[M]=(i[M*4+d]+i[d*4+M])*a}return n}function rt(i,p,n,c,d){let h=d??new s(4),M=i*.5,t=p*.5,a=n*.5,e=Math.sin(M),o=Math.cos(M),l=Math.sin(t),g=Math.cos(t),D=Math.sin(a),u=Math.cos(a);switch(c){case"xyz":h[0]=e*g*u+o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u-e*l*D;break;case"xzy":h[0]=e*g*u-o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u+e*l*D;break;case"yxz":h[0]=e*g*u+o*l*D,h[1]=o*l*u-e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u+e*l*D;break;case"yzx":h[0]=e*g*u+o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u-e*l*D;break;case"zxy":h[0]=e*g*u-o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D+e*l*u,h[3]=o*g*u-e*l*D;break;case"zyx":h[0]=e*g*u-o*l*D,h[1]=o*l*u+e*g*D,h[2]=o*g*D-e*l*u,h[3]=o*g*u+e*l*D;break;default:throw new Error(`Unknown rotation order: ${c}`)}return h}function W(i,p){let n=p??new s(4);return n[0]=i[0],n[1]=i[1],n[2]=i[2],n[3]=i[3],n}let et=W;function Bt(i,p,n){let c=n??new s(4);return c[0]=i[0]+p[0],c[1]=i[1]+p[1],c[2]=i[2]+p[2],c[3]=i[3]+p[3],c}function gt(i,p,n){let c=n??new s(4);return c[0]=i[0]-p[0],c[1]=i[1]-p[1],c[2]=i[2]-p[2],c[3]=i[3]-p[3],c}let xt=gt;function Mt(i,p,n){let c=n??new s(4);return c[0]=i[0]*p,c[1]=i[1]*p,c[2]=i[2]*p,c[3]=i[3]*p,c}let mt=Mt;function Dt(i,p,n){let c=n??new s(4);return c[0]=i[0]/p,c[1]=i[1]/p,c[2]=i[2]/p,c[3]=i[3]/p,c}function C(i,p){return i[0]*p[0]+i[1]*p[1]+i[2]*p[2]+i[3]*p[3]}function _t(i,p,n,c){let d=c??new s(4);return d[0]=i[0]+n*(p[0]-i[0]),d[1]=i[1]+n*(p[1]-i[1]),d[2]=i[2]+n*(p[2]-i[2]),d[3]=i[3]+n*(p[3]-i[3]),d}function q(i){let p=i[0],n=i[1],c=i[2],d=i[3];return Math.sqrt(p*p+n*n+c*c+d*d)}let $=q;function O(i){let p=i[0],n=i[1],c=i[2],d=i[3];return p*p+n*n+c*c+d*d}let Ut=O;function lt(i,p){let n=p??new s(4),c=i[0],d=i[1],h=i[2],M=i[3],t=Math.sqrt(c*c+d*d+h*h+M*M);return t>1e-5?(n[0]=c/t,n[1]=d/t,n[2]=h/t,n[3]=M/t):(n[0]=0,n[1]=0,n[2]=0,n[3]=1),n}function Et(i,p){return Math.abs(i[0]-p[0])<k&&Math.abs(i[1]-p[1])<k&&Math.abs(i[2]-p[2])<k&&Math.abs(i[3]-p[3])<k}function ft(i,p){return i[0]===p[0]&&i[1]===p[1]&&i[2]===p[2]&&i[3]===p[3]}function It(i){let p=i??new s(4);return p[0]=0,p[1]=0,p[2]=0,p[3]=1,p}let j=r.create(),Lt=r.create(),vt=r.create();function At(i,p,n){let c=n??new s(4),d=r.dot(i,p);return d<-.999999?(r.cross(Lt,i,j),r.len(j)<1e-6&&r.cross(vt,i,j),r.normalize(j,j),T(j,Math.PI,c),c):d>.999999?(c[0]=0,c[1]=0,c[2]=0,c[3]=1,c):(r.cross(i,p,j),c[0]=j[0],c[1]=j[1],c[2]=j[2],c[3]=1+d,lt(c,c))}let yt=new s(4),zt=new s(4);function bt(i,p,n,c,d,h){let M=h??new s(4);return Y(i,c,d,yt),Y(p,n,d,zt),Y(yt,zt,2*d*(1-d),M),M}return{create:m,fromValues:v,set:P,fromAxisAngle:T,toAxisAngle:B,angle:G,multiply:_,mul:U,rotateX:z,rotateY:R,rotateZ:X,slerp:Y,inverse:H,conjugate:F,fromMat:nt,fromEuler:rt,copy:W,clone:et,add:Bt,subtract:gt,sub:xt,mulScalar:Mt,scale:mt,divScalar:Dt,dot:C,lerp:_t,length:q,len:$,lengthSq:O,lenSq:Ut,normalize:lt,equalsApproximately:Et,equals:ft,identity:It,rotationTo:At,sqlerp:bt}}var an=new Map;function Ur(s){let r=an.get(s);return r||(r=Gr(s),an.set(s,r)),r}function Er(s){function r(n,c,d,h){let M=new s(4);return n!==void 0&&(M[0]=n,c!==void 0&&(M[1]=c,d!==void 0&&(M[2]=d,h!==void 0&&(M[3]=h)))),M}let m=r;function v(n,c,d,h,M){let t=M??new s(4);return t[0]=n,t[1]=c,t[2]=d,t[3]=h,t}function P(n,c){let d=c??new s(4);return d[0]=Math.ceil(n[0]),d[1]=Math.ceil(n[1]),d[2]=Math.ceil(n[2]),d[3]=Math.ceil(n[3]),d}function T(n,c){let d=c??new s(4);return d[0]=Math.floor(n[0]),d[1]=Math.floor(n[1]),d[2]=Math.floor(n[2]),d[3]=Math.floor(n[3]),d}function B(n,c){let d=c??new s(4);return d[0]=Math.round(n[0]),d[1]=Math.round(n[1]),d[2]=Math.round(n[2]),d[3]=Math.round(n[3]),d}function G(n,c=0,d=1,h){let M=h??new s(4);return M[0]=Math.min(d,Math.max(c,n[0])),M[1]=Math.min(d,Math.max(c,n[1])),M[2]=Math.min(d,Math.max(c,n[2])),M[3]=Math.min(d,Math.max(c,n[3])),M}function _(n,c,d){let h=d??new s(4);return h[0]=n[0]+c[0],h[1]=n[1]+c[1],h[2]=n[2]+c[2],h[3]=n[3]+c[3],h}function U(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+c[0]*d,M[1]=n[1]+c[1]*d,M[2]=n[2]+c[2]*d,M[3]=n[3]+c[3]*d,M}function z(n,c,d){let h=d??new s(4);return h[0]=n[0]-c[0],h[1]=n[1]-c[1],h[2]=n[2]-c[2],h[3]=n[3]-c[3],h}let R=z;function X(n,c){return Math.abs(n[0]-c[0])<k&&Math.abs(n[1]-c[1])<k&&Math.abs(n[2]-c[2])<k&&Math.abs(n[3]-c[3])<k}function Y(n,c){return n[0]===c[0]&&n[1]===c[1]&&n[2]===c[2]&&n[3]===c[3]}function H(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+d*(c[0]-n[0]),M[1]=n[1]+d*(c[1]-n[1]),M[2]=n[2]+d*(c[2]-n[2]),M[3]=n[3]+d*(c[3]-n[3]),M}function F(n,c,d,h){let M=h??new s(4);return M[0]=n[0]+d[0]*(c[0]-n[0]),M[1]=n[1]+d[1]*(c[1]-n[1]),M[2]=n[2]+d[2]*(c[2]-n[2]),M[3]=n[3]+d[3]*(c[3]-n[3]),M}function nt(n,c,d){let h=d??new s(4);return h[0]=Math.max(n[0],c[0]),h[1]=Math.max(n[1],c[1]),h[2]=Math.max(n[2],c[2]),h[3]=Math.max(n[3],c[3]),h}function rt(n,c,d){let h=d??new s(4);return h[0]=Math.min(n[0],c[0]),h[1]=Math.min(n[1],c[1]),h[2]=Math.min(n[2],c[2]),h[3]=Math.min(n[3],c[3]),h}function W(n,c,d){let h=d??new s(4);return h[0]=n[0]*c,h[1]=n[1]*c,h[2]=n[2]*c,h[3]=n[3]*c,h}let et=W;function Bt(n,c,d){let h=d??new s(4);return h[0]=n[0]/c,h[1]=n[1]/c,h[2]=n[2]/c,h[3]=n[3]/c,h}function gt(n,c){let d=c??new s(4);return d[0]=1/n[0],d[1]=1/n[1],d[2]=1/n[2],d[3]=1/n[3],d}let xt=gt;function Mt(n,c){return n[0]*c[0]+n[1]*c[1]+n[2]*c[2]+n[3]*c[3]}function mt(n){let c=n[0],d=n[1],h=n[2],M=n[3];return Math.sqrt(c*c+d*d+h*h+M*M)}let Dt=mt;function C(n){let c=n[0],d=n[1],h=n[2],M=n[3];return c*c+d*d+h*h+M*M}let _t=C;function q(n,c){let d=n[0]-c[0],h=n[1]-c[1],M=n[2]-c[2],t=n[3]-c[3];return Math.sqrt(d*d+h*h+M*M+t*t)}let $=q;function O(n,c){let d=n[0]-c[0],h=n[1]-c[1],M=n[2]-c[2],t=n[3]-c[3];return d*d+h*h+M*M+t*t}let Ut=O;function lt(n,c){let d=c??new s(4),h=n[0],M=n[1],t=n[2],a=n[3],e=Math.sqrt(h*h+M*M+t*t+a*a);return e>1e-5?(d[0]=h/e,d[1]=M/e,d[2]=t/e,d[3]=a/e):(d[0]=0,d[1]=0,d[2]=0,d[3]=0),d}function Et(n,c){let d=c??new s(4);return d[0]=-n[0],d[1]=-n[1],d[2]=-n[2],d[3]=-n[3],d}function ft(n,c){let d=c??new s(4);return d[0]=n[0],d[1]=n[1],d[2]=n[2],d[3]=n[3],d}let It=ft;function j(n,c,d){let h=d??new s(4);return h[0]=n[0]*c[0],h[1]=n[1]*c[1],h[2]=n[2]*c[2],h[3]=n[3]*c[3],h}let Lt=j;function vt(n,c,d){let h=d??new s(4);return h[0]=n[0]/c[0],h[1]=n[1]/c[1],h[2]=n[2]/c[2],h[3]=n[3]/c[3],h}let At=vt;function yt(n){let c=n??new s(4);return c[0]=0,c[1]=0,c[2]=0,c[3]=0,c}function zt(n,c,d){let h=d??new s(4),M=n[0],t=n[1],a=n[2],e=n[3];return h[0]=c[0]*M+c[4]*t+c[8]*a+c[12]*e,h[1]=c[1]*M+c[5]*t+c[9]*a+c[13]*e,h[2]=c[2]*M+c[6]*t+c[10]*a+c[14]*e,h[3]=c[3]*M+c[7]*t+c[11]*a+c[15]*e,h}function bt(n,c,d){let h=d??new s(4);return lt(n,h),W(h,c,h)}function i(n,c,d){let h=d??new s(4);return mt(n)>c?bt(n,c,h):ft(n,h)}function p(n,c,d){let h=d??new s(4);return H(n,c,.5,h)}return{create:r,fromValues:m,set:v,ceil:P,floor:T,round:B,clamp:G,add:_,addScaled:U,subtract:z,sub:R,equalsApproximately:X,equals:Y,lerp:H,lerpV:F,max:nt,min:rt,mulScalar:W,scale:et,divScalar:Bt,inverse:gt,invert:xt,dot:Mt,length:mt,len:Dt,lengthSq:C,lenSq:_t,distance:q,dist:$,distanceSq:O,distSq:Ut,normalize:lt,negate:Et,copy:ft,clone:It,multiply:j,mul:Lt,divide:vt,div:At,zero:yt,transformMat4:zt,setLength:bt,truncate:i,midpoint:p}}var un=new Map;function Ir(s){let r=un.get(s);return r||(r=Er(s),un.set(s,r)),r}function Pe(s,r,m,v,P,T){return{mat3:Br(s),mat4:zr(r),quat:Ur(m),vec2:ln(v),vec3:pe(P),vec4:Ir(T)}}var{mat3:ys,mat4:Nt,quat:Ms,vec2:he,vec3:Yt,vec4:Be}=Pe(Float32Array,Float32Array,Float32Array,Float32Array,Float32Array,Float32Array),{mat3:Ds,mat4:bs,quat:Ts,vec2:Ss,vec3:Ps,vec4:Bs}=Pe(Float64Array,Float64Array,Float64Array,Float64Array,Float64Array,Float64Array),{mat3:_s,mat4:zs,quat:Gs,vec2:Us,vec3:Es,vec4:Is}=Pe(br,Array,Array,Array,Array,Array);var ks=Be.create(),fn=Yt.create(),pn={type:"cobalt:overlay",refs:[{name:"spritesheet",type:"customResource",access:"read"},{name:"color",type:"textView",format:"rgba8unorm",access:"write"}],onInit:async function(s,r={}){return Lr(s,r)},onRun:function(s,r,m){Ar(s,r,m)},onDestroy:function(s,r){Rr(r)},onResize:function(s,r){dn(s,r)},onViewportPosition:function(s,r){dn(s,r)},customFunctions:{...ie}};async function Lr(s,r){let{device:m}=s,v=16192,P=v,B=Float32Array.BYTES_PER_ELEMENT*2,_=Float32Array.BYTES_PER_ELEMENT*2,z=Float32Array.BYTES_PER_ELEMENT*4,X=Float32Array.BYTES_PER_ELEMENT*4,Y=m.createBuffer({size:(B+_+z+X)*P,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),H=m.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),F=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}}]}),nt=m.createBindGroup({layout:F,entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:r.refs.spritesheet.data.colorTexture.view},{binding:2,resource:r.refs.spritesheet.data.colorTexture.sampler},{binding:3,resource:{buffer:Y}}]}),rt=m.createPipelineLayout({bindGroupLayouts:[F]}),W=m.createRenderPipeline({label:"overlay",vertex:{module:m.createShaderModule({code:Se}),entryPoint:"vs_main",buffers:[r.refs.spritesheet.data.quads.bufferLayout]},fragment:{module:m.createShaderModule({code:Se}),entryPoint:"fs_main",targets:[{format:"bgra8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"zero",dstFactor:"one"}}}]},primitive:{topology:"triangle-list"},layout:rt});return{instancedDrawCalls:new Uint32Array(v*2),instancedDrawCallCount:0,spriteBuffer:Y,uniformBuffer:H,pipeline:W,bindGroupLayout:F,bindGroup:nt,spriteData:new Float32Array(v*12),spriteCount:0,spriteIndices:new Map,dirty:!1}}function Ar(s,r,m){let{device:v}=s,P=r.options.loadOp||"load";if(r.data.dirty&&(Fr(r.data),r.data.dirty=!1),r.data.spriteCount>0){let _=r.data.spriteCount*12*Float32Array.BYTES_PER_ELEMENT;v.queue.writeBuffer(r.data.spriteBuffer,0,r.data.spriteData.buffer,0,_)}let T=m.beginRenderPass({colorAttachments:[{view:r.refs.color,clearValue:s.clearValue,loadOp:P,storeOp:"store"}]});T.setPipeline(r.data.pipeline),T.setBindGroup(0,r.data.bindGroup),T.setVertexBuffer(0,r.refs.spritesheet.data.quads.buffer);let B=6,G=0;for(let _=0;_<r.data.instancedDrawCallCount;_++){let U=r.data.instancedDrawCalls[_*2]*B,z=r.data.instancedDrawCalls[_*2+1];T.draw(B,z,U,G),G+=z}T.end()}function Fr(s){let r=-1,m=0;s.instancedDrawCallCount=0;for(let v=0;v<s.spriteCount;v++){let P=s.spriteData[v*12+11]&65535;P!==r&&(m>0&&(s.instancedDrawCalls[s.instancedDrawCallCount*2]=r,s.instancedDrawCalls[s.instancedDrawCallCount*2+1]=m,s.instancedDrawCallCount++),r=P,m=0),m++}m>0&&(s.instancedDrawCalls[s.instancedDrawCallCount*2]=r,s.instancedDrawCalls[s.instancedDrawCallCount*2+1]=m,s.instancedDrawCallCount++)}function dn(s,r){let v=Math.round(s.viewport.width/1),P=Math.round(s.viewport.height/1),T=Nt.ortho(0,v,P,0,-10,10);Yt.set(0,0,0,fn);let B=Nt.translation(fn);s.device.queue.writeBuffer(r.data.uniformBuffer,0,B.buffer),s.device.queue.writeBuffer(r.data.uniformBuffer,64,T.buffer)}function Rr(s){s.data.instancedDrawCalls=null,s.data.bindGroup=null,s.data.spriteBuffer.destroy(),s.data.spriteBuffer=null,s.data.uniformBuffer.destroy(),s.data.uniformBuffer=null,s.data.spriteData=null,s.data.spriteIndices.clear(),s.data.spriteIndices=null}var ze="@binding(0)@group(0)var tileTexture:texture_2d<f32>;@binding(1)@group(0)var tileSampler:sampler;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)TexCoord:vec2<f32>};const positions=array<vec2<f32>,3>(vec2<f32>(-1.0,-3.0),vec2<f32>(3.0,1.0),vec2<f32>(-1.0,1.0));const uvs=array<vec2<f32>,3>(vec2<f32>(0.0,2.0),vec2<f32>(2.0,0.0),vec2<f32>(0.0,0.0));@vertex fn vs_main(@builtin(vertex_index)VertexIndex:u32)->Fragment{var output:Fragment;output.Position=vec4<f32>(positions[VertexIndex],0.0,1.0);output.TexCoord=vec2<f32>(uvs[VertexIndex]);return output;}@fragment fn fs_main(@location(0)TexCoord:vec2<f32>)->@location(0)vec4<f32>{var col=textureSample(tileTexture,tileSampler,TexCoord);return vec4<f32>(col.rgb,1.0);}";var hn={type:"cobalt:fbBlit",refs:[{name:"in",type:"cobaltTexture",format:"bgra8unorm",access:"read"},{name:"out",type:"cobaltTexture",format:"bgra8unorm",access:"write"}],onInit:async function(s,r={}){return Or(s,r)},onRun:function(s,r,m){qr(s,r,m)},onDestroy:function(s,r){},onResize:function(s,r){Nr(s,r)},onViewportPosition:function(s,r){}};async function Or(s,r){let{device:m}=s,v=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),P=m.createBindGroup({layout:v,entries:[{binding:0,resource:r.refs.in.data.view},{binding:1,resource:r.refs.in.data.sampler}]}),T=m.createPipelineLayout({bindGroupLayouts:[v]}),B=m.createRenderPipeline({label:"fb-blit",vertex:{module:m.createShaderModule({code:ze}),entryPoint:"vs_main",buffers:[]},fragment:{module:m.createShaderModule({code:ze}),entryPoint:"fs_main",targets:[{format:"bgra8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"zero",dstFactor:"one"}}}]},primitive:{topology:"triangle-list"},layout:T});return{bindGroupLayout:v,bindGroup:P,pipeline:B}}function qr(s,r,m){let{device:v}=s,P=m.beginRenderPass({colorAttachments:[{view:r.refs.out,clearValue:s.clearValue,loadOp:"load",storeOp:"store"}]});P.setPipeline(r.data.pipeline),P.setBindGroup(0,r.data.bindGroup),P.draw(3),P.end()}function Nr(s,r){let{device:m}=s;r.data.bindGroup=m.createBindGroup({layout:r.data.bindGroupLayout,entries:[{binding:0,resource:r.refs.in.data.view},{binding:1,resource:r.refs.in.data.sampler}]})}var wn="struct TransformData{view:mat4x4<f32>,projection:mat4x4<f32>};@binding(0)@group(0)var<uniform> transformUBO:TransformData;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)Color:vec4<f32>,};@vertex fn vs_main(@location(0)vertexPosition:vec2<f32>,@location(1)vertexColor:vec4<f32>)->Fragment{var sx:f32=1.0;var sy:f32=1.0;var sz:f32=1.0;var rot:f32=0.0;var tx:f32=1.0;var ty:f32=1.0;var tz:f32=0;var s=sin(rot);var c=cos(rot);var scaleM:mat4x4<f32>=mat4x4<f32>(sx,0.0,0.0,0.0,0.0,sy,0.0,0.0,0.0,0.0,sz,0.0,0,0,0,1.0);var modelM:mat4x4<f32>=mat4x4<f32>(c,s,0.0,0.0,-s,c,0.0,0.0,0.0,0.0,1.0,0.0,tx,ty,tz,1.0)*scaleM;var output:Fragment;output.Position=transformUBO.projection*transformUBO.view*modelM*vec4<f32>(vertexPosition,0.0,1.0);output.Color=vertexColor;return output;}@fragment fn fs_main(@location(0)Color:vec4<f32>)->@location(0)vec4<f32>{return Color;}";function Ct(s,r,m,v,P,T=1){let B=he.sub(v,m),G=he.normalize(B),_=$r(G),U=T/2,z=r.data.vertexCount*6;r.data.vertices[z+0]=m[0]+_[0]*U,r.data.vertices[z+1]=m[1]+_[1]*U,r.data.vertices[z+2]=P[0],r.data.vertices[z+3]=P[1],r.data.vertices[z+4]=P[2],r.data.vertices[z+5]=P[3],r.data.vertices[z+6]=m[0]-_[0]*U,r.data.vertices[z+7]=m[1]-_[1]*U,r.data.vertices[z+8]=P[0],r.data.vertices[z+9]=P[1],r.data.vertices[z+10]=P[2],r.data.vertices[z+11]=P[3],r.data.vertices[z+12]=v[0]+_[0]*U,r.data.vertices[z+13]=v[1]+_[1]*U,r.data.vertices[z+14]=P[0],r.data.vertices[z+15]=P[1],r.data.vertices[z+16]=P[2],r.data.vertices[z+17]=P[3],r.data.vertices[z+18]=m[0]-_[0]*U,r.data.vertices[z+19]=m[1]-_[1]*U,r.data.vertices[z+20]=P[0],r.data.vertices[z+21]=P[1],r.data.vertices[z+22]=P[2],r.data.vertices[z+23]=P[3],r.data.vertices[z+24]=v[0]+_[0]*U,r.data.vertices[z+25]=v[1]+_[1]*U,r.data.vertices[z+26]=P[0],r.data.vertices[z+27]=P[1],r.data.vertices[z+28]=P[2],r.data.vertices[z+29]=P[3],r.data.vertices[z+30]=v[0]-_[0]*U,r.data.vertices[z+31]=v[1]-_[1]*U,r.data.vertices[z+32]=P[0],r.data.vertices[z+33]=P[1],r.data.vertices[z+34]=P[2],r.data.vertices[z+35]=P[3],r.data.vertexCount+=6,r.data.dirty=!0}function $r(s){return[-s[1],s[0]]}var gn={line:Ct,ellipse:function(s,r,m,v,P,T,B,G=1){let[_,U]=m,z=2*Math.PI/T;for(let R=0;R<T;R++){let X=R*z,Y=(R+1)*z,H=_+v*Math.cos(X),F=U+P*Math.sin(X),nt=_+v*Math.cos(Y),rt=U+P*Math.sin(Y);Ct(s,r,[H,F],[nt,rt],B,G)}},filledEllipse:function(s,r,m,v,P,T,B){let[G,_]=m,U=2*Math.PI/T;for(let z=0;z<T;z++){let R=z*U,X=(z+1)*U,Y=G+v*Math.cos(R),H=_+P*Math.sin(R),F=G+v*Math.cos(X),nt=_+P*Math.sin(X),W=r.data.vertexCount*6+z*18;r.data.vertices[W+0]=G,r.data.vertices[W+1]=_,r.data.vertices[W+2]=B[0],r.data.vertices[W+3]=B[1],r.data.vertices[W+4]=B[2],r.data.vertices[W+5]=B[3],r.data.vertices[W+6]=Y,r.data.vertices[W+7]=H,r.data.vertices[W+8]=B[0],r.data.vertices[W+9]=B[1],r.data.vertices[W+10]=B[2],r.data.vertices[W+11]=B[3],r.data.vertices[W+12]=F,r.data.vertices[W+13]=nt,r.data.vertices[W+14]=B[0],r.data.vertices[W+15]=B[1],r.data.vertices[W+16]=B[2],r.data.vertices[W+17]=B[3]}r.data.vertexCount+=3*T,r.data.dirty=!0},box:function(s,r,m,v,P,T,B=0,G=1){let[_,U]=m,z=v/2,R=P/2,X=[_-z,U-R],Y=[_+z,U-R],H=[_-z,U+R],F=[_+z,U+R];B!==0&&(Kt(X,m,B,X),Kt(Y,m,B,Y),Kt(H,m,B,H),Kt(F,m,B,F)),Ct(s,r,X,Y,T,G),Ct(s,r,H,F,T,G),Ct(s,r,X,H,T,G),Ct(s,r,Y,F,T,G)},filledBox:function(s,r,m,v,P,T,B=0){let[G,_]=m,U=v/2,z=P/2,R=[G-U,_-z],X=[G+U,_-z],Y=[G-U,_+z],H=[G+U,_+z];B!==0&&(Kt(R,m,B,R),Kt(X,m,B,X),Kt(Y,m,B,Y),Kt(H,m,B,H));let F=r.data.vertexCount*6;r.data.vertices[F+0]=R[0],r.data.vertices[F+1]=R[1],r.data.vertices[F+2]=T[0],r.data.vertices[F+3]=T[1],r.data.vertices[F+4]=T[2],r.data.vertices[F+5]=T[3],r.data.vertices[F+6]=Y[0],r.data.vertices[F+7]=Y[1],r.data.vertices[F+8]=T[0],r.data.vertices[F+9]=T[1],r.data.vertices[F+10]=T[2],r.data.vertices[F+11]=T[3],r.data.vertices[F+12]=X[0],r.data.vertices[F+13]=X[1],r.data.vertices[F+14]=T[0],r.data.vertices[F+15]=T[1],r.data.vertices[F+16]=T[2],r.data.vertices[F+17]=T[3],r.data.vertices[F+18]=Y[0],r.data.vertices[F+19]=Y[1],r.data.vertices[F+20]=T[0],r.data.vertices[F+21]=T[1],r.data.vertices[F+22]=T[2],r.data.vertices[F+23]=T[3],r.data.vertices[F+24]=H[0],r.data.vertices[F+25]=H[1],r.data.vertices[F+26]=T[0],r.data.vertices[F+27]=T[1],r.data.vertices[F+28]=T[2],r.data.vertices[F+29]=T[3],r.data.vertices[F+30]=X[0],r.data.vertices[F+31]=X[1],r.data.vertices[F+32]=T[0],r.data.vertices[F+33]=T[1],r.data.vertices[F+34]=T[2],r.data.vertices[F+35]=T[3],r.data.vertexCount+=6,r.data.dirty=!0},clear:function(s,r){r.data.vertexCount=0,r.data.dirty=!0}};function Kt(s,r,m,v){let P=s[0]-r[0],T=s[1]-r[1],B=Math.sin(m),G=Math.cos(m);return v[0]=P*G-T*B+r[0],v[1]=P*B+T*G+r[1],v}var xn=Yt.create(0,0,0),vn={type:"cobalt:primitives",refs:[{name:"color",type:"textView",format:"rgba8unorm",access:"write"}],onInit:async function(s,r={}){return Xr(s,r)},onRun:function(s,r,m){Hr(s,r,m)},onDestroy:function(s,r){Wr(r)},onResize:function(s,r){mn(s,r)},onViewportPosition:function(s,r){mn(s,r)},customFunctions:gn};async function Xr(s,r){let{device:m}=s,v=new Float32Array(3e5),P=m.createBuffer({size:v.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),T=m.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),B=m.createShaderModule({code:wn}),G=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}}]}),_=m.createPipelineLayout({bindGroupLayouts:[G]}),U=m.createBindGroup({layout:G,entries:[{binding:0,resource:{buffer:T}}]}),z=m.createRenderPipeline({layout:_,vertex:{module:B,entryPoint:"vs_main",buffers:[{arrayStride:6*Float32Array.BYTES_PER_ELEMENT,attributes:[{shaderLocation:0,offset:0,format:"float32x2"},{shaderLocation:1,format:"float32x4",offset:8}]}]},fragment:{module:B,entryPoint:"fs_main",targets:[{format:"bgra8unorm",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"zero",dstFactor:"one"}}}]},primitive:{topology:"triangle-list"}});return{uniformBuffer:T,vertexBuffer:P,pipeline:z,bindGroup:U,vertexCount:0,dirty:!1,vertices:v}}function Hr(s,r,m){if(r.data.vertexCount===0)return;let{device:v}=s;if(r.data.dirty){r.data.dirty=!1;let B=6*Float32Array.BYTES_PER_ELEMENT,G=r.data.vertexCount*B;if(G>r.data.vertexBuffer.size){console.warn("too many primitives, bailing");return}s.device.queue.writeBuffer(r.data.vertexBuffer,0,r.data.vertices.buffer,0,G)}let P=r.options.loadOp||"load",T=m.beginRenderPass({colorAttachments:[{view:r.refs.color,clearValue:s.clearValue,loadOp:P,storeOp:"store"}]});T.setPipeline(r.data.pipeline),T.setBindGroup(0,r.data.bindGroup),T.setVertexBuffer(0,r.data.vertexBuffer),T.draw(r.data.vertexCount),T.end()}function Wr(s){s.data.vertexBuffer.destroy(),s.data.vertexBuffer=null,s.data.uniformBuffer.destroy(),s.data.uniformBuffer=null}function mn(s,r){let{device:m}=s,v=s.viewport.width/s.viewport.zoom,P=s.viewport.height/s.viewport.zoom,T=Nt.ortho(0,v,P,0,-10,10);Yt.set(-s.viewport.position[0],-s.viewport.position[1],0,xn);let B=Nt.translation(xn);m.queue.writeBuffer(r.data.uniformBuffer,0,B.buffer),m.queue.writeBuffer(r.data.uniformBuffer,64,T.buffer)}var Ge={};Ie(Ge,{setAmbientLight:()=>Zr,setLights:()=>jr,setOccluders:()=>Qr});function jr(s,r,m){r.data.lights=m,r.data.lightsBufferNeedsUpdate=!0}function Zr(s,r,m){r.data.lightsRenderer.setAmbientLight(m)}function Qr(s,r,m){r.data.lightsRenderer.setObstacles(m),r.data.lightsTextureNeedsUpdate=!0}var we=class{invViewProjectionMatrix=Gt.identity();viewportSize={width:1,height:1};topLeft=[0,0];zoom=1;constructor(r){this.setViewportSize(r.viewportSize.width,r.viewportSize.height);let m=r.center??this.topLeft;this.setTopLeft(...m);let v=r.zoom??1;this.setZoom(v)}get invertViewProjectionMatrix(){return this.invViewProjectionMatrix}setViewportSize(r,m){this.viewportSize.width=r,this.viewportSize.height=m,this.updateMatrices()}setTopLeft(r,m){this.topLeft[0]=r,this.topLeft[1]=m,this.updateMatrices()}setZoom(r){this.zoom=r,this.updateMatrices()}updateMatrices(){Gt.identity(this.invViewProjectionMatrix),Gt.multiply(Gt.scaling([1,-1,0]),this.invViewProjectionMatrix,this.invViewProjectionMatrix),Gt.multiply(Gt.translation([1,1,0]),this.invViewProjectionMatrix,this.invViewProjectionMatrix),Gt.multiply(Gt.scaling([.5*this.viewportSize.width/this.zoom,.5*this.viewportSize.height/this.zoom,0]),this.invViewProjectionMatrix,this.invViewProjectionMatrix),Gt.multiply(Gt.translation([this.topLeft[0],this.topLeft[1],0]),this.invViewProjectionMatrix,this.invViewProjectionMatrix)}};var Vt=class s{static structs={definition:`
2
+ struct Light { // align(16) size(48)
3
+ color: vec3<f32>, // offset(0) align(16) size(12)
4
+ radius: f32, // offset(12) align(4) size(4)
5
+ position: vec2<f32>, // offset(16) align(8) size(8)
6
+ intensity: f32, // offset(24) align(4) size(4)
7
+ attenuationLinear: f32, // offset(28) align(4) size(4)
8
+ attenuationExp: f32, // offset(32) align(4) size(4)
9
+ };
10
+
11
+ struct LightsBuffer { // align(16)
12
+ count: u32, // offset(0) align(4) size(4)
13
+ // padding
14
+ lights: array<Light>, // offset(16) align(16)
15
+ };
16
+ `,light:{radius:{offset:12},position:{offset:16}},lightsBuffer:{lights:{offset:16,stride:48}}};device;maxLightsCount;currentLightsCount=0;buffer;get gpuBuffer(){return this.buffer.bufferGpu}constructor(r,m){this.device=r,this.maxLightsCount=m;let v=new ArrayBuffer(s.computeBufferBytesLength(m)),P=r.createBuffer({label:"LightsBuffer buffer",size:v.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.VERTEX});this.buffer={bufferCpu:v,bufferGpu:P},this.setLights([])}setLights(r){if(r.length>this.maxLightsCount)throw new Error(`Too many lights "${r.length}", max is "${this.maxLightsCount}".`);let m=s.computeBufferBytesLength(r.length);new Uint32Array(this.buffer.bufferCpu,0,1).set([r.length]),r.forEach((v,P)=>{new Float32Array(this.buffer.bufferCpu,s.structs.lightsBuffer.lights.offset+s.structs.lightsBuffer.lights.stride*P,9).set([...v.color,v.radius,...v.position,v.intensity,v.attenuationLinear,v.attenuationExp])}),this.device.queue.writeBuffer(this.buffer.bufferGpu,0,this.buffer.bufferCpu,0,m),this.currentLightsCount=r.length}get lightsCount(){return this.currentLightsCount}destroy(){this.buffer.bufferGpu.destroy()}static computeBufferBytesLength(r){return s.structs.lightsBuffer.lights.offset+s.structs.lightsBuffer.lights.stride*r}};var ge=class{lightsBuffer;renderPipeline;bindgroup;renderBundle;constructor(r,m,v,P){this.lightsBuffer=m;let T=r.createShaderModule({label:"LightsTextureInitializer shader module",code:`
17
+ ${Vt.structs.definition}
18
+
19
+ @group(0) @binding(0) var<storage,read> lightsBuffer: LightsBuffer;
20
+
21
+ struct VertexIn {
22
+ @builtin(vertex_index) vertexIndex: u32,
23
+ };
24
+
25
+ struct VertexOut {
26
+ @builtin(position) position: vec4<f32>,
27
+ @location(0) uv: vec2<f32>,
28
+ };
29
+
30
+ const cellsGridSizeU = vec2<u32>(${v.gridSize.x}, ${v.gridSize.y});
31
+ const cellsGridSizeF = vec2<f32>(${v.gridSize.x}, ${v.gridSize.y});
32
+
33
+ @vertex
34
+ fn main_vertex(in: VertexIn) -> VertexOut {
35
+ const corners = array<vec2<f32>, 4>(
36
+ vec2<f32>(-1, -1),
37
+ vec2<f32>(1, -1),
38
+ vec2<f32>(-1, 1),
39
+ vec2<f32>(1, 1),
40
+ );
41
+ let screenPosition = corners[in.vertexIndex];
42
+
43
+ var out: VertexOut;
44
+ out.position = vec4<f32>(screenPosition, 0.0, 1.0);
45
+ out.uv = (0.5 + 0.5 * screenPosition) * cellsGridSizeF;
46
+ return out;
47
+ }
48
+
49
+ struct FragmentOut {
50
+ @location(0) color: vec4<f32>,
51
+ };
52
+
53
+ struct LightProperties {
54
+ radius: f32,
55
+ intensity: f32,
56
+ attenuationLinear: f32,
57
+ attenuationExp: f32,
58
+ };
59
+
60
+ fn get_light_properties(lightId: u32) -> LightProperties {
61
+ var lightProperties: LightProperties;
62
+ if (lightId < lightsBuffer.count) {
63
+ let light = lightsBuffer.lights[lightId];
64
+ lightProperties.radius = light.radius;
65
+ lightProperties.intensity = 1.0;
66
+ lightProperties.attenuationLinear = light.attenuationLinear;
67
+ lightProperties.attenuationExp = light.attenuationExp;
68
+ } else {
69
+ lightProperties.radius = 0.0;
70
+ lightProperties.intensity = 0.0;
71
+ lightProperties.attenuationLinear = 0.0;
72
+ lightProperties.attenuationExp = 0.0;
73
+ }
74
+ return lightProperties;
75
+ }
76
+
77
+ @fragment
78
+ fn main_fragment(in: VertexOut) -> FragmentOut {
79
+ let cellId = vec2<u32>(in.uv);
80
+
81
+ let lightIdFrom = 4u * (cellId.x + cellId.y * cellsGridSizeU.x);
82
+ let lightProperties = array<LightProperties, 4>(
83
+ get_light_properties(lightIdFrom + 0u),
84
+ get_light_properties(lightIdFrom + 1u),
85
+ get_light_properties(lightIdFrom + 2u),
86
+ get_light_properties(lightIdFrom + 3u),
87
+ );
88
+
89
+ let sizes = vec4<f32>(
90
+ lightProperties[0].radius,
91
+ lightProperties[1].radius,
92
+ lightProperties[2].radius,
93
+ lightProperties[3].radius,
94
+ );
95
+
96
+ let localUv = fract(in.uv);
97
+ let fromCenter = 2.0 * localUv - 1.0;
98
+ let uvDistanceFromCenter = distance(vec2<f32>(0,0), fromCenter);
99
+ let distancesFromCenter = vec4<f32>(uvDistanceFromCenter / sizes * f32(${P}));
100
+
101
+ let intensities = vec4<f32>(
102
+ lightProperties[0].intensity * (1.0 + 1.0 * step(uvDistanceFromCenter, 0.01)),
103
+ lightProperties[1].intensity * (1.0 + 1.0 * step(uvDistanceFromCenter, 0.01)),
104
+ lightProperties[2].intensity * (1.0 + 1.0 * step(uvDistanceFromCenter, 0.01)),
105
+ lightProperties[3].intensity * (1.0 + 1.0 * step(uvDistanceFromCenter, 0.01)),
106
+ );
107
+ let attenuationsLinear = vec4<f32>(
108
+ lightProperties[0].attenuationLinear,
109
+ lightProperties[1].attenuationLinear,
110
+ lightProperties[2].attenuationLinear,
111
+ lightProperties[3].attenuationLinear,
112
+ );
113
+ let attenuationsExp = vec4<f32>(
114
+ lightProperties[0].attenuationExp,
115
+ lightProperties[1].attenuationExp,
116
+ lightProperties[2].attenuationExp,
117
+ lightProperties[3].attenuationExp,
118
+ );
119
+
120
+ var lightIntensities = intensities / (1.0 + distancesFromCenter * (attenuationsLinear + distancesFromCenter * attenuationsExp)); // base intensity equation
121
+ lightIntensities *= cos(distancesFromCenter * ${Math.PI/2}); // soft limit;
122
+ lightIntensities *= step(distancesFromCenter, vec4<f32>(1.0)); // hard limit
123
+
124
+ var out: FragmentOut;
125
+ out.color = lightIntensities;
126
+ return out;
127
+ }
128
+ `});this.renderPipeline=r.createRenderPipeline({label:"LightsTextureInitializer renderpipeline",layout:"auto",vertex:{module:T,entryPoint:"main_vertex"},fragment:{module:T,entryPoint:"main_fragment",targets:[{format:v.format}]},primitive:{cullMode:"none",topology:"triangle-strip"},multisample:{count:v.sampleCount}}),this.bindgroup=r.createBindGroup({label:"LightsTextureInitializer bindgroup 0",layout:this.renderPipeline.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:this.lightsBuffer.gpuBuffer}}]});let B=r.createRenderBundleEncoder({label:"LightsTextureInitializer renderbundle encoder",colorFormats:[v.format],sampleCount:v.sampleCount});B.setPipeline(this.renderPipeline),B.setBindGroup(0,this.bindgroup),B.draw(4),this.renderBundle=B.finish({label:"LightsTextureInitializer renderbundle"})}getRenderBundle(){return this.renderBundle}destroy(){}};var xe=class{device;renderPipeline;renderBundleEncoderDescriptor;renderBundle;lightsBuffer;indirectDrawing;obstacles=null;constructor(r,m,v,P){this.device=r,this.lightsBuffer=m;let T=!0,B=r.createShaderModule({label:"LightsTextureMask shader module",code:`
129
+ struct VertexIn {
130
+ @builtin(instance_index) lightIndex: u32,
131
+ @location(0) position: vec3<f32>,
132
+ @location(1) lightSize: f32,
133
+ @location(2) lightPosition: vec2<f32>,
134
+ };
135
+
136
+ struct VertexOut {
137
+ @builtin(position) position: vec4<f32>,
138
+ @location(0) color: vec4<f32>,
139
+ @location(1) localPosition: vec2<f32>,
140
+ };
141
+
142
+ const cellsGridSizeU = vec2<u32>(${v.gridSize.x}, ${v.gridSize.y});
143
+ const cellsGridSizeF = vec2<f32>(${v.gridSize.x}, ${v.gridSize.y});
144
+
145
+ @vertex
146
+ fn main_vertex(in: VertexIn) -> VertexOut {
147
+ let worldPosition = in.lightPosition + (in.position.xy - in.lightPosition) * (1.0 + 10000.0 * in.position.z);
148
+
149
+ let scaling = f32(${P});
150
+
151
+ let cellIndex = in.lightIndex / 4u;
152
+ let indexInCell = in.lightIndex % 4u;
153
+
154
+ let cellIdU = vec2<u32>(
155
+ cellIndex % cellsGridSizeU.x,
156
+ cellIndex / cellsGridSizeU.x,
157
+ );
158
+ let cellIdF = vec2<f32>(cellIdU);
159
+
160
+ var out: VertexOut;
161
+ out.localPosition = (worldPosition - in.lightPosition) / scaling;
162
+ out.position = vec4<f32>(
163
+ (out.localPosition - (cellsGridSizeF - 1.0) + 2.0 * cellIdF) / cellsGridSizeF,
164
+ 0.0,
165
+ 1.0,
166
+ );
167
+ out.color = vec4<f32>(
168
+ vec4<u32>(indexInCell) != vec4<u32>(0u, 1u, 2u, 3u),
169
+ );
170
+ return out;
171
+ }
172
+
173
+ struct FragmentOut {
174
+ @location(0) color: vec4<f32>,
175
+ };
176
+
177
+ @fragment
178
+ fn main_fragment(in: VertexOut) -> FragmentOut {
179
+ if (in.localPosition.x < -1.0 || in.localPosition.x > 1.0 || in.localPosition.y <= -1.0 || in.localPosition.y > 1.0) {
180
+ discard;
181
+ }
182
+ var out: FragmentOut;
183
+ out.color = in.color;
184
+ return out;
185
+ }
186
+ `});this.renderPipeline=r.createRenderPipeline({label:"LightsTextureMask renderpipeline",layout:"auto",vertex:{module:B,entryPoint:"main_vertex",buffers:[{attributes:[{shaderLocation:0,offset:0,format:"float32x3"}],arrayStride:3*Float32Array.BYTES_PER_ELEMENT,stepMode:"vertex"},{attributes:[{shaderLocation:1,offset:Vt.structs.light.radius.offset,format:"float32"},{shaderLocation:2,offset:Vt.structs.light.position.offset,format:"float32x2"}],arrayStride:Vt.structs.lightsBuffer.lights.stride,stepMode:"instance"}]},fragment:{module:B,entryPoint:"main_fragment",targets:[{format:v.format,blend:{color:{operation:"min",srcFactor:"one",dstFactor:"one"},alpha:{operation:"min",srcFactor:"one",dstFactor:"one"}}}]},primitive:{cullMode:T?"none":"back",topology:"triangle-list"},multisample:{count:v.sampleCount}}),this.indirectDrawing={bufferCpu:new ArrayBuffer(20),bufferGpu:r.createBuffer({label:"LightsTextureMask indirect buffer",size:20,usage:GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_DST})},this.uploadIndirectDrawingBuffer(),this.renderBundleEncoderDescriptor={label:"LightsTextureMask renderbundle encoder",colorFormats:[v.format],sampleCount:v.sampleCount},this.renderBundle=this.buildRenderBundle()}getRenderBundle(){return this.renderBundle}setObstacles(r){let m=[],v=[];for(let U of r){let z=m.length/3;m.push(...U[0],0,...U[1],0,...U[0],1,...U[1],1),v.push(z+0,z+1,z+3,z+0,z+3,z+2)}let P=!1,T=new Float32Array(m),B=this.obstacles?.positionsBufferGpu;(!B||B.size<T.byteLength)&&(B?.destroy(),B=this.device.createBuffer({label:"LightsTextureMask positions buffer",size:T.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),P=!0),this.device.queue.writeBuffer(B,0,T);let G=new Uint16Array(v),_=this.obstacles?.indexBufferGpu;(!_||_.size<G.byteLength)&&(_?.destroy(),_=this.device.createBuffer({label:"LightsTextureMask index buffer",size:G.byteLength,usage:GPUBufferUsage.INDEX|GPUBufferUsage.COPY_DST}),P=!0),this.device.queue.writeBuffer(_,0,G),this.obstacles={positionsBufferGpu:B,indexBufferGpu:_},this.setIndirectIndexCount(v.length),P&&(this.renderBundle=this.buildRenderBundle())}setLightsCount(r){this.setIndirectInstanceCount(r)}destroy(){this.indirectDrawing.bufferGpu.destroy(),this.obstacles?.positionsBufferGpu.destroy(),this.obstacles?.indexBufferGpu.destroy()}setIndirectIndexCount(r){let m=new Uint32Array(this.indirectDrawing.bufferCpu);m[0]!==r&&(m[0]=r,this.uploadIndirectDrawingBuffer())}setIndirectInstanceCount(r){let m=new Uint32Array(this.indirectDrawing.bufferCpu);m[1]!==r&&(m[1]=r,this.uploadIndirectDrawingBuffer())}buildRenderBundle(){let r=this.device.createRenderBundleEncoder(this.renderBundleEncoderDescriptor);return this.obstacles&&(r.setPipeline(this.renderPipeline),r.setVertexBuffer(0,this.obstacles.positionsBufferGpu),r.setVertexBuffer(1,this.lightsBuffer.gpuBuffer,Vt.structs.lightsBuffer.lights.offset),r.setIndexBuffer(this.obstacles.indexBufferGpu,"uint16"),r.drawIndexedIndirect(this.indirectDrawing.bufferGpu,0)),r.finish({label:"LightsTextureMask renderbundle"})}uploadIndirectDrawingBuffer(){this.device.queue.writeBuffer(this.indirectDrawing.bufferGpu,0,this.indirectDrawing.bufferCpu)}};var me=class{lightsBuffer;texture;gridSize;textureMultisampled=null;textureRenderpassDescriptor;textureInitializer;textureMask;constructor(r,m,v){this.lightsBuffer=m;let P=this.lightsBuffer.maxLightsCount/4,T={x:Math.ceil(Math.sqrt(P)),y:0};T.y=Math.ceil(P/T.x),this.gridSize=T;let B={width:T.x*v.resolutionPerLight,height:T.y*v.resolutionPerLight},G="rgba8unorm";this.texture=r.createTexture({label:"LightsTextureMask texture",size:[B.width,B.height],format:G,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT}),v.antialiased&&(this.textureMultisampled=r.createTexture({label:"LightsTextureMask texture multisampled",size:[B.width,B.height],format:G,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT,sampleCount:4}));let U={view:(this.textureMultisampled??this.texture).createView(),clearValue:[0,0,0,1],loadOp:"load",storeOp:"store"};v.antialiased&&(U.resolveTarget=this.texture.createView()),this.textureRenderpassDescriptor={label:"lights-renderer render to texture renderpass",colorAttachments:[U]};let z={gridSize:T,format:G,sampleCount:this.textureMultisampled?.sampleCount??1};this.textureInitializer=new ge(r,m,z,v.maxLightSize),this.textureMask=new xe(r,m,z,v.maxLightSize)}update(r){this.textureMask.setLightsCount(this.lightsBuffer.lightsCount);let m=r.beginRenderPass(this.textureRenderpassDescriptor),[v,P]=[this.texture.width,this.texture.height];m.setViewport(0,0,v,P,0,1),m.setScissorRect(0,0,v,P),m.executeBundles([this.textureInitializer.getRenderBundle(),this.textureMask.getRenderBundle()]),m.end()}setObstacles(r){this.textureMask.setObstacles(r)}destroy(){this.texture.destroy(),this.textureMultisampled?.destroy(),this.textureInitializer.destroy(),this.textureMask.destroy()}};var ve=class{device;ambientLight=[.2,.2,.2];targetTexture;renderPipeline;uniformsBufferGpu;bindgroup0;bindgroup1;renderBundle;lightsBuffer;lightsTexture;constructor(r){this.device=r.device,this.targetTexture=r.targetTexture,this.lightsBuffer=r.lightsBuffer,this.lightsTexture=new me(r.device,r.lightsBuffer,r.lightsTextureProperties),this.uniformsBufferGpu=r.device.createBuffer({label:"LightsRenderer uniforms buffer",size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});let m=r.device.createShaderModule({label:"LightsRenderer shader module",code:`
187
+ struct Uniforms { // align(16) size(80)
188
+ invertViewMatrix: mat4x4<f32>, // offset(0) align(16) size(64)
189
+ ambientLight: vec3<f32>, // offset(64) align(16) size(12)
190
+ };
191
+
192
+ ${Vt.structs.definition}
193
+
194
+ @group(0) @binding(0) var<uniform> uniforms: Uniforms;
195
+ @group(0) @binding(1) var<storage,read> lightsBuffer: LightsBuffer;
196
+ @group(0) @binding(2) var lightsTexture: texture_2d<f32>;
197
+ @group(0) @binding(3) var lightsTextureSampler: sampler;
198
+
199
+ @group(1) @binding(0) var albedoTexture: texture_2d<f32>;
200
+ @group(1) @binding(1) var albedoSampler: sampler;
201
+
202
+ struct VertexIn {
203
+ @builtin(vertex_index) vertexIndex: u32,
204
+ };
205
+
206
+ struct VertexOut {
207
+ @builtin(position) position: vec4<f32>,
208
+ @location(0) worldPosition: vec2<f32>,
209
+ @location(1) uv: vec2<f32>,
210
+ };
211
+
212
+ @vertex
213
+ fn main_vertex(in: VertexIn) -> VertexOut {
214
+ const corners = array<vec2<f32>, 4>(
215
+ vec2<f32>(-1, -1),
216
+ vec2<f32>(1, -1),
217
+ vec2<f32>(-1, 1),
218
+ vec2<f32>(1, 1),
219
+ );
220
+ let screenPosition = corners[in.vertexIndex];
221
+
222
+ var out: VertexOut;
223
+ out.position = vec4<f32>(screenPosition, 0.0, 1.0);
224
+ out.worldPosition = (uniforms.invertViewMatrix * out.position).xy;
225
+ out.uv = 0.5 + 0.5 * screenPosition * vec2<f32>(1.0, -1.0);
226
+ return out;
227
+ }
228
+
229
+ struct FragmentOut {
230
+ @location(0) color: vec4<f32>,
231
+ };
232
+
233
+ const cellsGridSizeU = vec2<u32>(${this.lightsTexture.gridSize.x}, ${this.lightsTexture.gridSize.y});
234
+ const cellsGridSizeF = vec2<f32>(${this.lightsTexture.gridSize.x}, ${this.lightsTexture.gridSize.y});
235
+
236
+ fn sampleLightBaseIntensity(lightId: u32, localUv: vec2<f32>) -> f32 {
237
+ let cellIndex = lightId / 4u;
238
+ let indexInCell = lightId % 4u;
239
+
240
+ let cellIdU = vec2<u32>(
241
+ cellIndex % cellsGridSizeU.x,
242
+ cellIndex / cellsGridSizeU.x,
243
+ );
244
+ let cellIdF = vec2<f32>(cellIdU);
245
+ let uv = (cellIdF + localUv) / cellsGridSizeF;
246
+ let uvYInverted = vec2<f32>(uv.x, 1.0 - uv.y);
247
+ let sample = textureSampleLevel(lightsTexture, lightsTextureSampler, uvYInverted, 0.0);
248
+ let channel = vec4<f32>(
249
+ vec4<u32>(indexInCell) == vec4<u32>(0u, 1u, 2u, 3u),
250
+ );
251
+ return dot(sample, channel);
252
+ }
253
+
254
+ fn compute_lights(worldPosition: vec2<f32>) -> vec3<f32> {
255
+ var color = vec3<f32>(uniforms.ambientLight);
256
+
257
+ const maxUvDistance = f32(${1-2/r.lightsTextureProperties.resolutionPerLight});
258
+
259
+ let lightsCount = lightsBuffer.count;
260
+ for (var iLight = 0u; iLight < lightsCount; iLight++) {
261
+ let light = lightsBuffer.lights[iLight];
262
+ let lightSize = f32(${r.lightsTextureProperties.resolutionPerLight});
263
+ let relativePosition = (worldPosition - light.position) / lightSize;
264
+ if (max(abs(relativePosition.x), abs(relativePosition.y)) < maxUvDistance) {
265
+ let localUv = 0.5 + 0.5 * relativePosition;
266
+ let lightIntensity = light.intensity * sampleLightBaseIntensity(iLight, localUv);
267
+ color += lightIntensity * light.color;
268
+ }
269
+ }
270
+
271
+ return color;
272
+ }
273
+
274
+ @fragment
275
+ fn main_fragment(in: VertexOut) -> FragmentOut {
276
+ let light = compute_lights(in.worldPosition);
277
+ let albedo = textureSample(albedoTexture, albedoSampler, in.uv);
278
+ let color = albedo.rgb * light;
279
+
280
+ var out: FragmentOut;
281
+ out.color = vec4<f32>(color, 1.0);
282
+ return out;
283
+ }
284
+ `});this.renderPipeline=r.device.createRenderPipeline({label:"LightsRenderer renderpipeline",layout:"auto",vertex:{module:m,entryPoint:"main_vertex"},fragment:{module:m,entryPoint:"main_fragment",targets:[{format:this.targetTexture.format}]},primitive:{cullMode:"none",topology:"triangle-strip"}});let v=this.renderPipeline.getBindGroupLayout(0);this.bindgroup0=r.device.createBindGroup({label:"LightsRenderer bindgroup 0",layout:v,entries:[{binding:0,resource:{buffer:this.uniformsBufferGpu}},{binding:1,resource:{buffer:this.lightsBuffer.gpuBuffer}},{binding:2,resource:this.lightsTexture.texture.createView({label:"LightsRenderer lightsTexture view"})},{binding:3,resource:r.device.createSampler({label:"LightsRenderer sampler",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",magFilter:r.lightsTextureProperties.filtering,minFilter:r.lightsTextureProperties.filtering})}]}),this.bindgroup1=this.buildBindgroup1(r.albedo),this.renderBundle=this.buildRenderBundle()}computeLightsTexture(r){this.lightsTexture.update(r)}render(r,m){let v=new ArrayBuffer(80);new Float32Array(v,0,16).set(m),new Float32Array(v,64,3).set(this.ambientLight),this.device.queue.writeBuffer(this.uniformsBufferGpu,0,v),r.executeBundles([this.renderBundle])}setAlbedo(r){this.bindgroup1=this.buildBindgroup1(r),this.renderBundle=this.buildRenderBundle()}setAmbientLight(r){this.ambientLight=[...r]}setObstacles(r){this.lightsTexture.setObstacles(r)}destroy(){this.uniformsBufferGpu.destroy(),this.lightsTexture.destroy()}buildBindgroup1(r){return this.device.createBindGroup({label:"LightsRenderer bindgroup 1",layout:this.renderPipeline.getBindGroupLayout(1),entries:[{binding:0,resource:r.view},{binding:1,resource:r.sampler}]})}buildRenderBundle(){let r=this.device.createRenderBundleEncoder({label:"LightsRenderer renderbundle encoder",colorFormats:[this.targetTexture.format]});return r.setPipeline(this.renderPipeline),r.setBindGroup(0,this.bindgroup0),r.setBindGroup(1,this.bindgroup1),r.draw(4),r.finish({label:"LightsRenderer renderbundle"})}};var yn={type:"cobalt:light",refs:[{name:"in",type:"textureView",format:"rgba16float",access:"read"},{name:"out",type:"textureView",format:"rgba16float",access:"write"}],onInit:async function(s,r={}){return kr(s,r)},onRun:function(s,r,m){Kr(s,r,m)},onDestroy:function(s,r){Jr(r)},onResize:function(s,r){Cr(s,r)},onViewportPosition:function(s,r){r.data.viewport.setTopLeft(...s.viewport.position)},customFunctions:{...Ge}};async function kr(s,r){let{device:m}=s,v=256,P=256,T=new Vt(m,v),B=new we({viewportSize:{width:s.viewport.width,height:s.viewport.height},center:s.viewport.position,zoom:s.viewport.zoom}),G=new ve({device:m,albedo:{view:r.refs.in.data.view,sampler:r.refs.in.data.sampler},targetTexture:r.refs.out.data.texture,lightsBuffer:T,lightsTextureProperties:{resolutionPerLight:P,maxLightSize:P,antialiased:!1,filtering:"nearest"}});return{lightsBuffer:T,lightsBufferNeedsUpdate:!0,lightsTextureNeedsUpdate:!0,lightsRenderer:G,viewport:B,lights:[]}}function Kr(s,r,m){r.data.lightsBufferNeedsUpdate&&(r.data.lightsBuffer.setLights(r.data.lights),r.data.lightsBufferNeedsUpdate=!1,r.data.lightsTextureNeedsUpdate=!0);let v=r.data.lightsRenderer;r.data.lightsTextureNeedsUpdate&&(v.computeLightsTexture(m),r.data.lightsTextureNeedsUpdate=!1);let P=m.beginRenderPass({colorAttachments:[{view:r.refs.out.data.view,clearValue:s.clearValue,loadOp:"load",storeOp:"store"}]});r.data.viewport.setZoom(s.viewport.zoom);let T=r.data.viewport.invertViewProjectionMatrix;v.render(P,T),P.end()}function Jr(s){s.data.lightsBuffer.destroy(),s.data.lightsRenderer.destroy()}function Cr(s,r){r.data.lightsRenderer.setAlbedo({view:r.refs.in.data.view,sampler:r.refs.in.data.sampler}),r.data.viewport.setViewportSize(s.viewport.width,s.viewport.height)}var Ue="struct TransformData{viewOffset:vec2<f32>,viewportSize:vec2<f32>,inverseAtlasTextureSize:vec2<f32>,tileSize:f32,inverseTileSize:f32,};struct TileScroll{scrollScale:vec2<f32>};const positions=array<vec2<f32>,3>(vec2<f32>(-1.0,-3.0),vec2<f32>(3.0,1.0),vec2<f32>(-1.0,1.0));const uvs=array<vec2<f32>,3>(vec2<f32>(0.0,2.0),vec2<f32>(2.0,0.0),vec2<f32>(0.0,0.0));@binding(0)@group(0)var<uniform> myScroll:TileScroll;@binding(1)@group(0)var tileTexture:texture_2d<f32>;@binding(2)@group(0)var tileSampler:sampler;@binding(0)@group(1)var<uniform> transformUBO:TransformData;@binding(1)@group(1)var atlasTexture:texture_2d<f32>;@binding(2)@group(1)var atlasSampler:sampler;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)TexCoord:vec2<f32>};@vertex fn vs_main(@builtin(instance_index)i_id:u32,@builtin(vertex_index)VertexIndex:u32)->Fragment{var vertexPosition=vec2<f32>(positions[VertexIndex]);var vertexTexCoord=vec2<f32>(uvs[VertexIndex]);var output:Fragment;let inverseTileTextureSize=1/vec2<f32>(textureDimensions(tileTexture,0));var scrollScale=myScroll.scrollScale;var viewOffset:vec2<f32>=transformUBO.viewOffset*scrollScale;let PixelCoord=(vertexTexCoord*transformUBO.viewportSize)+viewOffset;output.TexCoord=PixelCoord/transformUBO.tileSize;output.Position=vec4<f32>(vertexPosition,0.0,1.0);return output;}@fragment fn fs_main(@location(0)TexCoord:vec2<f32>)->@location(0)vec4<f32>{var tilemapCoord=floor(TexCoord);var u_tilemapSize=vec2<f32>(textureDimensions(tileTexture,0));var tileFoo=fract((tilemapCoord+vec2<f32>(0.5,0.5))/u_tilemapSize);var tile=floor(textureSample(tileTexture,tileSampler,tileFoo)*255.0);if(tile.x==255&&tile.y==255){discard;}var u_tilesetSize=vec2<f32>(textureDimensions(atlasTexture,0))/transformUBO.tileSize;let u_tileUVMinBounds=vec2<f32>(0.5/transformUBO.tileSize,0.5/transformUBO.tileSize);let u_tileUVMaxBounds=vec2<f32>((transformUBO.tileSize-0.5)/transformUBO.tileSize,(transformUBO.tileSize-0.5)/transformUBO.tileSize);var texcoord=clamp(fract(TexCoord),u_tileUVMinBounds,u_tileUVMaxBounds);var tileCoord=(tile.xy+texcoord)/u_tilesetSize;var color=textureSample(atlasTexture,atlasSampler,tileCoord);if(color.a<=0.1){discard;}return color;}";var kt=new Float32Array(8),Dn={type:"cobalt:tileAtlas",refs:[],onInit:async function(s,r={}){return eo(s,r)},onRun:function(s,r,m){},onDestroy:function(s,r){no(data)},onResize:function(s,r){Mn(s,r)},onViewportPosition:function(s,r){Mn(s,r)}};async function eo(s,r){let{device:m}=s,v=await qt(s,"tile atlas",r.options.textureUrl),P=m.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),T=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),B=m.createBindGroup({layout:T,entries:[{binding:0,resource:{buffer:P}},{binding:1,resource:v.view},{binding:2,resource:v.sampler}]}),G=m.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),_=m.createPipelineLayout({bindGroupLayouts:[G,T]});return{pipeline:m.createRenderPipeline({label:"tile",vertex:{module:m.createShaderModule({code:Ue}),entryPoint:"vs_main",buffers:[]},fragment:{module:m.createShaderModule({code:Ue}),entryPoint:"fs_main",targets:[{format:"rgba16float",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"zero",dstFactor:"one"}}}]},primitive:{topology:"triangle-list"},layout:_}),uniformBuffer:P,atlasBindGroup:B,atlasMaterial:v,tileBindGroupLayout:G,tileSize:r.options.tileSize,tileScale:r.options.tileScale}}function no(s){s.atlasMaterial.texture.destroy(),s.atlasMaterial.texture=void 0}function Mn(s,r){kt[0]=s.viewport.position[0],kt[1]=s.viewport.position[1];let m=r.data,{tileScale:v,tileSize:P}=m,T=s.viewport.width/s.viewport.zoom,B=s.viewport.height/s.viewport.zoom;kt[2]=T/v,kt[3]=B/v,kt[4]=1/m.atlasMaterial.texture.width,kt[5]=1/m.atlasMaterial.texture.height,kt[6]=P,kt[7]=1/P,s.device.queue.writeBuffer(m.uniformBuffer,0,kt,0,8)}function ye(s){let m=Object.keys(s.frames).length,v=new Float32Array(m*30),P=[],T={},B=0;for(let G in s.frames){let _=s.frames[G];P.push(G),T[G]=_.sourceSize;let U=-.5+_.spriteSourceSize.x/_.sourceSize.w,z=-.5+_.spriteSourceSize.y/_.sourceSize.h,R=-.5+(_.spriteSourceSize.x+_.spriteSourceSize.w)/_.sourceSize.w,X=-.5+(_.spriteSourceSize.y+_.spriteSourceSize.h)/_.sourceSize.h,Y=[U,z,0],H=[U,X,0],F=[R,X,0],nt=[R,z,0],rt=0+_.frame.x/s.meta.size.w,W=0+_.frame.y/s.meta.size.h,et=0+(_.frame.x+_.frame.w)/s.meta.size.w,Bt=0+(_.frame.y+_.frame.h)/s.meta.size.h,gt=[rt,W],xt=[rt,Bt],Mt=[et,Bt],mt=[et,W];v.set(Y,B),v.set(gt,B+3),v.set(H,B+5),v.set(xt,B+8),v.set(F,B+10),v.set(Mt,B+13),v.set(Y,B+15),v.set(gt,B+18),v.set(F,B+20),v.set(Mt,B+23),v.set(nt,B+25),v.set(mt,B+28),B+=30}return{spriteMeta:T,locations:P,vertices:v}}var Ee="struct TransformData{view:mat4x4<f32>,projection:mat4x4<f32>};struct Sprite{translate:vec2<f32>,scale:vec2<f32>,tint:vec4<f32>,opacity:f32,rotation:f32,emissiveIntensity:f32,sortValue:f32,};struct SpritesBuffer{models:array<Sprite>,};@binding(0)@group(0)var<uniform> transformUBO:TransformData;@binding(1)@group(0)var myTexture:texture_2d<f32>;@binding(2)@group(0)var mySampler:sampler;@binding(3)@group(0)var<storage,read>sprites:SpritesBuffer;@binding(4)@group(0)var emissiveTexture:texture_2d<f32>;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)TexCoord:vec2<f32>,@location(1)Tint:vec4<f32>,@location(2)Opacity:f32,};struct GBufferOutput{@location(0)color:vec4<f32>,@location(1)emissive:vec4<f32>,}@vertex fn vs_main(@builtin(instance_index)i_id:u32,@location(0)vertexPosition:vec3<f32>,@location(1)vertexTexCoord:vec2<f32>)->Fragment{var output:Fragment;var sx:f32=sprites.models[i_id].scale.x;var sy:f32=sprites.models[i_id].scale.y;var sz:f32=1.0;var rot:f32=sprites.models[i_id].rotation;var tx:f32=sprites.models[i_id].translate.x;var ty:f32=sprites.models[i_id].translate.y;var tz:f32=0;var s=sin(rot);var c=cos(rot);var scaleM:mat4x4<f32>=mat4x4<f32>(sx,0.0,0.0,0.0,0.0,sy,0.0,0.0,0.0,0.0,sz,0.0,0,0,0,1.0);var modelM:mat4x4<f32>=mat4x4<f32>(c,s,0.0,0.0,-s,c,0.0,0.0,0.0,0.0,1.0,0.0,tx,ty,tz,1.0)*scaleM;output.Position=transformUBO.projection*transformUBO.view*modelM*vec4<f32>(vertexPosition,1.0);output.TexCoord=vertexTexCoord;output.Tint=sprites.models[i_id].tint;output.Opacity=sprites.models[i_id].opacity;return output;}@fragment fn fs_main(@location(0)TexCoord:vec2<f32>,@location(1)Tint:vec4<f32>,@location(2)Opacity:f32)->GBufferOutput{var output:GBufferOutput;var outColor:vec4<f32>=textureSample(myTexture,mySampler,TexCoord);output.color=vec4<f32>(outColor.rgb*(1.0-Tint.a)+(Tint.rgb*Tint.a),outColor.a*Opacity);let emissive=textureSample(emissiveTexture,mySampler,TexCoord);output.emissive=vec4(emissive.rgb,1.0)*emissive.a;return output;}";var bn=Yt.create(0,0,0),Sn={type:"cobalt:spritesheet",refs:[],onInit:async function(s,r={}){return oo(s,r)},onRun:function(s,r,m){},onDestroy:function(s,r){so(r)},onResize:function(s,r){Tn(s,r)},onViewportPosition:function(s,r){Tn(s,r)}};async function oo(s,r){let{canvas:m,device:v}=s,P,T,B;m?(P=await io(r.options.spriteSheetJsonUrl),P=ye(P),T=await qt(s,"sprite",r.options.colorTextureUrl,"rgba8unorm"),B=await qt(s,"emissive sprite",r.options.emissiveTextureUrl,"rgba8unorm"),m.style.imageRendering="pixelated"):(P=ye(r.options.spriteSheetJson),T=await oe(s,"sprite",r.options.colorTexture,"rgba8unorm"),B=await oe(s,"emissive sprite",r.options.emissiveTexture,"rgba8unorm"));let G=Te(v,P),_=v.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),U=v.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.FRAGMENT,texture:{}}]}),z=v.createPipelineLayout({bindGroupLayouts:[U]});return{pipeline:v.createRenderPipeline({label:"sprite",vertex:{module:v.createShaderModule({code:Ee}),entryPoint:"vs_main",buffers:[G.bufferLayout]},fragment:{module:v.createShaderModule({code:Ee}),entryPoint:"fs_main",targets:[{format:"rgba16float",blend:{color:{srcFactor:"src-alpha",dstFactor:"one-minus-src-alpha"},alpha:{srcFactor:"zero",dstFactor:"one"}}},{format:"rgba16float"}]},primitive:{topology:"triangle-list"},layout:z}),uniformBuffer:_,quads:G,colorTexture:T,emissiveTexture:B,bindGroupLayout:U,spritesheet:P}}function so(s){s.data.quads.buffer.destroy(),s.data.colorTexture.buffer.destroy(),s.data.uniformBuffer.destroy(),s.data.emissiveTexture.texture.destroy()}async function io(s){return(await fetch(s)).json()}function Tn(s,r){let{device:m,viewport:v}=s,P=v.width/v.zoom,T=v.height/v.zoom,B=Nt.ortho(0,P,T,0,-10,10);Yt.set(-v.position[0],-v.position[1],0,bn);let G=Nt.translation(bn);m.queue.writeBuffer(r.data.uniformBuffer,0,G.buffer),m.queue.writeBuffer(r.data.uniformBuffer,64,B.buffer)}var Pn={type:"fbTexture",refs:[],onInit:async function(s,r={}){return co(s,r)},onRun:function(s,r,m){},onDestroy:function(s,r){Bn(data)},onResize:function(s,r){ao(s,r)},onViewportPosition:function(s,r){}};async function co(s,r){let{device:m}=s,{label:v,mip_count:P,format:T,usage:B,viewportScale:G}=r.options;return Rt(m,v,s.viewport.width*G,s.viewport.height*G,P,T,B)}function Bn(s){s.data.texture.destroy()}function ao(s,r){let{device:m}=s;Bn(r);let{width:v,height:P}=s.viewport,{options:T}=r,B=r.options.viewportScale;r.data=Rt(m,T.label,v*B,P*B,T.mip_count,T.format,T.usage)}async function cc(s,r,m){let v,P,T,B;return s.sdlWindow&&s.gpu?(P=s.gpu,v=await(await P.create(["verbose=1"]).requestAdapter()).requestDevice(),T=P.renderGPUDeviceToWindow({device:v,window:s.sdlWindow}),global.GPUBufferUsage=P.GPUBufferUsage,global.GPUShaderStage=P.GPUShaderStage,global.GPUTextureUsage=P.GPUTextureUsage):(B=s,v=await(await navigator.gpu?.requestAdapter({powerPreference:"high-performance"}))?.requestDevice(),P=navigator.gpu,T=B.getContext("webgpu"),T.configure({device:v,format:navigator.gpu?.getPreferredCanvasFormat(),alphaMode:"opaque"})),{nodeDefs:{"cobalt:tileAtlas":Dn,"cobalt:spritesheet":Sn,"cobalt:fbTexture":Pn,"cobalt:bloom":Re,"cobalt:composite":qe,"cobalt:sprite":$e,"cobalt:tile":He,"cobalt:displacement":nn,"cobalt:overlay":pn,"cobalt:fbBlit":hn,"cobalt:primitives":vn,"cobalt:light":yn},nodes:[],defaultTextureViewRefs:[],canvas:B,device:v,context:T,gpu:P,clearValue:{r:0,g:0,b:0,a:1},viewport:{width:r,height:m,zoom:1,position:[0,0]}}}function ac(s,r){if(!r?.type)throw new Error("Can't define a new node missing a type.");s.nodeDefs[r.type]=r}async function uc(s,r){let m=s.nodeDefs[r?.type];if(!m)throw new Error("Can't initialize a new node missing a type.");let v={type:r.type,refs:r.refs||{},options:r.options||{},data:{},enabled:!0};for(let T in v.refs)v.refs[T]==="FRAME_TEXTURE_VIEW"&&(s.defaultTextureViewRefs.push({node:v,refName:T}),v.refs[T]=_n(s));v.data=await m.onInit(s,v);let P=m.customFunctions||{};for(let T in P)v[T]=function(...B){return P[T](s,v,...B)};return s.nodes.push(v),v}function lc(s){let{device:r,context:m}=s,v=r.createCommandEncoder(),P=_n(s);for(let T of s.defaultTextureViewRefs)T.node.refs[T.refName]=P;for(let T of s.nodes){if(!T.enabled)continue;s.nodeDefs[T.type].onRun(s,T,v)}r.queue.submit([v.finish()]),s.canvas||s.context.swap()}function fc(s){for(let r of s.nodes)s.nodeDefs[r.type].onDestroy(s,r);s.nodes.length=0,s.defaultTextureViewRefs.length=0}function dc(s,r,m){s.viewport.width=r,s.viewport.height=m;for(let v of s.nodes)s.nodeDefs[v.type].onResize(s,v)}function pc(s,r){s.viewport.position[0]=r[0]-s.viewport.width/2/s.viewport.zoom,s.viewport.position[1]=r[1]-s.viewport.height/2/s.viewport.zoom;for(let m of s.nodes)s.nodeDefs[m.type].onViewportPosition(s,m)}function Ne(s){return s.canvas?navigator.gpu.getPreferredCanvasFormat():s.context.getPreferredFormat()}function _n(s){return s.canvas?s.context.getCurrentTexture().createView():s.context.getCurrentTextureView()}export{Rt as createTexture,oe as createTextureFromBuffer,qt as createTextureFromUrl,ac as defineNode,lc as draw,_n as getCurrentTextureView,Ne as getPreferredFormat,cc as init,uc as initNode,fc as reset,dc as setViewportDimensions,pc as setViewportPosition};