ohzi-core 15.0.0 → 15.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.
package/build/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{Texture as t,Vector2 as e,NoBlending as s,Color as r,Scene as i,Mesh as n,PlaneGeometry as o,OrthographicCamera as a,Vector4 as h,RenderTarget as _,Vector3 as l,PositionalAudio as c,Audio as u,AudioContext as d,SRGBColorSpace as p,NoColorSpace as m,CubeTextureLoader as g,CanvasTexture as f,UVMapping as y,ClampToEdgeWrapping as b,NearestFilter as w,DoubleSide as x,LinearFilter as v,Quaternion as z,Matrix4 as M,Box2 as T,InstancedBufferGeometry as k,Float32BufferAttribute as A,InstancedInterleavedBuffer as S,DynamicDrawUsage as R,InterleavedBufferAttribute as C,Sphere as j,Box3 as F,TextureLoader as q,Object3D as P,LineBasicMaterial as N,AlwaysDepth as O,BufferGeometry as L,Line as $,LinearMipMapLinearFilter as U,PerspectiveCamera as B,CylinderGeometry as E,ConeGeometry as I,MeshBasicMaterial as D,BoxGeometry as Q,SphereGeometry as V,Box3Helper as Y,CatmullRomCurve3 as W,Plane as X,Line3 as H,Ray as Z,CustomBlending as K,OneFactor as J,AdditiveBlending as G,BackSide as tt,DataTexture as et,RGBAFormat as st,RepeatWrapping as rt,HalfFloatType as it,UnsignedByteType as nt,LinearSRGBColorSpace as ot,BufferAttribute as at,Skeleton as ht,FileLoader as _t,PlaneHelper as lt}from"three";import{texture as ct,uniform as ut,vec4 as dt,positionGeometry as pt,uv as mt,mix as gt,Fn as ft,fract as yt,vec2 as bt,dot as wt,vec3 as xt,float as vt,normalize as zt,abs as Mt,positionView as Tt,normalView as kt,attribute as At,mat4 as St,cameraProjectionMatrix as Rt,cameraViewMatrix as Ct,varying as jt,max as Ft,min as qt,length as Pt,dFdx as Nt,dFdy as Ot,clamp as Lt,modelViewMatrix as $t,colorSpaceToWorking as Ut,packNormalToRGB as Bt,normalWorldGeometry as Et,screenUV as It,modelViewPosition as Dt,saturate as Qt,uniformArray as Vt,cross as Yt,Loop as Wt,smoothstep as Xt,step as Ht,floor as Zt,ivec2 as Kt,fwidth as Jt,modelWorldMatrix as Gt,cameraPosition as te}from"three/tsl";import{NodeMaterial as ee,MeshBasicNodeMaterial as se}from"three/webgpu";import{GLTFLoader as re}from"three/examples/jsm/loaders/GLTFLoader.js";import{HDRCubeTextureLoader as ie}from"three/examples/jsm/loaders/HDRCubeTextureLoader.js";import{HDRLoader as ne}from"three/examples/jsm/loaders/HDRLoader.js";import*as oe from"three/examples/jsm/utils/BufferGeometryUtils.js";export{oe as BufferGeometryUtils};import{ColladaLoader as ae}from"three/examples/jsm/loaders/ColladaLoader.js";import{FontLoader as he}from"three/examples/jsm/loaders/FontLoader.js";import{OBJLoader as _e}from"three/examples/jsm/loaders/OBJLoader.js";class le{on_post_start(){}on_enter(t){}on_exit(t){}before_update(){}update(){}fixed_update(){}on_post_render(){}on_pre_render(){}on_frame_end(){}dispose(){}}class ce extends ee{constructor(){super(),this.uv_by_texture=new Map,this.top_left_origin_by_texture=new Map,this.uniforms={_MainTex:ct(new t),_Resolution:ut(new e(0,0)),_TargetResolution:ut(new e(0,0))},this.vertexNode=dt(pt.xy.mul(2),0,1),this.fragmentNode=this.sample_main_tex(),this.depthWrite=!1,this.depthTest=!1,this.blending=s}uv_for(t){let e=this.uv_by_texture.get(t);return void 0===e&&(e=this.texture_uv_at(t,mt()),this.uv_by_texture.set(t,e)),e}texture_uv_at(t,e){let s=this.top_left_origin_by_texture.get(t);return void 0===s&&(s=ut(!1).onObjectUpdate((()=>{return!0===(e=t.value).isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture;var e})),this.top_left_origin_by_texture.set(t,s)),s.select(e.flipY(),e)}sample(t,e){const s=this.uv_for(t);return t.sample(e?s.add(e):s)}sample_main_tex(t){return this.sample(this.uniforms._MainTex,t)}}class ue extends ce{constructor(e=!1){super();const s=ct(new t);this.uniforms._SecondTex=s,this.fragmentNode=this.sample_main_tex().add(this.sample(s))}set_add_texture(t){this.uniforms._SecondTex.value=t}}const de=[1,.8,.6,.4,.2];class pe extends ce{constructor(e,s=!1){super();const i=ut(1),n=ut(1),o=[];this.uniforms.bloomStrength=i,this.uniforms.bloomRadius=n;let a=dt(0);for(let s=0;s<e;s++){const e=ct(new t),i=new r("#FFFFFF"),h=de[s]??de[de.length-1],_=gt(h,1.2-h,n);this.uniforms[`blurTexture${s+1}`]=e,o.push(i),a=a.add(this.sample(e).mul(dt(ut(i),1)).mul(_))}this.uniforms.bloomTintColors={value:o},this.fragmentNode=a.mul(i)}set_blur_texture_0(t){this.uniforms.blurTexture1.value=t}set_blur_texture_1(t){this.uniforms.blurTexture2.value=t}set_blur_texture_2(t){this.uniforms.blurTexture3.value=t}set_blur_texture_3(t){this.uniforms.blurTexture4.value=t}set_blur_texture_4(t){this.uniforms.blurTexture5.value=t}set_bloom_strength(t){this.uniforms.bloomStrength.value=t}set_bloom_radius(t){this.uniforms.bloomRadius.value=t}set_tint_color_0(t){this.uniforms.bloomTintColors.value[0].set(t)}set_tint_color_1(t){this.uniforms.bloomTintColors.value[1].set(t)}set_tint_color_2(t){this.uniforms.bloomTintColors.value[2].set(t)}set_tint_color_3(t){this.uniforms.bloomTintColors.value[3].set(t)}set_tint_color_4(t){this.uniforms.bloomTintColors.value[4].set(t)}}class me{constructor(){}render(t){}on_enter(t,e){}on_exit(t,e){}resize(){}dispose(){}}class ge{constructor(t,e,s=1){this.resource_id=t,this.url=e,this.loaded_bytes=0,this.total_bytes=s,this.has_finished=!1,this.has_error=!1,this.error_message="none"}__update_downloaded_bytes(t,e){t=this.is_number(t)?t:1,e=this.is_number(e)?e:1,this.loaded_bytes=t,e>0&&(this.total_bytes=e),this.loaded_bytes>this.total_bytes&&console.warn("Total bytes is smaller than loaded ones. Please set total bytes by hand to:",this.url)}__loading_ended(){this.has_finished=!0}__set_error(t){this.has_error=!0,this.error_message=t}print_error(){console.error("Error while loading "+this.resource_id+"\n\t path: "+this.url+"\n\t\t"+this.error_message)}load(t){if(void 0===t.resources_by_url[this.url]){const e="default";fetch(this.url,{method:"GET",mode:"cors",cache:e,credentials:"same-origin",redirect:"follow"}).then(this.on_progress.bind(this,t)).catch(this.__on_error.bind(this))}else t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}async on_progress(t,e){const s=e.clone(),r=e.body.getReader(),i=+e.headers.get("Content-Length");let n=0;for(;;){const{done:t,value:e}=await r.read();if(t)break;n+=e.length,this.__update_downloaded_bytes(n,i)}e.ok?this.on_preloaded_finished(t,s):(this.__set_error(`${e.status}: ${e.statusText}`),this.__loading_ended())}on_preloaded_finished(t,e){}__on_error(t){console.error(t)}is_int(t){return Number(t)===t&&t%1==0}is_float(t){return Number(t)===t&&t%1!=0}is_number(t){return this.is_int(t)||this.is_float(t)}}const fe=new class{init(){this._current=void 0,this._spectator=void 0}set current(t){this._current=t}get current(){return this._current}set spectator(t){this._spectator=t}get spectator(){return this._spectator}};const ye=new class{init(){this.width=1,this.height=1,this.position=new e,this.render_width=1,this.render_height=1,this.width_height=new e(this.width,this.height),this.dpr=1,this.pixel_size=new e(1/this.width,1/this.height)}update_position(t,e){this.position.set(t,e)}update(){this.size_changed=!1}update_size(t,s){this.width=t,this.height=s,this.pixel_size=new e(1/this.width,1/this.height),this.width_height.x=t,this.width_height.y=s,this.render_width=t*this.dpr,this.render_height=s*this.dpr,this.size_changed=!0}apply_pixel_density_v2(t){return t.multiplyScalar(1/this.dpr),t}apply_pixel_density(t){return t*(1/this.dpr)}get_pixel_size(){return this.pixel_size}get aspect_ratio(){return this.width/this.height}get portrait(){return this.width<this.height}};const be=new class{init(t){this._current=t}add_scene(t){}get current(){return this._current}set current(t){this._current=t}dispose(){for(this.current.traverse((t=>{if(t.geometry){t.geometry.dispose();const e=t.material;Array.isArray(e)?e.forEach((t=>t.dispose())):e.dispose()}}));this.current.children.length>0;)this.current.remove(this.current.children[0])}};class we{constructor(t){this.renderer=t,this._blit_scene=new i,this._blit_material=new ce,this._blit_quad=new n(new o(1,1),this._blit_material),this._blit_scene.add(this._blit_quad),this._blit_camera=new a(-1,1,1,-1,-1e4,1e4)}blit(t,e){this._blit_quad.material=this._blit_material;const s=!0===t.isRenderTarget?t.texture:t,r=!0===t.isRenderTarget?t.width:t.image.width,i=!0===t.isRenderTarget?t.height:t.image.height;this._blit_quad.material.uniforms._MainTex.value=s,this._blit_quad.material.uniforms._Resolution.value.set(r,i),e?this._blit_quad.material.uniforms._TargetResolution.value.set(e.width,e.height):this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value),this.__render(e)}material_pass(t,e){this._blit_quad.material=t,this.__render(e)}blit_with_material(t,e,s){const r=!0===t.isRenderTarget?t.texture:t,i=!0===t.isRenderTarget?t.width:t.image.width,n=!0===t.isRenderTarget?t.height:t.image.height;this._blit_quad.material=s,this._blit_quad.material.uniforms._MainTex.value=r,this._blit_quad.material.uniforms._Resolution.value.set(i,n),e?this._blit_quad.material.uniforms._TargetResolution.value.set(e.width,e.height):this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value),this.__render(e)}blit_clear_with_material(t,e){this._blit_quad.material=e,this.__render(t)}dispose(){this._blit_quad.geometry.dispose(),this._blit_quad.material.dispose()}__render(t){const e=void 0===t?null:t,s=this.renderer.getRenderTarget();this.renderer.setRenderTarget(e),this.renderer.render(this._blit_scene,this._blit_camera),this.renderer.setRenderTarget(s)}}const xe=1.7777,ve=ft((([t])=>{const e=yt(bt(1,255).mul(t));return bt(e.x.sub(e.y.div(255)),e.y)})),ze=ft((([t])=>wt(t,bt(1,1/255)))),Me=ft((([t])=>t.xy.div(t.z.add(1)).div(xe).mul(.5).add(.5))),Te=ft((([t])=>{const e=xt(t.mul(3.5554).sub(xe),1),s=vt(2).div(wt(e,e));return xt(e.xy.mul(s),s.sub(1))}));class ke extends ce{constructor(t,e){super();const s=ut(new h(t,e.x,e.y,e.z));this.uniforms._DepthNormal=s,this.fragmentNode=dt(ve(s.x),Me(zt(s.yzw)))}}class Ae extends ee{constructor(){super();const t=ut(1);this.uniforms={_FarPlane:t},this.fragmentNode=dt(ve(Mt(Tt.z).div(t)),Me(zt(kt))),this.blending=s}set far_plane(t){this.uniforms._FarPlane.value=t}get far_plane(){return this.uniforms._FarPlane.value}}class Se{constructor(){this.RT=new _(ye.width,ye.height),this.clear_depth_normal_mat=new ke(1,new l(0,0,1)),this.depth_normal_material=new Ae}render(t){this.__resize_RT_if_necessary(),t.clear(this.RT,void 0,!0,!0),t.blit_clear_with_material(this.RT,this.clear_depth_normal_mat),this.depth_normal_material.far_plane=fe.current.far,t.render(void 0,void 0,this.RT,this.depth_normal_material)}__resize_RT_if_necessary(){this.RT.width===ye.width&&this.RT.height===ye.height||this.RT.setSize(ye.width,ye.height)}get render_target(){return this.RT}}const Re=new class{init({renderer:t,core_attributes:e,dpr:s}){this._renderer=t,this.blitter=void 0,this.canvas=void 0,this.no_render=void 0,this.current_render_mode=void 0,this.generate_depth_normal_texture=!1,this.depth_and_normals_renderer=void 0,this.core_attributes={xr_enabled:!1},Object.assign(this.core_attributes,e),this.core_attributes.xr_enabled?this._renderer.xr.enabled=!0:this._renderer.autoClear=!1,ye.dpr=s,this._renderer.setPixelRatio(s),this.blitter=new we(this._renderer),this.canvas=this._renderer.domElement,this.no_render=new me,this.current_render_mode=this.no_render,this.generate_depth_normal_texture=!1,this.depth_and_normals_renderer=new Se}get dom_element(){return this._renderer.domElement}get depth_normals_RT(){return this.depth_and_normals_renderer.render_target}set_state(t){this.current_render_mode.on_exit(this,this._renderer),this.current_render_mode=t,this.current_render_mode.on_enter(this,this._renderer)}update(){this.generate_depth_normal_texture&&this.depth_and_normals_renderer.render(this),this.__update_current_camera(),fe.current&&this.current_render_mode.render(),ye.update()}__update_current_camera(){fe.current&&(fe.current.aspect=ye.aspect_ratio,fe.current.updateProjectionMatrix(),fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0))}render(t,e,s,r){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s),this._renderer.render(t||be.current,e||fe.current),this.__apply_override_material(t,void 0)}async compile(t,e,s,r){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s),await this._renderer.compile(t||be.current,e||fe.current),this.__apply_override_material(t,void 0)}async compile_async(t,e,s,r,i){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s);const n=this._renderer.compileAsync(t||be.current,e||fe.current,i);return this.__apply_override_material(t,void 0),n}render_scene(t){"on_pre_render"in t&&t.on_pre_render(),"render"in t?t.render():this.render(t,void 0),"on_post_render"in t&&t.on_post_render()}__apply_override_material(t,e){e=void 0===e?null:e,t?t.overrideMaterial=e:be.current.overrideMaterial=e}async readback_RT(t){return this._renderer.readRenderTargetPixelsAsync(t,0,0,t.width,t.height)}clear(t,e,s,r){this._renderer.setRenderTarget(void 0===t?null:t),e&&this._renderer.setClearColor(e.clear_color,e.clear_alpha),this._renderer.clear(!!e,!!s,!!r)}on_resize(t,e){for(const s of t)ye.dpr=e,ye.update_position(s.contentRect.x,s.contentRect.y),ye.update_size(s.contentRect.width,s.contentRect.height),this.canvas.width=ye.render_width,this.canvas.height=ye.render_height,this._renderer.setViewport(0,0,ye.render_width,ye.render_height),this._renderer.setSize(ye.width,ye.height),this.__update_current_camera()}material_pass(t,e){this.blitter.material_pass(t,e)}blit(t,e,s){s?this.blitter.blit_with_material(t,e,s):this.blitter.blit(t,e)}blit_clear_with_material(t,e){this.blitter.blit_clear_with_material(t,e)}take_screenshot(t,e=ye.width,s=ye.height){const r=ye.width,i=ye.height,n=e,o=s,a=1024,h=1024,_=Math.ceil(n/a),l=Math.ceil(o/h);ye.update_size(a,h);const c=this._renderer.getPixelRatio();this._renderer.setPixelRatio(1),this._renderer.setSize(a,h,!1);const u=document.createElement("canvas").getContext("2d");u.canvas.width=n,u.canvas.height=o,fe.current.aspect=ye.aspect_ratio,fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0);for(let t=0;t<_;t++)for(let e=0;e<l;e++)fe.current.setViewOffset(n,o,ye.width*t,ye.height*e,ye.width,ye.height),this.current_render_mode.render(),u.drawImage(this._renderer.domElement,ye.width*t,ye.height*e);u.canvas.toBlob(t,"image/png;base64;"),fe.current.clearViewOffset(),ye.update_size(r,i),this._renderer.setPixelRatio(c),this._renderer.setSize(r,i,!1),fe.current.aspect=ye.aspect_ratio,fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0)}download_screenshot(t){const e=document.createElement("a");e.download="Snapshot.png",e.href=URL.createObjectURL(t),e.click(),e.onclick=function(){requestAnimationFrame((function(){URL.revokeObjectURL(e.href)})),e.removeAttribute("href")}}dispose(){this._renderer.dispose(),this.current_render_mode.dispose(),this.blitter.dispose()}};class Ce{constructor(t,e=!0,s=1,r=!1){this.buffer=t,this.loop=e,this.volume=s,this.positional=r,this.audio=void 0}init(t){this.positional?this.audio=new c(t):this.audio=new u(t),this.audio.setBuffer(this.buffer),this.audio.setLoop(this.loop),this.audio.gain.gain.value=0,this.audio.setVolume(this.loop?0:this.volume)}play(){this.audio.play()}pause(){this.audio.pause()}stop(){this.audio.stop()}get is_playing(){return this.audio.isPlaying}}class je extends ge{constructor(t,e,s=!0,r=0,i,n=!1){super(t,e,i),this.loop=s,this.volume=r,this.positional=n}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.instantiate_audio(t):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}instantiate_audio(t){const e=d.getContext(),s=e.createBuffer(2,22050,44100);fetch(this.url).then((t=>t.blob())).then((r=>{r.arrayBuffer?r.arrayBuffer().then((s=>{e.decodeAudioData(s,(e=>{t.set_resource(this.resource_id,this.url,new Ce(e,this.loop,this.volume,this.positional)),this.__update_downloaded_bytes(1,1),this.__loading_ended()}))})):(t.set_resource(this.resource_id,this.url,new Ce(s,this.loop,this.volume,this.positional)),this.__update_downloaded_bytes(1,1),this.__loading_ended())}))}}const Fe=new class{init(){this.resources={},this.resources_by_url={}}set_resource(t,e,s){Object.keys(this.resources_by_url).includes(e)?this.resources[t]=this.resources_by_url[e]:(this.resources[t]=s,this.resources_by_url[e]=s)}get_resource(t){return this.resources[t]}get(t){return this.resources[t]}};class qe{constructor(t,e,s){this.resource_container=Fe,this.assets=e,this.name=t,this.worker=s,this.bound_on_message=this.on_message.bind(this),this.__setup_worker(),this.assets_loaders=this.__setup_loaders()}load(){this.worker.postMessage({type:"load",loader_name:this.name})}is_loaded(){for(let t=0;t<this.assets_loaders.length;t++){const e=this.assets_loaders[t];if(!e.has_finished)return!1;e.has_error&&(e.url=e.original_url,e.print_error())}return!0}get_progress(){return this.__get_loaded_bytes()/this.__get_total_bytes()}__get_loaded_bytes(){let t=1;for(let e=0;e<this.assets_loaders.length;e++)t+=this.assets_loaders[e].loaded_bytes;return t}__get_total_bytes(){let t=1;for(let e=0;e<this.assets_loaders.length;e++)t+=this.assets_loaders[e].total_bytes;return t}get_assets_names(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];t.push(s.name)}return t}static create_worker(){return new Worker(new URL("./assets_loader/AsyncAssetsLoaderWorker.ts",import.meta.url),{name:"OHZI - AssetLoader",type:"module"})}__setup_worker(){this.worker.addEventListener("message",this.bound_on_message),this.worker.postMessage({type:"assets",loader_name:this.name,data:this.assets})}on_message(t){const e=t.data;if(e.type===`asset_loaded_${this.name}`)this.__on_assets_loaded(e.data)}__on_assets_loaded(t){this.worker.removeEventListener("message",this.bound_on_message);for(let e=0;e<this.assets_loaders.length;e++){const s=this.assets_loaders[e];s.original_url=s.url,s.url=t[s.resource_id],s.on_preloaded_finished(this.resource_container)}}__setup_loaders(){return console.warn("Not implemented"),[]}}class Pe extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];t.push(new je(s.name,s.url,s.loop,s.volume,s.size,s.positional))}return t}}class Ne extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new re,this.loader.setDRACOLoader(s)}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Oe extends ge{constructor(t,e,s){super(t,e,s),this.loader=new re}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Le extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];if(s.draco){const e=Fe.get("draco_loader");t.push(new Ne(s.name,s.url,e,s.size))}else t.push(new Oe(s.name,s.url,s.size))}return t}}const $e=new class{async init(){switch(this.browser_name="",this.agent=window.navigator.userAgent.toLowerCase(),this.has_web_xr_support="xr"in navigator,this.is_vr=this.has_web_xr_support&&await navigator.xr.isSessionSupported("immersive-vr"),!0){case this.agent.indexOf("edge")>-1:this.browser_name="edge_ie";break;case this.agent.indexOf("edg")>-1:this.browser_name="edge_chromium";break;case this.agent.indexOf("opr")>-1&&!!window.opr:this.browser_name="opera";break;case this.agent.indexOf("chrome")>-1&&!!window.chrome:this.browser_name="chrome";break;case this.agent.indexOf("trident")>-1:this.browser_name="iexplorer";break;case this.agent.indexOf("firefox")>-1:this.browser_name="firefox";break;case this.agent.indexOf("safari")>-1:this.browser_name="safari";break;default:this.browser_name="other"}this.version=this.get_version()}get name(){return this.browser_name}get is_safari(){return"safari"===this.browser_name}get is_chrome(){return"chrome"===this.browser_name}get is_firefox(){return"firefox"===this.browser_name}get is_edge(){return"edge_ie"===this.browser_name}get is_edge_chromium(){return"edge_chromium"===this.browser_name}get has_webm(){return!!(this.is_chrome||this.is_firefox||this.is_edge_chromium)}get has_hvec(){return this.is_safari}get preferred_video_extension(){return this.has_webm?"webm":this.has_hvec?"hvec.mp4":"mp4"}get_version(){const t=navigator.userAgent;let e=[],s="0",r=t.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(r[1])&&(e=/\brv[ :]+(\d+)/g.exec(t)||[],s="IE "+(e[1]||"")),"Chrome"===r[1]&&(e=t.match(/\b(OPR|Edge)\/(\d+)/),null!=e&&(s=e.slice(1).join(" ").replace("OPR","Opera"))),r=r[2]?[r[1],r[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(e=t.match(/version\/(\d+(\.\d+)?)/i))&&r.splice(1,1,e[1]),s=r.join(" "),Number(s.split(" ")[1])}};class Ue extends ge{constructor(t,e,s,r=!0,i=!1,n=!0){super(t,e,s),this.original_url="",this.colorSpaceConversion=n,this.premultiplyAlpha=i,this.flipY=r}on_preloaded_finished(t){$e.is_safari?this.load_with_old_method(t):this.load_with_new_method(t)}load_with_old_method(e){if(void 0===e.resources_by_url[this.url]){const s=new t,r=new Image;r.src=this.url,r.onload=()=>{s.image=r,s.flipY=this.flipY,s.premultiplyAlpha=this.premultiplyAlpha,s.colorSpace=this.colorSpaceConversion?p:m,s.needsUpdate=!0,e.set_resource(this.resource_id,this.url,s),this.__update_downloaded_bytes(1,1),this.__loading_ended()},r.onerror=()=>{console.error("The source image could not be decoded.",this.original_url)}}else e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}load_with_new_method(e){if(void 0===e.resources_by_url[this.url]){const s={credentials:"same-origin"};fetch(this.url,s).then((t=>t.blob())).then((t=>createImageBitmap(t,{colorSpaceConversion:this.colorSpaceConversion?"default":"none",imageOrientation:this.flipY?"flipY":"from-image",premultiplyAlpha:this.premultiplyAlpha?"premultiply":"none"}))).then((s=>{const r=new t(s);r.flipY=this.flipY,r.premultiplyAlpha=this.premultiplyAlpha,r.colorSpace=this.colorSpaceConversion?p:m,r.needsUpdate=!0,e.set_resource(this.resource_id,this.url,r),this.__update_downloaded_bytes(1,1),this.__loading_ended()})).catch((t=>{console.error(t,this.original_url)}))}else e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}}class Be extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=s}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(t=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Ee extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new g,this.loader.setPath(e+"/"),this.urls=[`px.${s}`,`nx.${s}`,`py.${s}`,`ny.${s}`,`pz.${s}`,`nz.${s}`]}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.urls,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error("Image could not be loaded. Maybe wrong name or path, I don't know¯\\_(ツ)_/¯"+t),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Ie extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new ie,this.loader.setPath(e+"/"),this.urls=[`px.${s}`,`nx.${s}`,`py.${s}`,`ny.${s}`,`pz.${s}`,`nz.${s}`]}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.urls,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class De extends ge{constructor(t,e,s){super(t,e,s),this.loader=new ne}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Qe extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];switch(s.kind){case"regular":t.push(new Ue(s.name,s.url,s.size,s.flipY,s.premultiplyAlpha,s.colorSpaceConversion));break;case"basis":t.push(new Be(s.name,s.url,Fe.get("basis_loader"),s.size));break;case"hdr":t.push(new De(s.name,s.url,s.size));break;case"cubemap":t.push(new Ee(s.name,s.url,s.extension,s.size));break;case"cubemap_hdr":t.push(new Ie(s.name,s.url,s.extension,s.size))}}return t}}class Ve{constructor(t){this.compilators=t,this.first_update=!0,this.index=0}update(){this.is_finished()||(this.compilators[this.index].finished?(this.index++,this.first_update=!0):this.first_update?(this.compilators[this.index].start(),this.first_update=!1):this.compilators[this.index].update())}is_finished(){return this.index===this.compilators.length}}class Ye{constructor(t,{SceneCompilator:e,TexturesCompilator:s,AudiosCompilator:r}){this.scene=t,this.SceneCompilator=e,this.TexturesCompilator=s,this.AudiosCompilator=r,this.loaders=[],this.compilators=[],this.callback_called=!1}set_assets(t,e,s,r=[],i=[],n=[]){this.scene_objects=t,this.scene_textures=e,this.scene_sounds=s,this.custom_loaders=r,this.custom_compilators=i,this.custom_data=n}get loading_progress(){let t=0;for(let e=0;e<this.loaders.length;e++){t+=this.loaders[e].get_progress()}return t/this.loaders.length}load(){this.setup_loader(),this.loaders[0].load()}on_enter(){}on_exit(){}update(){}setup_loader(){const t=[],e=Fe.get("assets_worker");e.postMessage({type:"reset",loader_name:this.scene.name});const s=new Le(this.scene.name,this.scene_objects,e);this.loaders.push(s),t.push(new this.SceneCompilator(this.scene));const r=new Qe(this.scene.name,this.scene_textures,e);this.loaders.push(r),t.push(new this.TexturesCompilator(r.get_assets_names()));const i=new Pe(this.scene.name,this.scene_sounds,e);this.loaders.push(i),t.push(new this.AudiosCompilator(i.get_assets_names()));for(let s=0;s<this.custom_loaders.length;s++){const r=new this.custom_loaders[s](this.scene.name,this.custom_data[s],e);this.loaders.push(r),t.push(new this.custom_compilators[s](r.get_assets_names()))}this.compilator_manager=new Ve(t)}is_loaded(){let t=!0;for(let e=0;e<this.loaders.length;e++){const s=this.loaders[e];t=t&&s.is_loaded()}return t}is_compiled(){return this.compilator_manager.update(),this.compilator_manager.is_finished()}}class We extends Ye{on_enter(){super.on_enter()}on_exit(){super.on_exit()}update(){super.update(),this.is_loaded()&&this.scene.on_high_quality_assets_ready()}}class Xe extends Ye{constructor(t,e){super(t,e),this.on_assets_ready_called=!1}on_enter(){super.on_enter()}on_exit(){super.on_exit()}update(){super.update(),this.is_loaded()&&(this.on_assets_ready_called||(this.scene.on_assets_ready(),this.on_assets_ready_called=!0),this.is_compiled()&&this.scene.on_assets_compiled())}}class He extends i{constructor({name:t,compilators:e}){super(),this.name=t,this.initialized=!1,this.is_loaded=!1,this.is_high_loaded=!1,this.loading_states={regular:new Xe(this,e),high:new We(this,e)},this.current_loading_state=new Ye(this,e)}get loading_progress(){return this.current_loading_state.loading_progress}init(){this.initialized=!0}load(){this.initialized||this.init(),this.set_loading_state(this.loading_states.regular),this.current_loading_state.load()}get_objects(){const t=[];return this.traverse((e=>{e instanceof n&&e.geometry&&t.push(e)})),t}dispose_cpu(){this.traverse((t=>{if(t instanceof n&&t.geometry&&(t.geometry.attributes.position.array=new Float32Array(3),t.geometry.attributes.normal&&(t.geometry.attributes.normal.array=new Float32Array(3)),t.geometry.attributes.uv&&(t.geometry.attributes.uv.array=new Float32Array(2)),t.material.map))for(let e=0;e<t.material.map.mipmaps.length;e++)t.material.map.mipmaps[e]=new Uint8Array(4)})),this.initialized=!1}dispose(){this.traverse((t=>{t instanceof n&&t.material&&(t.material.map&&t.material.map.dispose(),t.material.dispose(),t.geometry.dispose())})),this.initialized=!1,super.dispose()}set_assets(t,e,s,r,i,n){this.loading_states.regular.set_assets(t,e,s,r,i,n)}set_high_assets(t,e,s,r,i,n){this.loading_states.high.set_assets(t,e,s,r,i,n)}set_loading_state(t){this.current_loading_state.on_exit(),this.current_loading_state=t,this.current_loading_state.on_enter()}update_loading_state(){this.is_high_loaded||this.current_loading_state.update()}update(){this.update_loading_state()}on_assets_ready(){}on_assets_compiled(){this.is_loaded=!0,this.set_loading_state(this.loading_states.high),this.current_loading_state.load()}on_high_quality_assets_ready(){this.is_high_loaded=!0}on_pre_render(){}render(){Re.render(this,fe.current)}on_post_render(){}}class Ze{constructor(t,e,s){this.name=t,this.method=e,this.args=s}trigger(){ViewApi.application[this.name][this.method](...this.args.split(","))}}class Ke{constructor(){}static linear_map(t,e,s,r,i){return(t-e)/(s-e)*(i-r)+r}static between(t,e,s){return t>=e&&t<=s}static mod(t,e){return(t%e+e)%e}static rgb_to_hex(t){return t.r=Math.round(255*parseFloat(t.r)).toString(16),t.g=Math.round(255*parseFloat(t.g)).toString(16),t.b=Math.round(255*parseFloat(t.b)).toString(16),1===t.r.length&&(t.r="0"+t.r),1===t.g.length&&(t.g="0"+t.g),1===t.b.length&&(t.b="0"+t.b),"#"+t.r+t.g+t.b}static project_points_on_plane(t,e){const s=t[0].clone();s.set(0,0,0);const r=[];for(let i=0;i<t.length;i++)e.projectPoint(t[i],s),r.push(s.clone());return r}static matrix4_lerp(t,e,s,r){for(let i=0;i<16;i++)s.elements[i]=this.lerp(t.elements[i],e.elements[i],r)}static equals(t,e){return Math.abs(t-e)<1e-6}static lerp(t,e,s){return(1-s)*t+s*e}static clamp(t,e,s){return Math.max(e,Math.min(s,t))}static euclideanModulo(t,e){return(t%e+e)%e}static pingpong(t,e=1){return e-Math.abs(Ke.euclideanModulo(t,2*e)-e)}static degToRad(t){return t*(Math.PI/180)}static radToDeg(t){return t*(180/Math.PI)}static deg_to_rad(t){return t*(Math.PI/180)}static rad_to_deg(t){return t*(180/Math.PI)}static perspective_divide(t){return t.x/=t.w,t.y/=t.w,t.z/=t.w,t}static points_average(t){const e=t[0].clone();for(let s=1;s<t.length;s++)e.add(t[s]);return e.multiplyScalar(1/t.length),e}static get_random_color(){const t=[0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f"];let e="#";return e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e}static saturate(t){return Ke.clamp(t,0,1)}static generate_uuid(){const t=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"],e=4294967295*Math.random()|0,s=4294967295*Math.random()|0,r=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(t[255&e]+t[e>>8&255]+t[e>>16&255]+t[e>>24&255]+"-"+t[255&s]+t[s>>8&255]+"-"+t[s>>16&15|64]+t[s>>24&255]+"-"+t[63&r|128]+t[r>>8&255]+"-"+t[r>>16&255]+t[r>>24&255]+t[255&i]+t[i>>8&255]+t[i>>16&255]+t[i>>24&255]).toLowerCase()}}class Je{constructor(t={}){this.previous_elapsed_time=-1e-5,this.elapsed_time=-1e-5,this.playback_speed=this.__get_playback_speed(),this.playing=!0,this.action_events=[],this.context=t,this.initial_context=JSON.parse(JSON.stringify(t)),this.tmp_t=0,this.channels={};const e=Object.keys(t);for(let t=0;t<e.length;t++)this.channels[e[t]]=[];this.duration=0}play(){this.playing=!0}stop(){this.playing=!1}reset(){this.elapsed_time=-1e-5}skip(){const t=this.get_duration();this.__play_clips(this.elapsed_time,t+1e-4),this.elapsed_time=t}update(t){this.playing&&(this.previous_elapsed_time=this.elapsed_time,this.elapsed_time+=t*this.playback_speed,this.__play_clips(this.previous_elapsed_time,this.elapsed_time))}set_progress(t){this.previous_elapsed_time=this.elapsed_time,this.elapsed_time=Ke.clamp(t,0,this.duration),this.__play_clips(this.elapsed_time,this.elapsed_time)}set_normalized_progress(t){this.previous_elapsed_time=this.elapsed_time,this.elapsed_time=Ke.clamp(t,0,1)*this.duration,this.__play_clips(this.elapsed_time,this.elapsed_time)}get_progress(){return Ke.clamp(this.elapsed_time/this.get_duration(),0,1)}is_finished(){return this.elapsed_time>this.get_duration()}add_action_event(t,e){this.action_events.push({trigger_time:t,action:e}),this.duration=Math.max(this.duration,t)}add_action_interpolator(t,e,s,r=!1){if(r){const t=this.channels[s.attribute_name];void 0===t&&console.error(`${s.attribute_name} missing in initial state data.`),0===t.length?s.from=this.initial_context[s.attribute_name]:s.from=t[t.length-1].interpolator.to}const i={from:t,to:e,interpolator:s};this.duration=Math.max(this.duration,e),this.channels[s.attribute_name].push(i)}get_current_target_value(t){const e=this.__get_current_keyframe(t,this.elapsed_time);return this.elapsed_time<e.from?e.interpolator.evaluate(0):e.interpolator.evaluate(1)}get_current_starting_value(t){return this.__get_current_keyframe(t,this.elapsed_time).interpolator.evaluate(0)}get_current_progress(t){const e=this.__get_current_keyframe(t,this.elapsed_time),s=this.__linear_map_01(this.elapsed_time,e.from,e.to);return e.interpolator.easing_function(s)}get_duration(){return this.duration}__play_clips(t,e){this.elapsed_time>this.previous_elapsed_time&&this.__play_events(this.previous_elapsed_time,this.elapsed_time);const s=Object.keys(this.initial_context);for(let e=0;e<s.length;e++){const r=s[e],i=this.__get_current_keyframe(r,t);this.context[r]=this.evaluate_keyframe(i,t)}}__play_events(t,e){for(let s=0;s<this.action_events.length;s++){const r=this.action_events[s].trigger_time;Ke.between(r,t,e)&&this.action_events[s].action.trigger()}}evaluate_keyframe(t,e){return this.tmp_t=this.__linear_map_01(e,t.from,t.to),t.interpolator.evaluate(Ke.clamp(this.tmp_t,0,1))}get_keyframes(t){return this.channels[t]}is_channel_redefined(t){for(let e=0;e<this.channels[t].length;e++){if(this.channels[t][e].interpolator.initial)return!1}return!0}__linear_map_01(t,e,s){return Ke.saturate((t-e)/(s-e)*1+0)}__get_current_keyframe(t,e){let s;const r=this.channels[t];for(let t=0;t<r.length;t++){const i=r[t];if(e>=i.from&&e<=i.to)return s=i,s}let i=1/0;for(let t=0;t<r.length;t++){const n=r[t],o=Math.abs(n.to-e);o<i&&(s=n,i=o)}return s}__get_playback_speed(){const t=new URLSearchParams(window.location.search).get("transitions_velocity");return t?Number(t):1}set_initial_value_on_channel(t,e){this.get_keyframes(t)[0].interpolator.from=e}set_final_value_on_channel(t,e){const s=this.get_keyframes(t);s[s.length-1].interpolator.to=e}}class Ge{constructor(){}static linear(t){return t}static triangular(t){return 1-Math.abs(2*t%2-1)}static ease_in_sine(t){return 1-Math.cos(3.1415926*t/2)}static ease_out_sine(t){return Math.sin(3.1415926*t/2)}static ease_in_out_sine(t){return-(Math.cos(3.1415926*t)-1)/2}static ease_in_cubic(t){return t*t*t}static ease_out_cubic(t){return 1-Math.pow(1-t,3)}static ease_in_out_cubic(t){return t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2}static ease_in_quad(t){return t*t}static ease_out_quad(t){return 1-(1-t)*(1-t)}static ease_in_out_quad(t){return t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2}static ease_in_quart(t){return t*t*t*t}static ease_out_quart(t){return 1-Math.pow(1-t,4)}static ease_in_out_quart(t){return t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2}static ease_in_quint(t){return t*t*t*t*t}static ease_out_quint(t){return 1-Math.pow(1-t,5)}static ease_in_out_quint(t){return t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2}static ease_in_expo(t){return 0===t?0:Math.pow(2,10*t-10)}static ease_out_expo(t){return 1===t?1:1-Math.pow(2,-10*t)}static ease_in_out_expo(t){return 0===t?0:1===t?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2}static ease_in_circ(t){return 1-Math.sqrt(1-Math.pow(t,2))}static ease_out_circ(t){return Math.sqrt(1-Math.pow(t-1,2))}static ease_in_out_circ(t){return t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2}static ease_in_back(t){return 2.7015*t*t*t-1.7015*t*t}static ease_out_back(t){return 1+2.7015*Math.pow(t-1,3)+1.7015*Math.pow(t-1,2)}static ease_in_out_back(t){return t<.5?Math.pow(2*t,2)*(7.189819*t-2.5949095)/2:(Math.pow(2*t-2,2)*(3.5949095*(2*t-2)+2.5949095)+2)/2}static ease_in_elastic(t){const e=2*Math.PI/3;return 0===t?0:1===t?1:-Math.pow(2,10*t-10)*Math.sin((10*t-10.75)*e)}static ease_out_elastic(t){return 0===t?0:1===t?1:Math.pow(2,-10*t)*Math.sin(2.094395*(10*t-.75))+1}static ease_in_out_elastic(t){return 0===t?0:1===t?1:t<.5?-Math.pow(2,20*t-10)*Math.sin(1.3962633*(20*t-11.125))/2:Math.pow(2,-20*t+10)*Math.sin(1.3962633*(20*t-11.125))/2+1}static ease_in_bounce(t){return 1-this.ease_out_bounce(1-t)}static ease_out_bounce(t){const e=7.5625,s=2.75;return t<1/s?e*t*t:t<2/s?e*(t-=1.5/s)*t+.75:t<2.5/s?e*(t-=2.25/s)*t+.9375:e*(t-=2.625/s)*t+.984375}static ease_in_out_bounce(t){return t<.5?(1-this.ease_out_bounce(1-2*t))/2:(1+this.ease_out_bounce(2*t-1))/2}static heartbeat(t){return 1-Math.pow(Math.abs(Math.sin(t+1)),63)*Math.sign(Math.sin(t))*Math.sin(t+1.5+1)*.8}}class ts{constructor(t="linear"){this.easing_function=void 0,this.easing_function="string"==typeof t?Ge[t]:t,this.attribute_name="",this.from=0,this.to=1}update(t,e){}}class es extends ts{constructor(t,e=0,s=1,r=!1,i="linear"){super(i),this.attribute_name=t,this.from=e,this.to=s,this.initial=r}update(t,e){t[this.attribute_name]=Ke.lerp(this.from,this.to,this.easing_function(e))}evaluate(t){return Ke.lerp(this.from,this.to,this.easing_function(t))}}class ss{constructor(){}parse(t){const e=(new DOMParser).parseFromString(t,"text/xml").querySelectorAll("mxGeometry"),s=[],r=[];for(let t=0;t<e.length;t++){const i=e[t],n=i.parentElement,o=n.getAttribute("value"),a=this.get_node_x_position(i)/100,h=parseFloat(i.getAttribute("width"))/100;if(n.getAttribute("style").includes("rhombus;")){const t=o.split("."),e=t[0],s=t[1];r.push({name:e,method:s,at_time:a+.5*h})}if(n.getAttribute("style").includes("rounded=0;")&&!n.getAttribute("style").includes("text;")&&""!==o&&!o.includes(" ")){const t=o.split("="),e=t[0],r=t[1].split("--"),i=parseFloat(r[0]),n=r[1];2!==t.length&&console.error("DrawIO data is malformed:",o),2!==r.length&&console.error("DrawIO data is malformed:",o),s.push({attribute_name:e,from_time:a,to_time:a+h,to_value:i,easing_function:n})}}return s.sort(((t,e)=>t.from_time-e.from_time)),{animation_tracks:s,triggers:r}}get_node_x_position(t){const e=t.getAttribute("x");return null===e?0:parseFloat(e)}}class rs{constructor(t){this.default_state_data=t}from_animation_sheet(t,e,s){s=s||this.default_state_data;const r=t.animation_tracks,i=t.triggers,n=this.state_to_tracks(this.default_state_data,this.get_longest_time(t.animation_tracks));for(let t=0;t<n.length;t++)void 0===r.find((e=>e.attribute_name===n[t].attribute_name))&&r.push(n[t]);const o=new Je(e);for(let t=0;t<r.length;t++){const s=r[t],i=new es(s.attribute_name,e[s.attribute_name],s.to_value,s.initial,s.easing_function);o.add_action_interpolator(s.from_time,s.to_time,i,!0)}for(let t=0;t<i.length;t++){const e=i[t],s=new Ze(e.name,e.method,e.args);o.add_action_event(e.at_time,s)}return o}state_to_tracks(t,e){const s=[],r=Object.keys(t);for(let i=0;i<r.length;i++)s.push({attribute_name:r[i],from_time:0,to_time:e<1?e:1,to_value:t[r[i]],initial:!0,easing_function:"ease_in_out_cubic"});return s}from_draw_io(t,e){const s=(new ss).parse(t),r=s.animation_tracks,i=s.triggers,n=new Je(e);for(let t=0;t<r.length;t++){const s=r[t],i=new es(s.attribute_name,e[s.attribute_name],s.to_value,!1,s.easing_function);n.add_action_interpolator(s.from_time,s.to_time,i,!0)}for(let t=0;t<i.length;t++){const e=i[t],s=new Ze(e.name,e.method);n.add_action_event(e.at_time,s)}return n}get_longest_time(t){let e=-1;for(let s=0;s<t.length;s++){const r=t[s].to_time;e=r>e?r:e}return e}}class is{constructor(){this.transitions=[],this.default_state_data={}}get(t,e,s){for(let r=0;r<this.transitions.length;r++)if(this.transitions[r].from===t&&this.transitions[r].to===e){return new rs(this.default_state_data).from_animation_sheet(this.transitions[r].data,s)}for(let t=0;t<this.transitions.length;t++)if(this.transitions[t].to===e&&void 0===this.transitions[t].from){return new rs(this.default_state_data).from_animation_sheet(this.transitions[t].data,s)}console.error("TransitionTable.get no data found for: ",t,e)}add_transitions(t){for(let e=0;e<t.length;e++)this.transitions.push(t[e])}set_transitions(t){this.transitions=t}set_default_state_data(t){this.default_state_data=t}}const ns=new class{constructor(){this.__delta_buffer=[.016,.016,.016,.016,.016,.016,.016,.016,.016,.016]}init(){this.__previous_elapsed_time=-1,this.__delta_time=0,this.__smooth_delta_time=0,this.__elapsed_time=0,this.__frame_interpolation_t=0,this.fixed_delta_time=1/30}get elapsed_time(){return this.__elapsed_time}get delta_time(){return this.__delta_time}get smooth_delta_time(){return this.__smooth_delta_time}get frame_interpolation(){return this.__frame_interpolation_t}get fdt(){return this.fixed_delta_time}get dt(){return this.delta_time}get sdt(){return this.smooth_delta_time}__set_frame_interpolation(t){this.__frame_interpolation_t=t}__update(t){this.__previous_elapsed_time<0&&(this.__previous_elapsed_time=t),this.__delta_time=(t-this.__previous_elapsed_time)/1e3,this.__elapsed_time=t/1e3,this.__delta_buffer.shift(),this.__delta_buffer.push(this.delta_time<.32?this.delta_time:.032),this.__calculate_smooth_delta_time(),this.__previous_elapsed_time=t}__calculate_smooth_delta_time(){this.__smooth_delta_time=0;for(let t=0;t<this.__delta_buffer.length;t++)this.__smooth_delta_time+=this.__delta_buffer[t];this.__smooth_delta_time=this.__smooth_delta_time/this.__delta_buffer.length}};class os{constructor(t){this.name=t}start(){}before_enter(){}on_enter(){}before_exit(){}on_exit(){}before_update(){}update(){}fixed_update(){}update_enter_transition(t,e,s){}update_exit_transition(t,e,s){}}class as{constructor(t){this.last_state=new os("last_initial"),this.current_state=new os("current_initial"),this.default_state_data={},this.current_state_data={},this.transition_table=t,this.transitioning=!1}go_to_state(t,e=!1){this.transitioning&&this.__exit_last_state(),this.last_state=this.current_state,this.current_state=t,this.last_state.before_exit(),this.current_state.before_enter(),this.action_sequencer=this.transition_table.get(this.last_state.name,this.current_state.name,this.current_state_data),this.action_sequencer.play(),this.transitioning=!0,e&&(this.action_sequencer.skip(),this.update())}update(){this.transitioning?(this.__update_transitions(),this.action_sequencer.is_finished()&&(this.transitioning=!1,this.__update_transitions(),this.__exit_last_state(),this.current_state.on_enter())):this.current_state.update()}before_update(){this.current_state.before_update()}fixed_update(){this.current_state.fixed_update()}set_state(t){this.current_state=t}set_default_state_data(t){Object.assign(this.default_state_data,t),Object.assign(this.current_state_data,t)}__update_transitions(){this.action_sequencer.update(ns.delta_time),this.last_state.update_exit_transition(this.current_state_data,this.action_sequencer.get_progress(),this.action_sequencer),this.current_state.update_enter_transition(this.current_state_data,this.action_sequencer.get_progress(),this.action_sequencer)}__exit_last_state(){this.last_state.on_exit()}}const hs=new class{constructor(){this.transition_table=new is,this.transition_handler=new as(this.transition_table)}get action_sequencer(){return this.transition_handler.action_sequencer}get current_state_data(){return this.transition_handler.current_state_data}get_current_state(){return this.transition_handler.current_state}go_to_state(t,e=!1){this.transition_handler.go_to_state(t,e)}before_update(){this.transition_handler.before_update()}update(){this.transition_handler.update()}fixed_update(){this.transition_handler.fixed_update()}add_transitions(t){this.transition_table.add_transitions(t)}set_transitions(t){this.transition_table.set_transitions(t)}set_state(t){this.transition_handler.set_state(t)}set_default_state_data(t){this.transition_table.set_default_state_data(t),this.transition_handler.set_default_state_data(t)}};const _s=new class{constructor(){this.views=[],this.browser_title_suffix=""}update(){this.__set_views_opacities()}go_to_view(t,e=!0,s=!1){const r=this.get(t);e&&(this.__change_browser_url(r.url),this.__change_browser_title(r.url)),hs.go_to_state(r,s)}go_to_scene(t,e=!1,s=!1){const r=this.get(t),i=this.get("transition");i.set_next_view(r),this.go_to_view(i.name,e,s)}register_view(t){this.views.push(t)}has_view(t){for(let e=0;e<this.views.length;e++)if(this.views[e].name===t)return!0;return!1}set_view(t){const e=this.get(t);hs.set_state(e)}set_browser_title_suffix(t){this.browser_title_suffix=t}get_current_view(){return hs.get_current_state()}get_view_by_name(t){console.warn("DEPRECATED. Use ViewManager.get instead"),this.get(t)}get(t){for(let e=0;e<this.views.length;e++)if(this.views[e].name===t)return this.views[e];console.error("[ViewManager.get] no view found for: ",t)}get_by_url(t){for(let e=0;e<this.views.length;e++)if(this.views[e].url===t)return this.views[e];console.error("[ViewManager.get_by_url] no view found for: ",t)}__change_browser_url(t){window.history.pushState("","",t)}__change_browser_title(t){const e=this.__capitalize(t);document.title=e?`${e} | ${this.browser_title_suffix}`:this.browser_title_suffix}__set_views_opacities(){for(let t=0;t<this.views.length;t++)this.views[t].set_opacity(hs.current_state_data)}__capitalize(t){let e=t.toUpperCase().replace("/","");return e=this.__snake_to_whitespace(e),e}__snake_to_whitespace(t){return t.replace(/([-_][A-Z])/g,(t=>t.replace("-"," ").replace("_"," ")))}};class ls extends os{constructor({name:t,url:e,container:s,transition_data:r}){super(t),this.container=s,this.url=e,this.current_opacity=0;const i=[{to:t,data:r=r||{animation_tracks:[],triggers:[]}}];_s.register_view(this),hs.add_transitions(i)}before_enter(){this.container.classList.add("before_enter"),this.container.classList.remove("before_exit"),this.container.classList.remove("hidden")}on_enter(){this.container.classList.remove("before_enter"),this.container.classList.remove("before_exit"),this.container.classList.remove("hidden")}before_exit(){this.container.classList.add("before_exit"),this.container.classList.remove("before_enter"),this.container.classList.remove("hidden")}on_exit(){this.container.classList.add("hidden"),this.container.classList.remove("before_enter"),this.container.classList.remove("before_exit")}set_opacity(t){const e=t[`${this.name}_opacity`];(this.current_opacity>e||this.current_opacity<e)&&(this.current_opacity=e,this.container.style.opacity=String(this.current_opacity))}}class cs{constructor(t){this.uses_dynamic_font=!!t,this.__textHeight=null,this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d")}getFontHeight(t="Arial"){if(null==this.__textHeight||this.uses_dynamic_font){const e=document.getElementsByTagName("body")[0],s=document.createElement("div"),r=document.createTextNode("MÉqgOLAKTAL");s.appendChild(r),s.setAttribute("style",`font:${t};position:absolute;top:0;left:0`),e.appendChild(s),this.__textHeight=s.offsetHeight,e.removeChild(s)}return this.__textHeight}get_text_size(t,s="24px Arial"){const r=new e;return this.ctx.font=s,r.x=Math.ceil(this.ctx.measureText(t).width),r.y=Math.ceil(this.getFontHeight(s)),r}draw_canvas(t,e={}){return e.font=e.font||"24px Arial",e.font_color=e.font_color||"#000000",this.__draw(t,e,this.canvas,this.ctx),this.canvas}draw_on_texture(t,e){const s=this.draw_canvas(t,e),r=new f(s,y,b,b,w,w);return r.generateMipmaps=!1,r.needsUpdate=!0,r}__draw(t,e,s,r){}roundRect(t,e,s,r,i,n,o,a){if(void 0===a&&(a=!0),void 0===n&&(n=5),"number"==typeof n)n={tl:n,tr:n,br:n,bl:n};else{const t={tl:0,tr:0,br:0,bl:0};for(const e in t){const s=e;n[s]=n[s]||t[s]}}t.beginPath(),t.moveTo(e+n.tl,s),t.lineTo(e+r-n.tr,s),t.quadraticCurveTo(e+r,s,e+r,s+n.tr),t.lineTo(e+r,s+i-n.br),t.quadraticCurveTo(e+r,s+i,e+r-n.br,s+i),t.lineTo(e+n.bl,s+i),t.quadraticCurveTo(e,s+i,e,s+i-n.bl),t.lineTo(e,s+n.tl),t.quadraticCurveTo(e,s,e+n.tl,s),t.closePath(),o&&t.fill(),a&&t.stroke()}}class us extends cs{constructor(){super(),this.text_margin=new e(2,0)}__draw(t,e,s,r){r.font=e.font;const i=this.get_text_size(t,e.font);s.width=Math.ceil(i.x+2*this.text_margin.x),s.height=Math.ceil(i.y+2*this.text_margin.y),r.clearRect(0,0,s.width,s.height),r.globalAlpha=0,r.fillStyle=e.font_color||"#000000",r.fillRect(0,0,s.width,s.height),r.globalAlpha=1,r.globalAlpha=1,r.font=e.font,r.fillStyle=e.font_color||"#000000",r.textBaseline="middle",r.textAlign=e.textAlign||"center","center"===r.textAlign?r.fillText(t,s.width/2,s.height/2):r.fillText(t,0,s.height/2)}}const ds=new class{init(){this.max_anisotropy=0,this.vertex_texture_sampler_available=!1}};class ps{get(t,e){return this.describe(this.require_camera(t),e)}set(t,e,s){const r=this.require_camera(t),i=[];null!==e&&this.apply_orbit(e,s,i),this.apply_position(r,e,s,i),this.apply_fov(r,s,i);const n=this.describe(r,e);return n.changed=i,n}frame(t,e,s,r,i){const n=this.require_camera(t);if(null===e)throw this.error("no_controller","The active scene has no camera_controller, so framing is unavailable.");const o="string"==typeof r.uuid?r.uuid:null,a="string"==typeof r.name?r.name:null;if(null===o&&null===a)throw this.error("not_found","Pass a uuid or a name to identify the object to frame.");const h=this.find(s,o,a);if(null===h){const t=null===o?`name '${null===a?"":a}'`:`uuid '${o}'`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}const _="number"==typeof r.scale&&Number.isFinite(r.scale)?r.scale:1;e.focus_on_bounding_box(i(h),_);const l=this.describe(n,e);return l.changed=["framed"],l}apply_orbit(t,e,s){const r=this.number(e.tilt),i=this.number(e.orientation),n=this.number(e.azimuth);null===r&&null===i&&null===n||(null!==r&&s.push("tilt"),null!==i&&s.push("orientation"),null!==n&&s.push("azimuth"),t.set_rotation(null===r?void 0:r,null===i?void 0:i,null===n?void 0:n));const o=this.number(e.zoom);null!==o&&(t.set_normalized_zoom(o),s.push("zoom"));const a=this.triple(e.target);null!==a&&(t.reference_position.x=a[0],t.reference_position.y=a[1],t.reference_position.z=a[2],s.push("target"))}apply_position(t,e,s,r){const i=this.triple(s.position);if(null!==i){if(null!==e)throw this.error("controller_owns_camera","A CameraController is driving this camera and would overwrite a raw position on the next frame. Use tilt, orientation, azimuth, zoom and target instead.");t.position.x=i[0],t.position.y=i[1],t.position.z=i[2],r.push("position")}}apply_fov(t,e,s){const r=this.number(e.fov);null!==r&&(t.fov=r,s.push("fov"),"function"==typeof t.updateProjectionMatrix&&t.updateProjectionMatrix())}describe(t,e){return{position:[this.round(t.position.x),this.round(t.position.y),this.round(t.position.z)],fov:"number"==typeof t.fov?t.fov:null,near:"number"==typeof t.near?t.near:null,far:"number"==typeof t.far?t.far:null,clear_color:this.hex(t.clear_color),clear_alpha:"number"==typeof t.clear_alpha?t.clear_alpha:null,controller:null===e?null:{tilt:e.get_current_tilt(),orientation:e.get_current_orientation(),azimuth:e.get_current_azimuth(),zoom:e.normalized_zoom,min_zoom:e.min_zoom,max_zoom:e.max_zoom,target:[this.round(e.reference_position.x),this.round(e.reference_position.y),this.round(e.reference_position.z)]}}}find(t,e,s){if(null!==e?t.uuid===e:t.name===s)return t;const r=Array.isArray(t.children)?t.children:[];for(const t of r){const r=this.find(t,e,s);if(null!==r)return r}return null}require_camera(t){if("object"!=typeof t||null===t||"object"!=typeof t.position)throw this.error("no_camera","No camera is active. CameraManager.current is not set yet.");return t}hex(t){return"object"!=typeof t||null===t||"function"!=typeof t.getHexString?null:`#${t.getHexString()}`}number(t){return"number"==typeof t&&Number.isFinite(t)?t:null}triple(t){if(!Array.isArray(t))return null;const e=t,s=[];for(let t=0;t<3;t++){const r=this.number(e[t]);if(null===r)return null;s.push(r)}return s}round(t){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:0}error(t,e){const s=new Error(e);return s.code=t,s}}class ms{constructor(t,e,s=()=>document.createElement("canvas")){this.graphics=t,this.has_camera=e,this.create_canvas=s}async capture(t){return"hires"===t.mode?this.capture_hires(t):this.capture_fast(t)}async capture_fast(t){const e=this.graphics.canvas,s=this.scaled_size(e.width,e.height,t.max_size);if(null!==s){const t=this.draw_scaled(e,s.width,s.height);if(null!==t){const r=await this.request_blob((e=>t.toBlob(e,"image/png"))),i=await this.build_result("fast",s.width,s.height,r);return i.scaled_from={width:e.width,height:e.height},i}}const r=await this.request_blob((t=>e.toBlob(t,"image/png")));return this.build_result("fast",e.width,e.height,r)}scaled_size(t,e,s){const r="number"==typeof s?s:1280;if(!Number.isFinite(r)||r<=0)return null;const i=Math.max(t,e);if(i<=r)return null;const n=r/i;return{width:Math.max(1,Math.round(t*n)),height:Math.max(1,Math.round(e*n))}}draw_scaled(t,e,s){const r=this.create_canvas();r.width=e,r.height=s;const i=r.getContext("2d");return null===i?null:(i.drawImage(t,0,0,e,s),r)}async capture_hires(t){if(!this.has_camera())throw this.error("no_camera","A hires capture needs an active camera; CameraManager.current is not set yet.");const e=this.graphics.canvas,s=this.dimension(t.width,e.width),r=this.dimension(t.height,e.height),i=await this.request_blob((t=>this.graphics.take_screenshot(t,s,r)));return this.build_result("hires",s,r,i)}dimension(t,e){return"number"==typeof t?this.clamp(t):this.clamp(e)}clamp(t){return!Number.isFinite(t)||t<1?1:Math.min(Math.floor(t),8192)}request_blob(t){return new Promise(((e,s)=>{t((t=>{null!==t?e(t):s(this.error("capture_failed","The canvas produced no image data."))}))}))}async build_result(t,e,s,r){const i=await r.arrayBuffer(),n=new Uint8Array(i);return{mode:t,mime_type:"image/png",width:e,height:s,bytes:n.length,data:this.to_base64(n)}}to_base64(t){let e="";for(let s=0;s<t.length;s+=8192)e+=String.fromCharCode(...t.subarray(s,s+8192));return btoa(e)}error(t,e){const s=new Error(e);return s.code=t,s}}const gs=2e3,fs=["log","info","warn","error"];class ys{constructor(t=200,e=()=>Date.now()){this.capacity=t>0?Math.floor(t):200,this.entries=[],this.seq=0,this.dropped=0,this.clock=e,this.target=null,this.source=null,this.originals={},this.on_error=null,this.on_rejection=null}install(t,e){this.dispose(),this.target=t;for(const e of fs){const s=t[e];this.originals[e]=s,t[e]=(...r)=>{this.push(e,this.format(r)),s.apply(t,r)}}void 0!==e&&(this.source=e,this.on_error=t=>this.push("error",this.event_message(t)),this.on_rejection=t=>this.push("error",`Unhandled rejection: ${this.event_reason(t)}`),e.addEventListener("error",this.on_error),e.addEventListener("unhandledrejection",this.on_rejection))}dispose(){const t=this.target;if(null!==t)for(const e of fs){const s=this.originals[e];void 0!==s&&(t[e]=s)}const e=this.source;null!==e&&(null!==this.on_error&&e.removeEventListener("error",this.on_error),null!==this.on_rejection&&e.removeEventListener("unhandledrejection",this.on_rejection)),this.originals={},this.target=null,this.source=null,this.on_error=null,this.on_rejection=null}read(t){const e="string"==typeof t.level?t.level:null,s="number"==typeof t.since?t.since:0,r="number"==typeof t.limit&&t.limit>0?Math.floor(t.limit):0;let i=this.entries.filter((t=>t.seq>s));return null!==e&&(i=i.filter((t=>t.level===e))),r>0&&i.length>r&&(i=i.slice(i.length-r)),{entries:i,dropped:this.dropped,total:this.seq,capacity:this.capacity}}push(t,e){for(this.seq++,this.entries.push({seq:this.seq,level:t,message:e,at:this.clock()});this.entries.length>this.capacity;)this.entries.shift(),this.dropped++}format(t){const e=t.map((t=>this.describe(t))).join(" ");if(e.length<=gs)return e;const s=e.length-gs;return`${e.slice(0,gs)} ... [truncated ${s} chars]`}describe(t){if("string"==typeof t)return t;if(null===t)return"null";if(void 0===t)return"undefined";if("number"==typeof t||"boolean"==typeof t)return String(t);if("function"==typeof t)return"[function]";if("symbol"==typeof t)return"[symbol]";if("bigint"==typeof t)return`${t.toString()}n`;if(t instanceof Error)return`${t.name}: ${t.message}`;try{const e=JSON.stringify(t);return void 0===e?"[unserialisable]":e}catch{return"[unserialisable]"}}event_message(t){if("object"==typeof t&&null!==t){const e=t;if("string"==typeof e.message)return e.message;if(void 0!==e.error)return this.describe(e.error)}return this.describe(t)}event_reason(t){if("object"==typeof t&&null!==t){const e=t;if(void 0!==e.reason)return this.describe(e.reason)}return this.describe(t)}}class bs extends ee{constructor(t){super();const s=ut(.5),r=ut(new e(1,1)),i=At("plane_bounds","vec4"),n=St(At("transformsCol0","vec4"),At("transformsCol1","vec4"),At("transformsCol2","vec4"),At("transformsCol3","vec4")),o=dt(pt.xy.mul(i.zw).add(i.xy),pt.z,1);this.vertexNode=Rt.mul(Ct).mul(n).mul(o);const a=jt(At("glyph_bounds","vec4")),h=jt(At("color","vec4")),_=a.x.div(r.x),l=a.y.div(r.x),c=a.z.div(r.y),u=a.w.div(r.y),d=Mt(l.sub(_)),p=Mt(c.sub(u)),m=ct(t,bt(mt().x.mul(d).add(_),mt().y.mul(p).add(c).sub(p)));this.uniforms={_Texture:m,_Boldness:s,_AtlasSize:r};const g=Ft(qt(m.r,m.g),qt(Ft(m.r,m.g),m.b)),f=s.sub(g),y=f.div(Ft(Pt(bt(Nt(f),Ot(f))),1e-6)),b=Lt(vt(.5).sub(y),0,1);this.fragmentNode=dt(h.rgb,b.mul(h.a)),this.transparent=!0,this.depthWrite=!1,this.side=x,this.fog=!1,t.minFilter=v,t.magFilter=v,t.generateMipmaps=!1}set_atlas_size(t){this.uniforms._AtlasSize.value.copy(t)}set_boldness(t){this.uniforms._Boldness.value=Ke.lerp(.5,.2,t)}}class ws{constructor(){}static merge_from_to(t,e){e.push.apply(e,t)}static expand_vec3_array(t,e){const s=e-t.length;for(let e=0;e<s;e++)t.push(t[e].clone())}static remove_elem(t,e){const s=t.indexOf(e);s>-1&&t.splice(s,1)}static get_closest_point(t,e){let s=t[0],r=s.distanceTo(e);for(let i=1;i<t.length;i++)t[i].distanceTo(e)<r&&(s=t[i],r=t[i].distanceTo(e));return s}static object_values_to_array(t){const e=Object.keys(t),s=[];for(let r=0;r<e.length;r++)s.push(t[e[r]]);return s}}class xs{constructor(t,s,r){const i=s.right-s.left,n=s.top-s.bottom;this.scale=new e(i,n),this.position=new e(t+s.left,s.bottom),this.atlas_bounds=new h(r.left,r.right,r.top,r.bottom)}}class vs{constructor(t,s=""){this.glyph_layout=t,this.glyphs=[],this.glyph_is_dirty=!0,this.matrix_is_dirty=!0,this.color_is_dirty=!0,this.position=new l,this.quaternion=new z,this.scale=new l(1,1,1),this.matrix=new M,this.color=new r("#FFFFFF"),this.pivot_point=new e,this.__opacity=1,this.__text=s,this.__generate_glyphs(s)}set text(t){this.__text=t,this.__generate_glyphs(t),this.matrix_is_dirty=!0}get text(){return this.__text}update_matrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrix_is_dirty=!1,this.glyph_is_dirty=!0}clear_glyph_dirty(){this.glyph_is_dirty=!1}clear_color_dirty(){this.color_is_dirty=!1}set_rotation(t=0,e=0){const s=(new z).setFromAxisAngle(new l(0,1,0),t/360*Math.PI*2),r=(new z).setFromAxisAngle(new l(1,0,0),-e/360*Math.PI*2);this.quaternion.copy(s.multiply(r)),this.matrix_is_dirty=!0}set_position(t){this.position.copy(t),this.matrix_is_dirty=!0}set_size(t){this.scale.set(t,t,t),this.matrix_is_dirty=!0}set_color(t){this.color.set(t),this.color_is_dirty=!0}set_pivot(t){this.pivot_point.copy(t),this.update_glyphs()}set opacity(t){this.__opacity=t,this.color_is_dirty=!0}get opacity(){return this.__opacity}update_glyphs(){this.__generate_glyphs(this.text)}__generate_glyphs(t){let s=0;this.glyphs.length=0;for(let e=0;e<t.length;e++){const r=t.charCodeAt(e),i=this.glyph_layout.find((t=>t.unicode===r));if(i){if(i.planeBounds){const t=new xs(s,i.planeBounds,i.atlasBounds);this.glyphs.push(t)}s+=i.advance}}const r=new T,i=this.glyphs[0];r.setFromCenterAndSize(i.position.clone().add(new e(i.scale.x/2,i.scale.y/2)),i.scale);for(let t=1;t<this.glyphs.length;t++){const s=this.glyphs[t],i=(new T).setFromCenterAndSize(s.position.clone().add(new e(s.scale.x/2,s.scale.y/2)),s.scale);r.union(i)}const n=new e;r.getSize(n);for(let t=0;t<this.glyphs.length;t++)this.glyphs[t].position.x-=n.x/2,this.glyphs[t].position.y-=n.y/2,this.glyphs[t].position.x+=n.x/2*this.pivot_point.x,this.glyphs[t].position.y+=n.y/2*this.pivot_point.y;this.glyph_is_dirty=!0}}const zs=["transformsCol0","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","plane_bounds","color"];class Ms extends n{constructor(t,s){const r=new k;r.instanceCount=0;const i=new o(1,1);i.translate(.5,.5,0),r.setAttribute("position",new A(i.getAttribute("position").array,3)),r.setAttribute("uv",new A(i.getAttribute("uv").array,2)),r.index=i.index;const n=new S(new Float32Array(2e3*zs.length*4),4*zs.length);n.setUsage(R),zs.forEach(((t,e)=>{r.setAttribute(t,new C(n,4,4*e))})),super(r,new bs(s)),this.text_elements=[],this.font_layout=t,this.material.set_atlas_size(new e(t.atlas.width,t.atlas.height)),this.frustumCulled=!1}set_boldness(t){this.material.set_boldness(t)}add_text(t){const e=new vs(this.font_layout.glyphs,t);return this.text_elements.push(e),e}remove_text(t){ws.remove_elem(this.text_elements,t),this.update(!0)}update(t){const e=this.geometry.getAttribute("glyph_bounds"),s=this.geometry.getAttribute("plane_bounds"),r=this.geometry.getAttribute("transformsCol0"),i=this.geometry.getAttribute("transformsCol1"),n=this.geometry.getAttribute("transformsCol2"),o=this.geometry.getAttribute("transformsCol3"),a=this.geometry.getAttribute("color");let h=!0===t,_=!0===t,l=!0===t,c=0;for(let t=0;t<this.text_elements.length;t++){const u=this.text_elements[t];u.matrix_is_dirty&&(h=!0,u.update_matrix()),u.glyph_is_dirty&&(_=!0,u.clear_glyph_dirty()),u.color_is_dirty&&(l=!0,u.clear_color_dirty());const d=u.matrix,p=u.color,m=u.opacity;for(let t=0;t<u.glyphs.length;t++){const h=u.glyphs[t],_=c;e.setXYZW(_,h.atlas_bounds.x,h.atlas_bounds.y,h.atlas_bounds.z,h.atlas_bounds.w),s.setXYZW(_,h.position.x,h.position.y,h.scale.x,h.scale.y),r.setXYZW(_,d.elements[0],d.elements[1],d.elements[2],d.elements[3]),i.setXYZW(_,d.elements[4],d.elements[5],d.elements[6],d.elements[7]),n.setXYZW(_,d.elements[8],d.elements[9],d.elements[10],d.elements[11]),o.setXYZW(_,d.elements[12],d.elements[13],d.elements[14],d.elements[15]),a.setXYZW(_,p.r,p.g,p.b,m),c++}}this.geometry.instanceCount=c,c>this.max_allocations&&console.error("SDFTextBatch exceeded maximum glyph allocations(max/current): ",this.max_allocations,c,this),h&&(r.needsUpdate=!0,i.needsUpdate=!0,n.needsUpdate=!0,o.needsUpdate=!0),_&&(e.needsUpdate=!0,s.needsUpdate=!0),l&&(a.needsUpdate=!0)}dispose(){this.geometry.dispose(),this.material.dispose(),super.dispose()}}class Ts extends ee{constructor(t){super();const e=ct(t),s=ut(0),r=ut(new l(1,1,1)),i=ut(1);this.uniforms={_MainTex:e,_ScreenAligned:s,_Scale:r,_Opacity:i};const n=$t.mul(dt(pt,1)).xyz,o=$t.element(3).xyz.add(pt.mul(r));this.vertexNode=Rt.mul(dt(gt(n,o,s),1)),this.fragmentNode=dt(e.rgb,e.a.mul(i)),this.transparent=!0,this.depthWrite=!1,this.side=x,this.fog=!1}}class ks extends n{constructor(t,s){s=s||new e(0,0);const r=new Ts(t),i=new o(1,1,1);i.translate(-s.x/2,-s.y/2,0);const n=t.image.width/t.image.height;i.scale(n,1,1),super(i,r),this.current_scale=n,this.sized_texture=t,this.texture_size=new e(t.image.width,t.image.height),this.geometry.computeBoundingBox(),this.tmp_bb_size=new l,this.geometry.boundingBox.getSize(this.tmp_bb_size),this.material=r}update_texture(){const t=this.material.uniforms._MainTex.value,e=t.image,s=e.width!==this.texture_size.x||e.height!==this.texture_size.y;t===this.sized_texture&&s&&t.dispose(),this.sized_texture=t,this.texture_size.set(e.width,e.height),t.needsUpdate=!0,this.geometry.scale(1/this.current_scale,1,1),this.current_scale=e.width/e.height,this.geometry.scale(this.current_scale,1,1),this.geometry.computeBoundingBox(),this.geometry.boundingBox.getSize(this.tmp_bb_size)}get size(){return this.tmp_bb_size.clone().multiplyScalar(this.scale.x)}set size(t){this.scale.copy(t),this.material.uniforms._Scale.value.copy(t)}set screen_aligned(t){this.material.uniforms._ScreenAligned.value=!0===t?1:0}get screen_aligned(){return 1===this.material.uniforms._ScreenAligned.value}set opacity(t){this.material.uniforms._Opacity.value=t}get opacity(){return this.material.uniforms._Opacity.value}dispose(){this.geometry.dispose(),this.parent.remove(this),this.material.uniforms._MainTex.value.dispose(),this.material.dispose(),super.dispose()}}const As=["cube","sphere","plane","math_sphere","bounding_box","label","sdf_text"];async function Ss(t,e){const s=await fetch(t);if(!s.ok)throw new Error(`HTTP ${s.status}`);const r=(new q).loadAsync(e).catch((()=>{throw new Error(`no atlas image at ${e}`)})),[i,n]=await Promise.all([s.json(),r]);return{layout:i,atlas:n}}class Rs{constructor(t={}){this.helpers=new Map,this.sdf_fonts=new Map,this.sdf_font=t.sdf_font,this.load_sdf_font=t.load_sdf_font??Ss}draw(t,e,s){const r="string"==typeof s.shape&&As.includes(s.shape)?s.shape:null;if(null===r)throw this.error("bad_request",`Unknown shape. Valid shapes: ${As.join(", ")}.`);const i=this.position(s.position),n=this.size(s.size),o=this.color(s.color);return"sdf_text"===r?this.draw_sdf_text(t,this.text(s.text),this.font_url(s.font),i,n,o):this.track(r,this.build(t,e,r,s,i,n,o))}track(t,e){return this.helpers.set(e.uuid,e),{id:e.uuid,shape:t,helpers:this.helpers.size}}async draw_sdf_text(t,e,s,i,n,o){const a=await this.font(s),h=this.sdf_layout(a.layout,s);if(!Array.from({length:e.length},((t,s)=>e.charCodeAt(s))).some((t=>h.glyphs.some((e=>e.unicode===t&&void 0!==e.planeBounds)))))throw this.error("bad_request",`The font at ${s} has none of the characters of the text.`);const _=new Ms(h,a.atlas),l=_.add_text(e);return l.set_position(i),l.set_size(n),l.set_color(new r(o??16777215)),_.update(!0),t.scene.add(_),this.track("sdf_text",_)}font(t){let e=this.sdf_fonts.get(t);return void 0===e&&(e=this.load_sdf_font(t,t.replace(/\.json(?=$|[?#])/,".png")).catch((e=>{this.sdf_fonts.delete(t);const s=e instanceof Error?e.message:"string"==typeof e?e:"unknown error";throw this.error("not_found",`Could not load the SDF font at ${t}: ${s}`)})),this.sdf_fonts.set(t,e)),e}font_url(t){if(void 0===t&&void 0===this.sdf_font)throw this.error("bad_request","sdf_text needs a font: no default SDF font is configured.");const e=t??this.sdf_font;if("string"!=typeof e||!/\.json(?=$|[?#])/.test(e))throw this.error("bad_request","font must be the URL of an msdf-atlas-gen .json layout, with its .png atlas next to it.");return e}sdf_layout(t,e){const s=t;if("number"!=typeof s?.atlas?.width||"number"!=typeof s.atlas.height||!Array.isArray(s.glyphs))throw this.error("bad_request",`The font at ${e} is not an msdf-atlas-gen layout.`);if("top"===s.atlas.yOrigin)throw this.error("bad_request",`The font at ${e} has yOrigin top. Generate it with -yorigin bottom.`);return s}build(t,e,s,r,i,n,o){switch(s){case"cube":return t.draw_cube(i,n,o);case"sphere":return t.draw_sphere(i,n,o);case"plane":{const e=t.draw_plane(n,n,o);return e.position.copy(i),e}case"math_sphere":return t.draw_math_sphere(new j(i,n),o);case"label":return t.draw_label(this.text(r.text),i,n,o);default:return t.draw_bounding_box(this.bounds(e,r.object),o)}}clear(t){if(void 0===t.id){const t=this.helpers.size;return this.helpers.forEach((t=>this.dispose(t))),this.helpers.clear(),{removed:t,helpers:0}}const e="string"==typeof t.id?this.helpers.get(t.id):void 0;if(void 0===e)throw this.error("not_found","No helper with that id was drawn through debug_draw.");return this.dispose(e),this.helpers.delete(e.uuid),{removed:1,helpers:this.helpers.size}}dispose(t){t.removeFromParent(),t.traverse((t=>{const e=t;e.geometry?.dispose();(Array.isArray(e.material)?e.material:e.material?[e.material]:[]).forEach((t=>t.dispose())),t instanceof ks&&t.material.uniforms._MainTex.value.dispose()}))}bounds(t,e){const{name:s,uuid:r}="object"==typeof e&&null!==e?e:{};if("string"!=typeof r&&"string"!=typeof s)throw this.error("bad_request","bounding_box needs an object with a name or a uuid.");const i="string"==typeof r?t.getObjectByProperty("uuid",r):t.getObjectByName(s);if(void 0===i){const t="string"==typeof r?`uuid ${r}`:`name ${s}`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}const n=(new F).setFromObject(i);if(n.isEmpty())throw this.error("bad_request",`Object "${i.name||i.uuid}" has no geometry, so its bounds are empty.`);return n}text(t){if("string"!=typeof t||0===t.length||t.length>200)throw this.error("bad_request","label and sdf_text need a text of 1 to 200 characters.");return t}position(t){if(void 0===t)return new l;if(!Array.isArray(t)||3!==t.length||!t.every((t=>"number"==typeof t&&Number.isFinite(t))))throw this.error("bad_request","position must be [x, y, z] with finite numbers.");return new l(t[0],t[1],t[2])}size(t){if(void 0===t)return 1;if("number"!=typeof t||!Number.isFinite(t)||t<=0)throw this.error("bad_request","size must be a positive finite number.");return t}color(t){if(void 0===t||"number"==typeof t||"string"==typeof t)return t;throw this.error("bad_request","color must be a number or a string.")}error(t,e){const s=new Error(e);return s.code=t,s}}const Cs={left:0,middle:1,right:2};class js{constructor(t,e,s){this.dispatch=t,this.sleep=e,this.to_client=s}async pointer(t){const e=this.text(t.action,"click"),s=this.space(t.space),r=this.point(t.x,t.y,s),i=this.button(t.button),n=Math.min(1e4,this.positive(t.hold_ms,60)),o=[];if("move"!==e&&"down"!==e&&"click"!==e||(this.send("mousemove",{clientX:r.x,clientY:r.y}),o.push("mousemove")),"down"!==e&&"click"!==e||(this.send("mousedown",{clientX:r.x,clientY:r.y,button:i}),o.push("mousedown")),"click"===e&&await this.sleep(n),"up"!==e&&"click"!==e||(this.send("mouseup",{clientX:r.x,clientY:r.y,button:i}),o.push("mouseup")),0===o.length)throw this.error("bad_request",`Unknown pointer action '${e}'. Use click, down, up or move.`);return{dispatched:o,at:[r.x,r.y]}}async drag(t){const e=this.space(t.space),s=this.pair(t.from,e,"from"),r=this.pair(t.to,e,"to"),i=Math.min(120,Math.max(1,Math.floor(this.positive(t.steps,8)))),n=Math.min(1e4,this.positive(t.duration_ms,240)),o=this.button(t.button),a=[];this.send("mousemove",{clientX:s.x,clientY:s.y}),a.push("mousemove"),this.send("mousedown",{clientX:s.x,clientY:s.y,button:o}),a.push("mousedown");for(let t=1;t<=i;t++){const e=t/i;await this.sleep(n/i),this.send("mousemove",{clientX:s.x+(r.x-s.x)*e,clientY:s.y+(r.y-s.y)*e}),a.push("mousemove")}return this.send("mouseup",{clientX:r.x,clientY:r.y,button:o}),a.push("mouseup"),{dispatched:a,from:[s.x,s.y],to:[r.x,r.y]}}scroll(t){const e=this.number(t.delta);if(null===e)throw this.error("bad_request","scroll requires a numeric delta.");const s=this.space(t.space),r=this.point(void 0===t.x?0:t.x,void 0===t.y?0:t.y,s);return this.send("wheel",{clientX:r.x,clientY:r.y,deltaY:e}),Promise.resolve({dispatched:["wheel"],at:[r.x,r.y],delta:e})}async key(t){const e="string"==typeof t.code&&t.code.length>0?t.code:null;if(null===e)throw this.error("bad_request","key requires a code, for example 'Space' or 'KeyW'.");const s=this.text(t.action,"press"),r=Math.min(1e4,this.positive(t.hold_ms,60)),i=[];if("down"!==s&&"press"!==s||(this.send("keydown",{code:e,key:e}),i.push("keydown")),"press"===s&&await this.sleep(r),"up"!==s&&"press"!==s||(this.send("keyup",{code:e,key:e}),i.push("keyup")),0===i.length)throw this.error("bad_request",`Unknown key action '${s}'. Use press, down or up.`);return{dispatched:i,code:e}}send(t,e){this.dispatch(t,{...e,bubbles:!0,cancelable:!0})}point(t,e,s){const r=this.number(t),i=this.number(e);if(null===r||null===i)throw this.error("bad_request","x and y must be numbers.");return this.to_client(r,i,s)}pair(t,e,s){if(!Array.isArray(t)||t.length<2)throw this.error("bad_request",`${s} must be [x, y].`);const r=t;return this.point(r[0],r[1],e)}space(t){return"ndc"===t?"ndc":"pixels"}button(t){if("string"!=typeof t)return 0;const e=Cs[t.toLowerCase()];return void 0===e?0:e}text(t,e){return"string"==typeof t&&t.length>0?t.toLowerCase():e}number(t){return"number"==typeof t&&Number.isFinite(t)?t:null}positive(t,e){const s=this.number(t);return null===s||s<=0?e:s}error(t,e){const s=new Error(e);return s.code=t,s}}class Fs{read(t,e,s){const r={fps:this.rate(t.delta_time),smooth_fps:this.rate(t.smooth_delta_time),frame_ms:this.round(1e3*this.seconds(t.delta_time),100),elapsed_s:this.round(this.seconds(t.elapsed_time),10),canvas:{width:e.width,height:e.height,render_width:e.render_width,render_height:e.render_height,dpr:e.dpr}},i=this.section(s,"render"),n=this.section(s,"memory");return this.assign(r,"draw_calls",i,"drawCalls"),this.assign(r,"triangles",i,"triangles"),this.assign(r,"geometries",n,"geometries"),this.assign(r,"textures",n,"textures"),r}section(t,e){if("object"!=typeof t||null===t)return null;const s=t[e];return"object"!=typeof s||null===s?null:s}assign(t,e,s,r){if(null===s)return;const i=s[r];"number"==typeof i&&Number.isFinite(i)&&(t[e]=i)}rate(t){const e=this.seconds(t);return e<=0?0:this.round(1/e,10)}seconds(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:0}round(t,e){return Math.round(t*e)/e}}class qs{constructor(t){this.descriptors=t}list(){return this.descriptors.map((t=>({name:t.name,description:void 0===t.description?"":t.description,options:void 0===t.options?[]:t.options})))}create(t,e){const s="string"==typeof t?t.toLowerCase():null,r=null===s?void 0:this.descriptors.find((t=>t.name.toLowerCase()===s));if(void 0===r){const t=this.descriptors.map((t=>t.name)).join(", ");throw this.error("unknown_render_mode",`Unknown render mode. Available modes: ${t}.`)}return r.factory(e)}error(t,e){const s=new Error(e);return s.code=t,s}}class Ps{get(t,e){const s=this.require(t,e);return this.describe(s.node,s.parent)}set(t,e,s){const r=this.require(t,e),i=[];this.apply_vector(r.node.position,s.position)&&i.push("position"),this.apply_vector(r.node.rotation,s.rotation)&&i.push("rotation"),this.apply_vector(r.node.scale,s.scale)&&i.push("scale"),"boolean"==typeof s.visible&&(r.node.visible=s.visible,i.push("visible"));const n=this.describe(r.node,r.parent);return n.changed=i,n}require(t,e){if("object"!=typeof t||null===t)throw this.error("not_found","No scene is set. SceneManager.current is empty.");const s="string"==typeof e.uuid?e.uuid:null,r="string"==typeof e.name?e.name:null;if(null===s&&null===r)throw this.error("not_found","Pass a uuid or a name to identify the object.");const i=this.find(t,null,s,r);if(null===i){const t=null===s?`name '${null===r?"":r}'`:`uuid '${s}'`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}return i}find(t,e,s,r){if(null!==s?t.uuid===s:t.name===r)return{node:t,parent:e};const i=Array.isArray(t.children)?t.children:[];for(const e of i){const i=this.find(e,t,s,r);if(null!==i)return i}return null}apply_vector(t,e){if("object"!=typeof t||null===t||!Array.isArray(e))return!1;const s=["x","y","z"],r=e;let i=!1;for(let e=0;e<s.length;e++){const n=r[e];"number"==typeof n&&Number.isFinite(n)&&(t[s[e]]=n,i=!0)}return i}describe(t,e){const s={uuid:"string"==typeof t.uuid?t.uuid:"(no uuid)",name:"string"==typeof t.name?t.name:"",type:"string"==typeof t.type?t.type:"Object3D",parent:this.parent_label(e),children:Array.isArray(t.children)?t.children.length:0,visible:!1!==t.visible,position:this.vector(t.position,0),rotation:this.vector(t.rotation,0),scale:this.vector(t.scale,1)},r=this.material_type(t.material);null!==r&&(s.material=r);const i=this.vertices(t.geometry);return null!==i&&(s.vertices=i),s}parent_label(t){return null===t?null:"string"==typeof t.name&&t.name.length>0?t.name:"string"==typeof t.uuid?t.uuid:null}material_type(t){if(Array.isArray(t))return`${t.length} materials`;if("object"==typeof t&&null!==t){const e=t.type;return"string"==typeof e?e:"Material"}return null}vertices(t){if("object"!=typeof t||null===t)return null;const e=t.attributes;if("object"!=typeof e||null===e)return null;const s=e.position;if("object"!=typeof s||null===s)return null;const r=s.count;return"number"==typeof r?r:null}vector(t,e){return"object"!=typeof t||null===t?[e,e,e]:[this.round(t.x,e),this.round(t.y,e),this.round(t.z,e)]}round(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:e}error(t,e){const s=new Error(e);return s.code=t,s}}class Ns{inspect(t,e){if("object"!=typeof t||null===t)return{root:null,counts:{total:0,meshes:0,returned:0},truncated:!1,notes:["No scene is set. SceneManager.current is empty."]};const s=this.positive(e.depth,4),r=this.positive(e.max_nodes,200),i="string"==typeof e.filter&&e.filter.length>0?e.filter.toLowerCase():null,n=[],o=this.count(t);let a=null;null!==i&&(a=new Set,this.mark(t,i,a),0===a.size&&(n.push(`no nodes matched the filter '${i}'`),a=new Set([t])));const h={used:0,depth_cut:!1,node_cut:!1},_=this.serialise(t,0,s,r,a,h);return h.node_cut&&n.push(`stopped at max_nodes=${r}; ${o.total-h.used} of ${o.total} nodes not returned`),h.depth_cut&&n.push(`stopped at depth=${s}; deeper nodes not returned`),{root:_,counts:{total:o.total,meshes:o.meshes,returned:h.used},truncated:h.node_cut||h.depth_cut,notes:n}}serialise(t,e,s,r,i,n){if(null!==i&&!i.has(t))return null;if(n.used>=r)return n.node_cut=!0,null;n.used++;const o={uuid:"string"==typeof t.uuid?t.uuid:"(no uuid)",name:"string"==typeof t.name?t.name:"",type:"string"==typeof t.type?t.type:"Object3D",position:this.vector(t.position,0)},a=this.vector(t.rotation,0),h=this.vector(t.scale,1);this.is_uniform(a,0)||(o.rotation=a),this.is_uniform(h,1)||(o.scale=h),!1===t.visible&&(o.visible=!1);const _=this.describe_material(t.material);null!==_&&(o.material=_);const l=this.count_vertices(t.geometry);null!==l&&(o.vertices=l);const c=Array.isArray(t.children)?t.children:[];if(0===c.length)return o;if(e+1>s)return n.depth_cut=!0,o.truncated=`${c.length} children hidden (depth limit ${s})`,o;const u=[];let d=0;for(const t of c){const o=this.serialise(t,e+1,s,r,i,n);null!==o?u.push(o):d++}return u.length>0&&(o.children=u),d>0&&null===i&&(o.truncated=`${d} children hidden (max_nodes ${r})`),o}count(t){let e=0,s=0;const r=[t];for(;r.length>0;){const t=r.pop();if("object"!=typeof t||null===t)continue;e++,"Mesh"===t.type&&s++;const i=Array.isArray(t.children)?t.children:[];for(const t of i)r.push(t)}return{total:e,meshes:s}}mark(t,e,s){const r="string"==typeof t.name?t.name.toLowerCase():"",i="string"==typeof t.type?t.type.toLowerCase():"";let n=r.includes(e)||i.includes(e);const o=Array.isArray(t.children)?t.children:[];for(const t of o)this.mark(t,e,s)&&(n=!0);return n&&s.add(t),n}describe_material(t){if(Array.isArray(t)){const e=t.map((t=>this.material_type(t)));return`${t.length} materials: ${e.join(", ")}`}return"object"==typeof t&&null!==t?this.material_type(t):null}material_type(t){if("object"==typeof t&&null!==t){const e=t.type;if("string"==typeof e)return e}return"Material"}count_vertices(t){if("object"!=typeof t||null===t)return null;const e=t.attributes;if("object"!=typeof e||null===e)return null;const s=e.position;if("object"!=typeof s||null===s)return null;const r=s.count;return"number"==typeof r?r:null}vector(t,e){return"object"!=typeof t||null===t?[e,e,e]:[this.round(t.x,e),this.round(t.y,e),this.round(t.z,e)]}round(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:e}is_uniform(t,e){return t.every((t=>t===e))}positive(t,e){return"number"!=typeof t||!Number.isFinite(t)||t<1?e:Math.floor(t)}}class Os{list(t){const e=this.current(t);return{current:e,views:this.names(t).map((t=>({name:t.name,url:t.url,current:t.name===e})))}}go(t,e){const s="string"==typeof e.name?e.name:null,r=this.names(t);if(null===s||!r.some((t=>t.name===s))){const t=r.map((t=>t.name)).join(", ");throw this.error("not_found",`Unknown view. Available views: ${t}.`)}const i=void 0===e.change_url||!0===e.change_url,n=!0===e.skip;return t.go_to_view(s,i,n),{requested:s,current:this.current(t),change_url:i,skip:n}}names(t){return(Array.isArray(t.views)?t.views:[]).filter((t=>"string"==typeof t.name)).map((t=>({name:t.name,url:"string"==typeof t.url?t.url:""})))}current(t){const e=t.get_current_view();return"object"!=typeof e||null===e||"string"!=typeof e.name?null:e.name}error(t,e){const s=new Error(e);return s.code=t,s}}class Ls extends P{constructor(t=1){super();const e=[];e.push(new l(0,0,0)),e.push(new l(0,0,1e3));const s=new N({color:4474111,depthFunc:O}),r=(new L).setFromPoints(e),i=new $(r,s);i.renderOrder=5e4;const n=[];n.push(new l(0,0,0)),n.push(new l(0,1e3,0));const o=new N({color:4521796,depthFunc:O}),a=(new L).setFromPoints(n),h=new $(a,o);h.renderOrder=5e4;const _=[];_.push(new l(0,0,0)),_.push(new l(1e3,0,0));const c=new N({color:16729156,depthFunc:O}),u=(new L).setFromPoints(_),d=new $(u,c);d.renderOrder=5e4,this.renderOrder=1e5,this.add(i),this.add(h),this.add(d),this.scale.set(t,t,t)}update(){}dispose(){super.dispose()}}class $s extends ks{constructor(t,e,s,r){const i=new us,n={font:e,font_color:s||"#000000"},o=i.draw_on_texture(t,n);o.minFilter=U,o.minFilter=v,o.colorSpace=p,o.needsUpdate=!0,super(o,r),this.simple_text_drawer=i,this.canvas_texture=o,this.draw_settings=n}set text(t){this.simple_text_drawer.draw_canvas(t,this.draw_settings),this.update_texture()}get text(){return"not implemented"}}class Us extends ce{constructor(){super();const t=ut(new e),s=ut(new e),r=ut(new e);this.uniforms._ScreenSpacePosition=t,this.uniforms._ScreenSize=s,this.uniforms._TextureSize=r;const i=mt().mul(r).add(t).div(s);this.vertexNode=dt(i.mul(2).sub(1),0,1)}set_position(t,e){this.uniforms._ScreenSpacePosition.value.set(t,e)}set_texture(t,e,s){this.uniforms._MainTex.value=t,this.uniforms._TextureSize.value.set(t.image.width,t.image.height),void 0!==e&&(this.uniforms._TextureSize.value.x=e),void 0!==s&&(this.uniforms._TextureSize.value.y=s)}set_screen_size(t,e){this.uniforms._ScreenSize.value.set(t,e)}}class Bs extends B{constructor(t,e,s,i){super(t,e,s,i),this.clear_color=new r("#000000"),this.clear_alpha=1}copy(t){return super.copy(t),this.clear_color.copy(t.clear_color),this.clear_alpha=t.clear_alpha,this}}class Es extends n{constructor(t,e,s){t=t||"#FF0000";const r=(e=e||1)-.4,i=new E(.01,.01,r,32);i.translate(0,r/2,0);const n=new I(.1,.4,32);n.translate(0,r+.2,0);const o=oe.mergeGeometries([i,n]);o.rotateX(1.57);super(o,new D({color:t})),s&&this.quaternion.setFromUnitVectors(new l(0,0,1),s),this._dir=s}set dir(t){this.quaternion.setFromUnitVectors(new l(0,0,1),t),this._dir=t}get dir(){return this._dir}set length(t){this.scale.z=t}get length(){return this.scale.z}}class Is extends n{constructor(t,e,s){t=t||new l(1,1,1),e=e||new l(1,1,1),s=s??16711680;super(new Q(t.x,t.y,t.z,e.x,e.y,e.z),new D({color:s}))}}class Ds extends n{constructor(t,e){e=e??"#FF0000";super(new V(t=t||1,64,64),new D({color:e})),this.radius=t,this.color=e,this.center=this.position}}function Qs(t){return new se({color:t,opacity:.2,transparent:!0,depthWrite:!1})}const Vs=new class{init(){this.Vector3_one=new l(1,1,1),this.Vector3_zero=new l(0,0,0),this.canvas_renderer=void 0,this.display_texture_meshes=[],this.ctx=void 0,this.scene=new i,this.camera=new Bs(60,ye.aspect_ratio,.1,1e3),this.camera.clear_alpha=0}draw_arrow(t,e,s=16711680){const r=new Es(s,e.length(),e.clone().normalize());return r.position.copy(t),this.scene.add(r),r}draw_axis(){const t=new Ls;return this.scene.add(t),t}set_debug_RT(t){this.rt_debug=t}draw_rectangle(t,e,s,r){e=e||100,s=s||100,this.ctx.fillStyle=r||"rgba(255, 0, 0, 1)",this.ctx.fillRect(t.x-e/2,this.ctx.canvas.height-t.y-s/2,e,s)}clear(){this.ctx&&this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height)}draw_line_2D(t,e,s){this.ctx.strokeStyle=s||"rgba(255, 0, 0, 1)",this.ctx.beginPath(),this.ctx.moveTo(t.x,t.y),this.ctx.lineTo(e.x,e.y),this.ctx.closePath(),this.ctx.stroke()}draw_line(t,e=16711680){const s=new N({color:e}),r=(new L).setFromPoints(t),i=new $(r,s);return i.frustumCulled=!1,this.scene.add(i),i}draw_cube(t,e,s){e=e||1,s=s??16711680,t=t||new l;const r=new Is(new l(e,e,e),void 0,s);return r.position.copy(t),this.scene.add(r),r}draw_oriented_cube(t,e,s=1,r="#FF0000",i=.1){const n=t.distanceTo(e),o=new Is(new l(i,s,n),void 0,r),a=e.clone().sub(t).multiplyScalar(.5),h=a.clone().normalize();return a.add(t),o.position.copy(a),o.quaternion.setFromUnitVectors(new l(0,0,-1),h),this.scene.add(o),o}draw_plane(t,e,s=65280){const r=new o(t,e),i=Qs(s),a=new n(r,i);return a.renderOrder=-1e4,this.scene.add(a),a}draw_empty_cube(t,e,s){e=e||1,s=s??16711680;const r=(new F).setFromCenterAndSize(new l,new l(e,e,e)),i=new Y(r,s);return i.position.copy(t||new l),i}draw_sphere(t,e,s){e=e||1,s=s??16711680,t=t||new l;const r=new Ds(e,s);return r.position.copy(t),this.scene.add(r),r}draw_point_array(t,e=!1,s=16711680){const r=new W(t,e);r.updateArcLengths();const i=r.getSpacedPoints(200);return this.draw_line(i,65280)}draw_sphere_helper(t,e){e=e??16711680;const s=new V(t.radius,32,32),r=new D({color:e}),i=new n(s,r);return i.position.copy(t.center),be.current.add(i),i}draw_math_sphere(t,e=16711680){const s=new V(t.radius,32,32),r=Qs(e),i=new n(s,r);return i.position.copy(t.center),be.current.add(i),i}draw_bounding_box(t,e=16776960){const s=new Y(t,e);return be.current.add(s),s}draw_curve(t,e){const s=new l(0,0,0);e&&(s.y=e.offset||0);for(let e=0;e<t.length-1;e++)this.draw_line([t[e].clone().add(s),t[e+1].clone().add(s)])}draw_texture(t,e,s){const r=new n(new o(1,1),new Us);return r.frustumCulled=!1,this.display_texture_meshes.push(r),this.scene.add(r),r.material.set_texture(t,e,s),r}draw_label(t,s,i=1,n=16777215){const o=new $s(t,"bold 48px Arial",new r(n).getStyle(),new e);return o.size=new l(i,i,i),o.screen_aligned=!0,o.position.copy(s||new l),this.scene.add(o),o}render(t){for(let t=0;t<this.display_texture_meshes.length;t++)this.display_texture_meshes[t].material.set_screen_size(ye.width,ye.height);this.scene.children.length>0&&t.render(this.scene,fe.current)}};class Ys{constructor(t){this.reply=t,this.handlers={},this.queue=[]}register(t,e,s){this.handlers[t]={timing:e,handler:s}}handle(t){const e=this.handlers[t.cmd],s=void 0===t.args?{}:t.args;void 0!==e?"frame_end"!==e.timing?this.run(t.id,s,e.handler):this.queue.push({id:t.id,args:s,handler:e.handler}):this.reply({id:t.id,ok:!1,error:{code:"unknown_command",message:`Unknown command '${t.cmd}'`}})}drain(){const t=this.queue;this.queue=[];for(const e of t)this.run(e.id,e.args,e.handler)}run(t,e,s){try{Promise.resolve(s(e)).then((e=>this.reply({id:t,ok:!0,result:e}))).catch((e=>this.reply({id:t,ok:!1,error:this.to_error(e)})))}catch(e){this.reply({id:t,ok:!1,error:this.to_error(e)})}}to_error(t){const e=t?.code,s=t?.message;return{code:void 0===e?"handler_failed":e,message:"string"==typeof s?s:this.describe(t)}}describe(t){return"string"==typeof t?t:"Handler failed with a non-Error value of type "+typeof t}}class Ws{constructor(){this.socket=null,this.options=null,this.retry_timer=0,this.disposed=!1,this.dispatcher=new Ys((t=>this.send_reply(t)))}init(t){this.options=t,this.disposed=!1,this.connect()}register(t,e,s){this.dispatcher.register(t,e,s)}on_frame_end(){this.dispatcher.drain()}dispose(){this.disposed=!0,window.clearTimeout(this.retry_timer),null!==this.socket&&(this.socket.onclose=null,this.socket.close(),this.socket=null)}connect(){const t=this.options;if(this.disposed||null===t)return;const e=new WebSocket(`ws://127.0.0.1:${t.port}`);this.socket=e,e.onopen=()=>{e.send(JSON.stringify({event:"hello",protocol:1,app:t.app_info()}))},e.onmessage=t=>this.on_message(t),e.onclose=()=>{this.socket===e&&(this.socket=null),this.schedule_retry()},e.onerror=()=>{}}on_message(t){const e=t.data;if("string"!=typeof e)return;const s=this.parse_frame(e);if(null!==s)if("welcome"!==s.event)if("refused"!==s.event)"string"==typeof s.id&&"string"==typeof s.cmd&&this.dispatcher.handle(s);else{const t=this.as_text(s.reason),e=this.as_text(s.server_protocol);console.warn(`[ohzi-mcp] bridge refused: ${t} (server protocol ${e}, this app speaks 1)`)}else console.info("[ohzi-mcp] bridge connected")}parse_frame(t){try{const e=JSON.parse(t);return"object"!=typeof e||null===e?null:e}catch{return null}}as_text(t){return"string"==typeof t?t:"number"==typeof t||"boolean"==typeof t?String(t):"(unknown)"}send_reply(t){null!==this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(JSON.stringify(t))}schedule_retry(){this.disposed||(window.clearTimeout(this.retry_timer),this.retry_timer=window.setTimeout((()=>this.connect()),2e3))}}class Xs{constructor(){}get is_animating(){return!1}on_enter(t){}update(t){}on_exit(t){}}class Hs{constructor(){this.t=0,this.easing_function_t=0}get is_animating(){return!0}on_enter(t){}update(t){this.t+=ns.delta_time/t.duration,this.easing_function_t=t.easing_function(this.t),this.easing_function_t=Ke.clamp(this.easing_function_t,0,1),t.set_property_value(Ke.lerp(t.from,t.to,this.easing_function_t)),this.easing_function_t>=.9999&&(t.set_property_value(t.to),t.set_current_state(new Xs),t.finished_callback(t))}on_exit(t){}}class Zs{constructor({element:t,css_property:e,from:s=0,to:r=1,duration:i=1,value_prefix:n="",value_suffix:o="",easing_function:a=Ge.ease_in_out_cubic,finished_callback:h=()=>{}}){this.element=t,this.css_property=e,this.from=s,this.to=r,this.value_prefix=n,this.value_suffix=o,this.duration=i,this.easing_function=a,this.finished_callback=h,this.current_state=new Xs}animate(){this.set_current_state(new Hs)}stop(){this.set_current_state(new Xs)}set_property_value(t){this.element.style[this.css_property]=`${this.value_prefix}${t}${this.value_suffix}`}update(){this.current_state.update(this)}get is_animating(){return this.current_state.is_animating}set_current_state(t){this.current_state.on_exit(this),this.current_state=t,this.current_state.on_enter(this)}}const Ks=new class{init(){this.operating_systems={ANDROID:"android",IOS:"ios",LINUX:"linux",MAC:"mac",WINDOWS:"windows"},this.is_mobile=!!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/),this.is_ipad=!!(navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2),this.is_ios=!!navigator.userAgent.match(/(iPhone|iPod|iPad)/)||this.is_ipad,this.is_android=this.get_os()===this.operating_systems.ANDROID,this.is_linux=this.get_os()===this.operating_systems.LINUX,this.is_mac=this.get_os()===this.operating_systems.MAC,this.is_windows=this.get_os()===this.operating_systems.WINDOWS}get_os(){const t=window.navigator.userAgent,e=window.navigator.platform;let s=null;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(e)?s=this.operating_systems.MAC:-1!==["iPhone","iPad","iPod"].indexOf(e)?s=this.operating_systems.IOS:-1!==["Win32","Win64","Windows","WinCE"].indexOf(e)?s=this.operating_systems.WINDOWS:/Android/.test(t)?s=this.operating_systems.ANDROID:!s&&/Linux/.test(e)&&(s=this.operating_systems.LINUX),s}};const Js=new class{init(){this.target_geometry=void 0,this.target_position=new l}set_target_geometry(t){this.target_geometry=t}};class Gs{constructor(){}fit_points(t,e,s,r){const i=this.get_view_bounds(t,e),n=this.get_distance_to_fit_rect(i.size.x/2,i.size.y/2,s,r);return{center:i.center,distance_to_center:n}}get_view_bounds(t,e){const s=e.clone().invert(),r=[];for(let e=0;e<t.length;e++)r.push(t[e].clone().applyQuaternion(s));const i=(new F).setFromPoints(r),n=new l;i.getSize(n);const o=1e-9*Math.max(n.x,n.y,n.z);n.set(n.x>o?n.x:0,n.y>o?n.y:0,n.z>o?n.z:0);const a=new l;return i.getCenter(a),a.applyQuaternion(e),{center:a,size:n}}get_zoom_to_fit_size(t,e,s,r=1){const i=Math.min(Math.abs((t.right-t.left)/e),Math.abs((t.top-t.bottom)/s));return Number.isFinite(i)?i*r:t.zoom}get_distance_to_fit_depth(t,e,s){const r=e+t.near,i=t.far-e;let n=Math.max(s,r);return n>i&&(n=Math.max(r,i)),n}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}class tr{constructor(){this.sphere=new j}fit_points(t,e,s,r){this.sphere.setFromPoints(t);const i=Ke.degToRad(s/2),n=2*Math.atan(Math.tan(i)*r)/2,o=this.get_up_plane_normal(e,i),a=this.get_down_plane_normal(e,i),h=this.get_left_plane_normal(e,n),_=this.get_right_plane_normal(e,n),c=new l(0,0,-1).applyQuaternion(e),u=this.sphere.center.clone(),d=this.get_distance_to_fit_rect(2*this.sphere.radius,2*this.sphere.radius,s,r),p=u.clone().add(c.clone().multiplyScalar(-1*d)),m=(new X).setFromNormalAndCoplanarPoint(o,p),g=(new X).setFromNormalAndCoplanarPoint(a,p),f=(new X).setFromNormalAndCoplanarPoint(h,p),y=(new X).setFromNormalAndCoplanarPoint(_,p);this.apply_center_correction_to_pos(p,t,e,m,g,f,y),m.setFromNormalAndCoplanarPoint(o,p),g.setFromNormalAndCoplanarPoint(a,p),f.setFromNormalAndCoplanarPoint(h,p),y.setFromNormalAndCoplanarPoint(_,p);let b=1/0;const w=c.clone().multiplyScalar(-2*d);for(let e=0;e<t.length;e++){const s=new H(t[e].clone(),t[e].clone().add(w)),r=new l,i=new l,n=new l,o=new l;m.intersectLine(s,r),g.intersectLine(s,i),f.intersectLine(s,n),y.intersectLine(s,o),r.length()<1e-4&&console.log("up intersection not found",e),i.length()<1e-4&&console.log("down intersection not found",e),n.length()<1e-4&&console.log("left intersection not found",e),o.length()<1e-4&&console.log("right intersection not found",e);const a=t[e].clone().sub(r).length(),h=t[e].clone().sub(i).length(),_=t[e].clone().sub(n).length(),c=t[e].clone().sub(o).length(),u=Math.min(a,h),d=Math.min(_,c),p=Math.min(u,d);p<b&&(b=p)}const x=c.clone().multiplyScalar(b);return p.clone().add(x)}apply_center_correction_to_pos(t,e,s,r,i,n,o){const a=this.get_vertical_correction(e,i,r,s),h=this.get_horizontal_correction(e,n,o,s);t.add(a),t.add(h)}get_vertical_correction(t,e,s,r){let i=1/0,n=1/0;const o=new l(0,1,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const a=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(-5e6))),h=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(5e6))),_=new l,c=new l;e.intersectLine(a,_),s.intersectLine(h,c);const u=_.distanceTo(t[r]),d=c.distanceTo(t[r]);c.length()<1e-4&&console.log("vertical up intersection not found",r),_.length()<1e-4&&console.log("vertical down intersection not found",r),u<n&&(n=u),d<i&&(i=d)}const a=(i-n)/2;return o.clone().multiplyScalar(-a)}get_horizontal_correction(t,e,s,r){let i=1/0,n=1/0;const o=new l(1,0,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const a=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(-5e6))),h=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(5e6))),_=new l,c=new l;e.intersectLine(a,_),s.intersectLine(h,c);const u=_.distanceTo(t[r]),d=c.distanceTo(t[r]);_.length()<1e-4&&console.log("left intersection not found",r),c.length()<1e-4&&console.log("right intersection not found",r),u<n&&(n=u),d<i&&(i=d)}const a=(i-n)/2;return o.clone().multiplyScalar(-a)}get_up_plane_normal(t,e){const s=new l(0,-1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),e)),s.applyQuaternion(t),s}get_down_plane_normal(t,e){const s=new l(0,1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),-e)),s.applyQuaternion(t),s}get_left_plane_normal(t,e){const s=new l(1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),e)),s.applyQuaternion(t),s}get_right_plane_normal(t,e){const s=new l(-1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),-e)),s.applyQuaternion(t),s}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}const er=new class{init(t){this.tmp_mat=new M,this.plane=new X,this.ray=new Z,this.tmp_size=new l,this.tmp_unproj=new l,this.input=t}get_up_dir(t){t=t||fe.current;const e=new l;return e.set(0,1,0),e.applyQuaternion(t.quaternion),e}get_forward_dir(t){t=t||fe.current;const e=new l;return e.set(0,0,-1),e.applyQuaternion(t.quaternion),e}get_right_dir(t){t=t||fe.current;const e=new l;return e.set(1,0,0),e.applyQuaternion(t.quaternion),e}unproject_mouse_position(t,e){e=e||fe.current;const s=new l,r=e.fov/2*Math.PI/180,i=2*Math.atan(Math.tan(r)*e.aspect)/2,n=Math.tan(r)*e.far,o=Math.tan(i)*e.far;return s.set(o*t.x,n*t.y,-e.far).normalize(),s.applyQuaternion(e.quaternion)}get_plane_intersection(t,e,s,r){r=r||fe.current,s=s||this.input.NDC;const i=new l;if(this.plane.setFromNormalAndCoplanarPoint(e||this.get_forward_dir(r),t),r.isPerspectiveCamera)this.ray.set(r.position,this.unproject_mouse_position(s,r));else{const t=r,e=(t.right+t.left)/2,i=(t.top+t.bottom)/2,n=(t.right-t.left)/(2*t.zoom),o=(t.top-t.bottom)/(2*t.zoom),a=new l(e+s.x*n,i+s.y*o,0);a.applyQuaternion(r.quaternion),a.add(r.position);const h=new l(0,0,-1).applyQuaternion(r.quaternion);this.ray.set(a,h)}return this.ray.intersectPlane(this.plane,i),i}fit_points_on_camera(t,e=1){const s=(new Gs).get_view_bounds(t,fe.current.quaternion),r=s.size.clone().multiplyScalar(e);return{position:s.center,zoom:this.get_zoom_to_fit_rect(r.x/2,r.y/2)}}get_zoom_to_fit_rect(t,e){const s=fe.current;if(s.isOrthographicCamera)return(new Gs).get_zoom_to_fit_size(s,2*t,2*e);const r=s,i=r.fov/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r.aspect)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}get_zoom_to_fit_box(t,e){return e=e||fe.current,t.isEmpty()?e.isOrthographicCamera?e.zoom:0:this.fit_bounding_box_points(e,t).zoom}get_html_screen_pos(t,e){e=e||fe.current;const s=new l;return t.getWorldPosition(s),s.project(e),s.x=(.5*s.x+.5)*ye.width,s.y=(1-(.5*s.y+.5))*ye.height,s}world_pos_to_screen(t,e){e=e||fe.current;const s=new l;return s.copy(t),s.project(e),s.x=(.5*s.x+.5)*ye.width,s.y=(1-(.5*s.y+.5))*ye.height,s}update_projection(t){const e=t;e.left=-ye.width/2,e.right=ye.width/2,e.top=ye.height/2,e.bottom=-ye.height/2,e.aspect=ye.aspect_ratio,e.updateProjectionMatrix()}fit_bounding_box_points(t,e,s=1){const r=new l;r.copy(e.max).sub(e.min);const i=e.min.clone(),n=i.clone().add(new l(r.x,0,0)),o=i.clone().add(new l(0,r.y,0)),a=i.clone().add(new l(0,0,r.z)),h=i.clone().add(new l(r.x,0,r.z)),_=i.clone().add(new l(0,r.y,r.z)),c=e.max.clone(),u=i.clone().add(new l(r.x,r.y,0));return this.fit_points(t,[i,n,o,a,h,_,c,u],s)}fit_points(t,e,s=1){const r=t;if(r.isPerspectiveCamera){const i=new l(0,0,-1).applyQuaternion(t.quaternion),n=i.clone().multiplyScalar(-1),o=(new tr).fit_points(e,t.quaternion,r.fov*s,r.aspect),a=(new F).setFromPoints(e),h=new l;a.getCenter(h);const _=(new X).setFromNormalAndCoplanarPoint(n,h),c=new Z(o,i),u=new l;c.intersectPlane(_,u);return{zoom:o.distanceTo(u),reference_position:u,camera_position:o}}{const r=t,i=new Gs,n=i.get_view_bounds(e,t.quaternion),o=new l(0,0,1).applyQuaternion(t.quaternion),a=t.position.clone().sub(n.center).dot(o),h=i.get_distance_to_fit_depth(r,n.size.z/2,a);return{zoom:i.get_zoom_to_fit_size(r,n.size.x,n.size.y,s),reference_position:n.center,camera_position:n.center.clone().addScaledVector(o,h)}}}};const sr=new class{constructor(){}init(t){fe.init(),er.init(t),ds.init(),Ks.init(),$e.init(),Js.init(),Fe.init(),be.init(new He({name:"default_scene",compilators:{}})),ye.init(),ns.init(),Vs.init()}dispose(t){Re.dispose(),be.dispose(),t.dispose()}};class rr{constructor(){this.on_key_down=t=>{90===t.keyCode&&t.ctrlKey&&!this.ctrlz_fired&&(this.ctrlz_pressed=!0,this.ctrlz_fired=!0),t.code&&this.press_key(t.code)},this.on_key_up=t=>{this.release_key(t.code)}}init(t){this.ctrlz_pressed=!1,this.ctrlz_fired=!1,this.keys={},this.keys_keys=[],this.container=t,this.container.addEventListener("keydown",this.on_key_down,!1),this.container.addEventListener("keyup",this.on_key_up,!1)}clear(){this.ctrlz_pressed=!1;for(let t=0;t<this.keys_keys.length;t++)this.keys[this.keys_keys[t]].pressed=!1,this.keys[this.keys_keys[t]].released=!1}release_key(t){const e=this.keys[t];e&&(e.fired=!1,e.down=!1,e.released=!0)}release_keys(){this.ctrlz_fired=!1;for(let t=0;t<this.keys_keys.length;t++)this.keys[this.keys_keys[t]].fired=!1,this.keys[this.keys_keys[t]].down=!1}press_key(t){const e=this.keys[t];e&&(!1===e.down&&(e.pressed=!0),e.down=!0,e.fired=!0)}is_key_pressed(t){const e=this.keys[t];return!!e&&e.pressed}is_key_down(t){const e=this.keys[t];return!!e&&e.down}is_key_released(t){const e=this.keys[t];return!!e&&e.released}register_key(t){this.keys[t]={key_name:t,pressed:!1,down:!1,fired:!1,released:!1},this.keys_keys=Object.keys(this.keys)}unregister_key(t){delete this.keys[t]}dispose(){this.container.removeEventListener("keydown",this.on_key_down,!1),this.container.removeEventListener("keyup",this.on_key_up,!1)}}class ir extends a{constructor(t,e,s,i,n,o){super(t,e,s,i,n,o),this.clear_color=new r("#000000"),this.clear_alpha=1}copy(t){return super.copy(t),this.clear_color.copy(t.clear_color),this.clear_alpha=t.clear_alpha,this}}class nr extends ce{constructor(e=!1){super();const s=ct(new t),r=ut(1);this.uniforms._BlurredTex=s,this.uniforms._BloomStrength=r;const i=this.sample(s);e?(this.fragmentNode=i,this.blending=K,this.blendSrc=J,this.blendDst=J):this.fragmentNode=this.sample_main_tex().add(i.mul(r))}}const or=[[-4,.0525],[-3,.075],[-2,.11],[-1,.15],[0,.225],[1,.15],[2,.11],[3,.075],[4,.0525]];class ar extends ce{constructor(){super();const t=ut(new e);this.uniforms._SampleDir=t;const s=this.uniforms._Resolution,r=t.mul(bt(.5).div(s)),i=or.map((([t,e])=>(0===t?this.sample_main_tex():this.sample_main_tex(r.mul(2*t))).mul(e)));this.fragmentNode=i.reduce(((t,e)=>t.add(e)))}}class hr{constructor(){this.RT1=new _(1,1),this.RT2=new _(1,1),this.box_blur_mat=new ar}blur(t){t.width===this.RT1.width&&t.height===this.RT1.height||(this.RT1.setSize(t.width,t.height),this.RT2.setSize(t.width,t.height)),this.box_blur_mat.uniforms._SampleDir.value.set(1,0),Re.blit(t,this.RT1,this.box_blur_mat),this.box_blur_mat.uniforms._SampleDir.value.set(0,1),Re.blit(this.RT1,t,this.box_blur_mat)}dispose(){this.RT1.dispose(),this.RT2.dispose(),this.box_blur_mat.dispose()}}const _r=[[0,0,4],[-1,-1,1],[1,1,1],[1,-1,1],[-1,1,1]],lr=[[-2,0,1],[-1,1,2],[0,2,1],[1,1,2],[2,0,1],[1,-1,2],[0,-2,1],[-1,-1,2]];class cr extends ce{constructor(t){super();const e=bt(.5).div(this.uniforms._Resolution),s=t?lr:_r,r=s.map((([t,s,r])=>this.sample_main_tex(e.mul(bt(t,s))).mul(r))),i=s.reduce(((t,[,,e])=>t+e),0);this.fragmentNode=r.reduce(((t,e)=>t.add(e))).div(i)}}class ur{constructor(){this.current_width=1,this.current_height=1,this.RT0=new _(1,1),this.RT1=new _(1,1),this.RT2=new _(1,1),this.RT3=new _(1,1),this.RT4=new _(1,1),this.upscale_blur_mat=new cr(!0),this.downscale_blur_mat=new cr(!1)}blur(t){this.check_RT_resize(t.width,t.height),Re.blit(t,this.RT1),Re.blit(this.RT1,this.RT2,this.downscale_blur_mat),Re.blit(this.RT2,this.RT3,this.downscale_blur_mat),Re.blit(this.RT3,this.RT4,this.downscale_blur_mat),Re.blit(this.RT4,this.RT3,this.upscale_blur_mat),Re.blit(this.RT3,this.RT2,this.upscale_blur_mat),Re.blit(this.RT2,t,this.upscale_blur_mat)}check_RT_resize(t,e){this.current_width===t&&this.current_height===e||(this.current_width=t,this.current_height=e,this.resize(this.RT1,2),this.resize(this.RT2,4),this.resize(this.RT3,8),this.resize(this.RT4,16))}dispose(){this.RT0.dispose(),this.RT1.dispose(),this.RT2.dispose(),this.RT3.dispose(),this.RT4.dispose(),this.upscale_blur_mat.dispose(),this.downscale_blur_mat.dispose()}resize(t,e){t.setSize(Math.max(1,Math.floor(this.current_width/e)),Math.max(1,Math.floor(this.current_height/e)))}}class dr extends me{constructor(t=!1){super(),this.use_dual_filtering=t,this.bloom_compose_mat=new nr,window.bloom_mat=this.bloom_compose_mat,this.main_RT=void 0,this.blur_RT=void 0,this.blurrer=void 0}on_enter(){this.blurrer=this.use_dual_filtering?new ur:new hr,this.main_RT=new _(ye.width,ye.height),this.blur_RT=new _(ye.width,ye.height)}on_exit(){this.blurrer.dispose(),this.main_RT.dispose(),this.blur_RT.dispose()}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),Re.blit(this.main_RT,this.blur_RT),this.blurrer.blur(this.blur_RT),this.bloom_compose_mat.uniforms._BlurredTex.value=this.blur_RT.texture,Re.blit(this.main_RT,void 0,this.bloom_compose_mat)}__check_RT_size(){this.main_RT.width===ye.width&&this.main_RT.height===ye.height||(this.main_RT.setSize(ye.width,ye.height),this.blur_RT.setSize(ye.width,ye.height))}}class pr extends ee{constructor(){super(),this.colorNode=dt(Ut(dt(Bt(Et),1),p))}}class mr extends me{constructor(){super(),this.normal_material=new pr}render(){Re.clear(void 0,fe.current,!0,!0),Re.render(be.current,fe.current,void 0,this.normal_material)}}class gr extends ee{constructor(e=1){super();const s=ut(e),r=ct(new t),i=ct(new t),n=ut(new M);this.uniforms={_Intensity:s,_AlbedoTex:r,_NormalDepthTex:i,_InverseProjMatrix:n};const o=bt(It.x.mul(2).sub(1),It.y.mul(-2).add(1)),a=n.mul(dt(o,1,1)),h=i.sample(It),_=a.xyz.div(a.w).mul(ze(h.xy)),l=zt(Te(h.zw)),c=r.sample(It).rgb,u=Dt.sub(_),d=Qt(wt(l,zt(u))),p=s.div(wt(u,u));this.colorNode=dt(c.mul(d).mul(p),1),this.blending=G,this.depthWrite=!1,this.side=tt}set_inverse_proj_matrix(t){this.uniforms._InverseProjMatrix.value.copy(t)}set_normal_depth_rt(t){this.uniforms._NormalDepthTex.value=t.texture}set_albedo_rt(t){this.uniforms._AlbedoTex.value=t.texture}}class fr extends me{constructor(){super(),this.main_rt=new _(ye.width,ye.height),this.scene_lights=new He({name:"lights_scene",compilators:{}});const t=Math.sqrt(204.8)/2,e=new n(new V(t),new gr(1));for(let t=0;t<2;t++)for(let s=0;s<2;s++){const r=e.clone();r.position.set(2*t-1,1,2*s-1),this.scene_lights.add(r)}this.camera_inverse_proj_mat=new M}on_enter(){Re.generate_depth_normal_texture=!0}render(){this.__check_RT_size(),Re.clear(this.main_rt,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_rt),this.camera_inverse_proj_mat.copy(fe.current.projectionMatrix).invert();const t=this.camera_inverse_proj_mat,e=this.main_rt,s=Re.depth_normals_RT;this.scene_lights.traverse((r=>{r.material&&(r.material.set_inverse_proj_matrix(t),r.material.set_normal_depth_rt(s),r.material.set_albedo_rt(e))})),Re.clear(void 0,fe.current,!0,!0),Re.render(this.scene_lights,fe.current)}__check_RT_size(){this.main_rt.width===ye.width&&this.main_rt.height===ye.height||this.main_rt.setSize(ye.width,ye.height)}}class yr extends ce{constructor(){super();const e=ct(new t);this.uniforms._AO=e;const s=this.sample(e).r;this.fragmentNode=dt(this.sample_main_tex().rgb.mul(s.oneMinus()),1)}}class br extends ce{constructor(t=!0){super(),this.sample_kernel=this.__get_sample_kernel(),this.use_exact_depth=t;const e=ut(new M),s=ut(new M),r=ut(.0125),i=ut(.3),n=Vt(this.sample_kernel,"vec3"),o=ct(this.__get_rotation_texture());Object.assign(this.uniforms,{_InverseProjMatrix:e,_ProjectionMatrix:s,_Bias:r,_Radius:i,_SampleKernel:n,_RandomRotation:o});const a=this.uniforms._MainTex,h=this.uniforms._Resolution,_=t?t=>{const e=t.mul(h).sub(.5),s=Zt(e),r=e.sub(s),i=h.sub(1),n=(t,e)=>{const r=Lt(s.add(bt(t,e)),bt(0),i);return ze(a.load(Kt(r)).xy)};return gt(gt(n(0,0),n(1,0),r.x),gt(n(0,1),n(1,1),r.x),r.y)}:t=>ze(a.sample(t).xy),l=t=>{const s=e.mul(dt(t.mul(2).sub(1),1,1)),r=_(this.texture_uv_at(a,t));return s.xyz.div(s.w).mul(r)};this.fragmentNode=ft((()=>{const t=l(mt()).toVar(),e=zt(Te(this.sample_main_tex().zw)).toVar(),a=o.sample(mt().mul(h.div(4))).xy.mul(2).sub(1),_=zt(xt(a,0)),c=zt(_.sub(e.mul(wt(_,e)))).toVar(),u=zt(Yt(e,c)).toVar(),d=vt(0).toVar();return Wt(64,(({i:o})=>{const a=xt(n.element(o)),h=t.add(c.mul(a.x).add(u.mul(a.y)).add(e.mul(a.z)).mul(i)),_=s.mul(dt(h,1)),p=_.xy.div(_.w).mul(.5).add(.5),m=l(p).z,g=Xt(0,1,i.div(Mt(t.z.sub(m))));d.addAssign(Ht(h.z.add(r),m).mul(g))})),dt(xt(d.div(64)),1)}))()}set_projection_matrix(t){this.uniforms._ProjectionMatrix.value.copy(t),this.uniforms._InverseProjMatrix.value.copy(t).invert()}__get_sample_kernel(){const t=[];for(let e=0;e<64;e++){const s=new l(2*Math.random()-1,2*Math.random()-1,Math.random());s.normalize();let r=e/64;r=Ke.lerp(.1,1,r*r),s.multiplyScalar(r),t.push(s)}return t}__get_rotation_texture(){const t=new Uint8Array(64);for(let e=0;e<16;e++)t[4*e+0]=Math.floor(255*Math.random()),t[4*e+1]=Math.floor(255*Math.random()),t[4*e+2]=0,t[4*e+3]=255;const e=new et(t,4,4,st);return e.wrapS=rt,e.wrapT=rt,e.needsUpdate=!0,e}}class wr extends me{constructor(t=!1,e=!0){super(),this.ssao_mat=new br(e),this.ssao_compose_mat=new yr,this.ssaa=t?2:1,this.main_RT=new _(ye.width*this.ssaa,ye.height*this.ssaa),this.SSAO_RT=new _(ye.width,ye.height),this.blurrer=new hr}on_enter(){Re.generate_depth_normal_texture=!0}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),this.ssao_mat.set_projection_matrix(fe.current.projectionMatrix),Re.blit(Re.depth_normals_RT,this.SSAO_RT,this.ssao_mat),this.blurrer.blur(this.SSAO_RT),this.ssao_compose_mat.uniforms._AO.value=this.SSAO_RT.texture,Re.blit(this.main_RT,void 0,this.ssao_compose_mat)}__check_RT_size(){this.main_RT.width===ye.width*this.ssaa&&this.main_RT.height===ye.height*this.ssaa||(this.main_RT.setSize(ye.width*this.ssaa,ye.height*this.ssaa),this.SSAO_RT.setSize(ye.width,ye.height))}}class xr extends me{constructor(){super()}render(){Re.clear(void 0,fe.current,!0,!0),be.current.on_pre_render(),be.current.render(),be.current.on_post_render()}}function vr(t,e){return.39894*Math.exp(-.5*t*t/(e*e))/e}class zr extends ce{constructor(t){super();const s=ut(new e(.5,.5)),r=ut(new e(.5,.5)),i=ut(1);this.uniforms.texSize=s,this.uniforms.direction=r,this.uniforms.radius=i;const n=t,o=r.mul(bt(1).div(s)).mul(i);let a=vr(0,n),h=this.sample_main_tex().mul(a);for(let e=1;e<t;e++){const t=vr(e,n),s=o.mul(e),r=this.sample_main_tex(s).add(this.sample_main_tex(s.negate()));h=h.add(r.mul(t)),a+=2*t}this.fragmentNode=h.div(a)}set_size(t,e){this.uniforms.texSize.value.set(t,e)}set_direction(t,e){this.uniforms.direction.value.set(t,e)}set_radius(t=1){this.uniforms.radius.value=t}}const Mr=xt(.299,.587,.114);class Tr extends ce{constructor(){super();const t=ut(.23),e=ut(.01),s=ut(new r("#000000")),i=ut(0);this.uniforms.luminosityThreshold=t,this.uniforms.smoothWidth=e,this.uniforms.defaultColor=s,this.uniforms.defaultOpacity=i;const n=this.sample_main_tex(),o=wt(n.rgb,Mr),a=Xt(t,t.add(e),o);this.fragmentNode=gt(dt(s,i),n,a)}set_threshold(t){this.uniforms.luminosityThreshold.value=t}}class kr{constructor(t=!1){this.current_width=1,this.current_height=1,this.separableBlurMaterials=[],this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.use_half_float=t,this.nMips=5,this.kernelSizeArray=[3,5,7,9,11],this.rt_pars={minFilter:v,magFilter:v,format:st,type:t?it:nt,colorSpace:t?ot:p},this.renderTargetBright=new _(1,1,this.rt_pars),this.renderTargetBright.texture.generateMipmaps=!1,this.init_materials(),this.init_RT(),this.luminosity_high_pass_mat=new Tr}blur(t,e){this.resize_RT(t.width,t.height);let s=t;e&&(Re.blit(t,this.renderTargetBright,this.luminosity_high_pass_mat),s=this.renderTargetBright);for(let t=0;t<this.nMips;t++){const e=this.separableBlurMaterials[t];e.set_direction(1,0),Re.blit(s,this.renderTargetsHorizontal[t],e),e.set_direction(0,1),Re.blit(this.renderTargetsHorizontal[t],this.renderTargetsVertical[t],e),s=this.renderTargetsVertical[t]}}get_blurred_texture(){return this.renderTargetsHorizontal[0].texture}get_blurred_RT(){return this.renderTargetsHorizontal[0]}init_RT(){this.dispose_RT(),this.renderTargetBright.setSize(1,1);for(let t=0;t<this.nMips;t++){const t=new _(1,1,this.rt_pars),e=new _(1,1,this.rt_pars);t.texture.generateMipmaps=!1,e.texture.generateMipmaps=!1,t.texture.colorSpace=this.rt_pars.colorSpace,e.texture.colorSpace=this.rt_pars.colorSpace,this.renderTargetsHorizontal.push(t),this.renderTargetsVertical.push(e)}}resize_RT(t,e){if(this.current_width===t&&this.current_height===e)return;this.current_width=t,this.current_height=e;let s=Math.round(t/2),r=Math.round(e/2);this.renderTargetBright.setSize(s,r);for(let t=0;t<this.nMips;t++)this.renderTargetsVertical[t].setSize(s,r),this.renderTargetsHorizontal[t].setSize(s,r),this.separableBlurMaterials[t].set_size(s,r),s=Math.round(s/2),r=Math.round(r/2)}init_materials(){this.dispose_materials();for(let t=0;t<this.nMips;t++)this.separableBlurMaterials.push(new zr(this.kernelSizeArray[t]))}set_radius(t){for(let e=0;e<this.separableBlurMaterials.length;e++)this.separableBlurMaterials[e].set_radius(t)}set_luminosity_threshold(t){this.luminosity_high_pass_mat.set_threshold(t)}dispose_materials(){for(let t=0;t<this.separableBlurMaterials.length;t++)this.separableBlurMaterials[t].dispose();this.separableBlurMaterials.length=0}dispose_RT(){for(let t=0;t<this.renderTargetsVertical.length;t++)this.renderTargetsHorizontal[t].dispose(),this.renderTargetsVertical[t].dispose();this.renderTargetBright.dispose(),this.renderTargetsHorizontal.length=0,this.renderTargetsVertical.length=0}}class Ar extends me{constructor(t,e,s,r=!1){super(),this.add_mat=new ue(e);const i={samples:t?4:1,type:e?it:nt,format:st,colorSpace:ot,minFilter:w,magFilter:w};this.use_rendering_size=r,this.main_RT=new _(1,1,i),this.main_RT.texture.colorSpace=ot,this.main_RT.texture.minFilter=w,this.main_RT.texture.magFilter=w,this.bloom_compose_mat=new pe(5,e),this.blurrer=new kr(e),this.use_hight_luminosity_pass=s,this.luminosity_threshold=.5}on_enter(){this.bloom_compose_mat.set_blur_texture_0(this.blurrer.renderTargetsVertical[0].texture),this.bloom_compose_mat.set_blur_texture_1(this.blurrer.renderTargetsVertical[1].texture),this.bloom_compose_mat.set_blur_texture_2(this.blurrer.renderTargetsVertical[2].texture),this.bloom_compose_mat.set_blur_texture_3(this.blurrer.renderTargetsVertical[3].texture),this.bloom_compose_mat.set_blur_texture_4(this.blurrer.renderTargetsVertical[4].texture),this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture)}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),this.blurrer.blur(this.main_RT,this.use_hight_luminosity_pass),Re.material_pass(this.bloom_compose_mat,this.blurrer.renderTargetsHorizontal[0]),Re.blit(this.main_RT,void 0,this.add_mat)}set_bloom_strength(t){this.bloom_compose_mat.set_bloom_strength(t)}set_bloom_radius(t){this.blurrer.set_radius(t)}set_luminosity_threshold(t){this.blurrer.set_luminosity_threshold(t)}set_tint_color_0(t){this.bloom_compose_mat.set_tint_color_0(t)}set_tint_color_1(t){this.bloom_compose_mat.set_tint_color_1(t)}set_tint_color_2(t){this.bloom_compose_mat.set_tint_color_2(t)}set_tint_color_3(t){this.bloom_compose_mat.set_tint_color_3(t)}set_tint_color_4(t){this.bloom_compose_mat.set_tint_color_4(t)}__check_RT_size(){const t=this.use_rendering_size?ye.render_width:ye.width,e=this.use_rendering_size?ye.render_height:ye.height;this.main_RT.width===t&&this.main_RT.height===e||this.main_RT.setSize(t,e)}}class Sr extends me{constructor(){super()}render(){be.current.on_pre_render&&be.current.on_pre_render(),be.current.render?be.current.render():Re.render(be.current,fe.current,Re._renderer.getRenderTarget()),this.render_spectator_camera(),be.current.on_post_render&&be.current.on_post_render()}render_spectator_camera(){const t=fe.spectator;if(t&&Re._renderer.xr.isPresenting){const e=Re._renderer.xr,s=e.getCamera();t.projectionMatrix.copy(fe.current.projectionMatrix),t.position.copy(s.position),t.quaternion.copy(s.quaternion);const r=Re._renderer.getRenderTarget();e.isPresenting=!1,Re._renderer.setRenderTarget(null),Re._renderer.render(be.current,t),Re._renderer.setRenderTarget(r),e.isPresenting=!0}}}const Rr=new class{constructor(){this.components=[],this.enabled_components=new Set}update(){this.__set_components_opacities();for(const t of this.enabled_components)t.update(hs.current_state_data)}register_component(t){this.components.push(t)}enable_component(t){this.enabled_components.add(t)}disable_component(t){this.enabled_components.delete(t)}get_component_by_name(t){console.warn("DEPRECATED. Use ViewComponentManager.get instead"),this.get(t)}get(t){for(let e=0;e<this.components.length;e++)if(this.components[e].name===t)return this.components[e];console.error("[ViewComponentManager.get] no component found for: ",t)}__set_components_opacities(){for(let t=0;t<this.components.length;t++)this.components[t].set_opacity(hs.current_state_data)}};class Cr{constructor(t,e,s){t=t||new le,this.target_application=t,this.graphics=e,this.input=s,this.is_running=!1,this.frames_passed=0,this.time_accumulator=0}update(t){if(this.is_running){for(ns.__update(t),1===this.frames_passed&&this.target_application.on_post_start(),this.input.update(),this.time_accumulator+=ns.delta_time,this.target_application.before_update(),hs.before_update();this.time_accumulator>ns.fixed_delta_time;)this.target_application.fixed_update(),hs.fixed_update(),this.time_accumulator-=ns.fixed_delta_time;ns.__set_frame_interpolation(this.time_accumulator/ns.fixed_delta_time),this.target_application.update(),hs.update(),_s.update(),Rr.update(),this.target_application.on_pre_render(),this.graphics.update(),this.target_application.on_post_render(),Vs.render(this.graphics),this.target_application.on_frame_end(),this.frames_passed++,this.input.clear(),Vs.clear()}}start(){this.is_running||(0===this.frames_passed&&this.target_application.on_enter(this),this.is_running=!0,this.graphics._renderer.setAnimationLoop(this.update.bind(this)))}stop(){!1!==this.is_running&&(this.is_running=!1,this.target_application.on_exit(this),this.graphics._renderer.setAnimationLoop(null))}set_state(t){this.target_application.on_exit(this),this.target_application=t,this.target_application.on_enter(this)}dispose(){this.stop(),this.frames_passed=0}}const jr=new class{init(){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.init()}update_position(t,e){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update_position(t,e)}update(){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update()}update_size(t,e){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update_size(t,e)}apply_pixel_density_v2(t){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.apply_pixel_density_v2(t)}apply_pixel_density(t){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.apply_pixel_density(t)}get_pixel_size(){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.get_pixel_size()}get aspect_ratio(){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.aspect_ratio}};class Fr{constructor({name:t,container:e}){this.name=t,this.container=e,this.hidden=!0,Rr.register_component(this)}start(){}on_enter(){this.container.classList.remove("hidden"),Rr.enable_component(this),this.hidden=!1}update(t){}on_exit(){this.container.classList.add("hidden"),Rr.disable_component(this),this.hidden=!0}set_opacity(t){this.container.style.opacity=t[`${this.name}_opacity`],this.toggle_hidden()}toggle_hidden(){Number(this.container.style.opacity)>.001?this.hidden&&this.on_enter():this.hidden||this.on_exit()}}class qr extends n{constructor(t,e,s,r){t=t||1,e=e||1,s=s||"#FF0000",r=r||new D({color:s});const i=new o(t,e);i.rotateX(-1.57),super(i,r)}}class Pr extends n{constructor(t,e,s,r){t=t||1,e=e||1,s=s||"#FF0000",r=r||new D({color:s});super(new o(t,e),r)}}class Nr{constructor(){this.sphere=new j}fit_points(t,e,s,r){this.sphere.setFromPoints(t);const i=Ke.degToRad(s/2),n=2*Math.atan(Math.tan(i)*r)/2,o=this.get_up_plane_normal(e,i),a=this.get_down_plane_normal(e,i),h=this.get_left_plane_normal(e,n),_=this.get_right_plane_normal(e,n),c=new l(0,0,-1).applyQuaternion(e),u=this.sphere.center.clone(),d=this.get_distance_to_fit_rect(2*this.sphere.radius,2*this.sphere.radius,s,r),p=u.clone().add(c.clone().multiplyScalar(-1*d)),m=(new X).setFromNormalAndCoplanarPoint(o,p),g=(new X).setFromNormalAndCoplanarPoint(a,p),f=(new X).setFromNormalAndCoplanarPoint(h,p),y=(new X).setFromNormalAndCoplanarPoint(_,p);this.apply_center_correction_to_pos(p,t,e,m,g,f,y),m.setFromNormalAndCoplanarPoint(o,p),g.setFromNormalAndCoplanarPoint(a,p),f.setFromNormalAndCoplanarPoint(h,p),y.setFromNormalAndCoplanarPoint(_,p);let b=1/0;const w=c.clone().multiplyScalar(-2*d);for(let e=0;e<t.length;e++){const s=new H(t[e].clone(),t[e].clone().add(w)),r=new l,i=new l,n=new l,o=new l;m.intersectLine(s,r),g.intersectLine(s,i),f.intersectLine(s,n),y.intersectLine(s,o),r.length()<1e-4&&console.log("up intersection not found",e),i.length()<1e-4&&console.log("down intersection not found",e),n.length()<1e-4&&console.log("left intersection not found",e),o.length()<1e-4&&console.log("right intersection not found",e);const a=t[e].clone().sub(r).length(),h=t[e].clone().sub(i).length(),_=t[e].clone().sub(n).length(),c=t[e].clone().sub(o).length(),u=Math.min(a,h),d=Math.min(_,c),p=Math.min(u,d);p<b&&(b=p)}const x=c.clone().multiplyScalar(b);return p.clone().add(x)}apply_center_correction_to_pos(t,e,s,r,i,n,o){const a=this.get_vertical_correction(e,i,r,s),h=this.get_hozirontal_correction(e,n,o,s);t.add(a),t.add(h)}get_vertical_correction(t,e,s,r){let i,n,o=1/0,a=1/0;const h=new l(0,1,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const _=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(-5e6))),c=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(5e6))),u=new l,d=new l;e.intersectLine(_,u),s.intersectLine(c,d);const p=u.distanceTo(t[r]),m=d.distanceTo(t[r]);d.length()<1e-4&&console.log("vertical up intersection not found",r),u.length()<1e-4&&console.log("vertical down intersection not found",r),p<a&&(a=p,n=t[r]),m<o&&(o=m,i=t[r])}console.log(i,n);const _=(o-a)/2;return h.clone().multiplyScalar(-_)}get_hozirontal_correction(t,e,s,r){let i,n,o=1/0,a=1/0;const h=new l(1,0,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const _=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(-5e6))),c=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(5e6))),u=new l,d=new l;e.intersectLine(_,u),s.intersectLine(c,d);const p=u.distanceTo(t[r]),m=d.distanceTo(t[r]);u.length()<1e-4&&console.log("left intersection not found",r),d.length()<1e-4&&console.log("right intersection not found",r),p<a&&(a=p,n=t[r]),m<o&&(o=m,i=t[r])}const _=(o-a)/2;return console.log(i,n),h.clone().multiplyScalar(-_)}get_up_plane_normal(t,e){const s=new l(0,-1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),e)),s.applyQuaternion(t),s}get_down_plane_normal(t,e){const s=new l(0,1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),-e)),s.applyQuaternion(t),s}get_left_plane_normal(t,e){const s=new l(1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),e)),s.applyQuaternion(t),s}get_right_plane_normal(t,e){const s=new l(-1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),-e)),s.applyQuaternion(t),s}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}class Or{static convert_to_non_indexed_geometry(t){const e=t.index,s=t.getAttribute("position"),r=[];for(let t=0;t<e.count;t+=3)r.push(s.getX(e.array[t+0])),r.push(s.getY(e.array[t+0])),r.push(s.getZ(e.array[t+0])),r.push(s.getX(e.array[t+1])),r.push(s.getY(e.array[t+1])),r.push(s.getZ(e.array[t+1])),r.push(s.getX(e.array[t+2])),r.push(s.getY(e.array[t+2])),r.push(s.getZ(e.array[t+2]));const i=new L;return i.setAttribute("position",new at(new Float32Array(r),3)),Or.add_barycentric_attribute(i),i}static add_barycentric_attribute(t){const e=[],s=t.getAttribute("position");for(let t=0;t<s.count;t+=3)e.push(1),e.push(0),e.push(0),e.push(0),e.push(1),e.push(0),e.push(0),e.push(0),e.push(1);t.setAttribute("barycentric",new at(new Float32Array(e),3))}}class Lr{static load_images(t){const e=t.querySelectorAll("img");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}const s=t.querySelectorAll("object");for(let t=0;t<s.length;t++){const e=s[t];e.dataset.src&&(e.data=e.dataset.src)}}static load_videos(t){const e=t.querySelectorAll("video");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}}static load_iframes(t){const e=t.querySelectorAll("iframe");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}}static load_elements(t,e){const s=t.querySelectorAll(e);for(let t=0;t<s.length;t++){const e=s[t];e.dataset.src&&(e.src=e.dataset.src)}}}class $r{constructor(){}static get_image_data(t){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const s=e.getContext("2d");return s.drawImage(t,0,0),s.getImageData(0,0,t.width,t.height)}static get_pixel(t,e,s){const r=4*(e+t.width*s),i=t.data;return new h(i[r+0],i[r+1],i[r+2],i[r+3])}}const Ur=new class{constructor(){}sample(t,s){const r=[];let i=99999999;const n=t.getAttribute("position"),o=t.getAttribute("normal"),a=t.getAttribute("tangent"),h=t.getAttribute("uv"),_=t.index,c=[];for(let t=0;t<_.count;t+=3){const s=_.array[t+0],u=_.array[t+1],d=_.array[t+2],p=new l;p.x=n.getX(s),p.y=n.getY(s),p.z=n.getZ(s);const m=new l;m.x=n.getX(u),m.y=n.getY(u),m.z=n.getZ(u);const g=new l;g.x=n.getX(d),g.y=n.getY(d),g.z=n.getZ(d);const f={a:p,b:m,c:g,normal:void 0,tangent:void 0,uv_a:void 0,uv_b:void 0,uv_c:void 0};if(o){const t=new l;t.x=o.getX(s),t.y=o.getY(s),t.z=o.getZ(s);const e=new l;e.x=o.getX(u),e.y=o.getY(u),e.z=o.getZ(u);const r=new l;r.x=o.getX(d),r.y=o.getY(d),r.z=o.getZ(d);const i=t.clone().add(e).add(r).normalize();f.normal=i}if(a){const t=new l;t.x=a.getX(s),t.y=a.getY(s),t.z=a.getZ(s);const e=new l;e.x=a.getX(u),e.y=a.getY(u),e.z=a.getZ(u);const r=new l;r.x=a.getX(d),r.y=a.getY(d),r.z=a.getZ(d);const i=t.clone().add(e).add(r).normalize();f.tangent=i}if(h){const t=new e;t.x=h.getX(s),t.y=h.getY(s);const r=new e;r.x=h.getX(u),r.y=h.getY(u);const i=new e;i.x=h.getX(d),i.y=h.getY(d),f.uv_a=t,f.uv_b=r,f.uv_c=i}c.push(f);const y=this.get_face_area(f);i=Math.min(y,i),r.push(y)}const u=this.get_uniform_face_distribution(r,i,c),d=this.select_random_faces(u,s);return this.sample_data_from_faces(d)}sample_data_from_faces(t){const e=[],s=[],r=[],i=[];for(let n=0;n<t.length;n++){const o=t[n],a=Math.random(),h=Math.random();e.push(this.sample_point_in_face(a,h,o.a,o.b,o.c).clone()),o.normal&&s.push(o.normal.clone()),o.tangent&&r.push(o.tangent.clone()),o.uv_a&&i.push(this.sample_point_in_face(a,h,o.uv_a,o.uv_b,o.uv_c).clone())}return{points:e,normals:s,tangents:r,uvs:i}}select_random_faces(t,e){const s=[];for(let r=0;r<e;r++){const e=t[Math.floor(Math.random()*t.length)];s.push(e)}return s}get_uniform_face_distribution(t,e,s){const r=[];for(let i=0;i<t.length;i++){t[i]/=e;const n=Math.floor(Math.round(t[i]));for(let t=0;t<n;t++)r.push(s[i])}return r}get_face_area(t){const e=t.b.clone().sub(t.a),s=t.c.clone().sub(t.a);return e.cross(s).length()/2}sample_point_in_face(t,e,s,r,i){t+e>1&&(t=1-t,e=1-e);const n=1-(t+e);return s.clone().multiplyScalar(t).add(r.clone().multiplyScalar(e)).add(i.clone().multiplyScalar(n))}};const Br=new class{get_mesh(t,e){t.traverse((t=>{t instanceof n&&(t.geometry&&(t.geometry=t.geometry.clone()),e(t))}))}get_geometries(t){const e=[];return this.get_mesh(t,(t=>{e.push(t.geometry)})),e}assign_material(t,e,s){t.traverse((t=>{t instanceof n&&(void 0===s||t.name===s)&&(t.material=e)}))}clone_animated_gltf(t){const e={animations:t.animations,scene:t.scene.clone(!0)},s={};t.scene.traverse((t=>{t.isSkinnedMesh&&(s[t.name]=t)}));const r={},i={};e.scene.traverse((t=>{t.isBone&&(r[t.name]=t),t.isSkinnedMesh&&(i[t.name]=t)}));for(const t in s){const e=s[t].skeleton,n=i[t],o=[];for(let t=0;t<e.bones.length;++t){const s=r[e.bones[t].name];o.push(s)}n.bind(new ht(o,e.boneInverses),n.matrixWorld)}return e}set_shadow_config(t,e,s){t.traverse((t=>{t instanceof n&&(t.castShadow=e,t.receiveShadow=s)}))}__find_object(t,e,s){t.traverse((t=>{t.name===e&&s(t)}))}get_object(t,e){let s;return t.traverse((t=>{t.name===e&&(s=t)})),s}get_object_by_type(t,e){let s;return t.traverse((t=>{t.constructor.name===e&&(s=t)})),s}};class Er{static is_object(t){return t&&"object"==typeof t&&!Array.isArray(t)}static merge_deep(t,...e){if(!e.length)return t;const s=e.shift();if(Er.is_object(t)&&Er.is_object(s))for(const e in s)Er.is_object(s[e])?(t[e]||Object.assign(t,{[e]:{}}),Er.merge_deep(t[e],s[e])):Object.assign(t,{[e]:s[e]});return Er.merge_deep(t,...e)}static xml_to_json(t){let e={};if(1===t.nodeType){if(t.attributes.length>0){e["@attributes"]={};for(let s=0;s<t.attributes.length;s++){const r=t.attributes.item(s);e["@attributes"][r.nodeName]=r.nodeValue}}}else 3===t.nodeType&&(e=t.nodeValue);if(t.hasChildNodes())for(let s=0;s<t.childNodes.length;s++){const r=t.childNodes.item(s),i=r.nodeName;if(void 0===e[i])e[i]=this.xml_to_json(r);else{if(void 0===e[i].push){const t=e[i];e[i]=[],e[i].push(t)}e[i].push(this.xml_to_json(r))}}return e}}class Ir{constructor(){}static get_random_color(){const t=[0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"];let e="#";for(let s=0;s<6;s++){e+=t[Math.floor(Math.random()*t.length)]}return e}static capitalize(t){const e=t.split(" ");for(let t=0;t<e.length;t++)e[t]=e[t][0].toUpperCase()+e[t].substr(1);return e.join(" ")}static capitalize_first_letter(t){return t.charAt(0).toUpperCase()+t.slice(1)}static snake_to_camelcase(t){return t.toLowerCase().replace(/[-_][a-z0-9]/g,(t=>t.slice(-1).toUpperCase()))}}class Dr{constructor(){}time_str_to_ms(t){const e=t.split(":");let s=Number(e[0]);s=60*s*60*1e3;let r=Number(e[1]);r=60*r*1e3;let i=Number(e[2]);return i*=1e3,s+r+i}}class Qr{constructor(){}static is_int(t){return Number(t)===t&&t%1==0}static is_float(t){return Number(t)===t&&t%1!=0}static is_number(t){return this.is_int(t)||this.is_float(t)}static is_json(t){try{JSON.parse(t)}catch(t){return!1}return!0}}class Vr extends n{constructor(){const{colorNode:t,opacityNode:e}=function(t="#4a4a4a"){const e=ut(new r(t)),s=(t=>{const e=Jt(t),s=Xt(xt(0),e.mul(1.5),t);return qt(qt(s.x,s.y),s.z)})(At("barycentric","vec3").add(xt(1,1,0)));return{colorNode:gt(e,xt(0),s),opacityNode:s.oneMinus().mul(.2)}}("#4a4a4a"),s=new se({transparent:!0,depthWrite:!1});s.colorNode=t,s.opacityNode=e;const i=new o(100,100,100,100);super(Or.convert_to_non_indexed_geometry(i),s),this.rotation.x=-1.57}}class Yr extends ee{constructor(){super();const t=ut(.2),e=ut(new r("#FF0000"));this.uniforms={_Thickness:t,_Length:ut(0),_ElapsedTime:ut(0),_Color:e};const s=At("orientation","float"),i=Gt.mul(dt(At("next_position","vec3"),1)).xyz,n=Gt.mul(dt(At("previous_position","vec3"),1)).xyz,o=zt(n.sub(i)),a=zt(Yt(o,zt(te.sub(i)))),h=Gt.mul(dt(pt,1)).xyz.add(a.mul(t.mul(.5)).mul(s));this.vertexNode=Rt.mul(Ct).mul(dt(h,1));const _=jt(s);this.fragmentNode=dt(e.mul(vt(1).sub(Mt(_)).mul(.5).add(.5)),1),this.transparent=!0,this.depthWrite=!1,this.fog=!1}}function Wr(){const t=new L;return t.setAttribute("position",new at(new Float32Array([]),3)),t.setAttribute("next_position",new at(new Float32Array([]),3)),t.setAttribute("previous_position",new at(new Float32Array([]),3)),t.setAttribute("orientation",new at(new Float32Array([]),1)),t.setAttribute("coverage",new at(new Float32Array([]),1)),t}class Xr extends n{constructor(t){const e=Wr(),s=new Yr;super(e,s),this.material=s,t&&this.setup(t)}setup(t){const e=[],s=[],r=[],i=[],n=[];let o=0;for(let a=0;a<t.length;a++){e.push(t[a].x),e.push(t[a].y),e.push(t[a].z),i.push(1),e.push(t[a].x),e.push(t[a].y),e.push(t[a].z),i.push(-1);const h=this.__get_next_position(t,a);s.push(h.x),s.push(h.y),s.push(h.z),s.push(h.x),s.push(h.y),s.push(h.z);const _=this.__get_previous_position(t,a);r.push(_.x),r.push(_.y),r.push(_.z),r.push(_.x),r.push(_.y),r.push(_.z),n.push(o),n.push(o),a<t.length-1&&(o+=t[a].distanceTo(h))}const a=new Float32Array(e),h=new Float32Array(s),_=new Float32Array(r),l=new Float32Array(i),c=new Float32Array(n),u=[];for(let t=0;t<(a.length/3-2)/2;t++){const e=2*t+1;u.push(e),u.push(e+1),u.push(e-1),u.push(e),u.push(e+2),u.push(e+1)}if(a.length/3!==this.geometry.getAttribute("position").count){const t=this.geometry;this.geometry=Wr(),this.geometry.setIndex(u),t.dispose()}this.geometry.getAttribute("position").copy(new at(a,3)),this.geometry.getAttribute("next_position").copy(new at(h,3)),this.geometry.getAttribute("previous_position").copy(new at(_,3)),this.geometry.getAttribute("orientation").copy(new at(l,1)),this.geometry.getAttribute("coverage").copy(new at(c,1)),this.geometry.getAttribute("position").needsUpdate=!0,this.geometry.getAttribute("next_position").needsUpdate=!0,this.geometry.getAttribute("previous_position").needsUpdate=!0,this.geometry.getAttribute("orientation").needsUpdate=!0,this.geometry.getAttribute("coverage").needsUpdate=!0,this.material.uniforms._Length.value=o,this._length=o,this.accumulated_length=o}set thickness(t){this.material.uniforms._Thickness.value=t}get thickness(){return this.material.uniforms._Thickness.value}__get_previous_position(t,e){return 0===e?t[1].clone().sub(t[0]).multiplyScalar(-1).add(t[0]):t[e-1]}__get_next_position(t,e){return e===t.length-1?t[t.length-2].clone().sub(t[t.length-1]).multiplyScalar(-1).add(t[t.length-1]):t[e+1]}update(){}distance(){return this.accumulated_length}total_length(){return this.accumulated_length}dispose(){this.geometry.dispose(),this.material.dispose(),this.parent&&this.parent.remove(this),super.dispose()}set color(t){this.material.uniforms._Color.value.set(t)}get color(){return this.material.uniforms._Color.value}copy_color(t){this.material.uniforms._Color.value.copy(t)}}class Hr extends n{constructor(t,e){super(t,e),this.material=e;const s=this;this.onBeforeRender=()=>{"update"in s.material&&"function"==typeof s.material.update&&s.material.update()}}}class Zr extends ts{constructor(t,e=new l,s=new l(1,1,1),r="linear"){super(r),this.attribute_name=t,this.from=e,this.to=s}update(t,e){const s=this.from.clone();s.lerp(this.to,this.easing_function(e)),t[this.attribute_name].copy(s)}}class Kr extends ge{constructor(t,e,s){super(t,e,s),this.loader=new ae}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Jr extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Gr extends ge{constructor(t,e,s){super(t,e,s),this.loader=new he}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ti extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?fetch(this.url).then((e=>{e.json().then((e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}))})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ei extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _e}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class si extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,this.parse_path(e)),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}parse_path(t){const e=t.split("\n");""===e[e.length-1]&&e.pop();const s=[];for(let t=0;t<e.length;t+=3){const r=parseFloat(e[t+0]),i=parseFloat(e[t+1]),n=parseFloat(e[t+2]);s.push(new l(r,i,n))}return s}}class ri extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()}),(()=>{}),(t=>{this.__set_error(t),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ii extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(e,s){void 0===e.resources_by_url[this.url]?s.blob().then((s=>{const r=new t,i=URL.createObjectURL(s),n=new Image;n.src=i,n.onload=()=>{r.image=n,r.needsUpdate=!0,e.set_resource(this.resource_id,this.url,r),this.__update_downloaded_bytes(1,1),this.__loading_ended()},n.onerror=()=>{console.error("Error loading texture. Maybe the resource is not an image?",this.url)}})):(e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ni extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(t,e){void 0===t.resources_by_url[this.url]?e.blob().then((e=>{t.set_resource(this.resource_id,this.url,URL.createObjectURL(e)),this.__update_downloaded_bytes(1,1),this.__loading_ended()})):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class oi{constructor(t){this.name=t,this.resources={},this.resources_by_url={}}set_resource(t,e,s){Object.keys(this.resources_by_url).includes(e)?this.resources[t]=this.resources_by_url[e]:(this.resources[t]=s,this.resources_by_url[e]=s)}get_resource(t){return this.resources[t]}get(t){return this.resources[t]}}class ai{constructor(t){this.resource_loaders=[],this.batch_name=t||"unnamed batch"}add_loader(t){this.resource_loaders.push(t)}load(t){for(let e=0;e<this.resource_loaders.length;e++)this.resource_loaders[e].load(t||oi)}get loading_finished(){let t=!0;for(let e=0;e<this.resource_loaders.length;e++)t=t&&this.resource_loaders[e].has_finished;return t}get has_errors(){let t=!1;for(let e=0;e<this.resource_loaders.length;e++)t=t||this.resource_loaders[e].has_error;return t}print_errors(){console.error("Batch <"+this.batch_name+"> could not load successfully");for(let t=0;t<this.resource_loaders.length;t++)this.resource_loaders[t].has_error&&this.resource_loaders[t].print_error()}get_progress(){return this.get_loaded_bytes()/this.get_total_bytes()}get_loaded_bytes(){let t=1;for(let e=0;e<this.resource_loaders.length;e++)t+=this.resource_loaders[e].loaded_bytes;return t}get_total_bytes(){let t=1;for(let e=0;e<this.resource_loaders.length;e++)t+=this.resource_loaders[e].total_bytes;return t}}class hi{start(){this.finished=!1}update(){this.finished=!0}}class _i{constructor(){}on_enter(t){}on_exit(t){}update(t){}}class li extends _i{constructor(){super(),this.rotation_speed=new e,this.vector_forward_axis=new l(0,0,-1),this.tmp_forward=new l,this.tmp_quat=new z,this.tmp_camera_target_pos=new l}on_enter(t){t.reference_rotation.copy(t.camera.quaternion)}update(t){t.camera.quaternion.copy(t.reference_rotation),this.tmp_forward.copy(this.vector_forward_axis);const e=this.tmp_forward.applyQuaternion(t.camera.quaternion);t.reference_zoom=Ke.clamp(t.reference_zoom,t.min_zoom,t.max_zoom),t.camera.position.copy(t.reference_position).sub(e.multiplyScalar(t.reference_zoom)),t.__last_reference_position.copy(t.reference_position)}get_target_camera_pos(t){this.tmp_quat.copy(t.reference_rotation),this.tmp_forward.copy(this.vector_forward_axis);const e=this.tmp_forward.applyQuaternion(this.tmp_quat),s=Ke.clamp(t.reference_zoom,t.min_zoom,t.max_zoom);return this.tmp_camera_target_pos.copy(t.reference_position).sub(e.multiplyScalar(s)),this.tmp_camera_target_pos}}class ci{constructor(){}on_enter(t){}on_exit(t){}update(t){}lock_zoom(){}unlock_zoom(){}}class ui{constructor(t){this.input=t,this.camera=void 0,this.camera_initial_rot=void 0,this.camera_initial_pos=void 0,this.current_state=new ci,this.current_mode=new li,this.point_of_interest=new l,this.normalized_zoom=0,this.vector_up_axis=new l(0,1,0),this.vector_right_axis=new l(1,0,0),this.vector_forward_axis=new l(0,0,1),this.tmp_forward=this.vector_forward_axis.clone(),this.tmp_right=this.vector_right_axis.clone(),this.tmp_dir=new l,this.zoom=10,this.reference_zoom=10,this.orientation=27,this.tilt=70,this.reference_rotation=new z,this.reference_position=new l,this.__last_reference_position=new l,this.tmp_size=new l,this.tmp_quat=new z,this.min_zoom=1,this.max_zoom=400,this.current_tilt=0,this.current_orientation=0,this.current_azimuth=0,this.projection_plane_helper=new lt(new X,1,16776960),this.input_enabled=!0,this.raised_look_at_position=new l(-82.2986094900191,0,39.7538467209173),this.use_raised_look_at_direction=0}enable(){this.input_enabled=!0}disable(){this.input_enabled=!1}set_camera(t){this.camera=t,this.camera_initial_rot=t.quaternion.clone(),this.camera_initial_pos=t.position.clone()}set_state(t){this.current_state.on_exit(this),this.current_state=t,this.current_state.on_enter(this)}set_mode(t){this.current_mode.on_exit(this),this.current_mode=t,this.current_mode.on_enter(this)}set_normalized_zoom(t){this.normalized_zoom=Ke.clamp(t,0,1)}update_normalized_zoom(t,e){const s=this.camera.position.distanceTo(this.reference_position);this.normalized_zoom=Ke.linear_map(s,t,e,1,0),this.normalized_zoom=Ke.clamp(this.normalized_zoom,0,1)}update(){this.debug_box&&this.debug_box.position.copy(this.reference_position),this.current_state.update(this),this.current_mode.update(this),this.update_normalized_zoom(this.min_zoom,this.max_zoom)}set_idle(){this.set_state(new ci)}camera_is_zoomed_out(){return this.normalized_zoom<.2}set_rotation(t,e,s){this.old_orientation=this.current_orientation,this.current_tilt=t??this.current_tilt,this.current_orientation=e??this.current_orientation,this.current_azimuth=s??this.current_azimuth,this.set_quaternion(this.build_rotation(this.current_tilt,this.current_orientation))}set_rotation_delta(t,e,s=0){this.lerp_rotation(this.current_tilt,this.current_tilt+t,this.current_orientation,this.current_orientation+e,this.current_azimuth,this.current_azimuth+s,1)}lerp_tilt(t,e,s){this.lerp_rotation(t,e,this.current_orientation,this.current_orientation,this.current_azimuth,this.current_azimuth,s)}set_quaternion(t){const e=2*Math.atan2(t.x,t.w),s=2*Math.atan2(t.y,t.w);this.current_orientation=Ke.euclideanModulo(Ke.radToDeg(s),360),this.current_tilt=180-Ke.euclideanModulo(180+Ke.radToDeg(e),360),this.reference_rotation.copy(t)}lerp_quaternion(t,e){this.set_quaternion(this.reference_rotation.clone().slerp(t,e))}lerp_orientation(t,e,s){this.lerp_rotation(this.current_tilt,this.current_tilt,t,e,this.current_azimuth,this.current_azimuth,s)}lerp_azimuth(t,e,s){}lerp_rotation(t,e,s,r,i,n,o){const a=this.build_rotation(t,s),h=this.build_rotation(e,r);a.slerp(h,o),this.set_quaternion(a)}build_rotation(t,e){e<0&&(e+=360);const s=(new z).setFromAxisAngle(this.vector_up_axis,e%360/360*Math.PI*2),r=(new z).setFromAxisAngle(this.vector_right_axis,-t/360*Math.PI*2);return s.multiply(r)}translate_forward(t){this.tmp_forward.copy(this.vector_forward_axis),this.tmp_forward.applyQuaternion(this.camera.quaternion),this.reference_position.add(this.tmp_forward.multiplyScalar(t))}translate_right(t){this.tmp_right.copy(this.vector_right_axis),this.tmp_right.applyQuaternion(this.camera.quaternion),this.reference_position.add(this.tmp_right.multiplyScalar(t))}focus_on_bounding_box(t,e=1){const s=new l;s.copy(t.max).sub(t.min);const r=t.min.clone(),i=r.clone().add(new l(s.x,0,0)),n=r.clone().add(new l(0,s.y,0)),o=r.clone().add(new l(0,0,s.z)),a=r.clone().add(new l(s.x,0,s.z)),h=r.clone().add(new l(0,s.y,s.z)),_=t.max.clone(),c=r.clone().add(new l(s.x,s.y,0));this.focus_camera_on_points([r,i,n,o,a,h,_,c],e)}get_zoom_to_focus_on_points(t,e){if(this.__is_orthographic())return this.__fit_orthographic(this.reference_rotation,t,e).zoom;const s=this.reference_zoom,r=(new l).copy(this.reference_position);this.focus_camera_on_points(t,e);const i=this.reference_zoom;return this.reference_zoom=s,this.reference_position.copy(r),i}get_target_pos_to_focus_on_points(t,e){if(this.__is_orthographic())return this.__fit_orthographic(this.reference_rotation,t,e).center;const s=this.reference_zoom,r=(new l).copy(this.reference_position);this.focus_camera_on_points(t,e);const i=this.reference_position.clone();return this.reference_zoom=s,this.reference_position.copy(r),i}focus_camera_on_sphere(t,e){this.__is_orthographic()?(this.__set_orthographic_zoom(this.get_zoom_to_sphere(t,e)),this.reference_zoom=this.__get_orthographic_distance(t.radius)):this.reference_zoom=this.get_zoom_to_sphere(t,e),this.reference_position.copy(t.center)}get_zoom_to_sphere(t,e){if(this.__is_orthographic())return this.__get_orthographic_zoom(2*t.radius,2*t.radius);const s=this.camera.fov/2*Math.PI/180,r=2*Math.atan(Math.tan(s)*this.camera.aspect)/2,i=t.radius/Math.tan(s),n=t.radius/Math.tan(r);return Math.max(Math.abs(n),Math.abs(i))}hide_projected_points(){for(let t=0;t<this.projected_points.length;t++)this.projected_points[t].visible=!1}show_projected_points(t){this.hide_projected_points();for(let e=0;e<t.length;e++)this.projected_points[e].visible=!0,this.projected_points[e].position.copy(t[e])}show_plane_projection(t,e=1){this.projection_plane_helper.plane=t,this.projection_plane_helper.size=e,this.projection_plane_helper.updateMatrixWorld(),this.projection_plane_helper.visible=!0}show_sphere_projection(t){this.projection_sphere_helper.scale.set(t.radius,t.radius,t.radius),this.projection_sphere_helper.position.copy(t.center),this.projection_sphere_helper.visible=!0}fit_points(t,e,s=1){if(this.camera.isPerspectiveCamera){const r=new l(0,0,-1).applyQuaternion(t),i=r.clone().multiplyScalar(-1),n=new tr,o=ye.aspect_ratio,a=n.fit_points(e,t,this.camera.fov*s,o),h=(new F).setFromPoints(e),_=new l;h.getCenter(_);const c=(new X).setFromNormalAndCoplanarPoint(i,_),u=new Z(a,r),d=new l;u.intersectPlane(c,d);return{zoom:a.distanceTo(d),reference_position:d,camera_position:a}}{const r=this.__fit_orthographic(t,e,s),i=new l(0,0,1).applyQuaternion(t);return{zoom:r.zoom,reference_position:r.center,camera_position:r.center.clone().add(i.multiplyScalar(r.distance))}}}focus_camera_on_points(t,e=1){if(this.camera.isPerspectiveCamera){const s=new l(0,0,-1).applyQuaternion(this.reference_rotation),r=s.clone().multiplyScalar(-1),i=new tr,n=ye.aspect_ratio,o=i.fit_points(t,this.reference_rotation,this.camera.fov*e,n),a=(new F).setFromPoints(t),h=new l;a.getCenter(h);const _=(new X).setFromNormalAndCoplanarPoint(r,h),c=new Z(o,s),u=new l;c.intersectPlane(_,u);const d=o.distanceTo(u);this.reference_zoom=d,this.reference_position.copy(u)}else{const s=this.__fit_orthographic(this.reference_rotation,t,e);this.__set_orthographic_zoom(s.zoom),this.reference_zoom=s.distance,this.reference_position.copy(s.center)}}get_current_tilt(){return this.current_tilt}get_current_orientation(){return this.current_orientation}get_current_azimuth(){return this.current_azimuth}__get_zoom_to_show_rect(t,e,s=1){if(this.__is_orthographic())return this.__get_orthographic_zoom(2*t,2*e,s);const r=Ke.degToRad(this.camera.fov/2),i=2*Math.atan(Math.tan(r)*this.camera.aspect)/2,n=e/Math.tan(r*s),o=t/Math.tan(i*s);return Math.max(Math.abs(o),Math.abs(n))}__is_orthographic(){return!0===this.camera.isOrthographicCamera}__fit_orthographic(t,e,s){const r=(new Gs).get_view_bounds(e,t);return{zoom:this.__get_orthographic_zoom(r.size.x,r.size.y,s),center:r.center,distance:this.__get_orthographic_distance(r.size.z/2)}}__get_orthographic_distance(t){return(new Gs).get_distance_to_fit_depth(this.camera,t,this.reference_zoom)}__get_orthographic_zoom(t,e,s=1){return(new Gs).get_zoom_to_fit_size(this.camera,t,e,s)}__set_orthographic_zoom(t){const e=this.camera;e.zoom=t,e.updateProjectionMatrix()}}class di extends ci{constructor(t){super(),this.input=t,this.last_point=new e,this.rotation_velocity=new e,this.forward_dir=0,this.right_dir=0,this.y_dir=0,this.azimuth_dir=0,this.shift_key=!1}on_enter(t){}on_exit(t){}update(t){this.__check_key_down(),this.__check_key_up()}__show_camera_position(t){this.input.left_mouse_button_released&&console.log({x:t.reference_position.x,y:t.reference_position.y,z:t.reference_position.z,orientation:t.current_orientation,tilt:t.current_tilt,azimuth:t.current_azimuth,zoom:t.reference_zoom,fov:t.camera.fov})}__zoom_camera(t){t.reference_zoom+=.5*this.input.zoom_delta}__rotate_camera(t){if(this.input.left_mouse_button_down&&1===this.input.pointer_count){const t=new e(-24*this.input.NDC_delta.x,-8*this.input.NDC_delta.y);t.multiplyScalar(60*ns.delta_time),this.rotation_velocity.add(t)}t.set_rotation_delta(this.rotation_velocity.y,this.rotation_velocity.x);const s=1-Math.exp(-5*ns.delta_time);this.rotation_velocity.lerp(new e(0,0),s)}__move_camera(t){if(t.translate_forward(this.forward_dir),t.translate_right(this.right_dir),t.reference_position.y-=this.y_dir,this.input.right_mouse_button_pressed&&this.last_point.copy(this.input.NDC),this.input.right_mouse_button_down){const e=er.get_plane_intersection(t.reference_position,void 0,this.last_point).clone(),s=er.get_plane_intersection(t.reference_position,void 0,this.input.NDC).clone();s.sub(e),t.reference_position.x-=s.x,t.reference_position.y-=s.y,t.reference_position.z-=s.z,this.last_point.copy(this.input.NDC)}}__check_key_down(){const t=.12;this.input.keyboard.is_key_down("KeyW")&&(this.forward_dir=-.12),this.input.keyboard.is_key_down("KeyS")&&(this.forward_dir=t),this.input.keyboard.is_key_down("KeyA")&&(this.right_dir=-.12),this.input.keyboard.is_key_down("KeyD")&&(this.right_dir=t),this.input.keyboard.is_key_down("KeyQ")&&(this.azimuth_dir=.48),this.input.keyboard.is_key_down("KeyE")&&(this.azimuth_dir=-.48),this.input.keyboard.is_key_down("KeyZ")&&(this.y_dir=t),this.input.keyboard.is_key_down("KeyC")&&(this.y_dir=-.12),this.input.keyboard.is_key_down("ShiftLeft")&&(this.shift_key=!0)}__check_key_up(){this.input.keyboard.is_key_released("KeyW")&&(this.forward_dir=0),this.input.keyboard.is_key_released("KeyS")&&(this.forward_dir=0),this.input.keyboard.is_key_released("KeyA")&&(this.right_dir=0),this.input.keyboard.is_key_released("KeyD")&&(this.right_dir=0),this.input.keyboard.is_key_released("KeyQ")&&(this.azimuth_dir=0),this.input.keyboard.is_key_released("KeyE")&&(this.azimuth_dir=0),this.input.keyboard.is_key_released("KeyZ")&&(this.y_dir=0),this.input.keyboard.is_key_released("KeyC")&&(this.y_dir=0),this.input.keyboard.is_key_released("ShiftLeft")&&(this.shift_key=!1)}}export{ci as AbstractCameraState,ge as AbstractLoader,He as AbstractScene,Ze as ActionEvent,ts as ActionInterpolator,Je as ActionSequencer,rs as ActionSequencerBuilder,ue as AddMaterial,ls as ApplicationView,ws as ArrayUtilities,Es as Arrow,qe as AsyncAbstractLoader,Pe as AsyncAudiosLoader,Le as AsyncObjectsLoader,Ue as AsyncTextureLoader,Qe as AsyncTexturesLoader,je as AudioLoader,le as BaseApplication,me as BaseRender,Be as BasisLoader,ce as BlitNodeMaterial,dr as BloomRender,hr as Blurrer,$e as Browser,Zs as CSSAnimator,ps as CameraBridge,ui as CameraController,fe as CameraManager,_i as CameraMovementMode,er as CameraUtilities,cs as CanvasDrawer,ds as Capabilities,ms as CaptureService,di as CommonCameraState,hi as Compilator,ys as ConsoleBuffer,Is as Cube,Ee as CubemapLoader,Kr as DAELoader,Vs as Debug,Rs as DebugDrawer,mr as DebugNormalsRender,fr as DeferredRender,Ws as DevBridge,ss as DrawIOAnimationSheet,cr as DualFilteringBlurMaterial,ur as DualFilteringBlurrer,Ge as EasingFunctions,Jr as FileLoader,Gr as FontLoader,Nr as FrustumPointFitter,Ne as GLTFDRACOLoader,Oe as GLTFLoader,kr as GaussianBlurrer,Or as GeometryUtilities,Re as Graphics,Vr as Grid,Ie as HDRCubeTextureLoader,De as HDRTextureLoader,Lr as HTMLUtilities,We as HighQualityLoadingState,qr as HorizontalPlane,$r as ImageUtilities,li as ImmediateMode,sr as Initializer,js as InputSynthesizer,ti as JSONLoader,rr as KeyboardInput,Xr as Line,Ye as LoadingState,Ur as MeshSampler,Br as ModelUtilities,wr as NormalAORender,xr as NormalRender,es as NumberInterpolator,ei as OBJLoader,Ke as OMath,Ks as OS,ye as OScreen,Er as ObjectUtilities,ir as OrthographicCamera,Gs as OrthographicFrustumPointFitter,Fs as PerformanceProbe,Bs as PerspectiveCamera,tr as PerspectiveFrustumPointFitter,si as PointArrayLoader,Xe as RegularLoadingState,Cr as RenderLoop,qs as RenderModeRegistry,ai as ResourceBatch,Fe as ResourceContainer,Ms as SDFTextBatch,Ps as SceneEditor,Ns as SceneInspector,be as SceneManager,jr as Screen,us as SimpleTextDrawer,Ds as Sphere,Ir as StringUtilities,$s as Text2D,ri as TextLoader,ii as TextureLoader,ns as Time,Dr as TimeUtilities,hs as TransitionManager,is as TransitionTable,pe as UnrealBloomComposeMaterial,Ar as UnrealBloomRender,Hr as UpdatableMaterialMesh,Sr as VRRender,Qr as Validation,Zr as VectorInterpolator,Pr as VerticalPlane,ni as VideoLoader,Fr as ViewComponent,Rr as ViewComponentManager,_s as ViewManager,Os as ViewNavigator,ks as WorldImage};
1
+ import{Texture as t,Vector2 as e,NoBlending as s,Color as r,Scene as i,Mesh as n,PlaneGeometry as o,OrthographicCamera as a,Vector4 as h,RenderTarget as _,Vector3 as l,PositionalAudio as c,Audio as u,AudioContext as d,SRGBColorSpace as p,NoColorSpace as m,CubeTextureLoader as g,CanvasTexture as f,UVMapping as y,ClampToEdgeWrapping as b,NearestFilter as w,DoubleSide as x,LinearFilter as v,Quaternion as z,Matrix4 as M,Box2 as T,InstancedBufferGeometry as k,Float32BufferAttribute as A,InstancedInterleavedBuffer as S,DynamicDrawUsage as R,InterleavedBufferAttribute as C,Sphere as j,Box3 as F,TextureLoader as q,Object3D as P,LineBasicMaterial as N,AlwaysDepth as O,BufferGeometry as L,Line as $,LinearMipMapLinearFilter as U,PerspectiveCamera as E,CylinderGeometry as B,ConeGeometry as I,MeshBasicMaterial as D,BoxGeometry as Q,SphereGeometry as V,Box3Helper as W,CatmullRomCurve3 as Y,Plane as X,Line3 as H,Ray as Z,CustomBlending as K,OneFactor as J,AdditiveBlending as G,BackSide as tt,DataTexture as et,RGBAFormat as st,RepeatWrapping as rt,HalfFloatType as it,UnsignedByteType as nt,LinearSRGBColorSpace as ot,BufferAttribute as at,Skeleton as ht,FileLoader as _t,PlaneHelper as lt}from"three";import{texture as ct,uniform as ut,vec4 as dt,positionGeometry as pt,uv as mt,mix as gt,Fn as ft,fract as yt,vec2 as bt,dot as wt,vec3 as xt,float as vt,normalize as zt,abs as Mt,positionView as Tt,normalView as kt,attribute as At,mat4 as St,cameraProjectionMatrix as Rt,cameraViewMatrix as Ct,varying as jt,max as Ft,min as qt,length as Pt,dFdx as Nt,dFdy as Ot,clamp as Lt,modelViewMatrix as $t,colorSpaceToWorking as Ut,packNormalToRGB as Et,normalWorldGeometry as Bt,screenUV as It,modelViewPosition as Dt,saturate as Qt,uniformArray as Vt,cross as Wt,Loop as Yt,smoothstep as Xt,step as Ht,floor as Zt,ivec2 as Kt,fwidth as Jt,modelWorldMatrix as Gt,cameraPosition as te}from"three/tsl";import{NodeMaterial as ee,MeshBasicNodeMaterial as se}from"three/webgpu";import{GLTFLoader as re}from"three/examples/jsm/loaders/GLTFLoader.js";import{HDRCubeTextureLoader as ie}from"three/examples/jsm/loaders/HDRCubeTextureLoader.js";import{HDRLoader as ne}from"three/examples/jsm/loaders/HDRLoader.js";import*as oe from"three/examples/jsm/utils/BufferGeometryUtils.js";export{oe as BufferGeometryUtils};import{ColladaLoader as ae}from"three/examples/jsm/loaders/ColladaLoader.js";import{FontLoader as he}from"three/examples/jsm/loaders/FontLoader.js";import{OBJLoader as _e}from"three/examples/jsm/loaders/OBJLoader.js";class le{on_post_start(){}on_enter(t){}on_exit(t){}before_update(){}update(){}fixed_update(){}on_post_render(){}on_pre_render(){}on_frame_end(){}dispose(){}}class ce extends ee{constructor(){super(),this.uv_by_texture=new Map,this.top_left_origin_by_texture=new Map,this.uniforms={_MainTex:ct(new t),_Resolution:ut(new e(0,0)),_TargetResolution:ut(new e(0,0))},this.vertexNode=dt(pt.xy.mul(2),0,1),this.fragmentNode=this.sample_main_tex(),this.depthWrite=!1,this.depthTest=!1,this.blending=s}uv_for(t){let e=this.uv_by_texture.get(t);return void 0===e&&(e=this.texture_uv_at(t,mt()),this.uv_by_texture.set(t,e)),e}texture_uv_at(t,e){let s=this.top_left_origin_by_texture.get(t);return void 0===s&&(s=ut(!1).onObjectUpdate(()=>{return!0===(e=t.value).isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture;var e}),this.top_left_origin_by_texture.set(t,s)),s.select(e.flipY(),e)}sample(t,e){const s=this.uv_for(t);return t.sample(e?s.add(e):s)}sample_main_tex(t){return this.sample(this.uniforms._MainTex,t)}}class ue extends ce{constructor(e=!1){super();const s=ct(new t);this.uniforms._SecondTex=s,this.fragmentNode=this.sample_main_tex().add(this.sample(s))}set_add_texture(t){this.uniforms._SecondTex.value=t}}const de=[1,.8,.6,.4,.2];class pe extends ce{constructor(e,s=!1){super();const i=ut(1),n=ut(1),o=[];this.uniforms.bloomStrength=i,this.uniforms.bloomRadius=n;let a=dt(0);for(let s=0;s<e;s++){const e=ct(new t),i=new r("#FFFFFF"),h=de[s]??de[de.length-1],_=gt(h,1.2-h,n);this.uniforms[`blurTexture${s+1}`]=e,o.push(i),a=a.add(this.sample(e).mul(dt(ut(i),1)).mul(_))}this.uniforms.bloomTintColors={value:o},this.fragmentNode=a.mul(i)}set_blur_texture_0(t){this.uniforms.blurTexture1.value=t}set_blur_texture_1(t){this.uniforms.blurTexture2.value=t}set_blur_texture_2(t){this.uniforms.blurTexture3.value=t}set_blur_texture_3(t){this.uniforms.blurTexture4.value=t}set_blur_texture_4(t){this.uniforms.blurTexture5.value=t}set_bloom_strength(t){this.uniforms.bloomStrength.value=t}set_bloom_radius(t){this.uniforms.bloomRadius.value=t}set_tint_color_0(t){this.uniforms.bloomTintColors.value[0].set(t)}set_tint_color_1(t){this.uniforms.bloomTintColors.value[1].set(t)}set_tint_color_2(t){this.uniforms.bloomTintColors.value[2].set(t)}set_tint_color_3(t){this.uniforms.bloomTintColors.value[3].set(t)}set_tint_color_4(t){this.uniforms.bloomTintColors.value[4].set(t)}}class me{constructor(){}render(t){}on_enter(t,e){}on_exit(t,e){}resize(){}dispose(){}}class ge{constructor(t,e,s=1){this.resource_id=t,this.url=e,this.loaded_bytes=0,this.total_bytes=s,this.has_finished=!1,this.has_error=!1,this.error_message="none"}__update_downloaded_bytes(t,e){t=this.is_number(t)?t:1,e=this.is_number(e)?e:1,this.loaded_bytes=t,e>0&&(this.total_bytes=e),this.loaded_bytes>this.total_bytes&&console.warn("Total bytes is smaller than loaded ones. Please set total bytes by hand to:",this.url)}__loading_ended(){this.has_finished=!0}__set_error(t){this.has_error=!0,this.error_message=t}print_error(){console.error("Error while loading "+this.resource_id+"\n\t path: "+this.url+"\n\t\t"+this.error_message)}load(t){if(void 0===t.resources_by_url[this.url]){const e="default";fetch(this.url,{method:"GET",mode:"cors",cache:e,credentials:"same-origin",redirect:"follow"}).then(this.on_progress.bind(this,t)).catch(this.__on_error.bind(this))}else t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}async on_progress(t,e){const s=e.clone(),r=e.body.getReader(),i=+e.headers.get("Content-Length");let n=0;for(;;){const{done:t,value:e}=await r.read();if(t)break;n+=e.length,this.__update_downloaded_bytes(n,i)}e.ok?this.on_preloaded_finished(t,s):(this.__set_error(`${e.status}: ${e.statusText}`),this.__loading_ended())}on_preloaded_finished(t,e){}__on_error(t){console.error(t)}is_int(t){return Number(t)===t&&t%1==0}is_float(t){return Number(t)===t&&t%1!=0}is_number(t){return this.is_int(t)||this.is_float(t)}}const fe=new class{init(){this._current=void 0,this._spectator=void 0}set current(t){this._current=t}get current(){return this._current}set spectator(t){this._spectator=t}get spectator(){return this._spectator}};const ye=new class{init(){this.width=1,this.height=1,this.position=new e,this.render_width=1,this.render_height=1,this.width_height=new e(this.width,this.height),this.dpr=1,this.pixel_size=new e(1/this.width,1/this.height)}update_position(t,e){this.position.set(t,e)}update(){this.size_changed=!1}update_size(t,s){this.width=t,this.height=s,this.pixel_size=new e(1/this.width,1/this.height),this.width_height.x=t,this.width_height.y=s,this.render_width=t*this.dpr,this.render_height=s*this.dpr,this.size_changed=!0}apply_pixel_density_v2(t){return t.multiplyScalar(1/this.dpr),t}apply_pixel_density(t){return t*(1/this.dpr)}get_pixel_size(){return this.pixel_size}get aspect_ratio(){return this.width/this.height}get portrait(){return this.width<this.height}};const be=new class{init(t){this._current=t}add_scene(t){}get current(){return this._current}set current(t){this._current=t}dispose(){for(this.current.traverse(t=>{if(t.geometry){t.geometry.dispose();const e=t.material;Array.isArray(e)?e.forEach(t=>t.dispose()):e.dispose()}});this.current.children.length>0;)this.current.remove(this.current.children[0])}};class we{constructor(t){this.renderer=t,this._blit_scene=new i,this._blit_material=new ce,this._blit_quad=new n(new o(1,1),this._blit_material),this._blit_scene.add(this._blit_quad),this._blit_camera=new a(-1,1,1,-1,-1e4,1e4)}blit(t,e){this._blit_quad.material=this._blit_material;const s=!0===t.isRenderTarget?t.texture:t,r=!0===t.isRenderTarget?t.width:t.image.width,i=!0===t.isRenderTarget?t.height:t.image.height;this._blit_quad.material.uniforms._MainTex.value=s,this._blit_quad.material.uniforms._Resolution.value.set(r,i),e?this._blit_quad.material.uniforms._TargetResolution.value.set(e.width,e.height):this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value),this.__render(e)}material_pass(t,e){this._blit_quad.material=t,this.__render(e)}blit_with_material(t,e,s){const r=!0===t.isRenderTarget?t.texture:t,i=!0===t.isRenderTarget?t.width:t.image.width,n=!0===t.isRenderTarget?t.height:t.image.height;this._blit_quad.material=s,this._blit_quad.material.uniforms._MainTex.value=r,this._blit_quad.material.uniforms._Resolution.value.set(i,n),e?this._blit_quad.material.uniforms._TargetResolution.value.set(e.width,e.height):this.renderer.getSize(this._blit_quad.material.uniforms._TargetResolution.value),this.__render(e)}blit_clear_with_material(t,e){this._blit_quad.material=e,this.__render(t)}dispose(){this._blit_quad.geometry.dispose(),this._blit_quad.material.dispose()}__render(t){const e=void 0===t?null:t,s=this.renderer.getRenderTarget();this.renderer.setRenderTarget(e),this.renderer.render(this._blit_scene,this._blit_camera),this.renderer.setRenderTarget(s)}}const xe=1.7777,ve=ft(([t])=>{const e=yt(bt(1,255).mul(t));return bt(e.x.sub(e.y.div(255)),e.y)}),ze=ft(([t])=>wt(t,bt(1,1/255))),Me=ft(([t])=>t.xy.div(t.z.add(1)).div(xe).mul(.5).add(.5)),Te=ft(([t])=>{const e=xt(t.mul(3.5554).sub(xe),1),s=vt(2).div(wt(e,e));return xt(e.xy.mul(s),s.sub(1))});class ke extends ce{constructor(t,e){super();const s=ut(new h(t,e.x,e.y,e.z));this.uniforms._DepthNormal=s,this.fragmentNode=dt(ve(s.x),Me(zt(s.yzw)))}}class Ae extends ee{constructor(){super();const t=ut(1);this.uniforms={_FarPlane:t},this.fragmentNode=dt(ve(Mt(Tt.z).div(t)),Me(zt(kt))),this.blending=s}set far_plane(t){this.uniforms._FarPlane.value=t}get far_plane(){return this.uniforms._FarPlane.value}}class Se{constructor(){this.RT=new _(ye.width,ye.height),this.clear_depth_normal_mat=new ke(1,new l(0,0,1)),this.depth_normal_material=new Ae}render(t){this.__resize_RT_if_necessary(),t.clear(this.RT,void 0,!0,!0),t.blit_clear_with_material(this.RT,this.clear_depth_normal_mat),this.depth_normal_material.far_plane=fe.current.far,t.render(void 0,void 0,this.RT,this.depth_normal_material)}__resize_RT_if_necessary(){this.RT.width===ye.width&&this.RT.height===ye.height||this.RT.setSize(ye.width,ye.height)}get render_target(){return this.RT}}const Re=new class{init({renderer:t,core_attributes:e,dpr:s}){this._renderer=t,this.blitter=void 0,this.canvas=void 0,this.no_render=void 0,this.current_render_mode=void 0,this.generate_depth_normal_texture=!1,this.depth_and_normals_renderer=void 0,this.core_attributes={xr_enabled:!1},Object.assign(this.core_attributes,e),this.core_attributes.xr_enabled?this._renderer.xr.enabled=!0:this._renderer.autoClear=!1,ye.dpr=s,this._renderer.setPixelRatio(s),this.blitter=new we(this._renderer),this.canvas=this._renderer.domElement,this.no_render=new me,this.current_render_mode=this.no_render,this.generate_depth_normal_texture=!1,this.depth_and_normals_renderer=new Se}get dom_element(){return this._renderer.domElement}get depth_normals_RT(){return this.depth_and_normals_renderer.render_target}set_state(t){this.current_render_mode.on_exit(this,this._renderer),this.current_render_mode=t,this.current_render_mode.on_enter(this,this._renderer)}update(){this.generate_depth_normal_texture&&this.depth_and_normals_renderer.render(this),this.__update_current_camera(),fe.current&&this.current_render_mode.render(),ye.update()}__update_current_camera(){fe.current&&(fe.current.aspect=ye.aspect_ratio,fe.current.updateProjectionMatrix(),fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0))}render(t,e,s,r){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s),this._renderer.render(t||be.current,e||fe.current),this.__apply_override_material(t,void 0)}async compile(t,e,s,r){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s),await this._renderer.compile(t||be.current,e||fe.current),this.__apply_override_material(t,void 0)}async compile_async(t,e,s,r,i){this.__apply_override_material(t,r),this._renderer.setRenderTarget(void 0===s?null:s);const n=this._renderer.compileAsync(t||be.current,e||fe.current,i);return this.__apply_override_material(t,void 0),n}render_scene(t){"on_pre_render"in t&&t.on_pre_render(),"render"in t?t.render():this.render(t,void 0),"on_post_render"in t&&t.on_post_render()}__apply_override_material(t,e){e=void 0===e?null:e,t?t.overrideMaterial=e:be.current.overrideMaterial=e}async readback_RT(t){return this._renderer.readRenderTargetPixelsAsync(t,0,0,t.width,t.height)}clear(t,e,s,r){this._renderer.setRenderTarget(void 0===t?null:t),e&&this._renderer.setClearColor(e.clear_color,e.clear_alpha),this._renderer.clear(!!e,!!s,!!r)}on_resize(t,e){for(const s of t)ye.dpr=e,ye.update_position(s.contentRect.x,s.contentRect.y),ye.update_size(s.contentRect.width,s.contentRect.height),this.canvas.width=ye.render_width,this.canvas.height=ye.render_height,this._renderer.setViewport(0,0,ye.render_width,ye.render_height),this._renderer.setSize(ye.width,ye.height),this.__update_current_camera()}material_pass(t,e){this.blitter.material_pass(t,e)}blit(t,e,s){s?this.blitter.blit_with_material(t,e,s):this.blitter.blit(t,e)}blit_clear_with_material(t,e){this.blitter.blit_clear_with_material(t,e)}take_screenshot(t,e=ye.width,s=ye.height){const r=ye.width,i=ye.height,n=e,o=s,a=1024,h=1024,_=Math.ceil(n/a),l=Math.ceil(o/h);ye.update_size(a,h);const c=this._renderer.getPixelRatio();this._renderer.setPixelRatio(1),this._renderer.setSize(a,h,!1);const u=document.createElement("canvas").getContext("2d");u.canvas.width=n,u.canvas.height=o,fe.current.aspect=ye.aspect_ratio,fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0);for(let t=0;t<_;t++)for(let e=0;e<l;e++)fe.current.setViewOffset(n,o,ye.width*t,ye.height*e,ye.width,ye.height),this.current_render_mode.render(),u.drawImage(this._renderer.domElement,ye.width*t,ye.height*e);u.canvas.toBlob(t,"image/png;base64;"),fe.current.clearViewOffset(),ye.update_size(r,i),this._renderer.setPixelRatio(c),this._renderer.setSize(r,i,!1),fe.current.aspect=ye.aspect_ratio,fe.current.updateMatrix(),fe.current.updateMatrixWorld(!0)}download_screenshot(t){const e=document.createElement("a");e.download="Snapshot.png",e.href=URL.createObjectURL(t),e.click(),e.onclick=function(){requestAnimationFrame(function(){URL.revokeObjectURL(e.href)}),e.removeAttribute("href")}}dispose(){this._renderer.dispose(),this.current_render_mode.dispose(),this.blitter.dispose()}};class Ce{constructor(t,e=!0,s=1,r=!1){this.buffer=t,this.loop=e,this.volume=s,this.positional=r,this.audio=void 0}init(t){this.positional?this.audio=new c(t):this.audio=new u(t),this.audio.setBuffer(this.buffer),this.audio.setLoop(this.loop),this.audio.gain.gain.value=0,this.audio.setVolume(this.loop?0:this.volume)}play(){this.audio.play()}pause(){this.audio.pause()}stop(){this.audio.stop()}get is_playing(){return this.audio.isPlaying}}class je extends ge{constructor(t,e,s=!0,r=0,i,n=!1){super(t,e,i),this.loop=s,this.volume=r,this.positional=n}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.instantiate_audio(t):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}instantiate_audio(t){const e=d.getContext(),s=e.createBuffer(2,22050,44100);fetch(this.url).then(t=>t.blob()).then(r=>{r.arrayBuffer?r.arrayBuffer().then(s=>{e.decodeAudioData(s,e=>{t.set_resource(this.resource_id,this.url,new Ce(e,this.loop,this.volume,this.positional)),this.__update_downloaded_bytes(1,1),this.__loading_ended()})}):(t.set_resource(this.resource_id,this.url,new Ce(s,this.loop,this.volume,this.positional)),this.__update_downloaded_bytes(1,1),this.__loading_ended())})}}const Fe=new class{init(){this.resources={},this.resources_by_url={}}set_resource(t,e,s){Object.keys(this.resources_by_url).includes(e)?this.resources[t]=this.resources_by_url[e]:(this.resources[t]=s,this.resources_by_url[e]=s)}replace_resource(t,e,s){this.resources[t]=s,this.resources_by_url[e]=s}get_resource(t){return this.resources[t]}get(t){return this.resources[t]}};class qe{constructor(t,e,s){this.resource_container=Fe,this.assets=e,this.name=t,this.worker=s,this.bound_on_message=this.on_message.bind(this),this.__setup_worker(),this.assets_loaders=this.__setup_loaders()}load(){this.worker.postMessage({type:"load",loader_name:this.name})}is_loaded(){for(let t=0;t<this.assets_loaders.length;t++){const e=this.assets_loaders[t];if(!e.has_finished)return!1;e.has_error&&(e.url=e.original_url,e.print_error())}return!0}get_progress(){return this.__get_loaded_bytes()/this.__get_total_bytes()}__get_loaded_bytes(){let t=1;for(let e=0;e<this.assets_loaders.length;e++)t+=this.assets_loaders[e].loaded_bytes;return t}__get_total_bytes(){let t=1;for(let e=0;e<this.assets_loaders.length;e++)t+=this.assets_loaders[e].total_bytes;return t}get_assets_names(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];t.push(s.name)}return t}static create_worker(){return new Worker(new URL("./assets_loader/AsyncAssetsLoaderWorker.ts",import.meta.url),{name:"OHZI - AssetLoader",type:"module"})}__setup_worker(){this.worker.addEventListener("message",this.bound_on_message),this.worker.postMessage({type:"assets",loader_name:this.name,data:this.assets})}on_message(t){const e=t.data;if(e.type===`asset_loaded_${this.name}`)this.__on_assets_loaded(e.data)}__on_assets_loaded(t){this.worker.removeEventListener("message",this.bound_on_message);for(let e=0;e<this.assets_loaders.length;e++){const s=this.assets_loaders[e];s.original_url=s.url,s.url=t[s.resource_id],s.on_preloaded_finished(this.resource_container)}}__setup_loaders(){return console.warn("Not implemented"),[]}}class Pe extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];t.push(new je(s.name,s.url,s.loop,s.volume,s.size,s.positional))}return t}}class Ne extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new re,this.loader.setDRACOLoader(s)}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Oe extends ge{constructor(t,e,s){super(t,e,s),this.loader=new re}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Le extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];if(s.draco){const e=Fe.get("draco_loader");t.push(new Ne(s.name,s.url,e,s.size))}else t.push(new Oe(s.name,s.url,s.size))}return t}}const $e=new class{async init(){switch(this.browser_name="",this.agent=window.navigator.userAgent.toLowerCase(),this.has_web_xr_support="xr"in navigator,this.is_vr=this.has_web_xr_support&&await navigator.xr.isSessionSupported("immersive-vr"),!0){case this.agent.indexOf("edge")>-1:this.browser_name="edge_ie";break;case this.agent.indexOf("edg")>-1:this.browser_name="edge_chromium";break;case this.agent.indexOf("opr")>-1&&!!window.opr:this.browser_name="opera";break;case this.agent.indexOf("chrome")>-1&&!!window.chrome:this.browser_name="chrome";break;case this.agent.indexOf("trident")>-1:this.browser_name="iexplorer";break;case this.agent.indexOf("firefox")>-1:this.browser_name="firefox";break;case this.agent.indexOf("safari")>-1:this.browser_name="safari";break;default:this.browser_name="other"}this.version=this.get_version()}get name(){return this.browser_name}get is_safari(){return"safari"===this.browser_name}get is_chrome(){return"chrome"===this.browser_name}get is_firefox(){return"firefox"===this.browser_name}get is_edge(){return"edge_ie"===this.browser_name}get is_edge_chromium(){return"edge_chromium"===this.browser_name}get has_webm(){return!!(this.is_chrome||this.is_firefox||this.is_edge_chromium)}get has_hvec(){return this.is_safari}get preferred_video_extension(){return this.has_webm?"webm":this.has_hvec?"hvec.mp4":"mp4"}get_version(){const t=navigator.userAgent;let e=[],s="0",r=t.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];return/trident/i.test(r[1])&&(e=/\brv[ :]+(\d+)/g.exec(t)||[],s="IE "+(e[1]||"")),"Chrome"===r[1]&&(e=t.match(/\b(OPR|Edge)\/(\d+)/),null!=e&&(s=e.slice(1).join(" ").replace("OPR","Opera"))),r=r[2]?[r[1],r[2]]:[navigator.appName,navigator.appVersion,"-?"],null!=(e=t.match(/version\/(\d+(\.\d+)?)/i))&&r.splice(1,1,e[1]),s=r.join(" "),Number(s.split(" ")[1])}};class Ue extends ge{constructor(t,e,s,r=!0,i=!1,n=!0){super(t,e,s),this.original_url="",this.colorSpaceConversion=n,this.premultiplyAlpha=i,this.flipY=r}on_preloaded_finished(t){$e.is_safari?this.load_with_old_method(t):this.load_with_new_method(t)}load_with_old_method(e){if(void 0===e.resources_by_url[this.url]){const s=new t,r=new Image;r.src=this.url,r.onload=()=>{s.image=r,s.flipY=this.flipY,s.premultiplyAlpha=this.premultiplyAlpha,s.colorSpace=this.colorSpaceConversion?p:m,s.needsUpdate=!0,e.set_resource(this.resource_id,this.url,s),this.__update_downloaded_bytes(1,1),this.__loading_ended()},r.onerror=()=>{console.error("The source image could not be decoded.",this.original_url)}}else e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}load_with_new_method(e){if(void 0===e.resources_by_url[this.url]){const s={credentials:"same-origin"};fetch(this.url,s).then(t=>t.blob()).then(t=>createImageBitmap(t,{colorSpaceConversion:this.colorSpaceConversion?"default":"none",imageOrientation:this.flipY?"flipY":"from-image",premultiplyAlpha:this.premultiplyAlpha?"premultiply":"none"})).then(s=>{const r=new t(s);r.flipY=this.flipY,r.premultiplyAlpha=this.premultiplyAlpha,r.colorSpace=this.colorSpaceConversion?p:m,r.needsUpdate=!0,e.set_resource(this.resource_id,this.url,r),this.__update_downloaded_bytes(1,1),this.__loading_ended()}).catch(t=>{console.error(t,this.original_url)})}else e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended()}}class Ee extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=s}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},t=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Be extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new g,this.loader.setPath(e+"/"),this.urls=[`px.${s}`,`nx.${s}`,`py.${s}`,`ny.${s}`,`pz.${s}`,`nz.${s}`]}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.urls,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error("Image could not be loaded. Maybe wrong name or path, I don't know¯\\_(ツ)_/¯"+t),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Ie extends ge{constructor(t,e,s,r){super(t,e,r),this.loader=new ie,this.loader.setPath(e+"/"),this.urls=[`px.${s}`,`nx.${s}`,`py.${s}`,`ny.${s}`,`pz.${s}`,`nz.${s}`]}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.urls,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class De extends ge{constructor(t,e,s){super(t,e,s),this.loader=new ne}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Qe extends qe{constructor(t,e,s){super(t,e,s)}__setup_loaders(){const t=[];for(let e=0;e<this.assets.length;e++){const s=this.assets[e];switch(s.kind){case"regular":t.push(new Ue(s.name,s.url,s.size,s.flipY,s.premultiplyAlpha,s.colorSpaceConversion));break;case"basis":t.push(new Ee(s.name,s.url,Fe.get("basis_loader"),s.size));break;case"hdr":t.push(new De(s.name,s.url,s.size));break;case"cubemap":t.push(new Be(s.name,s.url,s.extension,s.size));break;case"cubemap_hdr":t.push(new Ie(s.name,s.url,s.extension,s.size))}}return t}}class Ve{constructor(t){this.compilators=t,this.first_update=!0,this.index=0}update(){this.is_finished()||(this.compilators[this.index].finished?(this.index++,this.first_update=!0):this.first_update?(this.compilators[this.index].start(),this.first_update=!1):this.compilators[this.index].update())}is_finished(){return this.index===this.compilators.length}}class We{constructor(t,{SceneCompilator:e,TexturesCompilator:s,AudiosCompilator:r}){this.scene=t,this.SceneCompilator=e,this.TexturesCompilator=s,this.AudiosCompilator=r,this.loaders=[],this.compilators=[],this.callback_called=!1}set_assets(t,e,s,r=[],i=[],n=[]){this.scene_objects=t,this.scene_textures=e,this.scene_sounds=s,this.custom_loaders=r,this.custom_compilators=i,this.custom_data=n}get loading_progress(){let t=0;for(let e=0;e<this.loaders.length;e++){t+=this.loaders[e].get_progress()}return t/this.loaders.length}load(){this.setup_loader(),this.loaders[0].load()}on_enter(){}on_exit(){}update(){}setup_loader(){const t=[],e=Fe.get("assets_worker");e.postMessage({type:"reset",loader_name:this.scene.name});const s=new Le(this.scene.name,this.scene_objects,e);this.loaders.push(s),t.push(new this.SceneCompilator(this.scene));const r=new Qe(this.scene.name,this.scene_textures,e);this.loaders.push(r),t.push(new this.TexturesCompilator(r.get_assets_names()));const i=new Pe(this.scene.name,this.scene_sounds,e);this.loaders.push(i),t.push(new this.AudiosCompilator(i.get_assets_names()));for(let s=0;s<this.custom_loaders.length;s++){const r=new this.custom_loaders[s](this.scene.name,this.custom_data[s],e);this.loaders.push(r),t.push(new this.custom_compilators[s](r.get_assets_names()))}this.compilator_manager=new Ve(t)}is_loaded(){let t=!0;for(let e=0;e<this.loaders.length;e++){const s=this.loaders[e];t=t&&s.is_loaded()}return t}is_compiled(){return this.compilator_manager.update(),this.compilator_manager.is_finished()}}class Ye extends We{on_enter(){super.on_enter()}on_exit(){super.on_exit()}update(){super.update(),this.is_loaded()&&this.scene.on_high_quality_assets_ready()}}class Xe extends We{constructor(t,e){super(t,e),this.on_assets_ready_called=!1}on_enter(){super.on_enter()}on_exit(){super.on_exit()}update(){super.update(),this.is_loaded()&&(this.on_assets_ready_called||(this.scene.on_assets_ready(),this.on_assets_ready_called=!0),this.is_compiled()&&this.scene.on_assets_compiled())}}class He extends i{constructor({name:t,compilators:e}){super(),this.name=t,this.initialized=!1,this.is_loaded=!1,this.is_high_loaded=!1,this.loading_states={regular:new Xe(this,e),high:new Ye(this,e)},this.current_loading_state=new We(this,e)}get loading_progress(){return this.current_loading_state.loading_progress}init(){this.initialized=!0}load(){this.initialized||this.init(),this.set_loading_state(this.loading_states.regular),this.current_loading_state.load()}get_objects(){const t=[];return this.traverse(e=>{e instanceof n&&e.geometry&&t.push(e)}),t}dispose_cpu(){this.traverse(t=>{if(t instanceof n&&t.geometry&&(t.geometry.attributes.position.array=new Float32Array(3),t.geometry.attributes.normal&&(t.geometry.attributes.normal.array=new Float32Array(3)),t.geometry.attributes.uv&&(t.geometry.attributes.uv.array=new Float32Array(2)),t.material.map))for(let e=0;e<t.material.map.mipmaps.length;e++)t.material.map.mipmaps[e]=new Uint8Array(4)}),this.initialized=!1}dispose(){this.traverse(t=>{t instanceof n&&t.material&&(t.material.map&&t.material.map.dispose(),t.material.dispose(),t.geometry.dispose())}),this.initialized=!1,super.dispose()}set_assets(t,e,s,r,i,n){this.loading_states.regular.set_assets(t,e,s,r,i,n)}set_high_assets(t,e,s,r,i,n){this.loading_states.high.set_assets(t,e,s,r,i,n)}set_loading_state(t){this.current_loading_state.on_exit(),this.current_loading_state=t,this.current_loading_state.on_enter()}update_loading_state(){this.is_high_loaded||this.current_loading_state.update()}update(){this.update_loading_state()}on_assets_ready(){}on_assets_compiled(){this.is_loaded=!0,this.set_loading_state(this.loading_states.high),this.current_loading_state.load()}on_high_quality_assets_ready(){this.is_high_loaded=!0}on_pre_render(){}render(){Re.render(this,fe.current)}on_post_render(){}}class Ze{constructor(t,e,s){this.name=t,this.method=e,this.args=s}trigger(){ViewApi.application[this.name][this.method](...this.args.split(","))}}class Ke{constructor(){}static linear_map(t,e,s,r,i){return(t-e)/(s-e)*(i-r)+r}static between(t,e,s){return t>=e&&t<=s}static mod(t,e){return(t%e+e)%e}static rgb_to_hex(t){return t.r=Math.round(255*parseFloat(t.r)).toString(16),t.g=Math.round(255*parseFloat(t.g)).toString(16),t.b=Math.round(255*parseFloat(t.b)).toString(16),1===t.r.length&&(t.r="0"+t.r),1===t.g.length&&(t.g="0"+t.g),1===t.b.length&&(t.b="0"+t.b),"#"+t.r+t.g+t.b}static project_points_on_plane(t,e){const s=t[0].clone();s.set(0,0,0);const r=[];for(let i=0;i<t.length;i++)e.projectPoint(t[i],s),r.push(s.clone());return r}static matrix4_lerp(t,e,s,r){for(let i=0;i<16;i++)s.elements[i]=this.lerp(t.elements[i],e.elements[i],r)}static equals(t,e){return Math.abs(t-e)<1e-6}static lerp(t,e,s){return(1-s)*t+s*e}static clamp(t,e,s){return Math.max(e,Math.min(s,t))}static euclideanModulo(t,e){return(t%e+e)%e}static pingpong(t,e=1){return e-Math.abs(Ke.euclideanModulo(t,2*e)-e)}static degToRad(t){return t*(Math.PI/180)}static radToDeg(t){return t*(180/Math.PI)}static deg_to_rad(t){return t*(Math.PI/180)}static rad_to_deg(t){return t*(180/Math.PI)}static perspective_divide(t){return t.x/=t.w,t.y/=t.w,t.z/=t.w,t}static points_average(t){const e=t[0].clone();for(let s=1;s<t.length;s++)e.add(t[s]);return e.multiplyScalar(1/t.length),e}static get_random_color(){const t=[0,1,2,3,4,5,6,7,8,9,"a","b","c","d","e","f"];let e="#";return e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e+=t[Math.floor(16*Math.random())],e}static saturate(t){return Ke.clamp(t,0,1)}static generate_uuid(){const t=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"],e=4294967295*Math.random()|0,s=4294967295*Math.random()|0,r=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(t[255&e]+t[e>>8&255]+t[e>>16&255]+t[e>>24&255]+"-"+t[255&s]+t[s>>8&255]+"-"+t[s>>16&15|64]+t[s>>24&255]+"-"+t[63&r|128]+t[r>>8&255]+"-"+t[r>>16&255]+t[r>>24&255]+t[255&i]+t[i>>8&255]+t[i>>16&255]+t[i>>24&255]).toLowerCase()}}class Je{constructor(t={}){this.previous_elapsed_time=-1e-5,this.elapsed_time=-1e-5,this.playback_speed=this.__get_playback_speed(),this.playing=!0,this.action_events=[],this.context=t,this.initial_context=JSON.parse(JSON.stringify(t)),this.tmp_t=0,this.channels={};const e=Object.keys(t);for(let t=0;t<e.length;t++)this.channels[e[t]]=[];this.duration=0}play(){this.playing=!0}stop(){this.playing=!1}reset(){this.elapsed_time=-1e-5}skip(){const t=this.get_duration();this.__play_clips(this.elapsed_time,t+1e-4),this.elapsed_time=t}update(t){this.playing&&(this.previous_elapsed_time=this.elapsed_time,this.elapsed_time+=t*this.playback_speed,this.__play_clips(this.previous_elapsed_time,this.elapsed_time))}set_progress(t){this.previous_elapsed_time=this.elapsed_time,this.elapsed_time=Ke.clamp(t,0,this.duration),this.__play_clips(this.elapsed_time,this.elapsed_time)}set_normalized_progress(t){this.previous_elapsed_time=this.elapsed_time,this.elapsed_time=Ke.clamp(t,0,1)*this.duration,this.__play_clips(this.elapsed_time,this.elapsed_time)}get_progress(){return Ke.clamp(this.elapsed_time/this.get_duration(),0,1)}is_finished(){return this.elapsed_time>this.get_duration()}add_action_event(t,e){this.action_events.push({trigger_time:t,action:e}),this.duration=Math.max(this.duration,t)}add_action_interpolator(t,e,s,r=!1){if(r){const t=this.channels[s.attribute_name];void 0===t&&console.error(`${s.attribute_name} missing in initial state data.`),0===t.length?s.from=this.initial_context[s.attribute_name]:s.from=t[t.length-1].interpolator.to}const i={from:t,to:e,interpolator:s};this.duration=Math.max(this.duration,e),this.channels[s.attribute_name].push(i)}get_current_target_value(t){const e=this.__get_current_keyframe(t,this.elapsed_time);return this.elapsed_time<e.from?e.interpolator.evaluate(0):e.interpolator.evaluate(1)}get_current_starting_value(t){return this.__get_current_keyframe(t,this.elapsed_time).interpolator.evaluate(0)}get_current_progress(t){const e=this.__get_current_keyframe(t,this.elapsed_time),s=this.__linear_map_01(this.elapsed_time,e.from,e.to);return e.interpolator.easing_function(s)}get_duration(){return this.duration}__play_clips(t,e){this.elapsed_time>this.previous_elapsed_time&&this.__play_events(this.previous_elapsed_time,this.elapsed_time);const s=Object.keys(this.initial_context);for(let e=0;e<s.length;e++){const r=s[e],i=this.__get_current_keyframe(r,t);this.context[r]=this.evaluate_keyframe(i,t)}}__play_events(t,e){for(let s=0;s<this.action_events.length;s++){const r=this.action_events[s].trigger_time;Ke.between(r,t,e)&&this.action_events[s].action.trigger()}}evaluate_keyframe(t,e){return this.tmp_t=this.__linear_map_01(e,t.from,t.to),t.interpolator.evaluate(Ke.clamp(this.tmp_t,0,1))}get_keyframes(t){return this.channels[t]}is_channel_redefined(t){for(let e=0;e<this.channels[t].length;e++){if(this.channels[t][e].interpolator.initial)return!1}return!0}__linear_map_01(t,e,s){return Ke.saturate((t-e)/(s-e)*1+0)}__get_current_keyframe(t,e){let s;const r=this.channels[t];for(let t=0;t<r.length;t++){const i=r[t];if(e>=i.from&&e<=i.to)return s=i,s}let i=1/0;for(let t=0;t<r.length;t++){const n=r[t],o=Math.abs(n.to-e);o<i&&(s=n,i=o)}return s}__get_playback_speed(){const t=new URLSearchParams(window.location.search).get("transitions_velocity");return t?Number(t):1}set_initial_value_on_channel(t,e){this.get_keyframes(t)[0].interpolator.from=e}set_final_value_on_channel(t,e){const s=this.get_keyframes(t);s[s.length-1].interpolator.to=e}}class Ge{constructor(){}static linear(t){return t}static triangular(t){return 1-Math.abs(2*t%2-1)}static ease_in_sine(t){return 1-Math.cos(3.1415926*t/2)}static ease_out_sine(t){return Math.sin(3.1415926*t/2)}static ease_in_out_sine(t){return-(Math.cos(3.1415926*t)-1)/2}static ease_in_cubic(t){return t*t*t}static ease_out_cubic(t){return 1-Math.pow(1-t,3)}static ease_in_out_cubic(t){return t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2}static ease_in_quad(t){return t*t}static ease_out_quad(t){return 1-(1-t)*(1-t)}static ease_in_out_quad(t){return t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2}static ease_in_quart(t){return t*t*t*t}static ease_out_quart(t){return 1-Math.pow(1-t,4)}static ease_in_out_quart(t){return t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2}static ease_in_quint(t){return t*t*t*t*t}static ease_out_quint(t){return 1-Math.pow(1-t,5)}static ease_in_out_quint(t){return t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2}static ease_in_expo(t){return 0===t?0:Math.pow(2,10*t-10)}static ease_out_expo(t){return 1===t?1:1-Math.pow(2,-10*t)}static ease_in_out_expo(t){return 0===t?0:1===t?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2}static ease_in_circ(t){return 1-Math.sqrt(1-Math.pow(t,2))}static ease_out_circ(t){return Math.sqrt(1-Math.pow(t-1,2))}static ease_in_out_circ(t){return t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2}static ease_in_back(t){return 2.7015*t*t*t-1.7015*t*t}static ease_out_back(t){return 1+2.7015*Math.pow(t-1,3)+1.7015*Math.pow(t-1,2)}static ease_in_out_back(t){return t<.5?Math.pow(2*t,2)*(7.189819*t-2.5949095)/2:(Math.pow(2*t-2,2)*(3.5949095*(2*t-2)+2.5949095)+2)/2}static ease_in_elastic(t){const e=2*Math.PI/3;return 0===t?0:1===t?1:-Math.pow(2,10*t-10)*Math.sin((10*t-10.75)*e)}static ease_out_elastic(t){return 0===t?0:1===t?1:Math.pow(2,-10*t)*Math.sin(2.094395*(10*t-.75))+1}static ease_in_out_elastic(t){return 0===t?0:1===t?1:t<.5?-Math.pow(2,20*t-10)*Math.sin(1.3962633*(20*t-11.125))/2:Math.pow(2,-20*t+10)*Math.sin(1.3962633*(20*t-11.125))/2+1}static ease_in_bounce(t){return 1-this.ease_out_bounce(1-t)}static ease_out_bounce(t){const e=7.5625,s=2.75;return t<1/s?e*t*t:t<2/s?e*(t-=1.5/s)*t+.75:t<2.5/s?e*(t-=2.25/s)*t+.9375:e*(t-=2.625/s)*t+.984375}static ease_in_out_bounce(t){return t<.5?(1-this.ease_out_bounce(1-2*t))/2:(1+this.ease_out_bounce(2*t-1))/2}static heartbeat(t){return 1-Math.pow(Math.abs(Math.sin(t+1)),63)*Math.sign(Math.sin(t))*Math.sin(t+1.5+1)*.8}}class ts{constructor(t="linear"){this.easing_function=void 0,this.easing_function="string"==typeof t?Ge[t]:t,this.attribute_name="",this.from=0,this.to=1}update(t,e){}}class es extends ts{constructor(t,e=0,s=1,r=!1,i="linear"){super(i),this.attribute_name=t,this.from=e,this.to=s,this.initial=r}update(t,e){t[this.attribute_name]=Ke.lerp(this.from,this.to,this.easing_function(e))}evaluate(t){return Ke.lerp(this.from,this.to,this.easing_function(t))}}class ss{constructor(){}parse(t){const e=(new DOMParser).parseFromString(t,"text/xml").querySelectorAll("mxGeometry"),s=[],r=[];for(let t=0;t<e.length;t++){const i=e[t],n=i.parentElement,o=n.getAttribute("value"),a=this.get_node_x_position(i)/100,h=parseFloat(i.getAttribute("width"))/100;if(n.getAttribute("style").includes("rhombus;")){const t=o.split("."),e=t[0],s=t[1];r.push({name:e,method:s,at_time:a+.5*h})}if(n.getAttribute("style").includes("rounded=0;")&&!n.getAttribute("style").includes("text;")&&""!==o&&!o.includes(" ")){const t=o.split("="),e=t[0],r=t[1].split("--"),i=parseFloat(r[0]),n=r[1];2!==t.length&&console.error("DrawIO data is malformed:",o),2!==r.length&&console.error("DrawIO data is malformed:",o),s.push({attribute_name:e,from_time:a,to_time:a+h,to_value:i,easing_function:n})}}return s.sort((t,e)=>t.from_time-e.from_time),{animation_tracks:s,triggers:r}}get_node_x_position(t){const e=t.getAttribute("x");return null===e?0:parseFloat(e)}}class rs{constructor(t){this.default_state_data=t}from_animation_sheet(t,e,s){s=s||this.default_state_data;const r=t.animation_tracks,i=t.triggers,n=this.state_to_tracks(this.default_state_data,this.get_longest_time(t.animation_tracks));for(let t=0;t<n.length;t++)void 0===r.find(e=>e.attribute_name===n[t].attribute_name)&&r.push(n[t]);const o=new Je(e);for(let t=0;t<r.length;t++){const s=r[t],i=new es(s.attribute_name,e[s.attribute_name],s.to_value,s.initial,s.easing_function);o.add_action_interpolator(s.from_time,s.to_time,i,!0)}for(let t=0;t<i.length;t++){const e=i[t],s=new Ze(e.name,e.method,e.args);o.add_action_event(e.at_time,s)}return o}state_to_tracks(t,e){const s=[],r=Object.keys(t);for(let i=0;i<r.length;i++)s.push({attribute_name:r[i],from_time:0,to_time:e<1?e:1,to_value:t[r[i]],initial:!0,easing_function:"ease_in_out_cubic"});return s}from_draw_io(t,e){const s=(new ss).parse(t),r=s.animation_tracks,i=s.triggers,n=new Je(e);for(let t=0;t<r.length;t++){const s=r[t],i=new es(s.attribute_name,e[s.attribute_name],s.to_value,!1,s.easing_function);n.add_action_interpolator(s.from_time,s.to_time,i,!0)}for(let t=0;t<i.length;t++){const e=i[t],s=new Ze(e.name,e.method);n.add_action_event(e.at_time,s)}return n}get_longest_time(t){let e=-1;for(let s=0;s<t.length;s++){const r=t[s].to_time;e=r>e?r:e}return e}}class is{constructor(){this.transitions=[],this.default_state_data={}}get(t,e,s){for(let r=0;r<this.transitions.length;r++)if(this.transitions[r].from===t&&this.transitions[r].to===e){return new rs(this.default_state_data).from_animation_sheet(this.transitions[r].data,s)}for(let t=0;t<this.transitions.length;t++)if(this.transitions[t].to===e&&void 0===this.transitions[t].from){return new rs(this.default_state_data).from_animation_sheet(this.transitions[t].data,s)}console.error("TransitionTable.get no data found for: ",t,e)}add_transitions(t){for(let e=0;e<t.length;e++)this.transitions.push(t[e])}set_transitions(t){this.transitions=t}set_default_state_data(t){this.default_state_data=t}}const ns=new class{constructor(){this.__delta_buffer=[.016,.016,.016,.016,.016,.016,.016,.016,.016,.016]}init(){this.__previous_elapsed_time=-1,this.__delta_time=0,this.__smooth_delta_time=0,this.__elapsed_time=0,this.__frame_interpolation_t=0,this.fixed_delta_time=1/30}get elapsed_time(){return this.__elapsed_time}get delta_time(){return this.__delta_time}get smooth_delta_time(){return this.__smooth_delta_time}get frame_interpolation(){return this.__frame_interpolation_t}get fdt(){return this.fixed_delta_time}get dt(){return this.delta_time}get sdt(){return this.smooth_delta_time}__set_frame_interpolation(t){this.__frame_interpolation_t=t}__update(t){this.__previous_elapsed_time<0&&(this.__previous_elapsed_time=t),this.__delta_time=(t-this.__previous_elapsed_time)/1e3,this.__elapsed_time=t/1e3,this.__delta_buffer.shift(),this.__delta_buffer.push(this.delta_time<.32?this.delta_time:.032),this.__calculate_smooth_delta_time(),this.__previous_elapsed_time=t}__calculate_smooth_delta_time(){this.__smooth_delta_time=0;for(let t=0;t<this.__delta_buffer.length;t++)this.__smooth_delta_time+=this.__delta_buffer[t];this.__smooth_delta_time=this.__smooth_delta_time/this.__delta_buffer.length}};class os{constructor(t){this.name=t}start(){}before_enter(){}on_enter(){}before_exit(){}on_exit(){}before_update(){}update(){}fixed_update(){}update_enter_transition(t,e,s){}update_exit_transition(t,e,s){}}class as{constructor(t){this.last_state=new os("last_initial"),this.current_state=new os("current_initial"),this.default_state_data={},this.current_state_data={},this.transition_table=t,this.transitioning=!1}go_to_state(t,e=!1){this.transitioning&&this.__exit_last_state(),this.last_state=this.current_state,this.current_state=t,this.last_state.before_exit(),this.current_state.before_enter(),this.action_sequencer=this.transition_table.get(this.last_state.name,this.current_state.name,this.current_state_data),this.action_sequencer.play(),this.transitioning=!0,e&&(this.action_sequencer.skip(),this.update())}update(){this.transitioning?(this.__update_transitions(),this.action_sequencer.is_finished()&&(this.transitioning=!1,this.__update_transitions(),this.__exit_last_state(),this.current_state.on_enter())):this.current_state.update()}before_update(){this.current_state.before_update()}fixed_update(){this.current_state.fixed_update()}set_state(t){this.current_state=t}set_default_state_data(t){Object.assign(this.default_state_data,t),Object.assign(this.current_state_data,t)}__update_transitions(){this.action_sequencer.update(ns.delta_time),this.last_state.update_exit_transition(this.current_state_data,this.action_sequencer.get_progress(),this.action_sequencer),this.current_state.update_enter_transition(this.current_state_data,this.action_sequencer.get_progress(),this.action_sequencer)}__exit_last_state(){this.last_state.on_exit()}}const hs=new class{constructor(){this.transition_table=new is,this.transition_handler=new as(this.transition_table)}get action_sequencer(){return this.transition_handler.action_sequencer}get current_state_data(){return this.transition_handler.current_state_data}get_current_state(){return this.transition_handler.current_state}go_to_state(t,e=!1){this.transition_handler.go_to_state(t,e)}before_update(){this.transition_handler.before_update()}update(){this.transition_handler.update()}fixed_update(){this.transition_handler.fixed_update()}add_transitions(t){this.transition_table.add_transitions(t)}set_transitions(t){this.transition_table.set_transitions(t)}set_state(t){this.transition_handler.set_state(t)}set_default_state_data(t){this.transition_table.set_default_state_data(t),this.transition_handler.set_default_state_data(t)}};const _s=new class{constructor(){this.views=[],this.browser_title_suffix=""}update(){this.__set_views_opacities()}go_to_view(t,e=!0,s=!1){const r=this.get(t);e&&(this.__change_browser_url(r.url),this.__change_browser_title(r.url)),hs.go_to_state(r,s)}go_to_scene(t,e=!1,s=!1){const r=this.get(t),i=this.get("transition");i.set_next_view(r),this.go_to_view(i.name,e,s)}register_view(t){this.views.push(t)}has_view(t){for(let e=0;e<this.views.length;e++)if(this.views[e].name===t)return!0;return!1}set_view(t){const e=this.get(t);hs.set_state(e)}set_browser_title_suffix(t){this.browser_title_suffix=t}get_current_view(){return hs.get_current_state()}get_view_by_name(t){console.warn("DEPRECATED. Use ViewManager.get instead"),this.get(t)}get(t){for(let e=0;e<this.views.length;e++)if(this.views[e].name===t)return this.views[e];console.error("[ViewManager.get] no view found for: ",t)}get_by_url(t){for(let e=0;e<this.views.length;e++)if(this.views[e].url===t)return this.views[e];console.error("[ViewManager.get_by_url] no view found for: ",t)}__change_browser_url(t){window.history.pushState("","",t)}__change_browser_title(t){const e=this.__capitalize(t);document.title=e?`${e} | ${this.browser_title_suffix}`:this.browser_title_suffix}__set_views_opacities(){for(let t=0;t<this.views.length;t++)this.views[t].set_opacity(hs.current_state_data)}__capitalize(t){let e=t.toUpperCase().replace("/","");return e=this.__snake_to_whitespace(e),e}__snake_to_whitespace(t){return t.replace(/([-_][A-Z])/g,t=>t.replace("-"," ").replace("_"," "))}};class ls extends os{constructor({name:t,url:e,container:s,transition_data:r}){super(t),this.container=s,this.url=e,this.current_opacity=0;const i=[{to:t,data:r=r||{animation_tracks:[],triggers:[]}}];_s.register_view(this),hs.add_transitions(i)}before_enter(){this.container.classList.add("before_enter"),this.container.classList.remove("before_exit"),this.container.classList.remove("hidden")}on_enter(){this.container.classList.remove("before_enter"),this.container.classList.remove("before_exit"),this.container.classList.remove("hidden")}before_exit(){this.container.classList.add("before_exit"),this.container.classList.remove("before_enter"),this.container.classList.remove("hidden")}on_exit(){this.container.classList.add("hidden"),this.container.classList.remove("before_enter"),this.container.classList.remove("before_exit")}set_opacity(t){const e=t[`${this.name}_opacity`];(this.current_opacity>e||this.current_opacity<e)&&(this.current_opacity=e,this.container.style.opacity=String(this.current_opacity))}}class cs{constructor(t){this.uses_dynamic_font=!!t,this.__textHeight=null,this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d")}getFontHeight(t="Arial"){if(null==this.__textHeight||this.uses_dynamic_font){const e=document.getElementsByTagName("body")[0],s=document.createElement("div"),r=document.createTextNode("MÉqgOLAKTAL");s.appendChild(r),s.setAttribute("style",`font:${t};position:absolute;top:0;left:0`),e.appendChild(s),this.__textHeight=s.offsetHeight,e.removeChild(s)}return this.__textHeight}get_text_size(t,s="24px Arial"){const r=new e;return this.ctx.font=s,r.x=Math.ceil(this.ctx.measureText(t).width),r.y=Math.ceil(this.getFontHeight(s)),r}draw_canvas(t,e={}){return e.font=e.font||"24px Arial",e.font_color=e.font_color||"#000000",this.__draw(t,e,this.canvas,this.ctx),this.canvas}draw_on_texture(t,e){const s=this.draw_canvas(t,e),r=new f(s,y,b,b,w,w);return r.generateMipmaps=!1,r.needsUpdate=!0,r}__draw(t,e,s,r){}roundRect(t,e,s,r,i,n,o,a){if(void 0===a&&(a=!0),void 0===n&&(n=5),"number"==typeof n)n={tl:n,tr:n,br:n,bl:n};else{const t={tl:0,tr:0,br:0,bl:0};for(const e in t){const s=e;n[s]=n[s]||t[s]}}t.beginPath(),t.moveTo(e+n.tl,s),t.lineTo(e+r-n.tr,s),t.quadraticCurveTo(e+r,s,e+r,s+n.tr),t.lineTo(e+r,s+i-n.br),t.quadraticCurveTo(e+r,s+i,e+r-n.br,s+i),t.lineTo(e+n.bl,s+i),t.quadraticCurveTo(e,s+i,e,s+i-n.bl),t.lineTo(e,s+n.tl),t.quadraticCurveTo(e,s,e+n.tl,s),t.closePath(),o&&t.fill(),a&&t.stroke()}}class us extends cs{constructor(){super(),this.text_margin=new e(2,0)}__draw(t,e,s,r){r.font=e.font;const i=this.get_text_size(t,e.font);s.width=Math.ceil(i.x+2*this.text_margin.x),s.height=Math.ceil(i.y+2*this.text_margin.y),r.clearRect(0,0,s.width,s.height),r.globalAlpha=0,r.fillStyle=e.font_color||"#000000",r.fillRect(0,0,s.width,s.height),r.globalAlpha=1,r.globalAlpha=1,r.font=e.font,r.fillStyle=e.font_color||"#000000",r.textBaseline="middle",r.textAlign=e.textAlign||"center","center"===r.textAlign?r.fillText(t,s.width/2,s.height/2):r.fillText(t,0,s.height/2)}}const ds=new class{init(){this.max_anisotropy=0,this.vertex_texture_sampler_available=!1}};class ps{get(t,e){return this.describe(this.require_camera(t),e)}set(t,e,s){const r=this.require_camera(t),i=[];null!==e&&this.apply_orbit(e,s,i),this.apply_position(r,e,s,i),this.apply_fov(r,s,i);const n=this.describe(r,e);return n.changed=i,n}frame(t,e,s,r,i){const n=this.require_camera(t);if(null===e)throw this.error("no_controller","The active scene has no camera_controller, so framing is unavailable.");const o="string"==typeof r.uuid?r.uuid:null,a="string"==typeof r.name?r.name:null;if(null===o&&null===a)throw this.error("not_found","Pass a uuid or a name to identify the object to frame.");const h=this.find(s,o,a);if(null===h){const t=null===o?`name '${null===a?"":a}'`:`uuid '${o}'`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}const _="number"==typeof r.scale&&Number.isFinite(r.scale)?r.scale:1;e.focus_on_bounding_box(i(h),_);const l=this.describe(n,e);return l.changed=["framed"],l}apply_orbit(t,e,s){const r=this.number(e.tilt),i=this.number(e.orientation),n=this.number(e.azimuth);null===r&&null===i&&null===n||(null!==r&&s.push("tilt"),null!==i&&s.push("orientation"),null!==n&&s.push("azimuth"),t.set_rotation(null===r?void 0:r,null===i?void 0:i,null===n?void 0:n));const o=this.number(e.zoom);null!==o&&(t.set_normalized_zoom(o),s.push("zoom"));const a=this.triple(e.target);null!==a&&(t.reference_position.x=a[0],t.reference_position.y=a[1],t.reference_position.z=a[2],s.push("target"))}apply_position(t,e,s,r){const i=this.triple(s.position);if(null!==i){if(null!==e)throw this.error("controller_owns_camera","A CameraController is driving this camera and would overwrite a raw position on the next frame. Use tilt, orientation, azimuth, zoom and target instead.");t.position.x=i[0],t.position.y=i[1],t.position.z=i[2],r.push("position")}}apply_fov(t,e,s){const r=this.number(e.fov);null!==r&&(t.fov=r,s.push("fov"),"function"==typeof t.updateProjectionMatrix&&t.updateProjectionMatrix())}describe(t,e){return{position:[this.round(t.position.x),this.round(t.position.y),this.round(t.position.z)],fov:"number"==typeof t.fov?t.fov:null,near:"number"==typeof t.near?t.near:null,far:"number"==typeof t.far?t.far:null,clear_color:this.hex(t.clear_color),clear_alpha:"number"==typeof t.clear_alpha?t.clear_alpha:null,controller:null===e?null:{tilt:e.get_current_tilt(),orientation:e.get_current_orientation(),azimuth:e.get_current_azimuth(),zoom:e.normalized_zoom,min_zoom:e.min_zoom,max_zoom:e.max_zoom,target:[this.round(e.reference_position.x),this.round(e.reference_position.y),this.round(e.reference_position.z)]}}}find(t,e,s){if(null!==e?t.uuid===e:t.name===s)return t;const r=Array.isArray(t.children)?t.children:[];for(const t of r){const r=this.find(t,e,s);if(null!==r)return r}return null}require_camera(t){if("object"!=typeof t||null===t||"object"!=typeof t.position)throw this.error("no_camera","No camera is active. CameraManager.current is not set yet.");return t}hex(t){return"object"!=typeof t||null===t||"function"!=typeof t.getHexString?null:`#${t.getHexString()}`}number(t){return"number"==typeof t&&Number.isFinite(t)?t:null}triple(t){if(!Array.isArray(t))return null;const e=t,s=[];for(let t=0;t<3;t++){const r=this.number(e[t]);if(null===r)return null;s.push(r)}return s}round(t){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:0}error(t,e){const s=new Error(e);return s.code=t,s}}class ms{constructor(t,e,s=()=>document.createElement("canvas")){this.graphics=t,this.has_camera=e,this.create_canvas=s}async capture(t){return"hires"===t.mode?this.capture_hires(t):this.capture_fast(t)}async capture_fast(t){const e=this.graphics.canvas,s=this.scaled_size(e.width,e.height,t.max_size);if(null!==s){const t=this.draw_scaled(e,s.width,s.height);if(null!==t){const r=await this.request_blob(e=>t.toBlob(e,"image/png")),i=await this.build_result("fast",s.width,s.height,r);return i.scaled_from={width:e.width,height:e.height},i}}const r=await this.request_blob(t=>e.toBlob(t,"image/png"));return this.build_result("fast",e.width,e.height,r)}scaled_size(t,e,s){const r="number"==typeof s?s:1280;if(!Number.isFinite(r)||r<=0)return null;const i=Math.max(t,e);if(i<=r)return null;const n=r/i;return{width:Math.max(1,Math.round(t*n)),height:Math.max(1,Math.round(e*n))}}draw_scaled(t,e,s){const r=this.create_canvas();r.width=e,r.height=s;const i=r.getContext("2d");return null===i?null:(i.drawImage(t,0,0,e,s),r)}async capture_hires(t){if(!this.has_camera())throw this.error("no_camera","A hires capture needs an active camera; CameraManager.current is not set yet.");const e=this.graphics.canvas,s=this.dimension(t.width,e.width),r=this.dimension(t.height,e.height),i=await this.request_blob(t=>this.graphics.take_screenshot(t,s,r));return this.build_result("hires",s,r,i)}dimension(t,e){return"number"==typeof t?this.clamp(t):this.clamp(e)}clamp(t){return!Number.isFinite(t)||t<1?1:Math.min(Math.floor(t),8192)}request_blob(t){return new Promise((e,s)=>{t(t=>{null!==t?e(t):s(this.error("capture_failed","The canvas produced no image data."))})})}async build_result(t,e,s,r){const i=await r.arrayBuffer(),n=new Uint8Array(i);return{mode:t,mime_type:"image/png",width:e,height:s,bytes:n.length,data:this.to_base64(n)}}to_base64(t){let e="";for(let s=0;s<t.length;s+=8192)e+=String.fromCharCode(...t.subarray(s,s+8192));return btoa(e)}error(t,e){const s=new Error(e);return s.code=t,s}}const gs=2e3,fs=["log","info","warn","error"];class ys{constructor(t=200,e=()=>Date.now()){this.capacity=t>0?Math.floor(t):200,this.entries=[],this.seq=0,this.dropped=0,this.clock=e,this.target=null,this.source=null,this.originals={},this.on_error=null,this.on_rejection=null}install(t,e){this.dispose(),this.target=t;for(const e of fs){const s=t[e];this.originals[e]=s,t[e]=(...r)=>{this.push(e,this.format(r)),s.apply(t,r)}}void 0!==e&&(this.source=e,this.on_error=t=>this.push("error",this.event_message(t)),this.on_rejection=t=>this.push("error",`Unhandled rejection: ${this.event_reason(t)}`),e.addEventListener("error",this.on_error),e.addEventListener("unhandledrejection",this.on_rejection))}dispose(){const t=this.target;if(null!==t)for(const e of fs){const s=this.originals[e];void 0!==s&&(t[e]=s)}const e=this.source;null!==e&&(null!==this.on_error&&e.removeEventListener("error",this.on_error),null!==this.on_rejection&&e.removeEventListener("unhandledrejection",this.on_rejection)),this.originals={},this.target=null,this.source=null,this.on_error=null,this.on_rejection=null}read(t){const e="string"==typeof t.level?t.level:null,s="number"==typeof t.since?t.since:0,r="number"==typeof t.limit&&t.limit>0?Math.floor(t.limit):0;let i=this.entries.filter(t=>t.seq>s);return null!==e&&(i=i.filter(t=>t.level===e)),r>0&&i.length>r&&(i=i.slice(i.length-r)),{entries:i,dropped:this.dropped,total:this.seq,capacity:this.capacity}}push(t,e){for(this.seq++,this.entries.push({seq:this.seq,level:t,message:e,at:this.clock()});this.entries.length>this.capacity;)this.entries.shift(),this.dropped++}format(t){const e=t.map(t=>this.describe(t)).join(" ");if(e.length<=gs)return e;const s=e.length-gs;return`${e.slice(0,gs)} ... [truncated ${s} chars]`}describe(t){if("string"==typeof t)return t;if(null===t)return"null";if(void 0===t)return"undefined";if("number"==typeof t||"boolean"==typeof t)return String(t);if("function"==typeof t)return"[function]";if("symbol"==typeof t)return"[symbol]";if("bigint"==typeof t)return`${t.toString()}n`;if(t instanceof Error)return`${t.name}: ${t.message}`;try{const e=JSON.stringify(t);return void 0===e?"[unserialisable]":e}catch{return"[unserialisable]"}}event_message(t){if("object"==typeof t&&null!==t){const e=t;if("string"==typeof e.message)return e.message;if(void 0!==e.error)return this.describe(e.error)}return this.describe(t)}event_reason(t){if("object"==typeof t&&null!==t){const e=t;if(void 0!==e.reason)return this.describe(e.reason)}return this.describe(t)}}class bs extends ee{constructor(t){super();const s=ut(.5),r=ut(new e(1,1)),i=At("plane_bounds","vec4"),n=St(At("transformsCol0","vec4"),At("transformsCol1","vec4"),At("transformsCol2","vec4"),At("transformsCol3","vec4")),o=dt(pt.xy.mul(i.zw).add(i.xy),pt.z,1);this.vertexNode=Rt.mul(Ct).mul(n).mul(o);const a=jt(At("glyph_bounds","vec4")),h=jt(At("color","vec4")),_=a.x.div(r.x),l=a.y.div(r.x),c=a.z.div(r.y),u=a.w.div(r.y),d=Mt(l.sub(_)),p=Mt(c.sub(u)),m=ct(t,bt(mt().x.mul(d).add(_),mt().y.mul(p).add(c).sub(p)));this.uniforms={_Texture:m,_Boldness:s,_AtlasSize:r};const g=Ft(qt(m.r,m.g),qt(Ft(m.r,m.g),m.b)),f=s.sub(g),y=f.div(Ft(Pt(bt(Nt(f),Ot(f))),1e-6)),b=Lt(vt(.5).sub(y),0,1);this.fragmentNode=dt(h.rgb,b.mul(h.a)),this.transparent=!0,this.depthWrite=!1,this.side=x,this.fog=!1,t.minFilter=v,t.magFilter=v,t.generateMipmaps=!1}set_atlas_size(t){this.uniforms._AtlasSize.value.copy(t)}set_boldness(t){this.uniforms._Boldness.value=Ke.lerp(.5,.2,t)}}class ws{constructor(){}static merge_from_to(t,e){e.push.apply(e,t)}static expand_vec3_array(t,e){const s=e-t.length;for(let e=0;e<s;e++)t.push(t[e].clone())}static remove_elem(t,e){const s=t.indexOf(e);s>-1&&t.splice(s,1)}static get_closest_point(t,e){let s=t[0],r=s.distanceTo(e);for(let i=1;i<t.length;i++)t[i].distanceTo(e)<r&&(s=t[i],r=t[i].distanceTo(e));return s}static object_values_to_array(t){const e=Object.keys(t),s=[];for(let r=0;r<e.length;r++)s.push(t[e[r]]);return s}}class xs{constructor(t,s,r){const i=s.right-s.left,n=s.top-s.bottom;this.scale=new e(i,n),this.position=new e(t+s.left,s.bottom),this.atlas_bounds=new h(r.left,r.right,r.top,r.bottom)}}class vs{constructor(t,s=""){this.glyph_layout=t,this.glyphs=[],this.glyph_is_dirty=!0,this.matrix_is_dirty=!0,this.color_is_dirty=!0,this.position=new l,this.quaternion=new z,this.scale=new l(1,1,1),this.matrix=new M,this.color=new r("#FFFFFF"),this.pivot_point=new e,this.__opacity=1,this.__text=s,this.__generate_glyphs(s)}set text(t){this.__text=t,this.__generate_glyphs(t),this.matrix_is_dirty=!0}get text(){return this.__text}update_matrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrix_is_dirty=!1,this.glyph_is_dirty=!0}clear_glyph_dirty(){this.glyph_is_dirty=!1}clear_color_dirty(){this.color_is_dirty=!1}set_rotation(t=0,e=0){const s=(new z).setFromAxisAngle(new l(0,1,0),t/360*Math.PI*2),r=(new z).setFromAxisAngle(new l(1,0,0),-e/360*Math.PI*2);this.quaternion.copy(s.multiply(r)),this.matrix_is_dirty=!0}set_position(t){this.position.copy(t),this.matrix_is_dirty=!0}set_size(t){this.scale.set(t,t,t),this.matrix_is_dirty=!0}set_color(t){this.color.set(t),this.color_is_dirty=!0}set_pivot(t){this.pivot_point.copy(t),this.update_glyphs()}set opacity(t){this.__opacity=t,this.color_is_dirty=!0}get opacity(){return this.__opacity}update_glyphs(){this.__generate_glyphs(this.text)}__generate_glyphs(t){let s=0;this.glyphs.length=0;for(let e=0;e<t.length;e++){const r=t.charCodeAt(e),i=this.glyph_layout.find(t=>t.unicode===r);if(i){if(i.planeBounds){const t=new xs(s,i.planeBounds,i.atlasBounds);this.glyphs.push(t)}s+=i.advance}}const r=new T,i=this.glyphs[0];r.setFromCenterAndSize(i.position.clone().add(new e(i.scale.x/2,i.scale.y/2)),i.scale);for(let t=1;t<this.glyphs.length;t++){const s=this.glyphs[t],i=(new T).setFromCenterAndSize(s.position.clone().add(new e(s.scale.x/2,s.scale.y/2)),s.scale);r.union(i)}const n=new e;r.getSize(n);for(let t=0;t<this.glyphs.length;t++)this.glyphs[t].position.x-=n.x/2,this.glyphs[t].position.y-=n.y/2,this.glyphs[t].position.x+=n.x/2*this.pivot_point.x,this.glyphs[t].position.y+=n.y/2*this.pivot_point.y;this.glyph_is_dirty=!0}}const zs=["transformsCol0","transformsCol1","transformsCol2","transformsCol3","glyph_bounds","plane_bounds","color"];class Ms extends n{constructor(t,s){const r=new k;r.instanceCount=0;const i=new o(1,1);i.translate(.5,.5,0),r.setAttribute("position",new A(i.getAttribute("position").array,3)),r.setAttribute("uv",new A(i.getAttribute("uv").array,2)),r.index=i.index;const n=new S(new Float32Array(2e3*zs.length*4),4*zs.length);n.setUsage(R),zs.forEach((t,e)=>{r.setAttribute(t,new C(n,4,4*e))}),super(r,new bs(s)),this.text_elements=[],this.font_layout=t,this.material.set_atlas_size(new e(t.atlas.width,t.atlas.height)),this.frustumCulled=!1}set_boldness(t){this.material.set_boldness(t)}add_text(t){const e=new vs(this.font_layout.glyphs,t);return this.text_elements.push(e),e}remove_text(t){ws.remove_elem(this.text_elements,t),this.update(!0)}update(t){const e=this.geometry.getAttribute("glyph_bounds"),s=this.geometry.getAttribute("plane_bounds"),r=this.geometry.getAttribute("transformsCol0"),i=this.geometry.getAttribute("transformsCol1"),n=this.geometry.getAttribute("transformsCol2"),o=this.geometry.getAttribute("transformsCol3"),a=this.geometry.getAttribute("color");let h=!0===t,_=!0===t,l=!0===t,c=0;for(let t=0;t<this.text_elements.length;t++){const u=this.text_elements[t];u.matrix_is_dirty&&(h=!0,u.update_matrix()),u.glyph_is_dirty&&(_=!0,u.clear_glyph_dirty()),u.color_is_dirty&&(l=!0,u.clear_color_dirty());const d=u.matrix,p=u.color,m=u.opacity;for(let t=0;t<u.glyphs.length;t++){const h=u.glyphs[t],_=c;e.setXYZW(_,h.atlas_bounds.x,h.atlas_bounds.y,h.atlas_bounds.z,h.atlas_bounds.w),s.setXYZW(_,h.position.x,h.position.y,h.scale.x,h.scale.y),r.setXYZW(_,d.elements[0],d.elements[1],d.elements[2],d.elements[3]),i.setXYZW(_,d.elements[4],d.elements[5],d.elements[6],d.elements[7]),n.setXYZW(_,d.elements[8],d.elements[9],d.elements[10],d.elements[11]),o.setXYZW(_,d.elements[12],d.elements[13],d.elements[14],d.elements[15]),a.setXYZW(_,p.r,p.g,p.b,m),c++}}this.geometry.instanceCount=c,c>this.max_allocations&&console.error("SDFTextBatch exceeded maximum glyph allocations(max/current): ",this.max_allocations,c,this),h&&(r.needsUpdate=!0,i.needsUpdate=!0,n.needsUpdate=!0,o.needsUpdate=!0),_&&(e.needsUpdate=!0,s.needsUpdate=!0),l&&(a.needsUpdate=!0)}dispose(){this.geometry.dispose(),this.material.dispose(),super.dispose()}}class Ts extends ee{constructor(t){super();const e=ct(t),s=ut(0),r=ut(new l(1,1,1)),i=ut(1);this.uniforms={_MainTex:e,_ScreenAligned:s,_Scale:r,_Opacity:i};const n=$t.mul(dt(pt,1)).xyz,o=$t.element(3).xyz.add(pt.mul(r));this.vertexNode=Rt.mul(dt(gt(n,o,s),1)),this.fragmentNode=dt(e.rgb,e.a.mul(i)),this.transparent=!0,this.depthWrite=!1,this.side=x,this.fog=!1}}class ks extends n{constructor(t,s){s=s||new e(0,0);const r=new Ts(t),i=new o(1,1,1);i.translate(-s.x/2,-s.y/2,0);const n=t.image.width/t.image.height;i.scale(n,1,1),super(i,r),this.current_scale=n,this.sized_texture=t,this.texture_size=new e(t.image.width,t.image.height),this.geometry.computeBoundingBox(),this.tmp_bb_size=new l,this.geometry.boundingBox.getSize(this.tmp_bb_size),this.material=r}update_texture(){const t=this.material.uniforms._MainTex.value,e=t.image,s=e.width!==this.texture_size.x||e.height!==this.texture_size.y;t===this.sized_texture&&s&&t.dispose(),this.sized_texture=t,this.texture_size.set(e.width,e.height),t.needsUpdate=!0,this.geometry.scale(1/this.current_scale,1,1),this.current_scale=e.width/e.height,this.geometry.scale(this.current_scale,1,1),this.geometry.computeBoundingBox(),this.geometry.boundingBox.getSize(this.tmp_bb_size)}get size(){return this.tmp_bb_size.clone().multiplyScalar(this.scale.x)}set size(t){this.scale.copy(t),this.material.uniforms._Scale.value.copy(t)}set screen_aligned(t){this.material.uniforms._ScreenAligned.value=!0===t?1:0}get screen_aligned(){return 1===this.material.uniforms._ScreenAligned.value}set opacity(t){this.material.uniforms._Opacity.value=t}get opacity(){return this.material.uniforms._Opacity.value}dispose(){this.geometry.dispose(),this.parent.remove(this),this.material.uniforms._MainTex.value.dispose(),this.material.dispose(),super.dispose()}}const As=["cube","sphere","plane","math_sphere","bounding_box","label","sdf_text"];async function Ss(t,e){const s=await fetch(t);if(!s.ok)throw new Error(`HTTP ${s.status}`);const r=(new q).loadAsync(e).catch(()=>{throw new Error(`no atlas image at ${e}`)}),[i,n]=await Promise.all([s.json(),r]);return{layout:i,atlas:n}}class Rs{constructor(t={}){this.helpers=new Map,this.sdf_fonts=new Map,this.sdf_font=t.sdf_font,this.load_sdf_font=t.load_sdf_font??Ss}draw(t,e,s){const r="string"==typeof s.shape&&As.includes(s.shape)?s.shape:null;if(null===r)throw this.error("bad_request",`Unknown shape. Valid shapes: ${As.join(", ")}.`);const i=this.position(s.position),n=this.size(s.size),o=this.color(s.color);return"sdf_text"===r?this.draw_sdf_text(t,this.text(s.text),this.font_url(s.font),i,n,o):this.track(r,this.build(t,e,r,s,i,n,o))}track(t,e){return this.helpers.set(e.uuid,e),{id:e.uuid,shape:t,helpers:this.helpers.size}}async draw_sdf_text(t,e,s,i,n,o){const a=await this.font(s),h=this.sdf_layout(a.layout,s);if(!Array.from({length:e.length},(t,s)=>e.charCodeAt(s)).some(t=>h.glyphs.some(e=>e.unicode===t&&void 0!==e.planeBounds)))throw this.error("bad_request",`The font at ${s} has none of the characters of the text.`);const _=new Ms(h,a.atlas),l=_.add_text(e);return l.set_position(i),l.set_size(n),l.set_color(new r(o??16777215)),_.update(!0),t.scene.add(_),this.track("sdf_text",_)}font(t){let e=this.sdf_fonts.get(t);return void 0===e&&(e=this.load_sdf_font(t,t.replace(/\.json(?=$|[?#])/,".png")).catch(e=>{this.sdf_fonts.delete(t);const s=e instanceof Error?e.message:"string"==typeof e?e:"unknown error";throw this.error("not_found",`Could not load the SDF font at ${t}: ${s}`)}),this.sdf_fonts.set(t,e)),e}font_url(t){if(void 0===t&&void 0===this.sdf_font)throw this.error("bad_request","sdf_text needs a font: no default SDF font is configured.");const e=t??this.sdf_font;if("string"!=typeof e||!/\.json(?=$|[?#])/.test(e))throw this.error("bad_request","font must be the URL of an msdf-atlas-gen .json layout, with its .png atlas next to it.");return e}sdf_layout(t,e){const s=t;if("number"!=typeof s?.atlas?.width||"number"!=typeof s.atlas.height||!Array.isArray(s.glyphs))throw this.error("bad_request",`The font at ${e} is not an msdf-atlas-gen layout.`);if("top"===s.atlas.yOrigin)throw this.error("bad_request",`The font at ${e} has yOrigin top. Generate it with -yorigin bottom.`);return s}build(t,e,s,r,i,n,o){switch(s){case"cube":return t.draw_cube(i,n,o);case"sphere":return t.draw_sphere(i,n,o);case"plane":{const e=t.draw_plane(n,n,o);return e.position.copy(i),e}case"math_sphere":return t.draw_math_sphere(new j(i,n),o);case"label":return t.draw_label(this.text(r.text),i,n,o);default:return t.draw_bounding_box(this.bounds(e,r.object),o)}}clear(t){if(void 0===t.id){const t=this.helpers.size;return this.helpers.forEach(t=>this.dispose(t)),this.helpers.clear(),{removed:t,helpers:0}}const e="string"==typeof t.id?this.helpers.get(t.id):void 0;if(void 0===e)throw this.error("not_found","No helper with that id was drawn through debug_draw.");return this.dispose(e),this.helpers.delete(e.uuid),{removed:1,helpers:this.helpers.size}}dispose(t){t.removeFromParent(),t.traverse(t=>{const e=t;e.geometry?.dispose();(Array.isArray(e.material)?e.material:e.material?[e.material]:[]).forEach(t=>t.dispose()),t instanceof ks&&t.material.uniforms._MainTex.value.dispose()})}bounds(t,e){const{name:s,uuid:r}="object"==typeof e&&null!==e?e:{};if("string"!=typeof r&&"string"!=typeof s)throw this.error("bad_request","bounding_box needs an object with a name or a uuid.");const i="string"==typeof r?t.getObjectByProperty("uuid",r):t.getObjectByName(s);if(void 0===i){const t="string"==typeof r?`uuid ${r}`:`name ${s}`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}const n=(new F).setFromObject(i);if(n.isEmpty())throw this.error("bad_request",`Object "${i.name||i.uuid}" has no geometry, so its bounds are empty.`);return n}text(t){if("string"!=typeof t||0===t.length||t.length>200)throw this.error("bad_request","label and sdf_text need a text of 1 to 200 characters.");return t}position(t){if(void 0===t)return new l;if(!Array.isArray(t)||3!==t.length||!t.every(t=>"number"==typeof t&&Number.isFinite(t)))throw this.error("bad_request","position must be [x, y, z] with finite numbers.");return new l(t[0],t[1],t[2])}size(t){if(void 0===t)return 1;if("number"!=typeof t||!Number.isFinite(t)||t<=0)throw this.error("bad_request","size must be a positive finite number.");return t}color(t){if(void 0===t||"number"==typeof t||"string"==typeof t)return t;throw this.error("bad_request","color must be a number or a string.")}error(t,e){const s=new Error(e);return s.code=t,s}}const Cs={left:0,middle:1,right:2};class js{constructor(t,e,s){this.dispatch=t,this.sleep=e,this.to_client=s}async pointer(t){const e=this.text(t.action,"click"),s=this.space(t.space),r=this.point(t.x,t.y,s),i=this.button(t.button),n=Math.min(1e4,this.positive(t.hold_ms,60)),o=[];if("move"!==e&&"down"!==e&&"click"!==e||(this.send("mousemove",{clientX:r.x,clientY:r.y}),o.push("mousemove")),"down"!==e&&"click"!==e||(this.send("mousedown",{clientX:r.x,clientY:r.y,button:i}),o.push("mousedown")),"click"===e&&await this.sleep(n),"up"!==e&&"click"!==e||(this.send("mouseup",{clientX:r.x,clientY:r.y,button:i}),o.push("mouseup")),0===o.length)throw this.error("bad_request",`Unknown pointer action '${e}'. Use click, down, up or move.`);return{dispatched:o,at:[r.x,r.y]}}async drag(t){const e=this.space(t.space),s=this.pair(t.from,e,"from"),r=this.pair(t.to,e,"to"),i=Math.min(120,Math.max(1,Math.floor(this.positive(t.steps,8)))),n=Math.min(1e4,this.positive(t.duration_ms,240)),o=this.button(t.button),a=[];this.send("mousemove",{clientX:s.x,clientY:s.y}),a.push("mousemove"),this.send("mousedown",{clientX:s.x,clientY:s.y,button:o}),a.push("mousedown");for(let t=1;t<=i;t++){const e=t/i;await this.sleep(n/i),this.send("mousemove",{clientX:s.x+(r.x-s.x)*e,clientY:s.y+(r.y-s.y)*e}),a.push("mousemove")}return this.send("mouseup",{clientX:r.x,clientY:r.y,button:o}),a.push("mouseup"),{dispatched:a,from:[s.x,s.y],to:[r.x,r.y]}}scroll(t){const e=this.number(t.delta);if(null===e)throw this.error("bad_request","scroll requires a numeric delta.");const s=this.space(t.space),r=this.point(void 0===t.x?0:t.x,void 0===t.y?0:t.y,s);return this.send("wheel",{clientX:r.x,clientY:r.y,deltaY:e}),Promise.resolve({dispatched:["wheel"],at:[r.x,r.y],delta:e})}async key(t){const e="string"==typeof t.code&&t.code.length>0?t.code:null;if(null===e)throw this.error("bad_request","key requires a code, for example 'Space' or 'KeyW'.");const s=this.text(t.action,"press"),r=Math.min(1e4,this.positive(t.hold_ms,60)),i=[];if("down"!==s&&"press"!==s||(this.send("keydown",{code:e,key:e}),i.push("keydown")),"press"===s&&await this.sleep(r),"up"!==s&&"press"!==s||(this.send("keyup",{code:e,key:e}),i.push("keyup")),0===i.length)throw this.error("bad_request",`Unknown key action '${s}'. Use press, down or up.`);return{dispatched:i,code:e}}send(t,e){this.dispatch(t,{...e,bubbles:!0,cancelable:!0})}point(t,e,s){const r=this.number(t),i=this.number(e);if(null===r||null===i)throw this.error("bad_request","x and y must be numbers.");return this.to_client(r,i,s)}pair(t,e,s){if(!Array.isArray(t)||t.length<2)throw this.error("bad_request",`${s} must be [x, y].`);const r=t;return this.point(r[0],r[1],e)}space(t){return"ndc"===t?"ndc":"pixels"}button(t){if("string"!=typeof t)return 0;const e=Cs[t.toLowerCase()];return void 0===e?0:e}text(t,e){return"string"==typeof t&&t.length>0?t.toLowerCase():e}number(t){return"number"==typeof t&&Number.isFinite(t)?t:null}positive(t,e){const s=this.number(t);return null===s||s<=0?e:s}error(t,e){const s=new Error(e);return s.code=t,s}}class Fs{constructor(t,e){this.load_gltf=t,this.resources=e}async load(t,e){const s=e.name,r=e.url;if("string"!=typeof s||0===s.length)throw this.error("bad_request","load_object needs a name.");if("string"!=typeof r||0===r.length)throw this.error("bad_request","load_object needs a url.");if(null==t)throw this.error("not_found","There is no current scene to add the model to.");const i="string"==typeof e.version&&e.version.length>0?e.version:null,n=null===i?r:`${r}?v=${encodeURIComponent(i)}`;let o;try{o=await this.load_gltf(n,!0===e.draco)}catch(t){throw this.load_error(r,t)}if(null===o||"object"!=typeof o||void 0===o.scene||null===o.scene)throw this.error("load_failed",`${r} loaded, but it has no scene.`);this.resources.replace_resource(s,r,o);const a=t.children.find(t=>t.name===s);return void 0!==a&&(t.remove(a),this.dispose(a)),o.scene.name=s,void 0!==a&&(o.scene.position.copy(a.position),o.scene.quaternion.copy(a.quaternion),o.scene.scale.copy(a.scale)),t.add(o.scene),this.summarize(s,o.scene)}summarize(t,e){let s=0,r=0;e.traverse(t=>{const e=t;if(!0!==e.isMesh||void 0===e.geometry)return;const i=e.geometry,n=null!==i.index?i.index.count:i.attributes.position?.count??0;s++,r+=Math.floor(n/3)}),e.updateMatrixWorld(!0);const i=(new F).setFromObject(e),n=t=>Math.round(1e4*t)/1e4;return{name:t,meshes:s,triangles:r,bounding_box:i.isEmpty()?null:{min:i.min.toArray().map(n),max:i.max.toArray().map(n)}}}dispose(t){t.traverse(t=>{const e=t;e.geometry?.dispose();const s=Array.isArray(e.material)?e.material:void 0===e.material?[]:[e.material];for(const t of s)t.dispose()})}load_error(t,e){const s=e instanceof Error?e.message:String(e),r=e?.code;return"string"==typeof r?this.error(r,s):/unexpected token '<'|<!doctype/i.test(s)?this.error("not_ready",`Could not load ${t}: the dev server is not serving the file yet. Try again in a moment.`):this.error("load_failed",`Could not load ${t}: ${s}`)}error(t,e){const s=new Error(e);return s.code=t,s}}class qs{read(t,e,s){const r={fps:this.rate(t.delta_time),smooth_fps:this.rate(t.smooth_delta_time),frame_ms:this.round(1e3*this.seconds(t.delta_time),100),elapsed_s:this.round(this.seconds(t.elapsed_time),10),canvas:{width:e.width,height:e.height,render_width:e.render_width,render_height:e.render_height,dpr:e.dpr}},i=this.section(s,"render"),n=this.section(s,"memory");return this.assign(r,"draw_calls",i,"drawCalls"),this.assign(r,"triangles",i,"triangles"),this.assign(r,"geometries",n,"geometries"),this.assign(r,"textures",n,"textures"),r}section(t,e){if("object"!=typeof t||null===t)return null;const s=t[e];return"object"!=typeof s||null===s?null:s}assign(t,e,s,r){if(null===s)return;const i=s[r];"number"==typeof i&&Number.isFinite(i)&&(t[e]=i)}rate(t){const e=this.seconds(t);return e<=0?0:this.round(1/e,10)}seconds(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:0}round(t,e){return Math.round(t*e)/e}}class Ps{constructor(t){this.descriptors=t}list(){return this.descriptors.map(t=>({name:t.name,description:void 0===t.description?"":t.description,options:void 0===t.options?[]:t.options}))}create(t,e){const s="string"==typeof t?t.toLowerCase():null,r=null===s?void 0:this.descriptors.find(t=>t.name.toLowerCase()===s);if(void 0===r){const t=this.descriptors.map(t=>t.name).join(", ");throw this.error("unknown_render_mode",`Unknown render mode. Available modes: ${t}.`)}return r.factory(e)}error(t,e){const s=new Error(e);return s.code=t,s}}class Ns{get(t,e){const s=this.require(t,e);return this.describe(s.node,s.parent)}set(t,e,s){const r=this.require(t,e),i=[];this.apply_vector(r.node.position,s.position)&&i.push("position"),this.apply_vector(r.node.rotation,s.rotation)&&i.push("rotation"),this.apply_vector(r.node.scale,s.scale)&&i.push("scale"),"boolean"==typeof s.visible&&(r.node.visible=s.visible,i.push("visible"));const n=this.describe(r.node,r.parent);return n.changed=i,n}require(t,e){if("object"!=typeof t||null===t)throw this.error("not_found","No scene is set. SceneManager.current is empty.");const s="string"==typeof e.uuid?e.uuid:null,r="string"==typeof e.name?e.name:null;if(null===s&&null===r)throw this.error("not_found","Pass a uuid or a name to identify the object.");const i=this.find(t,null,s,r);if(null===i){const t=null===s?`name '${null===r?"":r}'`:`uuid '${s}'`;throw this.error("not_found",`No object matching ${t} in the current scene.`)}return i}find(t,e,s,r){if(null!==s?t.uuid===s:t.name===r)return{node:t,parent:e};const i=Array.isArray(t.children)?t.children:[];for(const e of i){const i=this.find(e,t,s,r);if(null!==i)return i}return null}apply_vector(t,e){if("object"!=typeof t||null===t||!Array.isArray(e))return!1;const s=["x","y","z"],r=e;let i=!1;for(let e=0;e<s.length;e++){const n=r[e];"number"==typeof n&&Number.isFinite(n)&&(t[s[e]]=n,i=!0)}return i}describe(t,e){const s={uuid:"string"==typeof t.uuid?t.uuid:"(no uuid)",name:"string"==typeof t.name?t.name:"",type:"string"==typeof t.type?t.type:"Object3D",parent:this.parent_label(e),children:Array.isArray(t.children)?t.children.length:0,visible:!1!==t.visible,position:this.vector(t.position,0),rotation:this.vector(t.rotation,0),scale:this.vector(t.scale,1)},r=this.material_type(t.material);null!==r&&(s.material=r);const i=this.vertices(t.geometry);return null!==i&&(s.vertices=i),s}parent_label(t){return null===t?null:"string"==typeof t.name&&t.name.length>0?t.name:"string"==typeof t.uuid?t.uuid:null}material_type(t){if(Array.isArray(t))return`${t.length} materials`;if("object"==typeof t&&null!==t){const e=t.type;return"string"==typeof e?e:"Material"}return null}vertices(t){if("object"!=typeof t||null===t)return null;const e=t.attributes;if("object"!=typeof e||null===e)return null;const s=e.position;if("object"!=typeof s||null===s)return null;const r=s.count;return"number"==typeof r?r:null}vector(t,e){return"object"!=typeof t||null===t?[e,e,e]:[this.round(t.x,e),this.round(t.y,e),this.round(t.z,e)]}round(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:e}error(t,e){const s=new Error(e);return s.code=t,s}}class Os{inspect(t,e){if("object"!=typeof t||null===t)return{root:null,counts:{total:0,meshes:0,returned:0},truncated:!1,notes:["No scene is set. SceneManager.current is empty."]};const s=this.positive(e.depth,4),r=this.positive(e.max_nodes,200),i="string"==typeof e.filter&&e.filter.length>0?e.filter.toLowerCase():null,n=[],o=this.count(t);let a=null;null!==i&&(a=new Set,this.mark(t,i,a),0===a.size&&(n.push(`no nodes matched the filter '${i}'`),a=new Set([t])));const h={used:0,depth_cut:!1,node_cut:!1},_=this.serialise(t,0,s,r,a,h);return h.node_cut&&n.push(`stopped at max_nodes=${r}; ${o.total-h.used} of ${o.total} nodes not returned`),h.depth_cut&&n.push(`stopped at depth=${s}; deeper nodes not returned`),{root:_,counts:{total:o.total,meshes:o.meshes,returned:h.used},truncated:h.node_cut||h.depth_cut,notes:n}}serialise(t,e,s,r,i,n){if(null!==i&&!i.has(t))return null;if(n.used>=r)return n.node_cut=!0,null;n.used++;const o={uuid:"string"==typeof t.uuid?t.uuid:"(no uuid)",name:"string"==typeof t.name?t.name:"",type:"string"==typeof t.type?t.type:"Object3D",position:this.vector(t.position,0)},a=this.vector(t.rotation,0),h=this.vector(t.scale,1);this.is_uniform(a,0)||(o.rotation=a),this.is_uniform(h,1)||(o.scale=h),!1===t.visible&&(o.visible=!1);const _=this.describe_material(t.material);null!==_&&(o.material=_);const l=this.count_vertices(t.geometry);null!==l&&(o.vertices=l);const c=Array.isArray(t.children)?t.children:[];if(0===c.length)return o;if(e+1>s)return n.depth_cut=!0,o.truncated=`${c.length} children hidden (depth limit ${s})`,o;const u=[];let d=0;for(const t of c){const o=this.serialise(t,e+1,s,r,i,n);null!==o?u.push(o):d++}return u.length>0&&(o.children=u),d>0&&null===i&&(o.truncated=`${d} children hidden (max_nodes ${r})`),o}count(t){let e=0,s=0;const r=[t];for(;r.length>0;){const t=r.pop();if("object"!=typeof t||null===t)continue;e++,"Mesh"===t.type&&s++;const i=Array.isArray(t.children)?t.children:[];for(const t of i)r.push(t)}return{total:e,meshes:s}}mark(t,e,s){const r="string"==typeof t.name?t.name.toLowerCase():"",i="string"==typeof t.type?t.type.toLowerCase():"";let n=r.includes(e)||i.includes(e);const o=Array.isArray(t.children)?t.children:[];for(const t of o)this.mark(t,e,s)&&(n=!0);return n&&s.add(t),n}describe_material(t){if(Array.isArray(t)){const e=t.map(t=>this.material_type(t));return`${t.length} materials: ${e.join(", ")}`}return"object"==typeof t&&null!==t?this.material_type(t):null}material_type(t){if("object"==typeof t&&null!==t){const e=t.type;if("string"==typeof e)return e}return"Material"}count_vertices(t){if("object"!=typeof t||null===t)return null;const e=t.attributes;if("object"!=typeof e||null===e)return null;const s=e.position;if("object"!=typeof s||null===s)return null;const r=s.count;return"number"==typeof r?r:null}vector(t,e){return"object"!=typeof t||null===t?[e,e,e]:[this.round(t.x,e),this.round(t.y,e),this.round(t.z,e)]}round(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.round(1e4*t)/1e4:e}is_uniform(t,e){return t.every(t=>t===e)}positive(t,e){return"number"!=typeof t||!Number.isFinite(t)||t<1?e:Math.floor(t)}}class Ls{list(t){const e=this.current(t);return{current:e,views:this.names(t).map(t=>({name:t.name,url:t.url,current:t.name===e}))}}go(t,e){const s="string"==typeof e.name?e.name:null,r=this.names(t);if(null===s||!r.some(t=>t.name===s)){const t=r.map(t=>t.name).join(", ");throw this.error("not_found",`Unknown view. Available views: ${t}.`)}const i=void 0===e.change_url||!0===e.change_url,n=!0===e.skip;return t.go_to_view(s,i,n),{requested:s,current:this.current(t),change_url:i,skip:n}}names(t){return(Array.isArray(t.views)?t.views:[]).filter(t=>"string"==typeof t.name).map(t=>({name:t.name,url:"string"==typeof t.url?t.url:""}))}current(t){const e=t.get_current_view();return"object"!=typeof e||null===e||"string"!=typeof e.name?null:e.name}error(t,e){const s=new Error(e);return s.code=t,s}}class $s extends P{constructor(t=1){super();const e=[];e.push(new l(0,0,0)),e.push(new l(0,0,1e3));const s=new N({color:4474111,depthFunc:O}),r=(new L).setFromPoints(e),i=new $(r,s);i.renderOrder=5e4;const n=[];n.push(new l(0,0,0)),n.push(new l(0,1e3,0));const o=new N({color:4521796,depthFunc:O}),a=(new L).setFromPoints(n),h=new $(a,o);h.renderOrder=5e4;const _=[];_.push(new l(0,0,0)),_.push(new l(1e3,0,0));const c=new N({color:16729156,depthFunc:O}),u=(new L).setFromPoints(_),d=new $(u,c);d.renderOrder=5e4,this.renderOrder=1e5,this.add(i),this.add(h),this.add(d),this.scale.set(t,t,t)}update(){}dispose(){super.dispose()}}class Us extends ks{constructor(t,e,s,r){const i=new us,n={font:e,font_color:s||"#000000"},o=i.draw_on_texture(t,n);o.minFilter=U,o.minFilter=v,o.colorSpace=p,o.needsUpdate=!0,super(o,r),this.simple_text_drawer=i,this.canvas_texture=o,this.draw_settings=n}set text(t){this.simple_text_drawer.draw_canvas(t,this.draw_settings),this.update_texture()}get text(){return"not implemented"}}class Es extends ce{constructor(){super();const t=ut(new e),s=ut(new e),r=ut(new e);this.uniforms._ScreenSpacePosition=t,this.uniforms._ScreenSize=s,this.uniforms._TextureSize=r;const i=mt().mul(r).add(t).div(s);this.vertexNode=dt(i.mul(2).sub(1),0,1)}set_position(t,e){this.uniforms._ScreenSpacePosition.value.set(t,e)}set_texture(t,e,s){this.uniforms._MainTex.value=t,this.uniforms._TextureSize.value.set(t.image.width,t.image.height),void 0!==e&&(this.uniforms._TextureSize.value.x=e),void 0!==s&&(this.uniforms._TextureSize.value.y=s)}set_screen_size(t,e){this.uniforms._ScreenSize.value.set(t,e)}}class Bs extends E{constructor(t,e,s,i){super(t,e,s,i),this.clear_color=new r("#000000"),this.clear_alpha=1}copy(t){return super.copy(t),this.clear_color.copy(t.clear_color),this.clear_alpha=t.clear_alpha,this}}class Is extends n{constructor(t,e,s){t=t||"#FF0000";const r=(e=e||1)-.4,i=new B(.01,.01,r,32);i.translate(0,r/2,0);const n=new I(.1,.4,32);n.translate(0,r+.2,0);const o=oe.mergeGeometries([i,n]);o.rotateX(1.57);super(o,new D({color:t})),s&&this.quaternion.setFromUnitVectors(new l(0,0,1),s),this._dir=s}set dir(t){this.quaternion.setFromUnitVectors(new l(0,0,1),t),this._dir=t}get dir(){return this._dir}set length(t){this.scale.z=t}get length(){return this.scale.z}}class Ds extends n{constructor(t,e,s){t=t||new l(1,1,1),e=e||new l(1,1,1),s=s??16711680;super(new Q(t.x,t.y,t.z,e.x,e.y,e.z),new D({color:s}))}}class Qs extends n{constructor(t,e){e=e??"#FF0000";super(new V(t=t||1,64,64),new D({color:e})),this.radius=t,this.color=e,this.center=this.position}}function Vs(t){return new se({color:t,opacity:.2,transparent:!0,depthWrite:!1})}const Ws=new class{init(){this.Vector3_one=new l(1,1,1),this.Vector3_zero=new l(0,0,0),this.canvas_renderer=void 0,this.display_texture_meshes=[],this.ctx=void 0,this.scene=new i,this.camera=new Bs(60,ye.aspect_ratio,.1,1e3),this.camera.clear_alpha=0}draw_arrow(t,e,s=16711680){const r=new Is(s,e.length(),e.clone().normalize());return r.position.copy(t),this.scene.add(r),r}draw_axis(){const t=new $s;return this.scene.add(t),t}set_debug_RT(t){this.rt_debug=t}draw_rectangle(t,e,s,r){e=e||100,s=s||100,this.ctx.fillStyle=r||"rgba(255, 0, 0, 1)",this.ctx.fillRect(t.x-e/2,this.ctx.canvas.height-t.y-s/2,e,s)}clear(){this.ctx&&this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height)}draw_line_2D(t,e,s){this.ctx.strokeStyle=s||"rgba(255, 0, 0, 1)",this.ctx.beginPath(),this.ctx.moveTo(t.x,t.y),this.ctx.lineTo(e.x,e.y),this.ctx.closePath(),this.ctx.stroke()}draw_line(t,e=16711680){const s=new N({color:e}),r=(new L).setFromPoints(t),i=new $(r,s);return i.frustumCulled=!1,this.scene.add(i),i}draw_cube(t,e,s){e=e||1,s=s??16711680,t=t||new l;const r=new Ds(new l(e,e,e),void 0,s);return r.position.copy(t),this.scene.add(r),r}draw_oriented_cube(t,e,s=1,r="#FF0000",i=.1){const n=t.distanceTo(e),o=new Ds(new l(i,s,n),void 0,r),a=e.clone().sub(t).multiplyScalar(.5),h=a.clone().normalize();return a.add(t),o.position.copy(a),o.quaternion.setFromUnitVectors(new l(0,0,-1),h),this.scene.add(o),o}draw_plane(t,e,s=65280){const r=new o(t,e),i=Vs(s),a=new n(r,i);return a.renderOrder=-1e4,this.scene.add(a),a}draw_empty_cube(t,e,s){e=e||1,s=s??16711680;const r=(new F).setFromCenterAndSize(new l,new l(e,e,e)),i=new W(r,s);return i.position.copy(t||new l),i}draw_sphere(t,e,s){e=e||1,s=s??16711680,t=t||new l;const r=new Qs(e,s);return r.position.copy(t),this.scene.add(r),r}draw_point_array(t,e=!1,s=16711680){const r=new Y(t,e);r.updateArcLengths();const i=r.getSpacedPoints(200);return this.draw_line(i,65280)}draw_sphere_helper(t,e){e=e??16711680;const s=new V(t.radius,32,32),r=new D({color:e}),i=new n(s,r);return i.position.copy(t.center),be.current.add(i),i}draw_math_sphere(t,e=16711680){const s=new V(t.radius,32,32),r=Vs(e),i=new n(s,r);return i.position.copy(t.center),be.current.add(i),i}draw_bounding_box(t,e=16776960){const s=new W(t,e);return be.current.add(s),s}draw_curve(t,e){const s=new l(0,0,0);e&&(s.y=e.offset||0);for(let e=0;e<t.length-1;e++)this.draw_line([t[e].clone().add(s),t[e+1].clone().add(s)])}draw_texture(t,e,s){const r=new n(new o(1,1),new Es);return r.frustumCulled=!1,this.display_texture_meshes.push(r),this.scene.add(r),r.material.set_texture(t,e,s),r}draw_label(t,s,i=1,n=16777215){const o=new Us(t,"bold 48px Arial",new r(n).getStyle(),new e);return o.size=new l(i,i,i),o.screen_aligned=!0,o.position.copy(s||new l),this.scene.add(o),o}render(t){for(let t=0;t<this.display_texture_meshes.length;t++)this.display_texture_meshes[t].material.set_screen_size(ye.width,ye.height);this.scene.children.length>0&&t.render(this.scene,fe.current)}};class Ys{constructor(t){this.reply=t,this.handlers={},this.queue=[]}register(t,e,s){this.handlers[t]={timing:e,handler:s}}handle(t){const e=this.handlers[t.cmd],s=void 0===t.args?{}:t.args;void 0!==e?"frame_end"!==e.timing?this.run(t.id,s,e.handler):this.queue.push({id:t.id,args:s,handler:e.handler}):this.reply({id:t.id,ok:!1,error:{code:"unknown_command",message:`Unknown command '${t.cmd}'`}})}drain(){const t=this.queue;this.queue=[];for(const e of t)this.run(e.id,e.args,e.handler)}run(t,e,s){try{Promise.resolve(s(e)).then(e=>this.reply({id:t,ok:!0,result:e})).catch(e=>this.reply({id:t,ok:!1,error:this.to_error(e)}))}catch(e){this.reply({id:t,ok:!1,error:this.to_error(e)})}}to_error(t){const e=t?.code,s=t?.message;return{code:void 0===e?"handler_failed":e,message:"string"==typeof s?s:this.describe(t)}}describe(t){return"string"==typeof t?t:"Handler failed with a non-Error value of type "+typeof t}}class Xs{constructor(){this.socket=null,this.options=null,this.retry_timer=0,this.disposed=!1,this.dispatcher=new Ys(t=>this.send_reply(t))}init(t){this.options=t,this.disposed=!1,this.connect()}register(t,e,s){this.dispatcher.register(t,e,s)}on_frame_end(){this.dispatcher.drain()}dispose(){this.disposed=!0,window.clearTimeout(this.retry_timer),null!==this.socket&&(this.socket.onclose=null,this.socket.close(),this.socket=null)}connect(){const t=this.options;if(this.disposed||null===t)return;const e=new WebSocket(`ws://127.0.0.1:${t.port}`);this.socket=e,e.onopen=()=>{e.send(JSON.stringify({event:"hello",protocol:1,app:t.app_info()}))},e.onmessage=t=>this.on_message(t),e.onclose=()=>{this.socket===e&&(this.socket=null),this.schedule_retry()},e.onerror=()=>{}}on_message(t){const e=t.data;if("string"!=typeof e)return;const s=this.parse_frame(e);if(null!==s)if("welcome"!==s.event){if("refused"===s.event){const t=this.as_text(s.reason),e=this.as_text(s.server_protocol);return void console.warn(`[ohzi-mcp] bridge refused: ${t} (server protocol ${e}, this app speaks 1)`)}"string"==typeof s.id&&"string"==typeof s.cmd&&this.dispatcher.handle(s)}else console.info("[ohzi-mcp] bridge connected")}parse_frame(t){try{const e=JSON.parse(t);return"object"!=typeof e||null===e?null:e}catch{return null}}as_text(t){return"string"==typeof t?t:"number"==typeof t||"boolean"==typeof t?String(t):"(unknown)"}send_reply(t){null!==this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(JSON.stringify(t))}schedule_retry(){this.disposed||(window.clearTimeout(this.retry_timer),this.retry_timer=window.setTimeout(()=>this.connect(),2e3))}}class Hs{constructor(){}get is_animating(){return!1}on_enter(t){}update(t){}on_exit(t){}}class Zs{constructor(){this.t=0,this.easing_function_t=0}get is_animating(){return!0}on_enter(t){}update(t){this.t+=ns.delta_time/t.duration,this.easing_function_t=t.easing_function(this.t),this.easing_function_t=Ke.clamp(this.easing_function_t,0,1),t.set_property_value(Ke.lerp(t.from,t.to,this.easing_function_t)),this.easing_function_t>=.9999&&(t.set_property_value(t.to),t.set_current_state(new Hs),t.finished_callback(t))}on_exit(t){}}class Ks{constructor({element:t,css_property:e,from:s=0,to:r=1,duration:i=1,value_prefix:n="",value_suffix:o="",easing_function:a=Ge.ease_in_out_cubic,finished_callback:h=()=>{}}){this.element=t,this.css_property=e,this.from=s,this.to=r,this.value_prefix=n,this.value_suffix=o,this.duration=i,this.easing_function=a,this.finished_callback=h,this.current_state=new Hs}animate(){this.set_current_state(new Zs)}stop(){this.set_current_state(new Hs)}set_property_value(t){this.element.style[this.css_property]=`${this.value_prefix}${t}${this.value_suffix}`}update(){this.current_state.update(this)}get is_animating(){return this.current_state.is_animating}set_current_state(t){this.current_state.on_exit(this),this.current_state=t,this.current_state.on_enter(this)}}const Js=new class{init(){this.operating_systems={ANDROID:"android",IOS:"ios",LINUX:"linux",MAC:"mac",WINDOWS:"windows"},this.is_mobile=!!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/),this.is_ipad=!!(navigator.userAgent.match(/Mac/)&&navigator.maxTouchPoints&&navigator.maxTouchPoints>2),this.is_ios=!!navigator.userAgent.match(/(iPhone|iPod|iPad)/)||this.is_ipad,this.is_android=this.get_os()===this.operating_systems.ANDROID,this.is_linux=this.get_os()===this.operating_systems.LINUX,this.is_mac=this.get_os()===this.operating_systems.MAC,this.is_windows=this.get_os()===this.operating_systems.WINDOWS}get_os(){const t=window.navigator.userAgent,e=window.navigator.platform;let s=null;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(e)?s=this.operating_systems.MAC:-1!==["iPhone","iPad","iPod"].indexOf(e)?s=this.operating_systems.IOS:-1!==["Win32","Win64","Windows","WinCE"].indexOf(e)?s=this.operating_systems.WINDOWS:/Android/.test(t)?s=this.operating_systems.ANDROID:!s&&/Linux/.test(e)&&(s=this.operating_systems.LINUX),s}};const Gs=new class{init(){this.target_geometry=void 0,this.target_position=new l}set_target_geometry(t){this.target_geometry=t}};class tr{constructor(){}fit_points(t,e,s,r){const i=this.get_view_bounds(t,e),n=this.get_distance_to_fit_rect(i.size.x/2,i.size.y/2,s,r);return{center:i.center,distance_to_center:n}}get_view_bounds(t,e){const s=e.clone().invert(),r=[];for(let e=0;e<t.length;e++)r.push(t[e].clone().applyQuaternion(s));const i=(new F).setFromPoints(r),n=new l;i.getSize(n);const o=1e-9*Math.max(n.x,n.y,n.z);n.set(n.x>o?n.x:0,n.y>o?n.y:0,n.z>o?n.z:0);const a=new l;return i.getCenter(a),a.applyQuaternion(e),{center:a,size:n}}get_zoom_to_fit_size(t,e,s,r=1){const i=Math.min(Math.abs((t.right-t.left)/e),Math.abs((t.top-t.bottom)/s));return Number.isFinite(i)?i*r:t.zoom}get_distance_to_fit_depth(t,e,s){const r=e+t.near,i=t.far-e;let n=Math.max(s,r);return n>i&&(n=Math.max(r,i)),n}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}class er{constructor(){this.sphere=new j}fit_points(t,e,s,r){this.sphere.setFromPoints(t);const i=Ke.degToRad(s/2),n=2*Math.atan(Math.tan(i)*r)/2,o=this.get_up_plane_normal(e,i),a=this.get_down_plane_normal(e,i),h=this.get_left_plane_normal(e,n),_=this.get_right_plane_normal(e,n),c=new l(0,0,-1).applyQuaternion(e),u=this.sphere.center.clone(),d=this.get_distance_to_fit_rect(2*this.sphere.radius,2*this.sphere.radius,s,r),p=u.clone().add(c.clone().multiplyScalar(-1*d)),m=(new X).setFromNormalAndCoplanarPoint(o,p),g=(new X).setFromNormalAndCoplanarPoint(a,p),f=(new X).setFromNormalAndCoplanarPoint(h,p),y=(new X).setFromNormalAndCoplanarPoint(_,p);this.apply_center_correction_to_pos(p,t,e,m,g,f,y),m.setFromNormalAndCoplanarPoint(o,p),g.setFromNormalAndCoplanarPoint(a,p),f.setFromNormalAndCoplanarPoint(h,p),y.setFromNormalAndCoplanarPoint(_,p);let b=1/0;const w=c.clone().multiplyScalar(-2*d);for(let e=0;e<t.length;e++){const s=new H(t[e].clone(),t[e].clone().add(w)),r=new l,i=new l,n=new l,o=new l;m.intersectLine(s,r),g.intersectLine(s,i),f.intersectLine(s,n),y.intersectLine(s,o),r.length()<1e-4&&console.log("up intersection not found",e),i.length()<1e-4&&console.log("down intersection not found",e),n.length()<1e-4&&console.log("left intersection not found",e),o.length()<1e-4&&console.log("right intersection not found",e);const a=t[e].clone().sub(r).length(),h=t[e].clone().sub(i).length(),_=t[e].clone().sub(n).length(),c=t[e].clone().sub(o).length(),u=Math.min(a,h),d=Math.min(_,c),p=Math.min(u,d);p<b&&(b=p)}const x=c.clone().multiplyScalar(b);return p.clone().add(x)}apply_center_correction_to_pos(t,e,s,r,i,n,o){const a=this.get_vertical_correction(e,i,r,s),h=this.get_horizontal_correction(e,n,o,s);t.add(a),t.add(h)}get_vertical_correction(t,e,s,r){let i=1/0,n=1/0;const o=new l(0,1,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const a=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(-5e6))),h=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(5e6))),_=new l,c=new l;e.intersectLine(a,_),s.intersectLine(h,c);const u=_.distanceTo(t[r]),d=c.distanceTo(t[r]);c.length()<1e-4&&console.log("vertical up intersection not found",r),_.length()<1e-4&&console.log("vertical down intersection not found",r),u<n&&(n=u),d<i&&(i=d)}const a=(i-n)/2;return o.clone().multiplyScalar(-a)}get_horizontal_correction(t,e,s,r){let i=1/0,n=1/0;const o=new l(1,0,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const a=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(-5e6))),h=new H(t[r].clone(),t[r].clone().add(o.clone().multiplyScalar(5e6))),_=new l,c=new l;e.intersectLine(a,_),s.intersectLine(h,c);const u=_.distanceTo(t[r]),d=c.distanceTo(t[r]);_.length()<1e-4&&console.log("left intersection not found",r),c.length()<1e-4&&console.log("right intersection not found",r),u<n&&(n=u),d<i&&(i=d)}const a=(i-n)/2;return o.clone().multiplyScalar(-a)}get_up_plane_normal(t,e){const s=new l(0,-1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),e)),s.applyQuaternion(t),s}get_down_plane_normal(t,e){const s=new l(0,1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),-e)),s.applyQuaternion(t),s}get_left_plane_normal(t,e){const s=new l(1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),e)),s.applyQuaternion(t),s}get_right_plane_normal(t,e){const s=new l(-1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),-e)),s.applyQuaternion(t),s}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}const sr=new class{init(t){this.tmp_mat=new M,this.plane=new X,this.ray=new Z,this.tmp_size=new l,this.tmp_unproj=new l,this.input=t}get_up_dir(t){t=t||fe.current;const e=new l;return e.set(0,1,0),e.applyQuaternion(t.quaternion),e}get_forward_dir(t){t=t||fe.current;const e=new l;return e.set(0,0,-1),e.applyQuaternion(t.quaternion),e}get_right_dir(t){t=t||fe.current;const e=new l;return e.set(1,0,0),e.applyQuaternion(t.quaternion),e}unproject_mouse_position(t,e){e=e||fe.current;const s=new l,r=e.fov/2*Math.PI/180,i=2*Math.atan(Math.tan(r)*e.aspect)/2,n=Math.tan(r)*e.far,o=Math.tan(i)*e.far;return s.set(o*t.x,n*t.y,-e.far).normalize(),s.applyQuaternion(e.quaternion)}get_plane_intersection(t,e,s,r){r=r||fe.current,s=s||this.input.NDC;const i=new l;if(this.plane.setFromNormalAndCoplanarPoint(e||this.get_forward_dir(r),t),r.isPerspectiveCamera)this.ray.set(r.position,this.unproject_mouse_position(s,r));else{const t=r,e=(t.right+t.left)/2,i=(t.top+t.bottom)/2,n=(t.right-t.left)/(2*t.zoom),o=(t.top-t.bottom)/(2*t.zoom),a=new l(e+s.x*n,i+s.y*o,0);a.applyQuaternion(r.quaternion),a.add(r.position);const h=new l(0,0,-1).applyQuaternion(r.quaternion);this.ray.set(a,h)}return this.ray.intersectPlane(this.plane,i),i}fit_points_on_camera(t,e=1){const s=(new tr).get_view_bounds(t,fe.current.quaternion),r=s.size.clone().multiplyScalar(e);return{position:s.center,zoom:this.get_zoom_to_fit_rect(r.x/2,r.y/2)}}get_zoom_to_fit_rect(t,e){const s=fe.current;if(s.isOrthographicCamera)return(new tr).get_zoom_to_fit_size(s,2*t,2*e);const r=s,i=r.fov/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r.aspect)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}get_zoom_to_fit_box(t,e){return e=e||fe.current,t.isEmpty()?e.isOrthographicCamera?e.zoom:0:this.fit_bounding_box_points(e,t).zoom}get_html_screen_pos(t,e){e=e||fe.current;const s=new l;return t.getWorldPosition(s),s.project(e),s.x=(.5*s.x+.5)*ye.width,s.y=(1-(.5*s.y+.5))*ye.height,s}world_pos_to_screen(t,e){e=e||fe.current;const s=new l;return s.copy(t),s.project(e),s.x=(.5*s.x+.5)*ye.width,s.y=(1-(.5*s.y+.5))*ye.height,s}update_projection(t){const e=t;e.left=-ye.width/2,e.right=ye.width/2,e.top=ye.height/2,e.bottom=-ye.height/2,e.aspect=ye.aspect_ratio,e.updateProjectionMatrix()}fit_bounding_box_points(t,e,s=1){const r=new l;r.copy(e.max).sub(e.min);const i=e.min.clone(),n=i.clone().add(new l(r.x,0,0)),o=i.clone().add(new l(0,r.y,0)),a=i.clone().add(new l(0,0,r.z)),h=i.clone().add(new l(r.x,0,r.z)),_=i.clone().add(new l(0,r.y,r.z)),c=e.max.clone(),u=i.clone().add(new l(r.x,r.y,0));return this.fit_points(t,[i,n,o,a,h,_,c,u],s)}fit_points(t,e,s=1){const r=t;if(r.isPerspectiveCamera){const i=new l(0,0,-1).applyQuaternion(t.quaternion),n=i.clone().multiplyScalar(-1),o=(new er).fit_points(e,t.quaternion,r.fov*s,r.aspect),a=(new F).setFromPoints(e),h=new l;a.getCenter(h);const _=(new X).setFromNormalAndCoplanarPoint(n,h),c=new Z(o,i),u=new l;c.intersectPlane(_,u);return{zoom:o.distanceTo(u),reference_position:u,camera_position:o}}{const r=t,i=new tr,n=i.get_view_bounds(e,t.quaternion),o=new l(0,0,1).applyQuaternion(t.quaternion),a=t.position.clone().sub(n.center).dot(o),h=i.get_distance_to_fit_depth(r,n.size.z/2,a);return{zoom:i.get_zoom_to_fit_size(r,n.size.x,n.size.y,s),reference_position:n.center,camera_position:n.center.clone().addScaledVector(o,h)}}}};const rr=new class{constructor(){}init(t){fe.init(),sr.init(t),ds.init(),Js.init(),$e.init(),Gs.init(),Fe.init(),be.init(new He({name:"default_scene",compilators:{}})),ye.init(),ns.init(),Ws.init()}dispose(t){Re.dispose(),be.dispose(),t.dispose()}};class ir{constructor(){this.on_key_down=t=>{90===t.keyCode&&t.ctrlKey&&!this.ctrlz_fired&&(this.ctrlz_pressed=!0,this.ctrlz_fired=!0),t.code&&this.press_key(t.code)},this.on_key_up=t=>{this.release_key(t.code)}}init(t){this.ctrlz_pressed=!1,this.ctrlz_fired=!1,this.keys={},this.keys_keys=[],this.container=t,this.container.addEventListener("keydown",this.on_key_down,!1),this.container.addEventListener("keyup",this.on_key_up,!1)}clear(){this.ctrlz_pressed=!1;for(let t=0;t<this.keys_keys.length;t++)this.keys[this.keys_keys[t]].pressed=!1,this.keys[this.keys_keys[t]].released=!1}release_key(t){const e=this.keys[t];e&&(e.fired=!1,e.down=!1,e.released=!0)}release_keys(){this.ctrlz_fired=!1;for(let t=0;t<this.keys_keys.length;t++)this.keys[this.keys_keys[t]].fired=!1,this.keys[this.keys_keys[t]].down=!1}press_key(t){const e=this.keys[t];e&&(!1===e.down&&(e.pressed=!0),e.down=!0,e.fired=!0)}is_key_pressed(t){const e=this.keys[t];return!!e&&e.pressed}is_key_down(t){const e=this.keys[t];return!!e&&e.down}is_key_released(t){const e=this.keys[t];return!!e&&e.released}register_key(t){this.keys[t]={key_name:t,pressed:!1,down:!1,fired:!1,released:!1},this.keys_keys=Object.keys(this.keys)}unregister_key(t){delete this.keys[t]}dispose(){this.container.removeEventListener("keydown",this.on_key_down,!1),this.container.removeEventListener("keyup",this.on_key_up,!1)}}class nr extends a{constructor(t,e,s,i,n,o){super(t,e,s,i,n,o),this.clear_color=new r("#000000"),this.clear_alpha=1}copy(t){return super.copy(t),this.clear_color.copy(t.clear_color),this.clear_alpha=t.clear_alpha,this}}class or extends ce{constructor(e=!1){super();const s=ct(new t),r=ut(1);this.uniforms._BlurredTex=s,this.uniforms._BloomStrength=r;const i=this.sample(s);e?(this.fragmentNode=i,this.blending=K,this.blendSrc=J,this.blendDst=J):this.fragmentNode=this.sample_main_tex().add(i.mul(r))}}const ar=[[-4,.0525],[-3,.075],[-2,.11],[-1,.15],[0,.225],[1,.15],[2,.11],[3,.075],[4,.0525]];class hr extends ce{constructor(){super();const t=ut(new e);this.uniforms._SampleDir=t;const s=this.uniforms._Resolution,r=t.mul(bt(.5).div(s)),i=ar.map(([t,e])=>(0===t?this.sample_main_tex():this.sample_main_tex(r.mul(2*t))).mul(e));this.fragmentNode=i.reduce((t,e)=>t.add(e))}}class _r{constructor(){this.RT1=new _(1,1),this.RT2=new _(1,1),this.box_blur_mat=new hr}blur(t){t.width===this.RT1.width&&t.height===this.RT1.height||(this.RT1.setSize(t.width,t.height),this.RT2.setSize(t.width,t.height)),this.box_blur_mat.uniforms._SampleDir.value.set(1,0),Re.blit(t,this.RT1,this.box_blur_mat),this.box_blur_mat.uniforms._SampleDir.value.set(0,1),Re.blit(this.RT1,t,this.box_blur_mat)}dispose(){this.RT1.dispose(),this.RT2.dispose(),this.box_blur_mat.dispose()}}const lr=[[0,0,4],[-1,-1,1],[1,1,1],[1,-1,1],[-1,1,1]],cr=[[-2,0,1],[-1,1,2],[0,2,1],[1,1,2],[2,0,1],[1,-1,2],[0,-2,1],[-1,-1,2]];class ur extends ce{constructor(t){super();const e=bt(.5).div(this.uniforms._Resolution),s=t?cr:lr,r=s.map(([t,s,r])=>this.sample_main_tex(e.mul(bt(t,s))).mul(r)),i=s.reduce((t,[,,e])=>t+e,0);this.fragmentNode=r.reduce((t,e)=>t.add(e)).div(i)}}class dr{constructor(){this.current_width=1,this.current_height=1,this.RT0=new _(1,1),this.RT1=new _(1,1),this.RT2=new _(1,1),this.RT3=new _(1,1),this.RT4=new _(1,1),this.upscale_blur_mat=new ur(!0),this.downscale_blur_mat=new ur(!1)}blur(t){this.check_RT_resize(t.width,t.height),Re.blit(t,this.RT1),Re.blit(this.RT1,this.RT2,this.downscale_blur_mat),Re.blit(this.RT2,this.RT3,this.downscale_blur_mat),Re.blit(this.RT3,this.RT4,this.downscale_blur_mat),Re.blit(this.RT4,this.RT3,this.upscale_blur_mat),Re.blit(this.RT3,this.RT2,this.upscale_blur_mat),Re.blit(this.RT2,t,this.upscale_blur_mat)}check_RT_resize(t,e){this.current_width===t&&this.current_height===e||(this.current_width=t,this.current_height=e,this.resize(this.RT1,2),this.resize(this.RT2,4),this.resize(this.RT3,8),this.resize(this.RT4,16))}dispose(){this.RT0.dispose(),this.RT1.dispose(),this.RT2.dispose(),this.RT3.dispose(),this.RT4.dispose(),this.upscale_blur_mat.dispose(),this.downscale_blur_mat.dispose()}resize(t,e){t.setSize(Math.max(1,Math.floor(this.current_width/e)),Math.max(1,Math.floor(this.current_height/e)))}}class pr extends me{constructor(t=!1){super(),this.use_dual_filtering=t,this.bloom_compose_mat=new or,window.bloom_mat=this.bloom_compose_mat,this.main_RT=void 0,this.blur_RT=void 0,this.blurrer=void 0}on_enter(){this.blurrer=this.use_dual_filtering?new dr:new _r,this.main_RT=new _(ye.width,ye.height),this.blur_RT=new _(ye.width,ye.height)}on_exit(){this.blurrer.dispose(),this.main_RT.dispose(),this.blur_RT.dispose()}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),Re.blit(this.main_RT,this.blur_RT),this.blurrer.blur(this.blur_RT),this.bloom_compose_mat.uniforms._BlurredTex.value=this.blur_RT.texture,Re.blit(this.main_RT,void 0,this.bloom_compose_mat)}__check_RT_size(){this.main_RT.width===ye.width&&this.main_RT.height===ye.height||(this.main_RT.setSize(ye.width,ye.height),this.blur_RT.setSize(ye.width,ye.height))}}class mr extends ee{constructor(){super(),this.colorNode=dt(Ut(dt(Et(Bt),1),p))}}class gr extends me{constructor(){super(),this.normal_material=new mr}render(){Re.clear(void 0,fe.current,!0,!0),Re.render(be.current,fe.current,void 0,this.normal_material)}}class fr extends ee{constructor(e=1){super();const s=ut(e),r=ct(new t),i=ct(new t),n=ut(new M);this.uniforms={_Intensity:s,_AlbedoTex:r,_NormalDepthTex:i,_InverseProjMatrix:n};const o=bt(It.x.mul(2).sub(1),It.y.mul(-2).add(1)),a=n.mul(dt(o,1,1)),h=i.sample(It),_=a.xyz.div(a.w).mul(ze(h.xy)),l=zt(Te(h.zw)),c=r.sample(It).rgb,u=Dt.sub(_),d=Qt(wt(l,zt(u))),p=s.div(wt(u,u));this.colorNode=dt(c.mul(d).mul(p),1),this.blending=G,this.depthWrite=!1,this.side=tt}set_inverse_proj_matrix(t){this.uniforms._InverseProjMatrix.value.copy(t)}set_normal_depth_rt(t){this.uniforms._NormalDepthTex.value=t.texture}set_albedo_rt(t){this.uniforms._AlbedoTex.value=t.texture}}class yr extends me{constructor(){super(),this.main_rt=new _(ye.width,ye.height),this.scene_lights=new He({name:"lights_scene",compilators:{}});const t=Math.sqrt(204.8)/2,e=new n(new V(t),new fr(1));for(let t=0;t<2;t++)for(let s=0;s<2;s++){const r=e.clone();r.position.set(2*t-1,1,2*s-1),this.scene_lights.add(r)}this.camera_inverse_proj_mat=new M}on_enter(){Re.generate_depth_normal_texture=!0}render(){this.__check_RT_size(),Re.clear(this.main_rt,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_rt),this.camera_inverse_proj_mat.copy(fe.current.projectionMatrix).invert();const t=this.camera_inverse_proj_mat,e=this.main_rt,s=Re.depth_normals_RT;this.scene_lights.traverse(r=>{r.material&&(r.material.set_inverse_proj_matrix(t),r.material.set_normal_depth_rt(s),r.material.set_albedo_rt(e))}),Re.clear(void 0,fe.current,!0,!0),Re.render(this.scene_lights,fe.current)}__check_RT_size(){this.main_rt.width===ye.width&&this.main_rt.height===ye.height||this.main_rt.setSize(ye.width,ye.height)}}class br extends ce{constructor(){super();const e=ct(new t);this.uniforms._AO=e;const s=this.sample(e).r;this.fragmentNode=dt(this.sample_main_tex().rgb.mul(s.oneMinus()),1)}}class wr extends ce{constructor(t=!0){super(),this.sample_kernel=this.__get_sample_kernel(),this.use_exact_depth=t;const e=ut(new M),s=ut(new M),r=ut(.0125),i=ut(.3),n=Vt(this.sample_kernel,"vec3"),o=ct(this.__get_rotation_texture());Object.assign(this.uniforms,{_InverseProjMatrix:e,_ProjectionMatrix:s,_Bias:r,_Radius:i,_SampleKernel:n,_RandomRotation:o});const a=this.uniforms._MainTex,h=this.uniforms._Resolution,_=t?t=>{const e=t.mul(h).sub(.5),s=Zt(e),r=e.sub(s),i=h.sub(1),n=(t,e)=>{const r=Lt(s.add(bt(t,e)),bt(0),i);return ze(a.load(Kt(r)).xy)};return gt(gt(n(0,0),n(1,0),r.x),gt(n(0,1),n(1,1),r.x),r.y)}:t=>ze(a.sample(t).xy),l=t=>{const s=e.mul(dt(t.mul(2).sub(1),1,1)),r=_(this.texture_uv_at(a,t));return s.xyz.div(s.w).mul(r)};this.fragmentNode=ft(()=>{const t=l(mt()).toVar(),e=zt(Te(this.sample_main_tex().zw)).toVar(),a=o.sample(mt().mul(h.div(4))).xy.mul(2).sub(1),_=zt(xt(a,0)),c=zt(_.sub(e.mul(wt(_,e)))).toVar(),u=zt(Wt(e,c)).toVar(),d=vt(0).toVar();return Yt(64,({i:o})=>{const a=xt(n.element(o)),h=t.add(c.mul(a.x).add(u.mul(a.y)).add(e.mul(a.z)).mul(i)),_=s.mul(dt(h,1)),p=_.xy.div(_.w).mul(.5).add(.5),m=l(p).z,g=Xt(0,1,i.div(Mt(t.z.sub(m))));d.addAssign(Ht(h.z.add(r),m).mul(g))}),dt(xt(d.div(64)),1)})()}set_projection_matrix(t){this.uniforms._ProjectionMatrix.value.copy(t),this.uniforms._InverseProjMatrix.value.copy(t).invert()}__get_sample_kernel(){const t=[];for(let e=0;e<64;e++){const s=new l(2*Math.random()-1,2*Math.random()-1,Math.random());s.normalize();let r=e/64;r=Ke.lerp(.1,1,r*r),s.multiplyScalar(r),t.push(s)}return t}__get_rotation_texture(){const t=new Uint8Array(64);for(let e=0;e<16;e++)t[4*e+0]=Math.floor(255*Math.random()),t[4*e+1]=Math.floor(255*Math.random()),t[4*e+2]=0,t[4*e+3]=255;const e=new et(t,4,4,st);return e.wrapS=rt,e.wrapT=rt,e.needsUpdate=!0,e}}class xr extends me{constructor(t=!1,e=!0){super(),this.ssao_mat=new wr(e),this.ssao_compose_mat=new br,this.ssaa=t?2:1,this.main_RT=new _(ye.width*this.ssaa,ye.height*this.ssaa),this.SSAO_RT=new _(ye.width,ye.height),this.blurrer=new _r}on_enter(){Re.generate_depth_normal_texture=!0}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),this.ssao_mat.set_projection_matrix(fe.current.projectionMatrix),Re.blit(Re.depth_normals_RT,this.SSAO_RT,this.ssao_mat),this.blurrer.blur(this.SSAO_RT),this.ssao_compose_mat.uniforms._AO.value=this.SSAO_RT.texture,Re.blit(this.main_RT,void 0,this.ssao_compose_mat)}__check_RT_size(){this.main_RT.width===ye.width*this.ssaa&&this.main_RT.height===ye.height*this.ssaa||(this.main_RT.setSize(ye.width*this.ssaa,ye.height*this.ssaa),this.SSAO_RT.setSize(ye.width,ye.height))}}class vr extends me{constructor(){super()}render(){Re.clear(void 0,fe.current,!0,!0),be.current.on_pre_render(),be.current.render(),be.current.on_post_render()}}function zr(t,e){return.39894*Math.exp(-.5*t*t/(e*e))/e}class Mr extends ce{constructor(t){super();const s=ut(new e(.5,.5)),r=ut(new e(.5,.5)),i=ut(1);this.uniforms.texSize=s,this.uniforms.direction=r,this.uniforms.radius=i;const n=t,o=r.mul(bt(1).div(s)).mul(i);let a=zr(0,n),h=this.sample_main_tex().mul(a);for(let e=1;e<t;e++){const t=zr(e,n),s=o.mul(e),r=this.sample_main_tex(s).add(this.sample_main_tex(s.negate()));h=h.add(r.mul(t)),a+=2*t}this.fragmentNode=h.div(a)}set_size(t,e){this.uniforms.texSize.value.set(t,e)}set_direction(t,e){this.uniforms.direction.value.set(t,e)}set_radius(t=1){this.uniforms.radius.value=t}}const Tr=xt(.299,.587,.114);class kr extends ce{constructor(){super();const t=ut(.23),e=ut(.01),s=ut(new r("#000000")),i=ut(0);this.uniforms.luminosityThreshold=t,this.uniforms.smoothWidth=e,this.uniforms.defaultColor=s,this.uniforms.defaultOpacity=i;const n=this.sample_main_tex(),o=wt(n.rgb,Tr),a=Xt(t,t.add(e),o);this.fragmentNode=gt(dt(s,i),n,a)}set_threshold(t){this.uniforms.luminosityThreshold.value=t}}class Ar{constructor(t=!1){this.current_width=1,this.current_height=1,this.separableBlurMaterials=[],this.renderTargetsHorizontal=[],this.renderTargetsVertical=[],this.use_half_float=t,this.nMips=5,this.kernelSizeArray=[3,5,7,9,11],this.rt_pars={minFilter:v,magFilter:v,format:st,type:t?it:nt,colorSpace:t?ot:p},this.renderTargetBright=new _(1,1,this.rt_pars),this.renderTargetBright.texture.generateMipmaps=!1,this.init_materials(),this.init_RT(),this.luminosity_high_pass_mat=new kr}blur(t,e){this.resize_RT(t.width,t.height);let s=t;e&&(Re.blit(t,this.renderTargetBright,this.luminosity_high_pass_mat),s=this.renderTargetBright);for(let t=0;t<this.nMips;t++){const e=this.separableBlurMaterials[t];e.set_direction(1,0),Re.blit(s,this.renderTargetsHorizontal[t],e),e.set_direction(0,1),Re.blit(this.renderTargetsHorizontal[t],this.renderTargetsVertical[t],e),s=this.renderTargetsVertical[t]}}get_blurred_texture(){return this.renderTargetsHorizontal[0].texture}get_blurred_RT(){return this.renderTargetsHorizontal[0]}init_RT(){this.dispose_RT(),this.renderTargetBright.setSize(1,1);for(let t=0;t<this.nMips;t++){const t=new _(1,1,this.rt_pars),e=new _(1,1,this.rt_pars);t.texture.generateMipmaps=!1,e.texture.generateMipmaps=!1,t.texture.colorSpace=this.rt_pars.colorSpace,e.texture.colorSpace=this.rt_pars.colorSpace,this.renderTargetsHorizontal.push(t),this.renderTargetsVertical.push(e)}}resize_RT(t,e){if(this.current_width===t&&this.current_height===e)return;this.current_width=t,this.current_height=e;let s=Math.round(t/2),r=Math.round(e/2);this.renderTargetBright.setSize(s,r);for(let t=0;t<this.nMips;t++)this.renderTargetsVertical[t].setSize(s,r),this.renderTargetsHorizontal[t].setSize(s,r),this.separableBlurMaterials[t].set_size(s,r),s=Math.round(s/2),r=Math.round(r/2)}init_materials(){this.dispose_materials();for(let t=0;t<this.nMips;t++)this.separableBlurMaterials.push(new Mr(this.kernelSizeArray[t]))}set_radius(t){for(let e=0;e<this.separableBlurMaterials.length;e++)this.separableBlurMaterials[e].set_radius(t)}set_luminosity_threshold(t){this.luminosity_high_pass_mat.set_threshold(t)}dispose_materials(){for(let t=0;t<this.separableBlurMaterials.length;t++)this.separableBlurMaterials[t].dispose();this.separableBlurMaterials.length=0}dispose_RT(){for(let t=0;t<this.renderTargetsVertical.length;t++)this.renderTargetsHorizontal[t].dispose(),this.renderTargetsVertical[t].dispose();this.renderTargetBright.dispose(),this.renderTargetsHorizontal.length=0,this.renderTargetsVertical.length=0}}class Sr extends me{constructor(t,e,s,r=!1){super(),this.add_mat=new ue(e);const i={samples:t?4:1,type:e?it:nt,format:st,colorSpace:ot,minFilter:w,magFilter:w};this.use_rendering_size=r,this.main_RT=new _(1,1,i),this.main_RT.texture.colorSpace=ot,this.main_RT.texture.minFilter=w,this.main_RT.texture.magFilter=w,this.bloom_compose_mat=new pe(5,e),this.blurrer=new Ar(e),this.use_hight_luminosity_pass=s,this.luminosity_threshold=.5}on_enter(){this.bloom_compose_mat.set_blur_texture_0(this.blurrer.renderTargetsVertical[0].texture),this.bloom_compose_mat.set_blur_texture_1(this.blurrer.renderTargetsVertical[1].texture),this.bloom_compose_mat.set_blur_texture_2(this.blurrer.renderTargetsVertical[2].texture),this.bloom_compose_mat.set_blur_texture_3(this.blurrer.renderTargetsVertical[3].texture),this.bloom_compose_mat.set_blur_texture_4(this.blurrer.renderTargetsVertical[4].texture),this.add_mat.set_add_texture(this.blurrer.renderTargetsHorizontal[0].texture)}render(){this.__check_RT_size(),Re.clear(this.main_RT,fe.current,!0,!1),Re.render(be.current,fe.current,this.main_RT),this.blurrer.blur(this.main_RT,this.use_hight_luminosity_pass),Re.material_pass(this.bloom_compose_mat,this.blurrer.renderTargetsHorizontal[0]),Re.blit(this.main_RT,void 0,this.add_mat)}set_bloom_strength(t){this.bloom_compose_mat.set_bloom_strength(t)}set_bloom_radius(t){this.blurrer.set_radius(t)}set_luminosity_threshold(t){this.blurrer.set_luminosity_threshold(t)}set_tint_color_0(t){this.bloom_compose_mat.set_tint_color_0(t)}set_tint_color_1(t){this.bloom_compose_mat.set_tint_color_1(t)}set_tint_color_2(t){this.bloom_compose_mat.set_tint_color_2(t)}set_tint_color_3(t){this.bloom_compose_mat.set_tint_color_3(t)}set_tint_color_4(t){this.bloom_compose_mat.set_tint_color_4(t)}__check_RT_size(){const t=this.use_rendering_size?ye.render_width:ye.width,e=this.use_rendering_size?ye.render_height:ye.height;this.main_RT.width===t&&this.main_RT.height===e||this.main_RT.setSize(t,e)}}class Rr extends me{constructor(){super()}render(){be.current.on_pre_render&&be.current.on_pre_render(),be.current.render?be.current.render():Re.render(be.current,fe.current,Re._renderer.getRenderTarget()),this.render_spectator_camera(),be.current.on_post_render&&be.current.on_post_render()}render_spectator_camera(){const t=fe.spectator;if(t&&Re._renderer.xr.isPresenting){const e=Re._renderer.xr,s=e.getCamera();t.projectionMatrix.copy(fe.current.projectionMatrix),t.position.copy(s.position),t.quaternion.copy(s.quaternion);const r=Re._renderer.getRenderTarget();e.isPresenting=!1,Re._renderer.setRenderTarget(null),Re._renderer.render(be.current,t),Re._renderer.setRenderTarget(r),e.isPresenting=!0}}}const Cr=new class{constructor(){this.components=[],this.enabled_components=new Set}update(){this.__set_components_opacities();for(const t of this.enabled_components)t.update(hs.current_state_data)}register_component(t){this.components.push(t)}enable_component(t){this.enabled_components.add(t)}disable_component(t){this.enabled_components.delete(t)}get_component_by_name(t){console.warn("DEPRECATED. Use ViewComponentManager.get instead"),this.get(t)}get(t){for(let e=0;e<this.components.length;e++)if(this.components[e].name===t)return this.components[e];console.error("[ViewComponentManager.get] no component found for: ",t)}__set_components_opacities(){for(let t=0;t<this.components.length;t++)this.components[t].set_opacity(hs.current_state_data)}};class jr{constructor(t,e,s){t=t||new le,this.target_application=t,this.graphics=e,this.input=s,this.is_running=!1,this.frames_passed=0,this.time_accumulator=0}update(t){if(this.is_running){for(ns.__update(t),1===this.frames_passed&&this.target_application.on_post_start(),this.input.update(),this.time_accumulator+=ns.delta_time,this.target_application.before_update(),hs.before_update();this.time_accumulator>ns.fixed_delta_time;)this.target_application.fixed_update(),hs.fixed_update(),this.time_accumulator-=ns.fixed_delta_time;ns.__set_frame_interpolation(this.time_accumulator/ns.fixed_delta_time),this.target_application.update(),hs.update(),_s.update(),Cr.update(),this.target_application.on_pre_render(),this.graphics.update(),this.target_application.on_post_render(),Ws.render(this.graphics),this.target_application.on_frame_end(),this.frames_passed++,this.input.clear(),Ws.clear()}}start(){this.is_running||(0===this.frames_passed&&this.target_application.on_enter(this),this.is_running=!0,this.graphics._renderer.setAnimationLoop(this.update.bind(this)))}stop(){!1!==this.is_running&&(this.is_running=!1,this.target_application.on_exit(this),this.graphics._renderer.setAnimationLoop(null))}set_state(t){this.target_application.on_exit(this),this.target_application=t,this.target_application.on_enter(this)}dispose(){this.stop(),this.frames_passed=0}}const Fr=new class{init(){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.init()}update_position(t,e){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update_position(t,e)}update(){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update()}update_size(t,e){console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.update_size(t,e)}apply_pixel_density_v2(t){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.apply_pixel_density_v2(t)}apply_pixel_density(t){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.apply_pixel_density(t)}get_pixel_size(){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.get_pixel_size()}get aspect_ratio(){return console.warn("Screen Singleton is deprecated. Please use OScreen."),ye.aspect_ratio}};class qr{constructor({name:t,container:e}){this.name=t,this.container=e,this.hidden=!0,Cr.register_component(this)}start(){}on_enter(){this.container.classList.remove("hidden"),Cr.enable_component(this),this.hidden=!1}update(t){}on_exit(){this.container.classList.add("hidden"),Cr.disable_component(this),this.hidden=!0}set_opacity(t){this.container.style.opacity=t[`${this.name}_opacity`],this.toggle_hidden()}toggle_hidden(){Number(this.container.style.opacity)>.001?this.hidden&&this.on_enter():this.hidden||this.on_exit()}}class Pr extends n{constructor(t,e,s,r){t=t||1,e=e||1,s=s||"#FF0000",r=r||new D({color:s});const i=new o(t,e);i.rotateX(-1.57),super(i,r)}}class Nr extends n{constructor(t,e,s,r){t=t||1,e=e||1,s=s||"#FF0000",r=r||new D({color:s});super(new o(t,e),r)}}class Or{constructor(){this.sphere=new j}fit_points(t,e,s,r){this.sphere.setFromPoints(t);const i=Ke.degToRad(s/2),n=2*Math.atan(Math.tan(i)*r)/2,o=this.get_up_plane_normal(e,i),a=this.get_down_plane_normal(e,i),h=this.get_left_plane_normal(e,n),_=this.get_right_plane_normal(e,n),c=new l(0,0,-1).applyQuaternion(e),u=this.sphere.center.clone(),d=this.get_distance_to_fit_rect(2*this.sphere.radius,2*this.sphere.radius,s,r),p=u.clone().add(c.clone().multiplyScalar(-1*d)),m=(new X).setFromNormalAndCoplanarPoint(o,p),g=(new X).setFromNormalAndCoplanarPoint(a,p),f=(new X).setFromNormalAndCoplanarPoint(h,p),y=(new X).setFromNormalAndCoplanarPoint(_,p);this.apply_center_correction_to_pos(p,t,e,m,g,f,y),m.setFromNormalAndCoplanarPoint(o,p),g.setFromNormalAndCoplanarPoint(a,p),f.setFromNormalAndCoplanarPoint(h,p),y.setFromNormalAndCoplanarPoint(_,p);let b=1/0;const w=c.clone().multiplyScalar(-2*d);for(let e=0;e<t.length;e++){const s=new H(t[e].clone(),t[e].clone().add(w)),r=new l,i=new l,n=new l,o=new l;m.intersectLine(s,r),g.intersectLine(s,i),f.intersectLine(s,n),y.intersectLine(s,o),r.length()<1e-4&&console.log("up intersection not found",e),i.length()<1e-4&&console.log("down intersection not found",e),n.length()<1e-4&&console.log("left intersection not found",e),o.length()<1e-4&&console.log("right intersection not found",e);const a=t[e].clone().sub(r).length(),h=t[e].clone().sub(i).length(),_=t[e].clone().sub(n).length(),c=t[e].clone().sub(o).length(),u=Math.min(a,h),d=Math.min(_,c),p=Math.min(u,d);p<b&&(b=p)}const x=c.clone().multiplyScalar(b);return p.clone().add(x)}apply_center_correction_to_pos(t,e,s,r,i,n,o){const a=this.get_vertical_correction(e,i,r,s),h=this.get_hozirontal_correction(e,n,o,s);t.add(a),t.add(h)}get_vertical_correction(t,e,s,r){let i,n,o=1/0,a=1/0;const h=new l(0,1,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const _=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(-5e6))),c=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(5e6))),u=new l,d=new l;e.intersectLine(_,u),s.intersectLine(c,d);const p=u.distanceTo(t[r]),m=d.distanceTo(t[r]);d.length()<1e-4&&console.log("vertical up intersection not found",r),u.length()<1e-4&&console.log("vertical down intersection not found",r),p<a&&(a=p,n=t[r]),m<o&&(o=m,i=t[r])}console.log(i,n);const _=(o-a)/2;return h.clone().multiplyScalar(-_)}get_hozirontal_correction(t,e,s,r){let i,n,o=1/0,a=1/0;const h=new l(1,0,0).applyQuaternion(r);for(let r=0;r<t.length;r++){const _=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(-5e6))),c=new H(t[r].clone(),t[r].clone().add(h.clone().multiplyScalar(5e6))),u=new l,d=new l;e.intersectLine(_,u),s.intersectLine(c,d);const p=u.distanceTo(t[r]),m=d.distanceTo(t[r]);u.length()<1e-4&&console.log("left intersection not found",r),d.length()<1e-4&&console.log("right intersection not found",r),p<a&&(a=p,n=t[r]),m<o&&(o=m,i=t[r])}const _=(o-a)/2;return console.log(i,n),h.clone().multiplyScalar(-_)}get_up_plane_normal(t,e){const s=new l(0,-1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),e)),s.applyQuaternion(t),s}get_down_plane_normal(t,e){const s=new l(0,1,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(1,0,0),-e)),s.applyQuaternion(t),s}get_left_plane_normal(t,e){const s=new l(1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),e)),s.applyQuaternion(t),s}get_right_plane_normal(t,e){const s=new l(-1,0,0);return s.applyQuaternion((new z).setFromAxisAngle(new l(0,1,0),-e)),s.applyQuaternion(t),s}get_distance_to_fit_rect(t,e,s,r){const i=s/2*Math.PI/180,n=2*Math.atan(Math.tan(i)*r)/2,o=e/Math.tan(i),a=t/Math.tan(n);return Math.max(Math.abs(a),Math.abs(o))}}class Lr{static convert_to_non_indexed_geometry(t){const e=t.index,s=t.getAttribute("position"),r=[];for(let t=0;t<e.count;t+=3)r.push(s.getX(e.array[t+0])),r.push(s.getY(e.array[t+0])),r.push(s.getZ(e.array[t+0])),r.push(s.getX(e.array[t+1])),r.push(s.getY(e.array[t+1])),r.push(s.getZ(e.array[t+1])),r.push(s.getX(e.array[t+2])),r.push(s.getY(e.array[t+2])),r.push(s.getZ(e.array[t+2]));const i=new L;return i.setAttribute("position",new at(new Float32Array(r),3)),Lr.add_barycentric_attribute(i),i}static add_barycentric_attribute(t){const e=[],s=t.getAttribute("position");for(let t=0;t<s.count;t+=3)e.push(1),e.push(0),e.push(0),e.push(0),e.push(1),e.push(0),e.push(0),e.push(0),e.push(1);t.setAttribute("barycentric",new at(new Float32Array(e),3))}}class $r{static load_images(t){const e=t.querySelectorAll("img");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}const s=t.querySelectorAll("object");for(let t=0;t<s.length;t++){const e=s[t];e.dataset.src&&(e.data=e.dataset.src)}}static load_videos(t){const e=t.querySelectorAll("video");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}}static load_iframes(t){const e=t.querySelectorAll("iframe");for(let t=0;t<e.length;t++){const s=e[t];s.dataset.src&&(s.src=s.dataset.src)}}static load_elements(t,e){const s=t.querySelectorAll(e);for(let t=0;t<s.length;t++){const e=s[t];e.dataset.src&&(e.src=e.dataset.src)}}}class Ur{constructor(){}static get_image_data(t){const e=document.createElement("canvas");e.width=t.width,e.height=t.height;const s=e.getContext("2d");return s.drawImage(t,0,0),s.getImageData(0,0,t.width,t.height)}static get_pixel(t,e,s){const r=4*(e+t.width*s),i=t.data;return new h(i[r+0],i[r+1],i[r+2],i[r+3])}}const Er=new class{constructor(){}sample(t,s){const r=[];let i=99999999;const n=t.getAttribute("position"),o=t.getAttribute("normal"),a=t.getAttribute("tangent"),h=t.getAttribute("uv"),_=t.index,c=[];for(let t=0;t<_.count;t+=3){const s=_.array[t+0],u=_.array[t+1],d=_.array[t+2],p=new l;p.x=n.getX(s),p.y=n.getY(s),p.z=n.getZ(s);const m=new l;m.x=n.getX(u),m.y=n.getY(u),m.z=n.getZ(u);const g=new l;g.x=n.getX(d),g.y=n.getY(d),g.z=n.getZ(d);const f={a:p,b:m,c:g,normal:void 0,tangent:void 0,uv_a:void 0,uv_b:void 0,uv_c:void 0};if(o){const t=new l;t.x=o.getX(s),t.y=o.getY(s),t.z=o.getZ(s);const e=new l;e.x=o.getX(u),e.y=o.getY(u),e.z=o.getZ(u);const r=new l;r.x=o.getX(d),r.y=o.getY(d),r.z=o.getZ(d);const i=t.clone().add(e).add(r).normalize();f.normal=i}if(a){const t=new l;t.x=a.getX(s),t.y=a.getY(s),t.z=a.getZ(s);const e=new l;e.x=a.getX(u),e.y=a.getY(u),e.z=a.getZ(u);const r=new l;r.x=a.getX(d),r.y=a.getY(d),r.z=a.getZ(d);const i=t.clone().add(e).add(r).normalize();f.tangent=i}if(h){const t=new e;t.x=h.getX(s),t.y=h.getY(s);const r=new e;r.x=h.getX(u),r.y=h.getY(u);const i=new e;i.x=h.getX(d),i.y=h.getY(d),f.uv_a=t,f.uv_b=r,f.uv_c=i}c.push(f);const y=this.get_face_area(f);i=Math.min(y,i),r.push(y)}const u=this.get_uniform_face_distribution(r,i,c),d=this.select_random_faces(u,s);return this.sample_data_from_faces(d)}sample_data_from_faces(t){const e=[],s=[],r=[],i=[];for(let n=0;n<t.length;n++){const o=t[n],a=Math.random(),h=Math.random();e.push(this.sample_point_in_face(a,h,o.a,o.b,o.c).clone()),o.normal&&s.push(o.normal.clone()),o.tangent&&r.push(o.tangent.clone()),o.uv_a&&i.push(this.sample_point_in_face(a,h,o.uv_a,o.uv_b,o.uv_c).clone())}return{points:e,normals:s,tangents:r,uvs:i}}select_random_faces(t,e){const s=[];for(let r=0;r<e;r++){const e=t[Math.floor(Math.random()*t.length)];s.push(e)}return s}get_uniform_face_distribution(t,e,s){const r=[];for(let i=0;i<t.length;i++){t[i]/=e;const n=Math.floor(Math.round(t[i]));for(let t=0;t<n;t++)r.push(s[i])}return r}get_face_area(t){const e=t.b.clone().sub(t.a),s=t.c.clone().sub(t.a);return e.cross(s).length()/2}sample_point_in_face(t,e,s,r,i){t+e>1&&(t=1-t,e=1-e);const n=1-(t+e);return s.clone().multiplyScalar(t).add(r.clone().multiplyScalar(e)).add(i.clone().multiplyScalar(n))}};const Br=new class{get_mesh(t,e){t.traverse(t=>{t instanceof n&&(t.geometry&&(t.geometry=t.geometry.clone()),e(t))})}get_geometries(t){const e=[];return this.get_mesh(t,t=>{e.push(t.geometry)}),e}assign_material(t,e,s){t.traverse(t=>{t instanceof n&&(void 0===s||t.name===s)&&(t.material=e)})}clone_animated_gltf(t){const e={animations:t.animations,scene:t.scene.clone(!0)},s={};t.scene.traverse(t=>{t.isSkinnedMesh&&(s[t.name]=t)});const r={},i={};e.scene.traverse(t=>{t.isBone&&(r[t.name]=t),t.isSkinnedMesh&&(i[t.name]=t)});for(const t in s){const e=s[t].skeleton,n=i[t],o=[];for(let t=0;t<e.bones.length;++t){const s=r[e.bones[t].name];o.push(s)}n.bind(new ht(o,e.boneInverses),n.matrixWorld)}return e}set_shadow_config(t,e,s){t.traverse(t=>{t instanceof n&&(t.castShadow=e,t.receiveShadow=s)})}__find_object(t,e,s){t.traverse(t=>{t.name===e&&s(t)})}get_object(t,e){let s;return t.traverse(t=>{t.name===e&&(s=t)}),s}get_object_by_type(t,e){let s;return t.traverse(t=>{t.constructor.name===e&&(s=t)}),s}};class Ir{static is_object(t){return t&&"object"==typeof t&&!Array.isArray(t)}static merge_deep(t,...e){if(!e.length)return t;const s=e.shift();if(Ir.is_object(t)&&Ir.is_object(s))for(const e in s)Ir.is_object(s[e])?(t[e]||Object.assign(t,{[e]:{}}),Ir.merge_deep(t[e],s[e])):Object.assign(t,{[e]:s[e]});return Ir.merge_deep(t,...e)}static xml_to_json(t){let e={};if(1===t.nodeType){if(t.attributes.length>0){e["@attributes"]={};for(let s=0;s<t.attributes.length;s++){const r=t.attributes.item(s);e["@attributes"][r.nodeName]=r.nodeValue}}}else 3===t.nodeType&&(e=t.nodeValue);if(t.hasChildNodes())for(let s=0;s<t.childNodes.length;s++){const r=t.childNodes.item(s),i=r.nodeName;if(void 0===e[i])e[i]=this.xml_to_json(r);else{if(void 0===e[i].push){const t=e[i];e[i]=[],e[i].push(t)}e[i].push(this.xml_to_json(r))}}return e}}class Dr{constructor(){}static get_random_color(){const t=[0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"];let e="#";for(let s=0;s<6;s++){e+=t[Math.floor(Math.random()*t.length)]}return e}static capitalize(t){const e=t.split(" ");for(let t=0;t<e.length;t++)e[t]=e[t][0].toUpperCase()+e[t].substr(1);return e.join(" ")}static capitalize_first_letter(t){return t.charAt(0).toUpperCase()+t.slice(1)}static snake_to_camelcase(t){return t.toLowerCase().replace(/[-_][a-z0-9]/g,t=>t.slice(-1).toUpperCase())}}class Qr{constructor(){}time_str_to_ms(t){const e=t.split(":");let s=Number(e[0]);s=60*s*60*1e3;let r=Number(e[1]);r=60*r*1e3;let i=Number(e[2]);return i*=1e3,s+r+i}}class Vr{constructor(){}static is_int(t){return Number(t)===t&&t%1==0}static is_float(t){return Number(t)===t&&t%1!=0}static is_number(t){return this.is_int(t)||this.is_float(t)}static is_json(t){try{JSON.parse(t)}catch(t){return!1}return!0}}class Wr extends n{constructor(){const{colorNode:t,opacityNode:e}=function(t="#4a4a4a"){const e=ut(new r(t)),s=(t=>{const e=Jt(t),s=Xt(xt(0),e.mul(1.5),t);return qt(qt(s.x,s.y),s.z)})(At("barycentric","vec3").add(xt(1,1,0)));return{colorNode:gt(e,xt(0),s),opacityNode:s.oneMinus().mul(.2)}}("#4a4a4a"),s=new se({transparent:!0,depthWrite:!1});s.colorNode=t,s.opacityNode=e;const i=new o(100,100,100,100);super(Lr.convert_to_non_indexed_geometry(i),s),this.rotation.x=-1.57}}class Yr extends ee{constructor(){super();const t=ut(.2),e=ut(new r("#FF0000"));this.uniforms={_Thickness:t,_Length:ut(0),_ElapsedTime:ut(0),_Color:e};const s=At("orientation","float"),i=Gt.mul(dt(At("next_position","vec3"),1)).xyz,n=Gt.mul(dt(At("previous_position","vec3"),1)).xyz,o=zt(n.sub(i)),a=zt(Wt(o,zt(te.sub(i)))),h=Gt.mul(dt(pt,1)).xyz.add(a.mul(t.mul(.5)).mul(s));this.vertexNode=Rt.mul(Ct).mul(dt(h,1));const _=jt(s);this.fragmentNode=dt(e.mul(vt(1).sub(Mt(_)).mul(.5).add(.5)),1),this.transparent=!0,this.depthWrite=!1,this.fog=!1}}function Xr(){const t=new L;return t.setAttribute("position",new at(new Float32Array([]),3)),t.setAttribute("next_position",new at(new Float32Array([]),3)),t.setAttribute("previous_position",new at(new Float32Array([]),3)),t.setAttribute("orientation",new at(new Float32Array([]),1)),t.setAttribute("coverage",new at(new Float32Array([]),1)),t}class Hr extends n{constructor(t){const e=Xr(),s=new Yr;super(e,s),this.material=s,t&&this.setup(t)}setup(t){const e=[],s=[],r=[],i=[],n=[];let o=0;for(let a=0;a<t.length;a++){e.push(t[a].x),e.push(t[a].y),e.push(t[a].z),i.push(1),e.push(t[a].x),e.push(t[a].y),e.push(t[a].z),i.push(-1);const h=this.__get_next_position(t,a);s.push(h.x),s.push(h.y),s.push(h.z),s.push(h.x),s.push(h.y),s.push(h.z);const _=this.__get_previous_position(t,a);r.push(_.x),r.push(_.y),r.push(_.z),r.push(_.x),r.push(_.y),r.push(_.z),n.push(o),n.push(o),a<t.length-1&&(o+=t[a].distanceTo(h))}const a=new Float32Array(e),h=new Float32Array(s),_=new Float32Array(r),l=new Float32Array(i),c=new Float32Array(n),u=[];for(let t=0;t<(a.length/3-2)/2;t++){const e=2*t+1;u.push(e),u.push(e+1),u.push(e-1),u.push(e),u.push(e+2),u.push(e+1)}if(a.length/3!==this.geometry.getAttribute("position").count){const t=this.geometry;this.geometry=Xr(),this.geometry.setIndex(u),t.dispose()}this.geometry.getAttribute("position").copy(new at(a,3)),this.geometry.getAttribute("next_position").copy(new at(h,3)),this.geometry.getAttribute("previous_position").copy(new at(_,3)),this.geometry.getAttribute("orientation").copy(new at(l,1)),this.geometry.getAttribute("coverage").copy(new at(c,1)),this.geometry.getAttribute("position").needsUpdate=!0,this.geometry.getAttribute("next_position").needsUpdate=!0,this.geometry.getAttribute("previous_position").needsUpdate=!0,this.geometry.getAttribute("orientation").needsUpdate=!0,this.geometry.getAttribute("coverage").needsUpdate=!0,this.material.uniforms._Length.value=o,this._length=o,this.accumulated_length=o}set thickness(t){this.material.uniforms._Thickness.value=t}get thickness(){return this.material.uniforms._Thickness.value}__get_previous_position(t,e){return 0===e?t[1].clone().sub(t[0]).multiplyScalar(-1).add(t[0]):t[e-1]}__get_next_position(t,e){return e===t.length-1?t[t.length-2].clone().sub(t[t.length-1]).multiplyScalar(-1).add(t[t.length-1]):t[e+1]}update(){}distance(){return this.accumulated_length}total_length(){return this.accumulated_length}dispose(){this.geometry.dispose(),this.material.dispose(),this.parent&&this.parent.remove(this),super.dispose()}set color(t){this.material.uniforms._Color.value.set(t)}get color(){return this.material.uniforms._Color.value}copy_color(t){this.material.uniforms._Color.value.copy(t)}}class Zr extends n{constructor(t,e){super(t,e),this.material=e;const s=this;this.onBeforeRender=()=>{"update"in s.material&&"function"==typeof s.material.update&&s.material.update()}}}class Kr extends ts{constructor(t,e=new l,s=new l(1,1,1),r="linear"){super(r),this.attribute_name=t,this.from=e,this.to=s}update(t,e){const s=this.from.clone();s.lerp(this.to,this.easing_function(e)),t[this.attribute_name].copy(s)}}class Jr extends ge{constructor(t,e,s){super(t,e,s),this.loader=new ae}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then the probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class Gr extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ti extends ge{constructor(t,e,s){super(t,e,s),this.loader=new he}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ei extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?fetch(this.url).then(e=>{e.json().then(e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()})}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class si extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _e}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t+"\n\n\t If the error says something about unexpected token < in JSON then probably the problem is related to the file not being found. Check the name and path of the resource"),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ri extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,this.parse_path(e)),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}parse_path(t){const e=t.split("\n");""===e[e.length-1]&&e.pop();const s=[];for(let t=0;t<e.length;t+=3){const r=parseFloat(e[t+0]),i=parseFloat(e[t+1]),n=parseFloat(e[t+2]);s.push(new l(r,i,n))}return s}}class ii extends ge{constructor(t,e,s){super(t,e,s),this.loader=new _t}on_preloaded_finished(t){void 0===t.resources_by_url[this.url]?this.loader.load(this.url,e=>{t.set_resource(this.resource_id,this.url,e),this.__update_downloaded_bytes(1,1),this.__loading_ended()},()=>{},t=>{this.__set_error(t),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ni extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(e,s){void 0===e.resources_by_url[this.url]?s.blob().then(s=>{const r=new t,i=URL.createObjectURL(s),n=new Image;n.src=i,n.onload=()=>{r.image=n,r.needsUpdate=!0,e.set_resource(this.resource_id,this.url,r),this.__update_downloaded_bytes(1,1),this.__loading_ended()},n.onerror=()=>{console.error("Error loading texture. Maybe the resource is not an image?",this.url)}}):(e.set_resource(this.resource_id,this.url,e.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class oi extends ge{constructor(t,e,s){super(t,e,s)}on_preloaded_finished(t,e){void 0===t.resources_by_url[this.url]?e.blob().then(e=>{t.set_resource(this.resource_id,this.url,URL.createObjectURL(e)),this.__update_downloaded_bytes(1,1),this.__loading_ended()}):(t.set_resource(this.resource_id,this.url,t.resources_by_url[this.url]),this.__update_downloaded_bytes(1,1),this.__loading_ended())}}class ai{constructor(t){this.name=t,this.resources={},this.resources_by_url={}}set_resource(t,e,s){Object.keys(this.resources_by_url).includes(e)?this.resources[t]=this.resources_by_url[e]:(this.resources[t]=s,this.resources_by_url[e]=s)}get_resource(t){return this.resources[t]}get(t){return this.resources[t]}}class hi{constructor(t){this.resource_loaders=[],this.batch_name=t||"unnamed batch"}add_loader(t){this.resource_loaders.push(t)}load(t){for(let e=0;e<this.resource_loaders.length;e++)this.resource_loaders[e].load(t||ai)}get loading_finished(){let t=!0;for(let e=0;e<this.resource_loaders.length;e++)t=t&&this.resource_loaders[e].has_finished;return t}get has_errors(){let t=!1;for(let e=0;e<this.resource_loaders.length;e++)t=t||this.resource_loaders[e].has_error;return t}print_errors(){console.error("Batch <"+this.batch_name+"> could not load successfully");for(let t=0;t<this.resource_loaders.length;t++)this.resource_loaders[t].has_error&&this.resource_loaders[t].print_error()}get_progress(){return this.get_loaded_bytes()/this.get_total_bytes()}get_loaded_bytes(){let t=1;for(let e=0;e<this.resource_loaders.length;e++)t+=this.resource_loaders[e].loaded_bytes;return t}get_total_bytes(){let t=1;for(let e=0;e<this.resource_loaders.length;e++)t+=this.resource_loaders[e].total_bytes;return t}}class _i{start(){this.finished=!1}update(){this.finished=!0}}class li{constructor(){}on_enter(t){}on_exit(t){}update(t){}}class ci extends li{constructor(){super(),this.rotation_speed=new e,this.vector_forward_axis=new l(0,0,-1),this.tmp_forward=new l,this.tmp_quat=new z,this.tmp_camera_target_pos=new l}on_enter(t){t.reference_rotation.copy(t.camera.quaternion)}update(t){t.camera.quaternion.copy(t.reference_rotation),this.tmp_forward.copy(this.vector_forward_axis);const e=this.tmp_forward.applyQuaternion(t.camera.quaternion);t.reference_zoom=Ke.clamp(t.reference_zoom,t.min_zoom,t.max_zoom),t.camera.position.copy(t.reference_position).sub(e.multiplyScalar(t.reference_zoom)),t.__last_reference_position.copy(t.reference_position)}get_target_camera_pos(t){this.tmp_quat.copy(t.reference_rotation),this.tmp_forward.copy(this.vector_forward_axis);const e=this.tmp_forward.applyQuaternion(this.tmp_quat),s=Ke.clamp(t.reference_zoom,t.min_zoom,t.max_zoom);return this.tmp_camera_target_pos.copy(t.reference_position).sub(e.multiplyScalar(s)),this.tmp_camera_target_pos}}class ui{constructor(){}on_enter(t){}on_exit(t){}update(t){}lock_zoom(){}unlock_zoom(){}}class di{constructor(t){this.input=t,this.camera=void 0,this.camera_initial_rot=void 0,this.camera_initial_pos=void 0,this.current_state=new ui,this.current_mode=new ci,this.point_of_interest=new l,this.normalized_zoom=0,this.vector_up_axis=new l(0,1,0),this.vector_right_axis=new l(1,0,0),this.vector_forward_axis=new l(0,0,1),this.tmp_forward=this.vector_forward_axis.clone(),this.tmp_right=this.vector_right_axis.clone(),this.tmp_dir=new l,this.zoom=10,this.reference_zoom=10,this.orientation=27,this.tilt=70,this.reference_rotation=new z,this.reference_position=new l,this.__last_reference_position=new l,this.tmp_size=new l,this.tmp_quat=new z,this.min_zoom=1,this.max_zoom=400,this.current_tilt=0,this.current_orientation=0,this.current_azimuth=0,this.projection_plane_helper=new lt(new X,1,16776960),this.input_enabled=!0,this.raised_look_at_position=new l(-82.2986094900191,0,39.7538467209173),this.use_raised_look_at_direction=0}enable(){this.input_enabled=!0}disable(){this.input_enabled=!1}set_camera(t){this.camera=t,this.camera_initial_rot=t.quaternion.clone(),this.camera_initial_pos=t.position.clone()}set_state(t){this.current_state.on_exit(this),this.current_state=t,this.current_state.on_enter(this)}set_mode(t){this.current_mode.on_exit(this),this.current_mode=t,this.current_mode.on_enter(this)}set_normalized_zoom(t){this.normalized_zoom=Ke.clamp(t,0,1)}update_normalized_zoom(t,e){const s=this.camera.position.distanceTo(this.reference_position);this.normalized_zoom=Ke.linear_map(s,t,e,1,0),this.normalized_zoom=Ke.clamp(this.normalized_zoom,0,1)}update(){this.debug_box&&this.debug_box.position.copy(this.reference_position),this.current_state.update(this),this.current_mode.update(this),this.update_normalized_zoom(this.min_zoom,this.max_zoom)}set_idle(){this.set_state(new ui)}camera_is_zoomed_out(){return this.normalized_zoom<.2}set_rotation(t,e,s){this.old_orientation=this.current_orientation,this.current_tilt=t??this.current_tilt,this.current_orientation=e??this.current_orientation,this.current_azimuth=s??this.current_azimuth,this.set_quaternion(this.build_rotation(this.current_tilt,this.current_orientation))}set_rotation_delta(t,e,s=0){this.lerp_rotation(this.current_tilt,this.current_tilt+t,this.current_orientation,this.current_orientation+e,this.current_azimuth,this.current_azimuth+s,1)}lerp_tilt(t,e,s){this.lerp_rotation(t,e,this.current_orientation,this.current_orientation,this.current_azimuth,this.current_azimuth,s)}set_quaternion(t){const e=2*Math.atan2(t.x,t.w),s=2*Math.atan2(t.y,t.w);this.current_orientation=Ke.euclideanModulo(Ke.radToDeg(s),360),this.current_tilt=180-Ke.euclideanModulo(180+Ke.radToDeg(e),360),this.reference_rotation.copy(t)}lerp_quaternion(t,e){this.set_quaternion(this.reference_rotation.clone().slerp(t,e))}lerp_orientation(t,e,s){this.lerp_rotation(this.current_tilt,this.current_tilt,t,e,this.current_azimuth,this.current_azimuth,s)}lerp_azimuth(t,e,s){}lerp_rotation(t,e,s,r,i,n,o){const a=this.build_rotation(t,s),h=this.build_rotation(e,r);a.slerp(h,o),this.set_quaternion(a)}build_rotation(t,e){e<0&&(e+=360);const s=(new z).setFromAxisAngle(this.vector_up_axis,e%360/360*Math.PI*2),r=(new z).setFromAxisAngle(this.vector_right_axis,-t/360*Math.PI*2);return s.multiply(r)}translate_forward(t){this.tmp_forward.copy(this.vector_forward_axis),this.tmp_forward.applyQuaternion(this.camera.quaternion),this.reference_position.add(this.tmp_forward.multiplyScalar(t))}translate_right(t){this.tmp_right.copy(this.vector_right_axis),this.tmp_right.applyQuaternion(this.camera.quaternion),this.reference_position.add(this.tmp_right.multiplyScalar(t))}focus_on_bounding_box(t,e=1){const s=new l;s.copy(t.max).sub(t.min);const r=t.min.clone(),i=r.clone().add(new l(s.x,0,0)),n=r.clone().add(new l(0,s.y,0)),o=r.clone().add(new l(0,0,s.z)),a=r.clone().add(new l(s.x,0,s.z)),h=r.clone().add(new l(0,s.y,s.z)),_=t.max.clone(),c=r.clone().add(new l(s.x,s.y,0));this.focus_camera_on_points([r,i,n,o,a,h,_,c],e)}get_zoom_to_focus_on_points(t,e){if(this.__is_orthographic())return this.__fit_orthographic(this.reference_rotation,t,e).zoom;const s=this.reference_zoom,r=(new l).copy(this.reference_position);this.focus_camera_on_points(t,e);const i=this.reference_zoom;return this.reference_zoom=s,this.reference_position.copy(r),i}get_target_pos_to_focus_on_points(t,e){if(this.__is_orthographic())return this.__fit_orthographic(this.reference_rotation,t,e).center;const s=this.reference_zoom,r=(new l).copy(this.reference_position);this.focus_camera_on_points(t,e);const i=this.reference_position.clone();return this.reference_zoom=s,this.reference_position.copy(r),i}focus_camera_on_sphere(t,e){this.__is_orthographic()?(this.__set_orthographic_zoom(this.get_zoom_to_sphere(t,e)),this.reference_zoom=this.__get_orthographic_distance(t.radius)):this.reference_zoom=this.get_zoom_to_sphere(t,e),this.reference_position.copy(t.center)}get_zoom_to_sphere(t,e){if(this.__is_orthographic())return this.__get_orthographic_zoom(2*t.radius,2*t.radius);const s=this.camera.fov/2*Math.PI/180,r=2*Math.atan(Math.tan(s)*this.camera.aspect)/2,i=t.radius/Math.tan(s),n=t.radius/Math.tan(r);return Math.max(Math.abs(n),Math.abs(i))}hide_projected_points(){for(let t=0;t<this.projected_points.length;t++)this.projected_points[t].visible=!1}show_projected_points(t){this.hide_projected_points();for(let e=0;e<t.length;e++)this.projected_points[e].visible=!0,this.projected_points[e].position.copy(t[e])}show_plane_projection(t,e=1){this.projection_plane_helper.plane=t,this.projection_plane_helper.size=e,this.projection_plane_helper.updateMatrixWorld(),this.projection_plane_helper.visible=!0}show_sphere_projection(t){this.projection_sphere_helper.scale.set(t.radius,t.radius,t.radius),this.projection_sphere_helper.position.copy(t.center),this.projection_sphere_helper.visible=!0}fit_points(t,e,s=1){if(this.camera.isPerspectiveCamera){const r=new l(0,0,-1).applyQuaternion(t),i=r.clone().multiplyScalar(-1),n=new er,o=ye.aspect_ratio,a=n.fit_points(e,t,this.camera.fov*s,o),h=(new F).setFromPoints(e),_=new l;h.getCenter(_);const c=(new X).setFromNormalAndCoplanarPoint(i,_),u=new Z(a,r),d=new l;u.intersectPlane(c,d);return{zoom:a.distanceTo(d),reference_position:d,camera_position:a}}{const r=this.__fit_orthographic(t,e,s),i=new l(0,0,1).applyQuaternion(t);return{zoom:r.zoom,reference_position:r.center,camera_position:r.center.clone().add(i.multiplyScalar(r.distance))}}}focus_camera_on_points(t,e=1){if(this.camera.isPerspectiveCamera){const s=new l(0,0,-1).applyQuaternion(this.reference_rotation),r=s.clone().multiplyScalar(-1),i=new er,n=ye.aspect_ratio,o=i.fit_points(t,this.reference_rotation,this.camera.fov*e,n),a=(new F).setFromPoints(t),h=new l;a.getCenter(h);const _=(new X).setFromNormalAndCoplanarPoint(r,h),c=new Z(o,s),u=new l;c.intersectPlane(_,u);const d=o.distanceTo(u);this.reference_zoom=d,this.reference_position.copy(u)}else{const s=this.__fit_orthographic(this.reference_rotation,t,e);this.__set_orthographic_zoom(s.zoom),this.reference_zoom=s.distance,this.reference_position.copy(s.center)}}get_current_tilt(){return this.current_tilt}get_current_orientation(){return this.current_orientation}get_current_azimuth(){return this.current_azimuth}__get_zoom_to_show_rect(t,e,s=1){if(this.__is_orthographic())return this.__get_orthographic_zoom(2*t,2*e,s);const r=Ke.degToRad(this.camera.fov/2),i=2*Math.atan(Math.tan(r)*this.camera.aspect)/2,n=e/Math.tan(r*s),o=t/Math.tan(i*s);return Math.max(Math.abs(o),Math.abs(n))}__is_orthographic(){return!0===this.camera.isOrthographicCamera}__fit_orthographic(t,e,s){const r=(new tr).get_view_bounds(e,t);return{zoom:this.__get_orthographic_zoom(r.size.x,r.size.y,s),center:r.center,distance:this.__get_orthographic_distance(r.size.z/2)}}__get_orthographic_distance(t){return(new tr).get_distance_to_fit_depth(this.camera,t,this.reference_zoom)}__get_orthographic_zoom(t,e,s=1){return(new tr).get_zoom_to_fit_size(this.camera,t,e,s)}__set_orthographic_zoom(t){const e=this.camera;e.zoom=t,e.updateProjectionMatrix()}}class pi extends ui{constructor(t){super(),this.input=t,this.last_point=new e,this.rotation_velocity=new e,this.forward_dir=0,this.right_dir=0,this.y_dir=0,this.azimuth_dir=0,this.shift_key=!1}on_enter(t){}on_exit(t){}update(t){this.__check_key_down(),this.__check_key_up()}__show_camera_position(t){this.input.left_mouse_button_released&&console.log({x:t.reference_position.x,y:t.reference_position.y,z:t.reference_position.z,orientation:t.current_orientation,tilt:t.current_tilt,azimuth:t.current_azimuth,zoom:t.reference_zoom,fov:t.camera.fov})}__zoom_camera(t){t.reference_zoom+=.5*this.input.zoom_delta}__rotate_camera(t){if(this.input.left_mouse_button_down&&1===this.input.pointer_count){const t=new e(-24*this.input.NDC_delta.x,-8*this.input.NDC_delta.y);t.multiplyScalar(60*ns.delta_time),this.rotation_velocity.add(t)}t.set_rotation_delta(this.rotation_velocity.y,this.rotation_velocity.x);const s=1-Math.exp(-5*ns.delta_time);this.rotation_velocity.lerp(new e(0,0),s)}__move_camera(t){if(t.translate_forward(this.forward_dir),t.translate_right(this.right_dir),t.reference_position.y-=this.y_dir,this.input.right_mouse_button_pressed&&this.last_point.copy(this.input.NDC),this.input.right_mouse_button_down){const e=sr.get_plane_intersection(t.reference_position,void 0,this.last_point).clone(),s=sr.get_plane_intersection(t.reference_position,void 0,this.input.NDC).clone();s.sub(e),t.reference_position.x-=s.x,t.reference_position.y-=s.y,t.reference_position.z-=s.z,this.last_point.copy(this.input.NDC)}}__check_key_down(){const t=.12;this.input.keyboard.is_key_down("KeyW")&&(this.forward_dir=-.12),this.input.keyboard.is_key_down("KeyS")&&(this.forward_dir=t),this.input.keyboard.is_key_down("KeyA")&&(this.right_dir=-.12),this.input.keyboard.is_key_down("KeyD")&&(this.right_dir=t),this.input.keyboard.is_key_down("KeyQ")&&(this.azimuth_dir=.48),this.input.keyboard.is_key_down("KeyE")&&(this.azimuth_dir=-.48),this.input.keyboard.is_key_down("KeyZ")&&(this.y_dir=t),this.input.keyboard.is_key_down("KeyC")&&(this.y_dir=-.12),this.input.keyboard.is_key_down("ShiftLeft")&&(this.shift_key=!0)}__check_key_up(){this.input.keyboard.is_key_released("KeyW")&&(this.forward_dir=0),this.input.keyboard.is_key_released("KeyS")&&(this.forward_dir=0),this.input.keyboard.is_key_released("KeyA")&&(this.right_dir=0),this.input.keyboard.is_key_released("KeyD")&&(this.right_dir=0),this.input.keyboard.is_key_released("KeyQ")&&(this.azimuth_dir=0),this.input.keyboard.is_key_released("KeyE")&&(this.azimuth_dir=0),this.input.keyboard.is_key_released("KeyZ")&&(this.y_dir=0),this.input.keyboard.is_key_released("KeyC")&&(this.y_dir=0),this.input.keyboard.is_key_released("ShiftLeft")&&(this.shift_key=!1)}}export{ui as AbstractCameraState,ge as AbstractLoader,He as AbstractScene,Ze as ActionEvent,ts as ActionInterpolator,Je as ActionSequencer,rs as ActionSequencerBuilder,ue as AddMaterial,ls as ApplicationView,ws as ArrayUtilities,Is as Arrow,qe as AsyncAbstractLoader,Pe as AsyncAudiosLoader,Le as AsyncObjectsLoader,Ue as AsyncTextureLoader,Qe as AsyncTexturesLoader,je as AudioLoader,le as BaseApplication,me as BaseRender,Ee as BasisLoader,ce as BlitNodeMaterial,pr as BloomRender,_r as Blurrer,$e as Browser,Ks as CSSAnimator,ps as CameraBridge,di as CameraController,fe as CameraManager,li as CameraMovementMode,sr as CameraUtilities,cs as CanvasDrawer,ds as Capabilities,ms as CaptureService,pi as CommonCameraState,_i as Compilator,ys as ConsoleBuffer,Ds as Cube,Be as CubemapLoader,Jr as DAELoader,Ws as Debug,Rs as DebugDrawer,gr as DebugNormalsRender,yr as DeferredRender,Xs as DevBridge,ss as DrawIOAnimationSheet,ur as DualFilteringBlurMaterial,dr as DualFilteringBlurrer,Ge as EasingFunctions,Gr as FileLoader,ti as FontLoader,Or as FrustumPointFitter,Ne as GLTFDRACOLoader,Oe as GLTFLoader,Ar as GaussianBlurrer,Lr as GeometryUtilities,Re as Graphics,Wr as Grid,Ie as HDRCubeTextureLoader,De as HDRTextureLoader,$r as HTMLUtilities,Ye as HighQualityLoadingState,Pr as HorizontalPlane,Ur as ImageUtilities,ci as ImmediateMode,rr as Initializer,js as InputSynthesizer,ei as JSONLoader,ir as KeyboardInput,Hr as Line,We as LoadingState,Er as MeshSampler,Fs as ModelLoader,Br as ModelUtilities,xr as NormalAORender,vr as NormalRender,es as NumberInterpolator,si as OBJLoader,Ke as OMath,Js as OS,ye as OScreen,Ir as ObjectUtilities,nr as OrthographicCamera,tr as OrthographicFrustumPointFitter,qs as PerformanceProbe,Bs as PerspectiveCamera,er as PerspectiveFrustumPointFitter,ri as PointArrayLoader,Xe as RegularLoadingState,jr as RenderLoop,Ps as RenderModeRegistry,hi as ResourceBatch,Fe as ResourceContainer,Ms as SDFTextBatch,Ns as SceneEditor,Os as SceneInspector,be as SceneManager,Fr as Screen,us as SimpleTextDrawer,Qs as Sphere,Dr as StringUtilities,Us as Text2D,ii as TextLoader,ni as TextureLoader,ns as Time,Qr as TimeUtilities,hs as TransitionManager,is as TransitionTable,pe as UnrealBloomComposeMaterial,Sr as UnrealBloomRender,Zr as UpdatableMaterialMesh,Rr as VRRender,Vr as Validation,Kr as VectorInterpolator,Nr as VerticalPlane,oi as VideoLoader,qr as ViewComponent,Cr as ViewComponentManager,_s as ViewManager,Ls as ViewNavigator,ks as WorldImage};
2
2
  //# sourceMappingURL=index.mjs.map