UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.

143 lines (131 loc) 1.32 MB
import{createLoaders as Qm,LODsManager as wr,NEEDLE_progressive as Ge,getRaycastMesh as Nb,setKTX2TranscoderLocation as zC,setDracoDecoderLocation as NC,addDracoAndKTX2Loaders as WC,configureLoader as VC}from"./gltf-progressive-CN_mbb66.min.js";import{Vector2 as Z,Vector3 as _,Vector4 as ye,Quaternion as U,Box3 as ti,ShadowMaterial as Wb,Euler as qe,PlaneGeometry as Cn,WebGLRenderer as xr,PerspectiveCamera as de,OrthographicCamera as Bd,Scene as Di,Mesh as H,Texture as Se,Uniform$1 as tn,Color as se,ShaderMaterial as Xn,MeshStandardMaterial as wt,Box3Helper as $C,GridHelper as Vb,Object3D as E,Material as ve,Matrix3 as $b,Matrix4 as J,Layers as Ss,PropertyBinding as ja,AnimationClip as Wt,KeyframeTrack as HC,FileLoader as Hb,BufferGeometry as nn,TextureLoader as Sr,MeshBasicMaterial as Ce,DoubleSide as ji,Group as To,CylinderGeometry as Gb,SphereGeometry as Fd,BoxGeometry as Ba,SpriteMaterial as GC,Sprite as qC,Shape as XC,ExtrudeGeometry as QC,Ray as Ro,CubeUVReflectionMapping as Pn,LinearSRGBColorSpace as Ao,ShaderChunk as ii,Sphere as Ud,DataTexture as Ym,RGBAFormat as zd,EquirectangularReflectionMapping as Io,SRGBColorSpace as Lo,Clock as YC,NeutralToneMapping as Fa,AgXToneMapping as Nd,ACESFilmicToneMapping as Wd,NoToneMapping as Vd,AxesHelper as Bi,MathUtils as Do,Fog as qb,DirectionalLight as Km,PointLight as Zm,PCFSoftShadowMap$1 as KC,BasicNodeLibrary as ZC,WebGLRenderTarget as Qn,DepthTexture as Xb,NearestFilter as $d,EdgesGeometry as JC,LineSegments as Jm,LineBasicMaterial as Hd,Line as Ua,BufferAttribute as ot,Raycaster as Gd,ArrayCamera as eP,Plane as Cr,SkinnedMesh as Cs,InterleavedBufferAttribute as Qb,Skeleton as tP,Bone as iP,WebGLCubeRenderTarget as nP,CubeCamera as oP,LoopRepeat as sP,LoopOnce as eg,AnimationMixer as tg,InterpolateLinear as rP,InterpolateDiscrete as aP,InterpolateSmooth as lP,QuaternionKeyframeTrack as wc,BooleanKeyframeTrack as Yb,VectorKeyframeTrack as xc,ColorKeyframeTrack as Kb,NumberKeyframeTrack as ig,AudioContext as cP,CompressedTexture as hP,FrontSide as Ps,Camera as dP,Frustum as Zb,AudioListener as uP,PositionalAudio as pP,AudioLoader as ng,Audio as mP,BackSide as qd,PMREMGenerator$1 as gP,EquirectangularRefractionMapping as Jb,CubeTexture as e_,CompressedCubeTexture as fP,MeshDepthMaterial as yP,CustomBlending as bP,MaxEquation as _P,AlwaysStencilFunc as vP,GreaterEqualStencilFunc as wP,NotEqualStencilFunc as xP,GreaterStencilFunc as SP,LessEqualStencilFunc as CP,EqualStencilFunc as PP,LessStencilFunc as kP,NeverStencilFunc as t_,InvertStencilOp as OP,DecrementWrapStencilOp as EP,IncrementWrapStencilOp as MP,DecrementStencilOp as TP,IncrementStencilOp as RP,ReplaceStencilOp as AP,ZeroStencilOp as IP,KeepStencilOp as LP,AmbientLight as DP,HemisphereLight as jP,Loader as BP,GLSL3 as FP,AlwaysDepth as UP,GreaterEqualDepth as zP,GreaterDepth as NP,LessEqualDepth as WP,LessDepth as VP,NotEqualDepth as $P,EqualDepth as HP,RawShaderMaterial as i_,BatchedMesh as n_,LinearFilter as Xd,UnsignedByteType as GP,MeshPhysicalMaterial as o_,RingGeometry as qP,Line3 as XP,AdditiveBlending as s_,BoxHelper as QP,SpotLight as YP,DirectionalLightHelper as KP,CameraHelper as ZP,LOD as JP,Triangle as ek,NormalBlending as tk,ReinhardToneMapping as og,LinearToneMapping as sg,EventDispatcher as rg,VideoTexture as ik,CatmullRomCurve3 as nk,MirroredRepeatWrapping as r_,ShaderLib as Qd,UniformsUtils as a_,MeshNormalMaterial as ok,HalfFloatType as ag,Source as sk}from"./three.min.js";import{GroundedSkybox as za,Font as rk,TextGeometry as ak,FontLoader as lk,GLTFLoader as ks,EXRLoader as lg,RGBELoader as l_,Stats as ck,nodeFrame as c_,TransformControlsGizmo as h_,OrbitControls as hk,PositionalAudioHelper as dk,HorizontalBlurShader as uk,VerticalBlurShader as pk,GLTFExporter as d_,strToU8 as u_,zipSync as mk,XRControllerModelFactory as gk,XRHandMeshModel as fk,Line2 as yk,LineGeometry as bk,LineMaterial as _k,TransformControls as vk,InteractiveGroup as wk,HTMLMesh as xk,VertexNormalsHelper as Sk,OBJLoader as cg,FBXLoader as p_,mergeVertices as Ck}from"./three-examples.min.js";import{v5 as hg,ByteBuffer as Pk,fetchProfile as kk,MotionController as Ok,SIZE_PREFIX_LENGTH as m_,Builder as dg,createNoise4D as Ek,Matrix4 as ug,BatchedParticleRenderer as Mk,ParticleSystem as Tk,RenderMode as jo,ConstantColor as Rk,Vector4 as Ak,ConstantValue as Ik,TrailParticle as g_,WorkerBase as Lk,MeshBVH as Dk}from"./vendor-CJmyOrCq.min.js";import{__webpack_exports__default as Oe,__webpack_exports__Text as f_,__webpack_exports__update as jk,__webpack_exports__Block as y_,SimpleStateBehavior as Bk,__webpack_exports__Inline as pg,__webpack_exports__FontLibrary as b_,ThreeMeshUI as __}from"./three-mesh-ui-n3JU4M2W.min.js";const v_=typeof window<"u"?window.location.search.includes("debugcontext"):!1;var pe=(o=>(o.ContextRegistered="ContextRegistered",o.ContextCreationStart="ContextCreationStart",o.ContextCreated="ContextCreated",o.ContextFirstFrameRendered="ContextFirstFrameRendered",o.ContextDestroying="ContextDestroying",o.ContextDestroyed="ContextDestroyed",o.MissingCamera="MissingCamera",o.ContextClearing="ContextClearing",o.ContextCleared="ContextCleared",o))(pe||{});class ue{static get Current(){return globalThis["NeedleEngine.Context.Current"]}static set Current(e){globalThis["NeedleEngine.Context.Current"]=e}static get All(){return this.Registered}static Registered=[];static register(e){this.Registered.indexOf(e)===-1&&(v_&&console.warn("Registering context"),this.Registered.push(e),this.dispatchCallback("ContextRegistered",e))}static unregister(e){const t=this.Registered.indexOf(e);t!==-1&&(v_&&console.warn("Unregistering context"),this.Registered.splice(t,1))}static _callbacks={};static registerCallback(e,t){this._callbacks[e]||(this._callbacks[e]=[]),this._callbacks[e].push(t)}static unregisterCallback(e,t){if(!this._callbacks[e])return;const i=this._callbacks[e].indexOf(t);i!==-1&&this._callbacks[e].splice(i,1)}static dispatchCallback(e,t,i){if(!this._callbacks[e])return!0;const n={event:e,context:t};if(i)for(const r in i)n[r]=i[r];const s=new Array;return this._callbacks[e].forEach(r=>{const a=r(n);a instanceof Promise&&s.push(a)}),Promise.all(s)}static addContextCreatedCallback(e){this.registerCallback("ContextCreated",e)}static addContextDestroyedCallback(e){this.registerCallback("ContextDestroyed",e)}}const mg=new Map;function Fi(o=globalThis.location?.hostname){if(mg.has(o))return mg.get(o);const e=/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|localhost/.test(o);return mg.set(o,e),e===!0}function w_(){return window.location.hostname.includes("glitch.me")}const x_=()=>o=>o;function Fk(o){return x_()(o)}function Uk(){return!!w("debug")}class Ui{_factory;_cache=[];_maxSize;_index=0;constructor(e,t){this._factory=e,this._maxSize=t}get(){const e=this._index%this._maxSize;return this._index++,this._cache.length<=e&&(this._cache[e]=this._factory()),this._cache[e]}}let Pr=!1;const gg=new Array;typeof window<"u"&&setTimeout(()=>{if(Pr){const o={},e=new URL(window.location.href),t=new URL(e);t.searchParams.append("console","");const i=t.toString().replace(/=$|=(?=&)/g,"");for(const s of gg){const r=new URL(e);r.searchParams.append(s,""),o[s]=r.toString().replace(/=$|=(?=&)/g,"")}console.log(`\u{1F335} ?help: Debug Options for Needle Engine. Append any of these parameters to the URL to enable specific debug options. Example: ${i} will show an onscreen console window.`);const n=Pr===!0?"":` (containing "${Pr}")`;console.group("Available URL parameters:"+n);for(const s of Object.keys(o).sort())typeof Pr=="string"&&!s.toLowerCase().includes(Pr.toLowerCase())||(console.groupCollapsed(s),console.log("Reload with this flag enabled:"),console.log(o[s]),console.groupEnd());console.groupEnd()}},100);function Sc(){return new URLSearchParams(globalThis.location?.search)}function w(o){Pr&&!gg.includes(o)&&gg.push(o);const e=Sc();if(e.has(o)){const t=e.get(o);if(t){const i=Number(t);return isNaN(i)?t:i}else return!0}return!1}Pr=w("help");function zk(o,e){const t=Sc();t.has(o)?t.set(o,e):t.append(o,e),document.location.search=t.toString()}function Cc(o,e,t=!0){const i=Sc();i.has(o)?e===null?i.delete(o):i.set(o,e):e!==null&&i.append(o,e),t?S_(o,i):yg(o,i)}function fg(o,e,t){o.has(e)?o.set(e,t.toString()):o.append(e,t.toString())}function S_(o,e,t){window.history.pushState(t,o,"?"+e.toString()+window.location.hash)}function yg(o,e,t){window.history.replaceState(t,o,"?"+e.toString()+window.location.hash)}function Nk(o){for(var e="",t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",i=t.length,n=0;n<o;n++)e+=t.charAt(Math.floor(Math.random()*i));return e}function Wk(o,e){return Math.floor(Math.random()*(e-o+1))+o}const C_=["smol","tiny","giant","interesting","smart","bright","dull","extreme","beautiful","pretty","dark","epic","salty","silly","funny","lame","lazy","loud","lucky","mad","mean","mighty","mysterious","nasty","odd","old","powerful","quiet","rapid","scary","shiny","shy","silly","smooth","sour","spicy","stupid","sweet","tasty","terrible","ugly","unusual","vast","wet","wild","witty","wrong","zany","zealous","zippy","zombie","zorro"],P_=["cat","dog","mouse","pig","cow","horse","sheep","chicken","duck","goat","panda","tiger","lion","elephant","monkey","bird","fish","snake","frog","turtle","hamster","penguin","kangaroo","whale","dolphin","crocodile","snail","ant","bee","beetle","butterfly","dragon","eagle","fish","giraffe","lizard","panda","penguin","rabbit","snake","spider","tiger","zebra"];function k_(){const o=C_[Math.floor(Math.random()*C_.length)],e=P_[Math.floor(Math.random()*P_.length)];return o+"_"+e}function O_(o){return o=o.replace(/[^a-z0-9áéíóúñü \.,_-]/gim,""),o.trim()}function Pc(o,e,t=!0,i=!1){if(e==null)return null;if(e.userData&&e.userData.guid===o||e.guid==o)return e;if(i&&e.userData?.components){for(const n of e.userData.components)if(n.guid===o)return n}if(t){if(e.scenes)for(const n in e.scenes){const s=e.scenes[n],r=Pc(o,s,t,i);if(r)return r}if(e.children)for(const n in e.children){const s=e.children[n],r=Pc(o,s,t,i);if(r)return r}}}function kc(o,e,t){if(o!=null&&typeof o=="object"){if(t||(t=new WeakSet),t.has(o))return o;t.add(o);let i;if(Array.isArray(o))i=[];else{i=Object.create(Object.getPrototypeOf(o));const n=Object.getOwnPropertyDescriptors(o);for(const s in n){const r=n[s];if(r.set||r.writable!==!1)try{i[s]=o[s]}catch{}}}for(const n of Object.keys(o)){const s=o[n];e&&!e(o,n,s)?i[n]=s:s?.clone!==void 0&&typeof s.clone=="function"?i[n]=s.clone():i[n]=kc(s,e,t)}return i}return o}function Bo(o){return new Promise((e,t)=>{setTimeout(e,o)})}function Yd(o,e){if(o<=0)return Promise.resolve();if(e||(e=ue.Current),!e)return Promise.reject("No context");const t=e.time.frameCount+o;return new Promise((i,n)=>{if(!e)return n("No context");const s=()=>{e.time.frameCount>=t&&(e.pre_update_callbacks.splice(e.pre_update_callbacks.indexOf(s),1),i())};e.pre_update_callbacks.push(s)})}const Kd=w("debugresolveurl"),E_="rel:";function Vk(o,e){return Yn(o,e)}function Yn(o,e){if(e===void 0)return Kd&&console.warn("getPath: uri is undefined, returning uri",e),e;if(e.startsWith("./"))return e;if(e.startsWith("http"))return Kd&&console.warn("getPath: uri is absolute, returning uri",e),e;if(o===void 0)return Kd&&console.warn("getPath: source is undefined, returning uri",e),e;e.startsWith(E_)&&(e=e.substring(4));const t=o.lastIndexOf("/");if(t>=0){const i=o.substring(0,t+1);for(;i.endsWith("/")&&e.startsWith("/");)e=e.substring(1);const n=i+e;return Kd&&console.log("source:",o,`changed uri from`,e,` to `,n,` basePath: `+i),n}return e}function M_(o){if(o)return o=o.trim(),o=o.split("?")[0]?.split("#")[0],o}class $k{subscribeWrite(e){this.writeCallbacks.push(e)}unsubscribeWrite(e){const t=this.writeCallbacks.indexOf(e);t!==-1&&this.writeCallbacks.splice(t,1)}writeCallbacks=[];constructor(e,t){this._object=e,this._prop=t,this._wrapperProp=Symbol("$"+t),this.apply()}_applied=!1;_object;_prop;_wrapperProp;apply(){if(this._applied||!this._object)return;const e=this._object,t=this._prop;if(e[t]===void 0)return;this._applied=!0,e[this._wrapperProp]!==void 0&&console.warn("Watcher is being applied to an object that already has a wrapper property. This is not (yet) supported");const i=e[t];e[this._wrapperProp]=i,Object.defineProperty(e,t,{get:()=>e[this._wrapperProp],set:n=>{e[this._wrapperProp]=n;for(const s of this.writeCallbacks)s(n,this._prop)}})}revoke(){if(!this._applied||!this._object)return;this._applied=!1;const e=this._object,t=this._prop;Reflect.deleteProperty(e,t);const i=e[this._wrapperProp];e[t]=i,Reflect.deleteProperty(e,this._wrapperProp)}dispose(){this.revoke(),this.writeCallbacks.length=0,this._object=null}}class ys{_watches=[];constructor(e,t){if(Array.isArray(t))for(const i of t)this._watches.push(new ys(e,i));else this._watches.push(new $k(e,t))}subscribeWrite(e){for(const t of this._watches)t.subscribeWrite(e)}unsubscribeWrite(e){for(const t of this._watches)t.unsubscribeWrite(e)}apply(){for(const e of this._watches)e.apply()}revoke(){for(const e of this._watches)e.revoke()}dispose(){for(const e of this._watches)e.dispose();this._watches.length=0}}const Na=Symbol("needle:watches");function Zd(o,e){if(!o[Na])if(o instanceof Z)o[Na]=new ys(o,["x","y"]);else if(o instanceof _)o[Na]=new ys(o,["x","y","z"]);else if(o instanceof ye||o instanceof U)o[Na]=new ys(o,["x","y","z","w"]);else return!1;return o[Na].subscribeWrite(e),!0}function bg(o,e){if(!o)return;const t=o[Na];t&&t.unsubscribeWrite(e)}var I;(o=>{let e;function t(){if(e!==void 0)return e;if(typeof window>"u")return e=!1;const te=window.navigator.userAgent,He=/Windows|MacOS|Mac OS/.test(te),bi=/Windows NT/.test(te)&&/Edg/.test(te)&&!/Win64/.test(te);return e=He&&!bi&&!O()}o.isDesktop=t;let i;function n(){return i!==void 0?i:typeof window.orientation<"u"||navigator.userAgent.indexOf("IEMobile")!==-1?i=!0:i=/iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent)}o.isMobileDevice=n;function s(){return a()}o.isIPad=s;let r;function a(){if(r!==void 0)return r;const te=navigator.userAgent.toLowerCase();return r=/iPad/.test(navigator.userAgent)||te.includes("macintosh")&&"ontouchend"in document}o.isiPad=a;let l;function c(){return l!==void 0?l:l=/Android/.test(navigator.userAgent)}o.isAndroidDevice=c;let h;function d(){return h!==void 0?h:h=/WebXRViewer\//i.test(navigator.userAgent)}o.isMozillaXR=d;let p;function m(){return p!==void 0?p:p=/NeedleAppClip\//i.test(navigator.userAgent)}o.isNeedleAppClip=m;let g;function f(){if(g!==void 0)return g;if(O()||a())return g=!1;const te=navigator.userAgent.toLowerCase();return navigator.userAgentData?g=navigator.userAgentData.platform==="macOS":g=te.includes("mac os x")||te.includes("macintosh")}o.isMacOS=f;let y;function b(){return y!==void 0?y:y=a()&&"xr"in navigator&&G()}o.isVisionOS=b;let v;const x=["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"];function O(){return v!==void 0?v:v=x.includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document}o.isiOS=O;let k;function D(){return k!==void 0||(k=/^((?!chrome|android).)*safari/i.test(navigator.userAgent)),k}o.isSafari=D;let L;function W(){return L!==void 0?L:L=navigator.userAgent.includes("OculusBrowser")}o.isQuest=W;let V;function G(){return V!==void 0||(V=document.createElement("a").relList.supports("ar")),V}o.supportsQuickLookAR=G;async function X(){try{return(await navigator.permissions.query({name:"microphone"})).state!=="denied"}catch(te){return console.error("Error querying `microphone` permissions.",te),!1}}o.microphonePermissionsGranted=X;let T;function $(){if(T!==void 0)return T;const te=navigator.userAgent.match(/iPhone OS (\d+_\d+)/);if(te&&(T=te[1].replace("_",".")),!T){const He=navigator.userAgent.match(/(?:\(Macintosh;|iPhone;|iPad;).*Version\/(\d+\.\d+)/);He&&(T=He[1])}return T||(T=null),T}o.getiOSVersion=$;let q;function he(){if(q!==void 0)return q;const te=navigator.userAgent.match(/(?:CriOS|Chrome)\/(\d+\.\d+\.\d+\.\d+)/);return te?q=te[1].replace("_","."):q=null,q}o.getChromeVersion=he;let ae;function ge(){if(ae!==void 0)return ae;const te=navigator.userAgent.match(/Version\/(\d+\.\d+)/);return te&&D()?ae=te[1]:ae=null,ae}o.getSafariVersion=ge})(I||(I={}));function Hk(){return I.isDesktop()}function Gk(){return I.isMobileDevice()}function qk(){return I.isiPad()}function Xk(){return I.isiPad()}function Qk(){return I.isAndroidDevice()}function Yk(){return I.isMozillaXR()}function Kk(){return I.isMacOS()}function Zk(){return I.isiOS()}function Jk(){return I.isSafari()}function eO(){return I.isQuest()}async function tO(){return I.microphonePermissionsGranted()}const Os=new WeakMap;function _g(o,e,t){if(!Os.get(o)){const n=new MutationObserver(s=>{iO(o,s)});Os.set(o,{observer:n,attributeChangedListeners:new Map}),n.observe(o,{attributes:!0})}const i=Os.get(o).attributeChangedListeners;return i.has(e)||i.set(e,[]),i.get(e).push(t),()=>{vg(o,e,t)}}function vg(o,e,t){if(!Os.get(o))return;const i=Os.get(o).attributeChangedListeners;if(!i.has(e))return;const n=i.get(e),s=n.indexOf(t);s!==-1&&(n.splice(s,1),n.length<=0&&(i.delete(e),Os.get(o)?.observer.disconnect(),Os.delete(o)))}function iO(o,e){const t=Os.get(o).attributeChangedListeners;for(const i of e)if(i.type==="attributes"){const n=i.attributeName,s=o.getAttribute(n);if(t.has(n))for(const r of t.get(n))r(s)}}class wg{reason;constructor(e){this.reason=e}}async function xg(o){const e=await Promise.allSettled(o).catch(n=>[new wg(n.message)]);let t=!1;const i=e.map(n=>"value"in n?n.value:(t=!0,new wg(n.reason)));return{anyFailed:t,results:i}}const nO=w("debugdebug");let Sg=!1;(w("noerrors")||w("nooverlaymessages"))&&(Sg=!0);const Cg="needle_engine_global_error_container";var zi=(o=>(o[o.Log=0]="Log",o[o.Warn=1]="Warn",o[o.Error=2]="Error",o))(zi||{});function T_(){return I_}const Pg=new Array;function oO(o){Pg.push(o)}let kg=!1;function sO(...o){if(!kg){kg=!0;try{for(let e=0;e<Pg.length;e++)Pg[e](...o)}catch(e){console.error(e)}kg=!1}}const R_=console.error,rO=function(...o){R_.apply(console,o),cO(o),kr(2,o,{}),lO(...o)};function A_(o){Sg=!o,o?console.error=rO:console.error=R_}function aO(o){return A_(o)}let I_=0;function lO(...o){I_+=1,sO(...o)}function cO(o){if(Array.isArray(o))for(let e=0;e<o.length;e++){const t=o[e];typeof t=="string"&&t.startsWith("THREE.PropertyBinding: Trying to update node for track:")&&(o[e]="Some animated objects couldn't be found: see console for details")}}const L_=new Set;function kr(o,e,t={},i,n){if(Sg)return;if(t.once===!0){let a="";if(Array.isArray(e))for(let l=0;l<e.length;l++){let c=e[l];c instanceof Error&&(c=c.message),typeof c!="object"&&(l>0&&(a+=" "),a+=c)}else typeof e=="string"&&(a=e);if(L_.has(a))return;L_.add(a)}const s=ue.Current;let r=s?.domElement??document.querySelector("needle-engine");if(s?.isInAR&&(r=s.arOverlayElement),!!r){if(Array.isArray(e)){let a="";for(let l=0;l<e.length;l++){let c=e[l];c instanceof Error&&(c=c.message),typeof c!="object"&&(l>0&&(a+=" "),a+=c)}e=a}!e||e.length<=0||hO(o,r,e,t)}}const Wa=new Map,D_=.2;function hO(o,e,t,i={}){if(t==null)return;const n=pO(e);if(n.childElementCount>=20){const c=n.lastElementChild;B_(c)}t.length>400&&(t=t.substring(0,400)+"...");const s=i.key??t;if(Wa.has(s)){Wa.get(s)?.update(t,i);return}const r=mO(o,t);n.prepend(r);const a=()=>{Wa.delete(s),B_(r)};let l=setTimeout(a,Math.max(D_,i.duration??10)*1e3);Wa.set(s,{update:(c,h)=>{c.length>400&&(c=c.substring(0,400)+"..."),r.innerHTML=c,h.duration&&(clearTimeout(l),l=setTimeout(a,Math.max(D_,h.duration)*1e3))},removeFunction:a})}function dO(){nO&&console.log("Clearing messages");for(const o of Wa.values())o?.removeFunction.call(o);Wa.clear()}const uO=` @import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap'); div[data-needle_engine_debug_overlay] { font-family: 'Roboto Flex', sans-serif; font-weight: 400; font-size: 16px; } div[data-needle_engine_debug_overlay] strong { font-weight: 700; } div[data-needle_engine_debug_overlay] a { color: white; text-decoration: none; border-bottom: 1px solid rgba(255, 255, 255, 0.3); } div[data-needle_engine_debug_overlay] a:hover { text-decoration: none; border: none; } div[data-needle_engine_debug_overlay] .log strong { color: rgba(200,200,200,.9); } div[data-needle_engine_debug_overlay] .warn strong { color: rgba(255,255,230, 1); } div[data-needle_engine_debug_overlay] .error strong { color: rgba(255,100,120, 1); } `;function pO(o){globalThis[Cg]||(globalThis[Cg]=new Map);const e=globalThis[Cg];if(e.has(o))return e.get(o);{const t=document.createElement("div");e.set(o,t),t.setAttribute("data-needle_engine_debug_overlay",""),t.classList.add("debug-container"),t.style.cssText=` position: absolute; top: 0; right: 5px; padding-top: env(safe-area-inset-top, 0px); max-width: 70%; max-height: calc(100% - 105px); z-index: 100000; pointer-events: scroll; display: flex; align-items: end; flex-direction: column; color: white; overflow: auto; word-break: break-word; `,I.isNeedleAppClip()&&(t.style.left="5px",t.style.right="unset");const i=document.querySelector('meta[name="viewport"]');i&&!i.getAttribute("content")?.includes("viewport-fit=")&&i.setAttribute("content",i.getAttribute("content")+",viewport-fit=cover"),o.shadowRoot?o.shadowRoot.appendChild(t):o.appendChild(t);const n=document.createElement("style");return n.innerHTML=uO,t.appendChild(n),t}}const j_=Symbol("logtype"),Jd=new Map;function B_(o){o.remove();const e=o[j_],t=Jd.get(e)??[];t.push(o),Jd.set(e,t)}function mO(o,e){if(Jd.has(o)){const i=Jd.get(o);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[j_]=o,o){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}const gO=w("nodevlogs");let Og,Eg;function M(){if(gO)return!1;if(Og!==void 0)return Og;if(Eg!==void 0)return Eg;let o=Fi();return o||(o=typeof window<"u"&&window.location.hostname.endsWith(".local-credentialless.webcontainer.io")),Eg=o,o}function fO(o){Og=o}class yO{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,s){return n+(s-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of bO){const s=e[n],r=t[n];if(s===void 0||r===void 0)break;if(Math.abs(s-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const bO=["x","y","z","w"],j=new yO;class F_{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class eu{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new F_(this.alpha(this.minCutOff)),this.dx=new F_(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,s=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(s);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class Mg{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new eu(e,t,i,n),this.y=new eu(e,t,i,n),this.z=new eu(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const tu="needle:cameraController";function U_(o){return o[tu]}function Tg(o,e,t){t?o[tu]=e:o[tu]===e&&(o[tu]=null)}const Rg="needle:autofit";function z_(o){return o[Rg]===void 0?!0:o[Rg]!==!1}function iu(o,e){o[Rg]=e}let kn;const _O={x:0,y:0,width:0,height:0},vO=w("debugfocusrect");function wO(o,e,t,i,n){o instanceof Element&&(vO&&o instanceof HTMLElement&&(o.style.outline="2px dashed rgba(255, 150, 0, .8)"),o=o.getBoundingClientRect()),kn=n.domElement.getBoundingClientRect();const s=_O;s.x=o.x,s.y=o.y,s.width=o.width,s.height=o.height,s.x-=kn.x,s.y-=kn.y;const r=kn.width,a=kn.height,l=i.view,c=e.zoom;let h=l?.offsetX||0,d=l?.offsetY||0,p=kn.width,m=kn.height;p/=c,m/=c,h=p*(c-1)*.5,d=m*(c-1)*.5;const g=s.x+s.width*.5,f=s.y+s.height*.5,y=kn.width*.5,b=kn.height*.5,v=g-y,x=f-b;h-=v/c,d-=x/c,e.offsetX!==void 0&&(h+=e.offsetX*(kn.width*.5)),e.offsetY!==void 0&&(d-=e.offsetY*(kn.height*.5));const O=l?.offsetX||h,k=l?.offsetY||d;h=j.lerp(O,h,t),d=j.lerp(k,d,t);const D=l?.width||r,L=l?.height||a;p=j.lerp(D,p,t),m=j.lerp(L,m,t),i.setViewOffset(r,a,h,d,p,m),i.updateProjectionMatrix(),e.damping>0&&(e.damping*=1-t,e.damping<.01&&(e.damping=0),e.damping=Math.max(0,e.damping))}function N_(o,e,t){const i=o.length(),n=e.length(),s=j.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const Ag=new U,W_=new U().setFromAxisAngle(new _(0,1,0),Math.PI);function xO(o,e){o.lookAt(e),o.quaternion.multiply(W_)}function Oc(o,e,t=!0,i=!1){if(o===e)return;Ag.copy(o.quaternion);const n=ne(e),s=ne(o);if(i){if(On(o,we(e)),t){const r=s.y,a=s.sub(q_(o));a.y=r,o.lookAt(a),o.quaternion.multiply(W_)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Ag);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(Ag)}function SO(o,e,t,i=1){if(t){const n=F(0,0,0),s=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(s,r,0),n.unproject(t);const a=t.worldPosition,l=o.worldPosition.distanceTo(a),c=n.sub(a);c.multiplyScalar(i*3.6*l);const h=t.worldPosition.add(c);return o.lookAt(h),h}return null}const CO=new Ui(()=>new _,100);function F(o,e,t){const i=CO.get();return i.set(0,0,0),o instanceof _?i.copy(o):Array.isArray(o)?i.set(o[0],o[1],o[2]):o instanceof DOMPointReadOnly?i.set(o.x,o.y,o.z):typeof o=="number"?(i.x=o,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof o=="object"&&(i.x=o.x,i.y=o.y,i.z=o.z),i}const PO=new Ui(()=>new se,30);function V_(o){const e=PO.get();return o?e.copy(o):e.set(0,0,0),e}const kO=new Ui(()=>new U,100);function _i(o,e,t,i){const n=kO.get();return n.identity(),o instanceof U?n.copy(o):o instanceof DOMPointReadOnly?n.set(o.x,o.y,o.z,o.w):typeof o=="number"&&e!==void 0&&t!==void 0&&i!==void 0?n.set(o,e,t,i):typeof o=="object"&&"x"in o&&"y"in o&&"z"in o&&"w"in o&&n.set(o.x,o.y,o.z,o.w),n}const Ig=new Ui(()=>new _,100),$_=Symbol("lastMatrixWorldUpdateKey");function ne(o,e=null,t=!0){const i=e??Ig.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[$_]!==Date.now()&&(o[$_]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function Vt(o,e){if(!o)return o;const t=Ig.get();return e!==t&&t.copy(e),o.parent!==null&&o.parent.worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function Or(o,e,t,i){const n=Ig.get();return n.set(e,t,i),Vt(o,n),o}const nu=new Ui(()=>new U,100),Er=new U,Lg=new U;function we(o,e=null){if(!o)return nu.get().identity();const t=e??nu.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function On(o,e){if(!o)return;e!==Er&&Er.copy(e);const t=Er;o?.parent?.getWorldQuaternion(Lg),Lg.invert();const i=Lg.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Dg(o,e,t,i,n){Er.set(e,t,i,n),On(o,Er)}const OO=new Ui(()=>new _,100),EO=new _;function Xe(o,e=null){return e||(e=OO.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function Va(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=EO;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const MO=new _,H_=new U;function TO(o){return we(o,H_),MO.set(0,0,1).applyQuaternion(H_)}const RO=new Ui(()=>new _,100),G_=new U;function q_(o,e){return e||(e=RO.get().set(0,0,1)),we(o,G_),e.applyQuaternion(G_)}const X_=new qe,Q_=new qe,AO=new _;function jg(o){const e=nu.get();return o.getWorldQuaternion(e),Q_.setFromQuaternion(e),Q_}function Bg(o,e){const t=nu.get();On(o,t.setFromEuler(e))}function ou(o){const e=jg(o),t=AO;return t.set(e.x,e.y,e.z),t.x=j.toDegrees(t.x),t.y=j.toDegrees(t.y),t.z=j.toDegrees(t.z),t}function Y_(o,e){Ec(o,e.x,e.y,e.z,!0)}function Ec(o,e,t,i,n=!0){n&&(e=j.toRadians(e),t=j.toRadians(t),i=j.toRadians(i)),X_.set(e,t,i),Er.setFromEuler(X_),On(o,Er)}function su(o,e=!0){o&&(e?function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()}(o):o.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function IO(o){let e=o?.name||"";if(!o)return e;let t=o.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function K_(o){if(o){const e=o;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class zm extends Xn{static vertex=` varying vec2 vUv; void main(){ vUv = uv; gl_Position = vec4(position.xy, 0., 1.0); }`;constructor(){super({vertexShader:zm.vertex,uniforms:{map:new tn(null),flipY:new tn(!0),writeDepth:new tn(!1),depthTexture:new tn(null)},fragmentShader:` uniform sampler2D map; uniform bool flipY; uniform bool writeDepth; uniform sampler2D depthTexture; varying vec2 vUv; void main(){ vec2 uv = vUv; if (flipY) uv.y = 1.0 - uv.y; gl_FragColor = texture2D(map, uv); if (writeDepth) { float depth = texture2D(depthTexture, uv).r; gl_FragDepth = depth; // float linearDepth = (depth - 0.99) * 100.0; // Enhance near 1.0 values // gl_FragColor = vec4(linearDepth, linearDepth, linearDepth, 1.0); } }`})}reset(){this.uniforms.map.value=null,this.uniforms.flipY.value=!0,this.uniforms.writeDepth.value=!1,this.uniforms.depthTexture.value=null,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}}class yr{static _planeGeometry;static _renderer;static _perspectiveCam;static _orthographicCam;static _scene;static _blitMaterial;static _mesh;static get planeGeometry(){return this._planeGeometry??=new Cn(2,2,1,1)}static get renderer(){return this._renderer??=new xr({antialias:!1,alpha:!0})}static get perspectiveCam(){return this._perspectiveCam??=new de}static get orthographicCam(){return this._orthographicCam??=new Bd}static get scene(){return this._scene??=new Di}static get blitMaterial(){return this._blitMaterial??=new zm}static get mesh(){return this._mesh??=new H(yr.planeGeometry,yr.blitMaterial)}static copyTexture(e,t){t||(t=this.blitMaterial),this.blitMaterial.reset();const i=t||this.blitMaterial;i.uniforms.map.value=e,i.needsUpdate=!0,i.uniformsNeedUpdate=!0;const n=i.vertexShader;i.vertexShader=zm.vertex;const s=this.mesh;s.material=i,s.frustumCulled=!1,this.scene.children.length=0,this.scene.add(s),this.renderer.setSize(e.image.width,e.image.height),this.renderer.clear(),this.renderer.render(this.scene,this.perspectiveCam);const r=new Se(this.renderer.domElement);return r.name="Copy",r.needsUpdate=!0,i.vertexShader=n,r}static blit(e,t,i){const{renderer:n=this.renderer,blitMaterial:s=this.blitMaterial,flipY:r=!1,depthTexture:a=null,depthTest:l=!0,depthWrite:c=!0}=i||{};this.blitMaterial.reset(),s.uniforms.map&&(s.uniforms.map.value=e),s.uniforms.flipY&&(s.uniforms.flipY.value=r),a?(s.uniforms.writeDepth=new tn(!0),s.uniforms.depthTexture.value=a):(s.uniforms.writeDepth=new tn(!1),s.uniforms.depthTexture.value=null),s.needsUpdate=!0,s.uniformsNeedUpdate=!0;const h=this.mesh;h.material=s,h.frustumCulled=!1,this.scene.children.length=0,this.scene.add(h);const d=n.getRenderTarget(),p=n.getContext();l?p.enable(p.DEPTH_TEST):p.disable(p.DEPTH_TEST),n.state.buffers.depth.setMask(c),n.setClearColor(new se(0,0,0),0),n.setRenderTarget(t),n.clear(),n.render(this.scene,this.perspectiveCam),n.setRenderTarget(d),p.enable(p.DEPTH_TEST),n.state.buffers.depth.setMask(!0)}static textureToCanvas(e,t=!1){if(!e)return null;(t===!0||e.isCompressedTexture===!0)&&(e=Z_(e));const i=e.image;if(DO(i)){const n=document.createElement("canvas");n.width=i.width,n.height=i.height;const s=n.getContext("2d");return s?(s.drawImage(i,0,0,i.width,i.height,0,0,n.width,n.height),n):(console.error("Failed getting canvas 2d context"),null)}return null}}function Z_(o){return yr.copyTexture(o)}function LO(o,e=!1){return yr.textureToCanvas(o,e)}function DO(o){return typeof HTMLImageElement<"u"&&o instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&o instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&o instanceof OffscreenCanvas||typeof ImageBitmap<"u"&&o instanceof ImageBitmap}function jO(o){const e=o.type;return e==="Mesh"||e==="SkinnedMesh"}function Fg(o,e){e?o["needle:rendercustomshadow"]=!0:o["needle:rendercustomshadow"]=!1}function J_(o){return!!(o&&(o["needle:rendercustomshadow"]===!0||o["needle:rendercustomshadow"]==null))}function vi(o,e=void 0,t=void 0,i=void 0){const n=i||new ti;n.makeEmpty();const s=[];function r(l){let c=!0;if(l.visible&&z_(l)!==!1&&!(l.type==="TransformControlsGizmo"||l.type==="TransformControlsPlane")){if(l instanceof $C&&(c=!1),l instanceof Vb&&(c=!1),l instanceof za&&(c=!1),l.isGizmo===!0&&(c=!1),l.material instanceof Wb&&(c=!1),jO(l)||(c=!1),t&&l.layers.test(t)===!1&&(c=!1),c&&(e&&Array.isArray(e)&&e?.includes(l)||typeof e=="function"&&e(l)===!0))return;if(l.isUI!==!0){if(c){const h=l.children;l.children=s;const d=l.position,p=l.scale;if(Number.isNaN(d.x)||Number.isNaN(d.y)||Number.isNaN(d.z)){console.warn(`Object "${l.name}" has NaN values in position or scale.... will ignore it`,d,p);return}l.geometry===null&&(l.geometry=void 0),n.expandByObject(l,!0),l.children=h}for(const h of l.children)r(h)}}}let a=!1;Array.isArray(o)||(o=[o]);for(const l of o)l&&(a=!0,l.updateMatrixWorld(),r(l));return a||console.warn("No objects to fit camera to..."),n}function ev(o,e,t){const i=vi([o],t?.ignore),n=new _;i.getSize(n);const s=new _;i.getCenter(s);const r=new _;e.getSize(r);const a=new _;e.getCenter(a);const l=new _;l.set(r.x/n.x,r.y/n.y,r.z/n.z);const c=Math.min(l.x,l.y,l.z),h=t?.scale!==!1;if(h&&Va(o,Xe(o).multiplyScalar(c)),t?.position!==!1){const d=new _;i.getCenter(d),d.y=i.min.y;const p=new _;e.getCenter(p),p.y=e.min.y;const m=p.clone().sub(d);h&&m.multiplyScalar(c),Vt(o,ne(o).add(m))}return{boundsBefore:i,scale:l}}function tv(o,e){const t=vi([o]),i=new _;t.getCenter(i),i.y=t.min.y;const n=e.clone().sub(i),s=ne(o);return Vt(o,s.add(n)),{offset:n,bounds:t}}function Ug(o,e,t,i){if(Array.isArray(e)){let r=!0;for(let a=0;a<e.length;a++)Ug(o,e[a],a,e)||(r=!1);return r}if(e.type==="MeshStandardMaterial"||e.type==="MeshBasicMaterial")return!1;if(e["material:fbx"]!=null)return!0;const n=new wt;n["material:fbx"]=e;const s=e;return s&&(s.map?n.color.set(1,1,1):n.color.copyLinearToSRGB(s.color),n.emissive.copyLinearToSRGB(s.emissive),n.emissiveIntensity=s.emissiveIntensity,n.opacity=s.opacity,n.displacementScale=s.displacementScale,n.transparent=s.transparent,n.bumpMap=s.bumpMap,n.aoMap=s.aoMap,n.map=s.map,n.displacementMap=s.displacementMap,n.emissiveMap=s.emissiveMap,n.normalMap=s.normalMap,n.envMap=s.envMap,n.alphaMap=s.alphaMap,n.metalness=s.reflectivity,n.vertexColors=s.vertexColors,s.shininess&&(n.roughness=1-Math.sqrt(s.shininess)/10),n.needsUpdate=!0),t===void 0?o.material=n:i[t]=n,!0}let ru=!1;function BO(){oO((...o)=>{M()&&ue.Current?.isInXR&&($a(!0),iv("error",...o))})}function $a(o){if(o){if(ru)return;ru=!0,UO()}else{if(!ru)return;ru=!1,zO()}}const Mc={log:void 0,warn:void 0,error:void 0};class FO{familyName="needle-xr";root=null;context=null;defaultFontSize=.06;constructor(){this.ensureFont()}onEnable(){this.context=ue.Current||ue.All[0],this.context.pre_render_callbacks.push(this.onBeforeRender)}onDisable(){this.context?.pre_render_callbacks.splice(this.context?.pre_render_callbacks.indexOf(this.onBeforeRender),1),this.root?.removeFromParent()}targetObject=new E;userForwardViewPoint=new _;oneEuroFilter=new Mg(90,.8);_lastElementRemoveTime=0;onBeforeRender=()=>{const e=this.context?.mainCamera;if(this.context&&e instanceof de){const t=this.getRoot();Number.isNaN(t.position.x)&&t.position.set(0,0,0),Number.isNaN(t.quaternion.x)&&t.quaternion.set(0,0,0,1),this.context.scene.add(this.targetObject);const i=this.context.xr?.rigScale??1,n=3.5*i,s=e.worldForward;s.y=0,s.normalize().multiplyScalar(n),this.userForwardViewPoint.copy(e.worldPosition).sub(s),this.targetObject.position.distanceTo(this.userForwardViewPoint)>2*i&&(this.targetObject.position.copy(this.userForwardViewPoint),Oc(this.targetObject,e,!0,!0),this.targetObject.rotateY(Math.PI)),this.oneEuroFilter.filter(this.targetObject.position,t.position,this.context.time.time);const r=this.context.time.deltaTime;if(t.quaternion.slerp(this.targetObject.quaternion,r*5),t.scale.setScalar(i),this.targetObject.removeFromParent(),this.context.scene.add(t),this.context.time.time-this._lastElementRemoveTime>.1){this._lastElementRemoveTime=this.context.time.time;const a=Date.now();for(let l=0;l<this._activeTexts.length;l++){const c=this._activeTexts[l];if(c instanceof Oe.Text&&a-c._activatedTime>2e4){c.removeFromParent(),this._textBuffer.push(c),this._activeTexts.splice(l,1);break}}}}};addLog(e,t){const i=this.getRoot(),n=this.getText();let s=16777215,r=0;switch(e){case"log":s=16777215,r=0;break;case"warn":s=16772761,r=4465152;break;case"error":s=16755370,r=7798784;break}t.length>1e3&&(t=t.substring(0,1e3)+"...");const a=new Date().toISOString().split("T")[1].split(".")[0];n.textContent="["+a+"] "+t,n.visible=!0,n._activatedTime=Date.now(),i.add(n),this._activeTexts.push(n),this.context&&this.context.scene.add(i),n.set({backgroundColor:s,color:r}),Oe.update()}ensureFont(){let e=Oe.FontLibrary.getFontFamily(this.familyName);e||(e=Oe.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://cdn.needle.tools/static/fonts/msdf/arial/arial-msdf.json","https://cdn.needle.tools/static/fonts/msdf/arial/arial.png")?.addEventListener("ready",()=>{Oe.update()}))}textOptions={fontSize:this.defaultFontSize,fontFamily:this.familyName,padding:.03,margin:.005,color:0,backgroundColor:16777215,backgroundOpacity:.4,borderRadius:.03,offset:.025};_textBuffer=[];_activeTexts=[];getText(){const e=this.getRoot();if(this._textBuffer.length>0){const i=this._textBuffer.pop();return i.visible=!0,setTimeout(()=>this.disableDepthTestRecursive(i),100),i}if(e.children.length>20&&this._activeTexts.length>0)return this._activeTexts.shift();const t=new Oe.Text(this.textOptions);return setTimeout(()=>this.disableDepthTestRecursive(t),500),setTimeout(()=>this.disableDepthTestRecursive(t),1500),t}disableDepthTestRecursive(e,t=0){for(let n=0;n<e.children.length;n++){const s=e.children[n];s instanceof E&&this.disableDepthTestRecursive(s,t+1)}e.renderOrder=10*t,e.layers.set(2);const i=e.material;i&&(i.depthWrite=!1,i.depthTest=!1,i.transparent=!0),t===0&&Oe.update()}getRoot(){if(this.root)return this.root;const e=this.defaultFontSize,t={boxSizing:"border-box",fontFamily:this.familyName,width:"2.6",fontSize:e,color:0,lineHeight:1,backgroundColor:16777215,backgroundOpacity:0,whiteSpace:"pre-wrap",flexDirection:"column-reverse"};return this.root=new Oe.Block(t),this.root}}let Mr=null;function UO(){Mr||(Mr=new FO),Mr.onEnable();for(const o in Mc){Mc[o]=console[o];let e=!1;console[o]=function(){if(Mc[o]?.apply(console,arguments),!e)try{e=!0,iv(o,...arguments)}finally{e=!1}}}}function zO(){Mr?.onDisable();for(const o in Mc)console[o]=Mc[o]}const Tc=new Map;function iv(o,...e){try{switch(Tc.clear(),o){case"log":Mr?.addLog("log",t());break;case"warn":Mr?.addLog("warn",t());break;case"error":Mr?.addLog("error",t());break}}catch(s){console.error("Error in spatial console",s)}finally{Tc.clear()}function t(){let s="";for(let r=0;r<e.length;r++){const a=e[r];s+=i(a),r<e.length-1&&(s+=", ")}return s}function i(s,r=0){if(typeof s=="string")return'"'+s+'"';if(typeof s=="number"){if(s%1!==0){const a=s.toFixed(5),l=a.indexOf(".");let c=a.length-1;for(;c>l&&a[c]==="0";)c--;return a.substring(0,c+1)}return s.toString()}else if(Array.isArray(s)){let a="[";for(let l=0;l<s.length;l++){const c=s[l];a+=i(c,r+1),l<s.length-1&&(a+=", ")}return a+="]",a}else{if(s===null)return"null";if(s===void 0)return"undefined";if(typeof s=="function")return s.name+"()"}if(s instanceof Z)return`(${i(s.x)}, ${i(s.y)})`;if(s instanceof _)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)})`;if(s instanceof ye)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof U)return`(${i(s.x)}, ${i(s.y)}, ${i(s.z)}, ${i(s.w)})`;if(s instanceof ve||s instanceof Se)return s.name;if(s instanceof $b)return`[${s.elements.join(", ")}]`;if(s instanceof J)return`[${s.elements.join(", ")}]`;if(s instanceof Ss)return s.mask.toString();if(typeof s=="object"){if(Tc.has(s))return"*";let a=`{ `;a+=n(r);const l=Object.keys(s);let c="";for(let h=0;h<l.length;h++){const d=l[h],p=s[d];if(Tc.has(p)){c+="";continue}Tc.set(p,!0),c+=d+":"+i(p,r+1),h<l.length-1&&(c+=", "),c.length>=60&&(c+=` `,c+=n(r),a+=c,c="")}return a+=c,a+=` }`,a}return s}function n(s){let r="";for(let a=0;a<s;a++)r+=" ";return r}}function Ee(o,e){kr(e?.type??zi.Log,o,e)}function be(o,e){Ee(o,{...e,type:zi.Warn})}function Rc(o,e){Ee(o,{...e,type:zi.Error})}let wi,Tr=null,Kn=null,Ac=!1,nv=null;const ov="terminal",NO=w("console");NO&&zg();const WO=Symbol("consoleParent");function zg(){if(wi){wi.showSwitch();return}qO()}function sv(){wi&&(wi.hide(),wi.hideSwitch())}function VO(){nv||(nv=setInterval($O,500))}let rv=0;function $O(){const o=T_(),e=o!==rv;rv=o,e&&HO()}function HO(){zg(),Kn&&(Kn.setAttribute("error","true"),Kn.innerText="\u{1F92C}")}function GO(){Kn&&(Kn.removeAttribute("error"),Kn.innerText=ov)}function qO(o=!1){if(wi!==void 0||Ac)return;Ac=!0;const e=document.createElement("script");e.onload=()=>{if(!globalThis.VConsole){console.warn("\u{1F335} Debug console failed to load."),Ac=!1,wi=null;return}Ac=!1,VO(),wi=new VConsole({pluginOrder:["default","needle-console"]});const t=globalThis["needle:codegen_files"];if(t&&t.length>0&&wi.addPlugin(XO()),wi.addPlugin(ZO()),wi.addPlugin(JO()),Tr=hE(),Tr&&(Tr[WO]=Tr.parentElement,Tr.style.position="absolute",Tr.style.zIndex=Number.MAX_SAFE_INTEGER.toString()),wi.setSwitchPosition(20,30),Kn=cE(),Kn){Kn.innerText=ov,Kn.addEventListener("click",GO);const i=document.createElement("style"),n=40;i.innerHTML=` #__vconsole .vc-switch { border: 1px solid rgba(255, 255, 255, .1); border-radius: 50%; width: ${n}px; height: ${n}px; padding: 0; line-height: ${n}px; font-size: ${n*.4}px; text-align: center; background: #ffffff5c; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); user-select: none; pointer-events: auto; transition: transform .2s ease-in-out; box-shadow: 0px 7px 0.5rem 0px rgb(0 0 0 / 6%), inset 0px 0px 1.3rem rgba(0,0,0,.05); font-family: 'Material Symbols Outlined'; color: black; font-size: 2.3em; font-weight: 100; } #__vconsole .vc-switch:hover { cursor: pointer; transform: scale(1.1); transition: transform .1s ease-in-out, background .1s linear; background: rgba(245, 245, 245, .8); outline: rgba(0, 0, 0, .05) 1px solid; } #__vconsole .vc-switch[error] { background: rgba(255,0,0,.2); animation: vconsole-notify 1s ease-in-out; line-height: 35px; } @keyframes vconsole-notify { from { transform: scale(1, 1); } 10% { transform: scale(1.3, 1.3); } 70% { transform: scale(1.4, 1.4); } to { transform: scale(1, 1); } } #__vconsole .vc-panel { font-family: monospace; font-size: 11px; } #__vconsole .vc-plugin-box.vc-actived { height: 100%; } #__vconsole .vc-mask { overflow: hidden; } `,Tr?.prepend(i),o===!0&&T_()<=0&&sv(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),Ac=!1,wi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function XO(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),wi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}const Ng="padding: 10px; font-family: monospace;",av="margin-bottom: 10px;",Rr="margin-bottom: 10px; margin-top: 15px;",QO="width: 100%; border-collapse: collapse; border: 1px solid rgba(0,0,0,0.1); table-layout: fixed;",lv="border: 1px solid rgba(0,0,0,0.1); padding: 5px;",YO=lv,KO=lv+" word-break: break-all;";function Zn(o,e=!1){e&&o.sort((i,n)=>(n.value?1:0)-(i.value?1:0));let t=`<table style='${QO}'>`;t+="<tbody>";for(const i of o){const n=typeof i.value=="boolean"?i.value?"\u2705":"\u274C":i.value;t+=`<tr><td style='${YO}'>${i.label}</td><td style='${KO}'>${n}</td></tr>`}return t+="</tbody></table>",t}function cv(){try{if(document.createElement("canvas").getContext("webgl2"))return"\u2705"}catch{}return"\u274C"}function ZO(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("device-utilities","\u{1F4F1} Device Info");return o.on("renderTab",function(e){let t=`<div style='${Ng}'>`;const i=lE();t+=`<h3 style='${av}'>Device: ${i}</h3>`,t+=Zn([{label:"\u{1F4BB} Desktop",value:I.isDesktop()},{label:"\u{1F4F1} Mobile Device",value:I.isMobileDevice()},{label:"\u{1F34E} iOS",value:I.isiOS()},{label:"\u{1F4F1} iPad",value:I.isiPad()},{label:"\u{1F916} Android",value:I.isAndroidDevice()},{label:"\u{1F98A} Mozilla XR",value:I.isMozillaXR()},{label:"\u{1F335} Needle App Clip",value:I.isNeedleAppClip()},{label:"\u{1F34F} macOS",value:I.isMacOS()},{label:"\u{1F453} VisionOS",value:I.isVisionOS()},{label:"\u{1F9ED} Safari",value:I.isSafari()},{label:"\u{1F576}\uFE0F Meta Quest",value:I.isQuest()},{label:"\u{1F517} QuickLook AR Support",value:I.supportsQuickLookAR()}],!0);const n=[],s=I.getiOSVersion();s&&n.push({label:"\u{1F34E} iOS Version",value:s});const r=I.getChromeVersion();r&&n.push({label:"\u{1F310} Chrome Version",value:r});const a=I.getSafariVersion();a&&n.push({label:"\u{1F9ED} Safari Version",value:a}),n.length>0&&(t+=Zn(n,!1)),t+="</div>",t+=`<div style='${Ng} margin-top: 20px;'>`,t+=`<h3 style='${av}'>User Agent Info</h3>`;const l=[{label:"User Agent",value:navigator.userAgent},{label:"Platform",value:navigator.platform},{label:"App Version",value