-
Notifications
You must be signed in to change notification settings - Fork 0
/
bundle.js
1 lines (1 loc) · 78.3 KB
/
bundle.js
1
var Zt=Object.defineProperty;var Kt=(t,e)=>{for(var n in e)Zt(t,n,{get:e[n],enumerable:!0})};function Y(t,e,n,r,o,i,a){let l=t.createTexture({label:e,size:{width:n,height:r},format:i,usage:a,mipLevelCount:o,sampleCount:1,dimension:"2d"}),u=l.createView(),f=[];for(let s=0;s<o;s++)f.push(l.createView({label:e,format:i,dimension:"2d",aspect:"all",baseMipLevel:s,mipLevelCount:1,baseArrayLayer:0,arrayLayerCount:1}));let c=t.createSampler({label:`${e} sampler`,addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",addressModeW:"clamp-to-edge",magFilter:"linear",minFilter:"linear",mipmapFilter:"linear"});return{size:{width:n,height:r},texture:l,view:u,mip_view:f,sampler:c}}async function K(t,e,n,r="rgba8unorm"){let i=await(await fetch(n)).blob(),a=await createImageBitmap(i),l=GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT,f=Y(t.device,e,a.width,a.height,1,r,l);t.device.queue.copyExternalImageToTexture({source:a},{texture:f.texture},{width:a.width,height:a.height});let c={addressModeU:"repeat",addressModeV:"repeat",magFilter:"nearest",minFilter:"nearest",mipmapFilter:"nearest",maxAnisotropy:1};return f.sampler=t.device.createSampler(c),f}function ne(t,e,n,r="rgba8unorm"){let o=GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT,a=Y(t.device,e,n.width,n.height,1,r,o);t.device.queue.writeTexture({texture:a.texture},n.data,{bytesPerRow:4*n.width},{width:n.width,height:n.height});let l={addressModeU:"repeat",addressModeV:"repeat",magFilter:"nearest",minFilter:"nearest",mipmapFilter:"nearest",maxAnisotropy:1};return a.sampler=t.device.createSampler(l),a}var Pe="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 Z=7,Jt=0,Ae=1,dt=2,Ie=3,$e={type:"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(t,e={}){return en(t,e)},onRun:function(t,e,n){tn(t,e.data,n)},onDestroy:function(t,e){Oe(e)},onResize:function(t,e){nn(t,e)},onViewportPosition:function(t,e){}};function en(t,e){let{device:n}=t,r=t.viewport.width,o=t.viewport.height,i={compute_pipeline:null,bind_group:[],bind_group_layout:[],bind_groups_textures:[]},a=n.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"}}]});i.bind_group_layout.push(a),i.bind_groups_textures.push(Y(n,"bloom downsampler image 0",r/2,o/2,Z,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),i.bind_groups_textures.push(Y(n,"bloom downsampler image 1",r/2,o/2,Z,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),i.bind_groups_textures.push(e.refs.bloom.data);let l=n.createPipelineLayout({bindGroupLayouts:i.bind_group_layout}),u=n.createComputePipeline({layout:l,compute:{module:n.createShaderModule({code:Pe}),entryPoint:"cs_main"}});return Re(t,i,e),i.compute_pipeline=u,i}function Re(t,e,n){let{refs:r}=n,{device:o}=t,i=n.options.bloom_threshold??.1,a=n.options.bloom_knee??.2,l=n.options.bloom_combine_constant??.68,u=new Float32Array([i,i-a,a*2,.25/a,l,0,0,0]),f=o.createBuffer({label:"bloom static parameters buffer",size:u.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});new Float32Array(f.getMappedRange()).set(u),f.unmap(),e.bind_group.length=0,e.params_buf=f,e.bind_group.push(te(o,e,e.bind_groups_textures[0].mip_view[0],r.emissive.data.view,r.hdr.data.view,r.hdr.data.sampler,f,Jt<<16|0));for(let s=1;s<Z;s++)e.bind_group.push(te(o,e,e.bind_groups_textures[1].mip_view[s],e.bind_groups_textures[0].view,r.hdr.data.view,r.hdr.data.sampler,f,Ae<<16|s-1)),e.bind_group.push(te(o,e,e.bind_groups_textures[0].mip_view[s],e.bind_groups_textures[1].view,r.hdr.data.view,r.hdr.data.sampler,f,Ae<<16|s));e.bind_group.push(te(o,e,e.bind_groups_textures[2].mip_view[Z-1],e.bind_groups_textures[0].view,r.hdr.data.view,r.hdr.data.sampler,f,dt<<16|Z-2));let c=!0;for(let s=Z-2;s>=0;s--)c?(e.bind_group.push(te(o,e,e.bind_groups_textures[1].mip_view[s],e.bind_groups_textures[0].view,e.bind_groups_textures[2].view,r.hdr.data.sampler,f,Ie<<16|s)),c=!1):(e.bind_group.push(te(o,e,e.bind_groups_textures[2].mip_view[s],e.bind_groups_textures[0].view,e.bind_groups_textures[1].view,r.hdr.data.sampler,f,Ie<<16|s)),c=!0)}function te(t,e,n,r,o,i,a,l){let u=new Uint32Array([l]),f=t.createBuffer({label:"bloom static mode_lod buffer",size:u.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return new Uint32Array(f.getMappedRange()).set(u),f.unmap(),t.createBindGroup({label:"bloom bind group layout",layout:e.bind_group_layout[0],entries:[{binding:0,resource:n},{binding:1,resource:r},{binding:2,resource:o},{binding:3,resource:i},{binding:4,resource:{buffer:a}},{binding:5,resource:{buffer:f}}]})}function tn(t,e,n){let l=0,u=n.beginComputePass({label:"bloom Compute Pass"});u.setPipeline(e.compute_pipeline),u.setBindGroup(0,e.bind_group[l]),l+=1;let f=ve(0,e.bind_groups_textures[0]);u.dispatchWorkgroups(f.width/8+1,f.height/4+1,1);for(let c=1;c<Z;c++)f=ve(c,e.bind_groups_textures[0]),u.setBindGroup(0,e.bind_group[l]),l+=1,u.dispatchWorkgroups(f.width/8+1,f.height/4+1,1),u.setBindGroup(0,e.bind_group[l]),l+=1,u.dispatchWorkgroups(f.width/8+1,f.height/4+1,1);u.setBindGroup(0,e.bind_group[l]),l+=1,f=ve(Z-1,e.bind_groups_textures[2]),u.dispatchWorkgroups(f.width/8+1,f.height/4+1,1);for(let c=Z-2;c>=0;c--)f=ve(c,e.bind_groups_textures[2]),u.setBindGroup(0,e.bind_group[l]),l+=1,u.dispatchWorkgroups(f.width/8+1,f.height/4+1,1);u.end()}function ve(t,e){let n=e.size.width,r=e.size.height;for(let o=0;o<t;o++)n/=2,r/=2;return{width:n,height:r,depthOrArrayLayers:1}}function nn(t,e){let{device:n}=t,r=e.data;Oe(r),r.bind_groups_textures.push(Y(n,"bloom downsampler image 0",t.viewport.width/2,t.viewport.height/2,Z,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),r.bind_groups_textures.push(Y(n,"bloom downsampler image 1",t.viewport.width/2,t.viewport.height/2,Z,"rgba16float",GPUTextureUsage.STORAGE_BINDING|GPUTextureUsage.TEXTURE_BINDING)),r.bind_groups_textures.push(e.refs.bloom.data),Re(t,r,e)}function Oe(t){for(let e of t.bind_groups_textures)e.texture.destroy();t.bind_groups_textures.length=0}var we="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>,}@vertex fn vert_main(@builtin(vertex_index)VertexIndex:u32)->VertexOutput{const pos=array(vec2(1.0,1.0),vec2(1.0,-1.0),vec2(-1.0,-1.0),vec2(1.0,1.0),vec2(-1.0,-1.0),vec2(-1.0,1.0),);const uv=array(vec2(1.0,0.0),vec2(1.0,1.0),vec2(0.0,1.0),vec2(1.0,0.0),vec2(0.0,1.0),vec2(0.0,0.0),);var output:VertexOutput;output.Position=vec4(pos[VertexIndex],0.0,1.0);output.fragUV=uv[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 Le={type:"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(t,e={}){return on(t,e)},onRun:function(t,e,n){an(t,e,n)},onDestroy:function(t,e){},onResize:function(t,e){cn(t,e)},onViewportPosition:function(t,e){}};function on(t,e){let{options:n,refs:r}=e,{device:o}=t,i=Ve(t),a=n.bloom_intensity??40,l=n.bloom_combine_constant??.68,u=new Float32Array([a,l]),f=o.createBuffer({label:"scene composite params buffer",size:u.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});new Float32Array(f.getMappedRange()).set(u),f.unmap();let c=o.createRenderPipeline({layout:"auto",vertex:{module:o.createShaderModule({code:we}),entryPoint:"vert_main"},fragment:{module:o.createShaderModule({code:we}),entryPoint:"frag_main",targets:[{format:i}]},primitive:{topology:"triangle-list"}});return{bindGroup:o.createBindGroup({layout:c.getBindGroupLayout(0),entries:[{binding:0,resource:r.hdr.data.sampler},{binding:1,resource:r.hdr.data.view},{binding:2,resource:r.bloom.data.mip_view[0]},{binding:3,resource:{buffer:f}}]}),pipeline:c,params_buf:f}}function an(t,e,n){let r=n.beginRenderPass({colorAttachments:[{view:e.refs.combined.data.view,clearValue:{r:0,g:0,b:0,a:1},loadOp:"clear",storeOp:"store"}]}),{pipeline:o,bindGroup:i}=e.data;r.setPipeline(o),r.setBindGroup(0,i),r.draw(6,1,0,0),r.end()}function cn(t,e){let{pipeline:n,params_buf:r}=e.data,{device:o}=t;e.data.bindGroup=o.createBindGroup({layout:n.getBindGroupLayout(0),entries:[{binding:0,resource:e.refs.hdr.data.sampler},{binding:1,resource:e.refs.hdr.data.view},{binding:2,resource:e.refs.bloom.data.mip_view[0]},{binding:3,resource:{buffer:r}}]})}var oe={};Kt(oe,{addSprite:()=>fn,clear:()=>sn,removeSprite:()=>ln,setSprite:()=>yn,setSpriteName:()=>pn,setSpriteOpacity:()=>vn,setSpritePosition:()=>mn,setSpriteRotation:()=>gn,setSpriteTint:()=>xn});function he(t,e,n){if(n.spriteCount===0)return 0;let r=0,o=n.spriteCount-1,i=t<<16&16711680|e&65535;for(;r<=o;){let a=n.spriteData[r*12+11];if(i<=a)return r;let l=n.spriteData[o*12+11];if(i>=l)return o+1;let u=Math.floor((r+o)/2),f=n.spriteData[u*12+11];if(i===f)return u+1;i>f?r=u+1:o=u-1}return r}function re(){return Math.ceil(Math.random()*(Number.MAX_SAFE_INTEGER-10))}function fn(t,e,n,r,o,i,a,l,u){let f=e.refs.spritesheet.data.spritesheet;e=e.data;let c=f.locations.indexOf(n),s=he(u,c,e),p=(s+1)*12;e.spriteData.set(e.spriteData.subarray(s*12,e.spriteCount*12),p),qe(e,f,s,n,r,o,i,a,l,u);for(let[v,m]of e.spriteIndices)m>=s&&e.spriteIndices.set(v,m+1);let g=re();return e.spriteIndices.set(g,s),e.spriteCount++,e.dirty=!0,g}function ln(t,e,n){e=e.data;let r=e.spriteIndices.get(n);for(let[i,a]of e.spriteIndices)a>r&&e.spriteIndices.set(i,a-1);let o=r*12;e.spriteData.set(e.spriteData.subarray((r+1)*12,e.spriteCount*12),o),e.spriteIndices.delete(n),e.spriteCount--,e.dirty=!0}function sn(t,e){e=e.data,e.spriteIndices.clear(),e.spriteCount=0,e.instancedDrawCallCount=0,e.dirty=!0}function pn(t,e,n,r,o){let i=e.refs.spritesheet.data.spritesheet;e=e.data;let a=i.locations.indexOf(r),l=i.spriteMeta[r].w,u=i.spriteMeta[r].h,c=e.spriteIndices.get(n)*12;e.spriteData[c+2]=l*o[0],e.spriteData[c+3]=u*o[1];let p=(e.spriteData[c+11]>>16&255)<<16&16711680|a&65535;e.spriteData[c+11]=p,e.dirty=!0}function mn(t,e,n,r){e=e.data;let i=e.spriteIndices.get(n)*12;e.spriteData[i]=r[0],e.spriteData[i+1]=r[1],e.dirty=!0}function xn(t,e,n,r){e=e.data;let i=e.spriteIndices.get(n)*12;e.spriteData[i+4]=r[0],e.spriteData[i+5]=r[1],e.spriteData[i+6]=r[2],e.spriteData[i+7]=r[3],e.dirty=!0}function vn(t,e,n,r){e=e.data;let i=e.spriteIndices.get(n)*12;e.spriteData[i+8]=r,e.dirty=!0}function gn(t,e,n,r){e=e.data;let i=e.spriteIndices.get(n)*12;e.spriteData[i+9]=r,e.dirty=!0}function yn(t,e,n,r,o,i,a,l,u,f){let c=e.refs.spritesheet.data.spritesheet;e=e.data;let s=e.spriteIndices.get(n);qe(e,c,s,r,o,i,a,l,u,f),e.dirty=!0}function qe(t,e,n,r,o,i,a,l,u,f){if(!e.spriteMeta[r])throw new Error(`Sprite name ${r} could not be found in the spritesheet metaData`);let c=n*12,s=e.spriteMeta[r].w,p=e.spriteMeta[r].h,g=e.locations.indexOf(r),v=f<<16&16711680|g&65535;t.spriteData[c]=o[0],t.spriteData[c+1]=o[1],t.spriteData[c+2]=s*i[0],t.spriteData[c+3]=p*i[1],t.spriteData[c+4]=a[0],t.spriteData[c+5]=a[1],t.spriteData[c+6]=a[2],t.spriteData[c+7]=a[3],t.spriteData[c+8]=l,t.spriteData[c+9]=u,t.spriteData[c+11]=v}var Ne={type:"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(t,e={}){return wn(t,e)},onRun:function(t,e,n){hn(t,e,n)},onDestroy:function(t,e){_n(e)},onResize:function(t,e){},onViewportPosition:function(t,e){},customFunctions:{...oe}};async function wn(t,e){let{device:n}=t,r=16192,o=r,a=Float32Array.BYTES_PER_ELEMENT*2,u=Float32Array.BYTES_PER_ELEMENT*2,c=Float32Array.BYTES_PER_ELEMENT*4,p=Float32Array.BYTES_PER_ELEMENT*4,g=n.createBuffer({size:(a+u+c+p)*o,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),v=e.refs.spritesheet.data,m=n.createBindGroup({layout:e.refs.spritesheet.data.bindGroupLayout,entries:[{binding:0,resource:{buffer:v.uniformBuffer}},{binding:1,resource:v.colorTexture.view},{binding:2,resource:v.colorTexture.sampler},{binding:3,resource:{buffer:g}},{binding:4,resource:v.emissiveTexture.view}]});return{instancedDrawCalls:new Uint32Array(r*2),instancedDrawCallCount:0,bindGroup:m,spriteBuffer:g,spriteData:new Float32Array(r*12),spriteCount:0,spriteIndices:new Map,dirty:!1}}function hn(t,e,n){let{device:r}=t,o=e.options.loadOp||"load";e.data.dirty&&(bn(e.data),e.data.dirty=!1),r.queue.writeBuffer(e.data.spriteBuffer,0,e.data.spriteData.buffer);let i=n.beginRenderPass({colorAttachments:[{view:e.refs.hdr.data.view,clearValue:t.clearValue,loadOp:o,storeOp:"store"},{view:e.refs.emissive.data.view,clearValue:t.clearValue,loadOp:"clear",storeOp:"store"}]});i.setPipeline(e.refs.spritesheet.data.pipeline),i.setBindGroup(0,e.data.bindGroup),i.setVertexBuffer(0,e.refs.spritesheet.data.quads.buffer);let a=6,l=0;for(let u=0;u<e.data.instancedDrawCallCount;u++){let f=e.data.instancedDrawCalls[u*2]*a,c=e.data.instancedDrawCalls[u*2+1];i.draw(a,c,f,l),l+=c}i.end()}function bn(t){let e=-1,n=0;t.instancedDrawCallCount=0;for(let r=0;r<t.spriteCount;r++){let o=t.spriteData[r*12+11]&65535;o!==e&&(n>0&&(t.instancedDrawCalls[t.instancedDrawCallCount*2]=e,t.instancedDrawCalls[t.instancedDrawCallCount*2+1]=n,t.instancedDrawCallCount++),e=o,n=0),n++}n>0&&(t.instancedDrawCalls[t.instancedDrawCallCount*2]=e,t.instancedDrawCalls[t.instancedDrawCallCount*2+1]=n,t.instancedDrawCallCount++)}function _n(t){t.data.instancedDrawCalls=null,t.data.bindGroup=null,t.data.spriteBuffer.destroy(),t.data.spriteBuffer=null,t.data.spriteData=null,t.data.spriteIndices.clear(),t.data.spriteIndices=null}var Xe={type:"tile",refs:[{name:"tileAtlas",type:"textureView",format:"rgba8unorm",access:"write"}],onInit:async function(t,e={}){return Sn(t,e)},onRun:function(t,e,n){Mn(t,e,n)},onDestroy:function(t,e){Ye(e)},onResize:function(t,e){},onViewportPosition:function(t,e){},customFunctions:{setTexture:async function(t,e,n){let{device:r}=t;Ye(e),e.options.textureUrl=n;let o=await K(t,"tile map",e.options.textureUrl),i=r.createBindGroup({layout:e.refs.tileAtlas.data.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:e.data.uniformBuffer}},{binding:1,resource:o.view},{binding:2,resource:o.sampler}]});e.data.bindGroup=i,e.data.material=o}}};async function Sn(t,e){let{device:n}=t,r=await K(t,"tile map",e.options.textureUrl),o=new Float32Array([e.options.scrollScale,e.options.scrollScale]),i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,a={size:o.byteLength,usage:i,mappedAtCreation:!0},l=n.createBuffer(a);return new Float32Array(l.getMappedRange()).set(o),l.unmap(),{bindGroup:n.createBindGroup({layout:e.refs.tileAtlas.data.tileBindGroupLayout,entries:[{binding:0,resource:{buffer:l}},{binding:1,resource:r.view},{binding:2,resource:r.sampler}]}),material:r,uniformBuffer:l,scrollScale:e.options.scrollScale}}function Mn(t,e,n){let{device:r}=t,o=e.options.loadOp||"load",i=n.beginRenderPass({colorAttachments:[{view:e.refs.hdr.data.view,clearValue:t.clearValue,loadOp:o,storeOp:"store"}]}),a=e.refs.tileAtlas.data;i.setPipeline(a.pipeline),i.setVertexBuffer(0,a.quad.buffer),i.setBindGroup(0,e.data.bindGroup),i.setBindGroup(1,a.atlasBindGroup),i.draw(6,1,0,0),i.end()}function Ye(t){t.data.material.texture.destroy(),t.data.material.texture=void 0}var be="struct TransformData{view:mat4x4<f32>,projection:mat4x4<f32>};struct displacement_param{offset:vec2<f32>,scale:f32,noop:f32};@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 mapTexture:texture_2d<f32>;@binding(4)@group(0)var<uniform> param:displacement_param;struct Fragment{@builtin(position)Position:vec4<f32>,@location(0)TexCoord:vec2<f32>};const sx:f32=1.0;const sy:f32=1.0;const sz:f32=1.0;const tx:f32=1.0;const ty:f32=1.0;const tz:f32=0;const rot:f32=0.0;const s=sin(rot);const c=cos(rot);const 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);const 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;@vertex fn vs_main(@location(0)vertexPosition:vec2<f32>)->Fragment{var output:Fragment;output.Position=transformUBO.projection*transformUBO.view*modelM*vec4<f32>(vertexPosition,0.0,1.0);output.TexCoord=vec2<f32>((output.Position.xy+1.0)/2.0);output.TexCoord.y=1.0-output.TexCoord.y;return output;}@fragment fn fs_main(@location(0)TexCoord:vec2<f32>)->@location(0)vec4<f32>{let dims=vec2<f32>(textureDimensions(mapTexture,0));let inv=param.offset/dims;var map:vec4<f32>=textureSample(mapTexture,mySampler,TexCoord+inv);let scale=param.scale;map-=0.5;let invTexSize=1/dims;map.x=scale*invTexSize.x*map.x;map.y=scale*invTexSize.y*map.y;var clamped:vec2<f32>=vec2<f32>(TexCoord.x+map.x,TexCoord.y+map.y);clamped=clamp(clamped,vec2<f32>(0,0),vec2<f32>(1,1));let outColor:vec4<f32>=textureSample(myTexture,mySampler,clamped);return outColor;}";var T=1e-6;var M=Float32Array;function Cn(t){let e=M;return M=t,e}function He(t=0,e=0){let n=new M(2);return t!==void 0&&(n[0]=t,e!==void 0&&(n[1]=e)),n}var h=Float32Array;function zn(t){let e=h;return h=t,e}function X(t,e,n){let r=new h(3);return t!==void 0&&(r[0]=t,e!==void 0&&(r[1]=e,n!==void 0&&(r[2]=n))),r}var Gn=He;function Bn(t,e,n){return n=n||new M(2),n[0]=t,n[1]=e,n}function Un(t,e){return e=e||new M(2),e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e}function Fn(t,e){return e=e||new M(2),e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e}function Dn(t,e){return e=e||new M(2),e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e}function Pn(t,e=0,n=1,r){return r=r||new M(2),r[0]=Math.min(n,Math.max(e,t[0])),r[1]=Math.min(n,Math.max(e,t[1])),r}function An(t,e,n){return n=n||new M(2),n[0]=t[0]+e[0],n[1]=t[1]+e[1],n}function In(t,e,n,r){return r=r||new M(2),r[0]=t[0]+e[0]*n,r[1]=t[1]+e[1]*n,r}function $n(t,e){let n=t[0],r=t[1],o=t[0],i=t[1],a=Math.sqrt(n*n+r*r),l=Math.sqrt(o*o+i*i),u=a*l,f=u&&Ze(t,e)/u;return Math.acos(f)}function We(t,e,n){return n=n||new M(2),n[0]=t[0]-e[0],n[1]=t[1]-e[1],n}var Rn=We;function On(t,e){return Math.abs(t[0]-e[0])<T&&Math.abs(t[1]-e[1])<T}function Ln(t,e){return t[0]===e[0]&&t[1]===e[1]}function Vn(t,e,n,r){return r=r||new M(2),r[0]=t[0]+n*(e[0]-t[0]),r[1]=t[1]+n*(e[1]-t[1]),r}function qn(t,e,n,r){return r=r||new M(2),r[0]=t[0]+n[0]*(e[0]-t[0]),r[1]=t[1]+n[1]*(e[1]-t[1]),r}function Nn(t,e,n){return n=n||new M(2),n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n}function Yn(t,e,n){return n=n||new M(2),n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n}function je(t,e,n){return n=n||new M(2),n[0]=t[0]*e,n[1]=t[1]*e,n}var Xn=je;function Hn(t,e,n){return n=n||new M(2),n[0]=t[0]/e,n[1]=t[1]/e,n}function Qe(t,e){return e=e||new M(2),e[0]=1/t[0],e[1]=1/t[1],e}var Wn=Qe;function jn(t,e,n){n=n||new h(3);let r=t[0]*e[1]-t[1]*e[0];return n[0]=0,n[1]=0,n[2]=r,n}function Ze(t,e){return t[0]*e[0]+t[1]*e[1]}function Ke(t){let e=t[0],n=t[1];return Math.sqrt(e*e+n*n)}var Qn=Ke;function ke(t){let e=t[0],n=t[1];return e*e+n*n}var Zn=ke;function Je(t,e){let n=t[0]-e[0],r=t[1]-e[1];return Math.sqrt(n*n+r*r)}var Kn=Je;function de(t,e){let n=t[0]-e[0],r=t[1]-e[1];return n*n+r*r}var kn=de;function Jn(t,e){e=e||new M(2);let n=t[0],r=t[1],o=Math.sqrt(n*n+r*r);return o>1e-5?(e[0]=n/o,e[1]=r/o):(e[0]=0,e[1]=0),e}function dn(t,e){return e=e||new M(2),e[0]=-t[0],e[1]=-t[1],e}function et(t,e){return e=e||new M(2),e[0]=t[0],e[1]=t[1],e}var er=et;function tt(t,e,n){return n=n||new M(2),n[0]=t[0]*e[0],n[1]=t[1]*e[1],n}var tr=tt;function nt(t,e,n){return n=n||new M(2),n[0]=t[0]/e[0],n[1]=t[1]/e[1],n}var nr=nt;function rr(t=1,e){e=e||new M(2);let n=Math.random()*2*Math.PI;return e[0]=Math.cos(n)*t,e[1]=Math.sin(n)*t,e}function or(t){return t=t||new M(2),t[0]=0,t[1]=0,t}function ir(t,e,n){n=n||new M(2);let r=t[0],o=t[1];return n[0]=r*e[0]+o*e[4]+e[12],n[1]=r*e[1]+o*e[5]+e[13],n}function ar(t,e,n){n=n||new M(2);let r=t[0],o=t[1];return n[0]=e[0]*r+e[4]*o+e[8],n[1]=e[1]*r+e[5]*o+e[9],n}var ge=Object.freeze({__proto__:null,create:He,setDefaultType:Cn,fromValues:Gn,set:Bn,ceil:Un,floor:Fn,round:Dn,clamp:Pn,add:An,addScaled:In,angle:$n,subtract:We,sub:Rn,equalsApproximately:On,equals:Ln,lerp:Vn,lerpV:qn,max:Nn,min:Yn,mulScalar:je,scale:Xn,divScalar:Hn,inverse:Qe,invert:Wn,cross:jn,dot:Ze,length:Ke,len:Qn,lengthSq:ke,lenSq:Zn,distance:Je,dist:Kn,distanceSq:de,distSq:kn,normalize:Jn,negate:dn,copy:et,clone:er,multiply:tt,mul:tr,divide:nt,div:nr,random:rr,zero:or,transformMat4:ir,transformMat3:ar});var cr=new Map([[Float32Array,()=>new Float32Array(12)],[Float64Array,()=>new Float64Array(12)],[Array,()=>new Array(12).fill(0)]]),la=cr.get(Float32Array);var ur=X;function fr(t,e,n,r){return r=r||new h(3),r[0]=t,r[1]=e,r[2]=n,r}function lr(t,e){return e=e||new h(3),e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e}function sr(t,e){return e=e||new h(3),e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e}function pr(t,e){return e=e||new h(3),e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e[2]=Math.round(t[2]),e}function mr(t,e=0,n=1,r){return r=r||new h(3),r[0]=Math.min(n,Math.max(e,t[0])),r[1]=Math.min(n,Math.max(e,t[1])),r[2]=Math.min(n,Math.max(e,t[2])),r}function xr(t,e,n){return n=n||new h(3),n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n}function vr(t,e,n,r){return r=r||new h(3),r[0]=t[0]+e[0]*n,r[1]=t[1]+e[1]*n,r[2]=t[2]+e[2]*n,r}function gr(t,e){let n=t[0],r=t[1],o=t[2],i=t[0],a=t[1],l=t[2],u=Math.sqrt(n*n+r*r+o*o),f=Math.sqrt(i*i+a*a+l*l),c=u*f,s=c&&it(t,e)/c;return Math.acos(s)}function ie(t,e,n){return n=n||new h(3),n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n}var yr=ie;function wr(t,e){return Math.abs(t[0]-e[0])<T&&Math.abs(t[1]-e[1])<T&&Math.abs(t[2]-e[2])<T}function hr(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}function br(t,e,n,r){return r=r||new h(3),r[0]=t[0]+n*(e[0]-t[0]),r[1]=t[1]+n*(e[1]-t[1]),r[2]=t[2]+n*(e[2]-t[2]),r}function _r(t,e,n,r){return r=r||new h(3),r[0]=t[0]+n[0]*(e[0]-t[0]),r[1]=t[1]+n[1]*(e[1]-t[1]),r[2]=t[2]+n[2]*(e[2]-t[2]),r}function Sr(t,e,n){return n=n||new h(3),n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n[2]=Math.max(t[2],e[2]),n}function Mr(t,e,n){return n=n||new h(3),n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n[2]=Math.min(t[2],e[2]),n}function rt(t,e,n){return n=n||new h(3),n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n}var Tr=rt;function Er(t,e,n){return n=n||new h(3),n[0]=t[0]/e,n[1]=t[1]/e,n[2]=t[2]/e,n}function ot(t,e){return e=e||new h(3),e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e}var Cr=ot;function ee(t,e,n){n=n||new h(3);let r=t[2]*e[0]-t[0]*e[2],o=t[0]*e[1]-t[1]*e[0];return n[0]=t[1]*e[2]-t[2]*e[1],n[1]=r,n[2]=o,n}function it(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function at(t){let e=t[0],n=t[1],r=t[2];return Math.sqrt(e*e+n*n+r*r)}var zr=at;function ct(t){let e=t[0],n=t[1],r=t[2];return e*e+n*n+r*r}var Gr=ct;function ut(t,e){let n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2];return Math.sqrt(n*n+r*r+o*o)}var Br=ut;function ft(t,e){let n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2];return n*n+r*r+o*o}var Ur=ft;function k(t,e){e=e||new h(3);let n=t[0],r=t[1],o=t[2],i=Math.sqrt(n*n+r*r+o*o);return i>1e-5?(e[0]=n/i,e[1]=r/i,e[2]=o/i):(e[0]=0,e[1]=0,e[2]=0),e}function Fr(t,e){return e=e||new h(3),e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e}function lt(t,e){return e=e||new h(3),e[0]=t[0],e[1]=t[1],e[2]=t[2],e}var Dr=lt;function st(t,e,n){return n=n||new h(3),n[0]=t[0]*e[0],n[1]=t[1]*e[1],n[2]=t[2]*e[2],n}var Pr=st;function pt(t,e,n){return n=n||new h(3),n[0]=t[0]/e[0],n[1]=t[1]/e[1],n[2]=t[2]/e[2],n}var Ar=pt;function Ir(t=1,e){e=e||new h(3);let n=Math.random()*2*Math.PI,r=Math.random()*2-1,o=Math.sqrt(1-r*r)*t;return e[0]=Math.cos(n)*o,e[1]=Math.sin(n)*o,e[2]=r*t,e}function $r(t){return t=t||new h(3),t[0]=0,t[1]=0,t[2]=0,t}function Rr(t,e,n){n=n||new h(3);let r=t[0],o=t[1],i=t[2],a=e[3]*r+e[7]*o+e[11]*i+e[15]||1;return n[0]=(e[0]*r+e[4]*o+e[8]*i+e[12])/a,n[1]=(e[1]*r+e[5]*o+e[9]*i+e[13])/a,n[2]=(e[2]*r+e[6]*o+e[10]*i+e[14])/a,n}function Or(t,e,n){n=n||new h(3);let r=t[0],o=t[1],i=t[2];return n[0]=r*e[0*4+0]+o*e[1*4+0]+i*e[2*4+0],n[1]=r*e[0*4+1]+o*e[1*4+1]+i*e[2*4+1],n[2]=r*e[0*4+2]+o*e[1*4+2]+i*e[2*4+2],n}function Lr(t,e,n){n=n||new h(3);let r=t[0],o=t[1],i=t[2];return n[0]=r*e[0]+o*e[4]+i*e[8],n[1]=r*e[1]+o*e[5]+i*e[9],n[2]=r*e[2]+o*e[6]+i*e[10],n}function Vr(t,e,n){n=n||new h(3);let r=e[0],o=e[1],i=e[2],a=e[3]*2,l=t[0],u=t[1],f=t[2],c=o*f-i*u,s=i*l-r*f,p=r*u-o*l;return n[0]=l+c*a+(o*p-i*s)*2,n[1]=u+s*a+(i*c-r*p)*2,n[2]=f+p*a+(r*s-o*c)*2,n}function qr(t,e){return e=e||new h(3),e[0]=t[12],e[1]=t[13],e[2]=t[14],e}function Nr(t,e,n){n=n||new h(3);let r=e*4;return n[0]=t[r+0],n[1]=t[r+1],n[2]=t[r+2],n}function Yr(t,e){e=e||new h(3);let n=t[0],r=t[1],o=t[2],i=t[4],a=t[5],l=t[6],u=t[8],f=t[9],c=t[10];return e[0]=Math.sqrt(n*n+r*r+o*o),e[1]=Math.sqrt(i*i+a*a+l*l),e[2]=Math.sqrt(u*u+f*f+c*c),e}var j=Object.freeze({__proto__:null,create:X,setDefaultType:zn,fromValues:ur,set:fr,ceil:lr,floor:sr,round:pr,clamp:mr,add:xr,addScaled:vr,angle:gr,subtract:ie,sub:yr,equalsApproximately:wr,equals:hr,lerp:br,lerpV:_r,max:Sr,min:Mr,mulScalar:rt,scale:Tr,divScalar:Er,inverse:ot,invert:Cr,cross:ee,dot:it,length:at,len:zr,lengthSq:ct,lenSq:Gr,distance:ut,dist:Br,distanceSq:ft,distSq:Ur,normalize:k,negate:Fr,copy:lt,clone:Dr,multiply:st,mul:Pr,divide:pt,div:Ar,random:Ir,zero:$r,transformMat4:Rr,transformMat4Upper3x3:Or,transformMat3:Lr,transformQuat:Vr,getTranslation:qr,getAxis:Nr,getScaling:Yr}),b=Float32Array;function Xr(t){let e=b;return b=t,e}function Hr(t,e,n,r,o,i,a,l,u,f,c,s,p,g,v,m){let x=new b(16);return t!==void 0&&(x[0]=t,e!==void 0&&(x[1]=e,n!==void 0&&(x[2]=n,r!==void 0&&(x[3]=r,o!==void 0&&(x[4]=o,i!==void 0&&(x[5]=i,a!==void 0&&(x[6]=a,l!==void 0&&(x[7]=l,u!==void 0&&(x[8]=u,f!==void 0&&(x[9]=f,c!==void 0&&(x[10]=c,s!==void 0&&(x[11]=s,p!==void 0&&(x[12]=p,g!==void 0&&(x[13]=g,v!==void 0&&(x[14]=v,m!==void 0&&(x[15]=m)))))))))))))))),x}function Wr(t,e,n,r,o,i,a,l,u,f,c,s,p,g,v,m,x){return x=x||new b(16),x[0]=t,x[1]=e,x[2]=n,x[3]=r,x[4]=o,x[5]=i,x[6]=a,x[7]=l,x[8]=u,x[9]=f,x[10]=c,x[11]=s,x[12]=p,x[13]=g,x[14]=v,x[15]=m,x}function jr(t,e){return e=e||new b(16),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 Qr(t,e){e=e||new b(16);let n=t[0],r=t[1],o=t[2],i=t[3],a=n+n,l=r+r,u=o+o,f=n*a,c=r*a,s=r*l,p=o*a,g=o*l,v=o*u,m=i*a,x=i*l,y=i*u;return e[0]=1-s-v,e[1]=c+y,e[2]=p-x,e[3]=0,e[4]=c-y,e[5]=1-f-v,e[6]=g+m,e[7]=0,e[8]=p+x,e[9]=g-m,e[10]=1-f-s,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function Zr(t,e){return e=e||new b(16),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 _e(t,e){return e=e||new b(16),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}var Kr=_e;function kr(t,e){return Math.abs(t[0]-e[0])<T&&Math.abs(t[1]-e[1])<T&&Math.abs(t[2]-e[2])<T&&Math.abs(t[3]-e[3])<T&&Math.abs(t[4]-e[4])<T&&Math.abs(t[5]-e[5])<T&&Math.abs(t[6]-e[6])<T&&Math.abs(t[7]-e[7])<T&&Math.abs(t[8]-e[8])<T&&Math.abs(t[9]-e[9])<T&&Math.abs(t[10]-e[10])<T&&Math.abs(t[11]-e[11])<T&&Math.abs(t[12]-e[12])<T&&Math.abs(t[13]-e[13])<T&&Math.abs(t[14]-e[14])<T&&Math.abs(t[15]-e[15])<T}function Jr(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]&&t[4]===e[4]&&t[5]===e[5]&&t[6]===e[6]&&t[7]===e[7]&&t[8]===e[8]&&t[9]===e[9]&&t[10]===e[10]&&t[11]===e[11]&&t[12]===e[12]&&t[13]===e[13]&&t[14]===e[14]&&t[15]===e[15]}function mt(t){return t=t||new b(16),t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function dr(t,e){if(e=e||new b(16),e===t){let w;return w=t[1],t[1]=t[4],t[4]=w,w=t[2],t[2]=t[8],t[8]=w,w=t[3],t[3]=t[12],t[12]=w,w=t[6],t[6]=t[9],t[9]=w,w=t[7],t[7]=t[13],t[13]=w,w=t[11],t[11]=t[14],t[14]=w,e}let n=t[0*4+0],r=t[0*4+1],o=t[0*4+2],i=t[0*4+3],a=t[1*4+0],l=t[1*4+1],u=t[1*4+2],f=t[1*4+3],c=t[2*4+0],s=t[2*4+1],p=t[2*4+2],g=t[2*4+3],v=t[3*4+0],m=t[3*4+1],x=t[3*4+2],y=t[3*4+3];return e[0]=n,e[1]=a,e[2]=c,e[3]=v,e[4]=r,e[5]=l,e[6]=s,e[7]=m,e[8]=o,e[9]=u,e[10]=p,e[11]=x,e[12]=i,e[13]=f,e[14]=g,e[15]=y,e}function xt(t,e){e=e||new b(16);let n=t[0*4+0],r=t[0*4+1],o=t[0*4+2],i=t[0*4+3],a=t[1*4+0],l=t[1*4+1],u=t[1*4+2],f=t[1*4+3],c=t[2*4+0],s=t[2*4+1],p=t[2*4+2],g=t[2*4+3],v=t[3*4+0],m=t[3*4+1],x=t[3*4+2],y=t[3*4+3],w=p*y,C=x*g,z=u*y,G=x*f,U=u*g,F=p*f,P=o*y,A=x*i,I=o*g,$=p*i,R=o*f,L=u*i,V=c*m,q=v*s,N=a*m,H=v*l,W=a*s,ue=c*l,fe=n*m,le=v*r,se=n*s,pe=c*r,me=n*l,xe=a*r,Be=w*l+G*s+U*m-(C*l+z*s+F*m),Ue=C*r+P*s+$*m-(w*r+A*s+I*m),Fe=z*r+A*l+R*m-(G*r+P*l+L*m),De=F*r+I*l+L*s-(U*r+$*l+R*s),O=1/(n*Be+a*Ue+c*Fe+v*De);return e[0]=O*Be,e[1]=O*Ue,e[2]=O*Fe,e[3]=O*De,e[4]=O*(C*a+z*c+F*v-(w*a+G*c+U*v)),e[5]=O*(w*n+A*c+I*v-(C*n+P*c+$*v)),e[6]=O*(G*n+P*a+L*v-(z*n+A*a+R*v)),e[7]=O*(U*n+$*a+R*c-(F*n+I*a+L*c)),e[8]=O*(V*f+H*g+W*y-(q*f+N*g+ue*y)),e[9]=O*(q*i+fe*g+pe*y-(V*i+le*g+se*y)),e[10]=O*(N*i+le*f+me*y-(H*i+fe*f+xe*y)),e[11]=O*(ue*i+se*f+xe*g-(W*i+pe*f+me*g)),e[12]=O*(N*p+ue*x+q*u-(W*x+V*u+H*p)),e[13]=O*(se*x+V*o+le*p-(fe*p+pe*x+q*o)),e[14]=O*(fe*u+xe*x+H*o-(me*x+N*o+le*u)),e[15]=O*(me*p+W*o+pe*u-(se*u+xe*p+ue*o)),e}function eo(t){let e=t[0],n=t[0*4+1],r=t[0*4+2],o=t[0*4+3],i=t[1*4+0],a=t[1*4+1],l=t[1*4+2],u=t[1*4+3],f=t[2*4+0],c=t[2*4+1],s=t[2*4+2],p=t[2*4+3],g=t[3*4+0],v=t[3*4+1],m=t[3*4+2],x=t[3*4+3],y=s*x,w=m*p,C=l*x,z=m*u,G=l*p,U=s*u,F=r*x,P=m*o,A=r*p,I=s*o,$=r*u,R=l*o,L=y*a+z*c+G*v-(w*a+C*c+U*v),V=w*n+F*c+I*v-(y*n+P*c+A*v),q=C*n+P*a+$*v-(z*n+F*a+R*v),N=U*n+A*a+R*c-(G*n+I*a+$*c);return e*L+i*V+f*q+g*N}var to=xt;function vt(t,e,n){n=n||new b(16);let r=t[0],o=t[1],i=t[2],a=t[3],l=t[4],u=t[5],f=t[6],c=t[7],s=t[8],p=t[9],g=t[10],v=t[11],m=t[12],x=t[13],y=t[14],w=t[15],C=e[0],z=e[1],G=e[2],U=e[3],F=e[4],P=e[5],A=e[6],I=e[7],$=e[8],R=e[9],L=e[10],V=e[11],q=e[12],N=e[13],H=e[14],W=e[15];return n[0]=r*C+l*z+s*G+m*U,n[1]=o*C+u*z+p*G+x*U,n[2]=i*C+f*z+g*G+y*U,n[3]=a*C+c*z+v*G+w*U,n[4]=r*F+l*P+s*A+m*I,n[5]=o*F+u*P+p*A+x*I,n[6]=i*F+f*P+g*A+y*I,n[7]=a*F+c*P+v*A+w*I,n[8]=r*$+l*R+s*L+m*V,n[9]=o*$+u*R+p*L+x*V,n[10]=i*$+f*R+g*L+y*V,n[11]=a*$+c*R+v*L+w*V,n[12]=r*q+l*N+s*H+m*W,n[13]=o*q+u*N+p*H+x*W,n[14]=i*q+f*N+g*H+y*W,n[15]=a*q+c*N+v*H+w*W,n}var no=vt;function ro(t,e,n){return n=n||mt(),t!==n&&(n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11]),n[12]=e[0],n[13]=e[1],n[14]=e[2],n[15]=1,n}function oo(t,e){return e=e||X(),e[0]=t[12],e[1]=t[13],e[2]=t[14],e}function io(t,e,n){n=n||X();let r=e*4;return n[0]=t[r+0],n[1]=t[r+1],n[2]=t[r+2],n}function ao(t,e,n,r){r!==t&&(r=_e(t,r));let o=n*4;return r[o+0]=e[0],r[o+1]=e[1],r[o+2]=e[2],r}function co(t,e){e=e||X();let n=t[0],r=t[1],o=t[2],i=t[4],a=t[5],l=t[6],u=t[8],f=t[9],c=t[10];return e[0]=Math.sqrt(n*n+r*r+o*o),e[1]=Math.sqrt(i*i+a*a+l*l),e[2]=Math.sqrt(u*u+f*f+c*c),e}function uo(t,e,n,r,o){o=o||new b(16);let i=Math.tan(Math.PI*.5-.5*t);if(o[0]=i/e,o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=i,o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[11]=-1,o[12]=0,o[13]=0,o[15]=0,r===1/0)o[10]=-1,o[14]=-n;else{let a=1/(n-r);o[10]=r*a,o[14]=r*n*a}return o}function fo(t,e,n,r,o,i,a){return a=a||new b(16),a[0]=2/(e-t),a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2/(r-n),a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1/(o-i),a[11]=0,a[12]=(e+t)/(t-e),a[13]=(r+n)/(n-r),a[14]=o/(o-i),a[15]=1,a}function lo(t,e,n,r,o,i,a){a=a||new b(16);let l=e-t,u=r-n,f=o-i;return a[0]=2*o/l,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*o/u,a[6]=0,a[7]=0,a[8]=(t+e)/l,a[9]=(r+n)/u,a[10]=i/f,a[11]=-1,a[12]=0,a[13]=0,a[14]=o*i/f,a[15]=0,a}var S,B,_;function so(t,e,n,r){return r=r||new b(16),S=S||X(),B=B||X(),_=_||X(),k(ie(e,t,_),_),k(ee(n,_,S),S),k(ee(_,S,B),B),r[0]=S[0],r[1]=S[1],r[2]=S[2],r[3]=0,r[4]=B[0],r[5]=B[1],r[6]=B[2],r[7]=0,r[8]=_[0],r[9]=_[1],r[10]=_[2],r[11]=0,r[12]=t[0],r[13]=t[1],r[14]=t[2],r[15]=1,r}function po(t,e,n,r){return r=r||new b(16),S=S||X(),B=B||X(),_=_||X(),k(ie(t,e,_),_),k(ee(n,_,S),S),k(ee(_,S,B),B),r[0]=S[0],r[1]=S[1],r[2]=S[2],r[3]=0,r[4]=B[0],r[5]=B[1],r[6]=B[2],r[7]=0,r[8]=_[0],r[9]=_[1],r[10]=_[2],r[11]=0,r[12]=t[0],r[13]=t[1],r[14]=t[2],r[15]=1,r}function mo(t,e,n,r){return r=r||new b(16),S=S||X(),B=B||X(),_=_||X(),k(ie(t,e,_),_),k(ee(n,_,S),S),k(ee(_,S,B),B),r[0]=S[0],r[1]=B[0],r[2]=_[0],r[3]=0,r[4]=S[1],r[5]=B[1],r[6]=_[1],r[7]=0,r[8]=S[2],r[9]=B[2],r[10]=_[2],r[11]=0,r[12]=-(S[0]*t[0]+S[1]*t[1]+S[2]*t[2]),r[13]=-(B[0]*t[0]+B[1]*t[1]+B[2]*t[2]),r[14]=-(_[0]*t[0]+_[1]*t[1]+_[2]*t[2]),r[15]=1,r}function xo(t,e){return e=e||new b(16),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 vo(t,e,n){n=n||new b(16);let r=e[0],o=e[1],i=e[2],a=t[0],l=t[1],u=t[2],f=t[3],c=t[1*4+0],s=t[1*4+1],p=t[1*4+2],g=t[1*4+3],v=t[2*4+0],m=t[2*4+1],x=t[2*4+2],y=t[2*4+3],w=t[3*4+0],C=t[3*4+1],z=t[3*4+2],G=t[3*4+3];return t!==n&&(n[0]=a,n[1]=l,n[2]=u,n[3]=f,n[4]=c,n[5]=s,n[6]=p,n[7]=g,n[8]=v,n[9]=m,n[10]=x,n[11]=y),n[12]=a*r+c*o+v*i+w,n[13]=l*r+s*o+m*i+C,n[14]=u*r+p*o+x*i+z,n[15]=f*r+g*o+y*i+G,n}function go(t,e){e=e||new b(16);let n=Math.cos(t),r=Math.sin(t);return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=n,e[6]=r,e[7]=0,e[8]=0,e[9]=-r,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function yo(t,e,n){n=n||new b(16);let r=t[4],o=t[5],i=t[6],a=t[7],l=t[8],u=t[9],f=t[10],c=t[11],s=Math.cos(e),p=Math.sin(e);return n[4]=s*r+p*l,n[5]=s*o+p*u,n[6]=s*i+p*f,n[7]=s*a+p*c,n[8]=s*l-p*r,n[9]=s*u-p*o,n[10]=s*f-p*i,n[11]=s*c-p*a,t!==n&&(n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n}function wo(t,e){e=e||new b(16);let n=Math.cos(t),r=Math.sin(t);return e[0]=n,e[1]=0,e[2]=-r,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=r,e[9]=0,e[10]=n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function ho(t,e,n){n=n||new b(16);let r=t[0*4+0],o=t[0*4+1],i=t[0*4+2],a=t[0*4+3],l=t[2*4+0],u=t[2*4+1],f=t[2*4+2],c=t[2*4+3],s=Math.cos(e),p=Math.sin(e);return n[0]=s*r-p*l,n[1]=s*o-p*u,n[2]=s*i-p*f,n[3]=s*a-p*c,n[8]=s*l+p*r,n[9]=s*u+p*o,n[10]=s*f+p*i,n[11]=s*c+p*a,t!==n&&(n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n}function bo(t,e){e=e||new b(16);let n=Math.cos(t),r=Math.sin(t);return e[0]=n,e[1]=r,e[2]=0,e[3]=0,e[4]=-r,e[5]=n,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 _o(t,e,n){n=n||new b(16);let r=t[0*4+0],o=t[0*4+1],i=t[0*4+2],a=t[0*4+3],l=t[1*4+0],u=t[1*4+1],f=t[1*4+2],c=t[1*4+3],s=Math.cos(e),p=Math.sin(e);return n[0]=s*r+p*l,n[1]=s*o+p*u,n[2]=s*i+p*f,n[3]=s*a+p*c,n[4]=s*l-p*r,n[5]=s*u-p*o,n[6]=s*f-p*i,n[7]=s*c-p*a,t!==n&&(n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n}function gt(t,e,n){n=n||new b(16);let r=t[0],o=t[1],i=t[2],a=Math.sqrt(r*r+o*o+i*i);r/=a,o/=a,i/=a;let l=r*r,u=o*o,f=i*i,c=Math.cos(e),s=Math.sin(e),p=1-c;return n[0]=l+(1-l)*c,n[1]=r*o*p+i*s,n[2]=r*i*p-o*s,n[3]=0,n[4]=r*o*p-i*s,n[5]=u+(1-u)*c,n[6]=o*i*p+r*s,n[7]=0,n[8]=r*i*p+o*s,n[9]=o*i*p-r*s,n[10]=f+(1-f)*c,n[11]=0,n[12]=0,n[13]=0,n[14]=0,n[15]=1,n}var So=gt;function yt(t,e,n,r){r=r||new b(16);let o=e[0],i=e[1],a=e[2],l=Math.sqrt(o*o+i*i+a*a);o/=l,i/=l,a/=l;let u=o*o,f=i*i,c=a*a,s=Math.cos(n),p=Math.sin(n),g=1-s,v=u+(1-u)*s,m=o*i*g+a*p,x=o*a*g-i*p,y=o*i*g-a*p,w=f+(1-f)*s,C=i*a*g+o*p,z=o*a*g+i*p,G=i*a*g-o*p,U=c+(1-c)*s,F=t[0],P=t[1],A=t[2],I=t[3],$=t[4],R=t[5],L=t[6],V=t[7],q=t[8],N=t[9],H=t[10],W=t[11];return r[0]=v*F+m*$+x*q,r[1]=v*P+m*R+x*N,r[2]=v*A+m*L+x*H,r[3]=v*I+m*V+x*W,r[4]=y*F+w*$+C*q,r[5]=y*P+w*R+C*N,r[6]=y*A+w*L+C*H,r[7]=y*I+w*V+C*W,r[8]=z*F+G*$+U*q,r[9]=z*P+G*R+U*N,r[10]=z*A+G*L+U*H,r[11]=z*I+G*V+U*W,t!==r&&(r[12]=t[12],r[13]=t[13],r[14]=t[14],r[15]=t[15]),r}var Mo=yt;function To(t,e){return e=e||new b(16),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 Eo(t,e,n){n=n||new b(16);let r=e[0],o=e[1],i=e[2];return n[0]=r*t[0*4+0],n[1]=r*t[0*4+1],n[2]=r*t[0*4+2],n[3]=r*t[0*4+3],n[4]=o*t[1*4+0],n[5]=o*t[1*4+1],n[6]=o*t[1*4+2],n[7]=o*t[1*4+3],n[8]=i*t[2*4+0],n[9]=i*t[2*4+1],n[10]=i*t[2*4+2],n[11]=i*t[2*4+3],t!==n&&(n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n}function Co(t,e){return e=e||new b(16),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 zo(t,e,n){return n=n||new b(16),n[0]=e*t[0*4+0],n[1]=e*t[0*4+1],n[2]=e*t[0*4+2],n[3]=e*t[0*4+3],n[4]=e*t[1*4+0],n[5]=e*t[1*4+1],n[6]=e*t[1*4+2],n[7]=e*t[1*4+3],n[8]=e*t[2*4+0],n[9]=e*t[2*4+1],n[10]=e*t[2*4+2],n[11]=e*t[2*4+3],t!==n&&(n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15]),n}var Q=Object.freeze({__proto__:null,setDefaultType:Xr,create:Hr,set:Wr,fromMat3:jr,fromQuat:Qr,negate:Zr,copy:_e,clone:Kr,equalsApproximately:kr,equals:Jr,identity:mt,transpose:dr,inverse:xt,determinant:eo,invert:to,multiply:vt,mul:no,setTranslation:ro,getTranslation:oo,getAxis:io,setAxis:ao,getScaling:co,perspective:uo,ortho:fo,frustum:lo,aim:so,cameraAim:po,lookAt:mo,translation:xo,translate:vo,rotationX:go,rotateX:yo,rotationY:wo,rotateY:ho,rotationZ:bo,rotateZ:_o,axisRotation:gt,rotation:So,axisRotate:yt,rotate:Mo,scaling:To,scale:Eo,uniformScaling:Co,uniformScale:zo});var E=Float32Array;function Go(t){let e=E;return E=t,e}function wt(t,e,n,r){let o=new E(4);return t!==void 0&&(o[0]=t,e!==void 0&&(o[1]=e,n!==void 0&&(o[2]=n,r!==void 0&&(o[3]=r)))),o}var Bo=wt;function Uo(t,e,n,r,o){return o=o||new E(4),o[0]=t,o[1]=e,o[2]=n,o[3]=r,o}function Fo(t,e){return e=e||new E(4),e[0]=Math.ceil(t[0]),e[1]=Math.ceil(t[1]),e[2]=Math.ceil(t[2]),e[3]=Math.ceil(t[3]),e}function Do(t,e){return e=e||new E(4),e[0]=Math.floor(t[0]),e[1]=Math.floor(t[1]),e[2]=Math.floor(t[2]),e[3]=Math.floor(t[3]),e}function Po(t,e){return e=e||new E(4),e[0]=Math.round(t[0]),e[1]=Math.round(t[1]),e[2]=Math.round(t[2]),e[3]=Math.round(t[3]),e}function Ao(t,e=0,n=1,r){return r=r||new E(4),r[0]=Math.min(n,Math.max(e,t[0])),r[1]=Math.min(n,Math.max(e,t[1])),r[2]=Math.min(n,Math.max(e,t[2])),r[3]=Math.min(n,Math.max(e,t[3])),r}function Io(t,e,n){return n=n||new E(4),n[0]=t[0]+e[0],n[1]=t[1]+e[1],n[2]=t[2]+e[2],n[3]=t[3]+e[3],n}function $o(t,e,n,r){return r=r||new E(4),r[0]=t[0]+e[0]*n,r[1]=t[1]+e[1]*n,r[2]=t[2]+e[2]*n,r[3]=t[3]+e[3]*n,r}function ht(t,e,n){return n=n||new E(4),n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],n[3]=t[3]-e[3],n}var Ro=ht;function Oo(t,e){return Math.abs(t[0]-e[0])<T&&Math.abs(t[1]-e[1])<T&&Math.abs(t[2]-e[2])<T&&Math.abs(t[3]-e[3])<T}function Lo(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]}function Vo(t,e,n,r){return r=r||new E(4),r[0]=t[0]+n*(e[0]-t[0]),r[1]=t[1]+n*(e[1]-t[1]),r[2]=t[2]+n*(e[2]-t[2]),r[3]=t[3]+n*(e[3]-t[3]),r}function qo(t,e,n,r){return r=r||new E(4),r[0]=t[0]+n[0]*(e[0]-t[0]),r[1]=t[1]+n[1]*(e[1]-t[1]),r[2]=t[2]+n[2]*(e[2]-t[2]),r[3]=t[3]+n[3]*(e[3]-t[3]),r}function No(t,e,n){return n=n||new E(4),n[0]=Math.max(t[0],e[0]),n[1]=Math.max(t[1],e[1]),n[2]=Math.max(t[2],e[2]),n[3]=Math.max(t[3],e[3]),n}function Yo(t,e,n){return n=n||new E(4),n[0]=Math.min(t[0],e[0]),n[1]=Math.min(t[1],e[1]),n[2]=Math.min(t[2],e[2]),n[3]=Math.min(t[3],e[3]),n}function bt(t,e,n){return n=n||new E(4),n[0]=t[0]*e,n[1]=t[1]*e,n[2]=t[2]*e,n[3]=t[3]*e,n}var Xo=bt;function Ho(t,e,n){return n=n||new E(4),n[0]=t[0]/e,n[1]=t[1]/e,n[2]=t[2]/e,n[3]=t[3]/e,n}function _t(t,e){return e=e||new E(4),e[0]=1/t[0],e[1]=1/t[1],e[2]=1/t[2],e[3]=1/t[3],e}var Wo=_t;function jo(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function St(t){let e=t[0],n=t[1],r=t[2],o=t[3];return Math.sqrt(e*e+n*n+r*r+o*o)}var Qo=St;function Mt(t){let e=t[0],n=t[1],r=t[2],o=t[3];return e*e+n*n+r*r+o*o}var Zo=Mt;function Tt(t,e){let n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2],i=t[3]-e[3];return Math.sqrt(n*n+r*r+o*o+i*i)}var Ko=Tt;function Et(t,e){let n=t[0]-e[0],r=t[1]-e[1],o=t[2]-e[2],i=t[3]-e[3];return n*n+r*r+o*o+i*i}var ko=Et;function Jo(t,e){e=e||new E(4);let n=t[0],r=t[1],o=t[2],i=t[3],a=Math.sqrt(n*n+r*r+o*o+i*i);return a>1e-5?(e[0]=n/a,e[1]=r/a,e[2]=o/a,e[3]=i/a):(e[0]=0,e[1]=0,e[2]=0,e[3]=0),e}function ei(t,e){return e=e||new E(4),e[0]=-t[0],e[1]=-t[1],e[2]=-t[2],e[3]=-t[3],e}function Ct(t,e){return e=e||new E(4),e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}var ti=Ct;function zt(t,e,n){return n=n||new E(4),n[0]=t[0]*e[0],n[1]=t[1]*e[1],n[2]=t[2]*e[2],n[3]=t[3]*e[3],n}var ni=zt;function Gt(t,e,n){return n=n||new E(4),n[0]=t[0]/e[0],n[1]=t[1]/e[1],n[2]=t[2]/e[2],n[3]=t[3]/e[3],n}var ri=Gt;function oi(t){return t=t||new E(4),t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}function ii(t,e,n){n=n||new E(4);let r=t[0],o=t[1],i=t[2],a=t[3];return n[0]=e[0]*r+e[4]*o+e[8]*i+e[12]*a,n[1]=e[1]*r+e[5]*o+e[9]*i+e[13]*a,n[2]=e[2]*r+e[6]*o+e[10]*i+e[14]*a,n[3]=e[3]*r+e[7]*o+e[11]*i+e[15]*a,n}var Se=Object.freeze({__proto__:null,create:wt,setDefaultType:Go,fromValues:Bo,set:Uo,ceil:Fo,floor:Do,round:Po,clamp:Ao,add:Io,addScaled:$o,subtract:ht,sub:Ro,equalsApproximately:Oo,equals:Lo,lerp:Vo,lerpV:qo,max:No,min:Yo,mulScalar:bt,scale:Xo,divScalar:Ho,inverse:_t,invert:Wo,dot:jo,length:St,len:Qo,lengthSq:Mt,lenSq:Zo,distance:Tt,dist:Ko,distanceSq:Et,distSq:ko,normalize:Jo,negate:ei,copy:Ct,clone:ti,multiply:zt,mul:ni,divide:Gt,div:ri,zero:oi,transformMat4:ii});var Bt=j.create(0,0,0),ae=6,Ut={type:"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(t,e={}){return ai(t,e)},onRun:function(t,e,n){ci(t,e,n)},onDestroy:function(t,e){ui(e)},onResize:function(t,e){fi(t,e)},onViewportPosition:function(t,e){li(t,e)},customFunctions:{addTriangle:function(t,e,n){let r=re(),o=e.data.spriteCount;e.data.spriteIndices.set(r,o);let i=o*ae;return e.data.spriteData[i]=n[0][0],e.data.spriteData[i+1]=n[0][1],e.data.spriteData[i+2]=n[1][0],e.data.spriteData[i+3]=n[1][1],e.data.spriteData[i+4]=n[2][0],e.data.spriteData[i+5]=n[2][1],e.data.spriteCount++,r},removeTriangle:function(t,e,n){e.data.spriteIndices.delete(n),e.data.spriteCount--},setPosition:function(t,e,n,r){let i=e.data.spriteIndices.get(n)*ae;e.data.spriteData[i]=r[0][0],e.data.spriteData[i+1]=r[0][1],e.data.spriteData[i+2]=r[1][0],e.data.spriteData[i+3]=r[1][1],e.data.spriteData[i+4]=r[2][0],e.data.spriteData[i+5]=r[2][1]}}};async function ai(t,e){let{device:n}=t,r=new Float32Array([e.options.offseyX??0,e.options.offseyY??0,e.options.scale??20,0]),o=n.createBuffer({label:"displacement options buffer",size:r.byteLength,mappedAtCreation:!0,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});new Float32Array(o.getMappedRange()).set(r),o.unmap();let i=256,a=i,u=Float32Array.BYTES_PER_ELEMENT*2,c=Float32Array.BYTES_PER_ELEMENT*2,p=Float32Array.BYTES_PER_ELEMENT*2,g=n.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),v=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}},{binding:3,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:4,visibility:GPUShaderStage.FRAGMENT,buffer:{type:"uniform"}}]}),m=n.createPipelineLayout({bindGroupLayouts:[v]}),x="repeat",y="linear",w=n.createSampler({label:"displacement ampler",addressModeU:x,addressModeV:x,addressModeW:x,magFilter:y,minFilter:y,mipmapFilter:y}),C=n.createBindGroup({layout:v,entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:e.refs.color.data.view},{binding:2,resource:w},{binding:3,resource:e.refs.map.view},{binding:4,resource:{buffer:o}}]}),z=n.createBuffer({size:i*ae,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),G={arrayStride:8,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x2",offset:0}]},U=n.createRenderPipeline({label:"displacement",vertex:{module:n.createShaderModule({code:be}),entryPoint:"vs_main",buffers:[G]},fragment:{module:n.createShaderModule({code:be}),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:m});return{bindGroup:C,bindGroupLayout:v,uniformBuffer:g,sampler:w,pipeline:U,params_buf:o,buffer:z,spriteData:new Float32Array(i*ae),spriteCount:0,spriteIndices:new Map}}function ci(t,e,n){if(e.data.spriteCount===0)return;let{device:r}=t,o=ae*e.data.spriteCount*Float32Array.BYTES_PER_ELEMENT;r.queue.writeBuffer(e.data.buffer,0,e.data.spriteData.buffer,0,o);let i=n.beginRenderPass({colorAttachments:[{view:e.refs.out,clearValue:t.clearValue,loadOp:"load",storeOp:"store"}]});i.setPipeline(e.data.pipeline),i.setBindGroup(0,e.data.bindGroup),i.setVertexBuffer(0,e.data.buffer);let a=e.data.spriteCount*3;i.draw(a,1,0,0),i.end()}function ui(t){t.data.bindGroup=null,t.data.buffer.destroy(),t.data.buffer=null,t.data.uniformBuffer.destroy(),t.data.uniformBuffer=null,t.data.spriteData=null,t.data.spriteIndices.clear(),t.data.spriteIndices=null,t.data.params_buf.destroy(),t.data.params_buf=null}function fi(t,e){let{device:n}=t;e.data.bindGroup=n.createBindGroup({layout:e.data.bindGroupLayout,entries:[{binding:0,resource:{buffer:e.data.uniformBuffer}},{binding:1,resource:e.refs.color.data.view},{binding:2,resource:e.data.sampler},{binding:3,resource:e.refs.map.view},{binding:4,resource:{buffer:e.data.params_buf}}]})}function li(t,e){let{device:n}=t,r=t.viewport.width/t.viewport.zoom,o=t.viewport.height/t.viewport.zoom,i=Q.ortho(0,r,o,0,-10,10);j.set(-t.viewport.position[0],-t.viewport.position[1],0,Bt);let a=Q.translation(Bt);n.queue.writeBuffer(e.data.uniformBuffer,0,a.buffer),n.queue.writeBuffer(e.data.uniformBuffer,64,i.buffer)}function Me(t,e){let n=e.vertices,r=GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,o={size:n.byteLength,usage:r,mappedAtCreation:!0},i=t.createBuffer(o);return new Float32Array(i.getMappedRange()).set(n),i.unmap(),{buffer:i,bufferLayout:{arrayStride:20,stepMode:"vertex",attributes:[{shaderLocation:0,format:"float32x3",offset:0},{shaderLocation:1,format:"float32x2",offset:12}]}}}var Te="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;}";var $a=Se.create(),Ft=j.create(),At={type:"overlay",refs:[{name:"spritesheet",type:"customResource",access:"read"},{name:"color",type:"textView",format:"rgba8unorm",access:"write"}],onInit:async function(t,e={}){return pi(t,e)},onRun:function(t,e,n){mi(t,e,n)},onDestroy:function(t,e){vi(e)},onResize:function(t,e){Dt(t,e)},onViewportPosition:function(t,e){Dt(t,e)},customFunctions:{...oe}};async function pi(t,e){let{device:n}=t,r=16192,o=r,a=Float32Array.BYTES_PER_ELEMENT*2,u=Float32Array.BYTES_PER_ELEMENT*2,c=Float32Array.BYTES_PER_ELEMENT*4,p=Float32Array.BYTES_PER_ELEMENT*4,g=n.createBuffer({size:(a+u+c+p)*o,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),v=n.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),m=n.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"}}]}),x=n.createBindGroup({layout:m,entries:[{binding:0,resource:{buffer:v}},{binding:1,resource:e.refs.spritesheet.data.colorTexture.view},{binding:2,resource:e.refs.spritesheet.data.colorTexture.sampler},{binding:3,resource:{buffer:g}}]}),y=n.createPipelineLayout({bindGroupLayouts:[m]}),w=n.createRenderPipeline({label:"overlay",vertex:{module:n.createShaderModule({code:Te}),entryPoint:"vs_main",buffers:[e.refs.spritesheet.data.quads.bufferLayout]},fragment:{module:n.createShaderModule({code:Te}),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:y});return{instancedDrawCalls:new Uint32Array(r*2),instancedDrawCallCount:0,spriteBuffer:g,uniformBuffer:v,pipeline:w,bindGroupLayout:m,bindGroup:x,spriteData:new Float32Array(r*12),spriteCount:0,spriteIndices:new Map,dirty:!1}}function mi(t,e,n){let{device:r}=t,o=e.options.loadOp||"load";e.data.dirty&&(xi(e.data),e.data.dirty=!1),r.queue.writeBuffer(e.data.spriteBuffer,0,e.data.spriteData.buffer);let i=n.beginRenderPass({colorAttachments:[{view:e.refs.color,clearValue:t.clearValue,loadOp:o,storeOp:"store"}]});i.setPipeline(e.data.pipeline),i.setBindGroup(0,e.data.bindGroup),i.setVertexBuffer(0,e.refs.spritesheet.data.quads.buffer);let a=6,l=0;for(let u=0;u<e.data.instancedDrawCallCount;u++){let f=e.data.instancedDrawCalls[u*2]*a,c=e.data.instancedDrawCalls[u*2+1];i.draw(a,c,f,l),l+=c}i.end()}function xi(t){let e=-1,n=0;t.instancedDrawCallCount=0;for(let r=0;r<t.spriteCount;r++){let o=t.spriteData[r*12+11]&65535;o!==e&&(n>0&&(t.instancedDrawCalls[t.instancedDrawCallCount*2]=e,t.instancedDrawCalls[t.instancedDrawCallCount*2+1]=n,t.instancedDrawCallCount++),e=o,n=0),n++}n>0&&(t.instancedDrawCalls[t.instancedDrawCallCount*2]=e,t.instancedDrawCalls[t.instancedDrawCallCount*2+1]=n,t.instancedDrawCallCount++)}function Dt(t,e){let r=Math.round(t.viewport.width/1),o=Math.round(t.viewport.height/1),i=Q.ortho(0,r,o,0,-10,10);j.set(0,0,0,Ft);let a=Q.translation(Ft);t.device.queue.writeBuffer(e.data.uniformBuffer,0,a.buffer),t.device.queue.writeBuffer(e.data.uniformBuffer,64,i.buffer)}function vi(t){t.data.instancedDrawCalls=null,t.data.bindGroup=null,t.data.spriteBuffer.destroy(),t.data.spriteBuffer=null,t.data.uniformBuffer.destroy(),t.data.uniformBuffer=null,t.data.spriteData=null,t.data.spriteIndices.clear(),t.data.spriteIndices=null}var Ee="@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 pos=array(vec2(1.0,1.0),vec2(1.0,-1.0),vec2(-1.0,-1.0),vec2(1.0,1.0),vec2(-1.0,-1.0),vec2(-1.0,1.0),);const uv=array(vec2(1.0,0.0),vec2(1.0,1.0),vec2(0.0,1.0),vec2(1.0,0.0),vec2(0.0,1.0),vec2(0.0,0.0),);@vertex fn vs_main(@builtin(vertex_index)VertexIndex:u32)->Fragment{var output:Fragment;output.Position=vec4(pos[VertexIndex],0.0,1.0);output.TexCoord=uv[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 It={type:"fbBlit",refs:[{name:"in",type:"cobaltTexture",format:"bgra8unorm",access:"read"},{name:"out",type:"cobaltTexture",format:"bgra8unorm",access:"write"}],onInit:async function(t,e={}){return yi(t,e)},onRun:function(t,e,n){wi(t,e,n)},onDestroy:function(t,e){},onResize:function(t,e){hi(t,e)},onViewportPosition:function(t,e){}};async function yi(t,e){let{device:n}=t,r=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),o=n.createBindGroup({layout:r,entries:[{binding:0,resource:e.refs.in.data.view},{binding:1,resource:e.refs.in.data.sampler}]}),i=n.createPipelineLayout({bindGroupLayouts:[r]}),a=n.createRenderPipeline({label:"fb-blit",vertex:{module:n.createShaderModule({code:Ee}),entryPoint:"vs_main",buffers:[]},fragment:{module:n.createShaderModule({code:Ee}),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:i});return{bindGroupLayout:r,bindGroup:o,pipeline:a}}function wi(t,e,n){let{device:r}=t,o=n.beginRenderPass({colorAttachments:[{view:e.refs.out,clearValue:t.clearValue,loadOp:"load",storeOp:"store"}]});o.setPipeline(e.data.pipeline),o.setBindGroup(0,e.data.bindGroup),o.draw(6,1,0,0),o.end()}function hi(t,e){let{device:n}=t;e.data.bindGroup=n.createBindGroup({layout:e.data.bindGroupLayout,entries:[{binding:0,resource:e.refs.in.data.view},{binding:1,resource:e.refs.in.data.sampler}]})}var $t="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 ce(t,e,n,r,o,i=1){let a=ge.sub(r,n),l=ge.normalize(a),u=_i(l),f=i/2,c=e.data.vertexCount*6;e.data.vertices[c+0]=n[0]+u[0]*f,e.data.vertices[c+1]=n[1]+u[1]*f,e.data.vertices[c+2]=o[0],e.data.vertices[c+3]=o[1],e.data.vertices[c+4]=o[2],e.data.vertices[c+5]=o[3],e.data.vertices[c+6]=n[0]-u[0]*f,e.data.vertices[c+7]=n[1]-u[1]*f,e.data.vertices[c+8]=o[0],e.data.vertices[c+9]=o[1],e.data.vertices[c+10]=o[2],e.data.vertices[c+11]=o[3],e.data.vertices[c+12]=r[0]+u[0]*f,e.data.vertices[c+13]=r[1]+u[1]*f,e.data.vertices[c+14]=o[0],e.data.vertices[c+15]=o[1],e.data.vertices[c+16]=o[2],e.data.vertices[c+17]=o[3],e.data.vertices[c+18]=n[0]-u[0]*f,e.data.vertices[c+19]=n[1]-u[1]*f,e.data.vertices[c+20]=o[0],e.data.vertices[c+21]=o[1],e.data.vertices[c+22]=o[2],e.data.vertices[c+23]=o[3],e.data.vertices[c+24]=r[0]+u[0]*f,e.data.vertices[c+25]=r[1]+u[1]*f,e.data.vertices[c+26]=o[0],e.data.vertices[c+27]=o[1],e.data.vertices[c+28]=o[2],e.data.vertices[c+29]=o[3],e.data.vertices[c+30]=r[0]-u[0]*f,e.data.vertices[c+31]=r[1]-u[1]*f,e.data.vertices[c+32]=o[0],e.data.vertices[c+33]=o[1],e.data.vertices[c+34]=o[2],e.data.vertices[c+35]=o[3],e.data.vertexCount+=6,t.device.queue.writeBuffer(e.data.vertexBuffer,0,e.data.vertices.buffer)}function _i(t){return[-t[1],t[0]]}var Rt={line:ce,filledEllipse:function(t,e,n,r,o,i,a){let[l,u]=n,f=2*Math.PI/i;for(let c=0;c<i;c++){let s=c*f,p=(c+1)*f,g=l+r*Math.cos(s),v=u+o*Math.sin(s),m=l+r*Math.cos(p),x=u+o*Math.sin(p),y=e.data.vertexCount*6+c*18;e.data.vertices[y+0]=l,e.data.vertices[y+1]=u,e.data.vertices[y+2]=a[0],e.data.vertices[y+3]=a[1],e.data.vertices[y+4]=a[2],e.data.vertices[y+5]=a[3],e.data.vertices[y+6]=g,e.data.vertices[y+7]=v,e.data.vertices[y+8]=a[0],e.data.vertices[y+9]=a[1],e.data.vertices[y+10]=a[2],e.data.vertices[y+11]=a[3],e.data.vertices[y+12]=m,e.data.vertices[y+13]=x,e.data.vertices[y+14]=a[0],e.data.vertices[y+15]=a[1],e.data.vertices[y+16]=a[2],e.data.vertices[y+17]=a[3]}e.data.vertexCount+=3*i,t.device.queue.writeBuffer(e.data.vertexBuffer,0,e.data.vertices.buffer)},box:function(t,e,n,r,o,i,a=0,l=1){let[u,f]=n,c=r/2,s=o/2,p=[u-c,f-s],g=[u+c,f-s],v=[u-c,f+s],m=[u+c,f+s];a!==0&&(d(p,n,a,p),d(g,n,a,g),d(v,n,a,v),d(m,n,a,m)),ce(t,e,p,g,i,l),ce(t,e,v,m,i,l),ce(t,e,p,v,i,l),ce(t,e,g,m,i,l)},filledBox:function(t,e,n,r,o,i,a=0){let[l,u]=n,f=r/2,c=o/2,s=[l-f,u-c],p=[l+f,u-c],g=[l-f,u+c],v=[l+f,u+c];a!==0&&(d(s,n,a,s),d(p,n,a,p),d(g,n,a,g),d(v,n,a,v));let m=e.data.vertexCount*6;e.data.vertices[m+0]=s[0],e.data.vertices[m+1]=s[1],e.data.vertices[m+2]=i[0],e.data.vertices[m+3]=i[1],e.data.vertices[m+4]=i[2],e.data.vertices[m+5]=i[3],e.data.vertices[m+6]=g[0],e.data.vertices[m+7]=g[1],e.data.vertices[m+8]=i[0],e.data.vertices[m+9]=i[1],e.data.vertices[m+10]=i[2],e.data.vertices[m+11]=i[3],e.data.vertices[m+12]=p[0],e.data.vertices[m+13]=p[1],e.data.vertices[m+14]=i[0],e.data.vertices[m+15]=i[1],e.data.vertices[m+16]=i[2],e.data.vertices[m+17]=i[3],e.data.vertices[m+18]=g[0],e.data.vertices[m+19]=g[1],e.data.vertices[m+20]=i[0],e.data.vertices[m+21]=i[1],e.data.vertices[m+22]=i[2],e.data.vertices[m+23]=i[3],e.data.vertices[m+24]=v[0],e.data.vertices[m+25]=v[1],e.data.vertices[m+26]=i[0],e.data.vertices[m+27]=i[1],e.data.vertices[m+28]=i[2],e.data.vertices[m+29]=i[3],e.data.vertices[m+30]=p[0],e.data.vertices[m+31]=p[1],e.data.vertices[m+32]=i[0],e.data.vertices[m+33]=i[1],e.data.vertices[m+34]=i[2],e.data.vertices[m+35]=i[3],e.data.vertexCount+=6,t.device.queue.writeBuffer(e.data.vertexBuffer,0,e.data.vertices.buffer)},clear:function(t,e){e.data.vertexCount=0}};function d(t,e,n,r){let o=t[0]-e[0],i=t[1]-e[1],a=Math.sin(n),l=Math.cos(n);return r[0]=o*l-i*a+e[0],r[1]=o*a+i*l+e[1],r}var Ot=j.create(0,0,0),Vt={type:"primitives",refs:[{name:"color",type:"textView",format:"rgba8unorm",access:"write"}],onInit:async function(t,e={}){return Si(t,e)},onRun:function(t,e,n){Mi(t,e,n)},onDestroy:function(t,e){Ti(e)},onResize:function(t,e){Lt(t,e)},onViewportPosition:function(t,e){Lt(t,e)},customFunctions:Rt};async function Si(t,e){let{device:n}=t,r=new Float32Array(1e4),o=n.createBuffer({size:r.byteLength,usage:GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST}),i=n.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),a=n.createShaderModule({code:$t}),l=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{}}]}),u=n.createPipelineLayout({bindGroupLayouts:[l]}),f=n.createBindGroup({layout:l,entries:[{binding:0,resource:{buffer:i}}]}),c=n.createRenderPipeline({layout:u,vertex:{module:a,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:a,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:i,vertexBuffer:o,pipeline:c,bindGroup:f,vertexCount:0,vertices:r}}function Mi(t,e,n){if(e.data.vertexCount===0)return;let{device:r}=t,o=e.options.loadOp||"load",i=n.beginRenderPass({colorAttachments:[{view:e.refs.color,clearValue:t.clearValue,loadOp:o,storeOp:"store"}]});i.setPipeline(e.data.pipeline),i.setBindGroup(0,e.data.bindGroup),i.setVertexBuffer(0,e.data.vertexBuffer),i.draw(e.data.vertexCount),i.end()}function Ti(t){t.data.vertexBuffer.destroy(),t.data.vertexBuffer=null,t.data.uniformBuffer.destroy(),t.data.uniformBuffer=null}function Lt(t,e){let{device:n}=t,r=t.viewport.width/t.viewport.zoom,o=t.viewport.height/t.viewport.zoom,i=Q.ortho(0,r,o,0,-10,10);j.set(-t.viewport.position[0],-t.viewport.position[1],0,Ot);let a=Q.translation(Ot);n.queue.writeBuffer(e.data.uniformBuffer,0,a.buffer),n.queue.writeBuffer(e.data.uniformBuffer,64,i.buffer)}function Ce(t){let e=new Float32Array([-1,-1,0,1,1,-1,1,1,1,1,1,0,-1,-1,0,1,1,1,1,0,-1,1,0,0]),n=GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,r={size:e.byteLength,usage:n,mappedAtCreation:!0},o=t.createBuffer(r);return new Float32Array(o.getMappedRange()).set(e),o.unmap(),{buffer:o,bufferLayout:{arrayStride:16,attributes:[{shaderLocation:0,format:"float32x2",offset:0},{shaderLocation:1,format:"float32x2",offset:8}]}}}var ze="struct TransformData{viewOffset:vec2<f32>,viewportSize:vec2<f32>,inverseAtlasTextureSize:vec2<f32>,tileSize:f32,inverseTileSize:f32,};struct TileScroll{scrollScale:vec2<f32>};@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,@location(0)vertexPosition:vec2<f32>,@location(1)vertexTexCoord:vec2<f32>)->Fragment{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 J=new Float32Array(8),Nt={type:"tileAtlas",refs:[],onInit:async function(t,e={}){return Ci(t,e)},onRun:function(t,e,n){},onDestroy:function(t,e){zi(data)},onResize:function(t,e){qt(t,e)},onViewportPosition:function(t,e){qt(t,e)}};async function Ci(t,e){let{device:n}=t,r=Ce(n),o=await K(t,"tile atlas",e.options.textureUrl),i=n.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),a=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),l=n.createBindGroup({layout:a,entries:[{binding:0,resource:{buffer:i}},{binding:1,resource:o.view},{binding:2,resource:o.sampler}]}),u=n.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,texture:{}},{binding:2,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]}),f=n.createPipelineLayout({bindGroupLayouts:[u,a]});return{pipeline:n.createRenderPipeline({label:"tile",vertex:{module:n.createShaderModule({code:ze}),entryPoint:"vs_main",buffers:[r.bufferLayout]},fragment:{module:n.createShaderModule({code:ze}),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:f}),uniformBuffer:i,atlasBindGroup:l,atlasMaterial:o,tileBindGroupLayout:u,quad:r,tileSize:e.options.tileSize,tileScale:e.options.tileScale}}function zi(t){t.atlasMaterial.texture.destroy(),t.atlasMaterial.texture=void 0}function qt(t,e){J[0]=t.viewport.position[0],J[1]=t.viewport.position[1];let n=e.data,{tileScale:r,tileSize:o}=n,i=t.viewport.width/t.viewport.zoom,a=t.viewport.height/t.viewport.zoom;J[2]=i/r,J[3]=a/r,J[4]=1/n.atlasMaterial.texture.width,J[5]=1/n.atlasMaterial.texture.height,J[6]=o,J[7]=1/o,t.device.queue.writeBuffer(n.uniformBuffer,0,J,0,8)}function ye(t){let n=Object.keys(t.frames).length,r=new Float32Array(n*30),o=[],i={},a=0;for(let l in t.frames){let u=t.frames[l];o.push(l),i[l]=u.sourceSize;let f=-.5+u.spriteSourceSize.x/u.sourceSize.w,c=-.5+u.spriteSourceSize.y/u.sourceSize.h,s=-.5+(u.spriteSourceSize.x+u.spriteSourceSize.w)/u.sourceSize.w,p=-.5+(u.spriteSourceSize.y+u.spriteSourceSize.h)/u.sourceSize.h,g=[f,c,0],v=[f,p,0],m=[s,p,0],x=[s,c,0],y=0+u.frame.x/t.meta.size.w,w=0+u.frame.y/t.meta.size.h,C=0+(u.frame.x+u.frame.w)/t.meta.size.w,z=0+(u.frame.y+u.frame.h)/t.meta.size.h,G=[y,w],U=[y,z],F=[C,z],P=[C,w];r.set(g,a),r.set(G,a+3),r.set(v,a+5),r.set(U,a+8),r.set(m,a+10),r.set(F,a+13),r.set(g,a+15),r.set(G,a+18),r.set(m,a+20),r.set(F,a+23),r.set(x,a+25),r.set(P,a+28),a+=30}return{spriteMeta:i,locations:o,vertices:r}}var Ge="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 Yt=j.create(0,0,0),Ht={type:"spritesheet",refs:[],onInit:async function(t,e={}){return Bi(t,e)},onRun:function(t,e,n){},onDestroy:function(t,e){Ui(e)},onResize:function(t,e){Xt(t,e)},onViewportPosition:function(t,e){Xt(t,e)}};async function Bi(t,e){let{canvas:n,device:r}=t,o,i,a;n?(o=await Fi(e.options.spriteSheetJsonUrl),o=ye(o),i=await K(t,"sprite",e.options.colorTextureUrl,"rgba8unorm"),a=await K(t,"emissive sprite",e.options.emissiveTextureUrl,"rgba8unorm")):(o=ye(e.options.spriteSheetJson),i=await ne(t,"sprite",e.options.colorTexture,"rgba8unorm"),a=await ne(t,"emissive sprite",e.options.emissiveTexture,"rgba8unorm"));let l=Me(r,o);n&&(n.style.imageRendering="pixelated");let u=r.createBuffer({size:64*2,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),f=r.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:{}}]}),c=r.createPipelineLayout({bindGroupLayouts:[f]});return{pipeline:r.createRenderPipeline({label:"sprite",vertex:{module:r.createShaderModule({code:Ge}),entryPoint:"vs_main",buffers:[l.bufferLayout]},fragment:{module:r.createShaderModule({code:Ge}),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:c}),uniformBuffer:u,quads:l,colorTexture:i,emissiveTexture:a,bindGroupLayout:f,spritesheet:o}}function Ui(t){t.data.quads.buffer.destroy(),t.data.colorTexture.buffer.destroy(),t.data.uniformBuffer.destroy(),t.data.emissiveTexture.texture.destroy()}async function Fi(t){return(await fetch(t)).json()}function Xt(t,e){let{device:n,viewport:r}=t,o=r.width/r.zoom,i=r.height/r.zoom,a=Q.ortho(0,o,i,0,-10,10);j.set(-r.position[0],-r.position[1],0,Yt);let l=Q.translation(Yt);n.queue.writeBuffer(e.data.uniformBuffer,0,l.buffer),n.queue.writeBuffer(e.data.uniformBuffer,64,a.buffer)}var Wt={type:"fbTexture",refs:[],onInit:async function(t,e={}){return Di(t,e)},onRun:function(t,e,n){},onDestroy:function(t,e){jt(data)},onResize:function(t,e){Pi(t,e)},onViewportPosition:function(t,e){}};async function Di(t,e){let{device:n}=t,{label:r,mip_count:o,format:i,usage:a,viewportScale:l}=e.options;return Y(n,r,t.viewport.width*l,t.viewport.height*l,o,i,a)}function jt(t){t.data.texture.destroy()}function Pi(t,e){let{device:n}=t;jt(e);let{width:r,height:o}=t.viewport,{options:i}=e,a=e.options.viewportScale;e.data=Y(n,i.label,r*a,o*a,i.mip_count,i.format,i.usage)}async function Gc(t,e,n){let r,o,i,a;return t.sdlWindow&&t.gpu?(o=t.gpu,r=await(await o.create(["verbose=1"]).requestAdapter()).requestDevice(),i=o.renderGPUDeviceToWindow({device:r,window:t.sdlWindow}),global.GPUBufferUsage=o.GPUBufferUsage,global.GPUShaderStage=o.GPUShaderStage,global.GPUTextureUsage=o.GPUTextureUsage):(a=t,r=await(await navigator.gpu?.requestAdapter({powerPreference:"high-performance"}))?.requestDevice(),o=navigator.gpu,i=a.getContext("webgpu"),i.configure({device:r,format:navigator.gpu?.getPreferredCanvasFormat(),alphaMode:"opaque"})),{nodeDefs:{tileAtlas:Nt,spritesheet:Ht,fbTexture:Wt,bloom:$e,composite:Le,sprite:Ne,tile:Xe,displacement:Ut,overlay:At,fbBlit:It,primitives:Vt},nodes:[],defaultTextureViewRefs:[],canvas:a,device:r,context:i,gpu:o,clearValue:{r:0,g:0,b:0,a:1},viewport:{width:e,height:n,zoom:1,position:[0,0]}}}function Bc(t,e){if(!e?.type)throw new Error("Can't define a new node missing a type.");t.nodeDefs[e.type]=e}async function Uc(t,e){let n=t.nodeDefs[e?.type];if(!n)throw new Error("Can't initialize a new node missing a type.");let r={type:e.type,refs:e.refs||{},options:e.options||{},data:{},enabled:!0};for(let i in r.refs)r.refs[i]==="FRAME_TEXTURE_VIEW"&&(t.defaultTextureViewRefs.push({node:r,refName:i}),r.refs[i]=Qt(t));r.data=await n.onInit(t,r);let o=n.customFunctions||{};for(let i in o)r[i]=function(...a){return o[i](t,r,...a)};return t.nodes.push(r),r}function Fc(t){let{device:e,context:n}=t,r=e.createCommandEncoder(),o=Qt(t);for(let i of t.defaultTextureViewRefs)i.node.refs[i.refName]=o;for(let i of t.nodes){if(!i.enabled)continue;t.nodeDefs[i.type].onRun(t,i,r)}e.queue.submit([r.finish()]),t.canvas||t.context.swap()}function Dc(t){for(let e of t.nodes)t.nodeDefs[e.type].onDestroy(t,e);t.nodes.length=0,t.defaultTextureViewRefs.length=0}function Pc(t,e,n){t.viewport.width=e,t.viewport.height=n;for(let r of t.nodes)t.nodeDefs[r.type].onResize(t,r)}function Ac(t,e){t.viewport.position[0]=e[0]-t.viewport.width/2/t.viewport.zoom,t.viewport.position[1]=e[1]-t.viewport.height/2/t.viewport.zoom;for(let n of t.nodes)t.nodeDefs[n.type].onViewportPosition(t,n)}function Ve(t){return t.canvas?navigator.gpu.getPreferredCanvasFormat():t.context.getPreferredFormat()}function Qt(t){return t.canvas?t.context.getCurrentTexture().createView():t.context.getCurrentTextureView()}export{Y as createTexture,ne as createTextureFromBuffer,K as createTextureFromUrl,Bc as defineNode,Fc as draw,Qt as getCurrentTextureView,Ve as getPreferredFormat,Gc as init,Uc as initNode,Dc as reset,Pc as setViewportDimensions,Ac as setViewportPosition};